diff --git a/MHSEmulator/MHSEmulator.ecl b/MHSEmulator/MHSEmulator.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/RadarServer/build.rcm/.project b/RadarServer/build.rcm/.project old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/bits/bin/importAwips1 b/RadarServer/build.rcm/bits/bin/importAwips1 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/bits/bin/start b/RadarServer/build.rcm/bits/bin/start old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/bits/bin/stop b/RadarServer/build.rcm/bits/bin/stop old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/build.rcm.ecl b/RadarServer/build.rcm/build.rcm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/RadarServer/build.rcm/build.sh b/RadarServer/build.rcm/build.sh old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/build.xml b/RadarServer/build.rcm/build.xml old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.clear-air.VCP31 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.clear-air.VCP31 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.clear-air.VCP32 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.clear-air.VCP32 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.maint b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.maint old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP11 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP11 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP112 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP112 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP12 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP12 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP121 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP121 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP21 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP21 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP211 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP211 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP212 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP212 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP221 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP221 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP80 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP80 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP90 b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/KXXX.storm.VCP90 old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/prodList.txt b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/prodList.txt old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/rps-RPGOP-tcp.clear-air b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/rps-RPGOP-tcp.clear-air old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/rps-RPGOP-tcp.storm b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/rps-RPGOP-tcp.storm old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/rps-SPGOP-tcp.storm b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/rps-SPGOP-tcp.storm old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/tdwrProdList.txt b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/tdwrProdList.txt old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/drop-ins/wmoSiteInfo.txt b/RadarServer/build.rcm/cfgbits/data/config/drop-ins/wmoSiteInfo.txt old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/persist/config.xml b/RadarServer/build.rcm/cfgbits/data/config/persist/config.xml old mode 100755 new mode 100644 diff --git a/RadarServer/build.rcm/cfgbits/data/config/start-config b/RadarServer/build.rcm/cfgbits/data/config/start-config old mode 100755 new mode 100644 diff --git a/RadarServer/com.raytheon.rcm.feature/com.raytheon.rcm.feature.ecl b/RadarServer/com.raytheon.rcm.feature/com.raytheon.rcm.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/RadarServer/com.raytheon.rcm.lib/com.raytheon.rcm.lib.ecl b/RadarServer/com.raytheon.rcm.lib/com.raytheon.rcm.lib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/RadarServer/com.raytheon.rcm.product/com.raytheon.rcm.product.ecl b/RadarServer/com.raytheon.rcm.product/com.raytheon.rcm.product.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/RadarServer/com.raytheon.rcm.server.mq/com.raytheon.rcm.server.mq.ecl b/RadarServer/com.raytheon.rcm.server.mq/com.raytheon.rcm.server.mq.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/RadarServer/com.raytheon.rcm.server.mq/src/com/raytheon/rcm/mqsrvr/MsgServ.java b/RadarServer/com.raytheon.rcm.server.mq/src/com/raytheon/rcm/mqsrvr/MsgServ.java index d055cc115d..1b7d20481d 100755 --- a/RadarServer/com.raytheon.rcm.server.mq/src/com/raytheon/rcm/mqsrvr/MsgServ.java +++ b/RadarServer/com.raytheon.rcm.server.mq/src/com/raytheon/rcm/mqsrvr/MsgServ.java @@ -79,146 +79,155 @@ import com.raytheon.rcm.server.Log; import com.raytheon.rcm.server.RadarServer; import com.raytheon.rcm.server.StatusManager.RadarStatus; - public class MsgServ implements RadarEventListener, MessageListener { - - QueueConnection queueConn; - QueueSession queueSession; - QueueSender queueSender; - TopicConnection topicConn; - TopicSession topicSession; - TopicPublisher topicPublisher; - JAXBContext jaxbCtx; - Marshaller m; - Unmarshaller u; - - Serv serv; - - public MsgServ(RadarServer server) { - serv = new Serv(server); - try { - jaxbCtx = JAXBContext.newInstance(ReqObj.class, ReplyObj.class, - EventObj.class, RmrEvent.class); - m = jaxbCtx.createMarshaller(); - u = jaxbCtx.createUnmarshaller(); - } catch (JAXBException e) { - Log.errorf("MsgServ could not create JAXBContext: %s", e); - } - } - - public void start(QueueConnectionFactory qConnFac, - TopicConnectionFactory tConnFac) { - try { - queueConn = qConnFac.createQueueConnection(); - queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); - Queue queue = queueSession.createQueue("RadarServer"); - queueSender = queueSession.createSender(null); - QueueReceiver qr = queueSession.createReceiver(queue); - qr.setMessageListener(this); - - topicConn = tConnFac.createTopicConnection(); - topicSession = topicConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); - Topic topic = topicSession.createTopic("RadarEvents"); - topicPublisher = topicSession.createPublisher(topic); - - queueConn.start(); - } catch (JMSException e) { - Log.errorf("MsgServ could not start connections: %s", e); - } - } - @Override - public void handleRadarEvent(RadarEvent event) { - RadarEvent eventToSend = EventObj.filterRadarEvent(event); - if (eventToSend != null) - publishEvent(eventToSend); - } + QueueConnection queueConn; - @Override - public void onMessage(Message msg) { - try { - ReplyObj po = null; - String error = null; - Exception exc = null; - - Destination replyToDestination = msg.getJMSReplyTo(); - - if (msg instanceof TextMessage) { - TextMessage tms = (TextMessage) msg; - StringReader sr = new StringReader(tms.getText()); - Object o = null; - try { - o = u.unmarshal(sr); - } catch (JAXBException e) { - exc = e; - } - - if (o instanceof ReqObj) { - ReqObj ro = (ReqObj) o; - try { - po = handleRequest(replyToDestination, ro); - } catch (RuntimeException e) { - error = "Unexpected error while processing request: " + e.toString(); - exc = e; - } - } else if (o != null) - error = String.format("Invalid request class '%s'", o.getClass()); - } else - error = "Invalid JMS message type"; + QueueSession queueSession; - if (error == null && exc != null) - error = exc.toString(); - if (po == null) - po = ReplyObj.error(error != null ? error : "Unknown error"); - - if (exc != null) - Log.errorf("Error processing remote request: %s", exc); - else if (error != null) - Log.errorf("Error processing remote request: %s", error); - - if (po != null) { - StringWriter sw = new StringWriter(); - try { - synchronized (m) { - m.marshal(po, sw); - } - } catch (JAXBException e) { - Log.errorf("Error processing remote request: %s", e); - return; - } - TextMessage rtm = queueSession.createTextMessage( - sw.toString()); - - String id = msg.getJMSCorrelationID(); - if (id == null) - id = msg.getJMSMessageID(); - if (id != null) - rtm.setJMSCorrelationID(id); - if (replyToDestination != null) - queueSender.send(replyToDestination, rtm); - else - Log.errorf("Client did not specify reply-to destination"); - } - - } catch (JMSException e) { - Log.errorf("Error while processing JMS message: %s", e); - } - } - - private ReplyObj handleRequest(Destination replyToDestination, ReqObj ro) { - ReplyObj po = null; + QueueSender queueSender; + + TopicConnection topicConn; + + TopicSession topicSession; + + TopicPublisher topicPublisher; + + JAXBContext jaxbCtx; + + Marshaller m; + + Unmarshaller u; + + Serv serv; + + public MsgServ(RadarServer server) { + serv = new Serv(server); + try { + jaxbCtx = JAXBContext.newInstance(ReqObj.class, ReplyObj.class, + EventObj.class, RmrEvent.class); + m = jaxbCtx.createMarshaller(); + u = jaxbCtx.createUnmarshaller(); + } catch (JAXBException e) { + Log.errorf("MsgServ could not create JAXBContext: %s", e); + } + } + + public void start(QueueConnectionFactory qConnFac, + TopicConnectionFactory tConnFac) { + try { + queueConn = qConnFac.createQueueConnection(); + queueSession = queueConn.createQueueSession(false, + Session.AUTO_ACKNOWLEDGE); + Queue queue = queueSession.createQueue("RadarServer"); + queueSender = queueSession.createSender(null); + QueueReceiver qr = queueSession.createReceiver(queue); + qr.setMessageListener(this); + + topicConn = tConnFac.createTopicConnection(); + topicSession = topicConn.createTopicSession(false, + Session.AUTO_ACKNOWLEDGE); + Topic topic = topicSession.createTopic("RadarEvents"); + topicPublisher = topicSession.createPublisher(topic); + + queueConn.start(); + } catch (JMSException e) { + Log.errorf("MsgServ could not start connections: %s", e); + } + } + + @Override + public void handleRadarEvent(RadarEvent event) { + RadarEvent eventToSend = EventObj.filterRadarEvent(event); + if (eventToSend != null) + publishEvent(eventToSend); + } + + @Override + public void onMessage(Message msg) { + try { + ReplyObj po = null; + String error = null; + Exception exc = null; + + Destination replyToDestination = msg.getJMSReplyTo(); + + if (msg instanceof TextMessage) { + TextMessage tms = (TextMessage) msg; + StringReader sr = new StringReader(tms.getText()); + Object o = null; + try { + o = u.unmarshal(sr); + } catch (JAXBException e) { + exc = e; + } + + if (o instanceof ReqObj) { + ReqObj ro = (ReqObj) o; + try { + po = handleRequest(replyToDestination, ro); + } catch (RuntimeException e) { + error = "Unexpected error while processing request: " + + e.toString(); + exc = e; + } + } else if (o != null) + error = String.format("Invalid request class '%s'", + o.getClass()); + } else + error = "Invalid JMS message type"; + + if (error == null && exc != null) + error = exc.toString(); + if (po == null) + po = ReplyObj.error(error != null ? error : "Unknown error"); + + if (exc != null) + Log.errorf("Error processing remote request: %s", exc); + else if (error != null) + Log.errorf("Error processing remote request: %s", error); + + if (po != null) { + StringWriter sw = new StringWriter(); + try { + synchronized (m) { + m.marshal(po, sw); + } + } catch (JAXBException e) { + Log.errorf("Error processing remote request: %s", e); + return; + } + TextMessage rtm = queueSession.createTextMessage(sw.toString()); + + String id = msg.getJMSCorrelationID(); + if (id == null) + id = msg.getJMSMessageID(); + if (id != null) + rtm.setJMSCorrelationID(id); + if (replyToDestination != null) + queueSender.send(replyToDestination, rtm); + else + Log.errorf("Client did not specify reply-to destination"); + } + + } catch (JMSException e) { + Log.errorf("Error while processing JMS message: %s", e); + } + } + + private ReplyObj handleRequest(Destination replyToDestination, ReqObj ro) { + ReplyObj po = null; String error = null; - + Log.eventf("Got remote request %s", ro); - + if (ro instanceof GetRadarList) - po = ReplyObj.toGetRadarList( - serv.getRadarList()); + po = ReplyObj.toGetRadarList(serv.getRadarList()); else if (ro instanceof GetRadarConfig) { GetRadarConfig grc = (GetRadarConfig) ro; if (grc.radarID != null) - po = ReplyObj.toGetRadarConfig( - serv.getRadarConfig(grc.radarID)); + po = ReplyObj + .toGetRadarConfig(serv.getRadarConfig(grc.radarID)); else po = ReplyObj.toGetRadarConfig(serv.getAllRadarConfigs()); } else if (ro instanceof SetRadarConfig) { @@ -227,33 +236,31 @@ public class MsgServ implements RadarEventListener, MessageListener { } else if (ro instanceof GetRadarStatusMessages) { GetRadarStatusMessages grs = (GetRadarStatusMessages) ro; if (grs.radarID != null) - po = ReplyObj.toGetRadarStatusMessages( - createROStatus(grs.radarID, - serv.getRadarStatus(grs.radarID))); + po = ReplyObj.toGetRadarStatusMessages(createROStatus( + grs.radarID, serv.getRadarStatus(grs.radarID))); else { ArrayList status = new ArrayList(); - for (Map.Entry e : - serv.getAllRadarStatus().entrySet()) { - status.add(createROStatus(e.getKey(), - e.getValue())); + for (Map.Entry e : serv + .getAllRadarStatus().entrySet()) { + status.add(createROStatus(e.getKey(), e.getValue())); } po = ReplyObj.toGetRadarStatusMessages(status); } } else if (ro instanceof SendOneTimeRequests) { MsgServOtrHandler handler = null; - - /* Correlation ID should be null so as to not intefere - * with the handler list on the client side. + + /* + * Correlation ID should be null so as to not intefere with the + * handler list on the client side. */ /* - String id = msg.getJMSCorrelationID(); - if (id == null) - id = msg.getJMSMessageID(); - */ - String id = null; + * String id = msg.getJMSCorrelationID(); if (id == null) id = + * msg.getJMSMessageID(); + */ + String id = null; if (replyToDestination != null) - handler = new MsgServOtrHandler(replyToDestination, id); - + handler = new MsgServOtrHandler(replyToDestination, id); + SendOneTimeRequests r = (SendOneTimeRequests) ro; serv.sendOTRs(r.radarIDs, r.requests, handler); } else if (ro instanceof SendRpsList) { @@ -267,17 +274,17 @@ public class MsgServ implements RadarEventListener, MessageListener { } else if (ro instanceof GetRpsList) { GetRpsList r = (GetRpsList) ro; if (r.radarID != null) { - int vcp = r.vcp != null ? r.vcp : -1; - int opMode = r.opMode != null ? r.opMode : GSM.OP_MODE_MAINTENANCE; + int vcp = r.vcp != null ? r.vcp : -1; + int opMode = r.opMode != null ? r.opMode + : GSM.OP_MODE_MAINTENANCE; RpsList rpsList = serv.getRpsList(r.radarID, opMode, vcp); po = new ReplyObj.RpsListReply(rpsList); /* - if (rpsList != null) - po = ReplyObj.toGetRpsList(rpsList); - else - error = String.format("Could not retrieve RPS list for radar %s%s", - r.radarID, vcp != -1 ? ", VCP " + vcp : ""); - */ + * if (rpsList != null) po = ReplyObj.toGetRpsList(rpsList); + * else error = + * String.format("Could not retrieve RPS list for radar %s%s", + * r.radarID, vcp != -1 ? ", VCP " + vcp : ""); + */ } else error = "Must specify a radar name"; } else if (ro instanceof GetGlobalConfig) { @@ -301,7 +308,8 @@ public class MsgServ implements RadarEventListener, MessageListener { po = r; } else if (ro instanceof SendAlertRequest) { SendAlertRequest ro2 = (SendAlertRequest) ro; - error = serv.sendAlertRequest(ro2.radarID, ro2.areaIndex, ro2.alertRequest); + error = serv.sendAlertRequest(ro2.radarID, ro2.areaIndex, + ro2.alertRequest); } else if (ro instanceof SendMessageToRPG) { SendMessageToRPG ro2 = (SendMessageToRPG) ro; error = serv.sendMessageToRPG(ro2.radarID, ro2.message); @@ -316,7 +324,7 @@ public class MsgServ implements RadarEventListener, MessageListener { error = serv.debugHandleMessage(r.radarID, r.message); } else error = String.format("Unsupported request '%s'", ro.toString()); - + if (po == null) { if (error == null) po = new ReplyObj(); @@ -324,97 +332,97 @@ public class MsgServ implements RadarEventListener, MessageListener { po = ReplyObj.error(error); } - return po; - } - - private ROStatus createROStatus(String radarID, RadarStatus rs) { - ROStatus ros = new ROStatus(); - ros.radarID = radarID; - ros.currentAAP = rs.getCurrentAAP(); - ros.currentGSM = rs.getCurrentGSM(); - ros.currentPTL = rs.getCurrentPTL(); - ros.lastAAP = rs.getLastAAP(); - ros.lastGSM = rs.getLastGSM(); - ros.lastPTL = rs.getLastPTL(); - return ros; - } + return po; + } - @Override - public void handleConfigEvent(ConfigEvent event) { - publishEvent(event); - } - - private void publishEvent(Object obj) { - // Can get events before mq is set up. - if (topicPublisher == null) - return; - - StringWriter sw = new StringWriter(); - try { - synchronized (m) { - m.marshal(obj, sw); - } - } catch (JAXBException e) { - Log.errorf("Error serializing event: %s", e); - return; - } - try { - TextMessage tm = topicSession.createTextMessage( - sw.toString()); - topicPublisher.publish(tm); - } catch (JMSException e) { - Log.errorf("Error sending message: %s", e); - } - } + private ROStatus createROStatus(String radarID, RadarStatus rs) { + ROStatus ros = new ROStatus(); + ros.radarID = radarID; + ros.currentAAP = rs.getCurrentAAP(); + ros.currentGSM = rs.getCurrentGSM(); + ros.currentPTL = rs.getCurrentPTL(); + ros.lastAAP = rs.getLastAAP(); + ros.lastGSM = rs.getLastGSM(); + ros.lastPTL = rs.getLastPTL(); + return ros; + } - @Override - public void handleNotificationEvent(NotificationEvent event) { - publishEvent(event); - } - - class MsgServOtrHandler implements OTRHandler { - Destination destination; - String correlationID; - - public MsgServOtrHandler(Destination destination, String correlationID) { - this.destination = destination; - this.correlationID = correlationID; - } - - @Override - public void handleOtrEvent(OtrEvent event) { - OtrEvent eventToSend = event.clone(); - /* This OTR notification capability is currently only used to - * display alerts in CAVE. Thus, there is no need to send the - * actual product data. Given that some products can be larger - * than one megabyte and the notification is in XML format, - * this is a useful optimization. - */ - if (event.product != null + @Override + public void handleConfigEvent(ConfigEvent event) { + publishEvent(event); + } + + private void publishEvent(Object obj) { + // Can get events before mq is set up. + if (topicPublisher == null) + return; + + StringWriter sw = new StringWriter(); + try { + synchronized (m) { + m.marshal(obj, sw); + } + } catch (JAXBException e) { + Log.errorf("Error serializing event: %s", e); + return; + } + try { + TextMessage tm = topicSession.createTextMessage(sw.toString()); + topicPublisher.publish(tm); + } catch (JMSException e) { + Log.errorf("Error sending message: %s", e); + } + } + + @Override + public void handleNotificationEvent(NotificationEvent event) { + publishEvent(event); + } + + class MsgServOtrHandler implements OTRHandler { + Destination destination; + + String correlationID; + + public MsgServOtrHandler(Destination destination, String correlationID) { + this.destination = destination; + this.correlationID = correlationID; + } + + @Override + public void handleOtrEvent(OtrEvent event) { + OtrEvent eventToSend = event.clone(); + /* + * This OTR notification capability is currently only used to + * display alerts in CAVE. Thus, there is no need to send the actual + * product data. Given that some products can be larger than one + * megabyte and the notification is in XML format, this is a useful + * optimization. + */ + if (event.product != null && com.raytheon.rcm.message.Message .messageCodeOf(event.product) > 16) eventToSend.product = GraphicProduct .extractHeaderAndPDB(event.product); - StringWriter sw = new StringWriter(); - try { - synchronized (m) { - m.marshal(eventToSend, sw); - } - } catch (JAXBException e) { - Log.errorf("Error processing remote request: %s", e); - return; - } - try { - TextMessage rtm = queueSession.createTextMessage( - sw.toString()); - if (correlationID != null) - rtm.setJMSCorrelationID(correlationID); - queueSender.send(destination, rtm); - } catch (JMSException e) { - Log.errorf("Error sending message: %s", e); - } - } - - } + StringWriter sw = new StringWriter(); + try { + synchronized (m) { + m.marshal(eventToSend, sw); + } + } catch (JAXBException e) { + Log.errorf("Error processing remote request: %s", e); + return; + } + try { + TextMessage rtm = queueSession.createTextMessage(sw.toString()); + if (correlationID != null) + rtm.setJMSCorrelationID(correlationID); + queueSender.send(destination, rtm); + } catch (JMSException e) { + Log.errorf("Error sending message: %s", e); + } + } + + } } diff --git a/RadarServer/com.raytheon.rcm.server/com.raytheon.rcm.server.ecl b/RadarServer/com.raytheon.rcm.server/com.raytheon.rcm.server.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/RadarServer/com.raytheon.rcm.tools/com.raytheon.rcm.tools.ecl b/RadarServer/com.raytheon.rcm.tools/com.raytheon.rcm.tools.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/build/alertviz/customTargets.xml b/cave/build/alertviz/customTargets.xml index e7684ae41f..a1095fffad 100644 --- a/cave/build/alertviz/customTargets.xml +++ b/cave/build/alertviz/customTargets.xml @@ -1,262 +1,262 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/build.ecl b/cave/build/build.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/build/cave/customTargets.xml b/cave/build/cave/customTargets.xml index d39d899136..612a856854 100644 --- a/cave/build/cave/customTargets.xml +++ b/cave/build/cave/customTargets.xml @@ -1,485 +1,485 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/aviation/config/gui/ClimateTimeouts.xml b/cave/build/static/common/cave/etc/aviation/config/gui/ClimateTimeouts.xml index df7ea87911..0796d4eaa0 100644 --- a/cave/build/static/common/cave/etc/aviation/config/gui/ClimateTimeouts.xml +++ b/cave/build/static/common/cave/etc/aviation/config/gui/ClimateTimeouts.xml @@ -18,9 +18,13 @@ See_the_AWIPS_II_Master_Rights_File_("Master_Rights_File.pdf")_for further_licensing_information. --> + 20 20 90 - 300 + 1800 diff --git a/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTTdWind.py b/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTTdWind.py index f945ee793c..e270635023 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTTdWind.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/procedures/CheckTTdWind.py @@ -452,7 +452,8 @@ class Procedure (SmartScript.SmartScript): " locked by another user." self.statusBarMsg(msg, "S") continue - gustGrid[windTooHigh] = windGrid + + gustGrid = where(windTooHigh, windGrid, gustGrid) self.createGrid(MODEL, "WindGust", "SCALAR", gustGrid, tr) gustDict[tr] = gustGrid # update the gustDict diff --git a/cave/build/static/common/cave/etc/gfe/userPython/smartTools/Adjust.py b/cave/build/static/common/cave/etc/gfe/userPython/smartTools/Adjust.py index 9291227174..a8f10952fe 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/smartTools/Adjust.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/smartTools/Adjust.py @@ -66,7 +66,7 @@ VariableList=[] VariableList.append(("Value:",1,"numeric")) VariableList.append(("Action:","Add","radio",["Add","Subtract","Multiply","Divide"])) VariableList.append(("Elevation:","None","radio",["None","Mountain","Valley","Specific"])) -VariableList.append(("Vectors:","Magnitude","radio",["Both","Magnitude","Direction"])) +VariableList.append(("Vectors:","Magnitude","radio",["Magnitude","Direction"])) VariableList.append(("Edge:","Flat","radio",["Flat","Edge","Taper"])) VariableList.append(("Edge Width:",5,"scale",[1,30],1)) VariableList.append(("Specific Elevation:",5000,"numeric")) @@ -76,7 +76,7 @@ class Tool (SmartScript.SmartScript): SmartScript.SmartScript.__init__(self, dbss) def preProcessTool(self): self.savemode=self.getVectorEditMode() - self.setVectorEditMode("Both") + self.setVectorEditMode("Magnitude") def postProcessTool(self): self.setVectorEditMode(self.savemode) def preProcessGrid(self,Topo,editArea,varDict): @@ -167,7 +167,7 @@ class Tool (SmartScript.SmartScript): else: mag=variableElement[0] dir=variableElement[1] - if ((vect=="Magnitude")or(vect=="Both")): + if (vect=="Magnitude"): if (action=="Add"): newmag=mag+(self.deltagrid*deltavalue) elif (action=="Subtract"): diff --git a/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/regular/DiscretePhrases.py b/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/regular/DiscretePhrases.py index e4a7f94e5c..284e9b8ae0 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/regular/DiscretePhrases.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/regular/DiscretePhrases.py @@ -162,6 +162,7 @@ class DiscretePhrases(PhraseBuilder.PhraseBuilder): timeDescriptor = self.headlinesTimeRange_descriptor( tree, node, key, tr, areaLabel, issuanceTime) + from com.raytheon.uf.common.dataplugin.gfe.discrete import DiscreteKey headlineWords = DiscreteKey.discreteDefinition(siteId).keyDesc( "Hazards" + "_SFC", key) if headlineWords == "": # Don't process the "" key diff --git a/cave/build/static/common/cave/etc/ncep/nsharp/nsharpConfig.xml b/cave/build/static/common/cave/etc/ncep/nsharp/nsharpConfig.xml new file mode 100644 index 0000000000..d7b1c5942d --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/nsharp/nsharpConfig.xml @@ -0,0 +1,121 @@ + + + + + + + RGB {0, 255, 255} + + + + + RGB {255, 215, 0} + + + + + RGB {30, 144, 255} + + + + + RGB {255, 0, 255} + + + + + RGB {155, 0, 220} + + + + + RGB {255, 255, 0} + + + + + RGB {0, 255, 0} + + + + + RGB {0, 139, 0} + + + + + RGB {139, 0, 139} + + + + + RGB {139, 71, 38} + + + + + RGB {144, 238, 144} + + + + + RGB {0, 255, 0} + + + + + RGB {255, 0, 0} + + + + + RGB {255, 0, 0} + + + + + RGB {255, 174, 185} + + + + + RGB {0, 255, 0} + + + + + RGB {255, 0, 0} + + + + + RGB {255, 0, 0} + + + + + RGB {0, 255, 255} + + + + + RGB {255, 0, 255} + + + + + RGB {255, 0, 0} + + + + + RGB {0, 255, 0} + + + + + RGB {255, 250, 250} + + + + diff --git a/cave/build/static/win32.x86/alertviz/alertviz.bat b/cave/build/static/win32.x86/alertviz/alertviz.bat index 79c486d804..5e4b50ee83 100644 --- a/cave/build/static/win32.x86/alertviz/alertviz.bat +++ b/cave/build/static/win32.x86/alertviz/alertviz.bat @@ -1,69 +1,69 @@ -@echo OFF - -REM Determine if we are running on a 32-bit or 64-bit OS. -IF NOT EXIST C:\Windows\SysWOW64\reg.exe ( - SET REG_EXE=C:\Windows\System32\reg.exe -) ELSE ( - SET REG_EXE=C:\Windows\SysWOW64\reg.exe -) - -REM Determine where we are located. -SET CONTAINING_DIRECTORY=%~dp0 - -REM Prepare the environment. - -REM Registry Query Variables. -SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" -SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" -REM Determine where AWIPS II Java (the jre) is located. -%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( -SET JavaJreDirectory=%%B) -REM Determine where AWIPS II Python is located. -%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( -SET PythonInstallDirectory=%%B) - -REM Add Java and Python to the path. -SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% -SET Path=%JavaJreDirectory%\bin;%Path% -REM Define 'PythonPath'. -SET PythonPath=%PythonInstallDirectory%\Lib\lib-tk;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\DLLs;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\Lib;%PythonPath% -SET PythonPath=%PythonInstallDirectory%;%PythonPath% - -REM Eliminate variables that will no longer be used. -SET PythonInstallDirectory= -SET JavaJreDirectory= -SET REG_EXE= -SET A2_JAVA_REG= -SET A2_PYTHON_REG= - -REM Determine where we will be logging to. -SET HOME_DIRECTORY=%HOMEDRIVE%%HOMEPATH% -SET CAVEDATA_LOG_DIRECTORY=%HOMEDRIVE%%HOMEPATH%\caveData\logs -SET CONSOLE_LOG_DIRECTORY=%CAVEDATA_LOG_DIRECTORY%\consoleLogs\%COMPUTERNAME% -IF NOT EXIST "%CONSOLE_LOG_DIRECTORY%" (MKDIR "%CONSOLE_LOG_DIRECTORY%") - -echo Starting ALERTVIZ; leave this CMD window open to enable AlertViz 'restart'. -REM Start AlertViz (and implement the alertviz restart capability). -:AlertVizLoopStart -SET RND=%random% -SET RND_DATETIME_FILE=%TMP%\awips2dt_%RND%.tmp -REM Python is used to retrieve the current date and time because the order -REM of the Windows date/time fields is not necessarily guaranteed and the -REM Windows date/time fields can only be extracted using substring operations -REM instead of -formatter- strings like Linux allows. -python -c "from datetime import datetime; print datetime.now().strftime('%%Y%%m%%d_%%H%%M%%S');" > %RND_DATETIME_FILE% -SET /p LOG_DATETIME= < %RND_DATETIME_FILE% -DEL %RND_DATETIME_FILE% -"%CONTAINING_DIRECTORY%alertviz.exe" %* > "%CONSOLE_LOG_DIRECTORY%\alertviz_%LOG_DATETIME%.log" 2>&1 -IF %ERRORLEVEL% == 0 (EXIT) -echo Restarting AlertViz. -GOTO AlertVizLoopStart - +@echo OFF + +REM Determine if we are running on a 32-bit or 64-bit OS. +IF NOT EXIST C:\Windows\SysWOW64\reg.exe ( + SET REG_EXE=C:\Windows\System32\reg.exe +) ELSE ( + SET REG_EXE=C:\Windows\SysWOW64\reg.exe +) + +REM Determine where we are located. +SET CONTAINING_DIRECTORY=%~dp0 + +REM Prepare the environment. + +REM Registry Query Variables. +SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" +SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" +REM Determine where AWIPS II Java (the jre) is located. +%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 +IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) +FOR /F "tokens=2* delims= " %%A IN ( +'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( +SET JavaJreDirectory=%%B) +REM Determine where AWIPS II Python is located. +%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 +IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) +FOR /F "tokens=2* delims= " %%A IN ( +'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( +SET PythonInstallDirectory=%%B) + +REM Add Java and Python to the path. +SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% +SET Path=%JavaJreDirectory%\bin;%Path% +REM Define 'PythonPath'. +SET PythonPath=%PythonInstallDirectory%\Lib\lib-tk;%PythonPath% +SET PythonPath=%PythonInstallDirectory%\DLLs;%PythonPath% +SET PythonPath=%PythonInstallDirectory%\Lib;%PythonPath% +SET PythonPath=%PythonInstallDirectory%;%PythonPath% + +REM Eliminate variables that will no longer be used. +SET PythonInstallDirectory= +SET JavaJreDirectory= +SET REG_EXE= +SET A2_JAVA_REG= +SET A2_PYTHON_REG= + +REM Determine where we will be logging to. +SET HOME_DIRECTORY=%HOMEDRIVE%%HOMEPATH% +SET CAVEDATA_LOG_DIRECTORY=%HOMEDRIVE%%HOMEPATH%\caveData\logs +SET CONSOLE_LOG_DIRECTORY=%CAVEDATA_LOG_DIRECTORY%\consoleLogs\%COMPUTERNAME% +IF NOT EXIST "%CONSOLE_LOG_DIRECTORY%" (MKDIR "%CONSOLE_LOG_DIRECTORY%") + +echo Starting ALERTVIZ; leave this CMD window open to enable AlertViz 'restart'. +REM Start AlertViz (and implement the alertviz restart capability). +:AlertVizLoopStart +SET RND=%random% +SET RND_DATETIME_FILE=%TMP%\awips2dt_%RND%.tmp +REM Python is used to retrieve the current date and time because the order +REM of the Windows date/time fields is not necessarily guaranteed and the +REM Windows date/time fields can only be extracted using substring operations +REM instead of -formatter- strings like Linux allows. +python -c "from datetime import datetime; print datetime.now().strftime('%%Y%%m%%d_%%H%%M%%S');" > %RND_DATETIME_FILE% +SET /p LOG_DATETIME= < %RND_DATETIME_FILE% +DEL %RND_DATETIME_FILE% +"%CONTAINING_DIRECTORY%alertviz.exe" %* > "%CONSOLE_LOG_DIRECTORY%\alertviz_%LOG_DATETIME%.log" 2>&1 +IF %ERRORLEVEL% == 0 (EXIT) +echo Restarting AlertViz. +GOTO AlertVizLoopStart + diff --git a/cave/build/static/win32.x86/cave/cave.bat b/cave/build/static/win32.x86/cave/cave.bat index 54992a2550..0b347287dd 100644 --- a/cave/build/static/win32.x86/cave/cave.bat +++ b/cave/build/static/win32.x86/cave/cave.bat @@ -1,72 +1,72 @@ -@echo OFF - -REM Determine if we are running on a 32-bit or 64-bit OS. -IF NOT EXIST C:\Windows\SysWOW64\reg.exe ( - SET REG_EXE=C:\Windows\System32\reg.exe -) ELSE ( - SET REG_EXE=C:\Windows\SysWOW64\reg.exe -) - -REM Determine where we are located. -SET CONTAINING_DIRECTORY=%~dp0 - -REM Prepare the environment. - -REM Registry Query Variables. -SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" -SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" -REM Determine where AWIPS II Java (the jre) is located. -%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( -SET JavaJreDirectory=%%B) -REM Determine where AWIPS II Python is located. -%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( -SET PythonInstallDirectory=%%B) - -REM Add Java and Python to the path. -SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% -SET Path=%JavaJreDirectory%\bin;%Path% -REM Add the CAVE lib directory to the path. -SET Path=%CONTAINING_DIRECTORY%lib;%Path% -REM Define 'PythonPath'. -SET PythonPath=%CONTAINING_DIRECTORY%lib;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\Lib\lib-tk;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\DLLs;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\Lib;%PythonPath% -SET PythonPath=%PythonInstallDirectory%;%PythonPath% - -REM Eliminate variables that will no longer be used. -SET PythonInstallDirectory= -SET JavaJreDirectory= -SET REG_EXE= -SET A2_JAVA_REG= -SET A2_PYTHON_REG= - -REM Determine where we will be logging to. -SET HOME_DIRECTORY=%HOMEDRIVE%%HOMEPATH% -SET CAVEDATA_LOG_DIRECTORY=%HOMEDRIVE%%HOMEPATH%\caveData\logs -SET CONSOLE_LOG_DIRECTORY=%CAVEDATA_LOG_DIRECTORY%\consoleLogs\%COMPUTERNAME% -IF NOT EXIST "%CONSOLE_LOG_DIRECTORY%" (MKDIR "%CONSOLE_LOG_DIRECTORY%") - -SET RND=%random% -SET RND_DATETIME_FILE=%TMP%\awips2dt_%RND%.tmp -REM Python is used to retrieve the current date and time because the order -REM of the Windows date/time fields is not necessarily guaranteed and the -REM Windows date/time fields can only be extracted using substring operations -REM instead of -formatter- strings like Linux allows. -python -c "from datetime import datetime; print datetime.now().strftime('%%Y%%m%%d_%%H%%M%%S');" > %RND_DATETIME_FILE% -SET /p LOG_DATETIME= < %RND_DATETIME_FILE% -DEL %RND_DATETIME_FILE% - -echo THIS CMD WINDOW CAN BE CLOSED AT ANY TIME! -cd %HOMEPATH% -REM Start CAVE. -"%CONTAINING_DIRECTORY%cave.exe" %* > "%CONSOLE_LOG_DIRECTORY%\cave_%LOG_DATETIME%.log" 2>&1 -IF ERRORLEVEL 1 (echo CAVE ERROR - check the logs for additional information. && PAUSE) - -EXIT +@echo OFF + +REM Determine if we are running on a 32-bit or 64-bit OS. +IF NOT EXIST C:\Windows\SysWOW64\reg.exe ( + SET REG_EXE=C:\Windows\System32\reg.exe +) ELSE ( + SET REG_EXE=C:\Windows\SysWOW64\reg.exe +) + +REM Determine where we are located. +SET CONTAINING_DIRECTORY=%~dp0 + +REM Prepare the environment. + +REM Registry Query Variables. +SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" +SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" +REM Determine where AWIPS II Java (the jre) is located. +%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 +IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) +FOR /F "tokens=2* delims= " %%A IN ( +'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( +SET JavaJreDirectory=%%B) +REM Determine where AWIPS II Python is located. +%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 +IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) +FOR /F "tokens=2* delims= " %%A IN ( +'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( +SET PythonInstallDirectory=%%B) + +REM Add Java and Python to the path. +SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% +SET Path=%JavaJreDirectory%\bin;%Path% +REM Add the CAVE lib directory to the path. +SET Path=%CONTAINING_DIRECTORY%lib;%Path% +REM Define 'PythonPath'. +SET PythonPath=%CONTAINING_DIRECTORY%lib;%PythonPath% +SET PythonPath=%PythonInstallDirectory%\Lib\lib-tk;%PythonPath% +SET PythonPath=%PythonInstallDirectory%\DLLs;%PythonPath% +SET PythonPath=%PythonInstallDirectory%\Lib;%PythonPath% +SET PythonPath=%PythonInstallDirectory%;%PythonPath% + +REM Eliminate variables that will no longer be used. +SET PythonInstallDirectory= +SET JavaJreDirectory= +SET REG_EXE= +SET A2_JAVA_REG= +SET A2_PYTHON_REG= + +REM Determine where we will be logging to. +SET HOME_DIRECTORY=%HOMEDRIVE%%HOMEPATH% +SET CAVEDATA_LOG_DIRECTORY=%HOMEDRIVE%%HOMEPATH%\caveData\logs +SET CONSOLE_LOG_DIRECTORY=%CAVEDATA_LOG_DIRECTORY%\consoleLogs\%COMPUTERNAME% +IF NOT EXIST "%CONSOLE_LOG_DIRECTORY%" (MKDIR "%CONSOLE_LOG_DIRECTORY%") + +SET RND=%random% +SET RND_DATETIME_FILE=%TMP%\awips2dt_%RND%.tmp +REM Python is used to retrieve the current date and time because the order +REM of the Windows date/time fields is not necessarily guaranteed and the +REM Windows date/time fields can only be extracted using substring operations +REM instead of -formatter- strings like Linux allows. +python -c "from datetime import datetime; print datetime.now().strftime('%%Y%%m%%d_%%H%%M%%S');" > %RND_DATETIME_FILE% +SET /p LOG_DATETIME= < %RND_DATETIME_FILE% +DEL %RND_DATETIME_FILE% + +echo THIS CMD WINDOW CAN BE CLOSED AT ANY TIME! +cd %HOMEPATH% +REM Start CAVE. +"%CONTAINING_DIRECTORY%cave.exe" %* > "%CONSOLE_LOG_DIRECTORY%\cave_%LOG_DATETIME%.log" 2>&1 +IF ERRORLEVEL 1 (echo CAVE ERROR - check the logs for additional information. && PAUSE) + +EXIT diff --git a/cave/build/static/win32.x86/cave/lib/libgcc_s_dw2-1.dll b/cave/build/static/win32.x86/cave/lib/libgcc_s_dw2-1.dll old mode 100755 new mode 100644 diff --git a/cave/build/static/win32.x86/cave/lib/libgfortran-3.dll b/cave/build/static/win32.x86/cave/lib/libgfortran-3.dll old mode 100755 new mode 100644 diff --git a/cave/build/static/win32.x86/cave/lib/libquadmath-0.dll b/cave/build/static/win32.x86/cave/lib/libquadmath-0.dll old mode 100755 new mode 100644 diff --git a/cave/com.raytheon.uf.viz.acarssounding/com.raytheon.uf.viz.acarssounding.ecl b/cave/com.raytheon.uf.viz.acarssounding/com.raytheon.uf.viz.acarssounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.alertviz.localization.feature/com.raytheon.uf.viz.alertviz.localization.feature.ecl b/cave/com.raytheon.uf.viz.alertviz.localization.feature/com.raytheon.uf.viz.alertviz.localization.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.alertviz.localization/com.raytheon.uf.viz.alertviz.localization.ecl b/cave/com.raytheon.uf.viz.alertviz.localization/com.raytheon.uf.viz.alertviz.localization.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.alertviz.ui/com.raytheon.uf.viz.alertviz.ui.ecl b/cave/com.raytheon.uf.viz.alertviz.ui/com.raytheon.uf.viz.alertviz.ui.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.alertviz/com.raytheon.uf.viz.alertviz.ecl b/cave/com.raytheon.uf.viz.alertviz/com.raytheon.uf.viz.alertviz.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.app.launcher/com.raytheon.uf.viz.app.launcher.ecl b/cave/com.raytheon.uf.viz.app.launcher/com.raytheon.uf.viz.app.launcher.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.application/com.raytheon.uf.viz.application.ecl b/cave/com.raytheon.uf.viz.application/com.raytheon.uf.viz.application.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.aviation.advisory/com.raytheon.uf.viz.aviation.advisory.ecl b/cave/com.raytheon.uf.viz.aviation.advisory/com.raytheon.uf.viz.aviation.advisory.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.bufrsigwx/com.raytheon.uf.viz.bufrsigwx.ecl b/cave/com.raytheon.uf.viz.bufrsigwx/com.raytheon.uf.viz.bufrsigwx.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.bufrua/com.raytheon.uf.viz.bufrua.ecl b/cave/com.raytheon.uf.viz.bufrua/com.raytheon.uf.viz.bufrua.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.ccfp/com.raytheon.uf.viz.ccfp.ecl b/cave/com.raytheon.uf.viz.ccfp/com.raytheon.uf.viz.ccfp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.climo/com.raytheon.uf.viz.climo.ecl b/cave/com.raytheon.uf.viz.climo/com.raytheon.uf.viz.climo.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.cloudheight/com.raytheon.uf.viz.cloudheight.ecl b/cave/com.raytheon.uf.viz.cloudheight/com.raytheon.uf.viz.cloudheight.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.common.core.feature/com.raytheon.uf.viz.common.core.feature.ecl b/cave/com.raytheon.uf.viz.common.core.feature/com.raytheon.uf.viz.common.core.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.coopprecip/com.raytheon.uf.viz.coopprecip.ecl b/cave/com.raytheon.uf.viz.coopprecip/com.raytheon.uf.viz.coopprecip.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.core.feature/com.raytheon.uf.viz.core.feature.ecl b/cave/com.raytheon.uf.viz.core.feature/com.raytheon.uf.viz.core.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.core.maps.feature/com.raytheon.uf.viz.core.maps.feature.ecl b/cave/com.raytheon.uf.viz.core.maps.feature/com.raytheon.uf.viz.core.maps.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.core.maps/com.raytheon.uf.viz.core.maps.ecl b/cave/com.raytheon.uf.viz.core.maps/com.raytheon.uf.viz.core.maps.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.core.rsc/com.raytheon.uf.viz.core.rsc.ecl b/cave/com.raytheon.uf.viz.core.rsc/com.raytheon.uf.viz.core.rsc.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.core/com.raytheon.uf.viz.core.ecl b/cave/com.raytheon.uf.viz.core/com.raytheon.uf.viz.core.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.core/config.xml b/cave/com.raytheon.uf.viz.core/config.xml index 00e70d3f27..5ff4701a7a 100644 --- a/cave/com.raytheon.uf.viz.core/config.xml +++ b/cave/com.raytheon.uf.viz.core/config.xml @@ -27,4 +27,8 @@ 25 false 1.0 + + 1000 + ring + diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/alerts/AlertMessage.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/alerts/AlertMessage.java index 2828694d7c..8bb925b571 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/alerts/AlertMessage.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/alerts/AlertMessage.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/level/LevelMapping.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/level/LevelMapping.java index 9bb7d5c2dc..b600ff6501 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/level/LevelMapping.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/level/LevelMapping.java @@ -39,14 +39,14 @@ import com.raytheon.uf.viz.core.exception.VizCommunicationException; * *
  * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * 11/01/2007    #518      S.Manoj     Initial version
- * 11/16/2009    #3120     rjpeter     Modifed to better integrate with level framework.
- * 11/21/2009    #3576     rjpeter     Added group
- * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 11/01/2007    #518      S.Manoj     Initial version
+ * 11/16/2009    #3120     rjpeter     Modifed to better integrate with level framework.
+ * 11/21/2009    #3576     rjpeter     Added group
+ * 
  * @author smanoj
  * @version 1.0
  */
diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java
index b671c659b6..fd5761231f 100644
--- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java
+++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java
@@ -54,6 +54,7 @@ import com.raytheon.uf.viz.core.Activator;
 import com.raytheon.uf.viz.core.comm.JMSConnection;
 import com.raytheon.uf.viz.core.notification.INotificationObserver;
 import com.raytheon.uf.viz.core.notification.NotificationMessage;
+import com.raytheon.uf.viz.core.preferences.JMSPreferences;
 
 /**
  * Job to monitor the JMS topic containing notification messages, delegating the
@@ -505,10 +506,11 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable {
             disconnect();
             session = manager.connection.createSession(false,
                     Session.AUTO_ACKNOWLEDGE);
+
             if (session != null) {
                 String topicName = id;
-                Topic t = session.createTopic(topicName);
-
+                Topic t = session.createTopic(JMSPreferences
+                        .getPolicyString(topicName));
                 if (queryString != null) {
                     consumer = session.createConsumer(t, queryString);
                 } else {
diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/preferences/JMSPreferences.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/preferences/JMSPreferences.java
new file mode 100644
index 0000000000..595ccad844
--- /dev/null
+++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/preferences/JMSPreferences.java
@@ -0,0 +1,148 @@
+/**
+ * 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.viz.core.preferences;
+
+import java.util.UUID;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.raytheon.uf.viz.core.Activator;
+
+/**
+ * Serialized class for the JMS policy type
+ * 
+ * 
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Jan 30, 2012            mnash     Initial creation
+ * 
+ * 
+ * + * @author mnash + * @version 1.0 + */ + +public class JMSPreferences { + + // these are the policy types as supported by QPID + // + // reject - reject the message if the topic is full + // + // ring - start overwriting messages in a ring based on sizing. If head + // meets tail, advance head. + // + // flow to disk - flow the messages to disk to preserve memory + // + // ring strict - start overwriting messages in a ring based on sizing. If + // head meets tail, AND the consumer has the tail message acquired it will + // reject + // + public enum PolicyType { + REJECT("reject"), RING("ring"), FLOW_TO_DISK("flow_to_disk"), RING_STRICT( + "ring_strict"); + + private String type; + + /** + * @return the type + */ + public String getType() { + return type; + } + + private PolicyType(String name) { + type = name; + } + + } + + // declare topic as ADDR, not BURL + private static final String addressArgs = "ADDR:'amq.topic'/"; + + private static final String declareArgs = "; { node: { type: 'topic', x-declare: {arguments: {"; + + private static final String linkArgs = "}}}, link: { name: '"; + + private static final String linkDeclareArgs = "', x-declare: {arguments: {"; + + private static final String QPID_MAX_COUNT = "qpid.max_count"; + + private static final String QPID_POLICY_TYPE = "qpid.policy_type"; + + private static String policyType = ""; + + private static int maxVal = 0; + + // putting together the arguments for the qpid queue + public static String getPolicyString(String val) { + // for qpid.policy_type, there is a corresponding constant in + // QpidQueueOptions, but did not want to add a dependency + + return addressArgs + val + declareArgs + "'" + QPID_MAX_COUNT + "':" + + getMaxCount() + ",'" + QPID_POLICY_TYPE + "':" + + getPolicyType() + linkArgs + val + UUID.randomUUID() + + linkDeclareArgs + "'" + QPID_MAX_COUNT + "':" + getMaxCount() + + ",'" + QPID_POLICY_TYPE + "':" + getPolicyType() + "}}}}"; + } + + /** + * @return the policyTypeOption + */ + public static String getPolicyType() { + if (policyType != null && !policyType.isEmpty()) { + return policyType; + } + IPreferenceStore store = Activator.getDefault().getPreferenceStore(); + String value = store.getString(QPID_POLICY_TYPE); + // validation + for (PolicyType type : PolicyType.values()) { + if (!type.getType().equals(value)) { + policyType = value; + } + } + // fail safe for bad configurations + if (policyType == null || policyType.isEmpty()) { + policyType = PolicyType.RING.getType(); + } + return "'" + policyType + "'"; + } + + /** + * Get the max count as given in the config.xml in the preference store + * + * @return + */ + public static int getMaxCount() { + if (maxVal != 0) { + return maxVal; + } + IPreferenceStore store = Activator.getDefault().getPreferenceStore(); + maxVal = store.getInt(QPID_MAX_COUNT); + + // fail safe + if (maxVal == 0) { + maxVal = 1000; + } + return maxVal; + } +} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/updater/DataUpdateTree.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/updater/DataUpdateTree.java index 080c3fe413..0cbea7e3bd 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/updater/DataUpdateTree.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/updater/DataUpdateTree.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/status/MessageSender.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/status/MessageSender.java index 3c9fa3652d..46b1b4eb87 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/status/MessageSender.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/status/MessageSender.java @@ -32,6 +32,7 @@ import com.raytheon.uf.common.message.IMessage; import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationUtil; import com.raytheon.uf.viz.core.comm.JMSConnection; +import com.raytheon.uf.viz.core.preferences.JMSPreferences; /** * Sends messages to jms endpoints programmatically. @@ -88,7 +89,8 @@ public class MessageSender { dest = session.createQueue(endpoint); } if (DestinationType.TOPIC.equals(type)) { - dest = session.createTopic(endpoint); + dest = session + .createTopic(JMSPreferences.getPolicyString(endpoint)); } return dest; diff --git a/cave/com.raytheon.uf.viz.cots.feature/com.raytheon.uf.viz.cots.feature.ecl b/cave/com.raytheon.uf.viz.cots.feature/com.raytheon.uf.viz.cots.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.cwa/com.raytheon.uf.viz.cwa.ecl b/cave/com.raytheon.uf.viz.cwa/com.raytheon.uf.viz.cwa.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.cwat/com.raytheon.uf.viz.cwat.ecl b/cave/com.raytheon.uf.viz.cwat/com.raytheon.uf.viz.cwat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.core.feature/com.raytheon.uf.viz.d2d.core.feature.ecl b/cave/com.raytheon.uf.viz.d2d.core.feature/com.raytheon.uf.viz.d2d.core.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.core/com.raytheon.uf.viz.d2d.core.ecl b/cave/com.raytheon.uf.viz.d2d.core/com.raytheon.uf.viz.d2d.core.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.core/src/com/raytheon/uf/viz/d2d/core/time/D2DTimeMatcher.java b/cave/com.raytheon.uf.viz.d2d.core/src/com/raytheon/uf/viz/d2d/core/time/D2DTimeMatcher.java index 14ac5d1cb6..0cf845c54e 100644 --- a/cave/com.raytheon.uf.viz.d2d.core/src/com/raytheon/uf/viz/d2d/core/time/D2DTimeMatcher.java +++ b/cave/com.raytheon.uf.viz.d2d.core/src/com/raytheon/uf/viz/d2d/core/time/D2DTimeMatcher.java @@ -61,6 +61,7 @@ import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType; import com.raytheon.uf.viz.core.rsc.IResourceGroup; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.ResourceList; +import com.raytheon.uf.viz.core.time.TimeMatchingJob; import com.raytheon.uf.viz.d2d.core.D2DLoadProperties; /** @@ -72,6 +73,7 @@ import com.raytheon.uf.viz.d2d.core.D2DLoadProperties; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 10, 2009 chammack Initial creation + * 2012-04-20 DR 14699 D. Friedman Work around race conditions * *
* @@ -122,6 +124,10 @@ public class D2DTimeMatcher extends AbstractTimeMatcher implements private AbstractTimeMatchingConfigurationFactory configFactory; + // DR 14699 work arounds + private boolean needRetry; + private int nRetries; + /** * Default Constructor. */ @@ -152,6 +158,8 @@ public class D2DTimeMatcher extends AbstractTimeMatcher implements public void redoTimeMatching(IDescriptor descriptor) throws VizException { synchronized (this) { + needRetry = false; + if (timeMatchBasis != null) { IDescriptor tmDescriptor = timeMatchBasis.getDescriptor(); if (tmDescriptor != null && tmDescriptor != descriptor) { @@ -175,8 +183,11 @@ public class D2DTimeMatcher extends AbstractTimeMatcher implements Iterator pairIterator = descriptor.getResourceList() .listIterator(); while (pairIterator.hasNext()) { - AbstractVizResource rsc = pairIterator.next() + ResourcePair rp = pairIterator.next(); + AbstractVizResource rsc = rp .getResource(); + if (rsc == null && rp.getResourceData() instanceof AbstractRequestableResourceData) + needRetry = true; recursiveOverlay(descriptor, new FramesInfo(timeSteps, -1, resourceTimeMap), rsc); } @@ -193,6 +204,14 @@ public class D2DTimeMatcher extends AbstractTimeMatcher implements timeMatchUpdate(entry.getKey(), entry.getValue()); } } + + if (needRetry) { + if (nRetries < 200) { + ++nRetries; + TimeMatchingJob.scheduleTimeMatch(descriptor); + } + } else + nRetries = 0; } } @@ -303,6 +322,8 @@ public class D2DTimeMatcher extends AbstractTimeMatcher implements if (rsc instanceof IResourceGroup) { for (ResourcePair rp : ((IResourceGroup) rsc).getResourceList()) { AbstractVizResource rsc1 = rp.getResource(); + if (rsc1 == null && rp.getResourceData() instanceof AbstractRequestableResourceData) + needRetry = true; recursiveOverlay(descriptor, framesInfo, rsc1); } } @@ -311,7 +332,9 @@ public class D2DTimeMatcher extends AbstractTimeMatcher implements TimeMatchingConfiguration config = getConfiguration(rsc .getLoadProperties()); DataTime[] timeSteps = getFrameTimes(descriptor, framesInfo); - if (Arrays.equals(timeSteps, config.getLastBaseTimes())) { + if (Arrays.equals(timeSteps, config.getLastBaseTimes()) && + config.getLastFrameTimes() != null && + config.getLastFrameTimes().length > 0) { framesInfo.getTimeMap().put(rsc, config.getLastFrameTimes()); } else { config = config.clone(); diff --git a/cave/com.raytheon.uf.viz.d2d.gfe.feature/com.raytheon.uf.viz.d2d.gfe.feature.ecl b/cave/com.raytheon.uf.viz.d2d.gfe.feature/com.raytheon.uf.viz.d2d.gfe.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.gfe/com.raytheon.uf.viz.d2d.gfe.ecl b/cave/com.raytheon.uf.viz.d2d.gfe/com.raytheon.uf.viz.d2d.gfe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.nsharp.feature/com.raytheon.uf.viz.d2d.nsharp.feature.ecl b/cave/com.raytheon.uf.viz.d2d.nsharp.feature/com.raytheon.uf.viz.d2d.nsharp.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.nsharp/com.raytheon.uf.viz.d2d.nsharp.ecl b/cave/com.raytheon.uf.viz.d2d.nsharp/com.raytheon.uf.viz.d2d.nsharp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.nsharp/src/com/raytheon/uf/viz/d2d/nsharp/rsc/MdlSndNSharpResourceData.java b/cave/com.raytheon.uf.viz.d2d.nsharp/src/com/raytheon/uf/viz/d2d/nsharp/rsc/MdlSndNSharpResourceData.java index c95c058c80..cdd2e00832 100644 --- a/cave/com.raytheon.uf.viz.d2d.nsharp/src/com/raytheon/uf/viz/d2d/nsharp/rsc/MdlSndNSharpResourceData.java +++ b/cave/com.raytheon.uf.viz.d2d.nsharp/src/com/raytheon/uf/viz/d2d/nsharp/rsc/MdlSndNSharpResourceData.java @@ -94,7 +94,7 @@ public class MdlSndNSharpResourceData extends D2DNSharpResourceData { @Override protected NcSoundingCube getSoundingCube(NsharpStationInfo stnInfo) { - float[][] latLon = { { stnInfo.getLatitude(), stnInfo.getLongitude() } }; + double[][] latLon = { { stnInfo.getLatitude(), stnInfo.getLongitude() } }; return NcSoundingQuery.pfcSoundingQueryByLatLon(stnInfo.getReftime() .getTime(), stnInfo.getRangestarttime().getTime(), latLon, stnInfo.getSndType(), NcSoundingLayer.DataType.ALLDATA, false, diff --git a/cave/com.raytheon.uf.viz.d2d.skewt.feature/com.raytheon.uf.viz.d2d.skewt.feature.ecl b/cave/com.raytheon.uf.viz.d2d.skewt.feature/com.raytheon.uf.viz.d2d.skewt.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.ui/com.raytheon.uf.viz.d2d.ui.ecl b/cave/com.raytheon.uf.viz.d2d.ui/com.raytheon.uf.viz.d2d.ui.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.uf.viz.d2d.ui/localization/styleRules/d2dContourStyleRules.xml b/cave/com.raytheon.uf.viz.d2d.ui/localization/styleRules/d2dContourStyleRules.xml index 2133cc4a2d..66a272a6c3 100644 --- a/cave/com.raytheon.uf.viz.d2d.ui/localization/styleRules/d2dContourStyleRules.xml +++ b/cave/com.raytheon.uf.viz.d2d.ui/localization/styleRules/d2dContourStyleRules.xml @@ -37,6 +37,28 @@ + + + + + + GH + GHxSM + zAGL + HRRR-East + HRRR-West + + + ft + + 5000 + + + + + + + +Adjust +
+
+Introduction +
+
+Adjust is a GFE SmartTool +that performs basic math functions like add, subtract, multiply and divide on a grid. +However, as is often useful with GFE, it allows options related to elevation (i.e., +adding mostly at higher elevations, or subtracting mostly at lower elevations), and +related to edit areas (i.e., adding most in the center of the edit area, or adding +nearly the same amount everywhere – but ‘ramping down’ to no change at the edge of +the edit area). You can combine these options in a variety of ways. This tool +really takes the place of many other tools previously on the SmartTool Repository +like UpMtn and DownValley, but it also provides many more combinations due to the +ability to specify the edge effect and elevation effect options ‘on-the-fly’. +
+
+
+How +the Procedure Works +
+
+The basic function of the tool +is to take the specified value and perform the specified action of Add, Subtract, Multiply +or Divide:

+Adjust
+
+
+The value can be any number, +either an integer or floating-point number, and can be negative (multiplying by negative +one is especially useful for changing the sign of a grid). The final grid values, +however, will not be allowed to lie outside the range of valid values for that particular +grid parameter. Dividing by zero is, of course, not allowed. +

+Adding and Subtracting is useful for most parameters, such as adding or subtracting a +few degrees from temperatures, or adding or subtracting a few percent from PoPs. +Multiply and Divide are most useful with certain parameters, such as increasing QPF +by multiplying by 1.5, or dividing by 2 to cut PoPs in half.
+
+
+
+Vector Option +
+
+For vector parameters, the +setting of the GFE Vector Editing Mode is ignored, but instead is controlled by the +vector setting on the tool itself (see graphic above). +

+If the vector setting is “Both†and the value is set to 10.0, then performing an +Addition operation will add 10 knots to the magnitude of a wind, and add 10 degrees +to the direction (veer the wind by 10 degrees). This is only rarely what you want, +so the Both option is rarely used. More typically you only operate on the vector +Magnitude, and that is why it is selected by default when you start the tool.
+
+
+
+Edge Option +
+
+The tool works either on an +edit area or the entire grid. When working on an edit area, the edge options can be +useful to “blend†your changes into the rest of the grid. +

+The Flat option, makes no attempt to “blend†your changes into the edges of your edit +area. For example, if you start with a constant grid of 1 (let’s say it is a PoP grid) +and define an edit area.
+Adjust

+If you then add a value of 50, with an edge option of flat, you will get:
+Adjust

+Note that inside the edit areas, the value is now 51 (50 + 1), and there has been no +attempt to “blend†these values into the rest of the grid. If, however, the edge option +is chosen then the result would be:
+Adjust

+Note that most of the edit area still contains the value of 51 (50+1), but near the +edges of the edit area, the adjustment is “scaled back†down to zero along the edge, +so that it “blends in†with the rest of the grid. The width of the edge effect is +controlled by the Edge Width slider which defaults to 5, meaning the values are +blended in over 5 pixels, or gridboxes. If, however, the taper option is chosen +then the result of adding 50 will be:
+Adjust

+Note that only one pixel, furthest from the edge of the edit area, receives the full +adjustment of adding 50 and reaching a final value of 51. Everywhere else receives +a lesser amount of adjustment such that the value blends in across the entire edit area. +

+Note, however, that the taper function has an error if the edit area includes the edge +of the GFE grid. In this example, the grid includes the corner of the GFE grid and +the taper function produces an incorrect adjustment:
+Adjust

+It is worth pointing out that for addition and subtraction, the edge and taper options +trend to “zero†or “no-change†at the edge of the edit area. However, for +multiplication and division, the edge and taper options trend to “one†at the edge of +the edit area, because multiplying or dividing by 1.0 gives the “no-change†+effect.
+
+
+
+Elevation Option +
+
+The elevation option +allows you to perform your operation (add, subtract, multiply or divide) mostly +in areas of similar elevation. If the None option (the default) is chosen, then +elevation does not influence the operation. +

+However, if the Mountain option is chosen, then the full adjustment will take +place at the highest elevation in the edit area, and zero adjustment will take +place at the lowest elevation in the edit area. For example, with topography +like this:
+Adjust

+The highest elevation is along the extreme right edge of the edit area. +The lowest elevation is in the upper center of the edit area. The result +of adding 50 to our constant grid of 1, gives:
+Adjust

+Note how only one pixel gets the final value of 51, and it is the point inside +the edit area with the highest elevation. Likewise, if the Valley option is chosen +Then the effect is just the opposite, the full adjustment is made at the lowest +elevation inside the edit area, and zero adjustment is made at the highest +elevation:
+Adjust

+If the Specific option is chosen Then the full adjustment will take place at the +specific elevation. The effect will then taper down to zero adjustment at both +the highest and lowest elevation inside the edit area:
+Adjust

+Note that if the elevation specified is above the highest elevation inside the +edit area, then the effect will be exactly the same as choosing the “Mountain†+option. Likewise, if the elevation specified is below the lowest elevation +inside the edit area, then the effect will be exactly the same as choosing +the “Valley†option.
+
+
+Combined +Elevation and Edge Options +
+
+Any of the options +can be combined. As the examples above show, when using the elevation options +of Mountain, Valley, or Specific, there will likely be harsh gradients produced +at the edge of the edit area. If, for example, the Edge option is also chosen +along with the Mountain option, with an addition of 50, the result is:
+Adjust

+Note that the adjustment now blends in well with the rest of the grid, because +the edge effect is trending the adjustment back toward zero at the edges of the +edit area. However, also note that the adjustment is also putting most of the +adjustment at the higher elevations. It is worth pointing out that, in this case, +the gridbox that receives the full adjustment is not the gridbox with the highest +elevation (because that point is also on the edge of the edit area). +Instead, a point further inside the edit area, which has a high elevation, +receives the full adjustment:
+Adjust

+Mathematically, the two adjustment function are simply multiplied together, and +re-scaled, so that at least one gridbox receives the full adjustment. +

+Similarly, the combination of the Mountain option with the Taper option yields:
+Adjust

+Here, the taper option would like to put the most adjustment in the middle of the +edit area, but the lowest elevations are also in that area, so the combination +puts the maximum adjustment at a relatively high elevation, but as close to the +center of the edit area as possible:
+Adjust

+Old tools on the SmartTool repository were hard-coded combinations of some of these +options. For example, the UpMtn tool is essentially a combination of Add, Mountain +and Edge, with an edge width of 5 gridboxes. The DownValley tool is essentially a +combination of Subtract, Valley and Edge, with and edge width of 5 gridboxes. +The MultiplyDivide tool provided a combination of Multiply, None, Flat as well as +Divide, None, Flat options. Putting all these options into a single tool means +fewer tools on the GFE tool list, and provide some new combinations.
+ + diff --git a/cave/com.raytheon.viz.gfe/help/Align_Grids.html b/cave/com.raytheon.viz.gfe/help/Align_Grids.html new file mode 100644 index 0000000000..33acc748d1 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/Align_Grids.html @@ -0,0 +1,63 @@ + + + + + Align_Grids + + + + + + +Align_Grids +
+
+Overview +
+
+This procedure will align the time +breaks of selected weather elements to match the time breaks of the individual grids of a "source" +element. The main idea is to help minimize manual splitting and stretching of grids in the Grid +Manager. If a grid to align does not exist, then it will be created from scratch. Therefore one +use of this procedure could be to create default SnowAmt grids that match the time breaks of QPF +grids. In general, you will want to edit the source element first creating the desired time breaks +and then run this procedure to align other elements before editing them. For example, edit Wx, +then run Align_Grids to line up the floating PoP grids with the Wx grids, then edit PoP. +

+The data from an element's original time breaks are transformed to the new time breaks using the +following methods: +
    +
  • Wx: "MaxTime" - uses original grid with the dominant temporal coverage in the new + aligned time range.
  • +
  • PoP: "Max" - Maximum value of all original grids in the new time range of the + aligned grid.
  • +
  • Sky: "Max" - Maximum value of all original grids in the new time range of the + aligned grid.
  • +
  • WindGust: "Max" - Maximum value of all original grids in the new time range of the + aligned grid. NOTE: WindGust is always aligned to Wind grids.
  • +
  • Wind: "TimeWtAverage" - Time weighted average value
  • +
  • QPF: "Sum" - Summation of all grids
  • +
  • SnowAmt: "Sum" - Summation of all grids
  • +
  • IceAccum: "Sum, - Summation of all grids
  • +

+The logic for the procedure is as follows:
+
    +
  1. The procedure first copies the element to align to a temporary element.
  2. +
  3. New grids for the element to align are created from scratch to match the + time breaks of the source element's grids.
  4. +
  5. The grids in the temporary element are either fragmented (for rate based elements) + or split to match the time breaks of the source element.
  6. +
  7. Finally, the values in the temporary grids are assigned back to the aligned grids ' + using the getGrids method with the appropriate setting of the getGrids "mode" argument.
  8. +
+ diff --git a/cave/com.raytheon.viz.gfe/help/Button3Popups.html b/cave/com.raytheon.viz.gfe/help/Button3Popups.html index a598290555..e71f5b8aae 100644 --- a/cave/com.raytheon.viz.gfe/help/Button3Popups.html +++ b/cave/com.raytheon.viz.gfe/help/Button3Popups.html @@ -5,7 +5,7 @@ content="text/html; charset=iso-8859-1"> - 0.0.1 Button3Popups + Button3Popups

@@ -52,7 +52,7 @@ Forecast versus Model grids, or to Weather Elements listed within the Grid Manager. The applicable items will be listed depending on where you press -MB3.  +MB3. Some entries are not available at all times.
  @@ -85,7 +85,7 @@ This MB3 Pop-up operation always fragments the entire grid identified by the current
cursor location. The GFE main menu option uses the selected time range to fragment
-the portion of the grid selected.  For more information on the +the portion of the grid selected. For more information on the Fragment operation
available from the main menu, see the section on Fragment @@ -97,12 +97,12 @@ Training Guide. Divide the grid into two pieces at the nearest time constraint to the cursor location.  Note that this operation differs from the Split -operation offered in the GFE Grids-> menu.  This operation uses +operation offered in the GFE Grids-> menu. This operation uses only the current cursor location to divide the grid in exactly
-two parts.  The other operation uses the selected time range to +two parts. The other operation uses the selected time range to define the times at which
-to Split the grid.   See the section on
Split Grids in the GFE Grid Manager Training
Guide for more information. @@ -126,7 +126,7 @@ The menu label indicates the default value, e.g., "Assign <NoWx>". ignoring the vector edit mode and weather combine modes. The menu label indicates -the current pickup value, e.g., "Assign 45".  +the current pickup value, e.g., "Assign 45" Delete Grid @@ -134,8 +134,8 @@ the current pickup value, e.g., "Assign 45".  Create From Scratch - Creates a grid at the point you selected.  The grid -ismarked "e" + Creates a grid at the point you selected. The grid +is marked "e" for editable and the grid background is made green -- which specifies that the grid is locked by you. This applies only to empty Forecast database @@ -151,11 +151,11 @@ last Undo. Select All Times - Deselects any Weather Elements first, then selects all times + De-selects any Weather Elements first, then selects all times (from long in the past to far in the future) for the weather element where the -popup action was initiated. +pop-up action was initiated. Display Info @@ -163,7 +163,7 @@ popup action was initiated. Clear Highlight - Erases any "highlights" that may be present.  Note that + Erases any "highlights" that may be present. Note that certain smart tools can highlight grids. @@ -191,13 +191,12 @@ You can close the dialog by selecting Cancel.

Spatial Editor Popup Menu

-Selecting MB3 over the Spatial Editor opens a submenu with the +Selecting MB3 over the Spatial Editor opens a sub-menu with the following items:
    -
  • A list of edit tools as defined in the gfe configuration file. +
  • A list of edit tools as defined in the GFE configuration file. Some of the basic tools that may appear are:
    • @@ -205,14 +204,14 @@ the basic tools that may appear are: active time range. -
    • AdjustValue_Down -- Decrements gridpoints within the active +
    • AdjustValue_Down -- Decrements grid points within the active edit area and time range by the Delta Value.
    • -
    • AdjustValue_Up -- Increments gridpoints within the active edit +
    • AdjustValue_Up -- Increments grid points within the active edit area and time range by the Delta Value.
    • -
    • Smooth -- Smooths gridpoints within the active edit area over +
    • Smooth -- Smooths grid points within the active edit area over the active time range.
    • @@ -257,7 +256,7 @@ alters the active edit area.
    • Set Fuzz Value -- Brings up the Set Fuzz Value Dialog which allows the user to set the fuzz value that -applies to selecting homogeneous areas.  Applies only to SCALAR +applies to selecting homogeneous areas. Applies only to SCALAR and VECTOR.
    • Vector Edit Mode -- Allows user to switch the vector edit mode @@ -267,7 +266,7 @@ only when a Vector weather element is the active element.
    • Weather Edit Mode -- Allows user to switch the weather edit mode between -Combine and Replace modes.  Available only when a Weather weather +Combine and Replace modes. Available only when a Weather weather element is the active element.
    • Add ISC Marker -- Available when an ISC grid is directly displayed (clicking on the ISC grid). Adds an marker @@ -276,7 +275,7 @@ to a sample, but without the data value display) at the popup location. Markers are used to indicate the ISC update time, site identifier, and official database symbol. Refer to the Intersite Coordination -User's Guide for more details on markers.   Depending +User's Guide for more details on markers. Depending upon the office type of the ISC grid, this adds the ISC marker to the appropriate marker set.
    • @@ -286,7 +285,7 @@ existing marker. Removes an marker (similar to a sample, but without the data value display) near the popup location. Refer to the Intersite -Coordination User's Guide for more details on markers.  +Coordination User's Guide for more details on markers. Depending upon the office type of the ISC grid, this removes the ISC marker from the appropriate marker set.
      @@ -301,39 +300,34 @@ of the several distances. The Legend Area Button3 Pop-Up is position-sensitive -- the Pop-Up that is opened, and the commands it lists, pertain only to the particular Weather -Element or Map whose legend you MB3-pressed over.  The menu that +Element or Map whose legend you MB3-pressed over. The menu that opens allows you to:
        -
      • Change Color Table to -- Changes the Color Table of the Weather +
      • Imaging -- Changes the Color Table of the Weather Element to one of several color enhancement curves. When you change the Color Table of a Weather Element, both it's Color Bar and it's display as image are -changed accordingly.  Also provides access to the Color -Table Brightness Dialog and the Color -Table Editor.
      • +changed accordingly. Also provides access to the color chooser.
      • Change Graphic Color to -- Changes the graphic color of the Weather Element -or Map to the color you select.  When you change the graphic color +or Map to the color you select. When you change the graphic color of a Weather Element, both its graphic display color and its Legend color -are changed accordingly.  Also provides access to the Color Chooser.
      • Line Width -- Changes the width of the lines that make up the contour, wind barb, wind arrow, or weather area.
      • -
      • Line Style -- Changes the texture of the line.  Choices are: +
      • Line Style -- Changes the texture of the line. Choices are: SOLID, DASHED, DOTTED, and DASH_DOTTED.
      • Density -- Changes the contour interval if the weather element is -diplayed +displayed as a graphic, much like the D2D system.
      • Magnification -- Changes the size of the contour labels for the selected @@ -350,7 +344,7 @@ Display Attributes Dialog appears.
      • Grid Ops -- Opens a cascade menu allowing you to do many of the same operations -as you can on the grid manager popup.
      • +as you can on the grid manager pop-up.
      • Label - Appears only for Map Legends, and denotes the label attribute to @@ -401,17 +395,16 @@ Bar Popup Menu The color bar popup menu on the spatial editor changes depending upon the -type of weather element displayed as an image.  The menu that +type of weather element displayed as an image. The menu that opens allows you to:
        • Fit to Data, brings up a submenu with several choices.  Each changes the assignment of the color table spectrum so that the entire spectrum is scaled to the minimum to maximum data values found in the -grids.  +grids. These entries apply only to scalar and vector data.
          • All Grids - Uses the data values in all grids over the entire @@ -431,7 +424,7 @@ the active edit area to determine the minimum and maximum values.
        • Set Range -- Pops up the Set -Color Table Range Dialog  allowing the user to specify the +Color Table Range Dialog allowing the user to specify the minimum and maximum scaled values for the color table spectrum for the weather element currently displayed as an image.  Applies to scalar and @@ -441,7 +434,7 @@ weather element types only.
        • spectrum so that the entire spectrum is scaled from the minimum possible value to -the maximum possible value.  Applies to scalar and vector weather +the maximum possible value. Applies to scalar and vector weather element types only.
        • Set Pickup Value -- Displays the Pickup @@ -466,19 +459,19 @@ weather values entry. Multiple levels of cascades may be configured.
        • Set to Session Values -- Only used for WEATHER and DISCRETE type of weather -elements.  Displays a cascade of user-set pick-up values.  +elements. Displays a cascade of user-set pick-up values. These values are added to this list from the Weather -Set Value Dialog's Add to Session command.  The purpose of +Set Value Dialog's Add to Session command. The purpose of this -list is to allow the user to preconfigure a set of values that can be +list is to allow the user to pre-configure a set of values that can be used again and again for the current GFE session.
        • Change Color Table To... -- Provides a list of color table spectrums that -may be applied to the weather element displayed as an image.  Also +may be applied to the weather element displayed as an image. Also provides access to the Color Table Brightness Dialog and the You can change the settings of any of the attributes listed in the dialog -and click OK.  To close the dialog without making any changes, +and click OK. To close the dialog without making any changes, simply click Cancel.

          The "image"-type visual cannot be turned off for the image mode. At @@ -511,10 +504,9 @@ least one graphic-type entry must be selected for the graphic mode.


          Temporal Editor Popup Menu

          -Selecting MB3 over the Temporal Editor opens submenus that will differ +Selecting MB3 over the Temporal Editor opens sub-menus that will differ depending on where you pressed. The following items may appear:
          -  @@ -535,17 +527,16 @@ and Vector data. +them last Undo. - @@ -576,7 +567,7 @@ edit the data. - -


          -

           Back To Top
          +

          Back To TOC

          diff --git a/cave/com.raytheon.viz.gfe/help/ButtonBarDialogs.html b/cave/com.raytheon.viz.gfe/help/ButtonBarDialogs.html index 47b0c7ad88..9da114a47b 100644 --- a/cave/com.raytheon.viz.gfe/help/ButtonBarDialogs.html +++ b/cave/com.raytheon.viz.gfe/help/ButtonBarDialogs.html @@ -5,7 +5,7 @@ content="text/html; charset=iso-8859-1"> - 0.0.1 ButtonBarDialogs + GFESuite Documentation - ButtonBarDialogs

          @@ -28,15 +28,12 @@ Dialog

          Edit Actions Dialog

          -The Edit Actions dialog is opened from the Button Bar or from Main -Menu-->GFE-->Define -Smart Tools...  It allows you to create, modify, and invoke a -variety +The Edit Actions dialog is opened from the Button Bar. +It allows you to create, modify, and invoke a variety of Spatial Editor Smart Tools. Please refer to the Smart Tool Training Guide to understand the concepts of Smart Tools and for instruction on modifying and creating your own. -

          +

          The Edit Action Dialog description is divided into three sections:

            @@ -48,53 +45,29 @@ modifying and creating your own.  

            Pull-Down Menus

            -Three pull-down menus appear at the top of the Edit Actions Dialog: +One pull-down menu appears at the top of the Edit Actions Dialog:

            File Menu

            -
            The File Menu opens a submenu with the +
            The File Menu opens a sub-menu with the following entries:

            • New Item in Window  --  Cascade of open windows -to -allow you -to create a new item.
            • -
            • Screen Smart Tools  --  If on, only the smart +
              +
            • Screen Smart Tools -- If on, only the smart tools that edit the active weather element will be displayed in the Smart Tools window.
            • -
            • Close  --  Closes the window.
            • +
            • Close -- Closes the window.


            -

            Windows Menu

            -
            The Windows Menu allows you to vary the display -of -the Edit Actions dialog.  The Windows Menu opens a submenu with -these -entries:
            -
              -
            • Windows --  Select the Smart Tool and/or -the Utility window.
            • -
            • Show Smart Tool Window  --  Display the Smart Tool -window.
            • -
            • Show All Windows  --  Display all windows.
            • -
            -


            -

            -

            -

            Scroll Window

            The Smart Tools window is the default display of the Edit Actions -window.  +window. The Smart Tools window allows you to select and activate Smart Tools by pressing MB1 on the action. In general, to activate a Smart Tool, follow @@ -112,17 +85,13 @@ these steps: The following action buttons appear at the bottom of the Edit Actions dialog:
            @@ -130,13 +99,11 @@ value of the AdjustValue_Up and AdjustValue_Down tools.

          -  -


          Pickup Value Dialog

          The Pickup Value dialog is opened from the Edit -Actions Dialog.   It allows you to set the value that will be +Actions Dialog. It allows you to set the value that will be used by Assign Value Tool for any loaded Weather Element. Optionally, you can choose to Assign the value you have chosen by clicking on the @@ -144,36 +111,30 @@ can choose to Assign the value you have chosen by clicking on the button.

          The dialog displays a color scale, and the name of the Weather Element -is shown at the top of the dialog.  There are four different types -of dialogs: Scalar, Vector,  Weather, and Discrete. +is shown at the top of the dialog. There are four different types +of dialogs: Scalar, Vector, Weather, and Discrete.

          Scalar PickUp Value Dialog

          There are two ways to set the current pickup value. MB1 click or drag will -set the pickup value to whatever value you clicked.  Or, if you +set the pickup value to whatever value you clicked. Or, if you click MB1 in the box labeled "Enter Value", you can enter a value using the keyboard. -

          -

          The scaling can be changed by MB2 click over the scale.  The +

          +

          The scaling can be changed by MB2 click over the scale. The MB3 -Pop-Up menu allows you to modify the display of the color scale.  +Pop-Up menu that allows you to modify the display of the color scale is currently +not available from the Pickup Value dialog. Select one of the follow Pop-Up menu items to modify the scale display -accordingly. Note that the last item in this list is Edit Color -Table...  -Selecting this item will display the -Color -Table Editor Dialog which allows you to create and save your own -color -table. +accordingly.

          Vector PickUp Value Dialog

          The vector pick up value dialog contains an entry field for direction and magnitude, selectors for the vector -edit mode, and a graphical entry for direction and magnitude.  +edit mode, and a graphical entry for direction and magnitude. The direction and magnitude may be entered in the entry fields at any time, regardless of the vector edit mode. The vector edit mode affects the @@ -188,53 +149,44 @@ meter readout also representing both magnitude and direction.

          The user can choose to set the direction through the graphical entry in either the "to" or the "from" direction by starting the operation in -the appropriate hemisphere.  If you start the entry operation +the appropriate hemisphere. If you start the entry operation within 90 degrees of either side of the arrow, then you are specifying the "to" -direction.  If you start the enty operation within 90 degrees of +direction. If you start the entry operation within 90 degrees of either side of the wind barb, then you are specifying the "from" direction.

          Clicking or dragging in the graphic entry will set the magnitude and direction, if the vector -edit mode is set to Both.  If the vector edit mode is set to +edit mode is set to Both. If the vector edit mode is set to Magnitude -Only, then only the magnitude may be set.  If the vector edit mode -is set to Direction Only, then only the direction may be set.  The +Only, then only the magnitude may be set. If the vector edit mode +is set to Direction Only, then only the direction may be set. The direction is determined by the angle from the center of the -circle.  +circle. The magnitude is determined by the distance your cursor is from the center of the circle.

          -


          -  +


          Weather PickUp Value Dialog

          The Weather PickUp Value dialog allows the user to define a new weather pick-up value, and optionally perform an Assign Value of the new value -on the spatial editor.  The table below explains each control of -this -dialog: -
          -  +on the spatial editor. The table below explains each control of this dialog: +

          Undo Data Area Reverses the last grid edit operation that was -performed.  You +performed. You are only able to reverse the very last operation -- but you can undo -the -last Undo.
          Move Weather Element Weather Element Label, Data Area Appears if over a weather element label or data area. Moves the Weather -Element to the top of the Temporal Editor display.  The Move Weather Element Dialog opens that prompts you to confirm the move. This allows you to group Weather Elements into the same Temporal Editor @@ -568,7 +559,7 @@ the weather element.
          Set... Data AreaThis applies only to WEATHER and DISCRETE  data. Brings + This applies only to WEATHER and DISCRETE data. Brings up the Temporal Editor Set Weather Pickup Value dialog allowing the user to set and edit the data.
          Set to Recent Value... Data AreaThis applies only to WEATHER and DISCRETE  data. Brings + This applies only to WEATHER and DISCRETE data. Brings up a cascade of recently set pickup values.  Choosing an entry will set the pickup @@ -585,9 +576,9 @@ value and edit the data.
          Set to Common Value... Data AreaThis applies only to WEATHER and DISCRETE data.  Brings + This applies only to WEATHER and DISCRETE data. Brings up a cascade -of commonly set pickup values. These values are defined in the gfe +of commonly set pickup values. These values are defined in the GFE configuration file's common weather/discrete @@ -599,7 +590,7 @@ values entry.
          - +a more significant key. For example, if you have Sct RW- in one +entry frame and Sct RW + in another, the resulting value will be the more +significant event, which will be Sct RW +. Coverages and probabilities are +also combined in the same manner. @@ -244,28 +196,14 @@ combined in the same manner. - - - - +additional weather type. @@ -273,11 +211,11 @@ will be combined with any existing weather. +bar pull-down menu. @@ -287,69 +225,65 @@ bar pulldown menu. +to vision. The weather type should always be chosen first. +may be specified in the GFE configuration file for each weather +type. +may be specified in the GFE configuration file for each weather type. +dependent.
          Current ValueShows the current weather value for the dialog.  The -weather key -is a composite of all of the weather type entry frames.  Note that + Shows the current weather value for the dialog. The weather key +is a composite of all of the weather type entry frames. Note that certain coverages, probabilities, and intensities may be combined into -a more significant key.  For example, if you have Sct RW- in one -entry -frame and Sct RW + in another, the resulting value will be the more -significant -event, which will be Sct RW +.  Coverages and probabilities are -also -combined in the same manner.
          Reset to No Weather Add New Weather Type Entry Frame Adds a new weather type entry frame to allow the user to specify an -additional weather type. 
          Weather EntryThe Weather Entry frame consists of four option menus, Type, -Cov/Prob, -Inten, and Vis.  In addition, depending upon the type selected, -there -may be optional attributes displayed.  The forecaster chooses the -appropriate values for each of the categories to create a weather -key.  -The coverage/probability, intensity, and optional attribute fields are -dependent upon the selection of the weather type.  The weather -type -should always be chosen first.
          Toggle Replace/Combine Mode If the Assign Value button is pressed, the current weather key is assigned -to the active edit area.  In replace mode, any existing data will -be replaced in the active edit area.  In combine mode, the new +to the active edit area. In replace mode, any existing data will +be replaced in the active edit area. In combine mode, the new weather will be combined with any existing weather.
          Add to session Adds the currently displayed value to the list of user-defined session -values.  This is useful to set up a sequence of pick up values +values. This is useful to set up a sequence of pick up values which can later be accessed from the color -bar pulldown menu.
          Edit Data Weather Type The weather type field consists of No Weather, precipitation, and obstructions -to vision.  The weather type should always be chosen first.
          Coverage/Probability The coverage and probabilities option menu contents depends upon the -weather type chosen.  The default -may be specified in the gfe configuration file for each weather -type. 
          Intensity The intensity option menu contents depends upon the weather -type chosen.  +type chosen. Some weather types don't have a valid intensity and thus the <NoInten> -must be chosen.  The default -may be specified in the gfe configuration file for each weather type.
          Visibility The visibility option menu is fixed for all weather -types.  The +types. The selection of <NoVis> indicates that no visibility has been defined.
          Optional Attributes The list of optional attributes is weather type -dependent. 

          -  -

          +

          The user may also control the Weather/Discrete -Combine Mode by using the Combine pushbutton.    +Combine Mode by using the Combine pushbutton. "Description" information about each entry is available through the GFE -> Viewing Preferences -> Wx/Discrete: Show Description menu option.

          Discrete PickUp Value Dialog

          The Discrete PickUp Value dialog allows the user to define a new discrete pick-up value, and optionally perform an Assign Value of the new value -on the spatial editor.  The table below explains each control of +on the spatial editor. The table below explains each control of this dialog:
          -  - @@ -363,19 +297,11 @@ the discrete key definition in serverConfig) - - - - +bar pull-down menu. @@ -411,17 +337,15 @@ discrete value.
          Current ValueShows the current discrete value for the dialog.  The + Shows the current discrete value for the dialog. The discrete -key is a composite of all of the discrete value frames.  For +key is a composite of all of the discrete value frames. For non-overlapping, there is only 1 frame available.
          Add New Entry Frame Adds a new weather type entry frame to allow the user to specify an -additional discrete type.  This may not appear for all weather +additional discrete type. This may not appear for all weather elements since some weather elements are not defined to allow for overlapping types.
          Entry FrameThe Entry Frame consists of an option menu showing the -currently selected -value. The value consists of a Base Type and Aux Data.  Some -weather elements are not defined to have Aux Data.
          -
          Toggle Replace/Combine Mode If the Assign Value button is pressed, the current discrete @@ -390,11 +316,11 @@ discrete value will be combined with any existing discrete value. Add to session Adds the currently displayed value to the list of user-defined session -values.  This is useful to set up a sequence of pick up values +values. This is useful to set up a sequence of pick up values which can later be accessed from the color -bar pulldown menu.
          Edit Data Aux Data
          The aux data field is -optional.  If enabled, only a certain width entry is -allowed.  The purpose for the aux data is specific to the discrete +optional. If enabled, only a certain width entry is +allowed. The purpose for the aux data is specific to the discrete element.
          -

          +


          The user may also control the Weather/Discrete @@ -430,17 +354,9 @@ Combine Mode by using the Combine pushbutton. href="GFEMainMenu.html#WxDiscreteDescription">GFE -> Viewing Preferences -> Wx/Discrete: Show Description menu option.

          -  -

          -
          -
          -
          -
           

          @@ -448,7 +364,7 @@ option.
          Delta Value Dialog The Delta Value Dialog is opened from the Edit -Actions Dialog.  It allows you to set the delta value of the +Actions Dialog. It allows you to set the delta value of the AdjustValue_Up and AdjustValue_Down tools. Optionally, you can adjust the grid values down or up by clicking on the "Adjust Down" or "Adjust Up" buttons. @@ -460,31 +376,18 @@ the dialog.

          -
          -
           
          - -
          -
          -
          -
          +

          -
          -
          -
          -
          -
          -
          -
          -
           
          +

          Edit Area and Query Dialog

          Opens a dialog that allows you to load previously defined edit areas, and -construct query expressions that create edit areas.  One way to +construct query expressions that create edit areas. One way to define an edit area is by defining a query. A query is a mathematical expression @@ -497,46 +400,43 @@ are searched for. The result is a new edit area that consists of all the areas that match the query's weather conditions.

          -


          -  +


          Main Window

          There are several windows and buttons on the Edit Area and Query Dialog:
            -
          • Query --  The query expression.
          • -
          • Groups --  Edit Area Group(s). You may select which edit +
          • Query -- The query expression.
          • +
          • Groups -- Edit Area Group(s). You may select which edit areas you wish to view in the Edit Areas window. Edit Areas that are not part of any group are displayed under "Misc".
          • -
          • Edit Areas --  Named edit areas that have been saved.
          • -
          • Weather Elements --  Weather elements that can be used in +
          • Edit Areas -- Named edit areas that have been saved.
          • +
          • Weather Elements -- Weather elements that can be used in the query expression.
          • -
          • Active Edit Area --  Displays the current edit area. If it -is a -query, +
          • Active Edit Area -- Displays the current edit area. If it +is a query, the expression will be shown. If it is simply polygons, the word "Polygon" will be displayed.
          • -
          • Clear Query --  Clears the query expression.
          • -
          • Recall Query --  Displays a list of past queries (limit 10). +
          • Clear Query -- Clears the query expression.
          • +
          • Recall Query -- Displays a list of past queries (limit 10). If chosen, the query will appear in the Query window. The list will not contain duplicates.
          • -
          • Undo Edit Area --  Reverts to previous edit area.
          • -
          • Convert to Location --  If the current edit area is defined +
          • Undo Edit Area -- Reverts to previous edit area.
          • +
          • Convert to Location -- If the current edit area is defined by a query, converts it to a polygon. After this operation, the edit area is a static set of points and will not change with the data.
          • -
          • Submit --  Submit the query for evaluation. Clears the query +
          • Submit -- Submit the query for evaluation. Clears the query expression.
          • -
          • Cancel --  Cancel and close the dialog.
          • +
          • Cancel -- Cancel and close the dialog.

          Save/Delete Menu

          @@ -563,58 +463,50 @@ Edit Area Groups Dialog
        • The PickupValue Menu at the top of the Dialog lists each of the weather elements that are currently loaded into the -GFE.  +GFE. Selecting one of these will paste its current pickup value into the query area.

          Wx/Dis Values Menu

          The Wx/Dis Values brings up a menu with the weather -and discrete weather elements listed.  Choosing one of these will -bring up the Weather  Value Dialog or Discrete Value Dialog. For +and discrete weather elements listed. Choosing one of these will +bring up the Weather Value Dialog or Discrete Value Dialog. For weather elements, the user specifies the type, coverage/probability, intensity, -visiblity, and any optional attributes.  The edit area string will -then contain the "ugly" string for the comparision.  See the Weather Pick Up Dialog for more details on how to use the dialog.
          - +

          For Discrete elements, the user specifies the key. See the Discrete Pick Up Dialog more more detailed on how to use the dialog.

          -

          Set Discrete Dialog
          -  +

          Set Discrete Dialog

          Create Mask Menu

          The Create Mask menu entry brings up a menu with -the weather and discrete weather elements listed.  Choosing one of +the weather and discrete weather elements listed. Choosing one of these will bring up the Weather Contains or Discrete Contains -Dialog.  +Dialog. These dialogs allow you to choose a combination of various values and the -query will include all gridpoints that contain ANY of the items +query will include all grid points that contain ANY of the items selected in the dialog.
          For weather elements, the dialog presents choices for the coverages, types, intensities, visibilities, and attributes.


          -

          +

          For discrete, the options are simply a list of the possible discrete types:

          -


          -  +


          Components of Queries

          You can create a new query by entering one or more weather conditions. @@ -627,16 +519,16 @@ Query values can combine any number of the following: Queries are written in numerical python, and thus the syntax is similar to smart tools and smart -initialization.  An edit area and a weather element are +initialization. An edit area and a weather element are basically -Python variables.  An edit area is represented by a mask of bits +Python variables. An edit area is represented by a mask of bits which -make up the edit area.  A weather element is a numerical grid for +make up the edit area. A weather element is a numerical grid for SCALAR, a tuple of two numerical grids for VECTOR, and a grid and a key for both WEATHER and DISCRETE.

          Parenthesis are very important when using the OR ('|') or AND ('&') -operators since these operators have a high order of precedence.  +operators since these operators have a high order of precedence. The following statements are not equal:

          @@ -679,9 +571,7 @@ The following statements are not equal:

          More complicated queries may also be performed such as the following on SCALAR data (note that parenthesis must be provided):

          -  @@ -712,9 +602,7 @@ note that Wind[0] refers to the magnitude and Wind[1] refers to the direction, as in smart initialization and smart tools:

          @@ -736,20 +624,18 @@ The direction is the "FROM" direction.

          Weather and Discrete queries are performed using the mask -function.  The mask button on the dialog simply saves you from +function. The mask button on the dialog simply saves you from typing -the word mask.  The mask function is in this form:   +the word mask. The mask function is in this form: mask(weatherElementName, -stringMatch, regExpressionYesNo).  Normally you don't provide a +stringMatch, regExpressionYesNo). Normally you don't provide a regular -expression so the mask is in this form:  mask(weatherElementName, -stringMatch).  Here are some examples of using the mask function +expression so the mask is in this form: mask(weatherElementName, +stringMatch). Here are some examples of using the mask function for Weather and Discrete:

          -  @@ -786,16 +672,16 @@ the phrase and the '\Z' matching the end of the phrase.

          The mask function uses substring searches of the keys to determine what -grid points match the query.  The PickUp Value and Wx/Dis Values +grid points match the query. The PickUp Value and Wx/Dis Values menus provide a quick way to enter the pick up value or an exact match for weather -and discrete weather elements.  Note that since substring +and discrete weather elements. Note that since substring comparisions are performed, providing a query of mask(Wx, "Sct:RW:+:") will match any grid point that has Sct:RW:+: in it, so it will also match grid points -that have a weather key of :  +that have a weather key of: "Iso:T:<NoInten>:<NoVis>:^Sct:RW:+:<NoVis>".  The only way to find grid points that ONLY have the Sct:RW:+: in it without @@ -805,13 +691,13 @@ table.

          The create mask menu option provides an easy way to select a set of Wx or Discrete characteristics to search.

          -

          Combining queries are performed through the "|" OR  and  +

          Combining queries are performed through the "|" OR and "&" -AND operators. Since the syntax in the query is numerical Python, there -are many other possibilities for the syntax.  Here is an example +AND operators. Since the syntax in the query is numpy, there +are many other possibilities for the syntax. Here is an example of using the python absolute() function to calculate the absolute value of -an expression.  In this case, we are selecting all T grid points +an expression. In this case, we are selecting all T grid points that differ from the AVN model greater than 5 degrees:

          @@ -819,9 +705,7 @@ differ from the AVN model greater than 5 degrees:

          The name in the query, e.g., T, can be one of several forms:

          @@ -875,9 +759,8 @@ Edit Area Groups Dialog. Click "Save" to save the Edit Area. You may Cancel the dialog at any time.

          -


          +


          +


          @@ -891,9 +774,7 @@ a saved Edit Area. the Identifier box and click "Delete." You may Cancel the dialog at any time.

          -


          +



          @@ -921,8 +802,7 @@ Group.

          You may Cancel the dialog at any time.

          - +

          Delete Edit Area Group Dialog

          @@ -944,15 +824,12 @@ deleted so you can verify that you want it deleted.

          You may Cancel the dialog at any time.

          -


          -  +




          -
           Back To Top     +
          Back To Top Back To TOC
          diff --git a/cave/com.raytheon.viz.gfe/help/CarSnowAmt.html b/cave/com.raytheon.viz.gfe/help/CarSnowAmt.html new file mode 100644 index 0000000000..534a935dc4 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/CarSnowAmt.html @@ -0,0 +1,36 @@ + + + + + CarSnowAmt + + + + + + +CarSnowAmt +
          +
          +Overview +
          +
          +This tool uses upper level temperatures, +vertical motion, and relative humidity to calculate a snowratio. The tool algorithm uses a blend of +approaches based on the findings Dube`(2003), and also in part Waldstreicher(2001), and the top-down +microphysical diagnostics of Baumgardt(2001). The derived snowratio is then multiplied by the QPF +field to yield a snow amount. The tool is capable of producing snowratios from 0 to 25:1. +Highest snowratios occur when vertical motion maxima coincide with snow production zone +(i.e. temperatures between -12 and -18 Celsius). + + diff --git a/cave/com.raytheon.viz.gfe/help/CheckTandTd.html b/cave/com.raytheon.viz.gfe/help/CheckTandTd.html index 1607336523..a59048ebbd 100644 --- a/cave/com.raytheon.viz.gfe/help/CheckTandTd.html +++ b/cave/com.raytheon.viz.gfe/help/CheckTandTd.html @@ -2,7 +2,7 @@ - + CheckTandTd @@ -59,7 +59,7 @@ CheckTandTd procedure begins by retrieving all of the MinT, MaxT, T, and Td grid inventory. These timeRanges are used later throughout the code, and allow the tool to work in any time zone. Next, each MinT grid and all T grids that correspond to the associated MinT -timeRange are retrieved. Using Numeric Python, each T grid is +timeRange are retrieved. Using numpy, each T grid is compared with the MinT grid to identify where T grid points are lower than the MinT grid. A temporary grid is created (named TLessThanMin) that highlights where this condition is met by flagging the grid with @@ -137,33 +137,5 @@ before running this tool.
          No special configuration is required with this tool. -
          -
          -Installing the -Tool -
          -
          -A copy of -GFE_module_installer.sh, authored by Paul Jendrowski, has been -included in the distribution for convenience. To use it, install all -of the files included with this distribution in a directory. Then -run the GFE_module_installer to install the files. For more -information on the GFE_module_installer see the web page at: -
          -
          -http://140.90.90.253/~applications/LAD/generalappinfoout.php3?appnum=1389 -
          -
          -If you choose -not to use the GFE_module_installer, you can install these files by -hand using the ifpServerText command. Type ifpServerText in -the gfe bin directory for more information. -
          -
          -


          -

          diff --git a/cave/com.raytheon.viz.gfe/help/Collaborate_PoP_SnowAmt_QPF.html b/cave/com.raytheon.viz.gfe/help/Collaborate_PoP_SnowAmt_QPF.html new file mode 100644 index 0000000000..27d2476176 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/Collaborate_PoP_SnowAmt_QPF.html @@ -0,0 +1,120 @@ + + + + + Collaborate_PoP_SnowAmt_QPF + + + + + + +Collaborate_PoP_SnowAmt_QPF +
          +
          +Introduction +
          +
          +With the introduction of IFPS 11, the PoP, +SnowAmt, and QPF grids are now floating, i.e., they are no longer fixed to specific 6 or 12 hour intervals. +While this change allows for more flexibility in forecast preparation, it also creates two key problems +for forecasters. First, the duration of the PoP, SnowAmt, and QPF grids now varies considerably from +office to office, making the intersite coordination of these elements much more difficult. Second, the +NDFD Integrated Work Team has recommended that the graphics for these elements still need to be valid +for fixed durations (12 hours for the PoP graphics and 6 hours for the SnowAmt and QPF graphics). +

          +The Collaborate_PoP_SnowAmt_QPF procedure addresses both of these forecast issues by creating fixed 12-hour +PoP (PoP12hr), 6-hour SnowAmt (SnowAmt6hr), and 6-hour QPF (QPF6hr) grids based on the values contained in +the floating PoP, SnowAmt, and QPF grids. These new grids may then be used for the purposes of intersite +coordination as well as web graphic generation. +

          +In accordance with the NDFD, PoP12hr grids are created at 12-hour intervals through 7 days, QPF6hr grids +are created at 6-hour intervals through 72 hours, and the SnowAmt6hr grids are created at 6-hour intervals +through 36 hours. +

          +The procedure calls several Smart Tools which populate the PoP12hr, SnowAmt6hr, and QPF6hr grids with +data from the floating PoP, SnowAmt, and QPF grids. The getMaxGrid Smart Tool reads the floating PoP +grids and assigns the maximum PoP value for each 12-hr period to the PoP12hr grids. The getSumGrids Smart +Tool is used to sum the SnowAmt and QPF grids into the SnowAmt6hr and QPF6hr grids. Note that these two +Smart Tools are designed to be called from a procedure and will generate an error if run interactively from +the Edit Actions dialog. A third SmartTool, MakeTmpGrid, is a generic SmartTool for creating a temporary +grid from the active grid. This is used in this procedure to copy and fragment the QPF and SnowAmt grids. +The procedure deletes these temporary grids when they are no longer needed within the tool.
          +
          +
          +
          +How +the Procedure Works +
          +
          +All of the floating PoP, SnowAmt, and QPF +grids have been created before running the procedure/tools. The PoP12hr, SnowAmt6hr, and QPF6hr elements +exist in GFE.

          +After creating and saving the floating PoP, SnowAmt, and QPF grids, the forecaster need only run the +Collaborate_PoP_SnowAmt_QPF procedure once to generate the PoP12hr, SnowAmt6hr, and QPF6hr grids needed +for intersite coordination. +

          +When the forecaster runs the procedure, he/she is presented with a dialog box that allows a choice of +"All" or "Selected Time". If All is chosen, the procedure will generate the collaboration grids over +preset time ranges. These time ranges begin with the current time and extend out to 192 hours for the +PoP12hr grids, 60 hours for the SnowAmt6hr grids, and 96 hours for the QPF6hr grids. These ranges are +longer than the required minimum collaboration times to account for the different times during the day +when new grids may be added on to the end of the forecast database. If Selected Time is chosen, only +grids that intersect the active time selection in the grid manager will be used to compute PoP12hr, +SnowAmt6hr, and QPF6hr grids. Regardless of which option is selected, the procedure checks for the +existence of the source grids so errors will not be generated if grids are missing from the end of the +time range. Errors are generated if the floating grids are missing within a selected time range. +

          +Notable Methodology/Assumptions Used
          +When the Collaborate_PoP_SnowAmt_QPF procedure is run by the forecaster, the floating SnowAmt and QPF +grids are first copied to two temporary elements, tmpSnowAmt and tmpQPF. The tmpSnowAmt and tmpQPF grids +are then automatically fragmented before being used by the getSumGrids Smart Tool to create the SnowAmt6hr +and QPF6hr grids. The usage of the temporary elements in this process allows the original floating SnowAmt +and QPF grids to be preserved; the fragmenting ensures that no tmpSnowAmt grid overlaps multiple SnowAmt6hr +grids/no tmpQPF grid overlaps multiple QPF6hr grids prior to running the getSumGrids tool. This latter +condition is important because such overlapping grids would cause the tool to produce inaccurate SnowAmt6hr +and QPF6hr grids. Once the getSumGrids Smart Tool has executed and the SnowAmt6hr and QPF6hr grids have been +produced, the temporary elements are automatically deleted. +

          +To better illustrate the significance of fragmenting the tmpSnowAmt and tmpQPF grids, let=s consider a +simple example utilizing 3 forecast tmpSnowAmt grids. For the sake of simplicity, we will assume that the +default duration for the tmpSnowAmt grids is 3 hours, and that both the tmpSnowAmt and SnowAmt6hr grids are +based on Greenwich Mean Time (GMT). Note that the following also applies to tmpQPF even though it is not +discussed here. The forecast tmpSnowAmt grids are as follows:

          +Grid 1 - Valid 12-15 GMT, amount = 0" throughout
          +Grid 2 - Valid 15-21 GMT, amount = 4" throughout
          +Grid 3 - Valid 21-24 GMT, amount = 0" throughout
          +

          +If these grids are not fragmented before running the getSumGrids Smart Tool, the tool will see a +tmpSnowAmt grid with 4" accumulations that overlaps both the corresponding 12-18 GMT and 18- 24 GMT +SnowAmt6hr grids - and will therefore assign 4" accumulations to both SnowAmt6hr grids. This in turn +would imply an event total of 8" - not exactly what had been intended by the forecaster. +

          +On the other hand, fragmenting the tmpSnowAmt grids before running the getSumGrids Smart Tool results +in the following grids as input to the tool:

          +Grid 1 - Valid 12-15 GMT, amount = 0" throughout
          +Grid 2 - Valid 15-18 GMT, amount = 2" throughout
          +Grid 3 - Valid 18-21 GMT, amount = 2" throughout
          +Grid 4 - Valid 21-24 GMT, amount = 0" throughout


          +Note that the 4" tmpSnowAmt grid valid from 15-21 GMT has been split into two three-hour grids containing +values of 2" throughout. This is because GFE assumes a constant snowfall rate when fragmenting the grids. +Naturally, this isn't always a valid assumption, but its currently the only one available for the software +to work with. +

          +Executing the getSumGrids Smart Tool after fragmenting results in 2" accumulations in the corresponding +12-18 GMT and 18-24 GMT SnowAmt6hr grids, which would imply an event total of 4" - thereby matching the +original intent of the forecaster. +
          + + diff --git a/cave/com.raytheon.viz.gfe/help/ColorBarDialogs.html b/cave/com.raytheon.viz.gfe/help/ColorBarDialogs.html index f08d1ce508..348da2a791 100644 --- a/cave/com.raytheon.viz.gfe/help/ColorBarDialogs.html +++ b/cave/com.raytheon.viz.gfe/help/ColorBarDialogs.html @@ -29,34 +29,33 @@ are invoked via a MB3 pop-up menu from the Color Bar.

          Set Color Table Range Dialog

          The Set Color Table Range Dialog is accessed from the MB3 pop-up menu on -the color bar.  Selecting Select Range... displays a dialog that allows -you to set  the range of the current color table.  To set a new +the color bar. Selecting Select Range... displays a dialog that allows +you to set the range of the current color table. To set a new range, move one or both of the horizontal slider widgets to define your -new range and click OK.  The same set of colors will now be defined +new range and click OK. The same set of colors will now be defined over this new range, thus modifying the color table temporarily.

          Note that each weather element saves the state of the current color -table.  If you modify a color table, it will remain in that state -until explicitly changed or until the parm is unloaded from the GFE.  +table. If you modify a color table, it will remain in that state +until explicitly changed or until the parm is unloaded from the GFE. In the latter case, the default color table will be used the next time -that weather element is loaded.  Currently, you are not allowed to +that weather element is loaded. Currently, you are not allowed to preserve color table changes of this type. -

          -
            +

          +


          Color Table Brightness Dialog

          The Color Table Brightness Dialog is accessed from the MB3 pop-up menu -on the color bar, the "Change Color Table To..." entry on the Spatial +on the color bar, the "Change Color Table To..." entry on the Spatial Editor Legends, and the pop-up menu on the Pickup Value Dialog. -

          The color table brightness may be varied in 10% steps from 0 to 100%.  +

          The color table brightness may be varied in 10% steps from 0 to 100%. By default, the brightness is set to 100% upon selection of a new color table. -

          +



          -
           Back To Top
          - +
          Back To Top
          diff --git a/cave/com.raytheon.viz.gfe/help/ColorDialogs.html b/cave/com.raytheon.viz.gfe/help/ColorDialogs.html index 98c8628914..301ee4e6bb 100644 --- a/cave/com.raytheon.viz.gfe/help/ColorDialogs.html +++ b/cave/com.raytheon.viz.gfe/help/ColorDialogs.html @@ -21,11 +21,11 @@ for the GFE.

          Color Chooser Dialog


          -The Color Chooser Dialog is involked from the GFE when you depress -MB3 over  the  graphic contour label in the spatial editor. +The Color Chooser Dialog is invoked from the GFE when you depress +MB3 over the graphic contour label in the spatial editor. When -you MB3 graphic contour label,  select the following sequence from -the pop-up menus: 'Change Graphic Color to' -> 'Choose Color' .

          @@ -34,45 +34,45 @@ Chooser Dialog

          -

          +


          -The Color Chooser Dialog  can be used to change a  -single-colored +The Color Chooser Dialog can be used to change a single-colored graphical feature (i.e., a contour).

          -

          The Color Chooser Dialog consists of Hue, Saturation and Brightness -slider bars, a color wheel, a color swatch to indicate the old or -current -color, a color swatch to reflect the selected color , an "OK" button -and -a "Cancel" button.  The 'OLD' color swatch indicates the current -contour -color until the 'OK' or 'Cancel' button is selected. +

          The Color Chooser Dialog consists of Hue, Saturation and Value (same as Brightness) +entry fields, a color wheel, a color swatch to indicate the old or +current color (bottom left corner), a color swatch to reflect the selected color, an "OK" button +and a "Cancel" button. The old color swatch (left) indicates the current +contour color until the 'OK' or 'Cancel' button is selected.

          -

          If you MB1 over the color wheel to the desired color , the circle +

          If you MB1 over the color wheel to the desired color, the circle marker -is updated to the cursor location.  The selected color is echoed +is updated to the cursor location. The selected color is echoed in the 'NEW' color swatch and the Hue, Saturation and Brightness sliders move -to the appropriate values corresponding to your selected color.  -If -you want to change your graphical-feature, aka contour, to the new +to the appropriate values corresponding to your selected color.

          +

          For advanced users, in A2, +an option to select color values numerically is also available as entry fields to the right +of the Hue/Saturation/Value entry fields and Color Name entry field that accepts color +names in hex. Also new in A2, the user now has the option of +selecting the general color family from the Palette row of colors along the bottom of the +dialog display. Lastly, the pipette icon allows the user to set the color by sampling it from +anywhere on the screen.

          +

          If you want to change your graphical-feature, a.k.a. contour, to the new color, -select the 'OK' button.  Otherwise the 'Cancel' button dismisses +select the 'OK' button. Otherwise the 'Cancel' button dismisses the Color Chooser without change to your graphical contour.

          A new color can also be selected using the Hue, Saturation or -Brightness -sliders. +Value entry fields.

          The various components of the ColorChooser are shown in the following table:

          @@ -80,88 +80,121 @@ table: - - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - +
          Description
          Hue SliderUsing MB1 or MB2, the Hue slider can be moved from 0 to 359 -degrees.  -When the Hue slider is moved, the circle marker on the color wheel will -correspond to the Hue slider in the counter-clockwise -direction.   -Simultaneously, the new color will be indicated in the 'NEW' color + Hue Entry FieldUsing MB1 or MB2, the Hue up/down arrows can be moved from 0 to 360 +degrees. Alternately, the new value can be manually typed into the field followed by Return. +When the Hue value is modified, the circle marker on the color wheel will +correspond to the Hue value in. +Simultaneously, the new color will be indicated in the new color swatch.
          Saturation SliderUsing MB1 or MB2, the Saturation slider can be moved from 0 -to 100 -percent.  When the Saturation slider is moved, the circle marker -on -the color wheel will move along the radius indicating the appropriate -color -with 0 percent saturation representing white.  -Simultaneously,  -the new color will be indicated in the 'NEW' color swatch.Saturation Entry FieldUsing MB1 or MB2, the Saturation up/down arrows can be moved from 0 +to 100 percent. Alternately, the new value can be manually typed into the field followed +by Return. When the Saturation value is modified, the circle marker on +the color wheel will move along the radius indicating the appropriate color +with 0 percent saturation representing white. +Simultaneously, the new color will be indicated in the new color swatch.
          Brightness SliderUsing MB1 or MB2, the Brightness slider can be moved from 0 -to 100 -percent.  When the Brightness slider is moved, the color wheel and -the 'NEW" color swatch reflects the brightness selection with 0 percent -brightness representing black.  Please note that there may be a -short -delay in updating the color wheel.Value Entry FieldUsing MB1 or MB2, the Brightness up/down arrows can be moved from 0 +to 100 percent. Alternately, the new value can be manually typed into the field followed +by Return. When the Brightness value is modified, the color wheel and +the new color swatch reflects the brightness selection with 0 percent +brightness representing black. Please note that there may be a +short delay in updating the color wheel.
          RedRepresents numeric value for the amount of red within the color. + Can be either manually + typed in, or selected using MB1 or MB2 to move up/down arrows. The color wheel + and the new swatch will be modified simultaneously. Accepts values between 0 and + 255.
          GreenRepresents numeric value for the amount of green within the color. + Can be either manually + typed in, or selected using MB1 or MB2 to move up/down arrows. The color wheel + and the new swatch will be modified simultaneously. Accepts values between 0 and + 255.
          BlueRepresents numeric value for the amount of blue within the color. + Can be either manually + typed in, or selected using MB1 or MB2 to move up/down arrows. The color wheel + and the new swatch will be modified simultaneously. Accepts values between 0 and + 255.
          Color NameRepresents the hex value for the selected the color. + This field is typed in manually and must be a valid color value. + The color wheel + and the new swatch will be modified simultaneously.
          PaletteAllows the selection of the color family, i.e. shade. + MB1 on the selected swatch to select the shade. + The color wheel + and the new swatch will be modified simultaneously.
          Pipette IconAllows color sampling from the screen. + MB1 on the pipette icon, then anywhere on the screen to select the color. + The color wheel + and the new swatch will be modified simultaneously.
          ColorWheel Contains a small circle showing the current value specified by the -sliders.  The color wheel will dim and brighten as the Brightness +sliders. The color wheel will dim and brighten as the Brightness slider is changed.
          OLD SwatchThe previous color (currrent color when the dialog is first + The previous color (current color when the dialog is first presented) is shown.
          NEW SwatchNEW Swatch The new chosen color is shown.


          ColorTableEditorDialog

          -The ColorTableEditor Dialog is involked from the GFE when you MB3 over -the 'E' toolbar button, color bar spectrum or an image label. If you -MB3 -over the 'E' toolbar button, select the following sequence from the +The ColorTableEditor Dialog is invoked from the GFE when you MB3 over +the color bar spectrum. Select the following sequence from the pop-up -menus: 'PickUp Value...'->MB3 on the vertical spectrum-> 'Edit -Color Table...'.  -If you MB3 over the color bar spectrum or an image label, select the -following -sequence from the pop-up menus: 'Change Color Table to'->'Edit Color -Table'. -

          The ColorTableEditor is used for Scalar and Vector data types.  +menus: 'Change Color Table to'->'Edit Color +Table'. The dialog +can also be opened by clicking MB3 on the contour map of an element +and selecting Edit Colors... +

          The ColorTableEditor is used for Scalar and Vector data types. There is no editor currently available for the Weather data type; the Weather data type is configured through the gfe -configuration file weather color table definitions.  The +configuration file weather color table definitions. The ColorTableEditor for Discrete data types use the same data source as Scalar/Vector, but -its operations are different.  Generally it is a good idea to +its operations are different. Generally it is a good idea to separate out color tables for Scalar and Vector, from color tables for Discrete.

          Scalar/Vector Color Table Editing


          @@ -169,93 +202,82 @@ out color tables for Scalar and Vector, from color tables for Discrete. Dialog (Scalar/Vector)

          -

          +

          The Color Table Editor Dialog can be used to create a new color spectrum for a multi-colored graphical feature (i.e., an image).

          The Color Table Editor contains a Color -Chooser  -(without the color swatch area labeled 'OLD').  A color spectrum +Chooser +(without the old color swatch area). A color spectrum appears -in the middle section of the dialog.  The text label contains the -selected weather product name and units.  The left and right +in the middle section of the dialog. The left and right triangular pointers are labeled with minimum and maximum numerical values corresponding -to the weather product.  Entry labels are located on either side -of -the spectrum.  The current left and right pointer values are -echoed -in the entry fields.  The '>>' and '<<' buttons enable +to the weather product. The '>>' and '<<' buttons enable the user to move the pointers in an increment defined by the two entry -fields.  +fields. +The top row of the dialog allows the user to select RGB or HSB color model. The bottom half of the dialog contains several buttons that control the -operations performed on the spectrum:  'Fill', 'RGB Interpolate', -'HSB Interpolate', 'Fade ->', 'Dim ->', '<- Fade', '<-Dim', -'Undo', -'Revert', 'Apply', 'Save...', 'Delete...' and 'Dismiss' buttons. +operations performed on the spectrum: 'Interpolate', 'Undo', +'Revert', 'Save...', 'Delete...' and 'Office Save As' buttons. +The 'Fill' and 'Set' buttons appear to the right of the top and bottom +spectrum selection areas. Please note in AWIPS2 any changes are applied +automatically. The user has to exit and re-enter GFE should they accidentally +exit the color chooser without reverting.

          -

          After a color is selected using MB2 (i.e., MB2 somewhere within the -spectrum) or the  Color Chooser -,  -it is reflected  in the rectangular color swatch.  To modify -the spectrum with the selected color,  MB1 over either the left or -right pointer.  The triangular area will assume the color of the +

          After a color is selected using MB1 (i.e., MB1 somewhere within the +spectrum) or the Color Chooser, +it is reflected in the rectangular color swatch. To modify +the spectrum with the selected color, MB1 over either the left or +right pointer. The triangular area will assume the color of the color -swatch.  With the MB1, the left or right pointer can be moved to +swatch. With the MB1, the left or right pointer can be moved to the desired weather product value.

          Exercise 1 -

          1.  Make Temperature an image on the GFE.

          -

          2.  From the color bar, MB3->'Edit Color Table...'

          -

          3.  Select a color using the Color +

          1. Make Temperature an image on the GFE.

          +

          2. From the color bar, MB3->Change Color Table To...'->Edit Color Table...'

          +

          3. Select a color using the Color Chooser -portion of the Color Table Editor.

          -

          4.   MB1 over the left pointer and move the pointer to +portion of the Color Table Editor.

          +

          4. MB1 over the left pointer and move the pointer to 50 -degrees Fahrenheit.  The left triangular pointer will assume the +degrees Fahrenheit. The left triangular pointer will assume the color of the selected color and the color swatch will assume the new color.

          -

          5.  Type 40 in the left entry field and 'Enter'.  The -left -triangular pointer will move to the 40 degree F location of the -spectrum.

          -

          6.  MB1 over the right pointer and  move the pointer to +

          5. Slide the top arrow to 40 degree F location of the +spectrum.

          +

          6. MB1 over the right pointer and move the pointer to 50 -degrees Fahrenheit.  The right pointer will now assume the color +degrees Fahrenheit. The right pointer will now assume the color of the color swatch.

          -

          7.  Select the '>>' button.  The left and right +

          7. Select the '>' button. The left and right pointers will -advance 10 degrees F to the right.

          -

          8.  Select the '<<' button.  The right and left +advance 1 degree F to the right.

          +

          8. Select the '<' button. The right and left pointers -will decrease 10 degrees F to the left.

          -

          9.  Type 90 in the right entry field and 'Enter'.  The -right -triangular pointer will move to the 90 degree F location of the -spectrum.

          -

          10.  MB2 over the desired color on the spectrum.  The +will decrease 1 degree F to the left.

          +

          9. MB1 over the desired color on the spectrum. The color chosen will be reflected in the color swatch.

          -

          11.  MB1 on the right pointer.  The right pointer will +

          10. MB1 on the right pointer. The right pointer will now assume the color in the color swatch.

          -After completing  Exercise 1  you can modify +After completing Exercise 1, you can modify the selected portion of the spectrum (eq., area between 40 and 90 degrees Fahrenheit) -with the buttons located on the bottom half of the dialog: 'Fill', 'RGB -Interpolate', 'HSB Interpolate', 'Fade ->', 'Dim ->', '<- -Fade', '<-Dim', -'Undo', 'Revert', 'Apply', 'Save...', 'Delete...' or 'Dismiss'. +with the buttons located on the top half, bottom half, and right of the dialog: 'Fill', +'Set', 'Interpolate', +'Undo', 'Revert', 'Save...', 'Delete...' or 'Office Save As...'.

          The various controls are described in the following table:
          -  @@ -268,41 +290,37 @@ Fade', '<-Dim', spectrum. - + + + + + + - - - - - - - - + + + + - - + + - - + +color table in use is removed. 'Save' has an implicit +'Apply'. +You cannot save a Transient color table to EDEX. + + + + @@ -355,65 +369,56 @@ using the 'Delete' button.

          Exercise 2

          1.  Do Exercise 1.

          -

          2.  Select 'HSB Interpolate'.  The selected area of the +

          2.  Select the HSB color model, then click 'Interpolate'. The selected area of the spectrum -will be linearly interpolated along the HSB color scheme.

          -

          3.  Select 'RGB Interpolate'.  The selected area of the +will be linearly interpolated along the HSB color scheme.

          +

          3.  Select the RGB color model, then click 'Interpolate'. The selected area of the spectrum will be linearly interpolated along the RGB color scheme.

          -

          4.  Select 'Undo'.  The selected area of the spectrum +

          4.  Select 'Undo'. The selected area of the spectrum will -be restored to the HSB interpolation.

          -

          5.  Select 'Fill'.  The selected area of the spectrum +be restored to the pre-interpolation state.

          +

          5.  Select 'Fill'. The selected area of the spectrum will be filled with the color in the color swatch.

          -

          6.  Select 'Undo'.  The selected area of the spectrum +

          6.  Select 'Undo'. The selected area of the spectrum will -be restored to RGB interpolation.

          -

          7.  Select 'Fade ->'.  The selected area of the +be restored to previous spectrum.

          +

          7.  Select 'Set'. The selected area of the spectrum will -fade from the left pointer color to white (right pointer).

          -

          8.  Select 'Undo'.  The selected area of the spectrum +be set to the color you selected.

          +

          8.  Select 'Undo'. The selected area of the spectrum will -be restored to RGB interpolation.

          -

          9.  Select '<-Fade'.  The selected area of the -spectrum -will fade from the right pointer to white (left pointer).

          -

          10.  Repeat steps 6 - 9 for 'Dim ->' and '<- Dim' and -notice -the respective area dimming to black at both pointer locations.

          -

          11.  Select 'Revert'.  The original spectrum that you +be restored.

          +

          9.  Select 'Revert'. The original spectrum that you began with is restored.

          -

          12.  Select 'RGB Interpolate'.  The selected area of the +

          10.  Select the RGB color model and click 'Interpolate'. The selected area of the spectrum -will again be linearly interpolated along the RGB color scheme.

          -

          13.  Select 'Apply'.  The new spectrum will be applied -to -the graphic and the color bar will reflect the new spectrum.

          -

          14.  Select 'Save...'.    The 'Save Color +will again be linearly interpolated along the RGB color scheme.

          +

          12.  Select 'Save'. The new spectrum will be saved to the currently + loaded color map.

          +

          13.  Select 'Save As...'. The 'Save Color Table' dialog is brought up and you are prompted for a name (i.e., identifier) for the spectrum that you've just created.

          -

          15  Select 'OK'.  The new spectrum is now saved.

          -

          16.  Select 'Delete'.   The 'Delete Color Table' +

          14.  Select 'OK'. The new spectrum is now saved.

          +

          15.  Select 'Delete'. The 'Delete Color Table' dialog allows you to highlight the spectrum to be deleted or type in the -identifier. CAUTION:  +identifier. CAUTION: If you delete a spectrum that is being used by another user, their spectrum -will revert to the default spectrum.  Please consider carefully +will revert to the default spectrum. Please consider carefully before using the 'Delete' button..

          -

          17.  Select 'Dismiss'.  The 'Dismiss' button cancels the -Color -Table Editor dialog.

          +

          16.  Click the X mark in the top right corner. The dialog will + exit, however all changes are applied automatically.
          +
          +

          Discrete Color Table Editing


          @@ -422,49 +427,42 @@ Discrete Color Table Editing Dialog (Discrete)

          -

          DialogDiscreteColorTable

          The Discrete Color Table Editor Dialog can be used to create a new color spectrum for a multi-colored graphical feature (i.e., an image).

          The Discrete ColorTable Editor contains a Color -Chooser  (without the color swatch area labeled 'OLD').  -A color spectrum appears in the middle section of the dialog.  The -text label contains the selected weather product name and units.  -Many of the buttons on the Color Table Editor for Scalar/Vector are not -available on the Discrete Color Table Editor. The controls that are -available -include: 'Undo', 'Revert', 'Apply', 'Save...', 'Delete...' and -'Dismiss' -buttons. +Chooser (without the old color swatch area). +A color spectrum appears in the middle section of the dialog. The +text label contains the selected weather product name and units. +In AWIPS2 all of the buttons on the Color Table Editor for Scalar/Vector are +available on the Discrete Color Table Editor.

          -

          After a color is selected using MB2 click (i.e., MB2 somewhere +

          After a color is selected using MB1 click (i.e., MB1 somewhere within -the spectrum) or the  Color Chooser -,  -it is reflected  in the rectangular color swatch.  To modify -the spectrum with the selected color,  MB1 click over the desired +the spectrum) or the Color Chooser, +it is reflected in the rectangular color swatch. To modify +the spectrum with the selected color, MB1 click over the desired discrete key. When you move the mouse over a "block" in the spectrum, the value of that "block", i.e., the discrete key, will be -displayed. 
          +displayed.

          Note that Discrete color tables and Scalar color tables should not -be shared.  Discrete color tables that are saved to the ifpServer +be shared. Discrete color tables that are saved to EDEX contain exactly the same number of entries as the possible entries in -the defined Discrete key.  For example, the KeyTest element in the -picture above contains exactly 3 colors.  If you reuse that color +the defined Discrete key. For example, if a KeyTest element +contains exactly 3 colors and you reuse that color spectrum for a scalar/vector weather element, then there will only be three colors in that color table.

          If a discrete color table has been saved to disk, then the definition for the discrete weather element is expanded, then the new entries will be assigned to "black" -until the color table editor is used to define these colors.  The +until the color table editor is used to define these colors. The original colors for the original set of discrete keys will remain -assigned.
          -  +assigned.

          diff --git a/cave/com.raytheon.viz.gfe/help/ConfigureTextProducts.html b/cave/com.raytheon.viz.gfe/help/ConfigureTextProducts.html index 1d7253d783..7b61596b35 100644 --- a/cave/com.raytheon.viz.gfe/help/ConfigureTextProducts.html +++ b/cave/com.raytheon.viz.gfe/help/ConfigureTextProducts.html @@ -10,7 +10,7 @@

          configureTextProducts User's Guide

          -
          January 3, 2006
          +
          February 14, 2012

          Table of Contents

          @@ -26,9 +26,8 @@ configureTextProducts User's Guide Overview
          The configureTextProducts program is a utility that -is automatically run during the GFESuite installation and each time -the ifpServer is started. Normally it is not +is automatically run during installation and each time EDEX is started. +Normally it is not needed to be run manually. The program automatically configures the GFESuite set of formatters based on the afos2awips.txt PIL/WMOID table. There are @@ -40,29 +39,24 @@ The information output is sent to stdout and may be rerouted to a file if desired. The create and delete modes also modify files on disk.

          The configureTextProducts program can be used to specify an alternate -afos2awips.txt file rather than the official file.  This +afos2awips.txt file rather than the official file. This capability is normally only used for testing.

          Running the configureTextProducts Program

          -
          The running -of the configureTextProducts program has changed with IFPS17.6.
          This program is run from the GFESuite bin -directory and must be run as the user that installed the GFESuite. The -command line syntax is:
          +directory. The command line syntax is:

          -
          configureTextProducts -m MODE [-a -alterateA2AFile]
          +
          configureTextProducts -m MODE [--template=alterateA2AFile] +[--help] [--host]

          A sample command line is:

          configureTextProducts -m CREATE

          -
           
          RGB Interpolate and HSB Interpolate
          SetThe 'Set' button, will set the selected value of the +spectrum.
          Interpolate You can linearly interpolate the area selected between the pointers -with one of two linear interpolation methods:  Red-Green-Blue +with one of two linear interpolation methods: Red-Green-Blue interpolation (i.e., 'RGB Interpolation' button) or Hue-Saturation-Brightness interpolation (i.e., 'HSB Interpolation' button). -

          The 'HSB Interpolate' will 'linearly' interpolate along the +

          The HSB interpolation will 'linearly' interpolate along the shortest -angle of the colorwheel indicated by the colors of the pointers.  -The 'RGB Interpolate' will linearly interpolate along  the 0-255 +angle of the color wheel indicated by the colors of the pointers. +The RGB interpolation will linearly interpolate along the 0-255 color intensity scale of red, green and blue between the colors of the pointers.

          Fade-> and <-FadeThe 'Fade ->' button will linearly interpolate from the -left pointer -color to white.  The '<- Fade' button will linearly interpolate -from the right pointer button to white.
          Dim-> and <-DimThe 'Dim ->' button will linearly interpolate from the -left pointer -color to black.  The '<- Dim' button will linearly interpolate -from the right pointer button to black.
          Undo The 'Undo' button will restore the previous spectrum.
          RedoThe 'Redo' button will restore the previously undone spectrum.
          Revert The 'Revert' button will restore the original spectrum with @@ -310,43 +328,39 @@ which the Color Table Editor Dialog started.
          ApplyWhen you 'Apply' the spectrum to a weather element the first -time, -a temporary color table is created with the name of Transient X, where - X -is a number.  This temporary color table will exist for the -lifetime -of the GFE.  You can edit the same color table later if you -wish.  -When you'Apply' the spectrum to the weather element during subsequent -sessions, -the same Transient color table is used.Save'Save' saves the changes to the currently loaded color table.
          Save...'Save' brings up a dialog from which the user may enter a + Save As...'Save As' brings up a dialog from which the user may enter a name of a -color table.  The color table is stored under this name and the +color table. The color table is stored under this name and the Transient -color table in use is removed.  'Save' has an implicit -'Apply'.  -You cannot save a Transient color table to the ifpServer.
          Office Save As...'Office Save As' brings up a dialog from which the user may enter a +name of a +color table specifically for the office currently loaded.
          Delete... You can 'Delete' an existing color table and it doesn't need to be -the one that is displayed.  A dialog will be displayed showing a +the one that is displayed. A dialog will be displayed showing a list -of names.  Highlight or type in an identifier and enter -'Okay'.  +of names. Highlight or type in an identifier and enter +'Okay'. You can delete Transient color tables that exist in you GFE and other color -tables that are stored on the server.  CAUTION:  +tables that are stored on the server. CAUTION:  If you delete a spectrum that is being used by another user, their spectrum -will revert to the default spectrum.  Please consider carefully +will revert to the default spectrum. Please consider carefully before using the 'Delete' button.
          @@ -79,7 +73,7 @@ information in the afos2awips.txt table. +irrelevant products. @@ -88,11 +82,11 @@ configured site. - -
          Deletes the formatter templates based on pil/wmoid information in the afos2awips.txt table. This is normally used when changing site identifiers (for purposes of service backup) to clean out -irrelavant products.
          configureTextProducts -m INFO
          configureTextProducts -m ALLINFODisplays the PIL?WMOID table for each GFE product for ALL + Displays the PIL/WMOID table for each GFE product for ALL known sites.
          configureTextProducts -m mode -a + configureTextProducts -m mode --template a2aFile
          Performs the "mode" indicated, @@ -102,1085 +96,6 @@ and uses the alternate afos2awips.txt file identified as "a2aFile".

          -

          -

          -  -

          Example Output

          -
          The following shows some example output and how -it -is interpreted. The output is actually written into the log file -directory -and that portion of the log entries have been removed. -  -

          -

          CREATE and DELETE modes

          -

          configureTextProducts CREATE -
          -

          -

          22:54:43.706 -configureTextProducts.py 1356 EVENT:  Configuring Text Products -Begin........
          -22:54:43.707 configureTextProducts.py 1385 PROBLEM:  -WARNING...Unable to open  /awips/fxa/data/afos2awips.txt ... -trying backup
          -22:54:43.708 configureTextProducts.py 1381 VERBOSE:  Using... -/home/mark/HEAD/GFESuite/release/data/textInstall/afos2awips.txt
          -22:54:43.711 configureTextProducts.py 1273 EVENT:    .. -Deleting Existing Baseline Templates Begin........
          -22:54:43.714 configureTextProducts.py 1295 VERBOSE:  Template= -FWFTable.py
          -22:54:43.715 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg.py
          -22:54:43.715 configureTextProducts.py 1295 VERBOSE:  Template= -FWS_Site_MultiPil_Baseline.py
          -22:54:43.723 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_TOE_MultiPil_Local.py
          -22:54:43.729 configureTextProducts.py 1295 VERBOSE:  Template= -RFD_Local.py
          -22:54:43.730 configureTextProducts.py 1295 VERBOSE:  Template= -MVF.py
          -22:54:43.730 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_WSW_MultiPil_Local.py
          -22:54:43.736 configureTextProducts.py 1295 VERBOSE:  Template= -FWF.py
          -22:54:43.737 configureTextProducts.py 1295 VERBOSE:  Template= -NSH.py
          -22:54:43.737 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_AVA_MultiPil_Local.py
          -22:54:43.744 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_RHW_MultiPil_Local.py
          -22:54:43.750 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_FFA_MultiPil.py
          -22:54:43.756 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_NPW_MultiPil.py
          -22:54:43.762 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_CAE_MultiPil_Local.py
          -22:54:43.770 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_EQW_MultiPil_Local.py
          -22:54:43.776 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_RFW_MultiPil_Local.py
          -22:54:43.782 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_EQR_MultiPil_Local.py
          -22:54:43.789 configureTextProducts.py 1295 VERBOSE:  Template= -ESF_Local.py
          -22:54:43.789 configureTextProducts.py 1295 VERBOSE:  Template= -SFT.py
          -22:54:43.790 configureTextProducts.py 1295 VERBOSE:  Template= -NOW_Local.py
          -22:54:43.790 configureTextProducts.py 1295 VERBOSE:  Template= -AFD.py
          -22:54:43.791 configureTextProducts.py 1295 VERBOSE:  Template= -Product_Site_MultiPil_Baseline.py
          -22:54:44.117 configureTextProducts.py 1295 VERBOSE:  Template= -GLF.py
          -22:54:44.117 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_WCN_MultiPil.py
          -22:54:44.122 configureTextProducts.py 1295 VERBOSE:  Template= -Product_Site_MultiPil.py
          -22:54:44.381 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_CFW_MultiPil.py
          -22:54:44.386 configureTextProducts.py 1295 VERBOSE:  Template= -GenericHazards.py
          -22:54:44.387 configureTextProducts.py 1295 VERBOSE:  Template= -Product_Site_MultiPil_Region.py
          -22:54:44.618 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_CEM_MultiPil_Local.py
          -22:54:44.624 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_NPW_MultiPil_Local.py
          -22:54:44.630 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_ADR_MultiPil_Local.py
          -22:54:44.637 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_MWS_MultiPil.py
          -22:54:44.642 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_RFW_MultiPil.py
          -22:54:44.647 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_AVW_MultiPil_Local.py
          -22:54:44.654 configureTextProducts.py 1295 VERBOSE:  Template= -FWS_Site_MultiPil.py
          -22:54:44.656 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_VOW_MultiPil_Local.py
          -22:54:44.662 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_MWS_MultiPil_Local.py
          -22:54:44.668 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_HLS_MultiPil.py
          -22:54:44.674 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_HLS_MultiPil_Local.py
          -22:54:44.680 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_NUW_MultiPil_Local.py
          -22:54:44.686 configureTextProducts.py 1295 VERBOSE:  Template= -PFM.py
          -22:54:44.687 configureTextProducts.py 1295 VERBOSE:  Template= -GenericReport.py
          -22:54:44.687 configureTextProducts.py 1295 VERBOSE:  Template= -CWF_Pacific.py
          -22:54:44.688 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_LEW_MultiPil_Local.py
          -22:54:44.694 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_WSW_MultiPil.py
          -22:54:44.699 configureTextProducts.py 1295 VERBOSE:  Template= -CCF.py
          -22:54:44.700 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_FRW_MultiPil_Local.py
          -22:54:44.706 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_FFA_MultiPil_Local.py
          -22:54:44.713 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_SPW_MultiPil_Local.py
          -22:54:44.719 configureTextProducts.py 1295 VERBOSE:  Template= -OFF.py
          -22:54:44.720 configureTextProducts.py 1295 VERBOSE:  Template= -SAF_Site_MultiPil.py
          -22:54:44.721 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_HWO_MultiPil.py
          -22:54:44.726 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_CDW_MultiPil_Local.py
          -22:54:44.733 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_WCN_MultiPil_Local.py
          -22:54:44.739 configureTextProducts.py 1295 VERBOSE:  Template= -FWS_Site_MultiPil_Region.py
          -22:54:44.740 configureTextProducts.py 1295 VERBOSE:  Template= -SPS_MultiPil_Local.py
          -22:54:44.745 configureTextProducts.py 1295 VERBOSE:  Template= -SAF_Site_MultiPil_Region.py
          -22:54:44.746 configureTextProducts.py 1295 VERBOSE:  Template= -CWF.py
          -22:54:44.746 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_EVI_MultiPil_Local.py
          -22:54:44.753 configureTextProducts.py 1295 VERBOSE:  Template= -AreaFcst.py
          -22:54:44.753 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_CFW_MultiPil_Local.py
          -22:54:44.760 configureTextProducts.py 1295 VERBOSE:  Template= -FWM.py
          -22:54:44.761 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_HMW_MultiPil_Local.py
          -22:54:44.767 configureTextProducts.py 1295 VERBOSE:  Template= -CivilEmerg_LAE_MultiPil_Local.py
          -22:54:44.774 configureTextProducts.py 1295 VERBOSE:  Template= -PNS_Local.py
          -22:54:44.774 configureTextProducts.py 1295 VERBOSE:  Template= -SAF_Site_MultiPil_Baseline.py
          -22:54:44.775 configureTextProducts.py 1295 VERBOSE:  Template= -Hazard_HWO_MultiPil_Local.py
          -22:54:44.783 configureTextProducts.py 1295 VERBOSE:  Template= -CCF_Site_MultiPil_Definition.py
          -22:54:44.791 configureTextProducts.py 1295 VERBOSE:  Template= -FWFTable_Site_MultiPil_Definition.py
          -22:54:44.801 configureTextProducts.py 1295 VERBOSE:  Template= -MVF_Site_MultiPil_Definition.py
          -22:54:44.809 configureTextProducts.py 1295 VERBOSE:  Template= -CWF_Site_MultiPil_Definition.py
          -22:54:44.818 configureTextProducts.py 1295 VERBOSE:  Template= -PFM_Site_MultiPil_Definition.py
          -22:54:44.826 configureTextProducts.py 1295 VERBOSE:  Template= -FIPS_EA_Site_MultiPil_Definition.py
          -22:54:44.836 configureTextProducts.py 1295 VERBOSE:  Template= -Product_Site_Overrides.py
          -22:54:44.927 configureTextProducts.py 1295 VERBOSE:  Template= -FWM_Site_MultiPil_Definition.py
          -22:54:44.935 configureTextProducts.py 1295 VERBOSE:  Template= -FWS_Site_MultiPil_Definition.py
          -22:54:44.943 configureTextProducts.py 1295 VERBOSE:  Template= -MarineZones_EA_Site_MultiPil_Definition.py
          -22:54:44.954 configureTextProducts.py 1295 VERBOSE:  Template= -SFT_Site_MultiPil_Definition.py
          -22:54:44.963 configureTextProducts.py 1295 VERBOSE:  Template= -NSH_Site_MultiPil_Definition.py
          -22:54:44.972 configureTextProducts.py 1295 VERBOSE:  Template= -FireWxZones_EA_Site_MultiPil_Definition.py
          -22:54:44.982 configureTextProducts.py 1295 VERBOSE:  Template= -FWF_Site_MultiPil_Definition.py
          -22:54:44.991 configureTextProducts.py 1295 VERBOSE:  Template= -PublicMarine_EA_Site_MultiPil_Definition.py
          -22:54:45.002 configureTextProducts.py 1295 VERBOSE:  Template= -AFD_Site_MultiPil_Definition.py
          -22:54:45.010 configureTextProducts.py 1295 VERBOSE:  Template= -OFF_Site_MultiPil_Definition.py
          -22:54:45.018 configureTextProducts.py 1295 VERBOSE:  Template= -PublicZones_EA_Site_MultiPil_Definition.py
          -22:54:45.029 configureTextProducts.py 1295 VERBOSE:  Template= -Product_Region_Overrides.py
          -22:54:45.119 configureTextProducts.py 1295 VERBOSE:  Template= -AFM_Site_MultiPil_Definition.py
          -22:54:45.127 configureTextProducts.py 1295 VERBOSE:  Template= -GLF_Site_MultiPil_Definition.py
          -22:54:45.136 configureTextProducts.py 1295 VERBOSE:  Template= -SAF_Site_MultiPil_Definition.py
          -22:54:45.144 configureTextProducts.py 1295 VERBOSE:  Template= -ZFP_Site_MultiPil_Definition.py
          -22:54:45.153 configureTextProducts.py 1295 VERBOSE:  Template= -CWF_Pacific_Site_MultiPil_Definition.py
          -22:54:45.163 configureTextProducts.py 1339 EVENT:    .. -Deleting Existing Baseline Templates Finished........
          -22:54:45.267 configureTextProducts.py 1208 VERBOSE:  PIL List: -(product) (pil, wmoid, site)
          -22:54:45.267 configureTextProducts.py 1210 VERBOSE:  ADR -[('SLCADRSLC', 'WOUS45', 'KSLC')]
          -22:54:45.267 configureTextProducts.py 1210 VERBOSE:  AFD -[('SLCAFDSLC', 'FXUS65', 'KSLC')]
          -22:54:45.268 configureTextProducts.py 1210 VERBOSE:  AFM -[('SLCAFMSLC', 'FOUS55', 'KSLC')]
          -22:54:45.268 configureTextProducts.py 1210 VERBOSE:  AVA -[('SLCAVASLC', 'WOUS45', 'KSLC')]
          -22:54:45.268 configureTextProducts.py 1210 VERBOSE:  AVW -[('SLCAVWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.269 configureTextProducts.py 1210 VERBOSE:  CAE -[('SLCCAESLC', 'WOUS45', 'KSLC')]
          -22:54:45.269 configureTextProducts.py 1210 VERBOSE:  CCF -[('SLCCCFSLC', 'FPUS45', 'KSLC')]
          -22:54:45.269 configureTextProducts.py 1210 VERBOSE:  CDW -[('SLCCDWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.270 configureTextProducts.py 1210 VERBOSE:  CEM -[('SLCCEMSLC', 'WOUS45', 'KSLC')]
          -22:54:45.270 configureTextProducts.py 1210 VERBOSE:  CFW []
          -22:54:45.270 configureTextProducts.py 1210 VERBOSE:  CWF []
          -22:54:45.271 configureTextProducts.py 1210 VERBOSE:  EQR -[('SLCEQRSLC', 'SEUS65', 'KSLC')]
          -22:54:45.271 configureTextProducts.py 1210 VERBOSE:  EQW -[('SLCEQWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.271 configureTextProducts.py 1210 VERBOSE:  ESF -[('SLCESFSLC', 'FGUS75', 'KSLC')]
          -22:54:45.272 configureTextProducts.py 1210 VERBOSE:  EVI -[('SLCEVISLC', 'WOUS45', 'KSLC')]
          -22:54:45.272 configureTextProducts.py 1210 VERBOSE:  FFA -[('SLCFFASLC', 'WGUS65', 'KSLC')]
          -22:54:45.272 configureTextProducts.py 1210 VERBOSE:  FRW -[('SLCFRWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.273 configureTextProducts.py 1210 VERBOSE:  FWF -[('SLCFWFSLC', 'FNUS55', 'KSLC')]
          -22:54:45.273 configureTextProducts.py 1210 VERBOSE:  FWM -[('SLCFWMSLC', 'FNUS85', 'KSLC')]
          -22:54:45.273 configureTextProducts.py 1210 VERBOSE:  FWS -[('SLCFWSSLC', 'FNUS75', 'KSLC')]
          -22:54:45.274 configureTextProducts.py 1210 VERBOSE:  GLF []
          -22:54:45.274 configureTextProducts.py 1210 VERBOSE:  HLS []
          -22:54:45.274 configureTextProducts.py 1210 VERBOSE:  HMW -[('SLCHMWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.275 configureTextProducts.py 1210 VERBOSE:  HWO -[('SLCHWOSLC', 'FLUS45', 'KSLC')]
          -22:54:45.275 configureTextProducts.py 1210 VERBOSE:  LAE -[('SLCLAESLC', 'WOUS45', 'KSLC')]
          -22:54:45.275 configureTextProducts.py 1210 VERBOSE:  LEW -[('SLCLEWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.276 configureTextProducts.py 1210 VERBOSE:  MVF []
          -22:54:45.276 configureTextProducts.py 1210 VERBOSE:  MWS []
          -22:54:45.276 configureTextProducts.py 1210 VERBOSE:  NOW -[('SLCNOWSLC', 'FPUS75', 'KSLC')]
          -22:54:45.277 configureTextProducts.py 1210 VERBOSE:  NPW -[('SLCNPWSLC', 'WWUS75', 'KSLC')]
          -22:54:45.277 configureTextProducts.py 1210 VERBOSE:  NSH []
          -22:54:45.277 configureTextProducts.py 1210 VERBOSE:  NUW -[('SLCNUWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.278 configureTextProducts.py 1210 VERBOSE:  OFF []
          -22:54:45.278 configureTextProducts.py 1210 VERBOSE:  PFM -[('SLCPFMSLC', 'FOUS55', 'KSLC')]
          -22:54:45.278 configureTextProducts.py 1210 VERBOSE:  PNS -[('SLCPNSSLC', 'NOUS45', 'KSLC')]
          -22:54:45.279 configureTextProducts.py 1210 VERBOSE:  RFD -[('SLCRFDSLC', 'FNUS65', 'KSLC')]
          -22:54:45.279 configureTextProducts.py 1210 VERBOSE:  RFW -[('SLCRFWSLC', 'WWUS85', 'KSLC')]
          -22:54:45.279 configureTextProducts.py 1210 VERBOSE:  RHW -[('SLCRHWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.280 configureTextProducts.py 1210 VERBOSE:  SAF []
          -22:54:45.280 configureTextProducts.py 1210 VERBOSE:  SFT -[('SLCSFTSLC', 'FPUS65', 'KSLC'), ('SLCSFTUT', 'FPUS65', 'KSLC')]
          -22:54:45.280 configureTextProducts.py 1210 VERBOSE:  SPS -[('SLCSPSSLC', 'WWUS85', 'KSLC')]
          -22:54:45.281 configureTextProducts.py 1210 VERBOSE:  SPW -[('SLCSPWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.281 configureTextProducts.py 1210 VERBOSE:  TOE -[('SLCTOESLC', 'WOUS45', 'KSLC')]
          -22:54:45.281 configureTextProducts.py 1210 VERBOSE:  VOW -[('SLCVOWSLC', 'WOUS45', 'KSLC')]
          -22:54:45.282 configureTextProducts.py 1210 VERBOSE:  WCN -[('SLCWCNSLC', 'WWUS65', 'KSLC')]
          -22:54:45.282 configureTextProducts.py 1210 VERBOSE:  WSW -[('SLCWSWSLC', 'WWUS45', 'KSLC')]
          -22:54:45.282 configureTextProducts.py 1210 VERBOSE:  ZFP -[('SLCZFPSLC', 'FPUS55', 'KSLC')]
          -22:54:45.283 configureTextProducts.py 960 EVENT:  Processing -Formatter Templates.......
          -22:54:45.284 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.284 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/FWFTable.py
          -22:54:45.284 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  FWFTable
          -22:54:45.285 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.285 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['FWF']
          -22:54:45.286 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.286 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  FWF
          -22:54:45.286 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['FWF']
          -22:54:45.287 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCFWFSLC', 'textdbPil': 'SLCFWFSLC', 'pil': -'FWFSLC', 'wmoID': 'FNUS55'}]
          -22:54:45.297 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/FWFTable.TextProduct
          -22:54:45.299 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.299 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/CivilEmerg.py
          -22:54:45.299 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  CivilEmerg
          -22:54:45.300 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.300 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['NONE']
          -22:54:45.300 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.301 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  NONE
          -22:54:45.301 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['NONE']
          -22:54:45.302 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'kssscccnnn', 'textdbPil': 'cccnnnxxx', 'pil': -'nnnxxx', 'wmoID': 'wmoidd'}]
          -22:54:45.303 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CivilEmerg.TextProduct
          -22:54:45.304 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.304 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/FWS_Site_MultiPil_Baseline.py
          -22:54:45.305 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  FWS_Site_MultiPil_Baseline
          -22:54:45.305 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.305 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['FWS']
          -22:54:45.306 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.306 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  FWS
          -22:54:45.306 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['FWS']
          -22:54:45.307 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCFWSSLC', 'textdbPil': 'SLCFWSSLC', 'pil': -'FWSSLC', 'wmoID': 'FNUS75'}]
          -22:54:45.308 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/FWS_FPSLC_FPBaseline.TextProduct
          -22:54:45.309 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.309 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/CivilEmerg_TOE_MultiPil_Local.py
          -22:54:45.310 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  CivilEmerg_TOE_MultiPil_Local
          -22:54:45.310 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.310 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['TOE']
          -22:54:45.311 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.311 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  TOE
          -22:54:45.311 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['TOE']
          -22:54:45.312 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCTOESLC', 'textdbPil': 'SLCTOESLC', 'pil': -'TOESLC', 'wmoID': 'WOUS45'}]
          -22:54:45.313 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CivilEmerg_FPTOE_FPLocal.TextProduct
          -22:54:45.314 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.314 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/RFD_Local.py
          -22:54:45.314 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  RFD_Local
          -22:54:45.315 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.315 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['RFD']
          -22:54:45.315 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.316 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  RFD
          -22:54:45.316 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['RFD']
          -22:54:45.316 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCRFDSLC', 'textdbPil': 'SLCRFDSLC', 'pil': -'RFDSLC', 'wmoID': 'FNUS65'}]
          -22:54:45.318 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/RFD_FPLocal.TextProduct
          -22:54:45.319 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.319 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/MVF.py
          -22:54:45.319 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  MVF
          -22:54:45.320 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.320 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['MVF']
          -22:54:45.320 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.321 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  MVF
          -22:54:45.321 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['MVF']
          -22:54:45.321 configureTextProducts.py 1019 -VERBOSE:       PILS:  []
          -22:54:45.322 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.322 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/Hazard_WSW_MultiPil_Local.py
          -22:54:45.323 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  Hazard_WSW_MultiPil_Local
          -22:54:45.323 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.323 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['WSW']
          -22:54:45.324 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.324 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  WSW
          -22:54:45.325 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['WSW']
          -22:54:45.325 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCWSWSLC', 'textdbPil': 'SLCWSWSLC', 'pil': -'WSWSLC', 'wmoID': 'WWUS45'}]
          -22:54:45.326 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/Hazard_FPWSW_FPLocal.TextProduct
          -22:54:45.327 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.327 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/FWF.py
          -22:54:45.327 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  FWF
          -22:54:45.328 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.328 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['FWF']
          -22:54:45.328 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.329 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  FWF
          -22:54:45.329 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['FWF']
          -22:54:45.329 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCFWFSLC', 'textdbPil': 'SLCFWFSLC', 'pil': -'FWFSLC', 'wmoID': 'FNUS55'}]
          -22:54:45.336 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/FWF.TextProduct
          -22:54:45.337 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.338 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/NSH.py
          -22:54:45.338 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  NSH
          -22:54:45.338 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.339 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['NSH']
          -22:54:45.339 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.339 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  NSH
          -22:54:45.340 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['NSH']
          -22:54:45.340 configureTextProducts.py 1019 -VERBOSE:       PILS:  []
          -22:54:45.341 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.341 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/CivilEmerg_AVA_MultiPil_Local.py
          -22:54:45.341 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  CivilEmerg_AVA_MultiPil_Local
          -22:54:45.342 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.342 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['AVA']
          -22:54:45.343 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.343 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  AVA
          -22:54:45.343 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['AVA']
          -22:54:45.344 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCAVASLC', 'textdbPil': 'SLCAVASLC', 'pil': -'AVASLC', 'wmoID': 'WOUS45'}]
          -22:54:45.345 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CivilEmerg_FPAVA_FPLocal.TextProduct
          -22:54:45.345 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.346 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/CivilEmerg_RHW_MultiPil_Local.py
          -22:54:45.346 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  CivilEmerg_RHW_MultiPil_Local
          -22:54:45.346 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.347 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['RHW']
          -22:54:45.347 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.348 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  RHW
          -22:54:45.348 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['RHW']
          -22:54:45.348 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCRHWSLC', 'textdbPil': 'SLCRHWSLC', 'pil': -'RHWSLC', 'wmoID': 'WOUS45'}]
          -22:54:45.349 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CivilEmerg_FPRHW_FPLocal.TextProduct
          -22:54:45.350 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.350 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/Hazard_FFA_MultiPil.py
          -22:54:45.351 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  Hazard_FFA_MultiPil
          -22:54:45.351 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.352 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['FFA']
          -22:54:45.352 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.352 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  FFA
          -22:54:45.353 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['FFA']
          -22:54:45.353 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCFFASLC', 'textdbPil': 'SLCFFASLC', 'pil': -'FFASLC', 'wmoID': 'WGUS65'}]
          -22:54:45.357 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/Hazard_FPFFA.TextProduct
          -22:54:45.358 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.359 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/Hazard_NPW_MultiPil.py
          -22:54:45.359 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  Hazard_NPW_MultiPil
          -22:54:45.359 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.360 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['NPW']
          -22:54:45.360 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.361 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  NPW
          -22:54:45.361 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['NPW']
          -22:54:45.361 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCNPWSLC', 'textdbPil': 'SLCNPWSLC', 'pil': -'NPWSLC', 'wmoID': 'WWUS75'}]
          -22:54:45.363 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/Hazard_FPNPW.TextProduct
          -22:54:45.364 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.364 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/CivilEmerg_CAE_MultiPil_Local.py
          -22:54:45.365 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  CivilEmerg_CAE_MultiPil_Local
          -22:54:45.365 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.365 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['CAE']
          -22:54:45.366 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.366 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  CAE
          -22:54:45.366 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['CAE']
          -22:54:45.367 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCCAESLC', 'textdbPil': 'SLCCAESLC', 'pil': -'CAESLC', 'wmoID': 'WOUS45'}]
          -22:54:45.368 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CivilEmerg_FPCAE_FPLocal.TextProduct
          -22:54:45.369 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.369 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/CivilEmerg_EQW_MultiPil_Local.py
          -22:54:45.369 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  CivilEmerg_EQW_MultiPil_Local
          -22:54:45.370 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py 22:54:45.370 configureTextProducts.py 999 -VERBOSE:  PRODUCTS:  ['EQW']
          -22:54:45.370 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.371 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  EQW
          -22:54:45.371 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['EQW']
          -22:54:45.372 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCEQWSLC', 'textdbPil': 'SLCEQWSLC', 'pil': -'EQWSLC', 'wmoID': 'WOUS45'}]
          -22:54:45.372 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CivilEmerg_FPEQW_FPLocal.TextProduct
          -22:54:45.373 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.374 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/Hazard_RFW_MultiPil_Local.py
          -22:54:45.374 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  Hazard_RFW_MultiPil_Local
          -22:54:45.374 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py 22:54:45.375 configureTextProducts.py 999 -VERBOSE:  PRODUCTS:  ['RFW']
          -22:54:45.375 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.375 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  RFW
          -22:54:45.376 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['RFW']
          -22:54:45.376 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCRFWSLC', 'textdbPil': 'SLCRFWSLC', 'pil': -'RFWSLC', 'wmoID': 'WWUS85'}]
          -22:54:45.377 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/Hazard_FPRFW_FPLocal.TextProduct
          -22:54:45.378 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.378 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/CivilEmerg_EQR_MultiPil_Local.py
          -22:54:45.379 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  CivilEmerg_EQR_MultiPil_Local
          -22:54:45.379 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py 22:54:45.379 configureTextProducts.py 999 -VERBOSE:  PRODUCTS:  ['EQR']
          -22:54:45.380 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.380 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  EQR
          -22:54:45.381 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['EQR']
          -22:54:45.381 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCEQRSLC', 'textdbPil': 'SLCEQRSLC', 'pil': -'EQRSLC', 'wmoID': 'SEUS65'}]
          -22:54:45.383 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CivilEmerg_FPEQR_FPLocal.TextProduct
          -22:54:45.384 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.384 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/ESF_Local.py
          -22:54:45.384 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  ESF_Local
          -22:54:45.385 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py 22:54:45.385 configureTextProducts.py 999 -VERBOSE:  PRODUCTS:  ['ESF']
          -22:54:45.386 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.386 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  ESF
          -22:54:45.386 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['ESF']
          -22:54:45.387 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCESFSLC', 'textdbPil': 'SLCESFSLC', 'pil': -'ESFSLC', 'wmoID': 'FGUS75'}]
          -22:54:45.388 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/ESF_FPLocal.TextProduct
          -22:54:45.389 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.389 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/SFT.py
          -22:54:45.390 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  SFT
          -22:54:45.390 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py 22:54:45.390 configureTextProducts.py 999 -VERBOSE:  PRODUCTS:  ['SFT']
          -22:54:45.391 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.391 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  SFT
          -22:54:45.391 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['SFT']
          -22:54:45.392 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCSFTSLC', 'textdbPil': 'SLCSFTSLC', 'pil': -'SFTSLC', 'wmoID': 'FPUS65'}, {'awipsWANPil': 'KSLCSFTUT', 'textdbPil': -'SLCSFTUT', 'pil': 'SFTUT', 'wmoID': 'FPUS65'}]
          -22:54:45.395 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/SFT.TextProduct
          -22:54:45.401 configureTextProducts.py 989 VERBOSE:  Last message -repeated 1 times.
          -22:54:45.401 configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.401 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/NOW_Local.py
          -22:54:45.401 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  NOW_Local
          -22:54:45.402 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.402 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['NOW']
          -22:54:45.403 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.403 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  NOW
          -22:54:45.403 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['NOW']
          -22:54:45.404 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCNOWSLC', 'textdbPil': 'SLCNOWSLC', 'pil': -'NOWSLC', 'wmoID': 'FPUS75'}]
          -22:54:45.405 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/NOW_FPLocal.TextProduct
          -22:54:45.406 configureTextProducts.py 989 VERBOSE:  -================================================================ -22:54:45.406 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/AFD.py
          -22:54:45.406 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  AFD
          -22:54:45.407 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.407 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['AFD']
          -22:54:45.407 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.408 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  AFD
          -22:54:45.408 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['AFD']
          -22:54:45.408 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCAFDSLC', 'textdbPil': 'SLCAFDSLC', 'pil': -'AFDSLC', 'wmoID': 'FXUS65'}]
          -22:54:45.415 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/AFD.TextProduct
          -22:54:45.416 configureTextProducts.py 989 VERBOSE:  -================================================================ -22:54:45.416 configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextProduct_BASE/Product_Site_MultiPil_Baseline.py
          -22:54:45.417 configureTextProducts.py 992 VERBOSE:  -regularNameBase:  Product_Site_MultiPil_Baseline
          -22:54:45.417 configureTextProducts.py 993 VERBOSE:  -RegNameExt:  .py
          -22:54:45.417 configureTextProducts.py 999 VERBOSE:  -PRODUCTS:  ['AFM', 'ZFP', 'CCF', 'CWF', 'CWF_Pacific', 'FWF', -'FWFTable', 'FWM', 'GLF', 'MVF', 'NSH', 'PFM', 'SFT', 'OFF', 'AFD']
          -22:54:45.418 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.418 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  AFM
          -22:54:45.418 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['AFM']
          -22:54:45.419 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCAFMSLC', 'textdbPil': 'SLCAFMSLC', 'pil': -'AFMSLC', 'wmoID': 'FOUS55'}]
          -22:54:45.420 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/AFM_FPSLC_FPBaseline.TextProduct
          -22:54:45.421 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.421 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  ZFP
          -22:54:45.421 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['ZFP']
          -22:54:45.422 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCZFPSLC', 'textdbPil': 'SLCZFPSLC', 'pil': -'ZFPSLC', 'wmoID': 'FPUS55'}]
          -22:54:45.423 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/ZFP_FPSLC_FPBaseline.TextProduct
          -22:54:45.423 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.424 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  CCF
          -22:54:45.424 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['CCF'] -
          -22:54:45.424 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCCCFSLC', 'textdbPil': 'SLCCCFSLC', 'pil': -'CCFSLC', 'wmoID': 'FPUS45'}]
          -22:54:45.426 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/CCF_FPSLC_FPBaseline.TextProduct
          -22:54:45.426 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.427 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  CWF
          -22:54:45.427 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['CWF']
          -22:54:45.427 configureTextProducts.py 1019 -VERBOSE:       PILS:  []
          -22:54:45.428 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.428 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  CWF_Pacific
          -22:54:45.428 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['CWF']
          -22:54:45.429 configureTextProducts.py 1019 -VERBOSE:       PILS:  [] -22:54:45.429 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.429 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  FWF
          -22:54:45.430 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['FWF']
          -22:54:45.430 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCFWFSLC', 'textdbPil': 'SLCFWFSLC', 'pil': -'FWFSLC', 'wmoID': 'FNUS55'}]
          -22:54:45.431 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/FWF_FPSLC_FPBaseline.TextProduct
          -22:54:45.432 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.432 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  FWFTable
          -22:54:45.433 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['FWF']
          -22:54:45.433 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCFWFSLC', 'textdbPil': 'SLCFWFSLC', 'pil': -'FWFSLC', 'wmoID': 'FNUS55'}]
          -22:54:45.434 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/FWFTable_FPSLC_FPBaseline.TextProduct
          -22:54:45.435 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.435 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  FWM
          -22:54:45.436 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['FWM']
          -22:54:45.436 configureTextProducts.py 1019 -VERBOSE:       PILS:  -[{'awipsWANPil': 'KSLCFWMSLC', 'textdbPil': 'SLCFWMSLC', 'pil': -'FWMSLC', 'wmoID': 'FNUS85'}]
          -22:54:45.437 configureTextProducts.py 1040 -VERBOSE:         ---> -data/databases/BASE/TEXT/TextProduct/FWM_FPSLC_FPBaseline.TextProduct
          -22:54:45.438 configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.438 configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  GLF
          -22:54:45.438 configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['GLF']
          -22:54:45.439 configureTextProducts.py 1019 -VERBOSE:       PILS:  []
          -

          -

          <some text -skipped>
          -

          -

          22:54:45.439 -configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.439 -configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  MVF
          -22:54:45.440 -configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['MVF']
          -22:54:45.440 -configureTextProducts.py 1019 -VERBOSE:       PILS:  []
          -22:54:45.441 -configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.441 -configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  NSH
          -22:54:45.441 -configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['NSH']
          -22:54:45.442 -configureTextProducts.py 1019 -VERBOSE:       PILS:  []
          -22:54:45.442 -configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.442 -configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  PFM
          -22:54:45.443 -configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['PFM']
          -22:54:45.936 -configureTextProducts.py 989 VERBOSE:  -================================================================
          -22:54:45.937 -configureTextProducts.py 991 VERBOSE:  file:  -data/textInstall/TextUtility_BASE/CWF_Pacific_Site_MultiPil_Definition.py
          -22:54:45.937 -configureTextProducts.py 992 VERBOSE:  regularNameBase:  -CWF_Pacific_Site_MultiPil_Definition
          -22:54:45.937 -configureTextProducts.py 993 VERBOSE:  RegNameExt:  .py
          -22:54:45.938 -configureTextProducts.py 999 VERBOSE:  PRODUCTS:  ['CWF']
          -22:54:45.938 -configureTextProducts.py 1002 -VERBOSE:       --------------
          -22:54:45.938 -configureTextProducts.py 1003 -VERBOSE:       PRODUCT:  CWF
          -22:54:45.939 -configureTextProducts.py 1007 -VERBOSE:       PRODUCT PIL:  ['CWF']
          -22:54:45.939 -configureTextProducts.py 1019 -VERBOSE:       PILS:  []
          -22:54:45.939 -configureTextProducts.py 1421 EVENT:  Configuration of Text -Products Finish

          -

          -

          -

          INFO and ALLINFO modes

          -Notice some of the entries are blank, because SLC does not issue those -products.
          -

          configureTextProducts INFO -

          -

          configureTextProducts ALLINFO
          -

          -

          LOG-STATUS: Log file opened on host bart at Fri Jul  8 -22:53:23 2005
          -22:53:23.804 configureTextProducts.py 1360 EVENT:  PIL Information -for  SLC  Begin......
          -22:53:23.805 configureTextProducts.py 1385 PROBLEM:  -WARNING...Unable to open  /awips/fxa/data/afos2awips.txt ... -trying backup
          -22:53:23.806 configureTextProducts.py 1381 VERBOSE:  Using... -/home/mark/HEAD/GFESuite/release/data/textInstall/afos2awips.txt
          -22:53:23.913 configureTextProducts.py 1208 VERBOSE:  PIL List: -(product) (pil, wmoid, site)
          -22:53:23.914 configureTextProducts.py 1210 VERBOSE:  ADR -[('SLCADRSLC', 'WOUS45', 'KSLC')]
          -22:53:23.914 configureTextProducts.py 1210 VERBOSE:  AFD -[('SLCAFDSLC', 'FXUS65', 'KSLC')]
          -22:53:23.914 configureTextProducts.py 1210 VERBOSE:  AFM -[('SLCAFMSLC', 'FOUS55', 'KSLC')]
          -22:53:23.915 configureTextProducts.py 1210 VERBOSE:  AVA -[('SLCAVASLC', 'WOUS45', 'KSLC')]
          -22:53:23.915 configureTextProducts.py 1210 VERBOSE:  AVW -[('SLCAVWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.915 configureTextProducts.py 1210 VERBOSE:  CAE -[('SLCCAESLC', 'WOUS45', 'KSLC')]
          -22:53:23.916 configureTextProducts.py 1210 VERBOSE:  CCF -[('SLCCCFSLC', 'FPUS45', 'KSLC')]
          -22:53:23.916 configureTextProducts.py 1210 VERBOSE:  CDW -[('SLCCDWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.916 configureTextProducts.py 1210 VERBOSE:  CEM -[('SLCCEMSLC', 'WOUS45', 'KSLC')]
          -22:53:23.917 configureTextProducts.py 1210 VERBOSE:  CFW []
          -22:53:23.917 configureTextProducts.py 1210 VERBOSE:  CWF []
          -22:53:23.917 configureTextProducts.py 1210 VERBOSE:  EQR -[('SLCEQRSLC', 'SEUS65', 'KSLC')]
          -22:53:23.917 configureTextProducts.py 1210 VERBOSE:  EQW -[('SLCEQWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.918 configureTextProducts.py 1210 VERBOSE:  ESF -[('SLCESFSLC', 'FGUS75', 'KSLC')]
          -22:53:23.918 configureTextProducts.py 1210 VERBOSE:  EVI -[('SLCEVISLC', 'WOUS45', 'KSLC')]
          -22:53:23.918 configureTextProducts.py 1210 VERBOSE:  FFA -[('SLCFFASLC', 'WGUS65', 'KSLC')]
          -22:53:23.919 configureTextProducts.py 1210 VERBOSE:  FRW -[('SLCFRWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.919 configureTextProducts.py 1210 VERBOSE:  FWF -[('SLCFWFSLC', 'FNUS55', 'KSLC')]
          -22:53:23.919 configureTextProducts.py 1210 VERBOSE:  FWM -[('SLCFWMSLC', 'FNUS85', 'KSLC')]
          -22:53:23.920 configureTextProducts.py 1210 VERBOSE:  FWS -[('SLCFWSSLC', 'FNUS75', 'KSLC')]
          -22:53:23.920 configureTextProducts.py 1210 VERBOSE:  GLF []
          -22:53:23.920 configureTextProducts.py 1210 VERBOSE:  HLS []
          -22:53:23.921 configureTextProducts.py 1210 VERBOSE:  HMW -[('SLCHMWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.921 configureTextProducts.py 1210 VERBOSE:  HWO -[('SLCHWOSLC', 'FLUS45', 'KSLC')]
          -22:53:23.921 configureTextProducts.py 1210 VERBOSE:  LAE -[('SLCLAESLC', 'WOUS45', 'KSLC')]
          -22:53:23.922 configureTextProducts.py 1210 VERBOSE:  LEW -[('SLCLEWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.922 configureTextProducts.py 1210 VERBOSE:  MVF []
          -22:53:23.922 configureTextProducts.py 1210 VERBOSE:  MWS []
          -22:53:23.923 configureTextProducts.py 1210 VERBOSE:  NOW -[('SLCNOWSLC', 'FPUS75', 'KSLC')]
          -22:53:23.923 configureTextProducts.py 1210 VERBOSE:  NPW -[('SLCNPWSLC', 'WWUS75', 'KSLC')]
          -22:53:23.923 configureTextProducts.py 1210 VERBOSE:  NSH []
          -22:53:23.924 configureTextProducts.py 1210 VERBOSE:  NUW -[('SLCNUWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.924 configureTextProducts.py 1210 VERBOSE:  OFF []
          -22:53:23.924 configureTextProducts.py 1210 VERBOSE:  PFM -[('SLCPFMSLC', 'FOUS55', 'KSLC')]
          -22:53:23.925 configureTextProducts.py 1210 VERBOSE:  PNS -[('SLCPNSSLC', 'NOUS45', 'KSLC')]
          -22:53:23.925 configureTextProducts.py 1210 VERBOSE:  RFD -[('SLCRFDSLC', 'FNUS65', 'KSLC')]
          -22:53:23.925 configureTextProducts.py 1210 VERBOSE:  RFW -[('SLCRFWSLC', 'WWUS85', 'KSLC')]
          -22:53:23.926 configureTextProducts.py 1210 VERBOSE:  RHW -[('SLCRHWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.926 configureTextProducts.py 1210 VERBOSE:  SAF []
          -22:53:23.926 configureTextProducts.py 1210 VERBOSE:  SFT -[('SLCSFTSLC', 'FPUS65', 'KSLC'), ('SLCSFTUT', 'FPUS65', 'KSLC')]
          -22:53:23.927 configureTextProducts.py 1210 VERBOSE:  SPS -[('SLCSPSSLC', 'WWUS85', 'KSLC')]
          -22:53:23.927 configureTextProducts.py 1210 VERBOSE:  SPW -[('SLCSPWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.927 configureTextProducts.py 1210 VERBOSE:  TOE -[('SLCTOESLC', 'WOUS45', 'KSLC')]
          -22:53:23.928 configureTextProducts.py 1210 VERBOSE:  VOW -[('SLCVOWSLC', 'WOUS45', 'KSLC')]
          -22:53:23.928 configureTextProducts.py 1210 VERBOSE:  WCN -[('SLCWCNSLC', 'WWUS65', 'KSLC')]
          -22:53:23.928 configureTextProducts.py 1210 VERBOSE:  WSW -[('SLCWSWSLC', 'WWUS45', 'KSLC')]
          -22:53:23.929 configureTextProducts.py 1210 VERBOSE:  ZFP -[('SLCZFPSLC', 'FPUS55', 'KSLC')]
          -22:53:23.929 configureTextProducts.py 1421 EVENT:  Configuration -of Text Products Finish
          -
          -

          -

          -
          diff --git a/cave/com.raytheon.viz.gfe/help/CopyFromModel.html b/cave/com.raytheon.viz.gfe/help/CopyFromModel.html new file mode 100644 index 0000000000..01d0c6bda4 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/CopyFromModel.html @@ -0,0 +1,71 @@ + + + + + CopyFromModel + + + + + + +CopyFromModel +
          +
          +Overview +
          +
          +CopyFromModel is a simple +tool to allow you to copy model data into a particular edit area, possibly while +time-shifting the model data. +

          +If you use the "Populate" method to fill in a Fcst grid, the ENTIRE model grid is +copied into your Fcst grid. Likewise, if you use the grid manager, button-3 menu +items of "copy" and "paste", the ENTIRE model grid is copied into your Fcst grid. +With this tool, if an edit area is active - it will only copy the model grid into +the specified edit area - NOT the entire grid. If no edit area is active - it +copies the entire grid. You can specify that a "taper grid" be used to smooth-in +your changes over a 5-gridbox band if you desire - so that there are not abrupt +gradient problems near the edge of your edit area. In addition, you can specify +a model "hour offset" so that you can copy the data from other model hours into +the hours of your Fcst grid. +

          +If the timerange of the grid you are editing contains more than one model grid, +the model grids are averaged (in a time-weighted sense) before they are copied +into your Fcst grid. However, for QPF and SnowAmt, the model values are +accumulated - so that your Fcst grid will contain the total accumulation of +the model grids during the time period of your Fcst grid. For PoP grids, the +maximum model value is copied into your Fcst grid - so that it remains consistent +with the "floating PoP" concept. For Wx grids, it seems to read the "last" model +Wx grid and copies that into your Fcst grid - but I think you are crazy if you +use this tool for Wx grids. +

          +If you use the "hour offset" feature, a negative offset means to read model data +from "earlier". For example, if you have a Fcst grid with a timerange of 12-15Z, +and you say to copy from the GFS Model with an offset of -6, it will read the GFS +model grids from 6-9Z and copy them into your Fcst grid (and, again, only in the active +edit area, if you have one defined). A positive offset means to read model data from +"later". For example, and offset of 6, with a Fcst grid timerange of 12-15Z, will +copy model data from 18-21Z. +

          +This is a SmartTool - and, thus, it only operates on existing Fcst grids - so in +that sense it differs from the "Populate" or "Copy/Paste" methods which can +"create" grids for you. You must create a grid (possibly "from scratch") before +you can run this tool. +

          +If you run the tool on multiple grids (i.e., with a selected time range), the +"hour offset" is applied separately to each grid. For example, with a -3 +"hour offset", a Fcst grid from 12-15Z will read model data from 9-12Z, while a +Fcst grid from 15-18Z will read model data from 12-15Z.
          + + diff --git a/cave/com.raytheon.viz.gfe/help/EGTEditAreaActions.html b/cave/com.raytheon.viz.gfe/help/EGTEditAreaActions.html index b670594ea9..377b561d5e 100644 --- a/cave/com.raytheon.viz.gfe/help/EGTEditAreaActions.html +++ b/cave/com.raytheon.viz.gfe/help/EGTEditAreaActions.html @@ -3,6 +3,7 @@ + Edit Area Actions Edit Area Actions @@ -98,6 +99,6 @@ Now zoom back ou by again holding the SHIFT key and clicking MB1.

          For more information on zooming the Spatial Editor display see the section, Zooming (enlarging) the Spatial Display in the GFE Training Guide. -
            +
          diff --git a/cave/com.raytheon.viz.gfe/help/EGTEditingActions.html b/cave/com.raytheon.viz.gfe/help/EGTEditingActions.html index 70a1d3f49c..1ef4119246 100644 --- a/cave/com.raytheon.viz.gfe/help/EGTEditingActions.html +++ b/cave/com.raytheon.viz.gfe/help/EGTEditingActions.html @@ -5,19 +5,19 @@ content="text/html; charset=iso-8859-1"> + Editing Actions Editing actions

          Perform an interpolation based on "Gaps".

          To interpolate based on "Gaps", first you must -select the time range over which you wish to interpolate.  Move +select the time range over which you wish to interpolate. Move the cursor into the Grid Manager over the weather element you wish to -interpolate.  +interpolate. Move the cursor to the start time of the time range you wish to interpolate and press MB1 and drag to define the selected time range. See the @@ -26,11 +26,11 @@ section, Weather Element and TimeRange for more information. Once this time range is defined, select Grids->Interpolate..., -from the GFE's Main Menu.  The Interpolate -Dialog pops up.  Choose "By Gaps". You should see new grids +Dialog pops up. Choose "By Gaps". You should see new grids appear -within the time range that you selected earlier.  See the section, +within the time range that you selected earlier. See the section, Interpolate Grids for more information.

          @@ -44,18 +44,18 @@ this action? data, you must first edit some of the grids or else no interpolation will be performed. To accomplish this, edit at least two grids in the -GFE.  +GFE. Select these grid with the steps described in the section Select -Weather Element and TimeRange.  Then from the Main Menu select +Weather Element and TimeRange. Then from the Main Menu select Grids->Interpolate....  The Interpolate Dialog -pops up.  Choose "Based on Edited Data". You should see grid +pops up. Choose "Based on Edited Data". You should see grid appear -only in the time period between the grids that you edited.  Try +only in the time period between the grids that you edited. Try this -operation on a set of grids that have not been edited.  Note that +operation on a set of grids that have not been edited. Note that no new grids appear and an error message appears at the bottom of the GFE.

          @@ -64,23 +64,23 @@ the values for an entire grid by a specified amount.

          To adjust a the value in a grid, select that grid -in the Grid Manager.  That will make the grid "editable".  +in the Grid Manager. That will make the grid "editable". Next open the Edit Actions -Dialog by clicking with MB1 on the icon labelled with the large "E" -located in the Button Bar.  From this dialog set the Delta Value +Dialog by clicking with MB1 on the icon labeled with the large "E" +located in the Button Bar. From this dialog set the Delta Value by selecting "Delta Value..." and entering any value you choose.  Close the Delta -Value Dialog.  Now from the Edit Actions Dialog select . Now from the Edit Actions Dialog select Adjust Value Up or Adjust -Value Down.  You may see a message +Value Down. You may see a message dialog -warning you that you are about to edit the entire grid.  If so, +warning you that you are about to edit the entire grid. If so, select "Yes" and note @@ -93,10 +93,10 @@ the wind speeds for an entire grid by a specified amount.

          Adjusting the wind speed values for a grid works -just like any other grid.  Select the grid you wish to edit in the -Grid Manager with a MB1 click.  Next open the Edit -Actions Dialog, if it is not open already.  From this dialog +Actions Dialog, if it is not open already. From this dialog set the delta value by clicking on the button labelled "Delta @@ -107,7 +107,7 @@ Dialog and select Adjust Value Up or Adjust Value Down -from the Edit Actions Dialog.  You should see that all of the wind +from the Edit Actions Dialog. You should see that all of the wind speeds were changed by the amount you specified.

          the values for just a portion of a grid by a specified amount.

          To adjust a portion of a grid, you must first -select an Edit Area in the Spatial Editor.  To do this select the -button on the Button Bar that looks like this.   +select an Edit Area in the Spatial Editor. To do this select the +button on the Button Bar that looks like this. + Next move your cursor into the Spatial Editor and draw the area over which -you want to edit by pressing MB1 and dragging.  See the section Define -an Edit Area by Hand for more information.  Next select for more information. Next select Adjust Value Up or Adjust Value Down from the

          Adjusting the wind direction is a slight change from adjusting the wind -speed, described above.  Select a wind grid to edit from the Grid -Manager.  Next, select a portion of the grid as you did in the +speed, described above. Select a wind grid to edit from the Grid +Manager. Next, select a portion of the grid as you did in the last -exercise.  See the section See the section Define an Edit Area by Hand for more information. Now from the Main Menu of the GFE select, GFE->Editing Preferences->Vector -Edit Mode->Direction Only.  This +Edit Mode->Direction Only. This will restrict all edit operations to wind direction without affecting the wind -speed.  Now open the Edit Actions Dialog and select Adjust Value Up or Adjust -Value Down.  Note that with each tool +Value Down. Note that with each tool execution the wind direction changes by 10 degrees up or down.

          Smooth @@ -169,7 +168,7 @@ Actions Dialog.  To Smooth a grid, select a scalar or vector to edit and from the Edit Actions Dialog select "Smooth".  + color="#330000">". You should see that the gradients in the grid are less harsh than they were before the smooth operation.

          @@ -179,16 +178,15 @@ a value from the spatial editor's color bar and assign it to a selected Edit Area.

          To pickup a value to assign, simply click or drag MB1 or MB2 in the -color bar located at the top of the Spatial Editor.  Note that as +color bar located at the top of the Spatial Editor. Note that as you click or drag the value that you specified is indicated by the shadowed -number displayed on the color bar.  Now that you have specified a +number displayed on the color bar. Now that you have specified a pickup value, you can select an area as described in the section Define -an Edit Area by Hand.   Finally, from the Edit + color="#330000">Define +an Edit Area by Hand. Finally, from the Edit Action -menu select Assign Value.  You should see the value of the area +menu select Assign Value. You should see the value of the area that you selected change to the current pickup value.

          @@ -199,21 +197,21 @@ selected Edit Area.

          To create a new weather value, you first need -to select a Wx grid from Grid Manager.  Select an area in the +to select a Wx grid from Grid Manager. Select an area in the Spatial editor to be changed. Next, from the color bar located at the top of the -Spatial Editor, MB3 press and hold to display the pop-up menu.  +Spatial Editor, MB3 press and hold to display the pop-up menu. From the pop-up menu select Set Pickup Value....  + color="#330000">. Now you should see the Set -Weather Dialog appear.  Use this dialog to define a new +Weather Dialog appear. Use this dialog to define a new weather -type, coverage/probability, and intensity.  See the section Set -Weather Dialog  for more information.  When you have +Weather Dialog for more information. When you have successfully defined your new weather value, click on Assign Value. You should see tool assign your @@ -222,13 +220,12 @@ value to the selected area.

          You can also use a quicker way to set the weather, -if the weather you are setting is fairly common.  Instead of -chosing +if the weather you are setting is fairly common. Instead of choosing Set Pickup Value... from the popup menu, you can choose a value under Set To Common -Values...  +Values... The values appearing in this menu are site-configurable.
          @@ -240,23 +237,21 @@ a new discrete value of your choice and use it to assign discrete data to a selected Edit Area.

          To create a new discrete value, you first need -to select a discrete grid from Grid Manager.  The  -"Headlines" grid +to select a discrete grid from Grid Manager. The +"Headlines" grid is an example of a discrete grid. Select an area in the Spatial editor to be changed. Next, from the color bar located at the top of the Spatial -Editor, MB3 press and hold to display the pop-up menu.  From the +Editor, MB3 press and hold to display the pop-up menu. From the pop-up menu select Set Pickup Value....  -Now you should see the Set -Discrete Value Dialog appear.  Use this dialog to define a new -value.  See the section Set -Discrete Value Dialog  for more information.  When you + color="#330000">. +Now you should see the Set +Discrete Value Dialog appear. Use this dialog to define a new +value. See the section Set +Discrete Value Dialog for more information.  When you have -successfully defined your new  value, click on Assign Value. You should see tool assign your discrete @@ -264,20 +259,16 @@ value to the selected area.

          You can also use a quicker way to set the discrete -value, if the discrete value you are setting is fairly common.  -Instead -of chosing +value, if the discrete value you are setting is fairly common. +Instead of choosing Set Pickup Value... from the popup menu, you can choose a value under Set -To Common Values...  The values -appearing -in this menu are site-configurable. +To Common Values... The values +appearing in this menu are site-configurable.

          diff --git a/cave/com.raytheon.viz.gfe/help/EGTGridManager.html b/cave/com.raytheon.viz.gfe/help/EGTGridManager.html index f35a6c617d..efe32d3de9 100644 --- a/cave/com.raytheon.viz.gfe/help/EGTGridManager.html +++ b/cave/com.raytheon.viz.gfe/help/EGTGridManager.html @@ -3,98 +3,99 @@ + Grid Manager Actions Grid Manager actions -
            +

          Stretch the valid time of any grid block.

          The Grid Manager has a built-in tool for stretching -the time over which a grid is valid.  Move the cursor to the grid -block that you want to stretch.  Press and hold MB2 while moving the -cursor to the left or right.  Stretching the grid block to the left +the time over which a grid is valid. Move the cursor to the grid +block that you want to stretch. Press and hold MB2 while moving the +cursor to the left or right. Stretching the grid block to the left changes the grid's start time while stretching the grid block to the right -changes that grid's end time.  Note that you can only stretch the -start time or the end time per operation.  To stretch both times, +changes that grid's end time. Note that you can only stretch the +start time or the end time per operation. To stretch both times, you must perform this operation twice. See the section Stretch a grid's valid time period in GFE Training Guide for more information.

          Copy the contents of one grid block into another grid block.

          This task is accomplished using the MB3 pop-up -menu from inside the Grid Manager.  Move the cursor over the grid -block that you wish to copy from.  Press and hold MB3 and select "Copy -Grid" from the pop-up menu.  Next, move -your cursor to the time at which you want to paste this grid.  Press +menu from inside the Grid Manager. Move the cursor over the grid +block that you wish to copy from. Press and hold MB3 and select "Copy +Grid" from the pop-up menu. Next, move +your cursor to the time at which you want to paste this grid. Press and hold MB3 again, but this time select "Paste -Grid".  Note that you can paste the grid -into a gap or onto an existing grid.  Just the grid data values are -changed when pasting a grid.  The valid time is not affected.  +Grid". Note that you can paste the grid +into a gap or onto an existing grid. Just the grid data values are +changed when pasting a grid. The valid time is not affected. See the section in the GFE Training Guide, Copy Grid for more information.

          Select a time range and list of parameters, then copy data from a selected model into the FCST database. -

          This is a two-part task.  First you must -select the time range, then copy grids from a model.  To select the -time range,  move the cursor to the start time of the selection and -over the first weather element you want to select.  Press and hold -MB1 and drag diagonally.  Motion in the horizontal direction selects -the time range.  Motion in the vertical direction selects weather -element.  When you have selected the time range and the set of weather -elements you want, release MB1.  For more information on selecting +

          This is a two-part task. First you must +select the time range, then copy grids from a model. To select the +time range, move the cursor to the start time of the selection and +over the first weather element you want to select. Press and hold +MB1 and drag diagonally. Motion in the horizontal direction selects +the time range. Motion in the vertical direction selects weather +element. When you have selected the time range and the set of weather +elements you want, release MB1. For more information on selecting weather elements and time ranges in this way, see the GFE Training Guide section Select Weather Element and TimeRange.

          Next, you need to identify the model source to -copy in to your selected Weather Element/TimeRange.  Go to the main +copy in to your selected Weather Element/TimeRange. Go to the main menu and select Populate->Copy Selected Grids -From...  A dialog that contains all model -versions that are curently available will appear.  Select the model -of your choice and select OK.  -Grids generated from that model will be copied into your forecast.  +From... A dialog that contains all model +versions that are curently available will appear. Select the model +of your choice and select OK. +Grids generated from that model will be copied into your forecast. For more information on this operation, see the GFE Training Guide, section Copy from Derived Model Grids.

          Create a grid from Scratch. Stretch the valid time of that grid and split it into more than one grid. -

          This is a three-part task.  To create a grid +

          This is a three-part task. To create a grid from scratch, move your cursor over the weather element/timerange you wish, press and hold MB3 to display the pop-up menu, and select "Create -From Scratch".  You will see a new grid -block appear in the Grid Manager.  See the section,  Create +From Scratch". You will see a new grid +block appear in the Grid Manager. See the section, Create Grid from Scratch in the GFE Training Guide for more information.

          To stretch the valid time of the newly created grid, see the instructions above, Stretch the valid time of any grid block.

          Finally, to split the grid block, select a portion -of it using the instructions Select a time range...  Then MB3 press -to display the pop up menu and select "Spilt Grid".  You will end +of it using the instructions Select a time range... Then MB3 press +to display the pop up menu and select "Spilt Grid". You will end up with two grids whose time boundaries are defined by whatever time range you selected.

          Assign a "null" value to an entire grid.

          To assign a "null" value (usually the lowest allowable -value)  just move your cursor over your grid of choice and MB3 press -to display the pop-up menu.  Select "Assign +value) just move your cursor over your grid of choice and MB3 press +to display the pop-up menu. Select "Assign [value]" where [value] is the null value defined -for that weather element.  You will see that the null value was assigned +for that weather element. You will see that the null value was assigned to every grid point in the grid. See the section Assign Default Value in the GFE Training Guide.

          Select -several grids and use Time Shift to move the  grids to another time +several grids and use Time Shift to move the grids to another time period. -

          To TimeShift grids, you first need to select them.  -See the section in the Grid Manager Training  Select -Weather Element and TimeRange  for more information on selecting +

          To TimeShift grids, you first need to select them. +See the section in the Grid Manager Training Select +Weather Element and TimeRange for more information on selecting grids.

          Next, from the Main Menu select Grids->Time Shift... to display the Time -Shift Dialog.  Use the radio buttons to indicate whether to copy -or move and the  slider to indicate how many hours to time shift.  -Then select OK.  +Shift Dialog. Use the radio buttons to indicate whether to copy +or move and the  slider to indicate how many hours to time shift. +Then select OK. Watch what happens to the grid that you selected. -
            -
            +
          +
          diff --git a/cave/com.raytheon.viz.gfe/help/EGTLoadWEs.html b/cave/com.raytheon.viz.gfe/help/EGTLoadWEs.html index 5732fd4b4f..af76ab2622 100644 --- a/cave/com.raytheon.viz.gfe/help/EGTLoadWEs.html +++ b/cave/com.raytheon.viz.gfe/help/EGTLoadWEs.html @@ -3,10 +3,11 @@ + Loading Weather Elements Training</titile> </head> <body> <font color="#3333FF"><font size=+2>Loading Weather Elements</font></font> -<br><font color="#3333FF"><font size=+2></font></font>  +<br><font color="#3333FF"><font size=+2></font></font> <p><a NAME="LoadTemps"></a><font color="#3333FF"><font size=+2>Load the temperatures, dew points and winds from each of the short and medium range models into the Grid Manager.</font></font> @@ -53,7 +54,7 @@ Sky, and SnowAmt</font>, and from Planes select <font color="#FF0000">SFC</font> Now still in the Weather Element Browser select <font color="#FF0000">File->Save Weather Element Group</font>.  Enter a name and select <font color="#FF0000">Save</font>.  Now you can close the Weather Element Dialog.  From the GFE Main Menu, -select <font color="#FF0000">Weather Element->Weather Element Groups</font>.  +select <font color="#FF0000">Weather Element->Weather Element Groups</font>. You should see your newly created Weather Element Group in that list. </body> </html> diff --git a/cave/com.raytheon.viz.gfe/help/EGTMain.html b/cave/com.raytheon.viz.gfe/help/EGTMain.html index f72755a13b..d0b2e8c2a6 100644 --- a/cave/com.raytheon.viz.gfe/help/EGTMain.html +++ b/cave/com.raytheon.viz.gfe/help/EGTMain.html @@ -3,6 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.79 [en] (X11; U; Linux 2.4.9-34smp i686) [Netscape]"> + <title>GFE Techniques and Skills @@ -17,67 +18,67 @@ like calling up a satellite picture on D2D. on the operational use of the GFE; it it not for the novice.  Each forecaster should be able to demonstrate a mastery of each of these skills before attempting to use the GFE for complete operational forecasts. -
            +

          Edit Area actions -
            +

          1. Draw a freehand Edit Area. Solution
          2. -
              +
          3. Select an Edit Area that includes four different forecast  zones of your choice.  Solution
          4. -
              +
          5. Select an Edit Area based on a given elevation.    Solution
          6. -
              +
          7. Select an Edit Area that includes locations where the dew point is above a value that you specifiy.    Solution
          8. -
              +
          9. Select an Edit Area that covers locations with a certain type of weather. Solution
          10. -
              +
          11. Save an Edit Area in a Quick Set button, clear the Edit Area and restore it with the same Quick Set button.    Solution
          12. -
              +
          13. Zoom the Spatial Editor so that only a portion of your CWA is displayed. Hint: there are two ways to do this.    Solution
          Grid Manager actions -
            +
          1. Stretch the valid time of any grid block.    Solution
          2. -
              +
          3. Copy the contents of one grid block into another grid block.  Solution
          4. -
              +
          5. Select a time range and list of parameters, then copy data from a selected model into the FCST database.    Solution
          6. -
              +
          7. Create a grid from Scratch. Stretch the valid time of that grid and split it into more than one grid.    Solution
          8. -
              +
          9. Assign a "null" value to an entire grid.    Solution
          10. -
              +
          11. Select several grids and use Time Shift to move the  grids to another time period.    Solution
          12. @@ -89,62 +90,62 @@ time period.    Solution -
              +
          13. Load all of the Fire Weather parameters into the Grid Manager.  Solution
          14. -
              +
          15. Load all of the Public weather parameters into the Grid Manager. Solution
          16. -
              +
          17. Create a new Weather Element Group that contains QPF, Wx, Sky, and SnowAmt Solution


          Editing actions -
            +

          1. Perform an interpolation based on "Gaps".    Solution
          2. -
              +
          3. Perform an interpolation based on "Edited Data". What needs to be done before executing this action?    Solution
          4. -
              +
          5. Adjust the values for an entire grid by a specified amount.  Solution
          6. -
              +
          7. Adjust the wind speeds for an entire grid by a specified amount. Solution
          8. -
              +
          9. Adjust the values for just a portion of a grid by a specified amount. Solution
          10. -
              +
          11. Adjust the wind directions for a selected portion of a grid by a specified amount.    Solution
          12. -
              +
          13. Smooth the data contained in a grid.    Solution
          14. -
              +
          15. Pickup a value from the spatial editor's color bar and assign it to a selected Edit Area.    Solution
          16. -
              +
          17. Create a new weather value of your choice and use it to assign weather to a selected Edit Area.    Solution
            -
          18. +
          19. Create a new discrete value of your choice and use it to assign discrete @@ -156,21 +157,21 @@ values to a selected Edit Area.    Run a Smart Tool for just the area covered by your WFO.   Solution
          20. -
              +
          21. Adjust a QPF grid using the Orographic Smart Tool.    Solution
          22. -
              +
          23. Interpolate temperatures to hourly grids and derive a MaxTemp grid from these grids using the Smart Tool.    Solution
          24. -
              +
          25. Derive a SnowAmt grid from the QPF field using the appropriate Smart Tool. Solution
          26. -
              +
          27. Run a Smart Tool on multiple grids, but only over a selected Edit Area Solution
          28. @@ -178,27 +179,27 @@ Run a Smart Tool on multiple grids, but only over a selected Edit Area


            Miscellaneous and More Complex actions -
              +

            1. Display a grid as an image, then change the Color Table that is being used. Solution
            2. -
                +
            3. Change the color of a graphic. (Think how you would do this on D2D.) Solution
            4. -
                +
            5. Assign a weather type to the portion of a grid covered by a certain PoP value.    Solution
            6. -
                +
            7. Assign values to a PoP grid based on different threshold values in the QPF grid for that time.    Solution
            8. -
                +
            9. Save and Publish the data.    Solution
            diff --git a/cave/com.raytheon.viz.gfe/help/EGTMisc.html b/cave/com.raytheon.viz.gfe/help/EGTMisc.html index c6c0abaa74..caa3bd3030 100644 --- a/cave/com.raytheon.viz.gfe/help/EGTMisc.html +++ b/cave/com.raytheon.viz.gfe/help/EGTMisc.html @@ -3,13 +3,14 @@ + Miscellaneous Actions Training Miscellaneous and More Complex actions
             

            Display a grid as an image, then change the Color Table that is being used. -

            To display a grid as an image, move the curso +

            To display a grid as an image, move the cursor down to the legend that corresponds to that grid.  Press and hold MB3 and select Display as Image.  This will change the grid to an image.  For more information on this and other legend options, see @@ -33,8 +34,8 @@ a weather type to the portion of a grid covered by a certain PoP value.First you need to define an edit area based on PoP.  To do this open the Edit Area Query Dialog from the Button Bar.  This button looks like this .  -Define a query based on PoP.  For example, "PoP -> 30" and submit the query.  For more information, see the +Define a query based on PoP.  For example, "PoP-> + 30" and submit the query.  For more information, see the section on the  Edit Area Query Dialog.  Once you have defined your edit area based on PoP, then make the corresponding Wx grid active.  Select the appropriate diff --git a/cave/com.raytheon.viz.gfe/help/EGTSmartTools.html b/cave/com.raytheon.viz.gfe/help/EGTSmartTools.html index 9ade63ae74..2d5852883d 100644 --- a/cave/com.raytheon.viz.gfe/help/EGTSmartTools.html +++ b/cave/com.raytheon.viz.gfe/help/EGTSmartTools.html @@ -3,6 +3,7 @@ + Smart Tools Training Smart Tools diff --git a/cave/com.raytheon.viz.gfe/help/ERQCcheck.html b/cave/com.raytheon.viz.gfe/help/ERQCcheck.html new file mode 100644 index 0000000000..e25c67ab8b --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/ERQCcheck.html @@ -0,0 +1,440 @@ + + + + + ERQCcheck + + + + + + +ERQCcheck +
            +
            +Introduction +
            +
            +Due to the increasing number of elements +and their forecast projection which must be produced, it has been difficult to keep track of all the +data in all the grids. There is a need for methods to assist in the managing of these grids in a +timely fashion. +

            +One of the many challenges forecasters have is making sure all the grids are consistent with one +another (i.e. Td < T). With all of the different elements and their interrelationships, if the +data is not inspected carefully, glaring inconsistencies may show up. Another challenge is making +sure all grids required for NDFD are actually there, especially in the morning when the new day 7 +needs added. +

            +ERQCCheck is designed to assist in these areas. It allows one to cross check elements against one +another to assure consistency. Where inconsistencies are found, the forecaster has the option to +either just see where the inconsistencies are, or have one element or the other forced so that they +are consistent. +

            +It also includes a routine that check for the existence of grids required for NDFD. This routine +checks for the various weather elements required for the time intervals required, over the seven days. +It accounts for the different time intervals required for the different elements, or for the same +elements over different time ranges. For example, many elements are required at three hour +intervals out to 48 or 60 hours, then every six hours out through day 7. +

            +The following table lists the Procedures and Tools used, and which elements the Tools check. +The first column lists all the Procedures and Tools. In addition to the master Procedure, +ERQCCheck, there are 2 Procedures within the Master Procedure, one being +CheckTandTd Procedure, which also deals with MaxT and MinT, the other being the NDFDgridCheck +procedure. +

            +The tools are used directly by the master Procedure for all the other elements; each Procedure or +Tool used by the master Procedure is indented once. Procedures are so indicated in the second +column; all others are Smart Tools. The weather element edited by the Smart Tool is listed in the +third column. +

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Procedure or ToolProcedureTool (Wx Element Edited)
            NDFDgridCheckProcedure
            CheckTandTdProcedureT and Td
            SnowAmtQPFPoPWxCheckProcedure
            CheckWindGustProcedureWind Gust
            CheckSkyWithPoPSky
            EnufCloudForPoPCloud
            WindChillToolWind


            +
            +
            +
            +
            +How +the Procedure Works +
            +
            +From the consistency menu, choose +ERQCcheck. Note that we are checking for internal inconsistencies, those found among one’s own +forecast grids, not inconsistencies between one’s own forecast and their neighbors forecast grids. +After selecting the procedure a GUI will appear:

            +ERQCcheck
            +
            +
            +The top section deals with selecting a +time range over which to check grids. To check grids over the selected time range in the grid +manager, just leave “Y†for “Use Selected Time Range from the Grid Manager.†To check for certain +periods, like Day4 or Day3 night to Day7, select “N†for “Use Selected Time range†and choose the +time periods at the right; the time to start with from the left column, and to end with from the +right. To check for Day4 only, for example, just choose Day4 for the start and end time. +If checking all the grids through time, simply pick the first period in the left column (Today +or Tonight) and Day 7 from the right column. +

            +The column to the right allows one to choose which cycle one is on. This affects the time periods +chosen, as the day references change meaning from the 00Z to the 12Z cycle. Leaving the default, +“Auto,†will result in the cycle being automatically determined by ERQCcheck, so one need not worry +about this feature at all in most cases. However, the other two choices, one for each off the two +possible cycles one is on, are left available in case the Procedure doesn’t determine the desired +cycle right, such as during a borderline part of the day. +

            +Next are the options for what to check, and whether to highlight only or actually fix. For each +weather element, one can choose whether to fix or just highlight where it is inconsistent with the +element it is being checked against. On the Wx check, just the highlight option is available, +although a fix option has been written, and will soon be added. On the WindGust check, just the +fix option is available at this time. The following table shows what elements can be checked +(Dependent Element), what element(s) they are checked against (Independent Element), and outlines +the options are available for each element.

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Dependent ElementIndependent ElementHighlightFix
            MinTPrevious MinTYesYes
            MaxTPrevious MaxTYesYes
            TMaxT, MinTYesYes
            TdTYesYes
            RH, Heat IndexT, TdYesYes
            WindGustWind, WindGust rulesNoYes
            SkyPoPYesYes
            PoPSkyYesYes
            PoPWxYesYes
            WxPoP, PoP12hrYesNo
            PoP12hrPoPYesYes
            QPFPoPYesYes
            SnowAmtPoPYesYes


            +
            +Note that leaving the defaults will +result in no action being taken by the Procedure at all. One must either pick an All option, +or one or more of the options that follow. +
            +
            +Brief Synopsis of each option: What + ERQCcheck does +
            +
            +What follows is an explanation of the +procedure and/or tool(s) behind each option and what they do. For the highlight option, temporary +grids are created and displayed at the bottom of the grid manager (but above the ISC grids, if +loaded). The grid name is the Element name prefixed with “Invalid,†Invalid[Element], such as +InvalidPoP. For the temperature checks, the grid names are something to the effect: +TgreaterThanMaxT. +

            +Usually, the highlight grids will be purple over areas that are OK, and red over areas where the +value for that element is not consistent with the element it was checked against. A grid of +zeroes and ones is produced. The purple area will have a value of 0, indicating OK, and the red +area a value of 1, indicating an inconsistency, but not by how much. +

            +Only the ISC_Send area is checked, so the forecaster is not bothered with the many inconsistencies +that may show up well outside the forecast area. In general, areas highlighted in red are areas +that “would have†been fixed if the fixed option were chosen. +

            +All (overrides other choices if not No)
            +This first option is a quick way to have all the weather elements this Procedure can check or fix, +checked or fixed at once. If left No, the procedure will check or fix weather elements according +to the options selected below. +

            +Checking Highlight only will run all the available checks, and produce the highlight grids +for those grids containing inconsistencies. The Fix All option fixes those grids which are +found inconsistent: they force grid values in line with values being compared against. +

            +NDFD Grid Check is the routine that checks for the existence of all grids required for the +NDFD. It checks for all seven days, regardless of the time range chosen. It doesn’t highlight or +“fill in†missing grids; rather, it lists the missing grids and the times for which they are +missing When finished, “-- Missing grids listed below !! --“ appears in the status bar in the +lower left portion of the GFE display. Just open up the message window by clicking on the up arrow +just to its left of the status bar to see which grids are missing for which times. If all grids are +present, a message, “-- All necessary grids found --†appears in the status bar instead. +

            +Just to the right of the NDFD option is a place to check for public, fire or marine weather +elements (the marine option can be removed for inland offices). For the public elements, heat +index is checked for in the summer; wind chill in winter. NDFD requires snow amount grids 12 +months a year over the CONUS. All other public weather elements are all year round. +

            +CheckTandTd (All 7 days only)
            +The temperature checks are carried out for all 7 days, regardless of the time periods chosen. +MinT and MaxT grids are checked against one another in chronological order. Values in the first +MaxT grid are made to at least equal values in the previous MinT grid, i.e., the grid from the night +before. Likewise, values in the first MinT grid are made to at most equal values in the previous +MaxT grid, i.e., the grid from the day before. This assures all values in a given MinT grid end up +at or below all values in both adjacent MaxT grids, and all values in a given MaxT grid end up at or +above all values in both adjacent MinT grids. +

            +For the highlight only option, the actual error is shown in the red area in the temporary +Invalid[Element] grid. So, if MaxT is too low compared to the following MinT grid, negative +values will appear showing how much too low the grid is at each point. +

            +Values in T grids are then forced to at least equal values in corresponding MinT grids, and/or at +most equal all values in corresponding MaxT grids. For the highlight option, values shown in red +in the temporary grid show where T is above the corresponding MaxT or below the corresponding MinT. +The purple area is where T is OK. +

            +Td
            +This is done automatically with the CheckTandTd option. After forcing T within MinT and MaxT, Td is +forced to at most equal T. +

            +For the highlight option, values shown in red in the temporary grid show where Td is above T. +

            +RH, Heat Index (For Fix Option Only)
            +Since T and Td values are potentially changed, the RH, Wind Chill and Heat Index are all +automatically recomputed with the CheckTandTd option, the latter two only if loaded in GFE at the +time, a quick way to do only what is “in season.†+

            +WindGust (Fix only)
            +This check forces wind gust values to be no lower than the sustained wind speed, as required. +There is an option to limit wind gusts in relation to the sustained wind speed. This is to avoid +wording like “5 to 10 mph with gusts to 40 mph.†It is defaulted to 12 kts, and can be changed. +Any wind gust values that exceed the sustained wind speed by more than this value are reduced so +that they exceed the wind gust by exactly this value. In this way, if the user chooses 10, +10G35KT becomes 10G20KT, in theory. In actuality, it may still come out something like 10G25KT, +on account of the analysis methods in the ZPF text formatter. Wind speeds are averaged while the +maximum is taken for wind gusts. +

            +CheckSkyWithPoP
            +Although there is no quantitative relationship between PoP and Sky, generally there is a qualitative +relationship that high PoPs require high Sky values, although high Sky values do not necessarily +mean the PoPs have to be high. This option checks Sky against PoP, allowing the forecaster to +choose from three possible Sky-PoP relationships, then control the relationship chosen, according +to the meteorological situation at hand. These relationship options appear just to the right of +CheckSkyWithPoP; the “For Sky and PoP†section, allowing one to control the relationship chosen, +appears just below the CheckSkyWithPoP option. +

            +The first two relationships are based on the premise that the Sky should be at least equal to, if +not greater than, the PoP. In essence, if there’s a 50% chance of rain, then it should be at least +partly cloudy, if not mostly cloudy. It certainly shouldn’t be mostly clear if there’s that good a +chance for rain. On the other hand, if there are a lot of clouds, there may not be much +precipitation around. This is OK; the tool leaves these areas alone. +

            +Relationship 1: Sky greater than PoP by a fixed amount. For this option, one chooses “add†+under “Sky vs PoP Relationship.†In the “For Sky and PoP†options below, one chooses the amount by +which the Sky should be greater than the PoP; the default is 20. +

            +For the fix option, all Sky values not exceeding the PoP by at least the amount entered will be +increased just enough to do so. Sky values already exceeding the PoP by more than the amount +entered are simply left alone. For the highlight option, areas that “would have†been fixed are +simply highlighted with ones in a grid of ones (red) and zeros (purple). +

            +Relationship 2: Sky greater than PoP by a factor. For this option, one chooses “multiply†+under “Sky vs PoP Relationship:†In the “For Sky and PoP†options below, one chooses the factor by +which the Sky should be greater than the PoP. The default of 20 should almost definitely be +changed, usually to a much lower value, such as 1.5 or 2. +

            +For the fix option, all Sky values not exceeding the PoP by at least the factor entered will be +increased just enough to do so. For example, if the factor entered is two, then the Sky values +should always be at least double what the PoP is; those values that aren’t are increased to exactly +double the PoP. Sky values already exceeding the PoP by more than the factor entered are simply +left alone. For the highlight option, areas that “would have†been fixed are simply highlighted +with ones in a grid of ones (red) and zeros (purple). +

            +Relationship 3: Sky is at least a certain value (or lower limit) wherever there is weather. +For this option, one chooses “Sky limit†under “Sky vs PoP Relationship.†In the “For Sky and PoP†+options below, one decides 1) how much Sky cover there should be to support weather, and 2) how +much Sky cover there should be to support a 5% PoP. For the former, weather is required for PoP +values of 15 or greater; this is hard-coded. Here, one is really entering how much Sky cover there +should be to support a 5% PoP, and a 15% PoP, with values in between linearly interpolated. +

            +We are only concerned here with Sky values for the onset of weather: PoP values of between 5% +(onset of possible trace events) and 15% (onset of measurable precipitation). The idea here is that +the Sky limit entered should be the lowest Sky value found anywhere the PoP is 15% or greater. +Note here that higher PoP values do not affect the algorithm: if 60 is left for Sky Limit, then all +values lower than 60 should be raised to 60 for PoPs anywhere from 15% to 100%. Sky cover for PoPs +of 5% to 15% should vary linearly from the values entered for a 5% PoP to the value entered for a +15% PoP. Sky values for PoP of less than 5% are left alone. +

            +For the fix option, the Sky is raised to that value entered for PoP needed to support measurable +precipitation wherever the PoP is 15% or greater, the definition for a forecast of measurable +precipitation. Sky is raised to that value entered for 5% PoP where the PoP is 5%, and left alone +regardless of its original value where the Pop is less than 5%. For PoP values between 5% and 15%, +a slope is created to determine the new minimum Sky in this range, varying linearly from the Sky +value entered for 5% PoP and that entered to support measurable precipitation. +

            +For the highlight option, a grid of zeroes (purple) and ones (red) are shown, the ones indicating +where the Sky grid is inconsistent with the PoP grid, areas that “would have†been fixed using the +“Fix†option. +

            +SnowAmtQPFPoPWxCheck
            +Performs two, simple consistency checks on the SnowAmt grid:

            +

              +
            1. Where SnowAmt >= 0.5 inches, checks to ensure QPF >= 0.01 inches.
            2. +
            3. Where SnowAmt >= 0.1 inches, checks to ensure Wx contains S, SW, and/or IP. The frozen + precipitation type can be mixed with any liquid and/or freezing precipitation type. The procedure + does not consider coverage, intensity, and/or visibility of the frozen precipitation in the Wx + grid. There are two cases, which are subtly different:
            4. +
                +
              • If the SnowAmt grid is 6-hr long and starts at 00, 06, 12, or 18 UTC, then at least + one of the overlapping Wx grids must contain S, SW, and/or IP.
              • +
              • All other SnowAmt grids will have to have all overlapping Wx grids contain S, SW, + and/or IP. The more stringent check is required because if the GFE grid time constraints are + offset from the NDFD time constraints, it is possible for the GFE to return a consistent + result but have the NDFD believe the grids are inconsistent.
              • +
              +

            +The procedure also performs two, simple consistency checks on the QPF grid:

            +
              +
            1. Where QPF > 0.0, checks to ensure at least one of the overlapping PoP grids is greater + than zero. The PoP grids here are the “floating†PoP grids.
            2. +
            3. Where QPF > 0.0, checks to ensure that the overlapping Wx grids have at least one of + the precipitating Wx types, which includes L and ZL. The check is made against the Wx type + only. The procedure does not consider coverage, intensity, and/or visibility of the + precipitating Wx type. There are two cases, which are subtly different:
            4. +
                +
              • If the QPF grid is 6-hr long and starts at 00, 06, 12, or 18 UTC, then at least + one of the overlapping Wx grids must contain precipitating weather.
              • +
              • All other QPF grids will have to have all overlapping Wx grids contain precipitating + weather. The reasons for the more stringent test are the same as with the SnowAmt/Wx + consistency check.
              • +
              +

            +Notes:
            +
              +
            1. In case it's not clear, for both the SnowAmt/Wx and QPF/Wx checks, if you have a mixture + of SnowAmt/QPF grids where some meet the 6-hr definition and some do not, then the “any†Wx grid + check applies for the 6-hr grids and the “all†Wx grid check applies to the others.
            2. +
            3. For all checks, if the initial threshold is not met, then the grids are considered + consistent by definition. In other words:
            4. +
                +
              • If SnowAmt < 0.5 inches, then SnowAmt and QPF are always consistent.
              • +
              • If SnowAmt < 0.1 inches, then SnowAmt and Wx are always consistent.
              • +
              • If QPF = 0, then QPF and PoP are always consistent.
              • +
              • If QPF = 0, then QPF and Wx are always consistent.
              • +
              +
            +If the procedure finds any inconsistencies, it will highlight the inconsistent grids and create +temporary grids which show where the inconsistencies occur. The values in all the temporary grids +are either zero (consistent) or one (inconsistent). The procedure does not modify any grids. +It's left up to the forecaster to determine how, if at all, to handle the inconsistencies. +The issue of a check only versus a check/force procedure was discussed by the STSIT and the +consensus recommendation was a check only procedure. The STSIT feels strongly that there are +no meteorologically sound ways to force consistency of these grids. +

            +When the procedure is run, the forecaster is presented with several choices. The first is whether +to run checks or to “Cleanupâ€. By default, the procedure will run checks. The “Cleanup†option +will undo any highlighting and remove any temporary grids. If you leave “Check†selected, then +you can choose which of the checks you wish to run by toggling on and off the appropriate button. +By default, all checks will be run. +
            + + diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_MyNAM.py b/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_MyNAM.py index 1c3d20f976..cb876fb4b5 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_MyNAM.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_MyNAM.py @@ -38,6 +38,4 @@ class MyNAM12Forecaster(NAM12Forecaster): def main(): MyNAM12Forecaster().run() -if __name__ == "__main__": - main() diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NAM.py b/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NAM.py index 4a412a6db0..45abda0f2c 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NAM.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NAM.py @@ -555,5 +555,3 @@ class NAM12Forecaster(Forecaster): def main(): NAM12Forecaster().run() -if __name__ == "__main__": - main() diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NewModel.py b/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NewModel.py index bffa01eb00..c5ced88706 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NewModel.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLESmartInit_NewModel.py @@ -43,6 +43,4 @@ class GWWForecaster(Forecaster): def main(): GWWForecaster().run() -if __name__ == "__main__": - main() diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimage.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimage.py index ed006b0cb5..dc554f8702 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimage.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimage.py @@ -17,7 +17,7 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -# Example ifpIMAGE configuration file. +# Example ifpIMAGE configuration file. # Must always import from gfeConfig (or your site configuration) from gfeConfig import * diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBackColor.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBackColor.py index 1ff5fd3ce1..8d4b0d9e05 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBackColor.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBackColor.py @@ -15,7 +15,7 @@ # 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for -# further licensing information. +# further licensing information. ## # Example ifpIMAGE configuration file. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBorder.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBorder.py index 6c49b52cb5..a34a437f04 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBorder.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageBorder.py @@ -10,7 +10,7 @@ # # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 -# Mail Stop B8 +# Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 # diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageColorTable.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageColorTable.py index 74984f3e31..e18d6d85cb 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageColorTable.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageColorTable.py @@ -1,6 +1,6 @@ ## # This software was developed and / or modified by Raytheon Company, -# pursuant to Contract DG133W-05-CQ-1067 with the US Government. +# 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 diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicAtt.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicAtt.py index 64a63dd150..5ba0aa6694 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicAtt.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicAtt.py @@ -17,7 +17,7 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -# Example ifpIMAGE configuration file. +# Example ifpIMAGE configuration file. # Must always import from gfeConfig (or your site configuration) from gfeConfig import * diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicTypes.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicTypes.py index a31cef3ef4..995120980d 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicTypes.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageGraphicTypes.py @@ -9,7 +9,7 @@ # an export license or other authorization. # # Contractor Name: Raytheon Company -# Contractor Address: 6825 Pine Street, Suite 340 +# Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageInfoFile.txt b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageInfoFile.txt index af13f364c6..1f97b7759a 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageInfoFile.txt +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageInfoFile.txt @@ -1,4 +1,4 @@ -ValidTime: 20010317_0000 +ValidTime: 20010317_0000 NumOfGrids: 2 Grid: T_SFC:BOU_GRID__Fcst_00000000_0000 20010317_0000 20010317_0100 blue IMAGE Grid: Wind_SFC:BOU_GRID__Fcst_00000000_0000 20010317_0000 20010317_0100 #00ff00 GRAPHIC diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegend.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegend.py index b4c0a0d078..ffd70731f2 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegend.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegend.py @@ -9,7 +9,7 @@ # an export license or other authorization. # # Contractor Name: Raytheon Company -# Contractor Address: 6825 Pine Street, Suite 340 +# Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendFormat.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendFormat.py index e69e7f45b8..c001636bcf 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendFormat.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendFormat.py @@ -12,7 +12,7 @@ # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 -# 402.291.0100 +# 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTime.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTime.py index aecde7cc9d..f20cbd2e33 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTime.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTime.py @@ -6,7 +6,7 @@ # 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. +# an export license or other authorization. # # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTitle.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTitle.py index b08464c708..2e2ece912b 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTitle.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLegendTitle.py @@ -12,7 +12,7 @@ # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 -# 402.291.0100 +# 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLogo.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLogo.py index b687e4b224..765a508ce4 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLogo.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageLogo.py @@ -12,7 +12,7 @@ # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 -# 402.291.0100 +# 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMapAttr.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMapAttr.py index 8f11e8c396..180740c308 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMapAttr.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMapAttr.py @@ -10,7 +10,7 @@ # # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 -# Mail Stop B8 +# Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 # diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMaps.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMaps.py index f7c21d1a80..594b0bbd9c 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMaps.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMaps.py @@ -17,7 +17,7 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -# Example ifpIMAGE configuration file. +# Example ifpIMAGE configuration file. # Must always import from gfeConfig (or your site configuration) from gfeConfig import * diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMasking.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMasking.py index afdab9eec0..3a7c6ae0f6 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMasking.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageMasking.py @@ -17,7 +17,7 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -# Example ifpIMAGE configuration file. +# Example ifpIMAGE configuration file. # Must always import from gfeConfig (or your site configuration) from gfeConfig import * diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageOverlay.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageOverlay.py index 5a5a6d129c..0ca6853710 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageOverlay.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageOverlay.py @@ -15,7 +15,7 @@ # 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for -# further licensing information. +# further licensing information. ## # Example ifpIMAGE configuration file. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePngParms.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePngParms.py index ddf18852a0..aadd5179db 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePngParms.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePngParms.py @@ -9,7 +9,7 @@ # an export license or other authorization. # # Contractor Name: Raytheon Company -# Contractor Address: 6825 Pine Street, Suite 340 +# Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePrefix.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePrefix.py index 7d3eb8b55b..1431b0747e 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePrefix.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimagePrefix.py @@ -17,7 +17,7 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -# Example ifpIMAGE configuration file. +# Example ifpIMAGE configuration file. # Must always import from gfeConfig (or your site configuration) from gfeConfig import * diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSamples.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSamples.py index fe7c252b1e..5855af235f 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSamples.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSamples.py @@ -19,7 +19,7 @@ ## # Example ifpIMAGE configuration file. -# Must always import from gfeConfig (or your site configuration) +# Must always import from gfeConfig (or your site configuration) from gfeConfig import * import gfeConfig diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSingleImage.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSingleImage.py index 06dca456d4..eae5ad2538 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSingleImage.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSingleImage.py @@ -17,7 +17,7 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -# Example ifpIMAGE configuration file. +# Example ifpIMAGE configuration file. # Must always import from gfeConfig (or your site configuration) from gfeConfig import * diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSize.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSize.py index d55bcb9e46..20e8390690 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSize.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSize.py @@ -10,7 +10,7 @@ # # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 -# Mail Stop B8 +# Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 # diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSkyImage.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSkyImage.py index 8f9e947fd9..d04d6a3a33 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSkyImage.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSkyImage.py @@ -17,7 +17,7 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -# Example ifpIMAGE configuration file. +# Example ifpIMAGE configuration file. # Must always import from gfeConfig (or your site configuration) from gfeConfig import * diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmooth.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmooth.py index 9e4e9c0aa6..8e65f838c5 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmooth.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmooth.py @@ -9,7 +9,7 @@ # an export license or other authorization. # # Contractor Name: Raytheon Company -# Contractor Address: 6825 Pine Street, Suite 340 +# Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmoothClip.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmoothClip.py index d213f00111..595c81f771 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmoothClip.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageSmoothClip.py @@ -9,7 +9,7 @@ # an export license or other authorization. # # Contractor Name: Raytheon Company -# Contractor Address: 6825 Pine Street, Suite 340 +# Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageWx.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageWx.py index 7b49a32b9c..07033f539c 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEimageWx.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEimageWx.py @@ -12,7 +12,7 @@ # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 -# 402.291.0100 +# 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEinterval.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEinterval.py index b569ee6fc6..9f2aa84fa4 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEinterval.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEinterval.py @@ -12,7 +12,7 @@ # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 -# 402.291.0100 +# 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfig.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfig.py index 6f3bf829ef..9d93d6ef38 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfig.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfig.py @@ -12,7 +12,7 @@ # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 -# 402.291.0100 +# 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigAddElement.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigAddElement.py index 3d841989af..071f9dce40 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigAddElement.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigAddElement.py @@ -19,7 +19,7 @@ ## # This is an example localConfig.py file -# Always include these lines at the top of your localConfig.py file. +# Always include these lines at the top of your localConfig.py file. from serverConfig import * import serverConfig diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigD2DDIR.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigD2DDIR.py new file mode 100644 index 0000000000..ea9b1b345a --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigD2DDIR.py @@ -0,0 +1,31 @@ +## +# 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. +## +# This is an example localConfig.py file + +# Always include these lines at the top of your localConfig.py file. +from serverConfig import * +import serverConfig + +# modifying the list of D2DMODELS directories seen from the GFE, and scanned +# by EDEX +serverConfig.D2DMODELS.append = (('SREF12', 'SREF')) + + + diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModParmGroups.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModParmGroups.py index c6c05c88c8..765f38abec 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModParmGroups.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModParmGroups.py @@ -20,7 +20,7 @@ # This is an example localConfig.py file to modify the weather element # and time constraint relationship for the Fcst and Official Databases # to the following: -# T, Td, Wind, Wx, Sky: 3 hours long, no gaps +# T, Td, Wind, Wx, Sky: 3 hours long, no gaps # MaxT : 4am - 10pm local time # MinT : 4pm - 10am local time diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModWxElem.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModWxElem.py index 428801d154..10a3b48db0 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModWxElem.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigModWxElem.py @@ -19,7 +19,7 @@ ## # This is an example localConfig.py file -# Always include these lines at the top of your localConfig.py file. +# Always include these lines at the top of your localConfig.py file. from serverConfig import * import serverConfig diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigNewDB.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigNewDB.py index 1bd1603ad2..bfb13ef3bb 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigNewDB.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigNewDB.py @@ -5,7 +5,7 @@ # 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 +# to non-U.S. persons whether in the United States or abroad requires # an export license or other authorization. # # Contractor Name: Raytheon Company diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigProjection.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigProjection.py index 01a61bd0b6..90b666c564 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigProjection.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigProjection.py @@ -33,8 +33,7 @@ Local211 = ('Local211', LAMBERT_CONFORMAL, # Now we need to tell the server that our site (Boise in this example) # should use this new projection. We need to completely redefine the # grid domain information for the site and include the new projection. -SITES['BOI'] = ([45, 45], (25.00, 34.00), (11.0, 11.0), 'MST7MDT', Local211, - 'wfo')) +SITES['BOI'] = ([45, 45], (25.00, 34.00), (11.0, 11.0), 'MST7MDT', Local211, 'wfo') diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigResolution.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigResolution.py index 9dfa8227e5..0dfedc5cfb 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigResolution.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigResolution.py @@ -19,7 +19,7 @@ ## # This is an example localConfig.py file -# Always include these lines at the top of your localConfig.py file. +# Always include these lines at the top of your localConfig.py file. from serverConfig import * import serverConfig diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigSATDIR.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigSATDIR.py index 71ea740cf8..9f81383884 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigSATDIR.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigSATDIR.py @@ -23,14 +23,11 @@ from serverConfig import * import serverConfig -# modifying the list of SATDIRS directories seen from the GFE, and scanned -# by the ifpServer -pfix = "/data/fxa/sat/SBN/netCDF/" -serverConfig.SATDIRS = [(pfix + "westCONUS/conus_vis/regClip", "visibleWest"), - (pfix + "westCONUS/conus_i11/regClip", "ir11West"), - (pfix + "westCONUS/conus_i12/regClip", "ir13West"), - (pfix + "westCONUS/conus_i39/regClip", "ir39West"), - (pfix + "westCONUS/conus_iwv/regClip", "waterVaporWest"), +# modifying the list of SATDATA directories seen from the GFE, and scanned +# by EDEX +pfix = "NESDIS/GOES-11(L)/" +serverConfig.SATDATA.append = [(pfix + "West CONUS/Imager Visible", "visibleWest"), + (pfix + "East CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporWest")] diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigTC.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigTC.py index f3d58ea6cb..3a9e470b0c 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigTC.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalConfigTC.py @@ -12,7 +12,7 @@ # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 -# 402.291.0100 +# 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalWxConfig.py b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalWxConfig.py index 053599a9d2..044eb67585 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLElocalWxConfig.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLElocalWxConfig.py @@ -11,7 +11,7 @@ # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 -# Omaha, NE 68106 +# Omaha, NE 68106 # 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for diff --git a/cave/com.raytheon.viz.gfe/help/EXAMPLEsnapshotTimeStamp.py b/cave/com.raytheon.viz.gfe/help/EXAMPLEsnapshotTimeStamp.py index 6480c0db5f..ee13189fee 100644 --- a/cave/com.raytheon.viz.gfe/help/EXAMPLEsnapshotTimeStamp.py +++ b/cave/com.raytheon.viz.gfe/help/EXAMPLEsnapshotTimeStamp.py @@ -25,7 +25,7 @@ import gfeConfig # Defines T and Sky as the weather elements to be display -Png_parms = ['T_SFC:_Official -1', 'Sky_SFC:_Official -1']] +Png_parms = ['T_SFC:_Official -1', 'Sky_SFC:_Official -1'] Png_snapshotTime = 1 diff --git a/cave/com.raytheon.viz.gfe/help/EditableListbox.html b/cave/com.raytheon.viz.gfe/help/EditableListbox.html index 9b1d8c287c..2d2337cc87 100644 --- a/cave/com.raytheon.viz.gfe/help/EditableListbox.html +++ b/cave/com.raytheon.viz.gfe/help/EditableListbox.html @@ -6,7 +6,7 @@ - 1. Editable Listbox + Editable Listbox
            @@ -14,46 +14,14 @@ Description
            Editable listboxes are -used in many GFE dialogs to allow you to create and modify items such -as smart tools, procedures, utilities, config files, etc. Pressing MB3 +used in many GFE dialogs to allow you to run items such +as smart tools and procedures. Pressing MB3 over an item in the box opens a pop-up menu which will contain a subset of the following options.
            • Info... -- Shows information about the item
            • -
            • - Copy -- Copies the edit action to an -invisible -buffer.
            • -
            • - Modify or View... -- Brings up a dialog -and/or -window containing the item you select. If the item is not protected -or locked by another user,  you are allowed to modify it. When you -are finished, choose File-->Save. In most cases, your changes will -be immediately available for execution. The exception is configuration -files for which you must restart the GFE in order to see your changes.
            • -
              -   If another user is modifying the product when you -select "Modify", -a dialog will appear informing you that the product is locked. You may -break the lock, but please note that this could produce unpredictable -results -since two users may be modifying the product at the same time! -
              -
            • - New... -- Brings up a dialog and/or -window -so that you can to define the characteristics of a new item.
            • -
            • - Rename... -- Allows you to specify a -new name for the item. Note that this new name will apply to all -windows in which the item may appear.
            • -
            • - Delete... -- Deletes the Edit Action -from the server. A warning will appear to verify that you wish to -delete the action entirely.
            diff --git a/cave/com.raytheon.viz.gfe/help/Enhanced_Wx.html b/cave/com.raytheon.viz.gfe/help/Enhanced_Wx.html new file mode 100644 index 0000000000..ffc16a0964 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/Enhanced_Wx.html @@ -0,0 +1,174 @@ + + + + + Enhanced_Wx + + + + + + +Enhanced_Wx +
            +
            +Introduction +
            +
            +The Enhanced_WxTool +is a significant enhancement to the original Wx_SmartTool, which was written. +Both tools assign Wx based on the corresponding PoP grids; however the +Enhanced_WxTool offers the following additional functionality:
            +
              +
            1. The forecaster is allowed considerable freedom in choosing individual + weather types (RW, R, SW, S, IP, ZR, L, ZL, and F are all supported).
            2. +
            3. Up to three weather types may be mixed together and a different + intensity (very light [--], light [-], moderate [m], or heavy [+]) may be + assigned to each. So for example, it is possible to assign weather such + as RmSmIP- with this tool.
            4. +
            5. The forecaster can also choose whether to include thunder (T) + with any other supported weather type; if thunder is included, he or she also + has the option of specifying whether the thunder is severe in nature (T+).
            6. +
            7. The forecaster can assign either probability qualifiers or areal coverage + qualifiers (where allowed) to the chosen weather types. If a forecaster attempts + to use an invalid qualifier for a weather type, the tool will generate an error + message appears indicating that this is not allowed.
            8. +
            9. For each individual weather type, the forecaster can override the default + probability/coverage obtained from the PoP grid if desired. The same is also true + for thunder (T). This makes it possible to: create weather combinations such as + “Lkly RW:Chc SW†or “Def RW:Chc Tâ€; and assign weather types of F, L, or ZL, + which aren’t necessarily derived from the PoP grids.
            10. +
            11. For categorical PoPs, the forecaster can use alternate probability/coverage + terms (other than "Def" or "Wide") if desired. The following options are + available: "Ocnl", "Frq", "Brf", "Pds", and "Inter". When used, this setting + applies to all categorical precip coverages that are derived from the PoP grid.
            12. +
            13. If thunder is included with the precipitation, the forecaster also has the + additional option of specifying the following thunderstorm attributes, if + desired:
            14. +
                +
              • Small Hail (SmA)
              • +
              • Heavy Rain (HvyRn)
              • +
              • Gusty Winds (GW)
              • +
              • Frequent Lightning (FL)
              • +
              • Large Hail (LgA)
              • +
              • Damaging Winds (DmgW)
              • +
              • Tornadoes (TOR)
              • +
              +
            +
            +The tool is designed so that the last three attributes (LgA, DmgW, and TOR) can only be +assigned when severe thunderstorms (T+) are forecast. Similarly, the tool will also +only allow SmA and GW to be used with non-severe thunderstorms (T). If the forecaster +tries to assign a thunderstorm attribute that is invalid, the tool will display a +message indicating this, and will automatically ignore such attributes and run to +completion. +

            +It should be noted that the tool does not apply any scientific principle to derive +the final Wx type; the Wx type assigned is solely decided upon by the forecaster. +The forecaster chooses the Wx type through the use of a GUI interface that appears +when the tool is executed.
            +
            +
            +
            +How +the Procedure Works +
            +
            +The floating PoP grids for the time +period in question must exist before running the tool. After creating all of the necessary +floating PoP grids, to run the tool the forecaster needs only to select the BUF_WxTool from the +list of available smart tools in GFE; this action brings up the following GUI:

            +Enhanced_Wx
            +
            +
            +Here is a brief overview of each section: +

            +Qualifier Type: Allows you to toggle between the use of Probability and Areal Coverage terms. +The default setting is “Probâ€. +

            +Alter Terms Cat PoPs (new): Allows you to use alternate probability/coverage terms ("Ocnl", +"Frq", "Brf", "Pds", and "Inter") when categorical PoPs are used. When used, this setting +will apply to all categorical precipitation probabilities/coverages that are derived from +the PoP grid. The default setting is “Noneâ€. +

            +1st/2nd/3rd Type: Allows you to select/combine up to 3 different weather types. +In version 2.0, the lists of available weather types have been expanded to include L, ZL, and F. +

            +1st/2nd/3rd Inten: Allows you to specify the intensity of each weather type (--, -, m, or +). +In the case of fog (F), only + (dense) is a valid intensity. If F is selected with any other +intensity, the tool will automatically remove the intensity to prevent any errors. The default +setting is “-“ (light). +

            +1st/2nd/3rd Type Alternate Prob/Cov (new): Allows you to override the default probability/coverage +obtained from the corresponding PoP grid for each individual weather type. This allows the easy +creation of weather types such as "Lkly RW:Chc SW". This approach also allows for the use of +other weather types (for example, F, L, and ZL) which aren't necessarily PoP-dependent. +The default setting is “None†- meaning the probability/coverage terms for each weather type +are derived from the PoP grid by default. +
            +Thunder?: Allows you to specify whether you want thunder included with the other weather type(s) +selected. Options are “Noâ€, “Yes (T)â€, and “Yes (T+)†(severe T). The default setting is “Noâ€. +

            +Thunder Alternate Prob/Cov (new): Allows you to specify an alternate probability/coverage for +T if desired. This setting will override the default probability/coverage obtained from the +corresponding PoP grid, and makes it possible to create precip types such as "Def RW:Chc T". +The default setting is “None†- meaning the probability/coverage term for T is derived from +the PoP grid by default. +

            +Tstm Attributes?: Allows you to specify Thunderstorm Attributes if you choose to include +Thunder in the Wx grid. +

            +Once the forecaster has made their selections from the above GUI, he/she then assigns the +desired weather by clicking either of the Run or Run/Dismiss buttons within the GUI. +When this is done, a single weather type is created based on the forecaster input. Unless +specifically overridden by the forecaster, probability or areal coverage qualifiers will +be determined from the PoP grid in accordance with the following table:

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            PoP Value (rounded to the nearest %)Probability QualifierAreal Coverage Qualifier
            0 - SChc_min_PoP_threshold*None; is assignedNone; is assigned
            SChc_min_PoP_threshold* - 24Slight Chance (SChc)Isolated (Iso)
            25 - 54Chance (Chc)Scattered (Sct)
            55 - 74Likely (Lkly)Numerous (Num)
            75 - 100Definite (Def)Widespread (Wide)


            +* - SChc_min_PoP_threshold is the minimum PoP needed for a SChc (slight chance) of weather to +be included in the Wx grid. This value is site-customizable; the default value is 14.5%. +Please see the Installation/Configuration section below if you would like to change this +setting at your site.
            + + diff --git a/cave/com.raytheon.viz.gfe/help/Extrapolate.html b/cave/com.raytheon.viz.gfe/help/Extrapolate.html new file mode 100644 index 0000000000..f832e39e5d --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/Extrapolate.html @@ -0,0 +1,97 @@ + + + + + Extrapolate + + + + + + +Extrapolate +
            +
            +Introduction +
            +
            +Extrapolate is a procedure +that allows one to linearly extrapolate features in time. In combination with tools for +populating Sky grids from satellite data and PoP grids from radar data, this can be useful +in extrapolating satellite and radar data. Of course, linear extrapolation is only good +up to a point, depending upon the weather situation. This may not be useful at all in a +lot of cases, as precipitation either forms, dissipates, expands, contacts and/or changes +speed and direction. +
            +
            +
            +How +the Procedure Works +
            +
            +Extrapolate uses movement +information from a choice of models, the Fcst database, or user-entered sources to +linearly extrapolate features through time. Given a direction and speed of motion, +the tool will shift the data on the GFE domain as though moving at that speed in +that direction for one hour. A screenshot of the Extrapolate tool GUI is shown below.

            +Extrapolate
            +
            +
            +The most important input in +the tool GUI is determining which source you wish to use to advect features. For instance, +if extrapolating satellite or radar data, one can use the distance-speed tool in D2D to arrive +at the direction and speed of motion, and then enter these values directly into the procedure +GUI. To use these values, one must use the default “Observed (enter below)†for “Source:†+

            +Other movement sources available include model data and forecast surface wind information. +For the model sources, one can pick one of several levels or layers available under +“Wind Level if using model:†If a layer is chosen, then the models winds at all available +model levels within that layer, including both the top and bottom pressure levels indicated, +are averaged. The surface wind forecast information may not often be that useful, though one +could always create, say, a temporary Fcst wind grid for use as a steering current. +

            +Note that, if using wind information from a model database or the Fcst database, the movement +values will vary across the grid. This portion of the tool was written to apply the wind +information from the chosen source at each point, so if the flow varies across the grid domain, +then this would be reflected in the output. +

            +The NAM12 and the RUC13 have data only every three hours; the GFS40 only every six. +Originally, the code was written to let GFE interpolate model data between its valid times, +but this did not work in offices whose GFE default for missingDataMode was not set equal to +‘create,’ i.e., interpolate, and forcing ‘create’ in the smartTool call up command had no +effect for reasons unknown. +

            +To get around this problem, the code was re-written to always look in a three (six) hour window +around the hour of interest, so model data is always there. It looks 1 (2) hour(s) back and +2 (4) hours forward, so that the hour half way between valid model times uses forward data, +which makes more sense when extrapolating data forward. The motion used may not be as ‘precise,’ +but performance is not dependent upon variables outside the control of the Extrapolate procedure. +

            +The GUI also provides forward and backward options, so one can also extrapolate backward in time. +This could be useful in blending a PoP forecast at a future hour with current radar data. +

            +The Extrapolate procedure uses a smart tool called “MoveFeatureBySpeedâ€. The portion of this +tool that uses an observed speed and direction of movement entered by the forecaster was adapted +from Les Colins’ EditAreaAdjust tool, and allows one to shift the data in any scalar grid by the +speed and direction entered. Overall, the procedure and tool are set up to extrapolate an hour +at a time, using wind information from the hour before. Wind information for hours in between +model grids are derived via linear interpolation. +

            +Used as a stand-alone tool, MoveFeatureBySpeed will shift the data as though moving at that +speed in that direction for one hour, but only on the selected grid itself rather than the +grid for the next hour. As such, the forward and backward options are not available from the +stand-alone tool. A screenshot of the “MoveFeatureBySpeed†tool GUI is shown below.
            +Extrapolate
            + + diff --git a/cave/com.raytheon.viz.gfe/help/FillPatterns.html b/cave/com.raytheon.viz.gfe/help/FillPatterns.html index fb9a720625..ec812b351f 100644 --- a/cave/com.raytheon.viz.gfe/help/FillPatterns.html +++ b/cave/com.raytheon.viz.gfe/help/FillPatterns.html @@ -6,14 +6,13 @@ Fill Patterns -

            Fill Patterns

            -This document shows the available set of fill patterns used in the GFE.  +This document shows the available set of fill patterns used in the GFE. Through the use of the gfe configuration file, certain displays may be tailored to use these patterns. -
              -
              +
            +
            diff --git a/cave/com.raytheon.viz.gfe/help/FormatterLauncher.html b/cave/com.raytheon.viz.gfe/help/FormatterLauncher.html index a8faeaf6c8..88d1de8239 100644 --- a/cave/com.raytheon.viz.gfe/help/FormatterLauncher.html +++ b/cave/com.raytheon.viz.gfe/help/FormatterLauncher.html @@ -7,7 +7,7 @@

            Formatter Launcher User's Guide

            -
            May 12, 2006
            +
            March 7, 2012


            @@ -40,8 +40,8 @@ product canvas area, and status bar.

            Main Menu Bar

            Products

            The products menu permits selection of the products to appear in the -panes.   The menu is divided into "Site-level" products, then -Hazard and  Civil Emergency, then Baseline, Regional, and Hazard +panes. The menu is divided into "Site-level" products, then +Hazard and Civil Emergency, then Baseline, Regional, and Hazard backup product configurations, and then the Product Editor / Make Correction tab.   @@ -53,8 +53,8 @@ text database and making corrections to a product.

            Data Source

            The data source menu allows the forecaster to change the source -database for all products to one of the four options:  Official, -Fcst, ISC, or Default.  The Default setting uses the database +database for all products to one of the four options: Official, +Fcst, ISC, or Default. The Default setting uses the database definition contained within each formatter to determine which database should be used as a data source.

            @@ -75,12 +75,12 @@ only Data Source is the Practice Forecast database; in GFE TEST mode, the only Data Source is the Test Forecast database.

            Processor

            -Formatters execute either on the ifpServer platform or the local -platform.  Better performance for the local GFE and faster +Formatters execute either on the server platform or the local +platform. Better performance for the local GFE and faster formatter execution should be realized when the processor is set to -"Server".  This item is not configurable on a per-product -basis.  The default is "Server".  Setting the item to "Local" -will run the formatters locally.   The default may be changed +"Server". This item is not configurable on a per-product +basis. The default is "Server". Setting the item to "Local" +will run the formatters locally. The default may be changed through the gfe configuration entry FormatterLauncherDialog_Processor.

            @@ -89,7 +89,7 @@ through the gfe configuration entry
            @@ -100,10 +100,10 @@ The Help menu simply provides a color legend for the Product Tabs.

            There is a product tab for each selected entry in the Products -Selector.  Clicking on one of the tabs will then display that -product's Product Canvas Area.  The Product Canvas Area contains +Selector. Clicking on one of the tabs will then display that +product's Product Canvas Area. The Product Canvas Area contains the zone combiner (if applicable), editor window, output log, and -several other controls.  The color state of the buttons indicate +several other controls. The color state of the buttons indicate whether the product is queued, running, or finished as shown below:

            Fill Pattern
            Canvas Area The Product Canvas Area appears for each product that has been selected.  Use the Product Tabs to display the specific Product -Canvas Area of interest.  The Product Canvas consists of a control -panel and the canvas area.   Depending upon the state of the +Canvas Area of interest. The Product Canvas consists of a control +panel and the canvas area. Depending upon the state of the product, some of the controls are dimmed and not accessible.

            Controls
            @@ -182,7 +182,7 @@ The controls perform the following functions:
            @@ -194,9 +194,9 @@ is currently running.
            @@ -207,10 +207,10 @@ button is dimmed until the formatter has completed.
            @@ -223,7 +223,7 @@ during its execution, please use the @@ -235,8 +235,8 @@ exists.
            @@ -248,7 +248,7 @@ dimmed.
            @@ -403,7 +403,7 @@ errors: combofilename
            @@ -414,8 +414,8 @@ format: combofilename
            @@ -425,7 +425,7 @@ may still be used, but the current set of combinations is cleared. @@ -638,16 +638,16 @@ the map background.  Zone groups are counted from 1.
            Colors...
            @@ -657,49 +657,49 @@ The Combo Options menu entry is dimmed if there are no combinations being shown in the zone combiner.

            Zoom

            -The map background in the zone combiner may be zoomed.  The scroll -bars around the map are used to pan the display.   The +The map background in the zone combiner may be zoomed. The scroll +bars around the map are used to pan the display. The options on the zoom menu control the amount of zooming, from "No Zoom" to various zoom factors.


            Zone Combiner Canvas


            -The canvas is the drawing area of the zone combiner.   +The canvas is the drawing area of the zone combiner. Through a series of clicks and drags, the set of zone combinations may be edited.

            -The canvas may be resized.   Its initial size is configurable -through the gfe configuration file.   By default, the zone +The canvas may be resized. Its initial size is configurable +through the gfe configuration file. By default, the zone combiner dialog is about 80% the height and width of the display.

            Drawing a New Combination

            Using MB1, press over a zone that is "grayed-out" which represents an individual zone, and drag through that zone into zones you wish to be -part of the same combination.   The "zone color" is chosen -automatically for you.  You can change the zone colors if desired +part of the same combination. The "zone color" is chosen +automatically for you. You can change the zone colors if desired through the
            Zone Colors.... menu entry.

            Picking Up a Zone Combination

            -A MB2 click over a zone will "pick-up" that zone's configuration.  +A MB2 click over a zone will "pick-up" that zone's configuration. This is useful for adding another zone to a combination or changing the existing configuration of a zone to that which was "picked-up".

            Adding Another Zone to a Combination - Contiguous

            -Using MB1, press over the zone which you want to extend.  Drag +Using MB1, press over the zone which you want to extend. Drag through the new zones (whether they are already assigned or not doesn't -matter).  As you drag through the zones, they become part of the +matter). As you drag through the zones, they become part of the same combination.

            Adding Another Zone to a Combination - Non-Contiguous

            MB2 click over a zone in the combination you wish to extend to pick up -its value. MB1 click over the zone you wish to add.  You may need +its value. MB1 click over the zone you wish to add. You may need to MB1 click more than once.

            Toggling Zones

            MB1 clicks will toggle a zone from the combination, to a new group, and -to "off" or non-included zone.   If the "Include +to "off" or non-included zone. If the "Include All Zones" is selected, then the clicks will toggle between the combination and a new group.

            @@ -714,9 +714,9 @@ server.

            Proper Formatter and Configuration Setup


            The zone combiner requires certain Definition section items to be set -up in each formatter.   It also requires map backgrounds to be configured properly in -the ifpServer.
            +the EDEX.

            Definition section of product

            @@ -731,8 +731,8 @@ the ifpServer.
            @@ -743,7 +743,7 @@ combinations file must match the map backgrounds's attribute  @@ -765,7 +765,7 @@ products are intentionally restricted for this capability.
            @@ -773,38 +773,37 @@ products.
            Zone Combiner
            When selected, the zone combiner -will appear in the Product Canvas Area.  This button is dimmed if +will appear in the Product Canvas Area. This button is dimmed if the product doesn't support zone combinations, or while the formatter is currently running.
            Product Editor
            When selected, the product -editor will appear in the Product Canvas Area.  Initially, this -pane is blank.  When the product has finished generation, the -contents of the generated product will appear in the canvas.  This +editor will appear in the Product Canvas Area. Initially, this +pane is blank. When the product has finished generation, the +contents of the generated product will appear in the canvas. This button is dimmed until the formatter has completed.
            Output Log
            When selected, the output from -the formatter execution will appear in the Product Canvas Area.  -Initially this pane is blank.  Only when the formatter has +the formatter execution will appear in the Product Canvas Area. +Initially this pane is blank. Only when the formatter has completed, will the output log button be undimmed and the contents -available.  If you wish to monitor the progress of a formatter +available. If you wish to monitor the progress of a formatter during its execution, please use the Process Monitor.
            When selected, the Formatter Launcher is switched to the product editor and the saved draft for the -product is loaded.   If there isn't a saved draft, then a +product is loaded. If there isn't a saved draft, then a message will be displayed to the forecaster indicating that no draft exists.
            Run Formatter
            This button will queue the -formatter for execution.   Once it is queued, the button will -be dimmed until the product is completed.  Queuing a product will +formatter for execution. Once it is queued, the button will +be dimmed until the product is completed. Queuing a product will cause the zone combiner, product editor, and output log buttons to be dimmed.
            Stop Formatter
            This button is available during -the execution of a formatter.  If selected, the formatter will be +the execution of a formatter. If selected, the formatter will be aborted.
            Significant
            The product's combination file -was retrieved from the ifpServer, but could not be decoded.  The +was retrieved from EDEX, but could not be decoded. The zone combiner may still be used, but the current set of combinations is cleared.
            Significant
            The retrieved combination file -(from the ifpServer) was not in the correct format, i.e., not a list of -tuples containing a list of zones and a label.  The zone combiner +(from EDEX) was not in the correct format, i.e., not a list of +tuples containing a list of zones and a label. The zone combiner may still be used, but the current set of combinations is cleared.
            Regular
            Indicates that a combinations -file was saved.  If a GFE red banner appears, then there may have +file was saved. If a GFE red banner appears, then there may have been a problem with the save.
            The Zone Colors... selection -brings up the Zone Color Table Editor.  There is only one color +brings up the Zone Color Table Editor. There is only one color map for all products, and the size of the color map depends upon the -maximum number of zones that have been color-edited.  The color +maximum number of zones that have been color-edited. The color editor works simlarily to the other Color -Table Editors in the GFE.   Pressing "Apply" will change +Table Editors in the GFE. Pressing "Apply" will change the color mapping of the Zone Combiner as well as save the new color -table to the ifpServer.
            +table to EDEX.
            Mandatory
            Defines the map background used -for this product's zone combinations.   All edit areas in the -combinations file must match the map backgrounds's attribute  +for this product's zone combinations. All edit areas in the +combinations file must match the map backgrounds's attribute "EDITAREANAME"'s values.
            Mandatory
            Defines the combinations file to -be used for this product.  If default edit areas is not a +be used for this product. If default edit areas is not a combinations file, i.e., it is a list of edit areas, then the zone combiner will not be available. 
            Optional
            Limits the zone combinations to -just those zones listed in the subDomainUGCs entry.  This is +just those zones listed in the subDomainUGCs entry. This is normally only used for those sites whose domain is split into several products.
            Note: the combinations file must be read-write in the server in order -for the user to modify the zone combinations.  If a combinations +for the user to modify the zone combinations. If a combinations file is marked read-only, then the zone combiner will not be displayed.

            -

            Map Configuration in ifpServer
            +

            Map Configuration in EDEX

            The map background configuration defines the editAreaName for certain -map backgrounds.  If this attribute is defined, then edit areas +map backgrounds. If this attribute is defined, then edit areas will be automatically generated for the map background, based on the -attributes specified.  The Zone Combiner uses the edit area names +attributes specified. The Zone Combiner uses the edit area names associated with each shape in the map background to map combination -edit area names to map background names.   If your +edit area names to map background names. If your combinations file uses other names, then the zone combiner will reject those names and start out with an empty set of zone combinations.



            -

            Product Editor

            The Product Editor is used to display the finished product to the forecaster, and then allows the forecaster to edit, save to a file, save as a draft, store, and -transmit it..  It consists of a menu bar, the text editor, +transmit it.. It consists of a menu bar, the text editor, and to save a draft and transmit the product.

            Some fields in the product editor may appear in a different color -(default is blue).  These fields are "Locked" and cannot be edited -by the forecaster.   NWS policy requires quality control on +(default is blue). These fields are "Locked" and cannot be edited +by the forecaster. NWS policy requires quality control on the UGC, VTEC, and other components of the product thus requires that the forecaster not be -able to edit that field.  Some fields may appear in another color -(default is red).  These fields are "framing codes" and indicate +able to edit that field. Some fields may appear in another color +(default is red). These fields are "framing codes" and indicate to the forecaster that the text within the framing codes and the framing code deliminators must be edited/removed by the forecaster.

            @@ -831,7 +830,7 @@ existing product.
            Brings up a file chooser to allow the user to save the contents of the -text buffer to a disk file.  The default location is defined in +text buffer to a disk file. The default location is defined in the Definition['outputFile'] part of the formatter. @@ -840,18 +839,18 @@ Definition['outputFile'] part of the formatter. Brings up an entry field containing the 8 or 9-letter PIL (Product Inventory List) that will -be used to store the product into the AWIPS text database.  +be used to store the product into the AWIPS text database. The default pil is defined in the Definition['textdbPil'] part of the formatter. Use with caution: Saving to the text database will cause triggers for that PIL if they have been -defined.  This button is colored Blue when in practice mode and +defined. This button is colored Blue when in practice mode and the product won't get stored to the AWIPS text database.  Normally the button is gray.
            Store
            The user can change the AWIPS Product ID if necessary, and then presses the "Store" button to store the product.  The Store Countdown timer counts down from 5 seconds giving the user -the chance to abort the store operation.  If the operation +the chance to abort the store operation. If the operation is not aborted, the product will be stored into the AWIPS text database. Use with caution: Saving to the text database will cause @@ -868,8 +867,8 @@ contains the traceback on the store failure.
            containing the 9 or 10-letter AWIPS WAN PIL (Product Inventory List) that will be used to transmit the product onto the AWIPS WAN.  The product is also stored into the text database -during this operation.  The default pil is defined in the -Definition['awipsWANPil'] part of the formatter.  This button is +during this operation. The default pil is defined in the +Definition['awipsWANPil'] part of the formatter. This button is colored RED if live transmission is enabled and colored BLUE if live transmission is disabled due to practice mode.
            @@ -878,8 +877,8 @@ transmission is disabled due to practice mode.
            Print
            Sends the contents of the editor -to the lpr command.  This should cause the contents of the editor -to be printed.  However, the lpr command must be configured at the +to the lpr command. This should cause the contents of the editor +to be printed. However, the lpr command must be configured at the system level for this to work.
            @@ -888,7 +887,7 @@ system level for this to work.
            This option only appears for product tabs.  It retreives a previously saved draft and places it -into the product editor for editing.  If there is no previously +into the product editor for editing. If there is no previously saved draft, a message is displayed to the forecaster.
            @@ -896,7 +895,7 @@ saved draft, a message is displayed to the forecaster.
            Save Draft
            This option only appears for -product tabs.  It saves the current text in the editor along with +product tabs. It saves the current text in the editor along with the product definition for later callup with Load Draft.
            @@ -904,7 +903,7 @@ the product definition for later callup with Load Draft.
            Open File
            This option only appears for the -"Product Editor"tab.  It allows you to bring any local file into +"Product Editor"tab. It allows you to bring any local file into the text editor. Products brought into this window are set to routine products with an option to set them to Corrected, Updated, Delayed, or Resend mode through the "Type" pulldown menu choice at the bottom of @@ -915,9 +914,9 @@ the Formatter Launcher window.
            Load Product / Make Correction
            This option only appears for the -"Product Editor" tab.  It allows you to specify a pil, then +"Product Editor" tab. It allows you to specify a pil, then retrieves the product from the AWIPS text database and loads it into -the editor.  The editor is placed into Resend mode automatically +the editor. The editor is placed into Resend mode automatically when selecting this option. Typing in the product changes the mode to Corrected automatically.
            @@ -961,7 +960,7 @@ the cursor location.
            Find...
            Brings up the Find dialog, -allowing the user to find words.  There are many options +allowing the user to find words. There are many options available, such as backwards and forwards searches, regular expression or exact searches, ignoring case, starting at the start, end, or at the cursor position.
            @@ -983,9 +982,9 @@ cursor location.
            Spell Check...
            Brings up the spell -checker.  As each mispelled word is found, suggestions are +checker. As each mispelled word is found, suggestions are provided and the user can choose the suggestion or type in the correct -spelling.  Capabilities are provided to add a word to your +spelling. Capabilities are provided to add a word to your personal dictionary, or to ignore the mispelling.


            @@ -995,9 +994,9 @@ personal dictionary, or to ignore the mispelling.
            Wrap Selected
            Rewraps the selected portion of -the product based on the wrap length.  You probably will want to +the product based on the wrap length. You probably will want to wrap paragraph by paragraph rather than selecting the entire -text.  The Product Editor does understand certain types of +text. The Product Editor does understand certain types of paragraphs, such as blank lines denoting paragraphs and ".xxx..." syntax such as ".TONIGHT..." as paragraphs.
            @@ -1008,7 +1007,7 @@ syntax such as ".TONIGHT..." as paragraphs.
            Auto Wrap
            Enables/disables automatic -wrapping while typing.  The default value may be set through the +wrapping while typing. The default value may be set through the gfe configuration file on a per-pil basis.
            @@ -1026,11 +1025,11 @@ gfe configuration file on a per-pil basis.
            Based on the editor insertion point which defines the segment, brings up the possible set of call to action statements for the VTEC hazards identified within the -segment.   The user selects a call to action and the text is -inserted at the insertion point in the editor.  Call to action +segment. The user selects a call to action and the text is +inserted at the insertion point in the editor. Call to action statements are configurable through the CallToActions -TextUtility.  If the cursor is not in a segment that has VTEC -hazards, then the Call To Actions dialog will be empty.  The text +TextUtility. If the cursor is not in a segment that has VTEC +hazards, then the Call To Actions dialog will be empty. The text appearing in the dialog is either the actual Call To Action text or a descriptive string, depending upon the Call To Action entry format.
            CallToActions Based on the editor insertion point, brings -up the set of generic call to action statements.   The user +up the set of generic call to action statements. The user selects a call to action and the text is inserted at the insertion point in the editor. Call to action statements are configurable through the CallToActions @@ -1074,14 +1073,14 @@ colors and their meaning.


            Text Window

            -The Text Window is the text editor.  Clicking on a location will +The Text Window is the text editor. Clicking on a location will set the cursor position to that location. Typing will then insert -characters at that point.   Dragging over text will select +characters at that point. Dragging over text will select the text, which then can be used in cut/copy/paste operations.

            The WMOID block, headlines, and UGC blocks cannot be edited and appear in a different color -(configurable through the GFE configuration file).  The UGC block +(configurable through the GFE configuration file). The UGC block consists of the UGC codes, any VTEC lines, the list of zone names, the list of city names, and the date-time group.

            @@ -1089,7 +1088,7 @@ A MB3 popup menu is available that duplicates the functions found on the menu bar.

            Buttons

            There are usually three buttons available: Save File..., Store, and -Transmit.  During GFE Practice +Transmit. During GFE Practice mode, the buttons are labeled the same, but have a different appearance.

            @@ -1100,8 +1099,8 @@ appearance.
            Save Draft
            Saves the current text and -product definition to the ifpServer.   The name of the file -is based on the Definition['awipsWANPil'].   This allows +product definition to EDEX. The name of the file +is based on the Definition['awipsWANPil']. This allows other workstations to access the text/product to continue edits.
            @@ -1110,16 +1109,16 @@ other workstations to access the text/product to continue edits.
            Brings up an Transmit Dialog containing the 9 or 10-letter AWIPS WAN PIL (Product Inventory List) -that will be used to transmit the product onto the AWIPS WAN.  The +that will be used to transmit the product onto the AWIPS WAN. The product is also stored into the text database during this -operation.  The default pil is defined in the -Definition['awipsWANPil'] part of the formatter.  If live -transmission is enabled, then this button is RED.  If live +operation. The default pil is defined in the +Definition['awipsWANPil'] part of the formatter. If live +transmission is enabled, then this button is RED. If live transmission is disabled, as in PRACTICE mode, then this button is BLUE. In practice mode, this action emulates the normal sending out of the product via the AWIPS WAN, the receipt of the product via the SBN, and -the running of the VTEC Decoder.   +the running of the VTEC Decoder.
        -The saved draft is put into the ifpServer TEXT/DRAFT directory and is +The saved draft is put into the EDEX +/awips2/edex/data/utility/cave_static/site/SITE/gfe/drafts directory and is named via the Definition['awipsWANpil'] contained in the product -definition.  The saved information consists of the product text -and the product definition.  The product definition contains +definition. The saved information consists of the product text +and the product definition. The product definition contains important attributes for the product, such as line length and segment -expiration time characteristics.   The ifpServer monitors +expiration time characteristics. EDEX monitors incoming VTEC notifications and compares them to the contents of the draft products and invalidates the draft products if there is a match; this prevents the loading of a draft that might contain invalid VTEC -and then transmitting a product with invalid VTEC.  Loading a +and then transmitting a product with invalid VTEC. Loading a draft that has been invalidated will result in the editor being disabled and a message indicating that there is a possibility of invalid VTEC so the product must be regenerated.

        Once the draft is saved, the same forecaster or different forecasters -may load the draft into their product editor.   Loading a +may load the draft into their product editor. Loading a draft is accomplished by selecting Products -> XXX in the Formatter Launcher, where XXX is the product name, to create the product -pane.  Then the forecaster clicks on the Load Draft (LoadDraft) button and the previously saved text and its product definition are loaded into the editor.
        diff --git a/cave/com.raytheon.viz.gfe/help/GFEMainMenu.html b/cave/com.raytheon.viz.gfe/help/GFEMainMenu.html index 7294248051..046608dab2 100644 --- a/cave/com.raytheon.viz.gfe/help/GFEMainMenu.html +++ b/cave/com.raytheon.viz.gfe/help/GFEMainMenu.html @@ -11,13 +11,12 @@ vlink="#551a8b">

        GFE Main Menu

        -January 27, 2009
        +February 15, 2012

        This document describes the main menu of the GFE (Graphical Forecast Editor).
        -main menu
        +main menu

        Table of Contents

        GFE @@ -45,7 +44,7 @@ and ifpIMAGE Files...
           Define Time Ranges
        -   Exit GFE +   Site Activation
        WeatherElement
        @@ -151,9 +150,6 @@ Official...
        Verify
        -    Daily Forecast -Critique -
           Procedures
        Hazards
        @@ -167,8 +163,11 @@ Practice Table
           Online Table Of Contents...
        -   About... -

        +   Show Tool Tips +
        +   About CAVE +
        +   Workstation

        GFE Menu

        @@ -229,16 +228,15 @@ performing an Edit Action. The possible options are Magnitude Only, Direction Only, or Both. The default is as set for WindEditMode in the gfe configuration -file.  This may also be set from the Vector PickUp Dialog.

        Smoothing Algorithm

        Allows the user to control the amount (area) of smoothing.  The popup menu items reflect the smoothing influence by the number of grid -cells.  +cells. The Smoothing default value and the selection of values may be configured in the gfe configuration file. @@ -251,7 +249,7 @@ weather/discrete data. Otherwise, the weather/discrete data will be replaced. The default is as set for WeatherDiscreteCombineMode in the gfe configuration -file.  +file. The Weather Combine Mode may also be set from the Weather PickUp Dialog and GFE toolbar stepping buttons or the keyboard -shortcuts.  +shortcuts. When this preference is enabled (i.e., yes), the selection time range will be set to: @@ -286,8 +284,7 @@ range, and the set of selected weather elements will not change when using the GFE toolbar step buttons and -keyboard shortcuts -. +keyboard shortcuts.

        Auto Save...

        The Auto Save Interval entry brings up the Contour Server Selection Allows the user to choose which algorithm is to be used for the @@ -322,7 +319,7 @@ a simple analysis technique similar to Barnes. Internal SIRS Server The Internal SIRS Server makes grids from contour lines -using  +using the TDL SIRS algorithm as written by FSL for the GFE. @@ -331,11 +328,10 @@ the TDL SIRS algorithm as written by FSL for the GFE. Interpolate Algorithm The Interpolate Algorithm entry brings up the Interpolation -Algorithm Dialog.  This dialog allows the user to select the +Algorithm Dialog. This dialog allows the user to select the appropriate interpolation algorithm for each scalar weather element.

        Viewing Preferences

        Quick View Mode

        @@ -369,27 +365,26 @@ its own pane in the Temporal Editor. The default is as set for TemporalEditorOverlay in the gfe configuration file.

        Temporal Editor Weather Element Mode

        This cascade menu permits choices of "All Weather Elements", "All Weather -Elements w/o ISC", "Fcst Weather Elements",  "Active Weather +Elements w/o ISC", "Fcst Weather Elements", "Active Weather Element", -and "Visible Elements Only".  It controls the set of weather +and "Visible Elements Only". It controls the set of weather elements -that appear in the temporal editor.  Selection of "All Weather +that appear in the temporal editor. Selection of "All Weather Elements" will mirror the weather elements that are loaded into the spatial -editor.  +editor. Selection of "All Weather Elements except ISC" will set the temporal editor to display all weather elements loaded into the spatial editor, except for any ISC elements. Selection of "Fcst Weather Elements" will mirror just those elements loaded into the spatial editor that are mutable, i.e., -from the Fcst database.  Selection of the "Active Weather Element" +from the Fcst database. Selection of the "Active Weather Element" will set the temporal editor to have only the active weather element to be displayed in the temporal editor. Selection of the "Visible Elements Only" will set the editor to only have the visible set of weather @@ -402,28 +397,25 @@ type of statistics that are presented with the range-style visualizations in the temporal editor.

        Time Scale Periods...

        Brings up the Time Scale Displayed Periods Dialog, which permits the user to define which of the named selection time ranges are displayed on the Time -Scale.  +Scale. The initial setting can also be defined in the gfe configuration file entry Time Scale Periods.

        Edit Area Appearance...

        Brings up the Edit Area Appearance Dialog, which permits the user to define a color and a line width for the appearance of the edit area on the spatial -editor.  +editor. The initial setting can also be defined in the gfe configuration file entry Edit @@ -436,7 +428,7 @@ If Show Description is on, then the and Discrete Pick Up Value Dialog will contain additional descriptive information for -each symbol.   In addition to the two dialogs, the Spatial +each symbol. In addition to the two dialogs, the Spatial Editor Color Bar and Temporal Editor Data Pane's MB3 Popup Menu items Set Common Values To, Set Recent Values To..., and Set Session Values To... @@ -454,7 +446,6 @@ automatically displayed in the GFE.

        The Show Edit Action Time Range warning is displayed when the user attempts to edit data over a selected time range which -
        extends over more than one grid. Proceeding at this point will modify more than one grid.

        @@ -467,7 +458,6 @@ will modify data over the entire grid. The defaults are as set for ShowTimeRangeWarning and ShowEmptyEditAreaWarning in the gfe configuration file.

        Break Lock...

        Breaks the lock(s) created by a different user or during a previous @@ -479,14 +469,6 @@ the user to select which lock(s) to break. Users are not required to select a time range prior to breaking locks.
        -  -

        Delete Users...

        -The Delete Users... entry appears only if the GFE is logged on as -SITE.  -Selecting this entry brings up the Delete -Users' Dialog which allows the administrator to remove an user name -from the Start Up Dialog.

        Define Config and ifpIMAGE Files...

        @@ -527,13 +509,10 @@ Brings up the Delete Selection Time Range dialog allowing the user to delete a selection time range. -

        Exit GFE

        -Shuts down the gfe. The Exit -GFE dialog is brought up prior to shutting down if there are any -modified -and unsaved -
        -weather element(s). +

        Site Activation

        +Opens a site activation dialog. Activating a second site allows GFE to +operate as the secondary site. Localization must be in place for the +secondary site to operate correctly.

        Weather Element

        @@ -545,13 +524,12 @@ in the Weather Element Browser, under the browser's File menu. Note that any unsaved (modified) weather elements will not be unloaded when you swich to another weather element group.

        Weather Element Browser...

        Brings up the Weather Element Browser dialog which allows the user to load and unload Weather Elements. -Weather Element Groups can also be saved, deleted,  or loaded +Weather Element Groups can also be saved, deleted, or loaded under the browser File menu. The dialog lower box highlights all the Weather Elements to be loaded. To deselect a highlighted Weather Element, @@ -563,13 +541,12 @@ Elements... Brings up the Manage Hidden Weather Elements dialog which allows the user to display or -unload hidden weather elements.  Hidden weather elements are those +unload hidden weather elements. Hidden weather elements are those that are not seen in the Grid Manager, Spatial Editor, or Temporal -Editor, but yet they exist.  They are created as part of the Show +Editor, but yet they exist. They are created as part of the Show Intersite Coordination and Virtual Parms, as well as temporary weather elements during smart tool execution.

        -


        Populate

        @@ -602,7 +579,7 @@ range with multiple interpolated time blocks aligned with the split boundaries. The "Based On Edited Data" first clears all non-user edited blocks in the -selected time range and then does an interpolate.  The user may +selected time range and then does an interpolate. The user may also select the interpolation interval and the interpolated grid's duration. The Interpolate button brings up the @@ -611,7 +588,6 @@ Dialog. Refer to Interpolation Algorithm to details on choosing the interpolation algorithm.

        Split Grids

        Splits the selected grid block into two or more blocks. The block is split @@ -623,9 +599,9 @@ fragments is determined by the time constraint for the given grid.

        Create Grids From Scratch...

        The create grids from scratch entry brings up the Create -From Scratch Dialog.  The dialog allows for the creation of +From Scratch Dialog. The dialog allows for the creation of multiple -grids over the selected time range.  The user has control over the +grids over the selected time range. The user has control over the creation interval and duration of the grids. The value assigned to the created grids is either the default value, or the current pick-up value. @@ -637,10 +613,9 @@ modifications made to a grid and start over. The default value for a grid corresponds to the minimum value for the given weather element.

        Assign PickUp Value

        -Assigns the current pickup value to the selected grids.  All grid -points within the selected grids will be set to the pickup value.  -The user should first ensure that the appropriate pickup value is set -by +Assigns the current pickup value to the selected grids. All grid +points within the selected grids will be set to the pickup value. +The user should first ensure that the appropriate pickup value is set by using the color bar or by using the Pick Up Value dialog. @@ -652,9 +627,8 @@ defined in the Save Select Time Ranges under the Grids main menu. Selecting one of the Time Ranges listed sets the selected time range to it.

        Select All Weather Elements

        -Selects all loaded weather elements in the Grid Manager.  The -grids -selected also depends on the Selected Time Range. +Selects all loaded weather elements in the Grid Manager. The +grids selected also depends on the Selected Time Range.

        Deselect All

        Deselects all selected grids for all selected weather elements.

        Time Shift...

        @@ -663,14 +637,12 @@ Brings up the dialog allowing the user to either move or copy a selected grid. The grids can be copied/moved either forward or backward. The default is -set -to move. +set to move.

        Find Weather Element

        Lists all the loaded weather elements. Selecting a weather element makes it visible in the Grid Manager or Temporal Editor. If the weather -element -is already visible, nothing is done. +element is already visible, nothing is done.

        Edit

        @@ -721,23 +693,22 @@ to send via ISC.
        Brings up the Request Intersite Grids Dialog allowing the user to freshen the ISC database by obtaining grids -directly -from other sites.
        +directly from other sites.

        ISC Send Enable

        Controls the state of the ISC Transmit capability for this -client.   If the ifpServer isn't configured for sending ISC, -then this menu option will not be available.   If configured, +client. If EDEX isn't configured for sending ISC, +then this menu option will not be available. If configured, then the ISC Send Enable can be turned on or turned off through this -menu item.   A "traffic light" will appear in the lower right +menu item. A "traffic light" will appear in the lower right of the status bar showing the current configuration.

        In order for the GFE to send grid via ISC, the ISC Send Enable must be on, and the ISCxmt traffic light in the status bar appearing -green.   If the ISC Send Enable is off, then the GFE will not -be able to send ISC grids even when the ifpServer is configured for -sending grids on save. 
        +green. If the ISC Send Enable is off, then the GFE will not +be able to send ISC grids even when EDEX is configured for +sending grids on save.

        Products

        @@ -761,7 +732,7 @@ products may be generated. The forecast must be published to the Official database prior to generating products (if the user wants the lastest modified forecast). Text formatters must be properly configured in order for entries to appear in this -dialog.  +dialog. Refer to the Text Formatter's User's Guide for configuration information.

        Scripts...

        @@ -787,8 +758,7 @@ in effect.

        Topography

        Toggles the Topography grid on and off. Toggling the Topography grid -off -unloads it. +off unloads it.

        Samples

        Load...

        @@ -798,8 +768,7 @@ Set dialog listing the sample sets available from the server. Selecting one of the sample sets loads it for display in the Spatial Editor. This dialog allows the user to add to, delete, or replace the previously -loaded -sample set(s). +loaded sample set(s).

        Clear

        Clears the sample set(s) currently displayed in the Spatial Editor.

        Save...

        @@ -819,11 +788,10 @@ by location.

        Show Lat/Lon

        If enabled, the latitude/longitude of the sample points, or roaming sample -will be shown with the data values.  The format is lat/lon. The +will be shown with the data values. The format is lat/lon. The bottommost entry is the latitude/longitude and is always painted in white.

        Show ISC Update Time on Data Samples

        If enabled and in Intersite Coordination Mode or displaying ISC data, the @@ -839,25 +807,18 @@ the Intersite Coordination User's Guide for more details.

        Show ISC Official DB Symbol -on Data -Samples

        +on Data Samples If enabled and in Intersite Coordination Mode or displaying ISC data, a "P" will be appended to the sample points for the underlying data that -came from an Official (published) database. Refer to the Intersite +came from an Official (published) database. Refer to the Intersite Coordination User's Guide for more details.

        -  -

        ISC Markers

        Show ISC Markers

        -This control turns on and off the set of defined ISC Markers.  ISC +This control turns on and off the set of defined ISC Markers. ISC Markers are only visible when displaying ISC data or when in Intersite Coordination Mode. Refer to the Intersite Coordination @@ -878,88 +839,75 @@ If enabled and in Intersite Coordination Mode or displaying ISC data, the originating site for the underlying data will be displayed. Markers are similar to sample points, except that no data values are shown. Refer -to -the +to the Intersite Coordination User's Guide for more details.

        Show ISC Official DB -Symbol -on Marker

        +Symbol on Marker If enabled and in Intersite Coordination Mode or displaying ISC data, a "P" will be appended to the sample points for the underlying data that came from an Official (published) database. Markers are similar to sample -points, except that no data values are shown. Refer to the Intersite +points, except that no data values are shown. Refer to the Intersite Coordination User's Guide for more details.
        -  -

         Map List

        +

        Map List

        Lists all the available maps. If the map button is checked on, the map is displayed. Clicking on a map that is already loaded will unload it -and -remove -
        -if from the Spatial Editor display. +and remove if from the Spatial Editor display.

        Edit Areas

        This menu lists the edit areas by Edit Area Group. To load an edit area, -simply choose it from the cascading menu.  +simply choose it from the cascading menu.

        Verify

        -Daily Forecast Critique

        -The Daily Forecast Critique entry launches a new application which is -used -to display comparison information between observations and -forecasts.  -For this to function appropriately, the Daily Forecast Critique package -must be configured properly.  Refer to the Daily -Forecast Critique User's Guide and Daily -Forecast -Critique Configuration Guide for more details.

        Procedures

        Lists the Procedures available. Selecting a procedure runs it.


        Hazards

        Procedures

        -Lists the Procedures available. Selecting a procedure runs it.  +Lists the Procedures available. Selecting a procedure runs it. The standard procedures provided under "Hazards" are used in creating -the Hazards grid.  These are MakeHazard, SeparateHazards, -MergeHazards, PlotTPCEvents, and PlotSPCWatches.
        +the Hazards grid. These are MakeHazard, SeparateHazards, +MergeHazards, PlotTPCEvents, PlotSPCWatches, and ViewWCL.

        Reset Practice

        This menu only appears while in GFE Practice Mode.

        Clear VTEC Practice Table

        -This option is only available while in GFE Practice Mode.  It +This option is only available while in GFE Practice Mode. It immediately clears, i.e., empties, all entries in the VTEC active table -used for PRACTICE mode.   It does not affect the operational -VTEC table.   The primary use for this capability is to reset +used for PRACTICE mode. It does not affect the operational +VTEC table. The primary use for this capability is to reset the VTEC active table to a known state.

        Clear Fcst Grids

        -This option is only available while in GFE Practice Mode.  It +This option is only available while in GFE Practice Mode. It breaks all existing locks in the Prac_Fcst database and then removes -all grids.  It does not affect the operational Fcst database.
        +all grids. It does not affect the operational Fcst database.


        Help

        Online Table Of Contents...

        Brings up a Netscape page with links to online help. -

        About

        +

        +Show Tool Tips

        +Activates tool tips when a screen item is rolled over with the mouse. +

        About CAVE

        Brings up the About Dialog which lists general build and server information. +

        Workstation

        +Where CAVE is running.


        -Return to Table of Contents +Return to TOC diff --git a/cave/com.raytheon.viz.gfe/help/GFEStartup.html b/cave/com.raytheon.viz.gfe/help/GFEStartup.html index f8f4abf662..a6c0052491 100644 --- a/cave/com.raytheon.viz.gfe/help/GFEStartup.html +++ b/cave/com.raytheon.viz.gfe/help/GFEStartup.html @@ -10,7 +10,7 @@

        GFE Startup Information

        -December 16, 2005
        +February 16, 2012

        Table of Contents

        @@ -21,14 +21,10 @@ Table of Contents

        Command Line Options


        -runGFE [-h hostname] [-p portNumber] [-c configFile] [-u userName] -[-t networkTimeout] [-m mutableModel] [-z drtTime] [-f specialMode] -[-a] -[-i -dbCategories]
        -  +cave.sh [-server hostname:port/services] [-mode TEST|PRACTICE|OPERATIONAL] [-site xxx] +[-u user] [-component componentName] [-perspective perspecitiveName] [-noredirect] +[-consoleLog]

        -  @@ -37,103 +33,48 @@ dbCategories]
        - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - + + + + + + + + + + + + + + + + + @@ -141,11 +82,13 @@ GFE is started in TEST mode and cannot be switched to another mode.


        Standard Startup of GFE

        -GFE is normally started with just the runGFE script and no -switches.  -When this is done, the GFE begins and contacts the -ifpServer.   If the ifpServer cannot be connected -successfully, an error dialog is presented to the user.
        +GFE is normally started with the appLauncher menu activated by +clicking anywhere on an AWIPS workstation desktop.

        +

        To start GFE +via the command line execute the /awips2/cave/cave.sh script with the +switch -component GFE. +When this is done, the GFE begins and contacts EDEX. If EDEX cannot +be contacted successfully, an error dialog is presented to the user.

        Meaning
        -h hostname-server hostname:port/services YESIdentifies the hostname upon which the ifpServer is -running.  -During installation, this value is automatically set, but may be -overridden.Overrides the hostname and port settings in the localization preferences.
        -p portNumber-mode TEST|PRACTICE|OPERATIONAL YESIdentifies the RPC portnumber upon which the ifpServer is -running. -During installation, this value is automatically set, but may be -overridden.Causes CAVE to be started in the specified mode. OPERATIONAL by default.
        -c config-site xxx YESIdentifies the gfe configuration file to use for the session. -If the --u  and -c switches are specified, then the startup dialog will -not -contain entry boxes for the user to choose the config file.
        -u usernameYESSpecifies the user id to be used for the GFE session.  -This affects -the availability of metadata to the GFE.  See the base, -site, and user configuration guide for details.  If the --u  -and -c switches are specified, then the startup dialog will not contain -entry boxes for the user to choose the username.
        -t networkTimeoutYESNormally defaults to 60 seconds.  In heavy network -situations, -may need to increase this value to prevent the GFE/ifpServer from -timeouts.
        -m mutableModelYESThe mutable model is stored in the gfe configuration -file.  It -can be overriden through this switch.  Note that the format is in -the form of type_model or type_model_time, such as "_Fcst" or -"_NAM_20021002_1200.
        -z drtTimeYESThe GFE may be started in the Displaced -Real Time Mode
        +
        Overrides the localization site preference setting forcing CAVE to start as the specified site.
        -f specialMode
        -
        YES
        -
        By default, this switch is not -provided.   If provided, will bring up the GFE in a special -mode.   The two special modes supported are TEST -and PRACTICE.  -These modes are product-generation specific. 
        -
        -i dbCategories-u user YESThe database viewable categories are stored in the gfe -configuration -file.  It can be overriden through this switch.  Note that -the -format does not normally include the time.  The normal format is -type, -such as "" for no-type or "D2D" for d2d-type databases.  There can -be multiple -i switches.
        +
        Overrides the user workstation login with the specified user id. Note: SITE is NOT a user id in AWIPS2.
        -a
        -
        YES
        -
        Force AWIPS mode.  If this -switch is set, then the -f switch determines the only possible modes -that are available to choose from.  For example, with -f TEST and -no -a switch, the GFE is started in TEST mode but can be switched to -PRACTICE or OPERATIONAL mode.  With the -f TEST and -a switch, the -GFE is started in TEST mode and cannot be switched to another mode.
        +
        -component componentNameYESUsed to start specialized CAVE sessions like textWS, avnMenu, ServiceBackup, etc.
        -perspective perspecitiveNameYESCauses CAVE to start in the specified perspective, i.e, GFE, D2D, etc. No perspective + buttons will be displayed. You must use the CAVE->Perspective menu to change perspectives.
        -noredirectYESCauses stdout and stderr to not be redirected but instead display in the terminal window + for debugging use.
        -consoleLogYESCauses the CAVE log to be output to the console for monitoring/debugging.
        @@ -160,92 +103,69 @@ successfully, an error dialog is presented to the user.


        In normal situations once the server has been contacted, the user is -presented with the GFE start up -dialog.  -The known list of user names will appear in the left listbox. The user -can click on an existing name in the list, or add a new -name -by typing the user name identifier in the entry field.  Once a -user -name has been selected, the GFE will query the ifpServer and determine +presented with the GFE start up dialog. +GFE will query EDEX and determine the available list of configuration files that are available to the -user.  -The standard "gfeConfig" is shipped with the system.  The site may -have overridden it and user's may override them too.  See the base, -site, user concepts guide for information.   The gfe +site, user concepts guide for information. The gfe configuration -file can be tailored to the site's or user's needs.  See the gfe configuration guide for details. The user selects the appropriate configuration file from the -list.  -The user is not allowed to enter a new configuration file since the gfe +list. +The user is not allowed to enter a new configuration file since gfe requires an existing configuration file to start.
        -
        -The third column is the GFE mode.   It defaults to the modes -specified by the command line switches.  If no mode is specified -via the command line, the mode is set to "operational".   The -user can change the mode to "test" for product live comms testing, or -one of the two practice modes.  Refer to the Special -GFE Startup Modes for TEST and PRACTICE.


        -

        The user positions the cursor over the START button and -clicks.  -The GFE will now start and just the splash screen will be shown:
        +

        The user positions the cursor over the Ok button and +clicks. +GFE will now start and just the splash screen will be shown:



        -If the GFE does not come up properly, ia -bad configuration file is likely the cause and a dialog shows the -location of the error:
        -

        -


        +If the GFE does not come up properly, a +bad configuration file is likely the cause.


        Special Configuration Files

        -The GFE comes with some special +GFE comes with some special configuration files which can be used to modify special grids. If a GFE -is started as the SITE user using one of these files, then various -special +is started using one of these files, then various special weather elements can be edited.

        EditTopo

        -Starting the GFE as the SITE user with this config file (runGFE -u SITE --c EditTopo), allows for the editing of the topo grid.  You can -also -use the standard startup runGFE, and enter EditTopo into the -configuration -column of the startup dialog. +Starting the GFE with this config file allows for the editing of the topo grid. You can +use the standard startup, and enter EditTopo into the configuration +entry field of the startup dialog.

        Once the GFE is running, there will be no weather elements appearing -in the grid manager.  One weather element will be loaded, of a -persistent -nature, into the spatial editor.  This element is called Topo SFC -Topo_EditTopo.  You can edit the topography and once saved, the -remainder +in the grid manager. One weather element will be loaded, of a persistent +nature, into the spatial editor. This element is called Topo SFC +Topo_EditTopo. You can edit the topography and once saved, the remainder of the GFESuite system will see the modified topography when those -programs -are started.
        +programs are started.



        Special GFE Startup Modes for Test and Practice

        -The GFE may be started with three special modes.  These modes -allow for product testing and GFE practice.  This section defines +The GFE may be started with three special modes. These modes +allow for product testing and GFE practice. This section defines the behavior of the GFE in these modes.

        TEST mode

        -Starting the GFE with a -f TEST -switch will place the GFE in TEST mode.  All products issued in -this mode will be issued with TEST mode enabled.   The +Starting the GFE with a -mode TEST +switch will place the GFE in TEST mode. All products issued in +this mode will be issued with TEST mode enabled. The forecaster edits a Test database instead of a Fcst database, thus no impact is made on formal operations.

        Test mode on products means that products that normally have VTEC will have the "T" code enabled, regardless of the definition in the VTECMessageType file (as long as there is a definition for the product -in the VTECMessageType file).   Test products mean that the +in the VTECMessageType file). Test products mean that the MND header will contain the "...TEST..." and so will any headlines in the product.

        @@ -261,25 +181,25 @@ database, thus no impact is made on formal operations.
      • The VTEC "active" table is used since these products can be transmitted.
      • The enabled VTEC modes specified in VTECMessageType is used only -to determine if VTEC is enabled or not for a product.  If a +to determine if VTEC is enabled or not for a product. If a product does not normally -contain VTEC, then in TEST mode no VTEC will appear.  However, if +contain VTEC, then in TEST mode no VTEC will appear. However, if vtec is enabled for a product, that vtec mode is switched to "T" mode.
      • The background color of the GFE is changed, to make it clear to -the forecaster that they are in a special mode.   The word +the forecaster that they are in a special mode. The word TEST is placed in the window manager title.

      • An example of the GFE in TEST mode is shown below:

        TEST mode
        + src="images/GFETestMode.png" style="width: 790px; height: 645px;">

        PRACTICE mode

        -Starting the GFE with a -f PRACTICE -switch will place the GFE in PRACTICE mode.  In this mode the +Starting the GFE with a -mode PRACTICE +switch will place the GFE in PRACTICE mode. In this mode the following characteristics are changed:
        • The forecaster edits a Practice database instead of a Fcst @@ -291,21 +211,21 @@ database, thus no impact is made on formal operations.
        • with real operations.
        • The ability to store products in the AWIPS text database and transmit them is not available, although the GUI will still -exist.  The Transmit GUI will clearly indicate that the transmit +exist. The Transmit GUI will clearly indicate that the transmit is being simulated.
        • A special Formatting entry appears on the Formatter Launcher to -allow the forecaster to select the type of practice formatting.  +allow the forecaster to select the type of practice formatting. Choices range from the 3 operational VTEC modes and no VTEC for operational/normal wording, and two choices for test wording (with and without VTEC).
        • The background color of the GFE is changed, to make it clear to -the forecaster that they are in a special mode.   The word +the forecaster that they are in a special mode. The word PRACTICE is placed in the window manager title.
        The background of the GFE in Practice mode appears orange:
        Practice Mode
        + src="images/GFEPracticeMode.png" style="width: 790px; height: 645px;">


        diff --git a/cave/com.raytheon.viz.gfe/help/GFESuite.html b/cave/com.raytheon.viz.gfe/help/GFESuite.html index 3b8d7e9bad..7c12d34fa9 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuite.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuite.html @@ -17,7 +17,7 @@ Documentation Guides
        Main Documentation Page
          -

        +


          diff --git a/cave/com.raytheon.viz.gfe/help/GFESuiteConfiguration.html b/cave/com.raytheon.viz.gfe/help/GFESuiteConfiguration.html index 3f233e3283..3875dfc36c 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuiteConfiguration.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuiteConfiguration.html @@ -6,7 +6,7 @@ - GFESuite Documentation + GFESuite Documentation - Configuration
        @@ -49,8 +49,8 @@ domains, resolutions
        + src="images/isc_thumb.jpg" nosave=""> - - - - + style="border: 0px solid ; width: 800px; height: 23px;"> - - - + +
        GFESuite GFE Configuration GFE Configuration - configuration @@ -72,16 +72,10 @@ of appearance of user interface and weather elements
        Intersite/Intrasite Coordination of Grids Configuration
        Daily Forecast Critique's -Configuration
        - GFESuite Documentation + GFESuite Documentation - GFESuite Dialogs

        GFESuite Dialogs

        - diff --git a/cave/com.raytheon.viz.gfe/help/GFESuiteDoc.html b/cave/com.raytheon.viz.gfe/help/GFESuiteDoc.html index 1a71b3cffc..6b74795bad 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuiteDoc.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuiteDoc.html @@ -1,4 +1,4 @@ + src="GFESuite.html" name="right"> diff --git a/cave/com.raytheon.viz.gfe/help/GFESuiteGFEConfiguration.html b/cave/com.raytheon.viz.gfe/help/GFESuiteGFEConfiguration.html index 5973a9a875..31759c5099 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuiteGFEConfiguration.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuiteGFEConfiguration.html @@ -6,7 +6,7 @@ - GFESuite Documentation + GFESuite Documentation - GFE Configuration
        @@ -41,11 +41,10 @@ configuration file.


        -

         Back To Top +

         Back To TOC

        +

        diff --git a/cave/com.raytheon.viz.gfe/help/GFESuiteOtherPgms.html b/cave/com.raytheon.viz.gfe/help/GFESuiteOtherPgms.html index f08b315cb8..12390e3481 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuiteOtherPgms.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuiteOtherPgms.html @@ -6,7 +6,7 @@ - GFESuite Documentation + GFESuite Documentation - Other Programs
        @@ -29,11 +29,6 @@ guides:   - - - - @@ -56,22 +51,6 @@ guides: nosave="" height="115" width="115"> - - - - - - - - - - - - - - - - - - - @@ -143,10 +104,8 @@ save, retrieve, inventory, or delete smart tools, procedures, text products, utilities, and gfe/ifpIMAGE configuration files from the command line. Edit areas, sample sets, color tables, weather element groups, and select time -range -definitions may also be saved and retreived.  Map background -inventory -and data is accessible through ifpServerText. +range definitions may also be saved and retreived. Map background +inventory and data is accessible through ifpServerText. @@ -155,8 +114,8 @@ and data is accessible through ifpServerText. style="width: 262px; height: 142px;">
        @@ -194,37 +153,14 @@ active table.
        - - - - - - - - - -
        ifpServer Startup Information
        Break All Locks
        coordinate conversion routine -(used -to help determine domain location)
        -
        ifpServerStats (used to -output network, -database sizes, and BASE/SITE/USER configuration data)
        nosave="" height="142" width="250"> getNotify (diagnostic program to "watch" -notifications from the ifpServer to the clients). Simply outputs the +notifications from the awips qpid server to the clients). Simply outputs the received notifications for database inventory, grid inventory, sample set, edit area, text data, and user messages.
        Daily Forecast Critique User's Guide -describes -how to use the DFC capability of GFESuite.
        -
        publishGFE can be used to -publish grids -from the command line
        -

        sendGfeMessage is a utility -to send a message to all connected ifpServer clients, such as -GFEs.  The message will appear in the status bar.
        +to send a message to all connected EDEX clients, such as +GFEs. The message will appear in the status bar.


        ghETN
        -
        ghETN -is a utility used by non-GFE programs to get the highest ETN for a -particular phen/sig.
        -

        -
        makeD2DFile
        -
        makeD2DFile -is a utility that creates netCDF file of GFE grids in D2D format.
        -

        -


        -

        Back To Top +

        Back To TOC
        -  -

        +

        diff --git a/cave/com.raytheon.viz.gfe/help/GFESuiteReference.html b/cave/com.raytheon.viz.gfe/help/GFESuiteReference.html index e7376ed2f6..fc8085bd92 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuiteReference.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuiteReference.html @@ -6,7 +6,7 @@ - GFESuite Documentation + GFESuite Documentation - GFESuite Reference
        @@ -45,23 +45,23 @@ options, button bar actions, and the message status bar.
        Main Menu
        Button Bar
        Status BarAlertViz

        -
          +

        User Interface Dialogs


        @@ -114,11 +114,9 @@ Mode

      -

       Back To Top +

      Back To TOC
      -  -

      +

      diff --git a/cave/com.raytheon.viz.gfe/help/GFESuiteServerConfiguration.html b/cave/com.raytheon.viz.gfe/help/GFESuiteServerConfiguration.html index 92ab34d649..60075bde16 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuiteServerConfiguration.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuiteServerConfiguration.html @@ -10,13 +10,12 @@
      -

      GFESuite -ifpServer Configuration Guide

      +

      GFESuite Configuration Guide



      -
      The GFESuite ifpServer Configuration Guide -describes the various methods to configure the ifpServer.
      +
      The GFESuite Configuration Guide +describes the various methods to configure GFE.

      @@ -25,7 +24,7 @@ describes the various methods to configure the ifpServer.
      @@ -91,11 +90,9 @@ configuration.
      - - + @@ -104,11 +101,9 @@ file convention.



      -

       Back To Top +

       Back To TOC
      -  -

      +

      diff --git a/cave/com.raytheon.viz.gfe/help/GFESuiteTraining.html b/cave/com.raytheon.viz.gfe/help/GFESuiteTraining.html index 7a5237837a..b02aebe001 100644 --- a/cave/com.raytheon.viz.gfe/help/GFESuiteTraining.html +++ b/cave/com.raytheon.viz.gfe/help/GFESuiteTraining.html @@ -6,7 +6,7 @@ - GFESuite Documentation + GFESuite Documentation - Training
      @@ -15,8 +15,7 @@ Guide
      The GFE Training Guide describes how to use the -Graphical Forecast -Editor.   +Graphical Forecast Editor. It takes you through the basic features and provides exercises for you to complete.  This guide is divided into different sections.  We recommend that you use them in the following order: @@ -27,7 +26,7 @@ We recommend that you use them in the following order:
      General Description General description describing -how the ifpServer is configured.
      +how GFE is configured.
      Description -of ifpServer -required netCDF -FormatDescription of the "D2D" netCDF + Description +of EDEX required HDF5 FormatDescription of the "D2D" hdf5 file convention.
      + src="images/gfeMainMenuSmall.jpg" nosave="" align="middle" height="200" width="268">



      -

      Back To Top +

      Back To TOC
      -  -

      +

      diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerAppearance.html b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerAppearance.html index 0122155ade..938f4b554a 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerAppearance.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerAppearance.html @@ -6,27 +6,25 @@


      Normal Display Mode
      -History Display Mode 
      +History Display Mode
      Last Saved, Modified, Published, Sent Display Modes


      The figure below is an annotated screen snapshot of the Grid Manager in normal display mode. Each major part is labeled and then -decsribed in the table below. These terms will be used throughout this +described in the table below. These terms will be used throughout this guide, so you should familiarize yourself with them.
       

      Grid Manager Component Descriptions - Normal Display Mode

      +
        -  @@ -85,7 +83,7 @@ be assigned. @@ -1212,21 +1215,21 @@ always fixed at 0 minutes.
        Identifies the origin and source of the grid, and -whether it has been modified.  The origins of the grid include +whether it has been modified. The origins of the grid include "Interpolated", "Populated from model", "Created from scratch", "Calculated", and "Other".
        @@ -162,12 +160,12 @@ you have edited (but not yet saved) and are hence locked by you. Component Descriptions - History Display Mode The figure below is an annotated screen snapshot of the Grid Manager in -history display mode.  The Grid Manager may be toggled between +history display mode. The Grid Manager may be toggled between normal -display and history display using the  -button on the toolbar.  Try toggling the Grid Manager into History +display and history display using the +button on the toolbar. Try toggling the Grid Manager into History Mode and observe the color scheme which indicates the source of the grids. @@ -183,7 +181,7 @@ the grid colors and patterns are used for different purposes as shown in the table below.  There is no indication of the editable grid or visible -grids. +grids.
        @@ -192,26 +190,26 @@ grids. - - @@ -225,13 +223,11 @@ e.g., Interpolated grids are blue, Calculated grids are red.

        Grid Manager Component Descriptions - Last Saved, Modified, Published, Sent Modes

        The figure below is an annotated screen snapshot of the Grid Manager in -Last Saved mode.  The Grid Manager may be toggled between normal -display and other modes using the  -button on the toolbar.  Try toggling the Grid Manager into Last +Last Saved mode. The Grid Manager may be toggled between normal +display and other modes using the +button on the toolbar. Try toggling the Grid Manager into Last Saved ("Saved") and observe the color scheme which indicates the last -time the grids were saved.  A table exists in the gfe +time the grids were saved. A table exists in the GFE configuration that defines the time thresholds and the colors to use.
        @@ -239,7 +235,7 @@ configuration that defines the time thresholds and the colors to use.

        The labels within each grid block -indicate the time since the grids were saved.   There are +indicate the time since the grids were saved. There are several different "Last" modes available as shown in the following table.

        @@ -250,7 +246,7 @@ table.
        @@ -258,15 +254,15 @@ been modified but not yet saved, the grid will be gray.
        @@ -275,7 +271,7 @@ publishing, the grid is no longer considered published and is shown as +unchanged. @@ -107,13 +105,13 @@ When using these operations, keep in mind that they apply to a single grid (or place-holder for a grid) - the grid under the cursor - when you perform -the operation.  Operations include deleting, fragmenting, +the operation. Operations include deleting, fragmenting, splitting, copying, and pasting a grid.  Other edit operations permit assigning values to a grid, creating a grid from scratch, and running selected smart -tools on the grid.  Refer to the Grid Manager Button 3 Popups documentation for more details.

        @@ -126,7 +124,7 @@ left of the GFE ToolBar. These buttons control various display modes of the Grid Manager and Spatial Editor, as well as -specifically controlling the layout of the GFE.  Refer to the GFE Toolbar documentation for more details. diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingGridMgr.html b/cave/com.raytheon.viz.gfe/help/GFETrainingGridMgr.html index fde1995a03..a3c1160ce3 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingGridMgr.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingGridMgr.html @@ -5,13 +5,13 @@ content="text/html; charset=iso-8859-1"> - + GFE Training - Grid Manager

        Grid Manager Training Guide

        -
        April 8, 2004
        +
        January 19, 2012



        @@ -37,10 +37,6 @@ Weather Elements

        Grid Manager Operations - - - -

        diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntro.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntro.html index 0825b9c5ed..b38c7d45f5 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntro.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntro.html @@ -5,14 +5,14 @@ content="text/html; charset=iso-8859-1"> - + GFE Training - Introduction

        GFE Training Guide

        -
        February 18, 2004
        -

        Forecast Systems Laboratory

        +
        January 10, 2012
        +

        Raytheon

        Introduction
        @@ -30,7 +30,7 @@
        Temporal Editor
        -Status Bar +AlertViz


        Introduction

        @@ -41,18 +41,18 @@ edit gridded fields of sensible weather elements. While this training guide describes most of the functionality within the GFE, it is not comprehensive. -Its purpose is to familiarize  users with GFE concepts and tools +Its purpose is to familiarize users with GFE concepts and tools in order that they might use the GFE to generate gridded forecast products. -

        This training guide is divided into several sections.  If you +

        This training guide is divided into several sections. If you are new to the GFE , it is recommended that you follow the guide in the proper order, since terms and concepts learned in the beginning are used throughout -the guide.  This section is intended to get you familiar with the -major components of the GFE.  More detailed descriptions of each +the guide. This section is intended to get you familiar with the +major components of the GFE. More detailed descriptions of each component can be found in subsequent sections.
        @@ -60,12 +60,12 @@ can be found in subsequent sections.

        The figure below labels the major components of the GFE. -Since the names  of these various components will be used +Since the names of these various components will be used throughout this guide, it is a good idea to familiarize yourself with them now.
        -
          +

        -
        +
        diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroButtonBar.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroButtonBar.html index c4ac20fcf3..7f30190fdb 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroButtonBar.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroButtonBar.html @@ -4,7 +4,7 @@

        Button Bar


        -
          diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGFEComponents.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGFEComponents.html index 2d7ffb2e10..b0aad0d052 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGFEComponents.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGFEComponents.html @@ -34,10 +34,10 @@ Displays and edits one or more grids. point or area. This area is shared with the GridManager.
        -Status Bar - Displays status messages. -There are actually two status bars, the left one for general GFE -messages, -and the right one for Intersite Coordination and Smart Initialization +AlertViz - Displays status messages. +In AWIPS2 AlertViz is used to display alert messages for all AWIPS components. +There are actually two status bars. In GFE, the left one is for general messages, +and the right one is for Intersite Coordination and Smart Initialization messages. \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGridManager.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGridManager.html index 7b5fb5b578..a5197e6f05 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGridManager.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroGridManager.html @@ -4,7 +4,7 @@

        Grid Manager


        The Grid Manager is arguably the most complex component of the -GFE.  +GFE. Its display presents an inventory of the gridded data in the forecast, official or any other model database. With the Grid Manager you can copy @@ -12,15 +12,15 @@ all or a portion of another database into your forecast, temporally interpolate time periods to fill in undefined gaps in your forecast, remove grids from -your forecast, and many other operations too numberous to mention -here.  +your forecast, and many other operations too numerous to mention +here. The Grid Manager looks complex because it displays a large amount of information and offers a long list of features that help you manipulate the gridded forecast data. While it's appearance can be intimidating, once you have performed the exercises and understand how each of the features work, you -will understand that it is necessarily complex.  Refer to the Grid Manager Training Guide for more details.

        Below is a snapshot of the Grid Manager component of the GFE along @@ -28,7 +28,7 @@ with labels that name its various parts.

        Grid + height="335" width="479" align="middle">
        Grid Manager in Normal Display Mode
        diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroMenuBar.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroMenuBar.html index 7d52bbef21..c58dc1572e 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroMenuBar.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroMenuBar.html @@ -5,12 +5,9 @@


        The Main Menu Bar menu's are described in the Main -Menu Reference Guide. The various menus allow you to set viewing -and +Menu Reference Guide. The various menus allow you to set viewing and editing preferences, define configuration files and tools, load and -unload -weather elements, control the map backgrounds, do grid-based edit -operations, -and handle product generation. +unload weather elements, control the map backgrounds, do grid-based edit +operations, and handle product generation. \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroSpatialEditor.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroSpatialEditor.html index 94897297e2..b8e8d7af41 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroSpatialEditor.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroSpatialEditor.html @@ -6,12 +6,12 @@

        The Spatial Editor allows you to edit the values of any grid in the -forecast database using a number of different tools.  Some of the +forecast database using a number of different tools. Some of the tools are interactive while others work in more of a batch mode. The multi-colored area at the top is the color bar that shows the relationship between color -and value.  To learn more, go to the section entitled Spatial Editor.
        diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroStatusBar.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroStatusBar.html index 81521bd643..749ec5253e 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroStatusBar.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroStatusBar.html @@ -1,17 +1,15 @@ -GFESuite Documentation - GFE Training Guide - GFE Status Bar +GFESuite Documentation - GFE Training Guide - AlertViz -

        Status Bar

        +

        AlertViz


        -

        The Status Bar is at the bottom of the GFE and is used to report -routine, -significant, and urgent messages.  There are two parts of the -status -bar, one for general GFE messages and one for ISC and Smart -Initialization -status messages. The status bar also consists of an area displaying the -current GFE time, as well as a progress bar.  Refer to the Status -Bar documentation for more details. +

        AlertViz replaces the Status Bar in AWIPS2. It is shared among all +visualization components and displayed separately from CAVE. For GFE, it +is used to report routine, +significant, and urgent messages. There are two display areas in AlertViz, +one for general GFE messages and one for ISC and Smart Initialization +status messages. GFE time display and progress bar have been moved to the +bottom of the GFE CAVE display. Refer to the AlertViz +documentation for more details. \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTemporalEditor.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTemporalEditor.html index 7b0ca7ba98..d3d13277c6 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTemporalEditor.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTemporalEditor.html @@ -10,7 +10,7 @@ you specify and allows you to edit several grids with a single edit operation. When used properly, the Temporal Editor can save you much time during the -editing process.  To learn more about this powerful tool, go to +editing process. To learn more about this powerful tool, go to the section entitled Temporal Editor. diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTimeScale.html b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTimeScale.html index c787be87d4..3bca8e4ef2 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTimeScale.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingIntroTimeScale.html @@ -10,8 +10,8 @@ Editor) and shows you the time period over which the every grid is valid. In addtion, it contains a small green triangle that indicates the current -time.  The yellow dotted line displays the current Spatial Editor -Time and the blue hatching shows the Selected Time Period.   +time. The yellow dotted line displays the current Spatial Editor +Time and the blue hatching shows the Selected Time Period. User-defined time periods are shown at the very top of the time scale. Refer to the Grid Manager Training Guide diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditor.html b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditor.html index ec62e6ba48..1de0e24b8c 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditor.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditor.html @@ -12,26 +12,21 @@

        Spatial Editor Training Guide

        -
        May 13, 2004
        +
        January 13, 2012


        Spatial Editor

        The Spatial Editor displays one or more grids in -plan-view format.  This editor allows you to modify individual +plan-view format. This editor allows you to modify individual grid points using a number of tools, built-in to the GFE and tools that you -write yourself.  Before you start any exercises using the Spatial -Editor, it is very useful to know how -to control the Spatial Editor display .

        -Controlling -the Spatial Editor +write yourself.

        Edit Tools

        Color Bar

        -

        Status Bar +

        AlertViz

        Behavior of the GFE in ISC (Intersite @@ -42,8 +37,6 @@ Visualizations

        - - diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorColorBar.html b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorColorBar.html index 9500416ba4..b1759c5b5c 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorColorBar.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorColorBar.html @@ -6,21 +6,21 @@

        The Color Bar is location at the top of the Spatial -Editor display.  It displays the relationship between the color of +Editor display. It displays the relationship between the color of the currently displayed image and the weather element value just like the -D2D system.  In addition, it has a tool that allows you to set the -current Pickup value.  This value is used for edit operations such -as Assign Value and Add New Contour.  Any click or drag operation +D2D system. In addition, it has a tool that allows you to set the +current Pickup value. This value is used for edit operations such +as Assign Value and Add New Contour. Any click or drag operation with either MB1 or MB2 causes the Pickup value to change to the value under -the cursor.  This value is displayed on the Color Bar in large +the cursor. This value is displayed on the Color Bar in large white -numbers with a black background.  Try clicking or dragging on the +numbers with a black background. Try clicking or dragging on the Color Bar with MB1 or MB2 and watch the Pickup value change.

        Several other Color Bar options are available via MB3 pop-up menu over -the Color Bar.  Examples of these options are setting the pickup +the Color Bar. Examples of these options are setting the pickup value, delta value, fitting the color bar spectrum to the data, and changing the diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorControllingtheSpatialEditor.html b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorControllingtheSpatialEditor.html index d3e88d0967..00bb9f8c8b 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorControllingtheSpatialEditor.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorControllingtheSpatialEditor.html @@ -65,18 +65,18 @@ weather element is displayed as an image and which is currently editable. We discuss each state below. -

          +

        Not Displayed - Weather elements that are not currently visible in the Spatial Editor are displayed in gray. If no grid occurs at the Spatial editor time, the legend date and time are replaced by "<No Grid>".
        -
          +

        Displayed as a Graphic - Weather elements that are currently displayed as a graphic (contours) are indicated by a legend whose color matches that of the graphic.
        -
          +

        Displayed as an Image - If a weather element is displayed as an image in the spatial editor, its corresponding legend is white in @@ -87,20 +87,20 @@ display a particular weather element as an image, any element previously displayed as an image will be displayed as a graphic.
        -
          +

        Editable - Any time a weather element is editable, the characters -"(edit)" appear immediately to the left of the legend.
        -
        In addition to its color, the legend text tells you +"(edit)" appear immediately to the left of the legend. +In addition to its color, the legend text tells you much about the grid(s) currently displayed in the Spatial Editor. Below we list an example and explain each part.
        -
          +

        (edit) T Fcst (BOU) 1H Fri 12Z 02-Jun-00
        -
          +

        (edit) - This weather element is the editable weather element. When edit operations are executed, the element is modified.
        @@ -111,13 +111,13 @@ it refers to Temperature.
        SFC Fcst - The name of the database. In this case it is the forecast database. Other choice may include: NAM, MRF, AVN, -NGM, -and LAPS.  For D2D grids, the name may include the level as well +GFS, +and LAPS. For D2D grids, the name may include the level as well (e.g., 500mb).
        (BOU) - WFO over which this grid is valid.
        -(F) - units of this weather element. In this case degress F.
        +(F) - units of this weather element. In this case degrees F.
        1H - Number of hours this grid is valid. In this @@ -133,13 +133,12 @@ Although Topography is a persistent grid, it will not contain the "Persistent" label.

        Legend Pop-up Menu

        Much like the D2D display system, the GFE Spatial Editor Legends provide -many option for controlling the display.   To display the +many option for controlling the display. To display the pop-up menu, move the cursor over any legend and press MB3. The options available @@ -158,7 +157,7 @@ grid, fragmenting it, assigning values, and copy/paste operations. href="Button3Popups.html#Legend">Button 3 Popups Reference Guide .

        +

        Toggling the Legends

        @@ -186,22 +185,21 @@ them again select Legends->Show All Weather Elements from the MB3 pop-up over the Spatial Editor display.
        -
          +

        -The map background graphics may be toggled on and off as well.  -By default, map background graphic legends are not displayed.  You +The map background graphics may be toggled on and off as well. +By default, map background graphic legends are not displayed. You can display them by pressing MB3 over the Spatial Editor display and selecting Legends->Show Map.  Note that either the Weather Element legends or the Map Background legends may be displayed at any given time, but not both.

        There are several other options available when toggling the -legends.  +legends. You can choose to just display the Fcst weather elements, or just the active weather element.

        Map Background @@ -209,17 +207,17 @@ Options

        Once you toggle the map legends so that they are displayed you may change -the map color or unload the map via a MB3 pop-up menu.  To access +the map color or unload the map via a MB3 pop-up menu. To access these options, move the cursor over one of the map legends and press and -hold MB3.  Options available include changing the graphic color, +hold MB3. Options available include changing the graphic color, line -width, style, and unloading the map background.  More information +width, style, and unloading the map background. More information is available on the legend pop-ups in the Button 3 Popups Reference Guide .

        +

        @@ -231,9 +229,8 @@ very much like the AWIPS. The table below describes functions implemented by the legends (in the normal Grid display mode).


        Solid colorGrid has not been modified by you or anyone else.  + Grid has not been modified by you or anyone else. Grid has been -either interpolated, 
        +either interpolated, created from scratch, or populated from a model.
        Hatching pattern Indicates that the grid has been modified by you or -someone else.  -If properly configured, 
        -the  pattern can indicate whether the grid was modified by you, +someone else. +If properly configured, +the pattern can indicate whether the grid was modified by you, or whether someone else has modified it.
        ColorIndicates the origin and source of the grid.  Each + Indicates the origin and source of the grid. Each model source -can be assigned a unique color, e.g., 
        -NAM can be yellow while grids populated from MRF can be green.  -Each origin's color can also be set, 
        +can be assigned a unique color, e.g., +NAM can be yellow while grids populated from GFS can be green. +Each origin's color can also be set, e.g., Interpolated grids are blue, Calculated grids are red.
        Save
        Indicates the time since the -grid was saved to the database by any user.   If a grid has +grid was saved to the database by any user. If a grid has been modified but not yet saved, the grid will be gray.
        Modified
        Indicates the time since the -grid was modified by any user.   A grid can be modified, but -not saved.   A grid can be saved, but not modified.
        +grid was modified by any user. A grid can be modified, but +not saved. A grid can be saved, but not modified.
        Published
        Indicates the time since the -grid was published.   Once a grid is modified after +grid was published. Once a grid is modified after publishing, the grid is no longer considered published and is shown as "gray".
        Sent
        Indicates the time since the -grid was sent out via intersite coordination.  Note that if you +grid was sent out via intersite coordination. Note that if you publish to official and then send the Official grids out via ISC, the Fcst grids will not indicate that its grids were sent (since they really weren't).
        diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerLoadUnloadWeatherElements.html b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerLoadUnloadWeatherElements.html index 92b2c7ea34..80e2e003bc 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerLoadUnloadWeatherElements.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerLoadUnloadWeatherElements.html @@ -7,7 +7,7 @@

        Load/Unload Weather Elements


        Load/Unload Weather Elements -viaWeather +via Weather Elements Groups
        Create a new Weather Element diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerOperations.html b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerOperations.html index 9944fe4e15..bedb4cc61e 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerOperations.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerOperations.html @@ -79,12 +79,12 @@ time period for that pane now becomes selected. Using this method, you can select the same time period for many different weather elements.

        There is also a way to extend the currently selected TimeRange by performing -a MB1-SHIFT click operation anywhere on the Grid Manager.  Hold +a MB1-SHIFT click operation anywhere on the Grid Manager. Hold down the shift key while clicking MB1. The currently selected TimeRange will -be extended to the time on which you SHIFT-clicked.  If you +be extended to the time on which you SHIFT-clicked. If you SHIFT-MB1-click -insider the currently selected TimeRange it will have no effect.  +insider the currently selected TimeRange it will have no effect. This works for any WE pane or the TimeScale.

          @@ -94,9 +94,7 @@ pop-up menu. Note that your previously selected Weather Elements/ Time Ranges are now deselected.
        1. Select another set of Weather Elements over any time period.
        2. -
        3. Next, press the button Deselect all  +
        4. Next, press the button Deselect all in the button bar to deselect. Note that you can deselect the set of Weather Elements from both the button bar and the pop-up menu.
        5. @@ -189,7 +187,7 @@ forecast (except Wx).
        6. From the main menu bar, select Grids->Interpolate... The Interpolate -Dialog is displayed.  Choose "By Gaps" and click on OK.
        7. +Dialog is displayed. Choose "By Gaps" and click on OK.
        You should see new grids that appear and fill in the @@ -313,7 +311,7 @@ you are extending the end time of the grid forward in time (right) or extending the start time backwards in time (left). There is no way to directly shrink -a grid block in time.  An indirect method is to Split the grid, and then delete the unneeded grid.
        Repeat this exercise, but this time stretch the grid @@ -405,18 +403,18 @@ popup.
      • Purpose: Divide a grid into two or three separate grids.
      • -
          +

        The Split operation is used to divide a single grid into two or three parts in time. The resulting parts may then be edited independently, providing -more temporal detail to the forecast.  This particular split +more temporal detail to the forecast. This particular split operation is invoked from the GFE main menu by selecting
        -Grids->Split Grids.  There is another Spilt Grids operation +Grids->Split Grids. There is another Spilt Grids operation that -can be executed from the MB3 Pop-up menu as well.  See the section +can be executed from the MB3 Pop-up menu as well. See the section
        Split Grids to learn how to split grids using the MB3 Pop-up option.
        @@ -467,13 +465,13 @@ grid.  If you
        select just a portion of the grid, only that portion will be -fragmented.  -Each of the grids has the same gridded values as the original.  +fragmented. +Each of the grids has the same gridded values as the original. The -result should look something like this:  

        Another technique can be used to fragment a single grid from the MB3 -Pop-up menu.  See the section on the Grid Manager Button 3 Pop-up options for more information on how to Fragment @@ -488,9 +486,9 @@ situation.

        1. Select one or more grids using the MB1 drag operation.
        2. -
        3. From the main menu select Grids->Assign Pickup Value.  +
        4. From the main menu select Grids->Assign Pickup Value. Note -that the menu doesn't actually say "Pickup Value".  The actual +that the menu doesn't actually say "Pickup Value". The actual pickup value is displayed instead of the words.
        @@ -545,10 +543,8 @@ Temperature = -60 F).
        Note that the Assign Default Value operation is also available from the MB3 pop-up menu in the Grid Manager, but as with all MB3 pop-up menus the operation applies only to the grid under the -cursor, -not to the set of selected grids. -

        To quickly set the  value of a single grid to the default -value, +cursor, not to the set of selected grids. +

        To quickly set the value of a single grid to the default value, use this technique:

          @@ -569,6 +565,5 @@ These tools are described in the Intersite Coordination Training Guide.
          -  diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerTool.html b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerTool.html index e96b7bff0e..6be516a9f2 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerTool.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingGridManagerTool.html @@ -5,10 +5,8 @@

          Grid Manager Tool

          Grid Manager Pop-up Menu
          Grid Manager Buttons

          The Grid Manager contains many functions to manipulate whole grids, but generally not the gridded values inside them. Using @@ -67,9 +65,9 @@ invisible.
        MB2 Click Sets the Spatial Editor time and makes the selected grid visible and -editable in the Spatial Editor.  The visibility of other grids +editable in the Spatial Editor. The visibility of other grids remains -unchanged. 
        @@ -90,7 +88,7 @@ weather elements
        Stretches the selected grid's start time to the left -or the grid's end time to the right.  Allow the user to change the +or the grid's end time to the right. Allow the user to change the valid time of a grid.
        - + @@ -1121,8 +1127,8 @@ records arrive.
         
        Action
        @@ -393,20 +390,22 @@ of the data and map backgrounds. Repeat the last exercise and select the highest value in the list to zoom out to full view.
        -

        A shortcut for Zooming

        +

        A shortcut for Zooming

        + Another, faster way to zoom the Spatial Editor display is to press the -SHIFT key on the keyboard and click MB2 to zoom in and MB1 to zoom out. +SHIFT key on the keyboard and click MB2 to zoom in. In AWIPS1 MB1 was used +to zoom out. In AWIPS2 for now you have to roll MB2 in to zoom out. Zooming in always uses the clicked point as the new center of the -display. +display. Panning has to be activated for zooming capabilities to work.

        Panning the Spatial Display

        -Panning the display works similarly. While holding down the SHIFT key, -MB1 or MB2 drags will pan the display in the same direction, just like -the D2D display. Note that if you move the cursor outside the Spatial +Panning the display works similarly. Rolling +MB2 in or out will pan the display in the same direction, just like. +Note that if you move the cursor outside the Spatial Editor display area, the pan operation stops. To continue panning, you will need -to reposition the cursor, press SHIFT, and drag MB1 or MB2 again.
        +to reposition the cursor, and roll MB2 again.

        Topography

        diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorEditTools.html b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorEditTools.html index 1f6cfdb2e9..ba1c38ce73 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorEditTools.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorEditTools.html @@ -25,20 +25,20 @@  
        Nearly all of the spatial editor tools use edit areas to determine which grid points to modify. You will need to know how to -define edit areas before using the spatial editor tools.
        +define edit areas before using the spatial editor tools.
        An Edit Area defines a set of grid points. These points may comprise a county, forecast zone, or any random area that you define. They may be saved and recalled later for reuse. In fact, there are two -ways to save edit areas: as an ordinary named set or as a QuickSet.
        +ways to save edit areas: as an ordinary named set or as a QuickSet.
        After you define a edit area you may save it as a named set. The simplest example of this type of edit area is a county. In general, named edit areas are saved once, recalled many times, and not changed very -often.
        +often.
        Another way to save an edit area is as a QuickSet. QuickSets should be considered as a temporary method of saving edit areas as they @@ -48,12 +48,12 @@ perform some operation that requires a different edit area.

        Edit Area Interface

        - -
          + +

        The figure above is a snapshot of the edit area buttons on the Button Bar. The operations include toggling, clearing, doing queries, setting -the edit area mode, and accessing/storing edit areas.  Refer to +the edit area mode, and accessing/storing edit areas. Refer to the GFE Toolbar documentation for more details.
        @@ -64,7 +64,7 @@ can recall a previously saved set, define a new edit area by hand, or execute a query that defines the set based on data values of any grid or grids -that you specify.
        +that you specify.
        The simplest method of defining an edit area is to define one by hand. The Select Points tool was designed to allow you to define @@ -78,10 +78,10 @@ an Edit Area from the Main Menu

        Probably the easiest way to load an edit area is from -the Main Menu.  All of the edit areas that correspond to your +the Main Menu. All of the edit areas that correspond to your counties, zones of various kinds, WFOs, and states are generated automatically by -the IFPServer.  You can find them under the Main Menu item Edit +EDEX. You can find them under the Main Menu item Edit Areas.

          @@ -96,8 +96,8 @@ name of your choice] You should see the county you chose highlight in a white stippled -pattern.  -This indicates that this area has been choosen to edit.  Any edit +pattern. +This indicates that this area has been chosen to edit. Any edit operation that you perform will be applied to this area.

        @@ -108,8 +108,7 @@ operation that you perform will be applied to this area.
        1. Make sure that the current edit area mode is set to Replace (=).
        2. -
        3. Select +
        4. Select the Select Points tool.
        5. Move the cursor into the Spatial Editor.
        6. Press MB1 and drag the cursor to outline an area with the mouse. @@ -124,19 +123,16 @@ pattern.
        7. point, you could use one of the edit tools to modify the data over this new area -that you defined. We discuss how to use tools  in the Edit -Tools section.
        -
        Repeat the above exercise, but this time select the -union +Tools section.

        +
        Repeat the above exercise, but this time select the union (|) mode button beforehand. Note that in union (|) mode, each time you -define a new area the old area(s) remains amd is combined with the new -area. Now select the intersection (&)  button and repeat the -exercise +define a new area the old area(s) remains and is combined with the new +area. Now select the intersection (&) button and repeat the exercise again. Note that this time the result is the intersection of the newly defined edit area and the current edit area. Only the areas that -overlap -remain.
        +overlap remain.

        Erase an Edit Area

        Now and then you may want to remove a portion of an @@ -173,20 +169,19 @@ displayed edit area. When you toggle the current edit area, all the grid points that were selected are deselected and all the points that were previously -not selected become selected.
        +not selected become selected.
        Create an edit area by hand as you did in the exercise named, Define Edit Area by Hand , using -the  +the  Select Points Tool
          -
        1. Using MB1 click on the Toggle Button.
        2. +
        3. + Using MB1 click on the Toggle Button.
        Note that all the grid points that were selected have -been deselected and vise versa.
        +been deselected and vice versa.

        Clear an Edit Area

        @@ -201,12 +196,12 @@ and create a new one. The clear button was made for this purpose.
        1. Make sure there is an edit area displayed in the Spatial Editor.
        2. Using MB1 click on the button  -.
        3. + src="images/clearEa.jpg" align="middle">. +
        The edit area has been cleared and no grid points are -selected.
        +selected.
        A couple of handy utilities can be found on the MB3 pop-up menu over the spatial editor, one that selects a contiguous edit area @@ -218,8 +213,7 @@ contiguous edit area. We discuss these in the next two sections.
        Area based on Value
      • Purpose: To select an edit area based on value.
      • -
        +
        This function allows you to select an edit area based on the value of the selected point and the value of the points surrounding @@ -249,15 +243,14 @@ Editor display and press MB3 and select Set Fuzz Value... This will display the Fuzz -Value Dialog . +Value Dialog.
      • Change the Fuzz Value so that it is two to three times larger than its current value.
      • Select OK in the Fuzz Value dialog.
      • Repeat steps 2-4 above, and note that the edit area is larger, since -the -fuzz value is now larger.
      • +the fuzz value is now larger.
        The fuzz value is meaningless for the Weather data type. @@ -291,25 +284,22 @@ save an edit area in a temporary location as a QuickSet.
        1. Define an edit area as you did in any previous exercise.
        2. -
        3. Find the quick set store button  +
        4. Find the quick set store button in the group of edit area buttons on the right side of the toolbar -click -with MB1.
        5. -
        6. Move the mouse cursor over one of the numbered buttons     +click with MB1.
        7. +
        8. Move the mouse cursor over one of the numbered buttons   +   +   + and with MB1 click any one of them.
        Now your edit area is saved under that particular slot and can be recalled at any time. The next exercise shows you how to -recall -a saved QuickSet.
        +recall a saved QuickSet.

        Loading a QuickSet

        Purpose: To restore a previously saved QuickSet
        @@ -318,22 +308,21 @@ a saved QuickSet.
      • Clear the edit area, if there is one currently displayed in the Spatial Editor.
      • -
      • Find the same button     +
      • Find the same button     + under which you saved the QuickSet in the previous exercise.
      • Click MB1 on this button.
      • Note that the edit area that you saved as a QuickSet is now displayed.
        -
        To review, clicking the button  -and then a button labeled with a number saves +
        To review, clicking the button +and then a button labeled with a number saves the currently displayed edit area under that slot. Simply clicking the number displays that edit area. QuickSets are intended for @@ -348,22 +337,22 @@ them as a "named" edit area.
        Edit Area Groups
        Since the list of Edit Areas can be very long (well over -100), the GFE provides you with a way to organize them.  Any Edit +100), the GFE provides you with a way to organize them. Any Edit Area that you define can be saved under any combination of edit area -groups.
        +groups.

        The GFE provides two ways to assign a particular Edit Area under one or more Edit Area Groups. One way is to assign the group(s) when you initially save the EditArea. The other method is to first save the Edit Area without assigning any group and then use the Save -Edit Area Groups Dialog to assign Edit Areas to Edit Area Groups.
        +Edit Area Groups Dialog to assign Edit Areas to Edit Area Groups.
        To assign a group to your Edit Area as you are saving -it,  follow the instructions in the section for Saving Named Edit Areas , but this time select or type in the Edit Area Group(s) -before you click "Save."  That operation will not only save your +before you click "Save." That operation will not only save your Edit Area, but also assign it to the group or groups that you selected before @@ -373,16 +362,16 @@ area, it will automatically be assigned to the "invisible" group "Misc". The only Edit Areas that are contained in the group "Misc" are those that -have not been assigned to any other group.  Once you assign an +have not been assigned to any other group. Once you assign an Edit Area to a group, it will no longer appear under the "Misc" group name in -the Edit Area Query Dialog.
        +the Edit Area Query Dialog.
        Now let's assume that you've saved some Edit Areas but -not yet assigned them to any groups.  To simply assign Edit Areas +not yet assigned them to any groups. To simply assign Edit Areas to groups, use the Save/Delete Edit Area Groups dialog found within the -Edit Area Query dialog under the "File" menu item.  Here's an +Edit Area Query dialog under the "File" menu item. Here's an exercise that steps through this process.
      • Purpose: To save assign an Edit Area to a group name
      • @@ -404,33 +393,33 @@ Group.
        Now when you use the Edit Area Query Dialog, those Edit -Areas will appear under the  group to which it was assigned.  +Areas will appear under the group to which it was assigned. If you want to make a new group name, just type the new name in the box -labelled "Identfier" and a new group name will be created.
        +labelled "Identfier" and a new group name will be created.

        To remove an Edit Area from a group, bring up the Delete -Edit Area Group Dialog again.  Note that when you select any +Edit Area Group Dialog again. Note that when you select any Edit -Area Group, the  Edit Areas in that group automatically -highlight.  +Area Group, the Edit Areas in that group automatically +highlight. To remove one or more of the Edit Areas from the selected group, simply toggle them off and select "Save".

        Loading Named Edit Areas

        -
      • Purpose:  To display a named edit area
      • +
      • Purpose: To display a named edit area
      • Once you have saved an edit area as a named set, you will want to load it as the current edit area. The next exercise explains how to do this.
        -
        Select the Clear button  +
        Select the Clear button to clear the Spatial Editor of any current edit areas.
          -
        1. Select the button  +
        2. Select the button from the toolbar.
        3. Once the Query @@ -448,8 +437,7 @@ named area, depending on the edit area mode.

          Saving Named Edit Areas

          Purpose: To save the current edit area as -named -set
          +named set

        There are some edit areas that you will want to save permanently as named sets rather then temporarily as QuickSets. This exercise @@ -469,27 +457,24 @@ database. Note that the GFE will automatically generate Edit Areas based on map data -for your local area.  For example, in the Edit -Area Query Dialog , you should see each one of your counties and +Area Query Dialog, you should see each one of your counties and zones -listed.  There is no need for you to define these areas since they +listed. There is no need for you to define these areas since they already are defined for you.

        Deleting Named Edit Areas

        -
        Purpose:  To delete a named edit area -from -the inventory
        +
        Purpose: To delete a named edit area +from the inventory

        Occasionally you will want to remove a named set from the edit area inventory. This exercise will show you how to delete a -named -edit area.
        +named edit area.
          -
        1. Select the    -button located on the toolbar.
        2. +
        3. Select the button located on the toolbar.
        4. From the Edit Area Query Dialog , select "Save/Delete" from its menu bar.
        5. @@ -523,8 +508,8 @@ query
        6. Set up the Spatial Editor display so that a temperature grid is displayed.
        7. Carefully examine the range of values on this grid.
        8. -
        9. Select the  +
        10. Select the  Query button from the toolbar.
        11. When the Edit Area @@ -566,12 +551,12 @@ complex query
          1. Clear the current edit area by selecting  + src="images/clearEa.jpg"> from the toolbar.
          2. -
          3. With temperature still loaded, select the  +
          4. With temperature still loaded, select the query button, if the query dialog is not already visible.
          5. -
          6. Type the following into the query box:   Type the following into the query box: (T > 70) & (T < 90)
          7. Select the "Submit" button.
          8. @@ -581,7 +566,7 @@ query button, if the query dialog is not already visible. between 70 and 90 should be selected. This type of query demonstrates how to select -a range of values using queries.  When using the '&' or '|' +a range of values using queries. When using the '&' or '|' operators, you must enclose the surrounding entries with parenthesis.

          @@ -606,9 +591,8 @@ and dewpoint are displayed at the same time. and dewpoint over this area. -
        12. Select the Query +
        13. Select the Query dialog button to display the query dialog.
        14. Use the selectors or type in a query that resembles the following: (T @@ -626,7 +610,7 @@ but use appropriate values for your data set. Once the values fit the data, you should see an area defined that identifies those grid points that satisfy -the expression that you defined.
        +the expression that you defined.
        By this time, you should start to understand why defining edit areas via queries is so powerful. This method allows you to define @@ -641,9 +625,8 @@ tediously define edit areas by hand is greatly reduced. Using queries in this way encourages you to think meteorologically.

        Complex Queries

        -Queries are simply expressed in numerical python.  Thus the +Queries are simply expressed in numpy. Thus the techniques you use to write smart tools and smart @@ -651,7 +634,7 @@ initialization scripts may also be performed in the query engine, just as long as the result is a "mask" representing whether a grid cell is marked -"on" or "off".  Thus, numerical functions may be used as well as +"on" or "off". Thus, numerical functions may be used as well as numerical expressions.

        For example, the following query calculates the dew point depression @@ -670,29 +653,29 @@ T_SFC_BOU_GRID__NAM_20030314_1200) > 4

        The above query also introduces the concept of performing queries on -non-Fcst database grids.  There are several more convenient +non-Fcst database grids. There are several more convenient formats than that shown above, please refer to the Edit Area and Query Dialog for more details.

        -

        Queries on WEATHER and DISCRETE data are also complex.  The +

        Queries on WEATHER and DISCRETE data are also complex. The Edit Area and Query Dialog provides several shortcuts so you don't need to remember -the specific syntax.  The options permit exact matches or +the specific syntax. The options permit exact matches or "contains" -matches.  For example, you can search for any instance (i.e., any +matches. For example, you can search for any instance (i.e., any coverage, any intensity) of RW (rain showers) using this query:

        mask(Wx, ":RW:")

        Intimate knowledge of the format of the WEATHER "ugly" string makes -this job easier, even though the dialog provides automatic fillin if +this job easier, even though the dialog provides automatic filling if desired.

        The weather query above will match any grid cell that contains any form -of RW.  If you wanted to make an exact match of only the RW, then +of RW. If you wanted to make an exact match of only the RW, then the query would be similar to:

        mask(Wx, "^Sct:RW:-:<NoVis>:\Z", 1)
        @@ -700,16 +683,16 @@ the query would be similar to:

        If you want to select the inverse of an edit area, for example, the opposite of the above statement, then you use the logical_not() -function.  The following selects everything but Sct RW-:
        +function. The following selects everything but Sct RW-:

        logical_not(mask(Wx, "^Sct:RW:-:<NoVis>:\Z", 1))

        Wind queries use the "FROM" -direction.  Wind is presented as a tuple, so if you want to do a -query based on wind speed, use Wind[0].  If you want to do a query -based on wind direction, use Wind[1].  For example, the following +direction. Wind is presented as a tuple, so if you want to do a +query based on wind speed, use Wind[0]. If you want to do a query +based on wind direction, use Wind[1]. For example, the following wind query looks for speeds greater than 25 and directions between NW (325) and NE (45):

        @@ -726,18 +709,18 @@ wind query looks for speeds greater than 25 and directions between NW Saving Edit Area Queries
        Edit Area Queries can be saved just like ordinary "polygon" -queries.  Once you have submitted the query, select the save +queries. Once you have submitted the query, select the save button -to save that query.  Note that it will be saved as a query so that +to save that query. Note that it will be saved as a query so that when you submit it again, the result may be different, depending on the -particular data values on your display.
        +particular data values on your display.

        Important note about Edit Area Queries! Many of the product generation applications accept one or more edit areas as input to allow you to trim the product to a domain of your -choice.  +choice. Unfortunately, these product generation applications cannot accept edit -area queries as input to generate a product.  Edit Areas passed +area queries as input to generate a product. Edit Areas passed into these routines must be "polygon" areas that are defined by boundaries not @@ -752,21 +735,21 @@ future. tool and Pencil tool) require that you first define the set of grid points to which you want the edit operation to apply and then apply the -operation.  +operation. Tools consist of the Select Points, Contour, Pencil, Move/Copy, and -Sample.  +Sample. These tools are selected using the GFE Toolbar and then particular mouse -actions do different editing operations.  Refer to the GFE Toolbar Reference Guide for more details on the mouse button -assignments.   -Also, you can set up keyboard shortcuts for these tools.  (See gfeConfig Keyboard Shortcuts).

        -Select Points Tool

        +Select Points Tool
        • Purpose: To define an Edit Area
        @@ -800,8 +783,8 @@ that you defined earlier is deleted.

        -ContourTool

        +ContourTool
        • Purpose: Modify grid values by drawing and adjusting contours
        • @@ -868,12 +851,12 @@ you command the grid to be recalculated. If you use the adjust operation, however, the grid will be recalculated automatically. Once the grid is recalculated, you can make further modifications and recalculate -again.  +again. Once you are done manipulating the contours, the Button-3 popup menu gives -you the options to Calculate New Grid.  Selecting this options +you the options to Calculate New Grid. Selecting this options will -generate a new grid based on the contours that you just edited.
        +generate a new grid based on the contours that you just edited.

        The Contour Tool works only on weather elements that are of type scalar. For example, you cannot use the Contour Tool to edit @@ -895,12 +878,11 @@ and its corresponding legend in the Spatial Editor should show that the grid is ready to edit.
      • Next, select the Contour Tool icon from the Button Bar. The icon looks -like: 
      • +like:
      • Now, you are ready to draw some contours. Pick a value from the color bar, -located at the top of the Spatial Editor, by clicking MB1 or MB2  +located at the top of the Spatial Editor, by clicking MB1 or MB2 on whatever value you like.
      • Move the mouse cursor over the Spatial Editor. Press MB1 and drag to @@ -921,7 +903,7 @@ bar. Continue defining new contours until (in your best judgement) the contours adequately define the grid. Try to draw the contours so that the edges -touch the sides of the data area, or close the contour on itself.  +touch the sides of the data area, or close the contour on itself. Drawing contours this way yields the best results when the grid is recalculated.
      • Now generate the grid based on your contours by pressing MB3 @@ -937,7 +919,7 @@ that you drew earlier.
        • Purpose: Adjust an existing contour
        • +
        • Purpose: Adjust an existing contour
        The next exercise shows you how to adjust the position of contours that already exist. With the adjust operation, the grid is recalculated @@ -981,9 +963,9 @@ removed contour will not be used in the calculations when converting the contours to a grid. Typically you would remove a few contours before drawing new -ones of a different value and location to replace them.  Note that +ones of a different value and location to replace them. Note that the remove contour function removes the closest contour from the click -point.  If you are not careful to click close to the contour that +point. If you are not careful to click close to the contour that you want to remove, you may remove the wrong one.
        • Purpose: Add a new Contour
        • @@ -1022,7 +1004,6 @@ you switch to a new grid or new weather element. In other words, new contours added this way will persist until you edit a different grid.

          Contour Tool Notes

            @@ -1082,12 +1063,12 @@ field, the more likely that you will be happy with the resulting grid. Sometime the algorithms will produce gridded fields that appear to be noisy. The Smooth edit action will generally remove this noise in the -data.  +data. You will get the best results when you:
            • Draw contours to the edge of the grid or that close in on -themselves.  +themselves. Contours that stop before the edge tend to generate "spikes" near the end point.
            • @@ -1104,10 +1085,10 @@ that will affect the set of contours.
            • Calculate New Grid - Selecting this option will calculate a new -grid based on the contours that you just edited.  In general, only -the area under the modified contours will be modified.  Grid +grid based on the contours that you just edited. In general, only +the area under the modified contours will be modified. Grid values -in areas that you did not modify will not be changed.  So, if you +in areas that you did not modify will not be changed. So, if you are satisfied with the contours in a particular area and you don't change them, they will not be modified.
            • @@ -1116,8 +1097,8 @@ reverse the last contour edit that you made.  If you added a new contour, it will be removed.  -If you deleted a contour, it will be added back.  If you adjusted -a contour, the old contour will be restored.  If  you deleted +If you deleted a contour, it will be added back. If you adjusted +a contour, the old contour will be restored. If you deleted all of the contours with the Delete All Contours operation, all of the contours will be restored to their previous state.
            • Delete All Contours - Selecting this @@ -1132,20 +1113,20 @@ corresponds to the grid value under the cursor. So you may choose to delete all of the contours and then add a few back in areas that you want to preserve the existing gridded data.
            • -
            • Contour Adjust Influence   +
            • Contour Adjust Influence - Selecting this option will cause a cascade menu to appear that lists a set of distances in -kilometers.  +kilometers. Selecting one of these distances will affect the distance over which the -Contour Adjust operation modifies the grid points.  The  +Contour Adjust operation modifies the grid points. The& largest value affects about six times the distance from the new contour poistion than the smallest value.  The Contour Adjust operation and influence -works exactly like the Pencil Tool .  +works exactly like the Pencil Tool. In fact, if you change the Contour Adjust Influence for a particular parameter @@ -1159,7 +1140,7 @@ from the Spatial Editor product labels.

            Pencil Tool

            + src="images/pencil.jpg">
            The Pencil Tool can be thought of as a contour adjustment tool, but it does not actually adjust contours. The Pencil Tool assigns @@ -1216,17 +1197,17 @@ how it works. Note that you are allowed to cross contours.

            Pencil Tool Width

            The  button-3 popup menu contains the option to -change the Pencil Tool Width.  Making this value smaller modifies -a smaller area on either side of the newly modified contour.  +change the Pencil Tool Width. Making this value smaller modifies +a smaller area on either side of the newly modified contour. Making this value larger modifies a larger area on either side of the newly drawn -contour.  To become familiar with this feature, change the Pencil -Tool Width to its smallest value and modify a contour.  Then +contour. To become familiar with this feature, change the Pencil +Tool Width to its smallest value and modify a contour. Then change -it to its largest value and modify another contour.  Note the +it to its largest value and modify another contour. Note the relative -difference in the two operations.    The individual +difference in the two operations. The individual influence sizes can be configured via your GFE configuration file. Note that the Pencil Tool Width is Weather Element dependant.  Changing the @@ -1239,13 +1220,13 @@ a per Weather Element basis.

            Pencil Tool with Active Edit Areas

            To better control changes to your grids, the Pencil Tool operations -are restricted to any active Edit Areas that you have defined.  If +are restricted to any active Edit Areas that you have defined. If there are no Edit Areas active, then the Pencil Tool beahves as if the entire grid is the active Edit Area.  For example, if you first select an edit area and then repeat the exercise above, you will see that any changes that were made are confined to the Edit Area that you -selected.  +selected. The data values are identical to what they would be if no Edit Areas were active, but again changes are restricted to those grid points that lie @@ -1265,38 +1246,38 @@ command Undo Area Edit.

            Note that the Pencil Tool will also work on grids of type vector, such -as wind.  The algorithm is virtually identical except that the +as wind. The algorithm is virtually identical except that the speed and direction are considered as separate components and are recalculated -independently.  Try the Pencil Tool with a wind grid to get an +independently. Try the Pencil Tool with a wind grid to get an idea of how it works on data of type vector.

            The Streamline Tool

            The Pencil Tool works like a streamline editor for a given set of -conditions.  -To use the Pencil Tool as a streamline tool , make a Wind (or any other -vector-type weather element) active.  Then from the main menu +conditions. +To use the Pencil Tool as a streamline tool, make a Wind (or any other +vector-type weather element) active. Then from the main menu select GFE->Editing Preferences->Vector Edit Mode->Direction Only or from the MB3 pop-up menu over the Spatial Editor select Vector Edit Mode->Direction -Only.  +Only. When the GFE is in this mode the Pencil Tool behave line a streamline -editor.  -To use it,  select the tool, press and hold MB1 and drag a line in +editor. +To use it, select the tool, press and hold MB1 and drag a line in the direction you want the wind to blow.  For example, if you drag a line from northwest to southeast, all of the wind values within the Pencil Tool width will now indicate a northwest wind.  Give it a -try.  +try. Note that with a large enough Pencil Width you can draw a circle in a counter-clockwise direction with the tool and create a large cyclonic circulation in the -wind field.  Remember that this tool +wind field. Remember that this tool works only on weather elements of vector type and when the Vector Edit Mode is @@ -1306,7 +1287,7 @@ set to DIrection Only.

            In the case of weather, the Pencil Tool will expand the extent of the -weather/discrete (or No Weather/Discrete) that you select.  When +weather/discrete (or No Weather/Discrete) that you select. When using the Pencil Tool on Weather, you must begin and end the Pencil Tool operation @@ -1322,7 +1303,7 @@ areas of weather using the Pencil Tool

          • Load the "Wx" weather element  into +
          • Load the "Wx" weather element into the GFE (if not already), select a grid and make it editable.
          • @@ -1343,24 +1324,24 @@ area in which you started. Note that you have now defined a new boundary for the weather area in which -you started.  Note that this is not a "paint" operation.  The -Pencil Tool defines a new boundary for the weather area.  +you started. Note that this is not a "paint" operation. The +Pencil Tool defines a new boundary for the weather area. It does not assign values along the draw path like the algorithm that operates -on scalar or vector data.  You can also use the Pencil Tool to +on scalar or vector data. You can also use the Pencil Tool to make -any area of weather smaller.  Simply start in an area that is +any area of weather smaller. Simply start in an area that is defined -as "No Weather" and define the new boundary.  If the line you draw +as "No Weather" and define the new boundary. If the line you draw crosses into any other weather area, the boundary of that area will -change.  +change. Be sure to end your drag in the same "No Weather" areaas you started. Give -it a try.   Note the change in the weather grid.
            +it a try. Note the change in the weather grid.

            Move/Copy Tool

            + src="images/moveCopy.jpg">
            • Purpose: Adjust the spatial position of grid values
            • @@ -1413,27 +1394,24 @@ it to a new location. Use MB2 if you want to move some feature and fill in the original area with background values.
                -

              Edit Actions 

              -There are many more tools available from the Edit Actions menu.  +

              Edit Actions

              +There are many more tools available from the Edit Actions menu. These edit tools always operate over the currently selected edit area. To use -them, click on the Button Bar button labelled "E" .  The Edit +them, click on the Button Bar button labelled "E". The Edit Action dialog menu will display a list of tools that operate on the currently editable weather element.  Selecting one of these tools will perform -that operation over the edit area that you have selected.  The +that operation over the edit area that you have selected. The four standard tools that work for virtually all weather elements are listed in the table below.

              - - + @@ -1454,28 +1432,24 @@ in the table below. - - -

              -
                  Tool Name  Function Smooth  Smooths out strong gradients

              -

              The Edit Actions dialog also lists the set of Smart Tools that will -edit the currently editable weather element.  Smart Tools will +edit the currently editable weather element. Smart Tools will also -appear on the MB3 pop-up menu over the Spatial Editor.  In +appear on the MB3 pop-up menu over the Spatial Editor. In addition, keyboard shortcuts can be set up for Smart Tools and Procedures (see -gfeConfig Keyboard Shortcuts ).  For more information about +gfeConfig Keyboard Shortcuts ). For more information about Edit -Actions and Smart Tools,  go to the  Smart -Tool Training Guide .

              +Tool Training Guide.

              -Sample Tool 

              +Sample Tool
              • Purpose: Provide a textual representation of grid values
              • @@ -1489,7 +1463,7 @@ of a weather element at a particular location, such as a city. The Sample Tool can also be used to control "Markers", which are mainly used for Intersite -Coordination data.  Markers are similar to Samples, except that +Coordination data. Markers are similar to Samples, except that data values are not shown.
                @@ -1497,7 +1471,7 @@ values are not shown.
              • Make sure that you have at least one grid displayed in the Spatial Editor.
              • -
              • Select the  Sample tool located near the middle of the +
              • Select the Sample tool located near the middle of the button bar.
              • Move the cursor into the display. Press and hold MB1 and drag the cursor @@ -1538,26 +1512,26 @@ from the main menu bar Maps->Samples->Show Lat/Lon. Turning this mode on will cause the samples to display the latitude and longitude always -at the bottom of the sample in the color white.  Turning this mode +at the bottom of the sample in the color white. Turning this mode off will remove the lat/lon display.

                Samples may also be defined by latitude/longitude through the Define -Samples via Lat/Lon Dialog .  This is accessed from the main +Samples via Lat/Lon Dialog. This is accessed from the main menu bar, Maps->Samples->Define Samples via Lat/Lon...

                Samples and Marker options are available from the Maps->Samples -and Maps-> ISC Markers menu.  The user can choose to +and Maps-> ISC Markers menu. The user can choose to enable optional features of the sample points, which include the update time, WFO site identifier, and "P" official database symbol for those data -points.  +points. Markers and Samples differ in the fact that markers do not show data values and are intended for displayof intersite coordination data -status.  +status. Samples display data points. The Sample Tool provides a MB3 popup menu -to add and remove markers.  Markers are not cleared from the Samples->Clear +to add and remove markers. Markers are not cleared from the Samples->Clear menu. Refer to the Intersite Coordination User's Guide for more information. @@ -1566,17 +1540,17 @@ for more information. nosave="" src="images/isc4.jpg" height="432" width="395">Example of regular samples and ISC Markers

                +

                You can save a set of samples after you have defined -them.  Once you have the set of samples just the way you like, +them. Once you have the set of samples just the way you like, select -from the main menu bar, Maps-Samples->Save/Delete...   +from the main menu bar, Maps-Samples->Save/Delete... This will display the Save/Delete Sample Dialog which allows you to assign a name to your sample set.

                Samples are represented with additional information if the GFE is in -"Show ISC Mode".  When "Show ISC Mode". When "Show ISC Mode" is enabled, the sample points may contain update times, site @@ -1586,7 +1560,5 @@ User's Guide for more details.

                - - diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorISCModeBehavior.html b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorISCModeBehavior.html index 4d8b4952a9..414e195eb7 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorISCModeBehavior.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorISCModeBehavior.html @@ -4,10 +4,9 @@

                Behavior of the GFE when in ISC Mode


                -

                When the  button +

                When the  button is pressed, the GFE is put into the ISC (intersite coordination) -mode.  +mode. The data viewed in the spatial editor will be the composite of your forecast data and the adjacent received site's data.  Certain edit tools, diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorStatusBar.html b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorStatusBar.html index cd4ada3c64..e7ab248074 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorStatusBar.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorStatusBar.html @@ -1,18 +1,17 @@ -GFESuite Documentation - Status Bar +GFESuite Documentation - AlertViz -

                Status Bar

                +

                AlertViz


                -

                The Status Bar is located at the extreme bottom of the GFE.  There -are two sections to the status bar; the left displays general GFE -messages +

                The AlertViz in AWIPS2 is a separate program that is shared among +all components of the visualization environment. There +are two sections to AlertViz; the left displays general messages and the right displays Intersite Coordination and Smart Initialization -messages. Each status bar displays the latest status message which can -be one of three types: Regular, Significant, or Urgent.  For more -information on the Status Bar, go to the section entitled Status -Bar . +messages in GFE. Each status bar displays the latest status message which can +be one of three types: Regular, Significant, or Urgent. For more +information on AlertViz, go to the section entitled AlertViz .
                \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorVisualizations.html b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorVisualizations.html index 326dcb99c1..56c868a683 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorVisualizations.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingSpatialEditorVisualizations.html @@ -5,14 +5,12 @@

                Spatial Editor Visualizations


                The following show examples of each of the available visualizations; -the -names of the visualization are those that appear in the Display Attributes Dialog as well as the name in the configurable item we_spatialGraphicType and we_spatialImageType: -
                -  +

                diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditor.html b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditor.html index 932511945d..da1418b18a 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditor.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditor.html @@ -3,7 +3,7 @@ - + GFE Training - Temporal Editor @@ -11,18 +11,18 @@

                Temporal Editor Training Guide

                -
                March 17, 2003
                +
                February 14, 2012

                Temporal Editor

                The Temporal Editor is another editor on the Graphical Forecast Editor (GFE). It presents data as a time-series and provides viewing -and editing capabilities.  Since time series presentations are typically +and editing capabilities. Since time series presentations are typically based on a point, and the GFE uses grids, there must be a mapping between -the grids and the time-series.  The selected area on the spatial editor +the grids and the time-series. The selected area on the spatial editor is sampled and then presented as a time-series. -
                 
                +

                Temporal Editor Appearance

                Temporal Editor Tools diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorAppearance.html b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorAppearance.html index e397df7250..802ba686bf 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorAppearance.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorAppearance.html @@ -11,12 +11,12 @@ time-series represents the average value over an area that you define (the current edit area) as a function of time. An example of the Temporal Editor display can be found below. -

                  +


                The table below briefly describes the components of the Temporal Editor. -
                  +

                @@ -103,21 +103,21 @@ panes.

                To get to the Temporal Editor, select the button in the button bar that -looks like the picture at the right. Toggle Grid Manager/Temporal Editor +looks like the picture at the right. Toggle Grid Manager/Temporal Editor

                When you select this button the Grid Manager will disappear and the Temporal Editor will replace it. To get back to the Grid Manager, just press the same button again. Note that the button will change in appearance each time it is selected. If you see no data displays in the Temporal Editor, use the Select Points tool to define an edit area on the Spatial Editor. -The  edit area that you select in the Spatial Editor is sampled and +The edit area that you select in the Spatial Editor is sampled and averaged to produce the time series display.

                The weather elements displayed in the Temporal Editor depend upon the state of weather elements in the Grid Manager, and the Temporal Editor Weather Element Mode. -

                The different type of visualizations are shown here.  -Several of the visualizations, such as the TimeBar,  +

                The different type of visualizations are shown here. +Several of the visualizations, such as the TimeBar, show the average value as determined from sampling the grid data over the -current edit area.   For WEATHER and DISCRETE type of weather +current edit area. For WEATHER and DISCRETE type of weather elements, the TEColorBar visualization will show the various ratios of different weather and discrete values in the sampling area, as shown below: @@ -126,11 +126,11 @@ area, as shown below: show you data distribution information across the edit area.  The user can control the statistics chosen to be displayed, from absolute maximum/minimum, to moderated values, and to standard deviation values. -

                +

                The TE Statistics Dialog, available from the GFE->Viewing Preferences->Temporal Editor Statistics Mode menu, controls the type of statistics that are presented: -

                +

                \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingDataTemporally.html b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingDataTemporally.html index 6a28f150d1..94d0245d7c 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingDataTemporally.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingDataTemporally.html @@ -64,7 +64,7 @@ lines that display the temporal values and press and hold MB1 and slowly drag horizontally to define a new temperature curve. As you move the cursor to the next data point, it should snap to your cursor position. Each time this happens, you are modifying data in a different grid. Note that you -MUST start the edit operation over one of the displayed values.  Starting +MUST start the edit operation over one of the displayed values. Starting the operation in a gap will not modify any data.

              • @@ -148,7 +148,7 @@ Press and hold down the Shift key on your keyboard.
              • Move the cursor over any wind data point, press and hold MB1 and adjust. -Note that the wind direction is changing while the magnitude remains constant.  +Note that the wind direction is changing while the magnitude remains constant. The wind direction shifts from North clockwise and back to North as you move from the lower extreme of the temporal pane to the upper extreme of the temporal pane.
              • @@ -172,7 +172,7 @@ button down, the tool changes the wind direction.
                Before you begin: Set up your GFE so that the spatial and temporal editors are visible. Load Wx via the Weather Element->Weather Element Browser... dialog. Make sure that the TE Edit Mode: Relative button -is still deselected.
                +is still de-selected.
                  @@ -205,20 +205,20 @@ there were multiple weather types displayed previously, when the MB1 action is executed, all grid points in the edit area will be set to the new value.
                There are several other ways to change the data in the temporal editor -for Wx.  A MB3 popup menu over a data point in the time series will -bring up a menu containing several items.  The items that will edit -the data are Set..., Set to Recent Value..., and Set to Common Value....  +for Wx. A MB3 popup menu over a data point in the time series will +bring up a menu containing several items. The items that will edit +the data are Set..., Set to Recent Value..., and Set to Common Value.... The Set... brings up the Set -Weather Dialog.  The Set to Recent Value brings up a cascade menu +Weather Dialog. The Set to Recent Value brings up a cascade menu of recently set pickup values for weather, and the Set to Common Value... -brings up a cascade menu of commonly set pickup values.  Unlike the +brings up a cascade menu of commonly set pickup values. Unlike the color bar on the spatial editor, these menu entries set not only the pickup value, but also modify the data.

                The set of common weather values are site-configurable through the gfe configuration file's common weather values entry. -
                 

                +
                The temporal Set Value tool does not support drag operations as with the scalar and vector tools. Only MB1 clicks, or selection of a @@ -226,7 +226,7 @@ common value, recent value, or using the Set... will modify data in the Wx pane.

                MB2 click on a weather value in the temporal editor display can also be used to set the pick-up value. -
                  +

                Editing Discrete Data Temporally

                @@ -238,12 +238,12 @@ be used to set the pick-up value.
                Before you begin: Set up your GFE so that the spatial and temporal editors are visible. Load Wx via the Weather Element->Weather Element Browser... dialog. Make sure that the TE Edit Mode: Relative button -is still deselected.
                +is still de-selected.
                1. -Make or find a DISCRETE grid, such as Headlines,  and display it as +Make or find a DISCRETE grid, such as Headlines, and display it as an image in the spatial editor.
                2. @@ -271,13 +271,13 @@ selected in the spatial editor legend. The spatial editor will show you that the area that you selected in Step 2 has been set to this new value.
                There are several other ways to change the data in the temporal editor -for discrete weather elements.  A MB3 popup menu over a data point -in the time series will bring up a menu containing several items.  +for discrete weather elements. A MB3 popup menu over a data point +in the time series will bring up a menu containing several items. The items that will edit the data are Set..., Set to Recent Value..., and -Set to Common Value....  The Set... brings up the Set -Discrete Dialog.  The Set to Recent Value brings up a cascade +Set to Common Value.... The Set... brings up the Set +Discrete Dialog. The Set to Recent Value brings up a cascade menu of recently set pickup values for weather, and the Set to Common Value... -brings up a cascade menu of commonly set pickup values.  Unlike the +brings up a cascade menu of commonly set pickup values. Unlike the color bar on the spatial editor, these menu entries set not only the pickup value, but also modify the data. diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingTemporalDataInRelativeMode.html b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingTemporalDataInRelativeMode.html index 207a7f5095..6e77e57260 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingTemporalDataInRelativeMode.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorEditingTemporalDataInRelativeMode.html @@ -27,7 +27,7 @@ Preferences->Temporal Editor Mode: Relative is on.
                1. -Make or find a temperature grid and display it as an image in the spatial +Make, or find a temperature grid and display it as an image in the spatial editor.
                2. diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorTools.html b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorTools.html index d97cda4a00..00d3f6169a 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorTools.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorTools.html @@ -14,7 +14,7 @@ lists each of the tools, mouse actions, and functions. Note that you do not select a tool icon when using the Temporal Editor as you did with the Spatial Editor since the tool is implied by the specific data type displayed in the data pane. -
                    +
                  @@ -50,7 +50,7 @@ in the data pane. -
                  MB1 Click & Drag 
                  +
                  MB1 Click & Drag
                  @@ -99,20 +99,20 @@ in the data pane.
                  -

                  Button 3 popups are available when using the Temporal Editor tools.  +

                  Button 3 popups are available when using the Temporal Editor tools. Refer to the Button 3 Popup Reference Guide for more details. -
                    +

                  Temporal Editor Scale Tools

                  In addition to the tools that modify data, there's a zoom tool associated with the vertical scale located just to the left of the time series display. The next table shows how you can manipulate the vertical scale with the -mouse.  An exercise follows that will help you familiarize yourself -with the manipulating the temporal editor scale.  Note that the scale +mouse. An exercise follows that will help you familiarize yourself +with the manipulating the temporal editor scale. Note that the scale tools only apply to Scalar and Vector data types. -
                    +
                  @@ -1008,7 +1005,7 @@ segments.
                  @@ -1020,11 +1017,11 @@ times.
                  + + + + +
                  @@ -168,14 +168,14 @@ pane contains some data.
                3. Move the cursor to the cursor to the far left of the Temporal Editor pane -and MB2 click.  Note that the scale zooms in.
                4. +and MB2 click. Note that the scale zooms in.
                5. -Now MB1 click.  Note that the scale zooms out.
                6. +Now MB1 click. Note that the scale zooms out.
                7. -Now MB2 click two or three times.  Then MB1 press and drag up and -down.  Note that the scale and the data pan vertically to match your +Now MB2 click two or three times. Then MB1 press and drag up and +down. Note that the scale and the data pan vertically to match your mouse movements.
                8. diff --git a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorVisualizations.html b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorVisualizations.html index 7ac474f806..6920b76096 100644 --- a/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorVisualizations.html +++ b/cave/com.raytheon.viz.gfe/help/GFETrainingTemporalEditorVisualizations.html @@ -7,7 +7,7 @@ The following show examples of each of the available visualizations; the names of the visualization are those that appear in the Display Attributes Dialog as well as the name in the configurable item we_temporalGraphicType and we_temporalImageType: -
                    +
                  diff --git a/cave/com.raytheon.viz.gfe/help/GFE_SplashScreens.html b/cave/com.raytheon.viz.gfe/help/GFE_SplashScreens.html index 10e9a7c228..440399d537 100644 --- a/cave/com.raytheon.viz.gfe/help/GFE_SplashScreens.html +++ b/cave/com.raytheon.viz.gfe/help/GFE_SplashScreens.html @@ -10,7 +10,7 @@

                  GFESuite Splash Screens

                  The GFESuite Splash Screens are a result of a nation-wide photo contest in which weather service forecasters submitted entries and voted for -their favorites.  The Winners (2 from each region -- except SR +their favorites. The Winners (2 from each region -- except SR where there was a tie) appear randomly 65% of the time.

                  A group of Extra photos also appear 30% of the time weighted by the @@ -27,7 +27,7 @@ ENJOY!!

                  Winners


                  -EntryAR1: Todd Folsey +EntryAR1: Todd Foisy -- Anchorage
                  Location: Chugach Mountains near Girdwood, Alaska, Dec. 06. Girdwood is a quiet ski town @@ -37,7 +37,7 @@ around 700" of snow annually.



                  -EntryAR2: Todd Folsey +EntryAR2: Todd Foisy -- Anchorage
                  Location: Northern Prince William Sound and the Chugach Mountains, Feb. 07. This is where @@ -471,12 +471,5 @@ Location: Near Mystic Lake, Montana

                  The GSD gang and Flatirons
                  Location: Boulder, CO
                  -

                  -


                  -

                  -

                  -


                  -

                  -
                  diff --git a/cave/com.raytheon.viz.gfe/help/GHGMonitor.html b/cave/com.raytheon.viz.gfe/help/GHGMonitor.html index 843db5f269..16d1e35afc 100644 --- a/cave/com.raytheon.viz.gfe/help/GHGMonitor.html +++ b/cave/com.raytheon.viz.gfe/help/GHGMonitor.html @@ -7,7 +7,7 @@

                  GHG Monitor User's Guide

                  -
                  May 25, 2006
                  +
                  March 8, 2012


                  @@ -15,16 +15,16 @@ The GHG Monitor is used to monitor hazards in effect. It consists of a spreadsheet showing various information about each hazard, a map showing the spatial location of each hazard, a text displaying showing the contents of some of the products, and an alert system to inform -forecasters when products are about to expire.   +forecasters when products are about to expire. The user can define various display filters to just show the -information desired, and can save configurations for later use.  +information desired, and can save configurations for later use. The GHG Monitor may be launched either from the command line directly, or from the Products menu on the GFE.

                  The GHG Monitor is based off the VTEC Active Table, which is created by the VTEC Decoder. The active table is used by the GFE formatters to -determine changes in state of VTEC actions and events.  Currently +determine changes in state of VTEC actions and events. Currently the GHG Monitor can only monitor products that are VTEC-enabled.

                  The GHG Monitor is the basis for the GHG Administrative Editor, which @@ -50,7 +50,7 @@ allows an administrator to view and edit the VTEC active table.

                  Command Line and Starting GHGMonitor

                  GHGMonitor may be started through the GFE main menu Products -> GHG -Monitor entry, or directly from the command line.  If started +Monitor entry, or directly from the command line. If started through the GFE, then the GFE startup mode will be sent through to the GHGMonitor, e.g., if the GFE is started in PRACTICE mode, then the GHG Monitor will start in @@ -60,9 +60,7 @@ The command line for GHGMonitor is:

                  ghgMonitor [-h hostname] [-p portNumber] [-u userName] [-t activeTableName]

                  @@ -73,15 +71,15 @@ activeTableName]
                  - - @@ -89,11 +87,11 @@ overridden. - @@ -103,8 +101,8 @@ default, if not specified, is the Linux login account name.
                  @@ -123,7 +121,7 @@ text area, spreadsheet area, and status bar:

                  Main Menu Bar

                  The Main Menu Bar contains common commands used to configure the GHG -Monitor.   Most of the control of the GHG Monitor is +Monitor. Most of the control of the GHG Monitor is performed through the Main Menu Bar entries, with the exception of spreadsheet and map "selections".

                  Display Selector

                  @@ -184,9 +182,8 @@ what hazard the Map selection is showing, as well as Test products.

                  Status Bar

                  The Status Bar consists of the status field, an indicator showing the -name of the current display filter, and the current time -depiction.  The status field works just like the Status Bar in the GFE.
                  +name of the current display filter. The status field works just like +the Status Bar in the GFE.

                  Additional Features

                  The GHG Monitor may be resized.   In addition, the size of @@ -196,7 +193,7 @@ of the monitor.

                  Since there may be a large amount of data in the spreadsheet and text display, scroll bars are provided to scroll around in order to view the -entire spreadsheet.   The map display may also be zoomed and +entire spreadsheet. The map display may also be zoomed and roamed to show additional detail.

                  The current configuration may be "saved", and subsequent restarts of @@ -206,33 +203,33 @@ the GHG Monitor will use the saved configuration.

                  How To Use

                  Once the GHG Monitor is started, it will read the VTEC active table and based on its filtering setup, will display a set of -hazards.   The user can determine the geographical extent of +hazards. The user can determine the geographical extent of any of these hazards simply be clicking on a cell in the -Spreadsheet.  The Map will then identify the affected -zones.   Selecting the Text display will show the captured -text for that hazard.  The user may bring up the display filter +Spreadsheet. The Map will then identify the affected +zones. Selecting the Text display will show the captured +text for that hazard. The user may bring up the display filter dialog to change the hazards that are displayed, and may use the "Columns" pull-down menu to add or remove details about each -hazard.   As the product purge time approaches, the GHG +hazard. As the product purge time approaches, the GHG Monitor alert system will alert the forecaster up to three times.  The alerts consist of highlighting the rows of the spreadsheet based on -the alert level, as well as displaying a "banner" message.  The +the alert level, as well as displaying a "banner" message. The user may click on a zone in the Map display and all hazards that are occurring in that zone will be highlighted in the spreadsheet.

                  The GHG Monitor will automatically update as the hazard state changes -with the arrival of new products.  During the update period, the +with the arrival of new products. During the update period, the watch cursor will be displayed.

                  -All of the menus may be torn-away.  The Display Filter Dialog is -non-modal and may be displayed continuously as changes are made.  +All of the menus may be torn-away. The Display Filter Dialog is +non-modal and may be displayed continuously as changes are made. The Alert Filter Dialog and other dialogs are modal and thus the user must respond to the dialog prior to other operations.

                  The initial state of the GHG Monitor is either the default -configuration, or the previously saved configuration.  Users can +configuration, or the previously saved configuration. Users can configure the GHG Monitor to their tastes, and then save the -configuration.  Each time the GHG Monitor is started (for that +configuration. Each time the GHG Monitor is started (for that user), the saved configuration will be restored.


                  @@ -248,7 +245,7 @@ as exit the GHG Monitor.
                  @@ -256,7 +253,7 @@ section for details on what is saved.
                  @@ -265,7 +262,7 @@ section for details on what is retrieved.
                  @@ -777,18 +774,18 @@ involves selection of a zone on the map display.

                  Map Display and Control

                  The Map Display is used to graphically depict the geographical extent -of a hazard.  The map background type is automatically chosen -based on the set of zones that contain a hazard.  The software +of a hazard. The map background type is automatically chosen +based on the set of zones that contain a hazard. The software will automatically choose the FIPS, Public, Fire Weather, or Marine map -backgrounds.   You can also manually choose a map background +backgrounds. You can also manually choose a map background from the Map menu; however, the only useful purpose of manually chosing a map is to next select a zone to query its hazards.

                  -The map is drawn using shapefile data available from the ifpServer. +The map is drawn using shapefile data available from EDEX. Zones that are your responsibility are drawn with yellow outlines and zones that belong to another WFO are drawn with black outlines.  -The background color of the zone is dark gray.   If a user +The background color of the zone is dark gray. If a user selects a hazard on the Spreadsheet, the corresponding zones will be highlighted using a blue fill color, as shown in the following image:

                  @@ -796,14 +793,14 @@ highlighted using a blue fill color, as shown in the following image:
                  src="images/GHGMonitor9.png" style="width: 502px; height: 318px;">

                  The Map menu may be used to zoom in on the map -background and the scroll bars are used to scroll around the map.  +background and the scroll bars are used to scroll around the map. Resizing the window larger will simply show more of the map until the -entire map is shown, then it enlarges the map.  Resizing the -window smaller will show smaller and smaller sections of the map.  +entire map is shown, then it enlarges the map. Resizing the +window smaller will show smaller and smaller sections of the map. You can restore the "No Zoom" by using the Map -menu.  The menu also provides a toggle to turn on/off the zone +menu. The menu also provides a toggle to turn on/off the zone labels. Examples of the zoomed map with and without labels is shown -below.  Note the spreadsheet display shows the Expired alert for +below. Note the spreadsheet display shows the Expired alert for the FA.A hazard, but the zones appearing in the map belong to the SN.Y beginning at 02z 08-Jan-05:
                  @@ -867,7 +864,7 @@ identified by the selected rows in the spreadsheet.

                  Depending upon your Display Filter settings, additional records may be added to the spreadsheet when -clicking on the map.   The display filter also is used to +clicking on the map. The display filter also is used to determine whether clicking on a map zone will include records that are already expired or are old events.
                  @@ -878,16 +875,16 @@ already expired or are old events.

                  Text Display

                  The Text Display is used in conjunction with Map and Spreadsheet -selections.   If the user clicks on a spreadsheet row, or +selections. If the user clicks on a spreadsheet row, or clicks on a map zone, the appropriate hazards are highlighted in the -spreadsheet.  At the same time, the text display will show the -overview text and segment text relating to those hazards.   +spreadsheet. At the same time, the text display will show the +overview text and segment text relating to those hazards. Scroll bars on the text display permit the user to see the entire set -of text.  Not all products are supported with captured text.
                  +of text. Not all products are supported with captured text.

                  -Only segmented products have overview text.  Overview text is +Only segmented products have overview text. Overview text is defined as the text between the MND header and the first UGC -line.  Segment text is defined as the text within each segment +line. Segment text is defined as the text within each segment between the end of the UGC/Date block and the $$ segment ending characters.

                  @@ -896,24 +893,24 @@ characters.

                  Display Filter

                  -The Display Filter is a very important aspect to the GHG Monitor.  +The Display Filter is a very important aspect to the GHG Monitor. Depending upon the display filter settings, you may end up with just a -few entries, or hundreds of entries on the spreadsheet.  A default +few entries, or hundreds of entries on the spreadsheet. A default display filter is provided with the software and the user can always select the default filter from the Filter -menu.  The Display Filter Dialog is used to define the filter and +menu. The Display Filter Dialog is used to define the filter and it is also accessed from the Filter -menu.  The filtering technique consists of four steps:
                  +menu. The filtering technique consists of four steps:
                  • the raw records are read from the VTEC active table.  These records are organized by hazard and zone, thus a WS.W occupying 10 zones would take 10 records.
                  • the records are consolidated based on the filter -options.   Options such as "Combine GeoIDs" will take +options. Options such as "Combine GeoIDs" will take identical hazards (same start time, ending time, phen/sig, product pil) that are occurring in different zones and combines them into one record.
                  • the remaining records are passed through the display -filter.  Depending upon the current filter settings, filters out +filter. Depending upon the current filter settings, filters out records that are old (i.e., old events), filters out records that belong to another WFO, filters out records based on product pil, or phen/sig.
                    @@ -928,26 +925,26 @@ and then displayed in the spreadsheet.
                  -h hostname YESIdentifies the hostname upon which the ifpServer is -running.  + Identifies the hostname upon which EDEX is +running. During installation, this value is automatically set, but may be overridden.
                  -p portNumber YESIdentifies the RPC portnumber upon which the ifpServer is + Identifies the RPC port number upon which EDEX is running. During installation, this value is automatically set, but may be overridden.
                  -u username YESSpecifies the user id to be used for the GFE session.  + Specifies the user id to be used for the GFE session. This affects the availability of GHG monitor configuration data. See the base, -site, and user configuration guide for details.   The +site, and user configuration guide for details. The default, if not specified, is the Linux login account name.
                  YES
                  Identifies the name of the -active table to monitor.  "" or "active" refers to the normal -active table.  "PRACTICE" refers to the practice active table, +active table to monitor. "" or "active" refers to the normal +active table. "PRACTICE" refers to the practice active table, which is used while in GFE PRACTICE mode.
                  Save Configuration
                  The current configuration is -saved to the ifpServer.  See the configuration +saved to EDEX. See the configuration section for details on what is saved.
                  Load Configuration
                  The saved configuration is read -from the ifpServer.  The changes are made immediately to the GHG +from EDEX. The changes are made immediately to the GHG Monitor. See the configuration section for details on what is retrieved.
                  Default Configuration
                  The default configuration -provided by FSL is loaded.  The changes are made immediately to +provided by Raytheon is loaded. The changes are made immediately to the GHG Monitor. See the configuration section for details on what is restored.
                  This is the GHG Monitor Filter Dialog.  The upper section consists of the listbox -options.   Selecting items from the listbox will change the -filtering.   If a particular column/listbox contains no +options. Selecting items from the listbox will change the +filtering. If a particular column/listbox contains no highlighted sections, it is intrepreted as if all of the sections were -highlighted.  In the example, only the CON, EXA, EXB, EXT, and NEW +highlighted. In the example, only the CON, EXA, EXB, EXT, and NEW actions will be shown in the spreadsheet; all other records will be -filtered out.  All Phen/Sig and Pils will be shown since no -entries are highlighted in those two listboxes.   Buttons at +filtered out. All Phen/Sig and Pils will be shown since no +entries are highlighted in those two listboxes. Buttons at the bottom of each listbox allow quick selection and deselection of all entries.

                  The "Show Current Hazards Only" button will filter the displayed set of entries in the listbox based on those records actually found and is a -quick way to get an overview summary of all hazards.   +quick way to get an overview summary of all hazards. "Current Hazards" are considered those hazards found in the VTEC active table AND those hazards whose ending time or purge time has not yet passed.

                  The "Show Advanced Columns" is intended for advanced users to examine other hazard aspects, such as filtering by geographical id (e.g., -zone), segment number, and ETN number.  The regular user will not +zone), segment number, and ETN number. The regular user will not need this capability, but it is useful for diagnostics.

                  The Record Consolidation section and the Filter Override section @@ -960,15 +957,15 @@ Spreadsheet.

                  -The Record Consolidation section contains four options.  For +
                  +The Record Consolidation section contains four options. For normal use, these options should always be turned on which will -minimize the number of records shown in the spreadsheet.   +minimize the number of records shown in the spreadsheet. Like events will be combined based on the state of the record -consolidation values.  Records that have a different event +consolidation values. Records that have a different event starting or ending time, phen/sig (hazard), originating office WFO, event tracking number, product pil, or issuance time will NEVER be -combined.  The same hazard is identified by the same starting and +combined. The same hazard is identified by the same starting and ending time, the same issuance time, same product pil, originating office, event tracking number, and hazard type (phen/sig).

                  @@ -988,7 +985,7 @@ office, event tracking number, and hazard type (phen/sig).
                  This option attempts to combine all records with the same hazard that differ only by their location -(e.g., zone).  
                  +(e.g., zone).
                  YES
                  This option attempts to combine all records with the same hazard that have different purge times (due -to different segments).   The purge time reflected in the +to different segments). The purge time reflected in the spreadsheet will be the "soonest" or "earliest" of the different purge times.
                  This option attempts to combin all records with the same hazard that may have different action -codes.  When combining action codes, only codes within the same -group will be combined.  For example, CON, EXA, EXB, EXT, NEW all -reflect active hazards and those action codes may be combined.  +codes. When combining action codes, only codes within the same +group will be combined. For example, CON, EXA, EXB, EXT, NEW all +reflect active hazards and those action codes may be combined. records with CAN, UPG, EXP reflect hazards no longer present and those -action codes may be combined.  You cannot combine records with a +action codes may be combined. You cannot combine records with a CON and CAN since they belong in two different action groups.
                  YES
                  @@ -1053,9 +1050,9 @@ spreadsheet that normally would be filtered out:
                  With this option turned off, alerts that have been filtered out will not be shown in the -spreadsheet, although alerts will still occur.  With this option +spreadsheet, although alerts will still occur. With this option turned on, alert records that are filtered out will be automatically -added to the spreadsheet and highlighted.   For example, if +added to the spreadsheet and highlighted. For example, if this option is on and the display filter has WS.W (Winter Storm Warning) turned off, and a WSW product is about to expire, then a WS.W record will appear in the spreadsheet anyway.
                  @@ -1069,17 +1066,17 @@ record will appear in the spreadsheet anyway.
                  With this option turned off, selections made on the map background will only highlight those records already displayed in the spreadsheet that match the -geography.   With the option turned off, the display filter +geography. With the option turned off, the display filter is bypassed when a selection is made on the map background and additional records that reflect hazards in that zone will be added to -the spreadsheet listing.   For example, if this option is on +the spreadsheet listing. For example, if this option is on and the display filter has WS.W turned off, there will be no hazard -records shown in the spreadsheet containing WS.W.  If the user +records shown in the spreadsheet containing WS.W. If the user clicks on a zone that has a WS.W, then the WS.W hazard record for that -zone will be automatically added to the spreadsheet.  Note that +zone will be automatically added to the spreadsheet. Note that "Include Past Events" affects the records in the spreadsheet for the -"map selections".  If set, then any records with the zone selected -will be added to the spreadsheet.  If not set, then only records +"map selections". If set, then any records with the zone selected +will be added to the spreadsheet. If not set, then only records that are currently in effect (i.e., ending time of the hazard has not passed) that contain ongoing actions (NEW, CON, EXA, EXB, EXT) will be shown.
                  @@ -1092,12 +1089,21 @@ shown.
                  With this option turned off, hazard entries in the spreadsheet will not contain any hazard records -that are in the "past".  "Past" is defined as records that have an +that are in the "past". "Past" is defined as records that have an event ending time earlier than the present time.
                  NO
                  Include OrgPil Events
                  +
                  With this option turned off, +hazard entries in the spreadsheet will not contain any OrgPil hazard records.
                  +
                  NO
                  +

                  @@ -1107,10 +1113,10 @@ event ending time earlier than the present time.
        The "Show Advanced Columns" option on the Filter Dialog will add the GeoID, ETN, and Seg -columns.  Normally a user does not filter on these columns, but it +columns. Normally a user does not filter on these columns, but it is useful for diagnostic purposes.

        -The ETN, and Seg columns always show the list of  ETN and segments +The ETN, and Seg columns always show the list of ETN and segments that are contained within the VTEC active table and are updated as new records arrive.
        If the "Show Current Hazards Only" option is enabled, then the listboxes will change to show just -those entries that have been found in the VTEC active table.  In -this case, only the CON and NEW actions were found.  The GeoID +those entries that have been found in the VTEC active table. In +this case, only the CON and NEW actions were found. The GeoID column shows just those zones containing current hazards.

        Remember that filters are set when you turn on "Show Current Hazards @@ -1136,30 +1142,27 @@ Only" and future events may be filtered out.

        The Display Filter offers many choices on filtering which events are to -be seen on the GHG Monitor's spreadsheet.  At any time, the user +be seen on the GHG Monitor's spreadsheet. At any time, the user can save the current state of the filter as a named filter.   Named filters may be loaded, saved, and deleted from the Filter menu.  There is an indicator on + href="#FilterMenu%5C">Filter menu. There is an indicator on the status bar showing the name of the current filter that is in effect.  The indicator shows "<Default>" when the default filter is chosen and "<Initial>" when the initial display filter is loaded.

        Named Display Filters are saved and loaded with the overall GHG -Configuration.  The GHG Configuration may be saved and loaded from +Configuration. The GHG Configuration may be saved and loaded from the File menu.

        Changes in the Display Filter will deselect any Map or Spreadsheet selections that may be present.

        -NOTE: Some displayed "Pil"s may not match the actual product pil.  -This -occurs for hazards that are issued with one PIL and updated/cancelled -using another PIL.  Examples are the Tornado Warning (TO.W) which -is -issued in the TOR product and updated/cancelled in the SVS -product.  -The monitor will show TOR for the updates and cancels.  The +NOTE: Some displayed "Pil"s may not match the actual product pil. +This occurs for hazards that are issued with one PIL and updated/cancelled +using another PIL. Examples are the Tornado Warning (TO.W) which +is issued in the TOR product and updated/cancelled in the SVS +product. The monitor will show TOR for the updates and cancels. The VTECPartners VTEC_MAPPED_PILS entry defines this relationship.


        @@ -1168,9 +1171,9 @@ VTECPartners VTEC_MAPPED_PILS entry defines this relationship.

        Alert Characteristics

        One of the primary purposes of the GHG Monitor is to remind forecasters that products are about to expire and updates/replacements are -necessary.  The GHG Monitor offers three types of alerts: Alert1, -Alert2, and Expired alerts.  The characteristics of these alerts -are set by the GHG Monitor Alert Dialog.   When an alert is +necessary. The GHG Monitor offers three types of alerts: Alert1, +Alert2, and Expired alerts. The characteristics of these alerts +are set by the GHG Monitor Alert Dialog. When an alert is "fired", an alert banner (if desired) is displayed and the affected hazards in the Spreadsheet are highlighted, as shown:

        @@ -1187,18 +1190,18 @@ hazards in the Spreadsheet are highlighted, as shown:
        The Alert Dialog is accessed from the Alert menu.  Through the "Enable Alert1", "Enable Alert2", and "Enabled Expired" checkbuttons, -the user can turn on or off the alerts.  Each of these alert types -also has a "Show Banner" checkbutton.  If enabled, then a banner -alert will be displayed when the alert is fired.  If disabled, +the user can turn on or off the alerts. Each of these alert types +also has a "Show Banner" checkbutton. If enabled, then a banner +alert will be displayed when the alert is fired. If disabled, then only the spreadsheet will be highlighted.

        The Display Filter "Include Alerts" checkbutton needs to be enabled in -order to see all alerts.  Without that checkbutton enabled, it is +order to see all alerts. Without that checkbutton enabled, it is possible that the forecaster may have filtered out the hazards causing the alerts.

        The scales are used to define the number of minutes prior to the -product purge time (expire time) that the alert will trigger.  The +product purge time (expire time) that the alert will trigger. The "Expired" alert type does not permit adjustment of the scale and is always fixed at 0 minutes.

        The "Alert for My WFO Only" checkbutton limits alerts to only my -WFO.  If cleared, then you will receive alerts for products -generated by other WFOs.   The "Alert for TEST Products" +WFO. If cleared, then you will receive alerts for products +generated by other WFOs. The "Alert for TEST Products" indicates whether alerts will be issued for products in the VTEC Test mode.

        The three listboxes define the Actions, Phen.Sig, and Pil for the -alerts.  This allows the user to only alert on certain events.
        +alerts. This allows the user to only alert on certain events.

        Alert criteria is checked once each minute to determine if there are -new events that require alerting.  Once an alert has been +new events that require alerting. Once an alert has been triggered for a particular event, the entry in the spreadsheet will be -changed to that alert color.  If a banner alert was requested, the -banner alert is displayed.   The spreadsheet alert will +changed to that alert color. If a banner alert was requested, the +banner alert is displayed. The spreadsheet alert will continue until either a different alert type is displayed, or until -that record is removed from the spreadsheet.  Records are removed +that record is removed from the spreadsheet. Records are removed from the spreadsheet either manually using the Display Filter, or by new events that supercede the previous event.

        @@ -1244,18 +1247,16 @@ font sizes, colors, and identifying Test products.
        Selecting Appearance -> -Font... will bring up the GHG Monitor Font  -Choice Dialog.   Five choices of font sizes, with the current +Font... will bring up the GHG Monitor Font +Choice Dialog. Five choices of font sizes, with the current font size -are shown.  The user selects the new font, and selects Apply Font. +are shown. The user selects the new font, and selects Apply Font.
        -
        -
        @@ -1279,23 +1280,22 @@ the largest available font:

        To make the font size persistent, be sure to save your configuration -under the File menu.  Refer to the File menu. Refer to the Saving and Loading Configuration section for more details.

        Colors

        The spreadsheet and alert colors may be configured by the user from the -Appearance->Colors menu entry.  The GHG Monitor Color Choice +Appearance->Colors menu entry. The GHG Monitor Color Choice Dialog will be displayed allowing the user to configure seven different -color schemes.  For each scheme there is a Text Color (foreground) -and a Background Color.  The user chooses the Color Scheme to +color schemes. For each scheme there is a Text Color (foreground) +and a Background Color. The user chooses the Color Scheme to modify, then uses the two color choosers to set the color, then uses -"Apply Colors" to make the change.  Refer to the Color Chooser Dialog on how to use the color wheel and hue, saturation, and brightness sliders.

        -
        +

        The various color schemes and their use are:
        @@ -1355,7 +1355,7 @@ cell/row.
        @@ -1365,14 +1365,14 @@ Test Products" option.


        To make the colors persistent, be sure to save your configuration under -the File menu.  Refer to +the File menu. Refer to the Saving and Loading Configuration section for more details.


        Identify Test Products

        The "Identify Test Products" allow the user to highlight Test products -in the Spreadsheet.   Test products are determined solely by +in the Spreadsheet. Test products are determined solely by their VTEC mode.


        @@ -1381,7 +1381,7 @@ The menus provide the capability to Save the current configuration, Load the saved configuration, and Load the Default Configuration. The configuration uses the GFESuite BASE, SITE, User concept, but the user does not have a choice of -names for the configuration file.  There is exactly 1 +names for the configuration file. There is exactly 1 configuration that can be saved for the monitor (per person).

        Upon GHG Monitor startup, the previously saved configuration, if @@ -1401,8 +1401,8 @@ alert types, banner display flags for the three alert types.
        selection criteria, and include flags. The consolidation flags select combining GeoIDs, segments, purge times, and actions. The selection of product pils, originating office identifiers, hazard (phen/sig), and -action codes.  The advanced filtering of segments, etns, and -geographical zones is saved if defined.  The include flags of map +action codes. The advanced filtering of segments, etns, and +geographical zones is saved if defined. The include flags of map selections, alerts, past events, and original pil events are included.
      • Named Filter and their display filter characteristics
        @@ -1416,10 +1416,5 @@ is performed.
      • Identify Test Events mode
      • -
        -


        -

        -
        -
        diff --git a/cave/com.raytheon.viz.gfe/help/GenerateCyclone.html b/cave/com.raytheon.viz.gfe/help/GenerateCyclone.html index 17276ee21b..c8cb6b73a8 100644 --- a/cave/com.raytheon.viz.gfe/help/GenerateCyclone.html +++ b/cave/com.raytheon.viz.gfe/help/GenerateCyclone.html @@ -2,7 +2,7 @@ - + GFESuite Documentation - Generate Cyclone @@ -226,8 +226,9 @@ GUI menu displays immediately and looks like the figure below.

        GenerateCyclone user interface
        + src="images/GenerateCycloneUI.png" name="Graphic1" align="left">
        +
        +



        diff --git a/cave/com.raytheon.viz.gfe/help/GridManagerDialogs.html b/cave/com.raytheon.viz.gfe/help/GridManagerDialogs.html index 4c7dc89e94..54ae5d6d69 100644 --- a/cave/com.raytheon.viz.gfe/help/GridManagerDialogs.html +++ b/cave/com.raytheon.viz.gfe/help/GridManagerDialogs.html @@ -20,11 +20,11 @@ The following dialog is invoked directly or indirectly Grid Manager: Grid Information Dialog The Grid Information Dialog, accessible from MB3 popup over a grid block in the grid manager, displays information about the weather element, grid, -locks, and history.  The "Data Distribution" button will bring up +locks, and history. The "Data Distribution" button will bring up an additional dialog containing information about the data in the grid.

        The dialog is divided into different sections as shown in the following table: -
          +

        Map Selections
        The Map Selection color is shown -in the Spreadsheet and on selected zones in the Map Display.  A +in the Spreadsheet and on selected zones in the Map Display. A Map Selection is made when the user has clicked upon a zone in the map background.
        Test product are displayed in a different color in the Spreadsheet to indicate to the user that this is -a TEST product and not an operational product.  The special +a TEST product and not an operational product. The special appearance of the test products may be disabled using the "Identify Test Products" option.
        @@ -40,7 +40,7 @@ table: - + @@ -51,11 +51,11 @@ Created From Scratch, Other), the original source and valid time of the grid (which will be different from the current weather element and valid time if it was copied/moved or time shifted), whether or not the grid was time shifted, the last time the grid was modified by a user and who modified -it. The "Last Stored" time indicates when this grid was stored into the -ifpServer.  The "Last Published" time indicates when this grid was -published to the official database. +it. The "Last Stored" time indicates when this grid was stored into EDEX. +The "Last Published" time indicates when this grid was published to the +official database. - + @@ -65,55 +65,55 @@ published to the official database. grid was last updated. The history information from each of the ISC sites that make up the ISC grid is also shown. - + - - + - + - - + - - +
        SectionShows the grid valid time, whether it is okay to edit this grid or now, and the current lock state for this grid.
        Weather Element InformationDescribes the weather element.  Displays the name, model, whether +Describes the weather element. Displays the name, model, whether or not it is modified by not saved, whether or not it is mutable, the weather element type, units, grid size, location, and projection, the maximum and minimum allowed values, time constraints, and the descriptive name.
        Weather Element Edit States Describes particular attributes associated with editing of this weather -element.  Displays the fuzz value, discrepancy value, delta value, +element. Displays the fuzz value, discrepancy value, delta value, pick up value, whether the weather element is selected and its selection time range, and the graphical color for this weather element.
        LocksDisplays the current set of locks for this weather element.  The +Displays the current set of locks for this weather element. The locks show the time range for the period(s) locked, and who owns the lock.
        Data DistributionThis dialog shows the data distribution for the grid.  For scalar -and vector it shows the minimum and maximum values.  For weather, +This dialog shows the data distribution for the grid. For scalar +and vector it shows the minimum and maximum values. For weather, it shows the number of gridpoints with each type of weather.
        -
          +


        -
         Back To Top
        +
        Back To Top
        diff --git a/cave/com.raytheon.viz.gfe/help/HazardRecovery.html b/cave/com.raytheon.viz.gfe/help/HazardRecovery.html index 126e3c1eaa..e6cbbf35b0 100644 --- a/cave/com.raytheon.viz.gfe/help/HazardRecovery.html +++ b/cave/com.raytheon.viz.gfe/help/HazardRecovery.html @@ -9,7 +9,7 @@

        HazardRecovery

        Procedure to re-initialize your Hazard grid based on current events

        -May 2, 2006
        +March 8, 20012


        Methodology
        @@ -20,12 +20,10 @@ May 2, 2006



        Hazard recovery should only be used in case your entire hazard grid -is -lost or mangled +is lost or mangled by so many changes that you cannot recover. Attempt to restore from your official @@ -57,7 +55,7 @@ HazardRecovery, a warning dialog will display.

        Upon selecting Ok, your entire -Hazards grid will be deleted, and replaced with the current
        +Hazards grid will be deleted, and replaced with the current hazards found in the active table.


        @@ -65,16 +63,16 @@ hazards found in the active table.
        The Hazard Recovery tool calculates the current set of Hazards in effect (i.e., issued).  It uses the following algorithm:
          -
        • The VTEC active table is retrieved from the ifpServer.
        • +
        • The VTEC active table is retrieved from EDEX.
        • The table is filtered and actions that are CAN, UPG, and EXP are removed.
        • -
        • Records that represent current events are kept.  Current +
        • Records that represent current events are kept. Current events are obtained from three different sources (within the VTEC table):
          • Convective Watches (TO.A, SV.A) from "my" site from "my" WCN are considered the current issued convective watches.  We ignore -the WOU and other information from SPC.  Convective watches from +the WOU and other information from SPC. Convective watches from "my" site but from a different product are ignored.
          • Any records from "my" site are considered, both tropical and @@ -97,11 +95,8 @@ only is "TEST", then only "T" VTEC events will be considered.

            Note: HazardRecovery has been updated for the 2007 tropical season due -to changes in the TCV product.   The TCV product will now +to changes in the TCV product. The TCV product will now only contain coastal zones, thus the HazardRecovery procedure now looks at tropical events issued by your site.
            -
            -
            -
            diff --git a/cave/com.raytheon.viz.gfe/help/Hazard_Methodology.html b/cave/com.raytheon.viz.gfe/help/Hazard_Methodology.html index c909dea209..25819af418 100644 --- a/cave/com.raytheon.viz.gfe/help/Hazard_Methodology.html +++ b/cave/com.raytheon.viz.gfe/help/Hazard_Methodology.html @@ -40,14 +40,14 @@ are starting with no hazards in your Hazard grid.
            src="images/MakeHazards3.png">

            4. Select the zones for this hazard. Note: If you do not select zones -at this step, the hazard type and time range will
            +at this step, the hazard type and time range will be applied to the current active edit area in GFE.

            Make Hazard 4

            5. Press Run/Dismiss. The tool will close, and a temporary hazard grid -will be created. Notice in the example
            +will be created. Notice in the example below, the grid name in hazISW, the temporary grid for an Ice Storm Warning.

            @@ -56,7 +56,7 @@ Warning.

            6. The final step to creating a simple hazard is to run the MergeHazards tool, which will recombine -all
            +all temporary grids back into the actual hazard grid.

            Finished Hazard grid The Hazards grid will be locked when you run the SeparateHazards procedure to prevent conflicts from other users.
            -
            -

            -
            -

            +How force segments for the same hazard

            This method is only applicable to a -very special case of WSW/NPW/RFW product. Normally
            +very special case of WSW/NPW/RFW product. Normally GHG takes care of the segmentation of products.
            The -one case where this method would be used
            + style="color: rgb(204, 0, 0);">

            The +one case where this method would be used is if you have a single hazard type, and you want to force two segments -in the final product. For
            +in the final product. For instance, if you have a Winter Storm Warning (WS.W) from 12Z to 22Z, -but you need to talk
            +but you need to talk about snow in the west and freezing rain in the east, you might want to -break this into two
            +break this into two segments. Here is an example using MakeHazard:

            @@ -144,7 +140,7 @@ box. Press Run/Dismiss.
            src="images/MergeHazardsMenu.png">

            Step 4: Save and publish your hazard grid. Although it looks like one -area, note the difference in the legend.  Note that you can switch the Hazards display to a combination of Image and Bounded Area, and then increase the Line Width in order to see the different segments.
            @@ -153,19 +149,11 @@ the Line Width in order to see the different segments.

            src="images/CombinedSegments.png">

            Step 5: Run the product. Notice that although VTEC codes are the same -and headlines are the same,
            +and headlines are the same, that the product has been forced into two segments.



            -
            -
            -

            -
            -
            +
            diff --git a/cave/com.raytheon.viz.gfe/help/ISC.html b/cave/com.raytheon.viz.gfe/help/ISC.html index 8cb2102071..9d753984cb 100644 --- a/cave/com.raytheon.viz.gfe/help/ISC.html +++ b/cave/com.raytheon.viz.gfe/help/ISC.html @@ -13,7 +13,7 @@

            Intersite Coordination Training Guide

            -
            November 17, 2004
            +
            February 14, 2012

            Contents

            @@ -22,8 +22,6 @@ Training Guide Identifying Intersite Discrepancies
            Virtual ISC Weather Elements
            -  -


            diff --git a/cave/com.raytheon.viz.gfe/help/ISCDiscrepancies.html b/cave/com.raytheon.viz.gfe/help/ISCDiscrepancies.html index f838c37880..f8ae9c2131 100644 --- a/cave/com.raytheon.viz.gfe/help/ISCDiscrepancies.html +++ b/cave/com.raytheon.viz.gfe/help/ISCDiscrepancies.html @@ -58,12 +58,12 @@ Area
            In this exercise, we will examine the "swath" edit area set up by the server around the CWA. You can think of a "swath" as a -donut-shaped +doughnut-shaped object around the border of the CWA/Marine Zones. This is the area in which we will be checking for discrepancies.
              -
               
            1. Select Main Menu-->Edit +
            2. Select Main Menu-->Edit Areas-->ISC-->ISC_Tool_Area.
            3. Make sure the automatically generated area is satisfactory to you. If @@ -84,7 +84,7 @@ Procedure
              In this exercise, we will run the ISC_Discrepancies procedure to see how it works.
                -
                 
              1. Select Main +
              2. Select Main Menu-->Consistency-->ISC_Discrepancies. A dialog will appear allowing you to choose Weather Elements and a Time Range. Initially, @@ -103,9 +103,8 @@ Highlights.
              ISC Discrepancy Dialog
              -
              -
                +
              +

              After running the ISC Discrepancies Procedure, grids that exceed the @@ -114,8 +113,7 @@ Manager:
               

              -
              +

               
              @@ -170,7 +168,7 @@ from the legend.
            4. B3-->Clear Highlight.
            5. Run the B3-->Show_ISC_Info tool. This will display a dialog -containing statistics about each border. =
              +containing statistics about each border.

            @@ -179,10 +177,9 @@ Note that the BOU CWA temperatures are higher than the adjacent CYS and GLD temperatures:

            This is the discrepancy area created by the Show_ISC_Area -tool.  +tool. It highlights those locations in the isc swath where discrepancies were found:

            @@ -200,13 +197,13 @@ The Intersite Coordination Procedure and Tools are based on the ISC_Utility and the ISC_Utility_Local files which can be found in the Edit Action Dialog -Utilities window.  You can override the default settings in the +Utilities window. You can override the default settings in the ISC_Utility_Local -file.  Do not change the ISC_Utility file itself as this may be +file. Do not change the ISC_Utility file itself as this may be updated -in future releases.  For more information on Utilities, see the Smart -Tool Training Guide Utilities Section.      +Tool Training Guide Utilities Section. The ISC_Utility_Local file allows you to override various items within the ISC_Utility file. See the documentation in these files for more information.
            diff --git a/cave/com.raytheon.viz.gfe/help/ISCUsingISCMode.html b/cave/com.raytheon.viz.gfe/help/ISCUsingISCMode.html index 88db89873c..eb1d3dabca 100644 --- a/cave/com.raytheon.viz.gfe/help/ISCUsingISCMode.html +++ b/cave/com.raytheon.viz.gfe/help/ISCUsingISCMode.html @@ -6,10 +6,9 @@

            Using the GFE in Show ISC Mode

            -The GFE is one of two modes: Normal, Show ISC.  When the GFE is +The GFE is one of two modes: Normal, Show ISC. When the GFE is toggled -into "Show ISC Mode" using the  +into "Show ISC Mode" using the button on the toolbar, the data presented in the spatial editor is the composite grid, rather than the forecast or primary grids.  A composite @@ -20,26 +19,23 @@ the remainder of the area., if your office type is WFO.  For RFCs, a composite grid is made up of the forecast grid over the RFC area, and all of the surrounding intersite coordination grids received from adjacent RFCs for the remainder of the area.   Any area that does -not have ISC data -or -forecast data available will be blank. +not have ISC data or forecast data available will be blank.

            When in Show ISC mode, the following behavior is changed from the default:

            • Composite Grid is shown in the spatial editor consisting of the forecast data over the combined CWA/marine zones (for wfos) and intersite coordination data -over the remainder of the grid domain.  For RFCs, the forecast +over the remainder of the grid domain. For RFCs, the forecast data is the RFCs area of responsibility.
            • Editing changes made to the Forecast grid may not be visible, if those changes are made to the Forecast grid outside of the CWA/marine zones -(for WFOs) and RFC area of responsibility (for RFCs)  +(for WFOs) and RFC area of responsibility (for RFCs) (since the intersite coordination data will be shown instead).
            • Blank areas indicate no data has been received.
            • @@ -50,31 +46,26 @@ start drag operation.
            • The Move/Copy tool will move/copy the composite grid and place it into -the forecast grid.  The region copied/moved will be clipped to +the forecast grid. The region copied/moved will be clipped to those -valid data points before the operation begins.  The valid points +valid data points before the operation begins. The valid points are defined as your forecast grid and the valid intersite coordination data.
            • The Smooth tool will smooth between the ISC and the Fcst segments -of -the -composite grid.
            • +of the composite grid.
            • The Color Bar Fit To Data operations will use the composite grid -for -its -calculations.
            • +for its calculations.
            • The Sample Tool and sample points will show the data value, the -site -identifier, +site identifier, the last update time, and whether or not the data came from an Official/Published -database for the ISC portions of the grid.  The site -identifier,  +database for the ISC portions of the grid. The site +identifier, update time, and official db symbol may be turned off through the GFE Maps->Sample -menu.  Markers (similar to samples except there are no data values +menu. Markers (similar to samples except there are no data values displayed) may be placed at appropriate locations to indicate the site -identifier, update time, and official db symbol.  These can be +identifier, update time, and official db symbol. These can be controlled through the GFE Maps->Markers menu.
            @@ -102,57 +93,50 @@ the ISC portions of the grid.

          The ISC Markers that are present are based on whether ISC data is -displayed from WFOs or RFCs.  Each office type has its own set of +displayed from WFOs or RFCs. Each office type has its own set of ISC markers.

          Example of how GFE appearance changes when placed into ISC mode

          Normal Display Mode




          ISC Display Mode




          Samples in Normal Mode compared to ISC Mode


          -In the normal mode, sample points are displayed.  In ISC mode, +In the normal mode, sample points are displayed. In ISC mode, for those data points that are really ISC data points, the site identifier (optional), the update time (optional), and the official/published database -symbol (optional) are also presented.  The information shown with +symbol (optional) are also presented. The information shown with a sample is controlled through the Show ... on Data Samples options.

          If the ISC data represents data from the official database, then a "P" -symbol will be appended to the sample string.  If the ISC data +symbol will be appended to the sample string. If the ISC data represents data from any other database, e.g., Fcst database, then no symbol will -be appended.  The purpose of the "P" symbol is to indicate that is +be appended. The purpose of the "P" symbol is to indicate that is the official released forecast from that site.

          There are two types of samples -- one with data values shown, and the -other without data values shown.  Normal samples, a.k.a. sample +other without data values shown. Normal samples, a.k.a. sample sets, -always have data values shown.  Markers are similar to samples, +always have data values shown. Markers are similar to samples, except -that data values are not shown.  Markers are persistent, i.e., +that data values are not shown. Markers are persistent, i.e., clearing -sample points will not clear marker points.  Loading of sample +sample points will not clear marker points. Loading of sample sets does not affect the set of markers placed on the screen.  Markers may be added or removed through the Sample Tool MB3 popup menu. The diff --git a/cave/com.raytheon.viz.gfe/help/ISCVirtual.html b/cave/com.raytheon.viz.gfe/help/ISCVirtual.html index dc456a21cf..3ce316958b 100644 --- a/cave/com.raytheon.viz.gfe/help/ISCVirtual.html +++ b/cave/com.raytheon.viz.gfe/help/ISCVirtual.html @@ -5,16 +5,16 @@

          Virtual ISC Weather Elements

          The Show ISC capability simply compares one weather element against -another.  For certain elements, a virtual weather element is +another. For certain elements, a virtual weather element is calculated and that is what is displayed against the Fcst -database.   For example, QPF is a rate-dependent weather -element.   It doesn't make sense to display your 12-hr QPF +database. For example, QPF is a rate-dependent weather +element. It doesn't make sense to display your 12-hr QPF Fcst grid against a 1-hr QPF ISC grid, since the time periods are not -equal.  Using the virtual weather element capability in the GFE, a +equal. Using the virtual weather element capability in the GFE, a new weather element is calculated that will display your 12-hr QPF Fcst grid against a virtual 12-hr QPF ISC grid.  The Virtual 12-hr QPF ISC grid was calculated from the multiple ISC grids in the -database.  For ISC, there are virtually calculated weather +database. For ISC, there are virtually calculated weather elements for QPF, SnowAmt, MaxT, MinT, and PoP as shown in the following table:

          @@ -32,7 +32,7 @@ Element
          QPF
          The virtual ISC grid is always -the same duration as the Fcst QPF grid.   The Virtual ISC +the same duration as the Fcst QPF grid. The Virtual ISC grid is the rate-summation of the ISC QPF grid.
          @@ -40,7 +40,7 @@ grid is the rate-summation of the ISC QPF grid.
          SnowAmt
          The virtual ISC grid is always -the same duration as the Fcst SnowAmt grid.  The Virtual ISC grid +the same duration as the Fcst SnowAmt grid. The Virtual ISC grid is the rate-summation of the ISC SnowAmt grid.
          @@ -48,9 +48,9 @@ is the rate-summation of the ISC SnowAmt grid.
          MaxT
          The virtual ISC grid is always -the same duration as the Fcst MaxT grid. It contains the maximum NaxT +the same duration as the Fcst MaxT grid. It contains the maximum MaxT value gridpoint by gridpoint from the ISC MaxT grids valid over the -same period.  Normally there is only 1 MaxT grid, except in cases +same period. Normally there is only 1 MaxT grid, except in cases where the office is in a different time zone or adjacent offices have configured their MaxT time constraints differently.
          @@ -79,28 +79,28 @@ period.

          The following illustration shows the purpose of the Virtual ISC weather -elements.  In the case on the left when the virtual weather +elements. In the case on the left when the virtual weather element is not used, the forecaster will be comparing QPF from Fcst and -ISC for different time periods.   In the case on the right, +ISC for different time periods. In the case on the right, the virtual ISC grid is calculated from the rates of all overlapping -ISC QPF grids.  The duration of the Virtual ISC grid is programmed +ISC QPF grids. The duration of the Virtual ISC grid is programmed to exact match the duration of the Fcst grid.
          -<>
          +

          The illustration below assumes a constant rain rate of 0.10"/hour over -the entire ISC and Fcst grid.   The Fcst grid duration is 7 -hours, thus that grid will show 0.70" of precipitation.   The +the entire ISC and Fcst grid. The Fcst grid duration is 7 +hours, thus that grid will show 0.70" of precipitation. The three ISC grids are 2 hours, 3 hours, and 4 hours in duration, and at a constant rain rate of 0.10"/hour contain 0.20", 0.30", and 0.40" respectively.

          The virtual QPF grid is programmed to match the duration of the Fcst -grid, and thus it is 7 hours in length.  The precipitation rate +grid, and thus it is 7 hours in length. The precipitation rate for each overlapping ISC QPF grid is calculated and that portion of the time period that overlaps is summed into the virtual ISC grid.

          When the user enables "Show ISC Mode", they will be comparing the -precipitation for the same duration as the Fcst grid.  In this +precipitation for the same duration as the Fcst grid. In this specific example, the Virtual ISC Grid will show 0.70" of precipitation due to the constant rain rate of 0.10".

          diff --git a/cave/com.raytheon.viz.gfe/help/IntersiteCoordination.html b/cave/com.raytheon.viz.gfe/help/IntersiteCoordination.html index d7c0cae007..f94a220143 100644 --- a/cave/com.raytheon.viz.gfe/help/IntersiteCoordination.html +++ b/cave/com.raytheon.viz.gfe/help/IntersiteCoordination.html @@ -11,16 +11,14 @@ vlink="#551a8b">

          Intersite and Intrasite Coordination of Grids

          -September 28, 2008
          +February 14, 2012

          This documentation covers the theory of operation, configuration, and -how-to-use the intersite/intrasite  coordination of grids feature -in GFESuite.  The purpose of this software is to provide access to +how-to-use the intersite/intrasite coordination of grids feature +in GFESuite. The purpose of this software is to provide access to forecast data from adjacent sites for purposes of determining whether -forecast -inconsistencies exist. +forecast inconsistencies exist.

          Table of Contents

            @@ -30,7 +28,7 @@ Intersite/Intrasite Coordination of Grids
            • Configuring the AWIPS system
            • -
            • Sending Intersite +
            • Sending Intersite Coordination Grids
            • Accessing @@ -40,7 +38,7 @@ Data
            • Log files for Intersite Coordination
            • -
            • ifpServer +
            • EDEX Storage of ISC Grids
            • Mosaic Technique @@ -62,44 +60,31 @@ Configurations
            • Intersite/Intrasite Coordination of Grids Beginning with OB8.3, the configuration of Intersite/Intrasite -coordination is done automatically through a central server.  The +coordination is done automatically through a central server. The receiving site determines what data is desired and registers with a -central server for what is needed.  As each other ifpServer +central server for what is needed. As each EDEX server prepares to send ISC data, it checks with the central server to find out the destinations.

              All of your configuration needed to set up ISC is done through the -serverConfig/localConfig route.  Refer to Intersite Coordination Configuration Items for details.


              Configuring the AWIPS system

              The AWIPS WAN configuration is more complicated than the GFE -configuration.  +configuration. Several scripts are installed and several directories are created, the AWIPS message handler receive table is modified if necessary. -

              A separate installation script called installISC -is -provided on the distribution CD in the file isc.tar.gz. The -script -performs -most of the necesssary setup tasks on the AWIPS MHS data server.  -Refer to the release notes for details on -installing -the intersite coordination package on AWIPS.  -

              -

              Once the installISC is installed, your site will be able to +

              Once AWIPS is installed, your site will be able to transmit -grids to your configured adjacent sites. 
              -   -  +grids to your configured adjacent sites.


              @@ -121,63 +106,62 @@ each time you save data.
              the Intersite Coordination Data

              The intersite coordination data is placed in a singleton database with the name of xxx_GRID__ISC_00000000_0000, where xxx is your site -identifier.  +identifier. The database will appear in the WE -Volume Browser and hence weather elements can be loaded and -displayed.  +Volume Browser and hence weather elements can be loaded and +displayed. The user may also write smart tools to provide consistency checkers if -desired.  Refer to the Intersite Coordination +desired. Refer to the Intersite Coordination Training Guide for more details on how the GFE operates with ISC data.

              Data you receive from office types (e.g., wfo, rfc) different from your own are renamed with the receiving office type appended to the -name.   For example, if QPF data is sent from a RFC to a WFO, +name. For example, if QPF data is sent from a RFC to a WFO, then the data appears in the WFO's ISC database as QPFrfc.


              Office Types and their Effect on ISC Data

              The serverConfig -file defines each site's domain and office type.   The -commonly used office types in the NWS are "wfo" and "rfc".   +file defines each site's domain and office type. The +commonly used office types in the NWS are "wfo" and "rfc". Requesting and receiving data from an office type that differs from your own office type will cause the weather element to be renamed upon storage into your ISC database.

              The following picture illustrates the sending of ISC from a WFO to a -WFO and RFC.  In the originating site's Fcst database is an -element called QPF.   Sites that want this data via ISC will -register with the IRT and specify the weather element.  For WFOs +WFO and RFC. In the originating site's Fcst database is an +element called QPF. Sites that want this data via ISC will +register with the IRT and specify the weather element. For WFOs who want this data, they will request the QPF weather element, since -the sender and receiver site office types are the same.   For +the sender and receiver site office types are the same. For RFCs who want this data, they will request the QPFwfo weather element, -since the server and receiver site office type are different.  The +since the server and receiver site office type are different. The weather elements are renamed as they arrive into a site with a -different office type than the sender.  The office type is +different office type than the sender. The office type is appended to the weather element name, but prior to the level -indicator.  For example, QPF_SFC (SFC-surface) becomes QPFwfo_SFC -when received at an RFC.   The list of weather elements to +indicator. For example, QPF_SFC (SFC-surface) becomes QPFwfo_SFC +when received at an RFC. The list of weather elements to request from other sites is defined in the ISC_REQUESTED_PARMS variable in -serverConfig/localConfig.   For a WFO to receive QPF from -another WFO, QPF needs to be part of this variable.   For a +serverConfig/localConfig. For a WFO to receive QPF from +another WFO, QPF needs to be part of this variable. For a RFC to receive QPF from a WFO, QPFwfo needs to be part of the variable.

              The default list of weather elements to be requested will include all -weather elements defined in the ISC database.  If is also +weather elements defined in the ISC database. If is also necessary to add the weather element to the ISC database if not already defined by the EXTRA_ISC_PARMS -entry in serverConfig.  Adding the element to the ISC database is +entry in serverConfig. Adding the element to the ISC database is through the extraISCparms entry in localConfig.

              -
              +
              The following illustration shows the RFC sending QPF vis ISC to both -WFOs and RFCs.   Again, the weather element is renamed when +WFOs and RFCs. Again, the weather element is renamed when it is received at a site of a different office type than the sender, in -this case the WFO.  QPF is renamed to QPFrfc for the wfos and +this case the WFO. QPF is renamed to QPFrfc for the wfos and remains QPF for RFCs.

              The Intersite Coordination facility runs on two different machines (linux and the AWIPS data servers), and uses several different -processes.  +processes. This can make it difficult to determine whether the software is working -properly.  This section outlines the location and contents of the +properly. This section outlines the location and contents of the log files pertaining to the intersite coordination.
              -  @@ -204,17 +187,28 @@ log files pertaining to the intersite coordination. + + + + + + - + - @@ -224,34 +218,33 @@ for AWIPS. file received (which contains the site identifier that sent the data), the size in bytes, -and to which ifpServer (host/port) the data was sent to for further +and to which EDEX or ifpServer (host/port) the data was sent to for further processing - + - - + - - + - + @@ -259,17 +252,17 @@ for AWIPS.


              -

              ifpServer -Storage of ISC Grids

              -The ifpServer configuration is set to contain a new logical database, +

              +EDEX Storage of ISC Grids

              +EDEX configuration is set to contain a logical database, called -ISC.  The ISC database is a persistent database, like Fcst and +ISC. The ISC database is a persistent database, like Fcst and Official, -and will contain the same set of weather elements.  The grids +and will contain the same set of weather elements. The grids contained within the ISC database will be a composite of all of the adjoining site's -intersite-coordination grids.  Individual grids from each site +intersite-coordination grids. Individual grids from each site will not be retained.

              The grids that "this site" has sent out to other sites will also be @@ -278,10 +271,10 @@ used in the ISC database to represent the CWA data.

              Since the ISC is simply another GFESuite database, all of the tools and capabilities within the GFE can be used with this database.

              -

              Weather elements have a designated "office type".  Thus, when +

              Weather elements have a designated "office type". Thus, when grids are received from a site with a different office type (e.g., WFO receiving grids from an RFC), the weather element is renamed and stored -into the ISC database with the "office type" designator.   +into the ISC database with the "office type" designator. This allows weather elements to be properly mosaicked without overwriting data from other office types.

              @@ -291,15 +284,14 @@ overwriting data from other office types.
              Technique The mosaic technique (iscMosaic) merges in a supplied grid (or grids) into -the database.  The mosaic technique is done both spatially and +the database. The mosaic technique is done both spatially and temporally.

              Temporal Mosaic Technique

              The temporal mosaic technique always uses two sources of data: the incoming -grid from a site, and the existing grids within the ISC database.  +grid from a site, and the existing grids within the ISC database. Since incoming grids are processed one site at a site, this technique will work. The valid time ranges for existing grids within the ISC database @@ -307,34 +299,33 @@ and the time ranges for received grids are compared and the "least common denominator" technique is used to determine all of the possible permutations -of the time ranges.  Basically if a grid comes in from an +of the time ranges. Basically if a grid comes in from an adjoining site that has a large time range, it will be inserted into several existing -grids.  If a grid comes in from a site with a small time range, +grids. If a grid comes in from a site with a small time range, then existing grids in the ISC database may be split.

              -This concept is for non-virtual ISC weather elements.  Certain +This concept is for non-virtual ISC weather elements. Certain virtual ISC weather elements may use a different mosaic algorithm.


              Spatial Mosaic Technique

              The spatial mosaic technique is used to combine pieces of grids spatially in order to produce a composite grid that contains a patchwork of grid -points from several sites.  In the ifpServer, a series of edit +points from several sites. In EDEX, a series of edit areas -are defined for each WFO.  These are calculated automatically from -map shapefiles.  The edit areas define the set of grid points that -are within each WFO's CWA and marine zones.  The incoming +are defined for each WFO. These are calculated automatically from +map shapefiles. The edit areas define the set of grid points that +are within each WFO's CWA and marine zones. The incoming intersite coordination data contains a sparsely populated grid, which indicators -on which grid points are valid.  Since the incoming data grid may +on which grid points are valid. Since the incoming data grid may not be on the same map projection, or have the same grid domain or resolution, the incoming data is mapped to the projection and domain within the ISC @@ -342,8 +333,8 @@ database.

              After the mosaic is completed, any grid points that remain undefined in the ISC database will be set to the weather element's minimum possible -value.  This may lead to some confusion since the minimum possible -values are possible values.  Note that the GFE and ifpServer do +value. This may lead to some confusion since the minimum possible +values are possible values. Note that the GFE and EDEX do not currently have the capability of sparsely populated grids.

              @@ -357,17 +348,16 @@ through Configurations The GFESuite offers several configurable items to allow you to controlling -the processing overhead.  All of these options are available +the processing overhead. All of these options are available through the Intersite Coordination -Configuration Items section in serverConfig.py.   Sites -should create localConfig.py to override the defaults.  
              +Configuration Items section in serverConfig.py. Sites +should create localConfig.py to override the defaults.

              NOTE:  All sites MUST override the entries in serverConfig in order for them to enable ISC -processing and to send ISC.  The default in the baseline is to -have ISC disabled.  
              +processing and to send ISC. The default in the baseline is to +have ISC disabled.


              -  - + \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/LimitValues.html b/cave/com.raytheon.viz.gfe/help/LimitValues.html new file mode 100644 index 0000000000..a0d84536f8 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/LimitValues.html @@ -0,0 +1,81 @@ + + + + + LimitValues + + + + + + +LimitValues +
              +
              +Introduction +
              +
              +Sometimes it is desirable to “clip†+grid values to particular limits. For example, you might not want temperatures to cross some +important threshold such as 32 or 100. There are a variety of tools you might use that would +allow you to raise/lower values over a region such that the values do not cross these thresholds. +However, depending on the color curve, it may be difficult to see if any pixels reach these +values, and using other tools might inadvertently change other pixels that you want to remain +constant. +

              +The Limit_Values tool clips grid values at limits that you specify. It is purely an “editing†+tool, with no meteorological “theory†behind it - it is simply a quick way to accomplish a +common editing task. It is similar to the “NoHigherThan†and “NoLowerThan†tools by Thomas +Mazza, but it combines the two tools in one, and when you start the tool, the slider shows +the current value - which makes modifications easier.
              +
              +
              +
              +How +the Procedure Works +
              +
              +Lets say we start with a complex temperature pattern like this:

              +LimitValues
              +
              +
              +Lets say that for some reason, we do +not believe any of the locations near the center of the screen will be in the 90s. There are +quite a few non-contiguous pixels above 90, so it will be difficult to remove them without also +editing other nearby points. For some reason, lets say that we just want to set the temperature +to 89 in those areas. We could create a complex query of edit areas, areas where temperatures +are above 89, etc. and then use the Assign_Value tool to assign 89 to those points. That +approach is complex and takes many steps. +

              +With the Limit_Values tool, we simply draw a general edit area that covers the points in +question:
              +LimitValues
              +
              +
              +Then we call the Limit_Values tool +and a dialog box comes up with the current max/min values in the current edit area:
              +LimitValues
              +
              +
              +Now we can see that some pixel in +the edit area was 96 (which is difficult to tell with the color curve we are using)! Now we +simply set the maximum value to 89:
              +LimitValues"

              +And when we click on OK, all the pixels above 89 in the edit area are set to 89:
              +LimitValues

              +You can limit the minimum value on the grid in a similar way. You can certainly run the tool +without defining an edit area, in which case it acts upon the entire grid. +
              + + diff --git a/cave/com.raytheon.viz.gfe/help/MainMenuDialogs.html b/cave/com.raytheon.viz.gfe/help/MainMenuDialogs.html index 1931696507..03580910a0 100644 --- a/cave/com.raytheon.viz.gfe/help/MainMenuDialogs.html +++ b/cave/com.raytheon.viz.gfe/help/MainMenuDialogs.html @@ -6,19 +6,18 @@ - MainMenuDialogs + GFESuite Documentation - MainMenuDialogs

              Main Menu Dialogs

              -September 28, 2008
              +January 30, 2012


              The following dialogs are invoked directly or indirectly from the Main Menu:

              • Start Up Dialog
              • -
              • Delete User Dialog
              • Define Config and IFP Image Dialog
              • @@ -78,27 +77,12 @@ Latitude/Longitude Dialog


                Start Up Dialog

                -The Start Up Dialog appears when the GFE is initializing. The normal -message -will be "Starting GFE..." If the system cannot connect to the server, a -message will describe the problem. In some cases, the system will -continue -re-trying. You can cancel this at any time. -

                +The Start Up Dialog appears when the GFE is initializing. +If the system cannot connect to the server, a +message will describe the problem. +


                -

                Delete User Dialog

                -The Delete User Dialog will only appear when you start the GFE as -SITE.  -The delete user dialog is used to remove entries from the Start Up -Dialog.  -Note that only the entry is removed from the start up dialog, and not -the -configuration files associated with the user. -


                -

                -

                Break Lock Dialog

                For each grid block selected in the GridManager, the Break Lock dialog lists the: @@ -107,32 +91,31 @@ Break Lock dialog lists the:
              • Weather Element name
              • Lock timerange

              The dialog is separated into two sections, the "Locks Owned By Active Clients", -and the "Orphaned Locks".  Locks that are owned by active clients, -if broken, will likely result in loss of data.  If it is a GFE +and the "Orphaned Locks". Locks that are owned by active clients, +if broken, will likely result in loss of data. If it is a GFE that owns those locks, then the forecaster will lose all of his/her unsaved data.  Orphaned Locks, on the other hand, are owned by processes that -are no longer connected to the ifpServer.  Orphaned locks can +are no longer connected to EDEX. Orphaned locks can generally be broken without any consequences.

              Select the locks you wish to break and click Breaklock(s) or click Cancel -at any time to cancel the operation and close the dialog.  Note +at any time to cancel the operation and close the dialog. Note that breaking a lock is irreversible. The "Select All Orphans" button highlights -all of the orphaned entries and the "Clear All" button deselects the -entries.  +all of the orphaned entries and the "Clear All" button de-selects the +entries. For verification purposes, the "Select All Orphans" button does not highlight locks owned by active clients; these must be individually selected.

              -
                +



              @@ -143,35 +126,28 @@ Dialog
              The Define Config Dialog lists all existing configuration files.
              -Choosing File-->New allows you to modify configuration files that +Selecting a foler and doing right-click-->New allows you to modify configuration files that affect the behavior of the GFE and IFPImage. A dialog will appear for you to enter the name of the configuration file. After clicking Ok, the Python editor will appear for you add or modify the configuration attrubites. -

              An Editable Listbox displays the config files, and pressing MB3 over -the box, brings up a menu described in the Editable -Listbox description. When finished, click "Close" to exit the -dialog. -

              define config dialog
              + style="width: 876px; height: 590px;">



              Auto Save Interval Dialog

              The Auto Save Interval Dialog allows the user to enable or disable the -automatic save feature of the GFE.  If disabled, no weather +automatic save feature of the GFE. If disabled, no weather elements -will be automatically saved.  If enabled, the user may choose an +will be automatically saved. If enabled, the user may choose an interval -from one minute to sixty minutes.  At this regular interval, the +from one minute to sixty minutes. At this regular interval, the GFE -checks for modified weather elements.  If there are any, then one +checks for modified weather elements. If there are any, then one weather element at a time is saved with a short interval between -them.  +them. During the auto save process, you will notice that the cursor shape will change to the "wait" cursor, and the "green" lock indications on the @@ -179,20 +155,18 @@ Grid Manager will disappear indicating that those grids have been saved to the database. -


              +



              Interpolation Algorithm Dialog

              The interpolation algorithm dialog allows the user to select one of four -interpolation algorithms to use for scalar interpolation.  The +interpolation algorithms to use for scalar interpolation. The interpolation for vector and weather weather elements are not selectable.

              The user has a choice of the following algorithms:

              Use File Name or Directory Name
              irtServerdx3/dx4Logs for connectivity with the irt server - check this log if ISC grids are + not being received to ensure the system can connect and configured correctly based + on the argument list.release/logs/SITE/DATEDIR/irtServer*, +where release is the installation directory, typically +/awips2/GFESuite +for AWIPS.
              iscExtractdx4dx3/dx4 Main routine run on linux when sending isc grids. Lists time sent, number of bytes sent, wall clock time, cpu time, sites data sent to, time range of data, and weather elements.release/data/logfiles/DATEDIR/iscExtract*, + release/logs/SITE/DATEDIR/iscExtract*, where release is the installation directory, typically -/awips/GFESuite/primary +/awips2/GFESuite for AWIPS.
              release/data/logfiles/DATEDIR/iscDataRec*release/logs/SITE/DATEDIR/iscDataRec*
              ifpnetCDFdx4Program that extracts data from the ifpServer and writes it + dx3/dx4Program that extracts data from EDEX and writes it to a compressed -netCDF file.  Raw file and compressed file sizes are listed. +netCDF file. Raw file and compressed file sizes are listed. Number of grids processed per weather element is output.release/data/logfiles/DATEDIR/ifpnetCDF*, + release/logs/SITE/DATEDIR/ifpnetCDF*, where release is the installation directory, typically -/awips/GFESuite/primary +/awips2/GFESuite for AWIPS.
              iscMosaicdx4dx3/dx4 Program that extracts data from a compressed netCDF file (written originally -from iscnetCdf) and uses mosaic techniques to merge the data into the -ifpServer.release/data/logfiles/DATEDIR/iscMosaic*, +from iscnetCdf) and uses mosaic techniques to merge the data into EDEX.release/data/logfiles/SITE/DATEDIR/iscMosaic*, where release is the installation directory, typically -/awips/GFESuite/primary +/awips2/GFESuite for AWIPS.
              @@ -201,16 +175,16 @@ for vector and weather weather elements are not selectable. - - @@ -228,7 +202,7 @@ zero value. @@ -236,42 +210,37 @@ advection considerations.
              Cubic / AdvectionCubic spline is applied to the data points temporally.  + Cubic spline is applied to the data points temporally. Software -looks for areas that can be advected.  The advection component of +looks for areas that can be advected. The advection component of the algorithm works best for weather elements that contain areas of zero value.
              Cubic / NoAdvectionCubic spline is applied to the data points temporally.  + Cubic spline is applied to the data points temporally. Software gradually adjusts points from starting value to ending value without advection @@ -219,8 +193,8 @@ considerations.
              Linear/ Advection Linear calculations are applied to adjacent base grids -temporally.  -Software looks for areas that can be advected.  The advection +temporally. +Software looks for areas that can be advected. The advection component of the algorithm works best for weather elements that contain areas of zero value.
              Linear/ No Advection Linear calculations are applied to adjacent base grids -temporally.  +temporally. Software gradually adjusts points from starting value to ending value without advection considerations.

              -


              +



              Temporal Editor Statistics Dialog

              The temporal editor statistics dialog controls the type of data that is displayed in the Temporal Editor when one of the Range (RangeBar, TEColorRangeBar) -visualizations are enabled.  An example of the RangeBar +visualizations are enabled. An example of the RangeBar visualization -is shown below.  This particular visualization is showing the +is shown below. This particular visualization is showing the moderated -15% minimum, 15% maximum values from an edit area.  The max, +15% minimum, 15% maximum values from an edit area. The max, average, and minimum values are shown.

              Example of temporal editor range bar visualization.

              The dialog controls the data presented in the temporal editor range -visualizations.  Absolute will display the absolute minimum and +visualizations. Absolute will display the absolute minimum and maximum -values in the editor.  Moderated will chop out the outlyers based -on the given percentages for the minimum and maximum.  The +values in the editor. Moderated will chop out the outlyers based +on the given percentages for the minimum and maximum. The Standard Deviation choice includes those points within a certain number of standard deviations from the average.

              -


              -  +




              @@ -279,16 +248,14 @@ deviations from the average. Periods Dialog The time scale displayed periods dialog is used to specify which of the -named selection time ranges are to appear on the Time Scale.  The -defijnitions of the selection time ranges, and new named selection time +named selection time ranges are to appear on the Time Scale. The +definitions of the selection time ranges, and new named selection time ranges, may be defined through the Save Selection Time Range Dialog. -

              -

              +


              Edit Area Appearance Dialog

              The edit area appearance dialog is used to control the color and border -line width for the edit area on the spatial editor.  The default +line width for the edit area on the spatial editor. The default color and line width may be set in the gfe configuration file entries: ReferenceSet_color @@ -296,15 +263,14 @@ and ReferenceSet_width.

              The user can choose the new color from the color selector as well as the line width.

              -

              +


              Exit GFE Dialog

              If there are unsaved Weather Elements that have been modified, a dialog will appear allowing you to save the modified data.

              The dialog displays the names of all modified Weather -Elements.  +Elements. Choose Yes to save all elements and exit the GFE. Choose No if you do not want to save the elements before exiting the GFE. @@ -318,13 +284,12 @@ dialog without exiting the GFE.

              If you happen to have any temporary hazard grids active in your GFE and attempt to exit, you may see a dialog that looks like this:

              -

              ExitGFEDialog
              +

              ExitGFEDialog

              If you see this dialog, it means that you must save or manually unload the temporary hazards weather elements before you can save the "Hazards" weather element. If you select "No", the GFE will exit -without saving any of your modified grids.  If you select "Cancel" +without saving any of your modified grids. If you select "Cancel" the operation will be canceled and leave the grid state unchanged.

              @@ -341,11 +306,11 @@ D2D). For a list of D2D weather elements and descriptions, click here. -
            • Source    -Grid database sources and times and the +
            • Source  -Grid database sources and times and the official forecast (LAPS, RUC, Fcst, etc.)
            • Field     -Weather Elements to load
            • -
            • Plane     -The vertical plane of gridded +
            • Plane    -The vertical plane of gridded data. "SFC" stands for surface and is the plane of the forecast and official @@ -355,7 +320,7 @@ databases.
            •  
              In each option field listed above, single click on the items you wish -to include/exclude.  Scroll bars to the right of each field allow +to include/exclude. Scroll bars to the right of each field allow you to page through all available selections. Alternately, you can click on the option heading itself to list all available selections. @@ -381,8 +346,7 @@ selections and close the dialog, or click Cancel at any time to end the operation and close the dialog.

              -WE Browser Dialog +WE Browser Dialog

                Working With Groups

                While the Weather Element Volume Browser Dialog allows you to load and @@ -422,15 +386,14 @@ Element Group. Dialog appears. Enter the group name and select Save. -Now your new group has been saved and is ready to be used.
                -  +Now your new group has been saved and is ready to be used.

                You can delete saved groups by choosing File-->Delete Weather Element Group which brings up the Delete Weather Element Group Dialog.

              -
                +


              Save Weather @@ -440,8 +403,7 @@ Volume Browser, type a name in the identifier box and click "Save." You can re-save an existing group by clicking on its name. -


              +



              Delete Weather @@ -449,52 +411,49 @@ Element Group Dialog

              To delete an existing weather element group, click on its name which will appear in the identifier box. Then click "Delete." -

              +


              Manage Hidden Weather Elements Dialog

              The Manage Hidden Weather Elements Dialog is used to unload and/or make -visible hidden weather elements.  Hidden weather elements are +visible hidden weather elements. Hidden weather elements are those weather elements which have been created during smart tool -execution or during "Show ISC Mode".   The GFE creates -temporary weather elements for purposes of holding calculations.  +execution or during "Show ISC Mode". The GFE creates +temporary weather elements for purposes of holding calculations. Some of these may not get unloaded automatically and since these weather elements are "hidden", i.e., don't appear in the spatial editor or grid manager, the user is not aware of their existance.

              One example of a hidden weather element is when "Show ISC Mode" is -enabled.   The GFE will continue to display just the Fcst +enabled. The GFE will continue to display just the Fcst weather elements and not any ISC elements in the grid manager and -spatial editor.   The GFE software loads the ISC and any +spatial editor. The GFE software loads the ISC and any needed virtual ISC elements in order to display the composite grids in -the editors.  When "Show ISC Mode" is turned off, these hidden +the editors. When "Show ISC Mode" is turned off, these hidden elements remain.

              The dialog provides a convenient way to view these "hidden" elements or to "unload" them.


              -
              -
              +



              -
              -

              Define Procedures Dialog

              Procedures are a sequences of commands allowing you to populate the Forecast database from the Model databases that have been created via initialization -and to call Smart Tools. (See  GFE +and to call Smart Tools. (See GFE Smart Tools Training Guide) -

              The Define Procedures Dialog lists all existing procedures. -
              -Choosing File-->New allows you to add a new procedure. A dialog will +

              The Define Procedures Dialog opens the Localization perspective with the Procedures +folder selected in the left column. +

              +

              +Choosing MB3-->New allows you to add a new procedure. A dialog will appear for you to enter the name of your new procedure. After clicking Ok, the Python editor will appear for you enter your procedure commands. @@ -503,12 +462,6 @@ A template is provided in the Python window with documentation in the and Procedures section of the Smart Tools Training Guide.

              -

              An Editable Listbox displays the procedures, and pressing MB3 over -the -box, brings up a menu described in the Editable -Listbox description. When finished, click "Close" to exit the -dialog. -

              NOTE: Procedures can be run in background mode from the command line. For instructions, see the runProcedure @@ -528,12 +481,11 @@ Selected Time Range of the Grid Manager.

              The dialog displays the names of all available models and you choose the model you wish to copy from by clicking directly on the model -identifier.  +identifier. If necessary, you can use the scroll bar at right to page through all -the -available models. +the available models.

              -

              After making your selection(s)  click OK or click Cancel at any +

              After making your selection(s) click OK or click Cancel at any time to cancel the operation and close the dialog.

              Forecast Weather Elements.

              The dialog displays the names of all available models and you choose the model you wish to copy from by clicking directly on the model -identifier.  +identifier. If necessary, you can use the scroll bar at right to page through all -the -available models. +the available models.

              After making your selection(s) click OK or click Cancel at any time to cancel the operation and close the dialog. @@ -561,30 +512,25 @@ to cancel the operation and close the dialog.

              Send Intersite Grids Dialog

              The Send Intersite Grids dialog controls the sending of grids to adjacent -sites.  Sending of grids is either an automatic process when grids +sites. Sending of grids is either an automatic process when grids are saved (if SEND_ISC_ON_SAVE is set in localConfig), or a manual -process accomplished through this dialog.  It is not recommended +process accomplished through this dialog. It is not recommended to use both methods. If SEND_ISC_ON_SAVE in serverConfig/localConfig is 0, or disabled, then this dialog must be used to transmit grids. The Send Intersite Grids Dialog has two fields in manual mode, and just one choice for automatic mode. Do not confuse this automatic mode with the SEND_ISC_ON_SAVE. - 

              In manual mode, the user chooses the set of weather elements to send, which default to the currently loaded elements in the Fcst database, the time ranges to send, whether it be "All Grids", grids over the "Selected Time", or -grids -over a specific user-defined time range. 

              +grids over a specific user-defined time range.

              There are several convenient buttons used to select the set of -Weather -Elements.  By default, the loaded weather elements are -selected.  +Weather Elements. By default, the loaded weather elements are selected. The "Set All" sets all weather elements to on, the "Clear All" sets all weather elements (and sites) to off, and the Groups button brings up a -menu allowing the forecaster to choose a predefined Weather -Element Group.  The "Set Selected" option sets the weather +menu allowing the forecaster to choose a predefined Weather +Element Group. The "Set Selected" option sets the weather elements and time range to that currently selected in the GFE Grid Manager.

              @@ -593,11 +539,9 @@ Manager.


              -

              In automatic mode, the ifpServer keeps track of what ISC grids have -been +

              In automatic mode, EDEX keeps track of what ISC grids have been sent since the grids were last modified. When Send ISC is chosen with -automatic mode, the ifpServer sends all grids that were previously -modified +automatic mode, EDEX sends all grids that were previously modified but haven't yet been sent via ISC.


              @@ -617,7 +561,7 @@ this one-time request. As the user selects and deselects domains, the entries in the second column, Grid Source, will change. The Grid Source contains -information about the "known" ifpServers that are running the desired +information about the "known" EDEX servers that are running the desired domain. The "best" guess selection for each domain is automatically chosen, but may @@ -632,7 +576,7 @@ forecaster must choose the site and server that was used to backup your site.

              The information in the second column details the Domain, then the server. The format of the information for the server is the -host/port@site. Don't +host/port@site where site is the configured mhs id. Don't get confused if the domain is your own, but the site is someone else. This indicates that there is another server on the network that is running @@ -648,57 +592,56 @@ weather elements you normally receive via ISC. This list defaults to all elements.

              Pressing the "Make Request" button will send a request to the chosen -ifpServers, which will process the requests and send you back the +EDEX servers, which will process the requests and send you back the specific ISC data in the normal fashion.

              -


              +


              If you are requesting ISC data from a site with a different office type than your own (such as an RFC requesting data from a WFO), then the weather element you request will have the remote office type as -part of its name.    For example if you are at a WFO and -want to request QPF.   Requesting QPF will work from any WFO, +part of its name. For example if you are at a WFO and +want to request QPF. Requesting QPF will work from any WFO, but you must request QPFrfc to request the data from an -RFC.   In a similar fashion, if you are at an RFC and want -QPF from another RFC, simply request QPF.  But if you want QPF +RFC. In a similar fashion, if you are at an RFC and want +QPF from another RFC, simply request QPF. But if you want QPF from an WFO, you must choose QPFwfo.


              Interpolate Dialog

              The interpolation dialog controls the interpolation for the selected time -ranges and weather elements.  The user can choose interpolate by +ranges and weather elements. The user can choose interpolate by gaps, in which all gaps are interpolated, or based on edited data, in which only those grids that been edited will be preserved and all other grids and gaps will be interpolated. -

              The user may  choose an interpolation interval in hours.  +

              The user may choose an interpolation interval in hours. The scale varies from the minimum size of the time constraints for the -selected weather elements up to 24 hours.  If the user chooses 1, +selected weather elements up to 24 hours. If the user chooses 1, then a grid will be created each hour (or the minimum allowable time for -the weather element).  If the user chooses 3, then interpolated +the weather element). If the user chooses 3, then interpolated grids will be created every 3 hours.

              -

              The user may choose the duration of the grids in hours.  The +

              The user may choose the duration of the grids in hours. The scale varies from the minimum size of the time constraints for the selected weather -elements up to 24 hours.  If the user chooses 1, then each +elements up to 24 hours. If the user chooses 1, then each interpolated grid will be 1 hour in length (or the minimum allowable time for the weather -element).  If the user chooses 3, then each interpolated grid will +element). If the user chooses 3, then each interpolated grid will be 3 hours in length if possible.

              Note that the "Interpolation Interval In Hours" and the "Duration of Grids in Hours" may not always appear on the dialog, depending upon the time constraint characteristics of the weather elements you have -selected.  +selected. The "Duration of Grids in Hours" will not appear when selecting a weather element in which gaps are permitted, or when weather elements are @@ -713,46 +656,45 @@ set in the gfe configuration file. See the Interpolation Dialog Defaults section.

              -

              +


              Create From Scratch Dialog

              The create from scratch dialog creates new grids for the selected time -ranges and weather elements.  The user can choose to fill the +ranges and weather elements. The user can choose to fill the newly created grids using either the default weather value for the weather element, or the currently assigned pick-up value. -

              The user may  choose an creation interval in hours.  The +

              The user may choose an creation interval in hours. The scale varies from the minimum size of the time constraints for the selected weather -elements up to 24 hours.  If the user chooses 1, then a grid will +elements up to 24 hours. If the user chooses 1, then a grid will be created each hour (or the minimum allowable time for the weather -element).  +element). If the user chooses 3, then grids will be created every 3 hours.

              -

              The user may choose the duration of the grids in hours.  The +

              The user may choose the duration of the grids in hours. The scale varies from the minimum size of the time constraints for the selected weather -elements up to 24 hours.  If the user chooses 1, then each created +elements up to 24 hours. If the user chooses 1, then each created grid will be 1 hour in length (or the minimum allowable time for the weather -element).  If the user chooses 3, then each created grid will be 3 +element). If the user chooses 3, then each created grid will be 3 hours in length if possible.

              Note that the "Creation Interval In Hours" and the "Duration of Grids in Hours" may not always appear on the dialog, depending upon the time constraint characteristics of the weather elements you have -selected.  +selected. The "Duration of Grids in Hours" will not appear when selecting a weather element in which gaps are permitted, or when weather elements are selected -with differing allowable durations.  The "Creation Interval in +with differing allowable durations. The "Creation Interval in Hours" will not appear when multiple weather elements are selected and their repeat @@ -766,8 +708,7 @@ may be set in the gfe configuration file. See the Create From Scratch Dialog Defaults section.

              -


              +



              Time Shift Dialog

              @@ -778,13 +719,12 @@ or move, and the amount of time you wish to shift (in Hours). Depending upon the selected weather elements, the slider may only allow you to select certain time shift values due to the defined time constraints of the elements. -

              After making your selections click OK.  At any time you can +

              After making your selections click OK. At any time you can click Cancel to cancel the operation and close the dialog.

              -

              -
                +

              +


              Save Selection @@ -800,12 +740,11 @@ specifying:

            The start and stop hours are relative to either 0000LT -(midnight) or 0000Z, depending upon the radiobutton setting for the +(midnight) or 0000Z, depending upon the radio button setting for the time -mode.  The following table illustrates the calculation of the time +mode. The following table illustrates the calculation of the time range based on various input factors:
            -  @@ -850,8 +789,8 @@ range based on various input factors: At any time, you can click Cancel to cancel the operation and close the dialog. -

            -
              +

            +


            Delete @@ -860,11 +799,11 @@ Selection Time Range Dialog

            delete Selection Time Ranges. To Delete an existing Time Range Definition, click on its name which will appear in the Identifier box. Then click -"Delete."
            +"Delete." At any time, you can click Cancel to cancel the operation and close the -dialog. -

            -
              +dialog.
            +

            +


            Save Forecast @@ -873,7 +812,7 @@ The Save Forecast dialog allows you to save the data of modified Forecast Weather Elements.

            The dialog displays the names of all modified Weather -Elements.  +Elements. Choose the Weather Elements you wish to save and click Save Forecast.

            The "Send ISC on Save" option can be enabled to also send out @@ -893,15 +832,15 @@ dialog. that looks like this:

            Picture of Save Dialog
            + src="images/SaveDialog.png">

            When you see a Save Dialog that looks like this, it means that you -have temporary hazard grids active in the GFE.  These temporary -grids must be merged manually before they can be saved.  If you +have temporary hazard grids active in the GFE. These temporary +grids must be merged manually before they can be saved. If you select "Save Weather Element(s) at this point, all of your modified -weather elements will be saved, except "Hazards".  To save +weather elements will be saved, except "Hazards". To save "Hazards", you must first select "Hazards->MergeHazards" from the -GFE main menu bar.  Selecting "Cancel" will not save any weather +GFE main menu bar. Selecting "Cancel" will not save any weather elements and leave the state of the grids just as they were before you attempted to save.

            @@ -909,21 +848,16 @@ attempted to save.

            Revert Forecast Dialog

            The Revert Forecast dialog allows you to revert the data of modified -Weather -Elements.   The dialog displays the names of all modified -Weather +Weather Elements. The dialog displays the names of all modified Weather Elements and you choose the Weather Elements you wish to revert to the -last saved data.  If you Revert the "Hazards" weather element, any +last saved data. If you Revert the "Hazards" weather element, any temporary hazards weatehr elements will be automatically unloaded in -the Grid Manager.  To get the temporary elements back, select from +the Grid Manager. To get the temporary elements back, select from the GFE main menu: Hazards->SeparateHazards.

            At any time you can click Cancel to cancel the operation and close -the -dialog. +the dialog.

            -


            -  +



            @@ -931,16 +865,15 @@ dialog. Official Dialog The Publish To Official dialog allows you to publish the data of Weather -Elements.  The dialog displays the names of all  Weather +Elements. The dialog displays the names of all Weather Elements for the mutable database (e.g., Fcst), and you choose the Weather Elements you wish to publish.
            The Time Period entry allows you to select all grids to be published, -the selected time range, or just certain defined time periods.  -The -time periods shown are those defined by the GFE->Define Time Ranges menu entry that also appear in the Publish @@ -952,8 +885,8 @@ any grids that overlap the defined time range will be published.

            There are several convenient buttons used to select the set of Weather -Elements.  By default, the loaded weather elements are -selected.  +Elements. By default, the loaded weather elements are +selected. The "Set All" sets all weather elements to on, the "Clear All" sets all weather elements (and sites) to off, and the Groups button brings up a menu allowing the forecaster to choose a predefined

            Formatter Launcher Dialog

            -The Formatter Launcher Dialog is opened from the Products menu.  -The -dialog -allows you to generate products using the local formatter +The Formatter Launcher Dialog is opened from the Products menu. +The dialog allows you to generate products using the local formatter infrastructure, define zone combinations, edit the final output product, and view the output log from the formatter. It is highly -recommended that you Publish To Official -prior to generating products -since usually products are generated from the Official Database. 
            -

            Each product you can generate is listed in the dialog.  To -learn +recommended that you Publish To Official prior to generating products +since usually products are generated from the Official Database.
            +

            Each product you can generate is listed in the dialog. To learn how to add your own product selections or change the entries currently in the dialog, refer to the Text Formatter User's Guide.

            By default, product generation will use the Official database for -the data source.  +the data source. The data source for product generation can be changed to use the Fcst -or -the ISC database using the "Data Source" menu.   The default +or the ISC database using the "Data Source" menu. The default may also be specified in the Definition section of each product formatter using the Definition['database'] entry.

            -

            By default, product generation will run on the ifpServer platform, -rather than on the local platform.   The forecaster may +

            By default, product generation will run on the EDEX platform, +rather than on the local platform. The forecaster may change this from the "Processor" menu.

            @@ -1004,19 +932,18 @@ change this from the "Processor" menu.
            go to the appropriate tab and click the "Run" button.

            When the "Run" button is pressed, the product will -be queued for execution.  A dialog will usually be displayed +be queued for execution. A dialog will usually be displayed allowing for entry of specific information, such as the issuance -time.  After the entry dialog is closed, the actual -formatter will be queued for execution either on the ifpServer platform +time. After the entry dialog is closed, the actual +formatter will be queued for execution either on the EDEX platform or local platform. Upon completion, the generated product will be -displayed in the dialog.  The user can then edit it, save it to a -file, store it into AWIPS, or transmit it via AWIPS.  
            +displayed in the dialog. The user can then edit it, save it to a +file, store it into AWIPS, or transmit it via AWIPS.

            For more details, refer to the Formatter Launcher How-To Guide.

            -

            Formatterlauncher
            +

            Formatterlauncher

            @@ -1024,10 +951,10 @@ Formatter Launcher How-To Guide.


            Scripts Dialog

            -The Scripts dialog is opened from the Products menu.  The dialog +The Scripts dialog is opened from the Products menu. The dialog allows you to generate products and perform other tasks. Each item shown is defined by using an entry in the gfe configuration file. is -listed in the dialog.  To learn +listed in the dialog. To learn how to add your own product selections or change the entries currently in the dialog, refer to the Product Generation @@ -1037,24 +964,23 @@ file.

            After selecting the script(s) you wish to generate, -select Run/Dismiss, or just Run.  +select Run/Dismiss, or just Run. At any time you can select Cancel to cancel the operation and close the dialog.

            -The scripts can be run either locally or on the server machine.  +The scripts can be run either locally or on the server machine. Some scripts may run quicker on the server machine since the grids will not be required to flow between the local machine and server -machine.   However, keep in mind that the directory structure +machine. However, keep in mind that the directory structure is different on the local and server machines, and thus it may be difficult to "code" up directory names that will work in both cases.
            -


            +




            Process Monitor Dialog

            The Process Monitor Dialog displays the queue of pending and finished -background processes on both the local machine as well as the ifpServer -machine.  As background processes are requested to be +background processes on both the local machine as well as the EDEX +machine. As background processes are requested to be run from the Product Generation Scripts and Formatter Launcher Dialogs, the GFE will queue them for execution.  This dialog can be used to display and manipulate the queue.
            @@ -1063,17 +989,17 @@ display and manipulate the queue.
            src="images/DialogProcessMonitor1.jpg">

            The "Local Scripts" section shows the pending, running, and finished -processes that were queued locally.  Only the processes that were -started by the current GFE will be shown.   The "Server +processes that were queued locally. Only the processes that were +started by the current GFE will be shown. The "Server Scripts" section shows the pending, running, and finished processes -that were queued remotely.  Processes queued by you, as well as +that were queued remotely. Processes queued by you, as well as other GFEs, will be shown in this area of the dialog.

            start button The "start" button flashes when -the process is running.   If the process is still pending, -then the button does not flash.  Clicking with MB1 will force the +the process is running. If the process is still pending, +then the button does not flash. Clicking with MB1 will force the process to begin, even if it will exceed the maximum configured number of background processes.

            @@ -1090,23 +1016,20 @@ that produce a lot of output may not have all of their output contained in the dialog. The window may be opened up at any time, while it is pending, running, or finished. Some log messages may not be written to the terminal window unless the .logPref file is correctly -configured.   The terminal button is only available for +configured. The terminal button is only available for server processes after the process has finished.

            -console
            +console

            Characteristics of the local processing and dialog can be set through the GFE configuration file process monitor -entries.   Characteristics of the remote processing +entries. Characteristics of the remote processing (e.g., number of simultaneous processes) can be set through the server's local configuration file.


            -
            -

            @@ -1117,47 +1040,32 @@ phrases. For detailed examples and guidelines for creating your own text products, please refer to the GFE Text Product Training Guide. -

            The Define Text Product Dialog lists all existing text products. -
            -Choosing File-->New allows you to add a new product to the list. A -dialog will appear for you to enter the name of your new product and -the +

            The Define Text Product Dialog is opened by selecting GFE-->Define Text Products. +This opens the Localization perspective with TextProducts folder selected. Within +the Text product folder are all existing text products. +

            +Choosing MB3-->New on the selected TextProducts folder +allows you to add a new product to the list. A +dialog will appear for you to enter the name of your new product and the product type. After clicking Ok, the Python editor will appear for you enter your product definition. A template is provided in the Python -window -with documentation explaining the definition. +window with documentation explaining the definition.

            -

            Editable Listboxes display the text products and utilities, and -pressing -MB3 over a box, brings up a menu described in the Editable -Listbox description. When finished, click "Close" to exit the -dialog. +

            Define Text Product Dialog

            -


            -

            -

            Define Text Product Dialog
            -

            -


            Load Sample Set Dialog

            -The Load Sample Set Dialog allows you load existing Sample Sets into -the +The Load Sample Set Dialog allows you load existing Sample Sets into the GFE Spatial Editor display. -
            To load a Sample Set, click on its name which will highlight it. You may choose more than one Sample Set. -
            To add the chosen Sample Set(s) to those already being displayed, click "Add." -
            To remove the chosen Sample Set(s) from those being displayed, click "Remove." -
            To display only the chosen Sample Set(s) and remove all others from the display, click "Replace."

            At any time, you can click Cancel to cancel the operation and close @@ -1172,7 +1080,6 @@ The Save Sample Set dialog allows you to name and save Sample Sets.

            A sample point can be added to the Spatial Editor when the Sample Tool is active by clicking on a location in the display. -
            To save the set of sample points displayed in the Spatial Editor as a named Sample Set, type a name in the Identifier box and click "Save." You may Cancel the dialog at any time. @@ -1183,8 +1090,6 @@ You may Cancel the dialog at any time.

            Delete Sample Set Dialog

            The Delete Sample Set dialog allows you delete Sample Sets. -

            To delete a saved Sample Set, click on its name which will appear in the Identifier box and click "Delete." You may Cancel the dialog at any time. @@ -1195,77 +1100,23 @@ time.

            Define Samples via Latitude/Longitude Dialog

            -The samples may be defined by latitude and longitude.  A sample +The samples may be defined by latitude and longitude. A sample point may be added based on the location in latitude/longitude through this dialog, which is accessed from the main -menu Samples entry.  The user enters the latitude and the +menu Samples entry. The user enters the latitude and the longitude -as a decimal number and that point is added to the display.  Note +as a decimal number and that point is added to the display. Note that in the Western Hemisphere, the longitudes are negative. -


            +



            About Dialog

            -The About Dialog provides general information about the GFE, as shown -in -the following table: +

            The About Dialog provides general information about CAVE.

            +


            -  -

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            Build DateDisplays the date that the software was built.
            Built ByDisplays the username (account) that built the software.
            Built OnDisplays the hostname of the machine upon which the software -was built.
            Network Protocol VersionProtocol version number, in the form of yyyymmdd, that this -software -is using.  The gfe and server must be running the same protocol -version -number or they will not be able to connect.
            VersionThe software version "tag" is shown. 
            Server Host/PortThe name and port of the currently connected ifpServer is -shown.
            Time ZoneThe current timezone for the GFE is shown.
            My WsIDThe identifier of this GFE is shown in the following format: -username@hostname:program -name:pid:lockKey.  The program name is gfe, the pid is the process -identification number, and the lockKey is an optional synchronization -value.
            -

            -
            -  -

            diff --git a/cave/com.raytheon.viz.gfe/help/MakeHazard.html b/cave/com.raytheon.viz.gfe/help/MakeHazard.html index facbdf2439..861aa11f08 100644 --- a/cave/com.raytheon.viz.gfe/help/MakeHazard.html +++ b/cave/com.raytheon.viz.gfe/help/MakeHazard.html @@ -18,10 +18,10 @@

            The MakeHazard procedure is the primary interface for creating and -editing hazards in GFE, excluding convective and tropical
            +editing hazards in GFE, excluding convective and tropical hazards, which have their own procedures (PlotSPCWatches and PlotTCPEvents). For more on how -to use the MakeHazard tool
            +to use the MakeHazard tool and general hazard methodology, check Hazard Methodlogy.

            @@ -120,9 +120,9 @@ of MakeHazard

            You can easily configure the hazards which display in the hazard lists, and the -categories available, by creating an override as user SITE to the +categories available, by creating an override at SITE level to the procedure. In the configuration -section, located in method setUI, you can setthe map types, hazard +section, located in method setUI, you can set the map types, hazard lists, categories, default categories, and more. See the example below.

            @@ -131,37 +131,32 @@ See the example below.


            The most important sections for configuration are the mapNames and the -hazardDict.   Each hazard that you want to appear in the +hazardDict. Each hazard that you want to appear in the menus must be associated with a category.   Each category must be associated with a map background (or map -backgrounds).   For example, the HU.W (Hurricane Warning) is +backgrounds). For example, the HU.W (Hurricane Warning) is part of the "Tropical Cyclone" group in the hazardDict.   The "Tropical Cyclone" category uses the Zones_<site>, Marine_Zones_<site>, and Offshore_Marine_Zones_<site> map backgrounds.

            If the lists are not synchronized properly, then the procedure will not -work.   Categories may be added and removed, and individual +work. Categories may be added and removed, and individual hazards may be added and removed (including locally defined -hazards).   The list of map backgrounds contain <site>, +hazards). The list of map backgrounds contain <site>, which is replaced with your real site identifier when the procedure -runs.  The list of map backgrounds assumes that you are using the +runs. The list of map backgrounds assumes that you are using the standard set of map shapefiles and map names as defined in Maps.py.

            -

            How It Works

            The MakeHazard first separates out the Hazards grid into separate haz* -temporary weather elements.   The user chooses the type of +temporary weather elements. The user chooses the type of event, the time, and the area (either on the grid as a selected area or -by using the map), and presses Run or Run/Dismiss.   The +by using the map), and presses Run or Run/Dismiss. The temporary weather element is created (if not already there) and the grid is created/edited as appropriate.
            -
            -

            -
            -

            diff --git a/cave/com.raytheon.viz.gfe/help/MapFiles.html b/cave/com.raytheon.viz.gfe/help/MapFiles.html index 65432743a4..d91ea64c13 100644 --- a/cave/com.raytheon.viz.gfe/help/MapFiles.html +++ b/cave/com.raytheon.viz.gfe/help/MapFiles.html @@ -3,15 +3,15 @@ - + Map Background Configuration

            -MapFiles.py - Map Background Shapefile Naming File

            +Map Files - Map Background Shapefile Handling -
            September 13, 2002
            +
            March 29, 2012

            @@ -19,66 +19,63 @@

            Organization

            Overview -
            MapFiles.py Format
            Updating Map Shapefiles

            Overview

            -The MapFiles.py file defines the shapefile names for each of the main categories -of shapefiles.  It is imported by the Maps.py -file and can be overridden by the localMapFiles.py -in order to provide easy shapefile upgrades. This document describes the -format of the MapFiles.py file. +AWIPS2 handles shapefiles differently than AWIPS1 did. The MapFiles.py file +is no longer used. Instead, a postgres maps database in conjunction with xml +configuration are now in use. Maps.py has been converted to Maps.java for +shapefile access and processing. Consequently, there is a change to how local +maps are added to the system. Also, currently the functionality that generates +edit areas from site level shapefiles has not yet been implemented. It is slated +to be implemented as DR9441. +
            +

            Updating Map Shapefiles

            +

              +
            1. Any site level .shp, .shx and .dbf map files should be placed into the + /awips2/edex/data/utility/edex_static/site/LLL/shapefiles/table_name directory + where table_name is unique.
            2. +
            3. To import one shapefile at a time, execute the + /awips2/database/sqlScripts/share/sql/maps/importShapeFile.sh script with the following + arguments: shapefile, scheme (mapdata), table (shapefile name), geometry simplification + levels (not used for Point data), user, port, and awips root directory. For detailed + instructions on how to do this, see the + Importing + Map Shapefiles into AWIPS2 using importShapeFile web page.
            4. +
            5. Next, you will need to add bundle files procedures. To do this, access the Localization + perspective in CAVE and browsing to the Bundles->Maps folder. MB3 on the Maps folder and + create a new xml file which corresponds to the shapefile folder. Copy and modify the contents + from an existing file. +
                +
              • Line and Polygon shapefiles - in the resourceData element, change the value of the + table element to the name of the database table (shapefile folder name), and the mapName + to the label to show in the Map menu in CAVE. If labels are required in the new map, then edit + the labelField in the Capability element. Otherwise, delete the capability element with type + labelableCapability. The value for the labelField relates to a column in the database table + with the same name. For example, the value CWA for the labelField refers to the values in the + cwa column of the CWA table in the mapdata scheme.
              • +
              • Point shapefiles - in the resourceData element, change the type attribute to + dbPointMapResourceData, change the value of the table element to the name of the new database + table name (shapefile filder name), and the mapName to the label to show in the Map menu in CAVE. If labels + are required in the new map, then edit the labelField in the Capability element. Otherwise, + delete the capability element with type labelableCapability. The value for the labelField + relates to a column in the database table with the same name. For example, the value CWA for + the labelField refers to the values in the cwa column of the CWA table in the mapdata scheme.
              • +
              + For more information on configuring the resource data options, the + MapResourceDataConfigOptions + page provides more details on configuring the capabilities and resources for a map. +
            6. Save to SITE level and restart CAVE.
            7. +
            +

            See the server configuration overview for information on how to make changes that are supported to the map backgrounds. -


            - -

            -MapFiles.py Format

            -The format of the MapFiles.py is very simple.  It simply contains -a list of the map filenames and assigns them to variables.  These -variables are used throughout Maps.py and -localMaps.py.  Thus as the shapefiles -are updated, the changes in the map background configuration is confined -to just one file. -
              -

            # MapFiles.py -
            # Contains a listing of filenames used for map generation. -
            # NOTE: DO NOT EDIT THIS FILE, instead use the localMapFiles.py -method -
            # of overriding this file. -

            # These are the translations (for convenience from name to shapefile -name) -
            # These entries are used in Maps.py and localMaps.py. -
            CountyMapName = 'c_30au02' -
            ZoneMapName = 'z_30au02' -
            CWAMapName = 'w_25ap02' -
            MarineZonesMapName = 'mz10se02' -
            StatesMapName = 's_24ja01' -
            BasinsMapName = 'ba18jl02' -
            FireWxZonesName = 'fz15au02' -
            RFCMapName = 'rf19fe99' -
            LakeMapName = 'lk17de98' -
            HighSeaMapName = 'hz02oc01' -
            CityMapName = 'web_city' -
            HighwayMapName = 'ri11oc01' -
            ISCMapName = 'cm14au02' -
              -
              -

            -


            -

            -Updating Map Shapefiles

            -The procedure to update map shapefiles is described in the localMapFiles.py -documentation. -

            -


            -
              +
            - diff --git a/cave/com.raytheon.viz.gfe/help/MergeHazards.html b/cave/com.raytheon.viz.gfe/help/MergeHazards.html index 0f04532485..f9fa7fa58f 100644 --- a/cave/com.raytheon.viz.gfe/help/MergeHazards.html +++ b/cave/com.raytheon.viz.gfe/help/MergeHazards.html @@ -48,16 +48,16 @@ temporary grid, the run MergeHazards.

            Checking for Invalid Combinations

            There are certain hazard combinations that are considered -invalid.  For example, BZ.W (BLIZZARD WARNING) and WS.W (WINTER +invalid. For example, BZ.W (BLIZZARD WARNING) and WS.W (WINTER STORM WARNING) should never be combined at the same grid point since they are both forecasts for the same type of hazard but of different severity.

            The MergeHazards tool includes the capability of checking for these -invalid combinations and notifying you when they occur.  If an +invalid combinations and notifying you when they occur. If an invalid combination is detected by the tool, a dialog appears informing you of the time period and hazard grids that are imporperly -combined.  The dialog looks like this:
            +combined. The dialog looks like this:

            MergeHazards Dialog
          If you select Cancel Merge, all of the grids will be left as they were before you -executed the MergeHazards tool.  You then have a chance to adjust +executed the MergeHazards tool. You then have a chance to adjust the temporary hazards grids in space and/or time to remove the invalid -combination.  If you successfully remove the invalid combination +combination. If you successfully remove the invalid combination and run the MergeHazards tool again, the grids will be properly merged into the Hazards weather element.
          @@ -84,23 +84,23 @@ into the Hazards weather element.
        If you select Continue Merge , the tool will merge the grids anyway, despite the invalid -combination.  The tool is designed this way to avoid any +combination. The tool is designed this way to avoid any frustration you may encounter if you truly believe that these hazards should be combined.

        Note that you may define your hazard grids such that you have more than -one invalid combination.  The MergeHazards tool displays the +one invalid combination. The MergeHazards tool displays the warning dialog as soon as it detects the first invalid combination. If you fix the first combination and attempt to merge again, the tool will -detect the next invalid combination.  You may then cancel, adjust -your grids, and attempt to merge again.  This interative process +detect the next invalid combination. You may then cancel, adjust +your grids, and attempt to merge again. This interative process will continue until no invalid combinations exist in your temporary hazard grids.

        Configuring Invalid Combinations

        The MergeHazards tool includes a rather large Python dictionary that -defines the invalid combinations for every VTEC code.  Here is a +defines the invalid combinations for every VTEC code. Here is a small snipet of this dictionary...

        "WW.Y", "LE.Y", "LB.Y", "ZR.Y"],  ...

        This small snipet of the dictionary defines the VTEC codes "AF.Y" and -"AS.Y" as having no invalid combinations.  In other words, these -hazards may be combined with any other hazard.  The "BS.Y" hazard, -on the other hand, may not be combined with 14  other winter -hazards.  If you wish, your local office may choose to edit the -MergeHazards tool and modify this dictionary.  However, we +"AS.Y" as having no invalid combinations. In other words, these +hazards may be combined with any other hazard. The "BS.Y" hazard, +on the other hand, may not be combined with 14 other winter +hazards. If you wish, your local office may choose to edit the +MergeHazards tool and modify this dictionary. However, we strongly recommend that you restrict any editing to just this -dictionary.  Any other modifications may result in the +dictionary. Any other modifications may result in the MergeHazards tool malfunctioning.

        @@ -148,7 +148,7 @@ The MergeHazards procedure follows these steps:
      • It first looks for any temporary weather elements that begin with the letters "haz*" which were created by the Separate Hazards or Make Hazard -procedures.  
        +procedures.
      • It ensures that there are no conflicting locks on the Hazards weather element.
      • @@ -159,8 +159,5 @@ weather element.
      • It deletes the set of temporary hazard grids.
      -
      -
      -
      diff --git a/cave/com.raytheon.viz.gfe/help/MetLib.html b/cave/com.raytheon.viz.gfe/help/MetLib.html index 2fb6656a3a..1f9cfd17d9 100644 --- a/cave/com.raytheon.viz.gfe/help/MetLib.html +++ b/cave/com.raytheon.viz.gfe/help/MetLib.html @@ -8,7 +8,7 @@

      MetLib User Guide

      -April 8, 2004
      +January 10, 2012

      Contents

      Introduction
      @@ -19,18 +19,17 @@ April 8, 2004

      Introduction


      -MetLib, short for Metorological Library, is a collection of Numerical -Python methods that perform meteorological operations on gridded data. +MetLib, short for Metorological Library, is a collection of Numpy +methods that perform meteorological operations on gridded data. With these tools, forecasters can create derived weather elements such as vorticity, termperature advection, or moisture convergence from within the SmartTool framework.  These methods should help forecasters more easily inject science into the process of weather forecasting with the Graphical Forecast Editor.

      -As this is the first version of this library, much work remains. - But the library does contain the basic building blocks from which -very complex yet meteorological techniques can be developed.  As -the library is used in the field and new additions requested, the +The library currently contains the basic building blocks from which +very complex yet meteorological techniques can be developed. As +the library is used in the field and new additions are requested, the library will continue to grow.

      Currently the @@ -50,6 +49,14 @@ neighboring grid point.  This method is not meant to be used in a SmartTool, but is documented here for completeness.  See below for methods that use the centeredDifference method  to calculate derivatives.

      +

      forwardDifference(grid, axis)
      +

      +

      The +forwardDifference method calculates forward difference derivative.

      +

      backwardDifference(grid, axis)
      +

      +

      The +backwardDifference method calculates backward difference derivative.

      d_dx(grid)

      The d_dx method calculates a partial derivative along the x axis. @@ -86,12 +93,12 @@ millibars, then you should divide the result by 25 mb.
      d_dt(grid)

      The d_dt method calculates a partial derivative along the time -axis.  For this method to work properly, you must specify a +axis. For this method to work properly, you must specify a 4-dimensional grid.   If a grid of fewer than 4 dimensions is specified, an error will be reported.  Note that for GFE grids the time dimension is outer loop dimension. In all cases, you will need to construct your own 4-dimensional grid before calling this method. - Standard GFE methods only return 3-dimensional grids at best.

      gradient(scalarGrid)
      diff --git a/cave/com.raytheon.viz.gfe/help/ModelBlend.html b/cave/com.raytheon.viz.gfe/help/ModelBlend.html new file mode 100644 index 0000000000..4e0e745d19 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/ModelBlend.html @@ -0,0 +1,253 @@ + + + + + ModelBlend + + + + + + +ModelBlend +
      +
      +Introduction +
      +
      +Sometimes it is desirable +to average grids from different models, different runs, etc. This tool allows you to +make a weighted average of many grids, including the forecast, official, and model +grids. Complex weighted averages can be constructed in a single step, and model +extrapolations can also be constructed. The tool has the ability to blend +inside an edit area rather than over the entire grid, and to apply ‘edge effects’ to +the blending in those areas – so that they blend in smoothly with unmodified points +outside the edit area. The tool can be used on any scalar or vector grid. +When used on a vector grid, the vector is changed into components before performing +the weighted average, then transformed back to the normal vector grid. +
      +
      +
      +How +the Procedure Works +
      +
      +Lets say we start with a +Fcst minimum temperature forecast grid that looks like this:
      +ModelBlend User Interface
      +
      +
      +
      +Now suppose that the latest +ADJMEX model forecast grid for the same period (a 6-day forecast) looks like this:
      +ModelBlend User Interface
      +
      +
      +
      +The difference between +these two grids is very complex:
      +ModelBlend User Interface
      +
      +
      +
      +Now, suppose we somewhat +believe this ADJMEX model forecast. However, since it is a day-6 forecast, we want +to slowly nudge our forecast grid toward the ADJMEX solution, rather than adopt +the ADJMEX grid completely. The Model_Blend tool allows us to make a weighted +average of our current Forecast Grid and this ADJMEX forecast grid. +
      +
      +
      +Running +the Procedure +
      +
      +When the Model_ Blend tool +is started, a dialog appears where you can specify weights for various forecast, +official and model grids:
      +ModelBlend User Interface
      +
      +
      +
      +Note that the default it to +weight the forecast grid with a value of one, and all other grids with a value of zero. +Thus, if nothing on this dialog were changed, and the tool run (by clicking on the Run +or Run/Dismiss buttons), then the forecast grid would be returned unchanged.

      +In this case, suppose we want to evenly weight the current forecast grid and the latest +ADJMEX forecast grids that were shown above. We could change the slider weights to +indicate this:
      +ModelBlend User Interface
      +
      +
      +Weighting the grids evenly +means that a simple average is being performed. The average grid comes out:
      +ModelBlend User Interface
      +
      +
      +If you carefully look at the +sample points, you will see that the grid is an average of the Forecast and ADJMEX grid. +

      +Note that in this case we set the weights to one for both the Forecast and the ADJMEX +grid. We could have easily weighted them both ten, and the result would be the same. +The magnitude of the weights is irrelevant in this case, the fact that the weights are +equal means that a simple average is performed. +

      +Suppose, instead, that we wanted to weight our average more strongly toward the new +model solution. We could set the weights such that the ADJMEX model is weighted with +a value of three, and the current forecast with a value of one.
      +ModelBlend User Interface
      +
      +
      +Since there are four total +units, and the ADJMEX receives three and the current forecast one, the ADJMEX will make +up 75% of the new grid (3/4) and the current forecast will make up 25% (1/4) of the new +grid. The new weighted average looks like:
      +ModelBlend User Interface
      +
      +
      +Suppose, instead, that we +want to evenly weight the current ADJMEX 6-day forecast, with the 7-day forecast from +the previous ADJMEX run. This evenly accomplished by setting the weights equally in +the Model_Blend dialog:
      +ModelBlend User Interface
      +
      +
      +Note that we set the weight +for the current forecast to zero - indicating that we want only the average of the two +ADJMEX runs. The two ADJMEX forecast grids look like this:
      +ModelBlend User Interface
      +
      +
      +The resulting simple average +of these two grids becomes:
      +ModelBlend User Interface
      +
      +
      +The weight sliders can be +configured to allow negative values. Negative weights allow you to perform model +extrapolations. Consider, for example, only the sample value at Burns, Oregon +(the westernmost sample point on the images). The current ADJMEX run forecasts +44 degrees for this point, while the previous run forecast 41 for this point. +The ADJMEX forecasts are getting warmer. One could argue that the best forecast +might be even warmer than the 44 degrees forecast by the latest ADJMEX run. +A simple extrapolation can be performed by making the weight for the earlier run +negative, and half as large as the current run. For example, we can set the weight +for the latest run to two, and the weight for the earlier run to negative one:
      +ModelBlend User Interface
      +
      +
      +Consider, again, only +the point for Burns, Oregon. The new value will be (2*44) + (-1*41) = 47. +The trend of warming 3 degrees is continued for 3 more degrees of warming. +This is performed individually at every gridpoint. Some gridpoints cooled between +the first run and the second run, and likewise at those locations, the cooling is +extrapolated to the final grid. The resulting grid looks like this:
      +ModelBlend User Interface
      +
      +
      +Note that the sample value +at Burns, Oregon turned out to be 47, just as we calculated above. +

      +A simple extrapolation, as described above may be too extreme. Again, considering +only the forecast for Burns: the 7-day forecast was 41 and the 6-day forecast was 44. +If you believe that such a trend will continue, then the 5-day forecast will be 47, +the 4-day forecast will be 50, the 3-day forecast will be 53, the 2-day forecast +will be 56, the 1-day forecast will be 59, and the final temperature will be 72. +Such a procedure is clearly nonsense. The 6-day forecast of 44 is warmer than the +earlier run, but it is the best forecast that the model can provide at that time. +While extrapolating the trend somewhat might be reasonable, extending it indefinitely +is foolish. +

      +Suppose that we want to use some of the trend, but weight the combination strongly +toward the value in the latest forecast. Again, you can use negative weights on an +earlier forecast, but much larger positive weights on the latest forecast. +For example, if we weight the new forecast with a value of eight, and the old +forecast with a value of negative one:
      +ModelBlend User Interface
      +
      +
      +The resulting grid looks like:
      +ModelBlend User Interface
      +
      +
      +Note that the extrapolation +makes a forecast of 44 at Burns. The continuation of the trend is so small that it +is indistinguishable from the latest ADJMEX forecast. +

      +More than two grids can be combined using the Model_Blend tool. You can set equal +weights for all grids, and get a simple average of all model forecasts. Very complex +weighting schemes that weight one model more heavily than others can also be +accomplished. +

      +New in version 2.0 of the tool, is the ability to apply the blend over the current +edit area, rather than the entire grid. For example, here we display an edit area +over both the current Fcst grid and the ADJMEX grid.

      +Current Fcst Grid:
      +ModelBlend User Interface

      +ADJMEX Grid:
      +ModelBlend User Interface
      +
      +
      +If we specify the +weights in Model_Blend dialog to be zero for the Fcst grid and one for the ADJMEX +grid (essentially copying the ADJMEX grid into the Fcst grid – but only inside the +edit area):
      +ModelBlend User Interface
      +
      +
      +Then the resulting grid becomes:
      +ModelBlend User Interface
      +
      +
      +Note that because we +specified “Flat†(the default) that some intense temperature “gradients†were +introduced. This is because the model data copied inside the edit area does not +match with the original Fcst grid outside the edit area. There are two ways to +mitigate this problem. +

      +First, you can specify an “edge†behavior inside the edit area where “blending†will +taper back to zero, (and you can specify the edge width – in pixels) such as:
      +ModelBlend User Interface
      +
      +
      +Where the default edge +width of 5 pixels is chosen. The resulting grid comes out:
      +ModelBlend User Interface
      +
      +
      +Note that there are no +extreme “gradients†and that within 5 pixels of the edge of the edit area, the r +esulting grid is a blend of the ADJMEX grid and the Fcst grid. +

      +If, instead, you would like only the center of the edit area to get the full Model +Blend that you specify – and taper back smoothly to the original grid at the outer +edge of the edit area, then you could specify “Taper†in the dialog:
      +ModelBlend User Interface
      +
      +
      +Here the resulting grid comes out:
      +ModelBlend User Interface
      +
      +
      +One important restriction on +your weights is enforced: the weights cannot add up to zero. You cannot weight one +model with positive one and another with negative one, because the total weight would +be zero. This can also occur if model data cannot be read from the database - in +which case the weight for that model run is removed from the overall weights. +Care should be take to use the tool with model grids that exist - and with +combinations of weights that do not add to zero. +

      +
      + + diff --git a/cave/com.raytheon.viz.gfe/help/NDFD_QPF_Checks.html b/cave/com.raytheon.viz.gfe/help/NDFD_QPF_Checks.html new file mode 100644 index 0000000000..1f4b9ee779 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/NDFD_QPF_Checks.html @@ -0,0 +1,250 @@ + + + + + NDFD_QPF_Checks + + + + + + +NDFD_QPF_Checks +
      +
      +What the Procedure Does +
      +
      +The NDFD_QPF_Checks procedure performs two, +simple consistency checks on the SnowAmt6hr grid: +
        +
      1. 1.Where SnowAmt6hr >= 0.5 inches, checks to ensure QPF6hr >= 0.01 inches.
      2. +
      3. 1.Where SnowAmt6hr >= 0.1 inches, checks to ensure at least one of the overlapping Wx grids + contains S, SW, and/or IP. The frozen precipitation type can be mixed with any liquid and/or + freezing precipitation type. The procedure does not consider probability, coverage, intensity, and/or + visibility of the frozen precipitation in the Wx grid.
      4. +
      +The procedure also performs two, simple consistency checks on the QPF6hr grid: +
        +
      1. 1.Where QPF6hr > 0.0, checks to ensure at least one of the overlapping PoP grids is greater than + zero. The PoP grids here are the “floating†PoP grids.
      2. +
      3. 1.Where QPF6hr > 0.0, checks to ensure that at least one of the overlapping Wx grids has at least + one of the precipitating Wx types, which includes L and ZL. The check is made against the Wx type only. + The procedure does not consider probability, coverage, intensity, and/or visibility of the precipitating + Wx type.
      4. +
      +Finally, the procedure performs a simple check on the PoP12hr grid: Where PoP12hr >= 50%, checks to ensure +at least one of the overlapping QPF6hr grids >= 0.01 inches.
      +
      +
      + + Usage Considerations +
      +
      + +
        +
      1. It is assumed and recommended that the user derives the QPF6hr, SnowAmt6hr, and PoP12hr grids + using other GFE procedures and/or smart tools. The National Smart Tool/Smart Initialization Team (STSIT) + strongly recommends the Collaborate_PoP_SnowAmt_QPF procedure for this task. If NDFD_QPF_Checks finds + inconsistencies, then you will need to: +
          +
        1. Fix the QPF, SnowAmt, PoP, and/or Wx grids;
        2. +
        3. Regenerate the QPF6hr, SnowAmt6hr, and PoP12hr grids;
        4. +
        5. Re-run the NDFD_QPF_Checks procedure.
        6. +
        + Finally, the “Send Grids to NDFD†script does not send the QPF6hr, SnowAmt6hr, or PoP12hr grids to NDFD. + It still sends the QPF, SnowAmt, PoP, and Wx grids. Thus, it is imperative that whatever means you use to + derive QPF6hr, SnowAmt6hr, and PoP12hr grids emulates what the NDFD server does to create its grids from + the grids sent from the GFE. The Collaborate_PoP_SnowAmt_QPF meets this need.
      2. +
      3. For all checks, if the initial threshold is not triggered, then the grids are considered consistent by + definition. In other words: +
          +
        1. If SnowAmt6hr < 0.5 inches, then SnowAmt6hr and QPF6hr are always consistent.
        2. +
        3. If SnowAmt6hr < 0.1 inches, then SnowAmt6hr and Wx are always consistent.
        4. +
        5. If QPF6hr < 0.01 inches, then QPF6hr and PoP are always consistent.
        6. +
        7. If QPF6hr < 0.01 inches, then QPF6hr and Wx are always consistent.
        8. +
        9. If PoP12hr < 50%, then PoP12hr and QPF6hr are always consistent.
        10. +
        + Later in the documentation, a reference to “control†parameters/grids will be made. For each check listed + above, the first parameter listed is what will be called the “control†parameter/grid.
      4. +
      5. For the checks that involve SnowAmt6hr, QPF6hr, and PoP12hr, the start time and duration of those + grids are verified. If any of these grids have been stretched, the procedure will not perform the + associated check and will generate an urgent GFE message. For the SnowAmt6hr and QPF6hr grids, they must + start at 00, 06, 12, or 18 UTC and be exactly 6 hours in duration. For the PoP12hr grids, they must start + at 00 or 12 UTC and be exactly 12 hours in duration.
      6. +
      7. With no time range selected in the grid manager, the procedure will use 0 to 240 hours, with respect + to UTC, as the time range. If all of the checked grids exist out to 240 hours, they will all be checked. + In many WFOs, some of the checked grids do not go out to 240 hours. In those cases, the checks will only + be done for the time range of the “control†parameter. For example, if your SnowAmt6hr grid spans the 0 + to 72 hour time range, then the two SnowAmt6hr checks will stop at 72 hours. This same idea holds for + swept out time ranges, i.e., if you sweep out a time range beyond the end of one of the “control†+ parameters, the check will stop with the last “control†parameter grid.
      8. +
      9. The procedure makes some attempts to identify missing grids. (It should be noted that these attempts + are not very robust. There are probably just as many cases of missing grids being identified as there are + cases of missing grids not being identified.) There is an underlying assumption in those attempts that the + “control†parameter will not extend later in time than the parameter it is being checked against. This + assumption breaks down for the PoP12hr/QPF6hr check because NDFD requires the PoP12hr grid at later time + steps than the QPF6hr grid. To avoid generating a lot of erroneous missing QPF6hr grid warning messages, + the procedure will compare the end times of the two grid sets. If the PoP12hr grid does extend farther in + time than the QPF6hr grid, then the time range used in the PoP12hr/QPF6hr check will be dynamically + adjusted back to the end of the last QPF6hr grid which has an end time of either 00 or 12 UTC.
      10. +
      11. When the procedure is installed, it can be configured to use an edit area which covers just your CWA. + If this is done, then the procedure will only return inconsistencies over that edit area. If this is not + done, or the procedure has a problem with the CWA edit area, then the procedure will run over the entire + domain. In the latter case, this means you can get flagged for inconsistent points in your GFE domain that + are totally outside your CWA. In no case will the procedure run over any edit areas drawn in the GFE + Spatial Editor window. It always runs over the whole GFE domain.
      12. +
      13. 1.For each check, the procedure loops over the available “control†grids. For each “control†grid, + the overlapping “non control†grids are checked for consistency. For the checks involving PoP and Wx, + it's possible for the “control†grid and the PoP/Wx grid to not be aligned. By this, it is meant a PoP/Wx + grid could have a start time earlier than the start time of the “control†grid or a PoP/Wx grid could + have an end time later than the end time of the “control†grid. While the procedure doesn't care if + this is the case, the results, if there are inconsistencies, could be difficult to interpret since the + PoP/Wx grid is not only being compared to the current “control†grid but also to the previous or next + “control†grid. For example, let's say you're running the QPF6hr/Wx check. The QPF6hr grid being check + runs from 06 to 12 UTC. However, overlapping this QPF6hr grid are two Wx grids. One runs from 06 to + 09 UTC and the other runs from 09 to 15 UTC. The first grid presents no problems since it's aligned + with the QPF6hr grid. However, the second grid extends beyond the end of the QPF6hr grid (15 UTC + vs 12 UTC). If an inconsistency arises and the solution is to change the Wx grid, the change will + have to be made such that two QPF6hr grids are consistent with it, the one running from 06 to 12 UTC + and the on running from 12 to 18 UTC.
      14. +
      15. For the SnowAmt6hr/Wx check, the QPF6hr/Wx check, and the PoP12hr/QPF6hr check, any temporary + inconsistent grid will span the time range of the “controlling†grid. The temporary inconsistent grid + will show the points where ALL of the “non controlling†grids were inconsistent. See figures 8 through + 11.
      16. +
      +When the procedure is run, the forecaster is presented with several choices. The first is whether to run +checks or to “Cleanupâ€. By default, the procedure will run checks. The “Cleanup†option will undo any +highlighting and remove any temporary grids. With the “Cleanup†option selected, all other options on the +GUI are ignored. If you leave “Check†selected, then you can choose which of the checks you wish to run by +toggling on and off the appropriate button. By default, all checks will be run:
      +NDFD_QPF_Checks

      +The procedure will create temporary grids which show where the inconsistencies occur. The values in all the +temporary grids are either zero (consistent) or one (inconsistent). The temporary grid names are a +concatenation of the two grid names used in the check with the “control†grid name first. The procedure +can also be configured to highlight both the temporary grids and the bad “source†grids. In the default +configuration, highlighting is turned on with the bad “source†grids colored red and the temporary grids +colored orange. (See Figures 3 through 7.) The procedure does not modify any grids. It's left up to the +forecaster to determine how, if at all, to handle the inconsistencies. The issue of a check only versus a +check/force procedure was discussed by the STSIT and the consensus recommendation was a check only +procedure. The STSIT feels strongly that there are no meteorologically sound ways to force consistency +of these grids, but we are always willing to listen to and consider other points of view. Any +inconsistencies will pop up a “significant†GFE message:
      +NDFD_QPF_Checks

      +This is an example of how the GFE will look after the procedure is run and there are inconsistencies. +In the grid manager, you can see one temporary grid, SnowAmt6hrQPF6hr, has been created and is +highlighted in the color orange. The corresponding SnowAmt6hr and QPF6hr grids have been highlighted +in the color red. In the above figure, there is a also second “significant†message. Note the +“Acknowledge All (1 Pending...)â€. That message tells the user the procedure ran over a swept-out time +range. Since the procedure has no way of knowing whether the user meant to sweep out a time range, It was +decided to put in a “significant†pop-up to “remind†the user. Finally, while not shown, there are conditions +that can generate an “Urgent Message†pop-up, the ones that are colored red. Some conditions that cause +urgent messages are: missing grids, locked grids, and bad time constraints.
      +NDFD_QPF_Checks

      +The SnowAmt6hr/QPF6hr check enforces the following rule:
      +If SnowAmt6hr >= 0.5 in, then QPF6hr >= 0.01 in.
      +In the above figure, there are four sample points, each in a unique zone. Starting in the “upper-left†+zone and moving clockwise, the sample points have the following values:

      +SnowAmt6hr = 0.5 in, QPF6hr = 0.01 in, SnowAmt6hrQPF6hr = 0: This is a good result.
      +SnowAmt6hr = 0.5 in, QPF6hr = 0.00 in, SnowAmt6hrQPF6hr = 1: This is a bad result.
      +SnowAmt6hr = 0.0 in, QPF6hr = 0.00 in, SnowAmt6hrQPF6hr = 0: This is a good result.
      +SnowAmt6hr = 0.0 in, QPF6hr = 0.01 in, SnowAmt6hrQPF6hr = 0: This is a good result.

      +NDFD_QPF_Checks

      +The SnowAmt6hr/Wx check enforces the following rule:

      +If SnowAmt6hr >= 0.1 in, then one of the overlapping Wx grids must contain S, SW, or IP. Only the Wx +type is important to this check. The Probability/Coverage, Intensity, and Visibility are all ignored. +Also, the frozen types can be mixed with the liquid and/or freezing types. +In the above figure, there are four sample points, each in a unique zone. Starting in the “upper-left†+zone and moving clockwise, the sample points have the following values:

      +SnowAmt6hr = 0.5 in, Wx = Chc S-, SnowAmt6hrWx = 0: This is a good result.
      +SnowAmt6hr = 0.5 in, Wx = NoWx, SnowAmt6hrWx = 1: This is a bad result.
      +SnowAmt6hr = 0.0 in, Wx = NoWx, SnowAmt6hrWx = 0: This is a good result.
      +SnowAmt6hr = 0.0 in, Wx = Chc S-, SnowAmt6hrWx = 0: This is a good result.

      +NDFD_QPF_Checks

      +The QPF6hr/PoP check enforces the following rule:

      +If QPF6hr > 0.0 in, then at least one of the overlapping PoP grids > 0%. +In the above figure, there are four sample points, each in a unique zone. Starting with the “upper-left†+zone and moving clockwise, the sample points have the following values:

      +QPF6hr = 0.01 in, PoP = 1%, QPF6hrPoP = 0: This is a good result.
      +QPF6hr = 0.01 in, PoP = 0%, QPF6hrPoP = 1: This is a bad result.
      +QPF6hr = 0.00 in, PoP = 0%, QPF6hrPoP = 0: This is a good result.
      +QPF6hr = 0.00 in, PoP = 1%, QPF6hrPoP = 0: This is a good result.

      +NDFD_QPF_Checks

      +The QPF6hr/Wx check enforces the following rule:

      +If QPF6hr > 0.00 in, then at least one of the overlapping Wx grids must contain a precipitating Wx type. +These are: R, RW, L, S, SW, IP, ZR, and ZL Only the weather type is considered in the check. The +Probability/Coverage, Intensity, and Visibility are all ignored. In the above figure, there are four +sample points, each in a unique zone. Starting with the “upper-left†zone, the sample points have the +following values:

      +QPF6hr = 0.01 in, Wx = Chc S-, QPF6hrWx = 0: This is a good result.
      +QPF6hr = 0.01 in, Wx = NoWx, QPF6hrWx = 1: This is a bad result.
      +QPF6hr = 0.00 in, Wx = NoWx, QPF6hrWx = 0: This is a good result.
      +QPF6hr = 0.00 in, Wx = Chc S-, QPF6hrWx = 0: This is a good result.

      +NDFD_QPF_Checks

      +The Pop12hr/QPF6hr check enforces the following rule:

      +If Pop12hr >= 50%, then at least one of the overlapping QPF6hr grids must be > 0.00 in.

      +This is the first figure where the “controlling†grid is shown with more than one overlapping +“non controlling†grid. The second QPF6hr grid, which is not shown, has 0.00 in assigned to +the entire grid, which means it cannot be consistent with the PoP12hr grid where it is >= 50%. +In the above figure, there are four sample points, each in a unique zone. Starting with the +“upper-left†zone and moving clockwise, the sample points have the following values:

      +PoP12hr = 50%, QPF6hr = 0.01 in, PoP12hrQPF6hr = 0: This is a good result.
      +PoP12hr = 50%, QPF6hr = 0.00 in, PoP12hrQPF6hr = 1: This is a bad result.
      +PoP12hr = 49%, QPF6hr = 0.00 in, PoP12hrQPF6hr = 0: This is a good result.
      +PoP12hr = 49%, QPF6hr = 0.01 in, PoP12hrQPF6hr = 0: This is a good result.

      +NDFD_QPF_Checks

      +The edit areas were constructed from the following query:

      +wxContains(Wx,[],['', 'BD', 'BN', 'BS', 'F', 'FR', 'H', 'IC', 'IF', 'K', 'T', 'VA', +'WP', 'ZF', 'ZY',[],[],[]) & (QPF6hr > 0) & ISC_Send_Area (This all fits one the query +line in the GFE.) Explanation of this figure follows the screen print below.
      +NDFD_QPF_Checks

      +The edit areas were constructed from the following query:

      +wxContains(Wx,[],['', 'BD', 'BN', 'BS', 'F', 'FR', 'H', 'IC', 'IF', 'K', 'T', 'VA', +'WP', 'ZF', 'ZY',[],[],[]) & (QPF6hr > 0) & ISC_Send_Area (This all fits one the query +line in the GFE.) The query simulates the inconsistency for this check: Where QPF6hr > 0, +the Wx grid has no precipitable type. +

      +The two previous screen shots show a case where two “non controlling†grids (Wx) are +individually inconsistent with the “controlling†grid (QPF6hr), but together are consistent. +In other words, everywhere the “first†Wx grid is inconsistent, the “second†Wx grid is consistent. +Similarly, everywhere the “second†Wx grid is inconsistent, the “first†Wx grid is consistent. +Since, together, the two Wx grids are consistent with the QPF6hr grid, there is no QPF6hrWx +temporary grid in either of the last two screen shots.
      +NDFD_QPF_Checks

      +The edit areas shown are from the following query:

      +(PoP12hr >= 50) & (QPF6hr < (0.01-0.0001)) & ISC_Send_Area

      +Explanation of this figure follows the screen print below.
      +NDFD_QPF_Checks

      +The edit areas shown are from the following query: +(PoP12hr >= 50) & (QPF6hr < (0.01-0.0001)) & ISC_Send_Area +This simulates the inconsistent condition of the check: Where PoP12hr >= 50, QPF6hr = 0. +

      +This example shows a case where one of the QPF6hr grids (06-12 UTC grid) is more inconsistent +with the PoP12hr grid than the other QPF6hr grid (00-06 UTC). The temporary PoP12hrQPF6hr +inconsistent grid has the value 1 (bad) only where both QPF6hr grids are inconsistent with the +corresponding PoP12hr grid.

      +Tips
      +If you have inconsistencies, here's an example of how you can quickly generate edit areas +for the inconsistent areas: +
        +
      • Left-click on the “?†to open the query dialog.
      • +
      • Under “Weather Elementsâ€, there should be at least one temporary grid element listed. + Left-click on one of them, then left-click on the “==â€, and finally left-click on the + number “1â€. Then, left-click on “Submitâ€.
      • +
      • Move/hide/cancel the query dialog. Now, you can make an temporary grid editable, + assign a value or run a tool and these actions will apply to the inconsistent areas only.
      • +
      +
      + + diff --git a/cave/com.raytheon.viz.gfe/help/PlotSPCWatches.html b/cave/com.raytheon.viz.gfe/help/PlotSPCWatches.html index d1a7c2cd0b..7079f1d0fe 100644 --- a/cave/com.raytheon.viz.gfe/help/PlotSPCWatches.html +++ b/cave/com.raytheon.viz.gfe/help/PlotSPCWatches.html @@ -9,7 +9,7 @@

      PlotSPCWatches

      Procedure for adding SPC Watches into your Hazards Grid

      -August 30, 2005
      +March 9, 2012


      Methodology
      @@ -27,8 +27,6 @@ done by SeparateHazards. If it is separated, use the MergeHazards tool to recombine the temporary grids.

      -
      -
      When a WOU arrives from SPC, it is decoded internally, and a notification appears on all GFEs.

      @@ -68,17 +66,17 @@ Launcher.

      How It Works

      The PlotSPCWatches procedure analyzes the VTEC -active table and filters records. 
      +active table and filters records.
      • Records currently valid (not ones from the past) from the WOU and WCN products are separated into those originating from SPC (with action codes of NEW CON EXT EXA and EXB), and those from non-SPC (all actions including EXP and CAN).
      • -
      • Records are then compared.  Records are eliminated from the -SPC list that are also in the non-SPC list.  Comparisons are based +
      • Records are then compared. Records are eliminated from the +SPC list that are also in the non-SPC list. Comparisons are based on the Event Tracking Number, Geographical Zone, Phen and -Sig.   After this step, the SPC list should only have records +Sig. After this step, the SPC list should only have records that contain the NEW watch.
      • Records containing EXP and CAN codes are now eliminated from the non-SPC list.
      • @@ -89,14 +87,9 @@ eliminated.
        then the calculated watches are added to the Hazards grid.
      Note: The PlotSPCWatches tool only plots events that are compatible -with the current GFE mode.  If the GFE mode is operational, then -only "X", "O", and "E" WOU/WCN events will be considered.  If the +with the current GFE mode. If the GFE mode is operational, then +only "X", "O", and "E" WOU/WCN events will be considered. If the GFE mode is "TEST", then only "T" WOU/WCN events will be considered.

      -


      -

      -
      -
      diff --git a/cave/com.raytheon.viz.gfe/help/PlotTPCEvents.html b/cave/com.raytheon.viz.gfe/help/PlotTPCEvents.html index 4c9a7c38e9..689a964b5e 100644 --- a/cave/com.raytheon.viz.gfe/help/PlotTPCEvents.html +++ b/cave/com.raytheon.viz.gfe/help/PlotTPCEvents.html @@ -9,7 +9,7 @@

      PlotTPCEvents

      Procedure to put the current tropical hazards into the Hazards grid

      -May 2, 2006
      +March 9, 2012

      Methodology
      How It Works
      @@ -17,7 +17,7 @@ May 2, 2006
      NOTE: Due to policy changes (effective 2007 tropical season) in the TCV in that the TCV only covers coastal zones, the PlotTPCEvents now only clears and sets values in the -Hazard grids for coastal zones.   Values created by the +Hazard grids for coastal zones. Values created by the forecaster in the marine zones will not be modified by the PlotTPCEvents procedure.  No Event Tracking Numbers are set in the Hazards grid since ETNs for tropical events now follow WFO numbering.
      @@ -26,21 +26,19 @@ Hazards grid since ETNs for tropical events now follow WFO numbering.

      -
      The PlotTPCEvents procedure is used to automatically decode the Tropical Prediction Center TCV product, and plot the resulting data in the GFE Hazard Grid. -To run this procedure,  the Hazards grid cannot be separated into +To run this procedure, the Hazards grid cannot be separated into temporary grids as done by SeparateHazards. If it is separated, -use the MergeHazards +use the MergeHazards tool to recombine the temporary grids.

      When a TCV arrives from TPC, it is decoded internally, and a -notification appears on all GFEs.
      -
      TPC Notification
      +TPC Notification

      Next, the forecast will select
      If the latest TCV cancels an existing event, you will see the event removed. If the latest TCV replaces a portion of an existing event, the -watch/warning will be -overwritten in the grid.
      +watch/warning will be overwritten in the grid.

      If for some reason a cancellation VTEC code does not arrive for an existing tropical event, you may need to run
      SeparateHazards
      , delete the canceled hazard then run MergeHazards -.
      + style="color: rgb(0, 0, 0);">MergeHazards. +

      The TCV product and the PlotTCVEvents procedure only contain coastal -zone events.  The forecaster is responsible for adding the +zone events. The forecaster is responsible for adding the appropriate marine tropical events and inland tropical events to the -Hazards grid.  PlotTCVEvents will only remove coastal zone events +Hazards grid. PlotTCVEvents will only remove coastal zone events and not inland or marine events.

      @@ -84,7 +81,7 @@ and not inland or marine events.

      How It Works

      This procedure is based on the TCV product events that have been -captured into the VTEC Decoder.  The +captured into the VTEC Decoder. The procedure performs the following steps:
      • Reads the vtec active table.
      • @@ -98,15 +95,14 @@ cancelled events (VTEC action is EXP, CAN).
      Once the correct set of events have been determined,  any existing tropical hazards in the Hazards grid that are found in the cancelled -event list are removed.  Then the +event list are removed. Then the calculated events are added to the Hazards grid.

      Note: The PlotTPCEvents tool only plots events that are compatible -with the current GFE mode.  If the GFE mode is operational, then +with the current GFE mode. If the GFE mode is operational, then only "X", "O", and "E" TCV events will be considered.  If the GFE mode is "TEST", then only "T" TCV events will be considered.

      -
      diff --git a/cave/com.raytheon.viz.gfe/help/Populate_SkyProcedure.html b/cave/com.raytheon.viz.gfe/help/Populate_SkyProcedure.html new file mode 100644 index 0000000000..defd4458ce --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/Populate_SkyProcedure.html @@ -0,0 +1,235 @@ + + + + + Populate_SkyProcedure + + + + + + +Populate_SkyProcedure +
      +
      +Overview +
      +
      + The Populate_SkyTool (and +Populate_SkyProcedure) populate the GFE Sky_Cover grids based on an algorithm that finds +the maximum model-layer relative humidity (RH), and then applies an exponential relationship +to convert RH to sky cover at each grid point. The Populate_SkyTool contains other functions, +including the ability to turn on/off near surface and high clouds, the option to apply RH +with respect to ice at temperatures below -25C, and “limit value†functionality. +This document explains how the Populate_SkyTool works, and tips for using it. +

      +This section explains the underlying premise of the Populate_SkyTool, and how it uses model RH to +determine sky cover. +
        +
      1. Clouds are determined by first finding the maximum model layer RH (at each grid point) + at the forecast time, corresponding to the availability of model data. The methodology eliminates + the need to manually “pick†a level or layer where the clouds are expected.
      2. +
      3. The maximum model layer RH is converted to sky cover through an exponential function, which + can be customized on-the-fly by the forecaster. The exponential relationship has been established + observationally in previous published works (e.g., Walcek, 1994, his Figure 7b), but the exact + shape of this function is not well known and likely depends on stability, shear, temperature, + and other variables. Where model RH is concerned, varying model resolution and different physical + parameterizations impact the distribution of RH. Thus, the exponential function can be customized + by the forecaster to adjust the resultant sky cover.
      4. +
      5. Other functionality, including a “limit values†feature, the ability to turn on/off clouds + below 925mb and in the 500-300 mb layer, and the ability to use a modified RH with respect to + ice at temperatures colder than -25C, augment the basic functionality of the tool outlined in + points 1 and 2.
      6. +

      +Maximum model layer RH Algorithm
      +Since GFE OB7.1, both the GFS40 and NAM12 include near-surface layers (30mb deep), with respect to +ground level. The Populate_SkyTool makes use of the mean RH in the lowest 4 of these near-surface AGL +layers. From 925mb to 500mb, the Populate_SkyTool has available RH data in 25mb increments. From 500mb +through 300mb, the vertical resolution available is 50mb. The RH data points are shown schematically +in Figure 1. +

      +When the user opts to exclude clouds below 925mb, the 4 near-surface layers are excluded from consideration. +When the user opts to exclude clouds between 500-300mb, RH from these data points are excluded from +consideration. Otherwise, the Populate_SkyTool uses all available RH information to determine the highest +model-layer RH value in the vertical. Each of the 4 near-surface 30mb layers is considered independently. +If the user selects a layer depth of 50mb, then 50mb centered averages are computed between 925-525mb as +follows:
      +Populate_SkyProcedure

      +where the subscript p refers to the adjacent vertical grid points. As an example, if the forecaster selects +a 50mb layer depth, then the mean RH centered about 850mb is given by,
      +Populate_SkyProcedure

      +This RH value is considered with all the other layer RH values to determine which layer has the greatest RH. +Since data is used every 25 mb, the successive 50mb RH layers overlap in the vertical. Since data is available +in 50mb increments from 500-300mb, a two-level average is taken as follows:
      +Populate_SkyProcedure

      +When 25mb layers are selected by the user, the averaging scheme involves two successive model layers:
      +Populate_SkyProcedure

      +Once the layer RH values are computed, the algorithm determines the maximum model-layer RH, and considers +this RH in determining the cloud amount (as shown in the next section).
      +Populate_SkyProcedure
      +Figure 1. Vertical grid layers and grid points utilized by the Populate_SkyTool maximum model-layer +RH algorithm.

      +Application of Exponential Response Function
      +It is assumed by the Populate_SkyTool that an exponential relationship exists between model layer RH and +cloud amount, and model layer RH is the only variable used by the tool. The exponential function allows the +tool to depict a large range of sky cover values and sharp spatial gradients in sky amount. The forecaster +has control over the shape of the exponential function used in the Populate_SkyTool, as explained below. +

      +The basic exponential function used takes the form of:
      +Populate_SkyProcedure
      +where a and b are multiplying factors modifying the shape of the function. +

      +In the specific case of the Populate_SkyTool, a basic exponential function was assumed, with variables to allow +for modification of the function’s shape. While we are confident the function is inherently exponential +in nature, there is not a unique correct shape for this model RH-Sky relationship; it depends on model +parameterizations and other physical factors. So, the goal here is to allow flexibility for adjustments, +if necessary, based on a forecaster’s operational experience with the behavior of the numerical models in +various situations. The function is:
      + Populate_SkyProcedure
      + Where dash-RH is the maximum model layer RH value (in percent), RHCLR (in percent) is the user + customized RH threshold for clear skies (resultant Sky Cover 5% or less), and b is a calibration + factor that modulates the slope of the exponential function. The default values are b=1.0 and + RHCLR = 60%. Setting these variables within the Populate_SkyTool is explained further in Section 4.

      + EXAMPLE 1. +

      +Based on the tool’s default values (b=1.0, RHCLR=60%), when the max model layer RH = 100%, we get:
      +Populate_SkyProcedure
      +A maximum model layer RH of 100% yields 100% sky_cover at that grid point in GFE. +

      +EXAMPLE 2. +

      +Again, using the tool’s default values (b=1.0, RHCLR=60%), when the max model layer RH = 60%, we get:
      +Populate_SkyProcedure
      +So, for any value of RH equal to or less than RHCLR, our sky cover value is 5% or less (generally taken +as “clear skiesâ€). +

      +We can better see the modulating effects of RHCLR and b (calibration), by graphing the function:
      +Populate_SkyProcedure
      +Figure 2. The exponential function employed by the Populate_SkyTool relating maximum model layer RH (%) +to sky cover (%) for the default values (b=1.0, RHCLR = 60%; shown as thick solid line), and values of +b=1.0 and RHCLR = 44% (short dashed gray line), b=1.0 and RHCLR = 74% (short dashed green line), b=1.5 +and RHCLR = 44% (long dashed gray line), and b=1.5 and RHCLR = 74% (long dashed green line). In the GUI, +b is referred to as the calibration value and RHCLR is the 5% sky cover threshold. +

      +Increasing the calibration value (b) increases the slope of the curve (long dashed lines in Figure 2) as +compared to the default curve (thick solid line), with 100% sky cover occurring at a value less than 100% +model layer RH (e.g., 81.3% for b=1.5 and RHCLR = 44%). At the same time, the 5% sky cover threshold is +adjusted in this case to 44%. Meanwhile, leaving b constant (at 1.0) and modulating the RHCLR threshold +(from 44% to 74% in Figure 2) primarily modifies the shape of the function at mid-range RH values +(i.e., 50-90%), while maintaining 100% sky cover for 100% maximum model layer RH. +

      +The extreme values of b and RHCLR allowed by the tool are arbitrary, except for the low value of b=1.0 +which corresponds to 100% sky cover for 100% RH. The range and default values for b and RHCLR allowed by +the tool were determined subjectively (by trial and error) and generally capture the range of desired sky +values in most situations. If the forecaster desires more clouds at high RH values, the calibration value +should be set higher. On the other hand, if the forecaster desires cloud amount to taper off more slowly +as RH decreases, the value of RHCLR can be set lower. Since the numerical models handle moisture differently, +and initializations are not perfect, there is no one “correct†response function. Again, the goal is simply +to allow the forecaster some flexibility in modifying the exponential response for a given situation or for +model biases common to their forecast area. +

      +Running the Populate_SkyTool in GFE
      +To run the Populate_SkyTool, make Sky the editable grid element in the GFE temporal editor, and +select MB3->Populate_SkyTool from the Main Menu. When you select the +Populate_SkyTool, you will see a graphical user interface (GUI) appear, as shown below.

      +Populate_SkyProcedure

      +The following is an explanation of each option within the Populate_SkyTool GUI:
      +
        +
      • Model: Select the model you wish to use, either GFS40 or NAM12. The NAM12 can be used on + grids out 84 hours from the current model run time, and is available in 3-hrly increments. The GFS40 + is available in 6-hrly increments out through 180 hours.
      • +
      • Model Run: Select the model run you wish to use, either the current run, or the previous + (6 hour earlier) run. Note: as new model data is coming into GFE, you may need to select the previous + version for the tool to run.
      • +
      • Layer Depth: This controls the depth of layer RH used in computing the model’s maximum layer + RH. The choices are 25mb or 50mb layers, as outlined in the previous section, and pertain to model levels + between 925mb and 500mb.
      • +
      • Use RH with respect to ice at temperatures at or below -25C: This switch toggles on/off a + modified RH with respect to ice, useful in capturing clouds composed primarily of ice crystals (e.g., + cirrus clouds). These clouds may or may not be opaque in character, and the option to fully represent + these clouds in the Populate_SkyTool is included as an user option.
      • +
      • Include High Clouds (500-300mb): This toggles on/off model RH between 500-300mb from + consideration in determining the layer with the highest model-layer RH and corresponding cloud + cover.
      • +
      • Include Clouds Below 925mb: This toggles on/off the four near-surface (30mb AGL) layers + from consideration in determining the layer with the highest model-layer RH and corresponding cloud + cover.
      • +
      • 5% Sky Cover Threshold at RH percentage: This slider bar sets the threshold for clear + skies (taken as 5% sky cover). If the maximum model-layer RH value is equal to or less than this + percentage, the sky cover will be equal to or less than 5%.
      • +
      • Calibration: This slider bar controls the slope of the exponential function (parameter + b in equation (5)), and at what RH value saturation occurs. Increasing the calibration value results + in more clouds for a given RH percentage.
      • +
      • Limit Values: After the algorithm runs, the limit values slider bars can be used to set + bounds on the minimum and maximum sky cover amount returned by the tool at any grid point in the domain. + It works in a manner analogous to the baseline “Limit Values†Smart Tool in GFE.
      • +

      +Once you select your options, choose Run or Run/Dismiss at the bottom of the GUI and the +Smart Tool will populate the sky grid for the selected hour. +

      +Running the Populate_SkyProcedure in GFE
      +The Populate_SkyProcedure is available from the Populate menu of GFE and allows the Populate_SkyTool +to be run over a user selected time range in GFE, with interpolation performed on hourly grids between +the available model data times. The GUI is largely the same, but two important notes are included near +the top of the GUI. As noted, to run the procedure, press and hold the left mouse button and scroll +across the range of sky grids desired in the Grid Manager. The start and end times selected by the user +must correspond to a 3-hrly or 6-hrly temporal grid block that contains model data in order for the +procedure to run properly. These times are model dependent: +
        +
      • For the NAM12, the available grid times are 00, 03, 06, 09, 12, 15, 18, 21 UTC, out 84h from the + model run time.
      • +
      • For the GFS40, the available grid times are 00, 06, 12, 18 UTC, out 180h from the model run time + (through the end of day 7).
      • +
      +Once you select your options and highlight your time range, choose Run or Run/Dismiss at +the bottom of the GUI. The procedure will create scratch grids at the available model times, and then +run the Populate_SkyTool at each of those times to populate the grids with sky cover amount. When this +step is complete, the procedure interpolates between the 3-hrly or 6-hrly grid times to create hourly sky +grids.

      +Populate_SkyProcedure

      +Assumptions and Limitations
      +
        +
      • It is assumed that an exponential relationship exists between model-layer RH and cloud amount. + This is supported by observational work (e.g., Walcek 1994), but it is also known that temperature, + stability, and vertical shear relate to sky cover, factors not considered by the tool (except for + accounting for RH over ice at temperatures less than -25C). This tool provides an “on-the-fly†manual + adjustment approach to estimate and account for uncertainties in the model-layer RH-cloud relationship. + There is not a unique correct relationship between model-layer RH and sky cover.
      • +
      • The model-layer RH – sky cover relationship is dependent upon model resolution and physical + parameterizations.
      • +
      • The tool is dependent on model forecasts. If moisture is not handled adequately in a particular + model solution, the sky output from the tool is not likely to be accurate. The limit values and other + options are provided to subjectively adjust the output as needed.
      • +
      • The Populate_SkyTool was formulated for relatively low elevations of the eastern CONUS. Pressure + thresholds (such as 925mb) won’t translate well to the high plains or intermountain west, and would + require some modification of the source code in these parts of the CONUS.
      • +

      +Other Tips
      +
        +
      • BUFKIT is a useful software tool to understand and anticipate the sky cover values generated by the + Populate_SkyTool based on model forecast soundings. Viewing point model soundings can give the + forecaster a better idea of when they may want to toggle on/off high and low clouds, and whether + population with the NAM12 or GFS40 is more desirable in a given situation.
      • +
      • In some forecast areas, the NAM12 tends to reach 100% RH more easily than the GFS40, but the NAM12 + also tends to show low-level RH values that are too high beneath frontal and subsidence inversions + (often near saturation). In these situations, turning clouds below 925mb off can give a more accurate + result. Also, if high near-surface RH resulting from anticipated ground fog is appearing as cloud cover, + turning off clouds below 925mb will help mitigate this problem.
      • +
      • To maximize high cloud amount in the Populate_SkyTool, include both 500-300mb clouds and turn on the + RH over ice calculation.
      • +
      • For thin cloud layers, set the cloud layer depth to 25mb. The tool takes slightly longer to run, but + it will better depict narrow zones of relatively high RH and associated clouds (provided it is captured + accurately in the model).
      • +
      +
      + diff --git a/cave/com.raytheon.viz.gfe/help/Python.html b/cave/com.raytheon.viz.gfe/help/Python.html index 754bf8a42c..d77b7013f3 100644 --- a/cave/com.raytheon.viz.gfe/help/Python.html +++ b/cave/com.raytheon.viz.gfe/help/Python.html @@ -18,8 +18,7 @@ Contents - - +
      Working with Vector Data @@ -33,14 +32,14 @@ Data
      GFESuite extensions such as Smart Tools and Smart Initialization are written in an interpreted scripting language called Python. It is a very powerful, object-oriented language and all the features of Python -are available to you.  We also use a Python library, called Numerical -Python, which allows for efficient operations on grids of data.   +are available to you. We also use a Python library, called Numpy (Numerical +Python in AWIPS1), which allows for efficient operations on grids of data. The GFESuite software provides some additional methods to help you operate on Numerical data. This tutorial will introduce you to the features of -Python and Numerical Python that are relevant to the GFESuite. If you are -interested in Python's full capabilities, visit their web site at:     -http://www.python.org/   Specifically, documentation on Numerical -Python can be found in the Numerical Python document. +Python and Numpy that are relevant to the GFESuite. If you are +interested in Python's full capabilities, visit +their web site. Specifically, documentation on Numpy +can be found in the Numpy Tutorial page. diff --git a/cave/com.raytheon.viz.gfe/help/PythonConcepts.html b/cave/com.raytheon.viz.gfe/help/PythonConcepts.html index c05732b807..edef50a5b0 100644 --- a/cave/com.raytheon.viz.gfe/help/PythonConcepts.html +++ b/cave/com.raytheon.viz.gfe/help/PythonConcepts.html @@ -302,13 +302,11 @@ from another class and, if so,  the search will proceed recursively.

      Sometimes it is useful to draw classes and their inheritance relationships.  We do so as shown below:

      -
        -
        +

      The classes are represented by the rectangles and the special "inheritance symbol" indicates that the Derived Class inherits the methods and variables from the Base Class.  Think of the symbol not as an arrow indicating flow, but as an "umbrella" indicating inclusion of capabilities. -
        -
        +
      \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/PythonGuidelines.html b/cave/com.raytheon.viz.gfe/help/PythonGuidelines.html index 3ff34a9d5f..b6582cbdf7 100644 --- a/cave/com.raytheon.viz.gfe/help/PythonGuidelines.html +++ b/cave/com.raytheon.viz.gfe/help/PythonGuidelines.html @@ -19,7 +19,7 @@ Comment your code -- it really makes a difference, not only to others trying to understand your code, but to you when you're trying to debug it.

    • -Name your variables meaningfully.  A variable named  "threshold" +Name your variables meaningfully. A variable named  "threshold" versus "x" makes code much easier to read.
    • diff --git a/cave/com.raytheon.viz.gfe/help/PythonNumericalPython.html b/cave/com.raytheon.viz.gfe/help/PythonNumericalPython.html index deb5738014..eedfc8c25d 100644 --- a/cave/com.raytheon.viz.gfe/help/PythonNumericalPython.html +++ b/cave/com.raytheon.viz.gfe/help/PythonNumericalPython.html @@ -1,50 +1,49 @@ -GFESuite Documentation - Numerical Python +GFESuite Documentation - Numpy

      -Numerical Python

      -
          Numeric +Numpy + -
          Grids
      +
         Grids
      -
          Basic + -
          Logical + -
          Complex + -
          Conditional + - + -
          Cubes
      +
         Cubes
      -
          Accessing + -
          Looking + -
          Reducing
      +
         Reducing

      -Numerical Python is an extension to Python that provides the capability -of operating on grids easily and efficiently.   The syntax for -Numerical Python is fully explained in the Numerical -Python document.  In this section, we will explain the basic concepts -that are relevant to the GFESuite.  To access the Numerical Python +Numpy is an extension to Python that provides the capability +of operating on grids easily and efficiently. The syntax for +Numpy is fully explained in the Numpy +Tutorial. In this section, we will explain the basic concepts +that are relevant to the GFESuite.  To access the Numpy library, include the following statement in your Python module: -

      from Numeric import * +

      from numpy import *

      Numeric Arrays

      -The basic data structure for Numerical Python is a Numeric Array.   +The basic data structure for Numpy is a Numeric Array. The array objects are generally homogeneous collections of potentially large volumes of numbers. All numbers in a array are the same kind (i.e. number representation, such as double-precision floating point). Array @@ -53,7 +52,7 @@ The specific numbers within them can change throughout the life of the array. Here is an example of Python code using the array objects (italicized text refers to user input, non-italicized text to computer output):

      > python -
      >>> from Numeric import * +
      >>> from numpy import *
      >>> vector1 = array((1,2,3,4,5))
      >>> print vector1

      [1 2 3 4 5] @@ -75,15 +74,15 @@ text refers to user input, non-italicized text to computer output):

      Grids

      GFESuite extensions such as Smart Tools and Smart Initialization provide -access to grid data via 2-dimensional Numerical Python arrays.  The +access to grid data via 2-dimensional Numpy arrays. The naming of these grids and the methods of access may differ, but the concepts -and operations on the underlying Numerical Python arrays is the same. +and operations on the underlying Numpy arrays is the same.

      Basic Arithmetic Operations

      -Basic arithmetic operations are very easy in Numerical Python and operate -on entire grids at once.  When operating on grids, we ensure that +Basic arithmetic operations are very easy in Numpy and operate +on entire grids at once. When operating on grids, we ensure that the grids are all the same size in the x and y dimensions. Any D2D or IFP -data that you access is assured to have the same grid sizes.    +data that you access is assured to have the same grid sizes. If you have two grids, called grid1 and grid2 and you want to make a difference grid and store it into grid3, then the syntax is:

              grid3 = grid1 - grid2 @@ -94,27 +93,26 @@ this: as:

              gridF = (gridK - 273.15) * 9/5 + 32 -

      In general, do not use loops to index through points in the grid.  -Performance will suffer greatly.  Normally you access the entire grid -at a time, using the above -
      syntax.  The operation you specify will be applied to EVERY grid +

      In general, do not use loops to index through points in the grid. +Performance will suffer greatly. Normally you access the entire grid +at a time, using the above syntax. The operation you specify will be applied to EVERY grid point in the grid.

      To initialize a grid, GFESuite extensions provide an empty array (set to zeros) guaranteed to be of the correct dimensions.  The empty array -is called "self._empty".  To initialize a grid to a particular value, +is called "self._empty". To initialize a grid to a particular value, say 3.0:

              grid = self._empty + 3.0 -

      Note:  self._empty is not available in Python in general.  +

      Note:  self._empty is not available in Python in general. It is specific to GFESuite extensions such as Smart Tools and Smart Initialization which have knowledge of the appropriate grid dimensions for your domain.

      Logical Statements and Masks

      -Logical statements are used to compare grid values.  The result from +Logical statements are used to compare grid values. The result from a logical statement is typically a "boolean" grid, which is a grid that has either 1 (true) or 0 (false) values.  These grids are sometimes -called "masks" and are used with conditional statements.  Each logical +called "masks" and are used with conditional statements. Each logical statement requires two arguments, the first being the grid, -
      and the second being the numerical value for comparison (or even another +and the second being the numerical value for comparison (or even another grid). Here is a subset of statements that you may find useful:

              less(),  equal(),  not_equal(),  greater(),  greater_equal(),  less_equal() @@ -124,7 +122,7 @@ would be:

              bgrid = greater(tGrid, 50)

      Complex Logical Statements

      -Sometimes you need a mask that has two logical statements.  You can +Sometimes you need a mask that has two logical statements. You can use the logical_and() and logical_or() statements to combine logical statements. Each of these statements require two arguments, which are the ones that are going to combine with "and" or "or". @@ -141,12 +139,12 @@ that are below 40 or above 60: Conditional Statements - the "where" statement Normally a logical statement isn't too useful by itself, and you want to -assign a value to a grid based on whether a conditional is true or false.  +assign a value to a grid based on whether a conditional is true or false. The where -
      statement is similar to a if...else... statement in C++ or Python.  -The where statement takes three arguments:  the first is the +statement is similar to a if...else... statement in C++ or Python. +The where statement takes three arguments: the first is the logical statement, the second is the -
      value to be assigned to the grid if the logical statement is true, +value to be assigned to the grid if the logical statement is true, and the third is the value to be assigned to the output if the logical statement is false.

              where(conditional statement, @@ -154,34 +152,34 @@ assignment if true, assignment if false)

      For example,

              snowGrid = where(less(tGrid, 32), 10.0*QPF,  0.0)) -

      takes the tGrid and compares it to 32 degrees.  This results in +

      takes the tGrid and compares it to 32 degrees. This results in a temporary boolean grid which has grid points that are set to true if the temperature is less than 32 and -
      false if the temperature is greater to or equal to 32.   -The calculated snow grid is based on the boolean grid and the QPF grid.  +false if the temperature is greater to or equal to 32. +The calculated snow grid is based on the boolean grid and the QPF grid. If the temperature is equal or above -
      32, then the "false"assignment is done, thus assigning zero to the -snowGrid.  If the temperature is below 32, then the "true" assignment +32, then the "false"assignment is done, thus assigning zero to the +snowGrid. If the temperature is below 32, then the "true" assignment is performed -
      and the snowGrid is set to 10 times the value of the QPF grid. +and the snowGrid is set to 10 times the value of the QPF grid.

      Clipping (or Limiting) the values of a Grid

      -Many output grids need to be clipped or limited to a range of values.  +Many output grids need to be clipped or limited to a range of values. For example, if you calculate a QPF that is modified based on upslope and downslope and the -
      calculation results in a negative QPF, you know that you need to change -it to 0.0 (since negative QPFs are not allowed).  The "clip" function +calculation results in a negative QPF, you know that you need to change +it to 0.0 (since negative QPFs are not allowed). The "clip" function takes three arguments: -
      the input grid, the minimum value, and the maximum value. +the input grid, the minimum value, and the maximum value.

              finalQPF = clip(calcQPF, 0.0, 10.0)

      Cubes

      While the GFESuite Forecast grids represent surface weather elements, D2D -model grids often represent weather elements at various atmospheric levels.  +model grids often represent weather elements at various atmospheric levels. In Numerical Python, we can represent this data as 3-dimensional arrays, -or cubes.    When examining weather element cubes, we often +or cubes. When examining weather element cubes, we often have a cube of geopotential height available to map between pressure levels and elevation.

      @@ -193,12 +191,12 @@ where _c indicates a cube. Cubes The syntax for accessing individual rows or columns in a grid is similar to accessing portions of a list in Python, using the bracket and colon -syntax.  For example: +syntax. For example:

              print grid[25][45]

      will print the value of the grid at the 45th column of the 25th row. -

      Refer to the Numerical Python documentation for more details.  -For cubes,  you can access any individual level using indexing, or -multiple levels using more complicated indexing.  For example, if +

      Refer to the Numerical Python documentation for more details. +For cubes, you can access any individual level using indexing, or +multiple levels using more complicated indexing. For example, if you have an relative humidity cube of 6 levels, and you want just the 2nd level (remember Python counts from 0), you would use this syntax:

              rh_c[1] @@ -208,9 +206,9 @@ the syntax would be:

      Looking Up the Columns of a Cube

      Some of your algorithms will want to "look up the columns" of a cube and -then stop when certain critera has been reached.  An example of this +then stop when certain critera has been reached. An example of this is the calculation of freezing level.  We want to start at the surface -and go up until we reach the point where the temperature is below freezing.  +and go up until we reach the point where the temperature is below freezing. Then we interpolate between that level and the previous level to find the "real" freezing level.

      The following function (from Smart Initialization) accesses the cubes @@ -219,20 +217,18 @@ grid is also accessed:

          def calcFzLevel(self,  gh_c,  t_c,  topo):

      We start with a grid that contains -1.  The  self._minus variable -is a 2-D grid of -1s.  During the calculation up the column, the grid +is a 2-D grid of -1s. During the calculation up the column, the grid will contain -1 if the freezing level has -
      not yet been reached, or the actual freezing level if the level has -been reached.  We make the assumption that the freezing level can -never be -1 (since that is below -
      sea level). +not yet been reached, or the actual freezing level if the level has +been reached. We make the assumption that the freezing level can +never be -1 (since that is below sea level).

              fzl = self._minus

      The for loop "i" goes from 0 to the size of the z dimension of  the cube of gh.  The 0 represents the 'z' dimension.

              for i in xrange(gh_c.shape[0]):

      We use a try/except block to "catch" the failure on the first iteration -of the for loop.  The exception is caused by accessing the -"i-1"th level which is illegal when i -
      == 0. +of the for loop. The exception is caused by accessing the +"i-1"th level which is illegal when i == 0.

                  try:
                      # Interpolate between cube levels @@ -247,11 +243,9 @@ except: val = gh_c[i]

      After we have calculated "val", which is a 2-D grid, representing the freezing level height based on the two temperatures and two gh values at -each layer, then -
      we apply it only in certain cases.  The following statement only +each layer, then we apply it only in certain cases. The following statement only assigns the calculated freezing level if it already hasn't been assigned, -and the actual temperature of -
      the layer is less than freezing. +and the actual temperature of the layer is less than freezing.

                  fzl = where(logical_and(equal(fzl, -1),  less_equal(t_c[i], 273.15)), val,  fzl) @@ -261,16 +255,15 @@ val,  fzl)

      And the grid is returned.

                  return fzl -
        - +

      Reducing

      -The concept of "reducing" is a numerical python concept of taking a multi-dimensional -grid (or cube) and reducing its dimensions.  Another concept is flattening -the grid.  For example, take all of the relative humidities from the -surface to a fixed millibar level and average them.  You start with -a cube of rh and end up with a 2-D grid of average rh.  This example -calculates the probability of precipitation based on the  Fcst QPF, +The concept of "reducing" is a numpy concept of taking a multi-dimensional +grid (or cube) and reducing its dimensions. Another concept is flattening +the grid. For example, take all of the relative humidities from the +surface to a fixed millibar level and average them. You start with +a cube of rh and end up with a 2-D grid of average rh. This example +calculates the probability of precipitation based on the Fcst QPF, and the geopotential heights and relative humidity cubes.

          def calcPoP(self, gh_c, rh_c, QPF, topo):

      The first few lines take the gh and rh cubes and only use the first @@ -303,7 +296,7 @@ Count is a 2-D grid.

              rh_avg = add.reduce(rh_avg, 0)

      The real average relative humidity is calculated in this next compound -statement.  The average relative humidity is the rh_avg/count.  +statement. The average relative humidity is the rh_avg/count. We do some extra work to ensure that the count is not zero by adding 0.001 to the count.

              dpop = rh_avg / (count @@ -311,8 +304,8 @@ to the count.

      We force dpop to be within the range -30 to 30%.

              dpop = clip(dpop, -30, 30) -

      Finally we calculate the primary pop.  If QPF < 0.02, then the -pop is 1000 * QPF.  Otherwise set QPF to 350*QPF + 13. +

      Finally we calculate the primary pop. If QPF < 0.02, then the +pop is 1000 * QPF. Otherwise set QPF to 350*QPF + 13.
              pop = where(less(QPF, 0.02), QPF * 1000, QPF * 350 + 13)

      We add in the delta pop. diff --git a/cave/com.raytheon.viz.gfe/help/PythonWorkingwithVectorData.html b/cave/com.raytheon.viz.gfe/help/PythonWorkingwithVectorData.html index 674c478971..21486fa733 100644 --- a/cave/com.raytheon.viz.gfe/help/PythonWorkingwithVectorData.html +++ b/cave/com.raytheon.viz.gfe/help/PythonWorkingwithVectorData.html @@ -14,7 +14,7 @@ of two numerical array grids, one for magnitude and one for direction
              dir = wind_FHAG10[1]  # get wind direction grid

       A Vector Cube consists of two sub-cubes, one for magnitude and -one for direction.  For example: +one for direction. For example:

         def calcFreeWind(self,  gh_c,  wind_c,  topo):
              # The Vector Cube, wind_c, diff --git a/cave/com.raytheon.viz.gfe/help/PythonWorkingwithWeatherData.html b/cave/com.raytheon.viz.gfe/help/PythonWorkingwithWeatherData.html index 8aa99c060f..9df825b8ec 100644 --- a/cave/com.raytheon.viz.gfe/help/PythonWorkingwithWeatherData.html +++ b/cave/com.raytheon.viz.gfe/help/PythonWorkingwithWeatherData.html @@ -3,7 +3,7 @@

      Working with Weather Data

      -

         The +

      The getIndex method -- Creating Weather Data   
      The wxValue methods -- Examining Weather Data @@ -56,8 +56,6 @@ wxValues) paired components as a tuple
                 return (wxValues, keys) -

      To see how the "getIndex" method is used in a Smart Tool, examine the -Convective_SmartTool in the examples/smartTools directory.

      The wxMask Method -- Examining Weather Data

      @@ -98,9 +96,6 @@ the weather has a coverage of "Chc" 5 where the weather has type of "L"
           PoP = where(self.wxMask(wxTuple, ":L:"),  5,  PoP) -

      To see how the "wxValues" method is used in a Smart Tool, examine the -PoP_From_Wx tool in the example/smartTools directory. -
       

      Working with Discrete Data

      Working with Discrete-type elements in Numerical Python tools requires diff --git a/cave/com.raytheon.viz.gfe/help/RemoveWx.html b/cave/com.raytheon.viz.gfe/help/RemoveWx.html new file mode 100644 index 0000000000..70335da3d5 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/RemoveWx.html @@ -0,0 +1,73 @@ + + + + + RemoveWx + + + + + + +RemoveWx +
      +
      +Introduction +
      +
      +Sometimes you have complex combinations +of weather and you want to remove just one of the “pieces†of weather. It is difficult to do using +the standard Assign_Value dialog for weather, without messing up other weather combinations, or +having to do the operation multiple times for each different combination of weather. The RemoveWx +tool makes it easy to remove a particular weather string from any area of weather. +
      +
      +
      +How +the Procedure Works +
      +
      +Lets say we have a complex combination +of rain/snow (with different probability values) and we have patchy fog combined with both of these +weather types:

      +RemoveWx
      +
      +
      +Now, lets say that we want to remove +the fog. If we do a query to find all the pixels that contain fog, we cannot simply set the +values to rain, because we have the fog combined with rain in some areas and snow in others +(not to mention that we have it combined with ‘chance rain/snow’ in some areas and ‘likely +rain/snow’ in others). If we use the ‘select homogeneous area’ tool we will have to do this +several times to find all the areas of fog combined with other things. When we start the RemoveWx +tool, it presents a dialog where we specify which weather we want to remove:
      +RemoveWx
      +
      +
      +We just need to select F for Fog:
      +RemoveWx
      +
      +
      +Then run the tool, and all mention of +Fog is removed, while preserving all the other weather combinations:
      +RemoveWx"

      +The tool also works if you specify an edit area, so that, for example, you could remove fog from +only some areas, while leaving it in others. Say, for example, that you define an edit area like +this:
      +RemoveWx

      +And then remove the fog. The result is:
      +RemoveWx

      +There are many cases where you want to do this sort of editing operation: removing thunderstorms from +an area of showers, removing freezing rain from an area of rain, etc.
      + + diff --git a/cave/com.raytheon.viz.gfe/help/SPC_Watch_Methodology.html b/cave/com.raytheon.viz.gfe/help/SPC_Watch_Methodology.html index 8b1b3de434..be4d8eb7f2 100644 --- a/cave/com.raytheon.viz.gfe/help/SPC_Watch_Methodology.html +++ b/cave/com.raytheon.viz.gfe/help/SPC_Watch_Methodology.html @@ -29,7 +29,7 @@ Pueblo, CO
      Update 2 February 2005

      -

       
      +


      Table of Contents

      Introduction
      SPC Issues a Coordination WCL Text Product
      @@ -171,7 +171,7 @@ to take action.

      instructions. He or she will select Hazards => PlotSPCWatches (below) per the banner's instructions. For more information on using the -PlotSPCWatches procedure, click here.

      +PlotSPCWatches procedure, click here.


      Plot SPC Watches Menu
      @@ -186,8 +186,6 @@ office via the WCN product, and changes by SPC via the WOU product.
      Text Formatter and issue the product(below).

      -

       

      -

       

      diff --git a/cave/com.raytheon.viz.gfe/help/SeparateHazards.html b/cave/com.raytheon.viz.gfe/help/SeparateHazards.html index b56b58c793..0fb6feeae7 100644 --- a/cave/com.raytheon.viz.gfe/help/SeparateHazards.html +++ b/cave/com.raytheon.viz.gfe/help/SeparateHazards.html @@ -82,14 +82,14 @@ now been merged with the unchanged Winter Storm Watch.


      How It Works

      The SeparateHazards procedure looks at the Hazards grids inventory and -contents and separates each hazard into its own weather element.  +contents and separates each hazard into its own weather element. The software ensures that the grids haven't already been separated and -then before proceding will lock the entire Hazards weather -element.   While your Hazards grids have been separated, no +then before proceeding will lock the entire Hazards weather +element. While your Hazards grids have been separated, no other forecaster will be able to edit the Hazards grid.

      The weather elements created as temporary grids and cannot be saved to -the ifpServer.
      +EDEX.

      diff --git a/cave/com.raytheon.viz.gfe/help/ShowISC.html b/cave/com.raytheon.viz.gfe/help/ShowISC.html index 36060df689..a307ca740f 100644 --- a/cave/com.raytheon.viz.gfe/help/ShowISC.html +++ b/cave/com.raytheon.viz.gfe/help/ShowISC.html @@ -23,17 +23,6 @@ align="center"> ShowISC Tools

      -

      -Based -on Tim Barker's Version -2.4 ShowISC
      -November 17, 2004
      -

      -

      -
      -

      A collection of tools to mitigate @@ -74,8 +63,8 @@ site-to-site discrepancies

      Introduction

      These tools are adaptations upon Tim Barker's -set of ShowISC tools.  These tools were baselined in IFPS16.2 -(November 2004).   There are four tools:
      +set of ShowISC tools. These tools were baselined in IFPS16.2 +(November 2004). There are four tools:

      • Show_ISC_Highlights, which @@ -288,7 +277,7 @@ points along the border have the same latitude, but have longitudes of 105.243 and 105.238, they would be 'combined' into a single point. While this makes almost no difference visually on the GFE displays, it CAN have an impact when determining if the center of a -gridbox lies on which "side" of a shapefile border. A little +gridbox lies on which "side" of a shapefile border.

        +

        -for each of the maps used in the -IFPServer. Using this higher precision, the location of the borders +Using this higher precision, the location of the borders is much closer to what is calculated with NDFD. However, even with this high precision, roundoff errors lead to a few gridboxes placed on different "sides" of the CWA border. If identical results are @@ -331,10 +302,7 @@ this difference is quite small, and for many borders is non-existantant. For sites that run at a different resolution than the 5-km resolution of NDFD, the border points will already be much different - so this small difference is irrelevant.

        -

        -
        -

        +

        The NDFD algorithm will mark a @@ -347,7 +315,7 @@ configurable in the Show_ISC_Highlights and Show_ISC_Info tools - as discussed in the installation section below.


        In order to ignore light wind +In order to ignore light wind difference, in both the wind speed and wind direction calculations, the NDFD algorithm also ignores neighboring gridbox pairs where either wind speed value is below 8 knots. This means that your @@ -359,11 +327,11 @@ ignored only if BOTH points are below 8 knots.

        Configuration

        The ShowISC tools on the Smart Tool Repository required configuration -for each site.  The baselined version are automatically configured -based on edit area information within the ifpServer.
        +for each site. The baselined version are automatically configured +based on edit area information within EDEX.

        The Show_ISC_Info and Show_ISC_Highlights tools have a common -configuration section within the ISC_Utility.  You can override +configuration section within the ISC_Utility. You can override these values by copying the configuration() function from ISC_Utility and putting it into ISC_Utility_Local, and then changing the values.

        diff --git a/cave/com.raytheon.viz.gfe/help/SmartInit.html b/cave/com.raytheon.viz.gfe/help/SmartInit.html index ddef676d66..5d9ddd2baf 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartInit.html +++ b/cave/com.raytheon.viz.gfe/help/SmartInit.html @@ -12,12 +12,10 @@ text="#000000">

        Smart Initialization Configuration and User's Guide

        -April 7, 2004
        +February 15, 2012

        This document describes how smart initialization works, and how it -can -be extended and modified. +can be extended and modified.

        Table of Contents

        How Smart Initialization Works @@ -47,37 +45,36 @@ Line

        How Smart Initialization Works

        -Smart initialization is closely coupled with the ifpServer.  The -ifpServer +Smart initialization is closely coupled with EDEX. EDEX is aware of D2D model data changes and therefore knows when IFP data grids -can be created.  Whenever the ifpServer first starts, or new D2D +can be created. Whenever EDEX first starts, or new D2D model data is detected (which occurs frequently - less than 5 minute intervals), the server will examine the serverConfig/localConfig configuration file for the INITMODULES -definition.  +definition. If it finds a match with the updated D2D model, then it will spawn a process to run smart initialization for that model.

        When a smart initialization process is started, it will run a particular class file, either one that has been supplied with the release, or one -you have added.  The software will examine all of the functions +you have added. The software will examine all of the functions within -that class looking for function names that begin with calc***.  +that class looking for function names that begin with calc***. These functions define the output weather element, e.g., calcT will derive T, -and also the dependencies.  The dependencies are determined from +and also the dependencies. The dependencies are determined from the argument list for each function.

        The smart initialization software then figures out the dependencies for all of the calc*** functions and will determine what must run first, -second, third, etc.  This is done automatically and the programmer -need not be concerned about it.  The software also examines the +second, third, etc. This is done automatically and the programmer +need not be concerned about it. The software also examines the inventory for the dependent grids and the inventory for the output grids to determine @@ -91,9 +88,9 @@ exits until the next D2D model update.

        Smart Initialization algorithms are written in a simple, intuitive language -called Python and its extension, Numerical Python. The following +called Python and its extension, numpy. The following sections -assume that you have knowledge of Python  which is covered in the +assume that you have knowledge of Python which is covered in the GFESuite Python Tutorial and Programming Guidelines.
        @@ -103,19 +100,17 @@ Python Tutorial and Programming Guidelines. smart initialization? The standard smart initialization files that are supplied with the release -are installed into your release/etc/BASE/smartInit directory.  No -modifications +are installed into your release/edex/data/utility/edex_static/base/smartinit +directory. No modifications should be made to any of the files in the BASE directory. User-customized -files are installed into the release/etc/SITE directory.  -These -SITE  files are not overwritten during installs and upgrades. +files are installed into the release/edex/data/utility/edex_static/site/SITE/smartinit +directory. These SITE files are not overwritten during installs and upgrades.


        Basic File Structure

        The basic structure of a smart initialization file contains a header -that -is simliar to: +that is simliar to:

        from Init import *

        class modelForecaster(derivedFromForecaster): @@ -126,18 +121,16 @@ is simliar to: "sourceDb", "destDb")

        This is basically defining a new class called "modelForecaster", -which is derived from "derivedFromForecaster".  The +which is derived from "derivedFromForecaster". The __init__ function is the constructor to the class, which calls the base class (class -it has been defined from)  with three arguments, self, "sourceDb", -and "destDb".  The source db is the name of the D2D database, such -as NAM80, NAM40, NAM12, NGM80, RUC80, GFS40, gfsLR.  The -destination database is the name of the -output -database, such as NAM12, GFS40, NAM_V.  If there is an underscore -in -the destination database, then the format is the +it has been defined from) with three arguments, self, "sourceDb", +and "destDb". The source db is the name of the D2D database, such +as NAM80, NAM40, NAM12, NGM80, RUC80, GFS40, gfsLR. The +destination database is the name of the output +database, such as NAM12, GFS40, NAM_V. If there is an underscore +in the destination database, then the format is the modelname_optionaltype.

        A complete example of the header is shown below: @@ -157,8 +150,8 @@ Forecaster.__init__(self,

        There usually is a function called levels() which define a set of vertical pressure levels which are used when accessing cube data from the -models.  -The levels() return a list of level values to use.  Make sure that +models. +The levels() return a list of level values to use. Make sure that the levels you specify are actually available in the model. A complete example is shown below:

        @@ -175,14 +168,14 @@ example is shown below:

        Following the levels() function are the set of functions with a particular -name.  The calculation functions MUST +name. The calculation functions MUST ALL -BEGIN WITH calc in their name.  That is how smart +BEGIN WITH calc in their name. That is how smart initialization -can determine what to run.  It basically runs all calc*** +can determine what to run. It basically runs all calc*** functions -that are defined.  The remainder of the name of the function after -"calc" is the parameter name to create.  For example, if RH is +that are defined. The remainder of the name of the function after +"calc" is the parameter name to create. For example, if RH is your weather element name, the name of the function to calculate RH would be calcRH(). The typical format for a calc function is shown below, this @@ -267,20 +260,19 @@ and the real surface elevation.

        The name of the function is always calc*** where *** is the weather -element name and level.  If you are creating weather elements for +element name and level. If you are creating weather elements for surface data then the weather element name by itself is -sufficient.  +sufficient. If you are creating weather elements for upper air or non-surface data, then the name of the calc function is:  calc***_***, such as calcWind_3K() for the Wind at 3000 feet.

        -

        Note the argument list for the calc*** functions.  The first +

        Note the argument list for the calc*** functions. The first argument -is always self.  The remainder of the arguments represent gridded -data.  The format of the specification can be one of the following +is always self. The remainder of the arguments represent gridded +data. The format of the specification can be one of the following formats:
        -  @@ -301,7 +293,7 @@ for numeric functions. - - @@ -375,7 +367,7 @@ D2D database.

        You can place additional functions (e.g., utility) functions anywhere in the file after the constructor (__init__) and before the tail end of -the file.   An example of a utility function could be one to +the file. An example of a utility function could be one to calculate Td from T and RH as shown below:

           def getTd(self, t, rh): @@ -414,12 +406,6 @@ similar to that below:
            modelForecaster().run()

        -

        if __name__ == "__main__": -
        -    main() -
        -  -

        Here is an example of a real tail to the file. The name of the class within the main() function must match the name of the class you have defined @@ -429,12 +415,6 @@ in the header:
            NAM12Forecaster().run()

        -

        if __name__ == "__main__": -
        -    main() -
        -  -


        Working with SCALAR, VECTOR, WEATHER, and DISCRETE Data

        @@ -444,44 +424,42 @@ numerical python.

        SCALAR


        When passing in a weather element that is scalar, you will either -get a grid, or a cube.   The grid is a numeric 2-d grid +get a grid, or a cube. The grid is a numeric 2-d grid (x,y), the cube is a numeric 3-d grid (z,x,y).

        VECTOR

        -For a single vector grid (single level), you get a tuple.  The +For a single vector grid (single level), you get a tuple. The first element is a grid of magnitude, the second is a grid of -direction.   +direction. To access the magnitude grid, use this syntax: wind_SFC[0], and -for direction, use this syntax: wind_SFC[1].   Once +for direction, use this syntax: wind_SFC[1]. Once you access either the magnitude or direction grid, they are treated like a scalar grid.

        There are several "utility" functions in Init.py (located in your -release/etc/BASE/smartInit +release/edex/data/utility/edex_static/base/smartinit directory) that can help you when working with vector data. The self._getUV( mag, dir) call will convert a magnitude/direction grids into a returned -tuple of u and v.  The u component is [0] and the v component is -[1].  +tuple of u and v. The u component is [0] and the v component is +[1]. The self._getMD(u,v) function converts a grid in u and v components -into a tuple of magnitude and direction.  The magnitude component +into a tuple of magnitude and direction. The magnitude component is [0] and the direction component is [1].

        WEATHER

        Weather is much more complicated and can be a big performance problem. -A tuple is provided.  The first element is a grid, which contains +A tuple is provided. The first element is a grid, which contains the indexes into the key. The second element is a sequence of all of the -keys.   The keys are the ugly strings associated with a -WeatherKey.  +keys. The keys are the ugly strings associated with a +WeatherKey. To access the grid:

        Wx[0]

        @@ -494,25 +472,24 @@ To access the grid:

        Wx[1][3], would give your the 4th key.

        Normally you don't access the weather grid in your calculations, but -if you need to, you have generally created a weather grid first.  +if you need to, you have generally created a weather grid first. In smart initialization, we know all of the possible weather keys that can be created and set up a table with those keys, then we simply poke -in the correct index for the key.  This is much more efficient +in the correct index for the key. This is much more efficient than searching the keys for each grid point.

        DICRETE

        Discrete is much more complicated than the simple scalar and vector case, and like weather, can be a big performance problem. A tuple is -provided.  +provided. The first element is a grid, which contains the indexes into the key. The -second element is a sequence of all of the keys.   The keys +second element is a sequence of all of the keys. The keys are -the discrete key values associated with the weather element.  To +the discrete key values associated with the weather element. To access the grid:

        DK[0] @@ -527,10 +504,10 @@ the grid:

        Normally you don't access the discrete grid in your calculations, but -if you need to, you have generally created a discrete grid first.  +if you need to, you have generally created a discrete grid first. In smart initialization, we know all of the possible discrete keys that can be created and set up a table with those keys, then we simply poke -in the correct index for the key.  This is much more efficient +in the correct index for the key. This is much more efficient than searching the keys for each grid point.

        @@ -541,10 +518,10 @@ searching the keys for each grid point. Algorithm The basic procedure to modify an existing algorithm is shown below:
          -
        • Create a new file in release/etc/SITE which should be +
        • Create a new file in release which should be named similarily, -but not identical to, the class in which you are modifying.  For +but not identical to, the class in which you are modifying. For example, if you are modifying the NAM12 model intiialization, which is stored in NAM12.py, @@ -553,7 +530,7 @@ is your eta.
        • The format of the file should be standard as shown in the Basic -File Structure section above.   In particular, it needs +File Structure section above. In particular, it needs to include the following items:
          • @@ -561,7 +538,7 @@ include the following items: from
          • the levels() function, but only if you are changing it
          • a replacement, named the same, of the function you are -modifying.  +modifying. You may want to copy this function (not ALL functions -- just this one) into this file from the original file and then edit it.
          • the tail, which includes the main() and the final if __name__ @@ -572,10 +549,10 @@ statements
          • file to override the INITMODULES section of the serverConfig.py.
          Here is an example of overriding the NAM12 derivation of Snow -Amount.  +Amount. The original NAM12.py file contains the following information (only part -of the file is shown).  The snow amount function calculates the +of the file is shown). The snow amount function calculates the snow ratio which varies depending upon temperature, and then assigns the snow @@ -628,10 +605,6 @@ where(less_equal(FzLevel
              NAM12Forecaster().run()

          -

          if __name__ == "__main__": -
          -    main() -

          Here is the derived MyNAM12 file that overrides the calcSnowAmt() function:

          @@ -657,31 +630,26 @@ NAM12Forecaster.__init__(self)
              MyNAM12Forecaster().run()

          -

          if __name__ == "__main__": -
          -    main() -

          The algorithm was changed to have a fixed 10:1 snow ratio anytime the -temperature is below 32.  The freezing level is no longer used in -this revision.  Of course you can completely rewrite the +temperature is below 32. The freezing level is no longer used in +this revision. Of course you can completely rewrite the algorithm, -use different arguments, etc.  Note that the name of the function, +use different arguments, etc. Note that the name of the function, calcSnowAmt() in this case is identical to to the name in the original -file.  This is important! +file. This is important!


          Adding New Algorithms

          Adding a new algorithm is just about the same as Modifying -An Existing Algorithm.  You will do the similar steps: +An Existing Algorithm. You will do the similar steps:
        parmName_level t_FHAG2Refers to a single grid for the parmName and the level.  + Refers to a single grid for the parmName and the level. The example accesses the temperature grid from the model that is at the FHAG2 (fixed @@ -311,9 +303,9 @@ height above ground 2m level) parmName_c rh_c Refers to a cube of data for the parmName. The "_c" indicates -the cube.  +the cube. The number of layers in the cube depend upon the levels() function -contents.  +contents. For example, if the levels() contain:
          def levels(self):
                return ["MB950", @@ -322,13 +314,13 @@ For example, if the levels() contain:
        "MB700","MB650","MB600","MB550", "MB500",

                        "MB450", "MB400", "MB350"]
        -then the cube will contain 13 levels.  Access of individual levels +then the cube will contain 13 levels. Access of individual levels can be done using indexing within the function.
        topo topoRefers to the high-resolution surface topography field,  + Refers to the high-resolution surface topography field, in units of meters above MSL.
        @@ -865,34 +815,42 @@ algorithmFile - - +yyyymmdd_hhmm. +If not specified, then run using the latest model data. + + + + + + + + + + @@ -906,21 +864,12 @@ module, such as NAM12, or MyNAM12.
        -h host yesDefines the host upon which the ifpServer is running.  + Defines the host upon which EDEX is running. Normally -this switch is not needed and the software will determine where the -ifpServer +this switch is not needed and the software will determine where EDEX is running.
        -p port yesDefines the RPC port upon which the ifpServer is -running.  Normally -this switch is not needed and the software will determine where the -ifpServer + Defines the RPC port upon which EDEX is +running. Normally +this switch is not needed and the software will determine where EDEX is running.
        -t modelTime yes Specifies the model run time in the format of -yyyymmdd_hhmm.  -If not specified, then run using the latest model data. 
        -s sitenoSpecifies the site id for whom to run the init.
        -u useryesSpecifies the user id who is executing the init.
        -a yes Specifies to create all of the possible data grids, which will overwrite -existing previously calculated grids.  Normally by default, only +existing previously calculated grids. Normally by default, only those grids that haven't yet been created will be attempted to be calculated.
        Note: The -h and -p switches are predefined to -match your GFESuite installation, such that they will point to the -ifpServer -specified on installation.  Thus the -h and -p switches are not -necessary -for normal running of this program.  However, if you wish to -connect -to a different server, then you will need to specify the -h and -p -switches.   If environment -variables ${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -p switches.
        -  +match your AWIPS installation, such that they will point to EDEX +specified on installation. Thus the -h and -p switches are not +necessary for normal running of this program. However, if you wish to +connect to a different server, then you will need to specify the -h and -p +switches.

        -


        Examples of Complete Smart Initalization Files

        @@ -944,6 +893,5 @@ a new model, the GWW model, to calculate wave height and wind. Several smart initialization exercises are available here.
        -  diff --git a/cave/com.raytheon.viz.gfe/help/SmartInitExercises.html b/cave/com.raytheon.viz.gfe/help/SmartInitExercises.html index c65480ead7..a86be00c4e 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartInitExercises.html +++ b/cave/com.raytheon.viz.gfe/help/SmartInitExercises.html @@ -6,15 +6,16 @@ + GFESuite Training - Smart Initialization Exercises </head> <body> <h1> Smart Initialization Exercises</h1> -May 14, 2004<br> +February 15, 2012<br> <hr style="width: 100%; height: 2px;"><br> <br> Performing these steps in an operational environment will mess up your -guidance.  You should only perform these on an non-operational +guidance. You should only perform these on an non-operational setup. <p>If you run out of time, please be sure to <a href="#cleanup">clean up @@ -30,44 +31,43 @@ algorithm</a> <br> <a href="#Answers">Answers</a> <br> -  <br> </p> <hr width="100%"> <h2><a name="Exercise1"></a>Exercise 1. Override the NAM algorithm for Temperature</h2> The purpose of this exercise is to learn how to override existing -algorithms.  -We will try three different examples.  The first example will +algorithms. +We will try three different examples. The first example will simply set the T to 32 degrees everywhere as a verification step to ensure that you have changed the algorithm correctly. <br> -  -<h3><a name="1a"></a>1a) Set the NAM algorithm for Temperature to +<h3><a name="1a"></a>1a) Set the NAM algorithm for Temperature to T=32</h3> -Create a new file in etc/SITE called MyNAM12.py.  This will be -your -override file.  Perhaps the best way to create this file is to +Create a new file in /release/edex/data/utility/edex_static/site/SITE/smartinit +called MyNAM12.py. This will be your +override file. Perhaps the best way to create this file is to copy -the original etc/BASE/smartInit/NAM12.py into etc/SITE/MyNAM12.py and then modify -it.  +the original /release/edex/data/utility/edex_static/base/smartinit/NAM12.py into +/release/edex/data/utility/edex_static/site/SITE/MyNAM12.py and then modify +it. Strip out all of the functions in the class except the calcT(), since that -is the function we will be overriding.  Refer to the documentation +is the function we will be overriding. Refer to the documentation on overriding a class -- you will need to make additional changes to the header of the file, the constructor, and the main declaration at the bottom of the class. <p>Change the calcT() function to simply set an entire grid to -32.  +32. Note you cannot simply set T=32, you need to create a numerical grid first of zeros, and then add 32 to it. </p> -<p>Save your file.  Run smart init by hand using the appropriate +<p>Save your file. Run smart init by hand using the appropriate command, similar to this, from the bin directory: <br> @@ -81,12 +81,12 @@ constant <br>   </p> -<h3><a name="1b"></a>1b) Set the NAM12 algorithm to use the 2m +<h3><a name="1b"></a>1b) Set the NAM12 algorithm to use the 2m Temperatures directly</h3> -Modify your previously created MyNAM12.py.  Change the algorithm +Modify your previously created MyNAM12.py. Change the algorithm to -use the 2m temperatures (t_FHAG2).  Don't forget that you want +use the 2m temperatures (t_FHAG2). Don't forget that you want degrees Fahrenheit and the model has temperatures in Kelvin. <p>Save your file. Run smart init by hand. Verify that the grids did @@ -95,108 +95,104 @@ changed. </p> <p><a href="#answer1b">Answers for exercise 1b</a> <br> -  </p> -<h3><a name="1c"></a>1c) Correct your algorithm for model and real +<h3><a name="1c"></a>1c) Correct your algorithm for model and real topographical differences</h3> -Modify your previously created MyNAM12.py.  Change the algorithm +Modify your previously created MyNAM12.py. Change the algorithm to -use a fixed lapse rate based on the standard atmosphere.  We will -assume 6.0 degrees Celsius per kilometer.  Your topo and stopo +use a fixed lapse rate based on the standard atmosphere. We will +assume 6.0 degrees Celsius per kilometer. Your topo and stopo fields -are in meters, the t_FHAG2 is in degrees Kelvin.  Don't forget to +are in meters, the t_FHAG2 is in degrees Kelvin. Don't forget to convert the answer to Fahrenheit. -<p>Save your file.  Run smart init by hand.  Verify that the +<p>Save your file. Run smart init by hand. Verify that the grids did get changed. </p> <p><a href="#answer1c">Answers for exercise 1c</a> <br> -  </p> -<h3><a name="1d"></a>1d) Putting your new algorithm into operation</h3> +<h3><a name="1d"></a>1d)Putting your new algorithm into operation</h3> In this exercise, we will be putting your new algorithm into operation -and verifying the correct steps have been made.  Normally you will -need to stop the ifpServer, edit the localConfig.py file, change the +and verifying the correct steps have been made. Normally you will +need to stop EDEX, edit the localConfig.py file, change the set -of INITMODULES to use your new MyNAM12, then restart the server.  +of INITMODULES to use your new MyNAM12, then restart the server. Since you really wouldn't see any changes until the next model run, before you restart your server, you should manually delete all NAM12 databases under -release/data/databases/BASE/GRID/NAM12. -<p>Start the server, bring up the GFE, call up the NAM12 T grids.  +release/edex/data/hdf5/gfe/NAM12; then connect to the metadata database +and issue SQL "delete from gfe where dbid like '%NAM12%';". +<p>Start EDEX, bring up the GFE, call up the NAM12 T grids. When smart init runs your module, the T grids should appear. </p> -<p>To clean up the system, stop the ifpServer, remove the +<p>To clean up the system, stop EDEX, remove the localConfig.py -INITMODULES entry, and remove your MyNAM12.py* files from the etc/SITE -directory, -purge the grids again from the release/data/databases/BASE/GRID/NAM12 -directory, -and restart the ifpServer. +INITMODULES entry, and remove your MyNAM12.py* files from the +/release/edex/data/utility/edex_static/site/SITE/smartinit directory, +purge the grids again from the release/edex/data/hdf5/gfe/NAM12 directory; +then connect to the metadata database +and issue SQL "delete from gfe where dbid like '%NAM12%';". +Finally, restart EDEX. </p> <p><a href="#answer1d">Answers for exercise 1d</a> <br> -  <br> -  </p> <p></p> <hr width="100%"> -<h2><a name="Exercise2"></a>Exercise 2) Adding a new weather +<h2><a name="Exercise2"></a>Exercise 2) Adding a new weather element and algorithm</h2> In this exercise, we will be adding a new weather element to the NAM12 database, called DewPointDepression, and then defining a new algorithm to automatically -create it.  Since this is a new element, you first must create the +create it. Since this is a new element, you first must create the localConfig.py entry to add the weather element. <br> -  <h3><a name="2a"></a>2a) Define your new weather element.</h3> <p><br> -Add the Dew Point Depression with the following characteristics +Add the DewPointDepression with the following characteristics to your localConfig.py: <br> DPD =    ("TdD", SCALAR, "F", "Dew Point Depression", 50, 0, 0) </p> -<p>Be sure to identify this as a new parm for the NAM12 model.  -Hint: parmsNAM12 -is the variable name you need for your parm grouping.  Set the +<p>Be sure to identify this as a new parm for the NAM12 model. +Hint: parmsNAM12 +is the variable name you need for your parm grouping. Set the time constraint to TC6, since the NAM12 comes in every 6 hours. </p> -<p>Stop the ifpServer, then restart it.  Bring up the GFE to +<p>Stop EDEX, then restart it. Bring up the GFE to verify that there is now a Dew Point Depression weather element in the NAM database.<a href="#answer2a"></a> </p> <p><a href="#answer2a">Answers for exercise 2a</a> <br> -  </p> -<h3><a name="2b"></a>2b) Create your algorithm and test it.</h3> -Create or modify the MyNAM12.py file in etc/SITE.  You may leave -in -your calcT() from exercise #1 if desired.  Add a new calc function -for Dew Point Depression.  The equation is basically T - Td.  +<h3><a name="2b"></a>2b) Create your algorithm and test it.</h3> +Create or modify the MyNAM12.py file in +/release/edex/data/utility/edex_static/site/SITE/smartinit. You may leave +in your calcT() from exercise #1 if desired. Add a new calc function +for Dew Point Depression. The equation is basically T - Td. You can choose to calculate T-Td in one of two ways: <ul> - <li>use the T and Td from the output IFP NAM12 database</li> - <li>use the t_FHAG2 from the input D2D NAM12 database, and then + <li>use the T and Td from the output IFP NAM12 database</li> + <li>use the t_FHAG2 from the input D2D NAM12 database, and then calculate dew point from the t_FHAG2 and rh_FHAG2.</li> </ul> -Save your file.  Run smart init by hand using the appropriate +Save your file. Run smart init by hand using the appropriate command, similar to this, from the bin directory: <br> -<tt>ifpInit -t 20011117_1200 -a MyNAM12</tt> +<tt>ifpInit -s xxx -t 20011117_1200 -a MyNAM12</tt> <p>Look at the NAM dew point depression grids, compare with the T and Td grids with the sample tool to make sure you have done the equation @@ -204,16 +200,17 @@ correctly. </p> <p><a href="#answer2b">Answers for exercise 2b</a> </p> -<p></p> <hr width="100%"> <h2><a name="cleanup"></a>Clean up your system</h2> -To clean up the system, stop the ifpServer, remove the localConfig.py +To clean up the system, stop EDEX, remove the localConfig.py INITMODULES and dew point depression entries, and remove your MyNAM12.py* files -from -the etc/SITE directory, purge the grids again from the -release/data/databases/BASE/GRID/NAM12 -directory, and restart the ifpServer. +from the /release/edex/data/utility/edex_static/site/SITE/smartinit +directory, purge the grids again from the +release/edex/data/hdf5/gfe/NAM12 directory; +then connect to the metadata database +and issue SQL "delete from gfe where dbid like '%NAM12%';". +Restart EDEX. <br> <hr width="100%"> <h2><a name="Answers"></a>Answers</h2> @@ -239,14 +236,6 @@ NAM12Forecaster.__init__(self)</tt> <br> <tt>    MyNAM12Forecaster().run()</tt> </p> -<p><tt>if __name__ == "__main__":</tt> -<br> -<tt>    main()</tt> -<br> -  -<br> -  -</p> <h3><a name="answer1b"></a>Answer for Exercise 1b</h3> <p><br> <tt>from NAM12 import *</tt> @@ -266,14 +255,6 @@ NAM12Forecaster.__init__(self)</tt> <br> <tt>    MyNAM12Forecaster().run()</tt> </p> -<p><tt>if __name__ == "__main__":</tt> -<br> -<tt>    main()</tt> -<br> -  -<br> -  -</p> <h3><a name="answer1c"></a>Answer for Exercise 1c</h3> <tt>from NAM12 import *</tt> <p><tt>class MyNAM12Forecaster(NAM12Forecaster):</tt> @@ -297,18 +278,6 @@ NAM12Forecaster.__init__(self)</tt> <br> <tt>    MyNAM12Forecaster().run()</tt> </p> -<p><tt>if __name__ == "__main__":</tt> -<br> -<tt>    main()</tt> -<br> -<tt></tt>  -<br> -  -<br> -  -<br> -  -</p> <h3><a name="answer1d"></a>Answer for Exercise 1d</h3> Entry in localConfig.py: <p><tt>from serverConfig import *</tt> @@ -319,9 +288,7 @@ Entry in localConfig.py: <br> <tt>del serverConfig.INITMODULES["NAM12"]</tt> <br> -<tt></tt>  <br> -  </p> <h3><a name="answer2a"></a>Answer for Exercise 2a</h3> Entry in localConfig.py: @@ -334,11 +301,8 @@ Depression", 50, 0, 0)</tt> <br> <tt>parmsNAM12 = [([DPD], TC6)]</tt> <br> -<tt></tt>  <br> -<tt></tt>  <br> -<tt></tt>  </p> <h3><a name="answer2b"></a>Answer for Exercise 2b</h3> <tt>from NAM12 import *</tt> @@ -357,13 +321,9 @@ NAM12Forecaster.__init__(self)</tt> <br> <tt>    MyNAM12Forecaster().run()</tt> </p> -<p><tt>if __name__ == "__main__":</tt> -<br> -<tt>    main()</tt><tt></tt> -</p> <p>The alternative form, where you use the t_FHAG2 and rh_FHAG2 would be -the following.  Note that this method will not take advantage of +the following. Note that this method will not take advantage of any topographical corrections you have made in the temperatures:<tt></tt> </p> @@ -417,22 +377,13 @@ t), t, td)</tt> <br> <tt>        return td</tt> <br> -<tt></tt>  <br> -<tt></tt> <tt></tt> </p> <p><tt>def main():</tt> <br> <tt>    MyNAM12Forecaster().run()</tt> </p> -<p><tt>if __name__ == "__main__":</tt> <br> -<tt>    main()</tt><tt></tt> -</p> -<p></p> -<hr width="100%"><br> -  <br> -  </body> </html> diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClass.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClass.html index 745af5ef96..551413ade1 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClass.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClass.html @@ -16,7 +16,6 @@ Tools and Procedures. Complete documentation is within the class itself (viewable from the Edit Action Dialog Utilities Window) and has been duplicated here. -<p></p> <h3>Contents</h3> <a href="#Args">General Arguments</a> @@ -149,25 +148,6 @@ that if a time is not included in the model argument, you will automatically get the most recent model no matter how this argument is set.) <br> -  -<br> -  </p> - - - - - - - - - - - - - - - -  </body> </html> diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassCalls.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassCalls.html index 681adfaa40..ed690f4aab 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassCalls.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassCalls.html @@ -1,5 +1,5 @@ <html> -<title>GFESuite Documentation - +Smart Script Class - Calling Smart Tools and Procedures

        Calling Smart Tools and Procedures

        @@ -17,8 +17,7 @@ Arguments

        Calling Smart Tools and Procedures Arguments

        -      ## editArea : must be of type -AFPS.ReferenceData +      ## editArea : ReferenceData or None
              ##     (See @@ -33,8 +32,7 @@ active edit area from the GFE or from       ##      the editArea argument for runProcedure.
        -      ## timeRange: must be of type -AFPS.TimeRange +      ## timeRange: TimeRange or None
              ##      (See @@ -111,8 +109,7 @@ be tested by the calling tool or script. def callSmartTool(self, toolName, elementName, editArea=None, timeRange=None, varDict=None, editValues=1, calcArea=0, calcGrid=0, passErrors=[], -missingDataMode=AFPS.EditActionMsg.MD_DEFAULT, -modal=1): +missingDataMode="", modal=1):
               # passErrors: a list of errors to ignore and pass back to the @@ -172,4 +169,4 @@ self.noData()

        callProcedure

        def callProcedure(self, name, editArea=None, timeRange=None, varDict=None, -missingDataMode=AFPS.EditActionMsg.MD_DEFAULT, modal=1): \ No newline at end of file +missingDataMode="Stop", modal=1): \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassConversion.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassConversion.html index b9048a34eb..5031e39f5c 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassConversion.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassConversion.html @@ -1,5 +1,5 @@ -GFESuite Documentation - +Smart Script Class - Conversion Methods
        @@ -19,8 +19,6 @@ FtoK
        convertFtToM -
        -round
        @@ -65,7 +63,4 @@ def FtoK(self, t_F): def convertFtToM(self, value_Ft):
              # Convert the value in Feet to Meters -

        round

        -def round(self, value, increment, mode="Nearest"): "Round according to -mode: Up, Down, Nearest and increment" diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassErrorHandling.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassErrorHandling.html index 4a4994167f..dabb5029fc 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassErrorHandling.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassErrorHandling.html @@ -1,5 +1,5 @@ -GFESuite Documentation - +Smart Script Class - Error Handling

        Error Handling


        @@ -21,8 +21,8 @@ abort def abort(self, info):
        -      # This call will send the info to the -GFE status bar, +      # This call will send the info to +AlertViz,
              # put up a dialog with the given info, and abort the @@ -47,10 +47,10 @@ an error message

        errorReturn

        def errorReturn(self, noDataError, message):

        statusBarMsg

        -def statusBarMsg(self, message, status): +def statusBarMsg(self, message, status, category="GFE"):
        -      # Sends the text message to the GFE -status bar with the +      # Sends the text message to AlertViz +with the
              # given status code: "R" (regular), "S" (significant), or "U" (urgent) diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassGridAccess.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassGridAccess.html index 043fd70a04..fc37e19196 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassGridAccess.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassGridAccess.html @@ -1,5 +1,5 @@ -GFESuite Documentation - +Smart Script Class Grid Access

        Grid Access Methods

        @@ -10,8 +10,6 @@
        directionTaperGrid
        -getValue (point-based only) -
        getComposite (numeric only)
        getGridInfo @@ -21,7 +19,7 @@

        getGrids

        def getGrids(self, model, element, level, timeRange, mode="TimeWtAverage", -noDataError=1, mostRecentModel=0): +noDataError=1, mostRecentModel=0, cache=1):
              # Get the value(s) for the given model, element, and level @@ -60,10 +58,7 @@ tools to taper results.
              # Argument:
        -      # editArea : must be of type -AFPS.ReferenceData -or None -
        +      # editArea: Reference data or None
              # (use editArea tool argument)
              # taperFactor: If set to zero, will @@ -75,13 +70,13 @@ do Full Taper
              # def preProcessTool(self, editArea):
        -      #     taperGrid +      #     self._tGrid = self.getTaperGrid(editArea, 5)
        -      # def execute(self, x, y): +      # def execute(self, variableElement):
        -      #     result = value -* taperGrid[x][y] +      #     return = +variableElement + self._tGrid * 10.0
              #

        directionTaperGrid

        @@ -111,8 +106,7 @@ tools to show
              # Argument:
        -      # editArea : must be of type -AFPS.ReferenceData +      # editArea : ReferenceData or None
              # (use editArea tool argument) @@ -126,118 +120,17 @@ e.g. "NNW", "NW", etc.
              # def preProcessTool(self, editArea):
        -      #     spaceProgress +      #     self._spaceProgress = self.directionTaperGrid(editArea, "NW")
        -      # def execute(self, x, y): +      # def execute(self, variableElement):
        -      #     result = value -* spaceProgress[x][y] -
        -      # -

        getValue (point-based only)

        -def getValue(self, model, element, level, x, y, timeRange, -mode="TimeWtAverage", -noDataError=1, mostRecentModel=0): -
        -      # Point-based tools only. -
        -      # Get the value(s) for the given model, -element, and level -
        -      # at the x, y coordinate and over the -given timeRange. -
        -      # Examples: -
        -      # Get the following arguments in your -execute method: -
        -      # def execute(self, x, y, GridTimeRange, -varDict): -
        -      # -
        -      # Accessing values from the Fcst -database: -
        -      # -
        -      # T = self.getValue("Fcst", "T", "SFC", -x, y, GridTimeRange) -
        -      # PoP = self.getValue("Fcst", "PoP", -"SFC", x,y, GridTimeRange, -
        -      # noDataError=0) -
        -      # -
        -      # From an IFP model database: -
        -      # -
        -      # T = self.getValue("BOU__NAM_Oct3100", -"T", "SFC",x,y,GridTimeRange) -
        -      # T = self.getValue("BOU__NAM", "T", -"SFC",x,y,GridTimeRange) -
        -      # -
        -      # Or, using a variable: -
        -      # -
        -      # VariableList = [("Model:" , "", -"model")] -
        -      # def execute(self, x, y, GridTimeRange, -varDict): -
        -      # model = varDict["Model:"] -
        -      # T = self.getValue(model, "T", -"SFC",x,y,GridTimeRange) -
        -      # -
        -      # From D2D database: -
        -      # -
        -      # rh = self.getValue( -
        -      # "BOU_D2D_ETA", "rh", "MB850", x, y, -GridTimeRange) -
        -      # rh = self.getValue( -
        -      # "BOU_D2D_ETA_Oct3100", "rh", -"MB850",x, -y, GridTimeRange) -
        -      # -
        -      # Or, using a variable: -
        -      # -
        -      # VariableList = [("Model:" , "", -"D2D_model")] -
        -      # def execute(self, x, y, GridTimeRange, -varDict): -
        -      # model = varDict["Model:"] -
        -      # rh = self.getValue(model, "rh", -"MB850", -x, y, GridTimeRange) +      #     return +variableElement * self._spaceProgress
              #

        getComposite (numeric only)

        -def getComposite(self, WEname, GridTimeRange, exactMatch=1): +def getComposite(self, WEname, GridTimeRange, exactMatch=1, onlyISC=0):
               # Returns a composite grid consisting @@ -335,29 +228,25 @@ wxType == 1: # VECTOR #         bits, mag, dir = isc

        getGridInfo

        def getGridInfo(self, model, element, level, timeRange, mostRecentModel=0):
        -      #  Return a list of GridInfo -objects -for the given weather element and timeRange -
        -      #   Example: -
        -      -#         -timeRange = self.getTimeRange("Today") -
        -      -#         -infoList = self.getGridInfo("Fcst", "T", "SFC", timeRange) -
        -      -#         -for info in infoList: -
        -      -#                 -print "grid", info.gridTime() +      #  Return the GridInfo object for the given weather element and timeRange
        +      #  Example:
        +      #  timeRange = self.getTimeRange("Today")
        +      #  infoList = self.getGridInfo("Fcst", "T", "SFC", timeRange)
        +      #  for info in infoList:
        +      #  print "grid", info.gridTime()
        +      # 
        +      #  @param model: The model for which grid info is requested.
        +      #  @type model: DatabaseId or String
        +      #  @param element: The element for which grid info is requested.
        +      #  @type element: String
        +      #  @param level: The level for which grid info is requested.
        +      #  @type level: String
        +      #  @param timeRange: A time range over which grid info is requested.
        +      #  @type timeRange: com.raytheon.uf.common.time.TimeRange or TimeRange
        +      #  @param mostRecentModel: whether to use current time in request expr.
        +      #  @type mostRecentModel: integer or boolean
        +      #  @return: Java GridParmInfo object
        diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassNumerics.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassNumerics.html index 7eb930e321..26eabe5fc4 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassNumerics.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassNumerics.html @@ -1,11 +1,13 @@ -GFESuite Documentation - +Smart Script Class - Numerics

        Numeric Library Methods


        getTopo
        -wxMask +wxMask/discreteMask +
        +sortUglyStr
        getIndex
        @@ -20,13 +22,12 @@ agradient
        diff2 +
        +getGridShape
        - - -

        -getTopo

        +

        getTopo

        def getTopo(self):
              # Return the numeric topo grid @@ -91,7 +92,6 @@ we want to treat the query as a literal Tool Training Guide -- Numerical Tools and Working with Weather Section for more information.

        discreteMask

        def wxMask(self, wx, query, isreg=0):
        @@ -147,6 +147,15 @@ we want to treat the query as a literal = where(self.wxMask(wxTuple, "WintStmWRN") maximum(5, PoP), PoP)
               # +

        sortUglyStr

        +def sortUglyStr(self, uglyStr): +
        +       # Sort the subkeys of uglyStr alphabetically.
        +       #
        +       # @param uglyStr: A key with "^"s separating subkeys
        +       # @type uglyStr: string
        +       # @return: uglyStr with alpha sorted subkeys.
        +       # @rtype: string

        getIndex

        def getIndex(self, uglyStr, keys):
        @@ -225,15 +234,15 @@ for more information. 

        encodeEditArea

        def encodeEditArea(self, editArea):
        -      # Returns a Numeric Python mask for +      # Returns a numpy mask for the edit area
              # "editArea" can be a named area or -a referenceData object +a ReferenceData object

        decodeEditArea

        def decodeEditArea(self, mask):
        -      # Returns a refData object for the given +      # Returns a ReferenceData object for the given mask

        getindicies

        def getindicies(self, o, l): @@ -257,4 +266,12 @@ first-order, discrete the derivative along the axis
              # specified. array edges are padded -with adjacent values. \ No newline at end of file +with adjacent values. + +

        getGridShape

        +def getGridShape(self): +
        +      # Get the grid shape from the GridLocation stored in the parm manager.
        +      #
        +      # @return: The number of data points in the X and Y directions.
        +      # @rtype: 2-tuple of int
        \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassOnTheFly.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassOnTheFly.html index bab4fb8baa..c11175f755 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassOnTheFly.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassOnTheFly.html @@ -1,5 +1,5 @@ -GFESuite Documentation - +Smart Script Class - Creating On-the-Fly Grids

        Creating On-the-Fly Grids


        @@ -13,9 +13,6 @@
        - - -

        createGrid

            def createGrid(self, model, element, elementType, @@ -27,7 +24,9 @@ precision=None, minAllowedValue=None,
                           maxAllowedValue=None, units=None, rateParm=0,
                           -discreteKeys=None, discreteOverlap=None):
        +discreteKeys=None, discreteOverlap=None,
        +                   +discreteAuxDataLength=None, defaultColorTable=None):
                                                                                       
                                                                                        @@ -36,18 +35,22 @@ discreteKeys=None, discreteOverlap=None):
        given model and element.
                # If the model and element do not already exist, creates them -on-the-fly        #
        +on-the-fly       
                # The descriptiveName, timeConstraints, precision, minAllowedValue,
                # maxAllowedValue, units, rateParm, discreteKeys, discreteOverlap,
        -        # only need to be specified +        # and discreteAuxDataLength only need to be specified for the first grid being created.  These
                # values are ignored for subsequent calls to createGrid() for
                # the same weather element.

        -

                # DISCRETE elements -require a definition for discreteKeys and
        + +        # For new parms, the defaultColorTable is the one to be used for
        +        # display. If not specified and not in the gfe configuration file,
        +        # a DEFAULT color table will be used.

        + +        # DISCRETE elements require a definition for discreteKeys and
                # discreteOverlap. For DISCRETE, the precision, minAllowedValue,
                # maxAllowedValue, and @@ -89,8 +92,7 @@ a simple string with no special
        #          characters.
                # elementType -- "SCALAR", "VECTOR", "WEATHER", or "DISCRETE"
        -        # numericGrid -- a Numeric -Python grid
        +        # numericGrid -- a numpy grid
                # timeRange -- valid time range for the grid.  You may want
                @@ -103,7 +105,7 @@ timeConstraints, precision, minAllowedValue,
        minAllowedValue, maxAllowedValue, and units can be
                # used to define the GridParmInfo needed. Note that timeConstraints
        -        # is not the C++ version, +        # is not the Java version, but a (startSec, repeatSec, durSec).
                #
                # Example:
        diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassProcedure.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassProcedure.html index 20778c7645..91da0b0bc4 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassProcedure.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassProcedure.html @@ -1,5 +1,5 @@ -GFESuite Documentation - +Smart Script Class - Procedure Methods @@ -66,8 +66,7 @@ to shift the data in time
              # shift command
        -      # databaseID must be of type -AFPS.DatabaseID +      # DatabaseID
              # Can be obtained in various ways:
        @@ -80,8 +79,7 @@ with the result "model" or "D2D_model"
        -      # timeRange must be of type -AFPS.TimeRange. +      # TimeRange.
              # Can be obtained in various ways:
        diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassPythonObjectMethods.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassPythonObjectMethods.html index f60a00f120..f6493be134 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassPythonObjectMethods.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassPythonObjectMethods.html @@ -1,5 +1,5 @@ -GFESuite Documentation - +Smart Script Class - Python Object Methods

        Python Object Methods


        @@ -11,9 +11,6 @@
        - - - These methods allow you to save, get, and delete Python objects to and from the server.

        saveObject

        diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassSounding.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassSounding.html index 4a3d461607..e5c36ab05e 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassSounding.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassSounding.html @@ -1,44 +1,18 @@ -GFESuite Documentation - +Smart Script Class - Sounding Methods

        Sounding Methods

        makeNumericSounding (numeric only)
        -interpolateValues -
        -linear -
        -extrapolate -
        -interpolateScalarValues -
        -interpolateVectorValues -
        -getLevels -
        -getSoundingValue -(point-based -only) -
        -getValueFromSounding -(point-based only) -
        -makeSounding (point-based -only) -
        getNumericMeanValue (numeric only)
        -getMeanValue (point-based -only) -

        -

        -makeNumericSounding (numeric only)

        +

        makeNumericSounding (numeric only)

        def makeNumericSounding(self, model, element, levels, timeRange, noDataError=1, mostRecentModel=0): @@ -74,197 +48,6 @@ the given levels
              # valueCube of values for the given levels -

        interpolateValues

        -def interpolateValues(self, height, (h1, v1), (h2, v2)): -
        -      # Interpolate between the height and -values -

        linear

        -def linear(self, xmin, xmax, ymin, ymax, we): -

        extrapolate

        -def extrapolate(self, height, (h1, v1),(h2, v2)): -
        -      # Extrapolate from the height and values -

        interpolateScalarValues

        -def interpolateScalarValues(self, height, (h1, v1), (h2, v2)): -
        -      # Interpolate between the height and -values -

        interpolateVectorValues

        -def interpolateVectorValues(self, height, (h1, v1), (h2, v2)): -
        -      # Interpolate between the height and -values -

        getLevels

        -def getLevels(self, level1, level2, noDataError=1): -
        -      # Return a list of levels between and -including level1 and level2 -
        -      # Will do ascending or descending -depending -on order of arguments -
        -      # levels = self.getLevels("MB900", -"MB500") -# descending -
        -      # levels = self.getLevels("MB600", -"MB1000") -# ascending -

        getSoundingValue (point-based only)

        -def getSoundingValue(self, model, element, levels, x, y, timeRange, -height, -method=None, noDataError=1, mostRecentModel=0): -
        -      # Make a sounding for the given model, -element, and levels at -
        -      # the x,y coordinates for the given -timeRange. -
        -      # Then get the value of the sounding -for the given height. -
        -      # Use the given method for calculating -a value between two heights -
        -      # in the sounding. -
        -      # The levels MUST be increasing in -height. -
        -      # Height needs to be in the same units -as the sounding. -
        -      # The default method if None is -specified, -is "interpolateValues" -
        -      # -
        -      # Example: -
        -      # topo_M = convertFtToM(Topo) -
        -      # levels = -["MB850","MB800","MB750","MB700","MB650","MB600"] -
        -      # surfaceRH = -self.getSoundingValue(model, -"rh", levels, x, y, -
        -      # GridTimeRange, topo_M) -
        -      # Arguments: -
        -      # -
        -      # The "levels" argument is a Python -list of levels INCREASING -
        -      # in height. -
        -      # The other argument descriptions are -the same as for -
        -      # "getValue" (see above) -
        -      # Find bounding levels (lowerLevel and -upperLevel) -
        -      # for the given height -

        makeSounding (point-based only)

        -def makeSounding(self, model, element, levels, x, y, timeRange, -noDataError=1, -mostRecentModel=0): -
        -      # Make a sounding for the given model, -element, and levels -
        -      # Example: -
        -      # levels = -["MB850","MB800","MB750","MB700","MB650","MB600"] -
        -      # sounding = self.makeSounding(model, -"rh", levels, x, y, -
        -      # GridTimeRange) -
        -      # -
        -      # Arguments: -
        -      # -
        -      # The "levels" argument is a Python -list of levels INCREASING -
        -      # in height. -
        -      # The other argument descriptions are -the same as for -
        -      # "getValue" (see above) -
        -      # This method returns a tuple of height, -value tuples. -
        -      # In general, you will not need to -access -the sounding directly, -
        -      # but will simply pass it to the -"getValueFromSounding" -method -
        -      # (see below) -

        getValueFromSounding -(point-based only)

        -def getValueFromSounding(self, sounding, height, method=None): -
        -      # Get the value of the sounding for -the given -
        -      # height. Use the given method for -calculating -a value -
        -      # between two heights in the sounding. -
        -      # The default method if None is -specified, -is "interpolateValues" -
        -      # -
        -      # Example: -
        -      # levels = -["MB850","MB800","MB750","MB700","MB650","MB600"] -
        -      # sounding = self.makeSounding(model, -"rh", levels, x, y, -
        -      # GridTimeRange) -
        -      # topo_M = convertFtToM(Topo) -
        -      # surfaceRH = -self.getValueFromSounding(sounding, -topo_M) -
        -      # -
        -      # -
        -      # Height needs to be in the same units -as the sounding -
        -      # The sounding is assumed to be -increasing -in height

        getNumericMeanValue (numeric only)

        def getNumericMeanValue(self, model, element, levels, timeRange, noDataError=1): @@ -273,12 +56,4 @@ noDataError=1): for the given element between and including
              # the given levels -

        getMeanValue (point-based only)

        -def getMeanValue(self, model, element, levels, x, y, timeRange, -noDataError=1): -
        -      # Get a mean value for the given element -between and including -
        -      # the given levels diff --git a/cave/com.raytheon.viz.gfe/help/SmartScriptClassUtilities.html b/cave/com.raytheon.viz.gfe/help/SmartScriptClassUtilities.html index 077e5146d3..3a0e1a9cc7 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartScriptClassUtilities.html +++ b/cave/com.raytheon.viz.gfe/help/SmartScriptClassUtilities.html @@ -1,5 +1,5 @@ -GFESuite Documentation - +Smart Script Class - Utilities

        Utilities

        @@ -14,10 +14,6 @@
        getSamplePoints
        -_timeRangeStr -
        -fformat -
        dayTime
        determineTimeShift @@ -38,6 +34,8 @@
        getLatLon
        +getLatLonGrids +
        getGridCell
        getGrid2DBit @@ -52,12 +50,16 @@
        getParm
        +getParmByExpr +
        cacheElements
        unCacheElements
        loadWEGroup
        +unloadWE +
        saveElements
        publishElements @@ -70,19 +72,18 @@
        setVectorEditMode
        +getConfigItem +
        esat
        - - -

        findDatabase

        def findDatabase(self, databaseName, version=0):
        -      # Return an AFPS.DatabaseID object. +      # Return a database id.
              # databaseName can have the appended type. E.g. "NAM" or "D2D_NAM" @@ -100,7 +101,7 @@ self.findDatabase("NAM",0)

        getDatabase

        def getDatabase(self, databaseString):
        -      # Return an AFPS.DatabaseID object. +      # Return a database id.
              # databaseString is the result of a VariableList entry of type @@ -109,7 +110,7 @@ VariableList entry of type

        getTimeRange

        def getTimeRange(self, timeRangeName):
        -      # Returns an AFPS.TimeRange object given +      # Returns TimeRange given a time range name
              # as defined in the GFE @@ -120,7 +121,7 @@ a time range name

        createTimeRange

        def createTimeRange(self, startHour, endHour, mode="LT", dbID=None):
        -      # Returns an AFPS.TimeRange object given +      # Returns TimeRange given by:
              # startHour, endHour @@ -176,19 +177,8 @@ points will be
              # those currently displayed on the GFE -

        _timeRangeStr

        -def _timeRangeStr(self, tr): -
        -      # Returns given time range in format: -"%Y%m%d_%H%M" -

        fformat

        -def fformat(self, value, roundVal): -
        -      # Return a string for the floating point -value -
        -      # truncated to the resolution given -by roundVal + +

        dayTime

        def dayTime(self, timeRange, startHour=6, endHour=18):
        @@ -208,19 +198,19 @@ def determineTimeShift(self):

        getEditArea

        def getEditArea(self, editAreaName):
        -      # Returns an AFPS.ReferenceData object +      # Returns a ReferenceData object given an edit area name
              # as defined in the GFE

        saveEditArea

        def saveEditArea(self, editAreaName, refData):
        -      # Saves the AFPS.ReferenceData object +      # Saves the ReferenceData object with the given name

        setActiveEditArea

        def setActiveEditArea(self, area):
        -      # Set the AFPS.ReferenceData area to +      # Set the ReferenceData area to be the active one in the GFE
              # Note: This will not take effect until @@ -270,7 +260,7 @@ element

        getGridCellSwath

        def getGridCellSwath(self, editArea, cells):
        -      # Returns an AFPS.ReferenceData swath +      # Returns a ReferenceData swath of the given
              # number of cells around the given an @@ -281,9 +271,22 @@ edit area. def getLatLon(self, x, y):
              # Get the latitude/longitude values -for the given grid point coords = AFPS.CC2Dint(x,y) cc2D = -self.__gridLoc.latLonCenter(coords) -return cc2D.y, cc2D.x +for the given grid point
        +      coords = Coordinate(float(x), float(y))
        +      cc2D = self.getGridLoc().latLonCenter(coords)
        +      return cc2D.y, cc2D.x + + +

        getLatLonGrids

        +def getLatLonGrids(self): +
        +      # Get the latitude/longitude grids
        +      gridLoc = self.getGridLoc()
        +      latLonGrid = gridLoc.getLatLonGrid().__numpy__[0];
        +      latLonGrid = numpy.reshape(latLonGrid, (2,gridLoc.getNy().intValue(),
        +           gridLoc.getNx().intValue()), order='F')
        +      return latLonGrid[1], latLonGrid[0] +

        getGridCell

        def getGridCell(self, lat, lon):
        @@ -373,20 +376,30 @@ def getParm(self, model, element, level, timeRange=None, mostRecent=0):
              # Returns the parm object for the given model, element, and level + +

        getParmByExpr

        +def getParmByExpr(self, exprName): +
        +      # Returns the parm object for the given expression

        cacheElements

        def cacheElements(self, elementNames):
        -      # Set these elements to be cached -self.__parmMgr.addCachedParmList(elementNames) +      # This routine is deprecated - caching is controlled by the system.

        unCacheElements

        def unCacheElements(self, elementNames):
        -      # Set these elements to be un-cached +      # This routine is deprecated
        +      # Users may still call this method
        +      # to delete temporary parms in the parm manager.

        loadWEGroup

        def loadWEGroup(self, groupName):
              # Load the given weather element group into the GFE +

        unloadWE

        +def unloadWE(self, model, element, level, mostRecent=0): +
        +      # Unload the given weather element from GFE

        saveElements

        def saveElements(self, elementList):
        @@ -459,5 +472,10 @@ only" only"
               #     "Both" +

        getConfigItem

        +def getConfigItem(elf, itemName, default=None): +
        +       # Return the configuration file value for "itemName"
        +       # If not found, return the default given

        esat

        def esat(self, temp): diff --git a/cave/com.raytheon.viz.gfe/help/SmartTools.html b/cave/com.raytheon.viz.gfe/help/SmartTools.html index fcf3c9abd5..cb6561ada2 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartTools.html +++ b/cave/com.raytheon.viz.gfe/help/SmartTools.html @@ -38,10 +38,10 @@ Edit Actions are operators that can modify many grids in a single operation, thus potentially saving you time. The GFE has two kinds of Edit Actions: -
      • Smart Tools:  bits of code which perform +
      • Smart Tools: bits of code which perform operations on a grid-by-grid -basis.  Smart Tools are written in a language called, Python.
      • +basis. Smart Tools are written in a language called, Python.
      • Procedures: bits of code which can perform operations on many grids and may call Smart Tools and other useful commands which can create, @@ -54,7 +54,6 @@ be careful. It's easy to unintentionally modify grids, too. The next section describes how you control which grids get modified.
        Before you actually execute an Edit Action you must first indicate the grids that you wish to modify. There are two ways to @@ -79,18 +78,14 @@ that grid should start with the word "(edit)".
          1. Make any grid you choose editable by moving the cursor over -that grid -in +that grid in the Grid Manager pressing MB1. Alternatively, you can MB2 click on the Spatial Editor label that corresponds to that grid.
          2. In the Spatial Editor, pick the Select Points tool and create -an edit -area -on the display.
          3. +an edit area on the display.
          4. On the button bar, MB1-click on the button that looks like the icon to -the right. A list dialog will appear +the right. A list dialog will appear looking similar the figure below containing items such as SetValue, AdjustValue_Up, AdjustValue_Down, and Smooth.
          5. @@ -107,28 +102,26 @@ data using different edit actions.
      - -
        + +

      Once you have selected an edit area, you can execute any of these Smart -Tools in any order.  (Sometimes the Edit Actions Dialog appears in +Tools in any order. (Sometimes the Edit Actions Dialog appears in an inconvenient location such as on top of the data you wish to edit. The -Edit Actions Dialog is easily moved by holding down the ALT key, -pressing +Edit Actions Dialog is easily moved by pressing MB1 on the menu and dragging the menu to a more desirable location. Moving the cursor over the title bar of this menu and MB1 dragging will move this -dialog as well.)
      +dialog as well.)

      When a grid is "Editable", the Smart Tools that apply -to it will appear in the Edit Actions Dialog.  If no grid is +to it will appear in the Edit Actions Dialog. If no grid is editable, all tools will appear. However, to execute a tool, the Weather Element -to be modified by it, MUST be "Editable".  The tools that apply to +to be modified by it, MUST be "Editable". The tools that apply to the "Editable" Weather Element also appear and can be executed from the -MB3 pop-up menu over the Spatial Editor.   In addition, -keyboard +MB3 pop-up menu over the Spatial Editor. In addition, keyboard shortcuts can be set up for Smart Tools and Procedures (see gfeConfig Keyboard Shortcuts).
      @@ -168,15 +161,13 @@ you chose.
    • -
      Examine all of the grids that you modifed until you -convince -yourself that you did modify all the grids that you intended. +
      Examine all of the grids that you modified until you +convince yourself that you did modify all the grids that you intended.

      Procedures may also depend upon the Spatial Editor time and Selected -Time Range.  However, they have the capability of internally -defining +Time Range. However, they have the capability of internally defining the grids and time range upon which they operate.

      -
        +

      In summary, the Grid Manager's selected time range is used to indicate which grids will be modified by a Smart Tool. If no selected time range @@ -185,7 +176,7 @@ Tool is the best way to know which grids will be edited before the operation is executed. If you decide NOT to perform the edit, simply move the mouse -off the Smart Tool before releasing MB1.
      +off the Smart Tool before releasing MB1.

      The list of Smart Tools may include items that are defined at the local site. These Smart Tools can use previously defined fields @@ -198,7 +189,7 @@ Edit Action Warnings performing Edit Actions: Empty Edit Area Warning and Time Range Warning. These can both be turned on or off from the Main Menu or from the Warning itself.
      -
        +

      The Time Range Warning cautions you that multiple grids will be modified @@ -213,13 +204,5 @@ not checked, so one can also perform Assign_Value repeatedly and change the pickup value in between without getting a warning message.
      -  - - - - - - - diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsAppendix.html b/cave/com.raytheon.viz.gfe/help/SmartToolsAppendix.html index 087fd6899d..5bc2093a6d 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsAppendix.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsAppendix.html @@ -17,7 +17,7 @@ Modifying a Tool      Exercise Point-based-3 -- Using VariableLists
      -    Working With  Point-based Weather +     Working With  Point-based Weather
           Exercise Point-based SmartScript-1 @@ -29,20 +29,12 @@ SmartScript-2
          
      Exercise Point-based SmartScript-3 --- Example Tool -
      -     Exercise Point-based -SmartScript-4 -- Making and Accessing Soundings
      -     Modes -
           Answers to Point-based Exercises

      -
      @@ -50,12 +42,12 @@ Exercises Prior to the introduction of Numeric Python, Smart Tools were Point-based i.e. the "execute" method of the tool was called for each point of the -grid.  Point-based tools are much slower than their Numeric -counterparts.  +grid. Point-based tools are much slower than their Numeric +counterparts. However, for backward compatibility, Point-based tools are still -supported.  -In some cases, they are easier to write since  if-then-else logic -can be used for assigning values instead of "where" statements.  +supported. +In some cases, they are easier to write since if-then-else logic +can be used for assigning values instead of "where" statements. This section discusses the differences between Point-based and Numeric Smart Tools and contains exercises to illustrate how to write Point-based @@ -63,14 +55,13 @@ tools.

      Point-based Arguments

      The arguments to point-based tools differ slightly from those to numeric -tools.  The differences are listed below: +tools. The differences are listed below:
      • <weName> -- the value for one point of the given weather -element.  +element. Weather element values are as follows:

        • Scalar value: floating point value,
        • Vector value: two-tuple of magnitude and direction, for example:
        • @@ -129,7 +120,7 @@ tools.

          Reserved Methods

          Some methods have reserved names and meanings. To understand the -framework,  +framework, recall that a Point-based Smart Tool may operate over a time range which may include multiple grids. The mandatory "execute" method is called @@ -163,7 +154,8 @@ current QPF value multiplied by 10.
        -
      1. Select New... on the Button-3 popup over the Smart Tools window. +
      2. Select GFE -> Define SmartTools. The Localization perspective will open + with the SmartTools folder selected. Select MB3 and click New. The New Tool Dialog appears into which you will enter:
      3. @@ -220,7 +212,7 @@ tool, you need only one argument (in addition to "self"): QPF.
      4. Remove the sample arguments from the "execute" definition, leave the "self" -argument, and enter the argument, QPF in the parentheses.  When +argument, and enter the argument, QPF in the parentheses. When the tool executes, this argument will contain a Numeric Array representing the Fcst QPF grid.
      5. @@ -255,7 +247,7 @@ value based on temperature values. Use the following table:
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      -

       

      +

      @@ -304,7 +296,7 @@ for this example. changes. You will need the corresponding T grid, so add this as an argument to your -method. Modify the Python code with if-elif-else statments to implement +method. Modify the Python code with if-elif-else statements to implement the Temperature-based table.
    • Save the file. You can try your Tool without closing the editor or @@ -313,7 +305,7 @@ the GFE. The changes are effective as soon as you Save. Verify that the tool worked by Sampling the SnowAmt and QPF grid values.
    • -
       Click here for Answer +

      Exercise Point-based-3 -- Using VariableLists

      @@ -326,11 +318,10 @@ Remember to include "varDict" in your argument list to get the value for the user's variable. You will also need to access the variable, Topo.
      -
       Click here for Answer to +
      Click here for Answer to Exercise Point-based-3.

      Working with Point-based Weather

      The Wx parameter is passed to Tools in a string format @@ -428,7 +419,6 @@ LAL = 1                 return LAL

      To look for a particular Coverage or Type in a Wx string @@ -520,19 +510,16 @@ return PoP are used.
        -
      1. Select Button-3-->Modify over the PoP_SmartTool. Select OK to -see -the Python -module for the tool.
      2. +
      3. In Localization Perspective, drill down to the SITE or USER level of the PoP_SmartTool + and select Button-3-->Open over the PoP_SmartTool.
      4. Examine the code to see the WxContains method in use.
      5. In the EditAction Dialog, Select Windows --> Windows --> -Utilities.  +Utilities. Select Button-3-->Modify over WxMethods.
      6. Look at the documentation for the WxContains method.
      7. -
      8. Select Button-3-->Modify over the Wx_SmartTool.py and examine -the -code -to see the WxString method in use.
      9. +
      10. In Localization Perspective, drill down to the SITE or USER level of the Wx_SmartTool + and select Button-3-->Open over the Wx_SmartTool.py and examine +the code to see the WxString method in use.
      11. Look at the documentation for the WxString method in WxMethods.
      12. Finally, read the documentation for the WxModify.
      13. Close the Python Editor windows.
      14. @@ -545,17 +532,17 @@ In this exercise, we will access grid values directly from the Smart Tool instead of from the argument list.
          -
        1. In the EditAction Dialog, Select Windows --> Windows --> -Utilities.  -Select MB-3-->View over SmartScript.
        2. +
        3. In Localization Perspective, select +Utilities. +Drill down to BASE level and select MB-3-->Open over SmartScript.
        4. Find the method, "getValue" and read the documentation.
        5. Return to the Smart Tools Window and create a new smart tool which edits -QPF.  Access both the current QPF value and the  most -recent  +QPF. Access both the current QPF value and the most +recent D2D NAM12 tp (total precipitation) value directly using the "getValue" -method.  +method. If the current QPF value is zero, assign the tp value to it. Otherwise, return it as is.
        6. Run and test your tool to make sure it works.
        7. @@ -566,7 +553,7 @@ SmartScript-1. Accessing Variable Grids Directly Often, you will want to choose the model you want to work with at -run-time.  +run-time. You can use a variable list to get the model and then access the grids directly.
            @@ -578,128 +565,36 @@ from which to get the "tp" value.
          Click here for Answer to Exercise Point-based SmartScript-2. -

          Exercise Point-based SmartScript-3 -- Example -Tool

          -The above examples were fairly simple to illustrate the -framework.  -In this exercise, we'll examine and run a Smart Tool which is more -meaningful.  -It accesses various model grids to determine a PoP value. -
            -
          1. Make a PoP grid active on the GFE.Install the PoP_From_Model tool -from -the release/examples/smartTools directory.
          2. -
          3. Examine this tool, the grids it accesses, and the algorithm it -uses to -calculate PoP.  Notice two more SmartScript methods it -utilizes:  -"getMeanValue" and "MagDirToUV."
          4. -
          5. Run the tool with various models and geopotential heights for -Rh.  -Compare results.
          6. -

          -Exercise Point-based SmartScript-4 -- Making and +Exercise Point-based SmartScript-3 -- Making and Accessing Soundings

          The Smart Script class has the capability to create a sounding and get -a value from the sounding based on a given elevation.  In this +a value from the sounding based on a given elevation. In this exercise, -we will create a sounding from model data  and Topo information to +we will create a sounding from model data and Topo information to determine the surface temperature.
          1. In the SmartScript class, find the method, -"getSoundingValue".  +"getSoundingValue". Read the documentation to learn how to call this method.
          2. Find the Unit Conversion methods section and examine the methods available.
          3. -
          4. Create a new smart tool which edits T.   Allow the user +
          5. Create a new smart tool which edits T. Allow the user to set -the D2D model using a VariableList.  Get the value from a sounding -made from the D2D model grids using the Topo information.  You +the D2D model using a VariableList. Get the value from a sounding +made from the D2D model grids using the Topo information. You will have to convert Topo from feet to meters and temperature from K to F.
          6. Run and test your tool to make sure it works.
          -Click here for Answer to Exercise Point-based -SmartScript-4. -

          Modes

          -The Edit Action Modes cascade (from Main Menu-->GFE) allows us to -choose -whether to actually change the data when running an Edit Action or to -simply -view discrepancies found in the data. Both operations can be done -simultaneously, -as well.NOTE: These modes apply to point-based tools only! -
            -
          1. From the Main Menu --> GFE, select Edit Action Modes... To -tear off -the -menu, click over the dotted line. To keep the Modes menu on top of the -GFE, press button-3 over the title bar, and select Set Stacking --> -On -Top.
          2. -
          3. You will see the following Check buttons:
          4. -
              -
            • Edit Grid Values -- If on, the grids will be edited when Edit -Actions -are -performed.
            • -
            • Calculate Discrepancy Edit Area -- When executing the Edit -Action, an -edit -area will be created showing where values would have been changed more -than the current Discrepancy value, which can be set from the Edit -Action -Dialog. A Status Bar message will report the name of the Discrepancy -Edit -Area created which will be listed in the Define Edit Area Dialog under -the "Discrepancy" group. It will be named using a sequence number, the -element, and time of generation. The sequence number will re-cycle back -to zero after 25 grids are created. The general form is:
            • -
              -  -

               

























              -

              DseqNo_element_hour_day_month_year

              -

              For example:

              -

              D0_T_10_24_12_2001

              -
            • Calculate Discrepancy Grid -- When executing an Edit Action, a -grid will -be produced showing the scalar difference between the existing values -and -the tool results. This grid will appear in the GridManager for viewing. -NOTE: This feature is not yet implemented.
            • -
            -
          +Click here for Answer to Exercise Point-based +SmartScript-3. +
          +
          +

          Answers to Point-based Exercises

          @@ -905,8 +800,8 @@ return qpf
           

          -

          Answer to Exercise Point-based -SmartScript-4

          +

          Answer to Exercise Point-based +SmartScript-3

          import SmartScript

          VariableList = [("Model:" , "", "D2D_model")]

          @@ -953,8 +848,5 @@ self.convertKtoF(T_K)
                  return T_F

          -  -

          +

          diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsBaseline.html b/cave/com.raytheon.viz.gfe/help/SmartToolsBaseline.html index 0ce0e8cdda..55cfaaf03c 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsBaseline.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsBaseline.html @@ -171,19 +171,158 @@ used to make any cyclonic wind field.
      Check -MinT, MaxT, T and Td to ensure inter-element integrity.  Checks T +MinT, MaxT, T and Td to ensure inter-element integrity. Checks T against MinT and maxT and checks Td against T.
      ModelBlend
      +
      Combine model grids and forecast + grids in simple averages, nudging toward a model solution, or in complex weighted averages + or extrapolations.
      +
      CopyFromModel
      +
      Numeric tool that copies a + grid from a specified model - only in the active edit area - and possibly time-shifting the + model data.
      +
      Adjust
      +
      Performs basic math functions + like add, subtract, multiply and divide on a grid. Allows options related to elevation + and edit areas. You can combine these options in a variety of ways.
      +
      Enhanced_Wx
      +
      An enhancement to the original + Wx_SmartTool. Both tools assign Wx based on the corresponding PoP grids, but Enhanced_Wx has + some additional functionality.
      +
      LimitValues
      +
      Clips grid values + at limits that you specify.
      +
      RemoveWx
      +
      Allows removal of + "pieces" of weather from complex combinations of weather.
      +
      ERQCcheck
      +
      Allows the user to cross + check elements against one another to assure consistency. Where inconsistencies are found, + the forecaster has the option to either just see where the inconsistencies are, or have + one element or the other forced so that they are consistent. It also includes a routine + that check for the existence of grids required for NDFD.
      +
      Extrapolate
      +
      Allows to linearly + extrapolate features in time.
      +
      Align_Grids
      +
      Aligns the time breaks + of selected weather elements to match the time breaks of the individual grids of a + "source" element.
      +
      Populate_SkyProcedure
      +
      Populates the GFE Sky_Cover + grids based on an algorithm that finds the maximum model-layer relative humidity (RH), + and then applies an exponential relationship to convert RH to sky cover at each grid point.
      +
      Collaborate_PoP_SnowAmt_QPF
      +
      Creates fixed 12-hour PoP + (PoP12hr), 6-hour SnowAmt (SnowAmt6hr), and 6-hour QPF (QPF6hr) grids based on the values + contained in the floating PoP, SnowAmt, and QPF grids. These new grids may then be used + for the purposes of intersite coordination as well as web graphic generation.
      +
      NDFD_QPF_Checks
      +
      Performs checks to ensure + the five NDFD QPF related parameter consistency requirements are met.
      +
      CarSnowAmt
      +
      Uses upper level temperatures, + vertical motion, and relative humidity to calculate a snowratio.
      +


      -

       Back To Top +

      Back To TOC
      -  -

      +

      diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsCreatingandModifyingTools.html b/cave/com.raytheon.viz.gfe/help/SmartToolsCreatingandModifyingTools.html index df5ed4f91b..99e7cd2e10 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsCreatingandModifyingTools.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsCreatingandModifyingTools.html @@ -8,7 +8,6 @@

      Edit Action Button-3 Pop-Up Menu
      Creating A New Tool
      Description of Tool Arguments
      -Modifying A Tool
      Description of VariableList
      Additional Smart Tool Methods
      Creating a Smart Tool from an @@ -39,29 +38,28 @@ tool, sets up information to be passed to it, and calls it to obtain revised grid values.


      -  -
      +


      In the following sections, we will see how to create and modify tools and procedures through the Edit Action Dialog. We will demonstrate the use of the Smart -
      Tool Framework and Smart Script Library through a set of exercises -and tutorials.   The following sections assume that you have -knowledge of Python and its Numerical Python extension which are +and tutorials. The following sections assume that you have +knowledge of Python and its Numpy extension which are covered in the
      GFESuite Python Tutorial and Programming Guidelines.


      Edit Action Button 3 Pop-up Menu

      -
      Pressing MB3 over each of the Smart Tools listed in -the -Edit Actions Dialog opens a pop-up menu. This menu is described in the -Editable -Listbox description.
      +
      In AWIPS1, the Edit Actions dialog was used to access +new tool creation functionality. Pressing MB3 over each of the Smart Tools +listed in the Edit Actions Dialog opens a pop-up menu. +This menu is described in the Editable +Listbox description. However, in AWIPS2, new tools are created via the +Localization Perspective. This perspective will open when you select +GFE -> Define Smart Tools from the Menu bar.

      Creating a New Tool

              Exercise @@ -81,9 +79,8 @@ current QPF value multiplied by 10.

        -
      1. Select New... on the MB3 popup over the Smart Tools window. The -New -Tool +
      2. Select New... on the MB3 popup over the Smart Tools folder. The +New Tool Dialog appears into which you will enter:
        @@ -108,7 +102,7 @@ for your Tool.
      1. There are lines to specify that this is a "numeric" type tool and to import -the Numeric library.
      2. +the numpy library.
      3. Another line specifies the WeatherElementEdited. This may be changed if you ever wish to modify the element edited by the tool.
      4. @@ -142,7 +136,7 @@ tool, you need only one argument (in addition to "self"): QPF.
      5. Remove the sample arguments from the "execute" definition, leave the "self" -argument, and enter the argument, QPF in the parentheses.  When +argument, and enter the argument, QPF in the parentheses. When the tool executes, this argument will contain a Numeric Array representing the Fcst QPF grid.
      6. @@ -162,17 +156,16 @@ executing your tool, a dialog will appear to help you locate the problem. After successfully executing the tool, the QPF grid appears. Examine the -data by sampling the QPF values and the SnowAmt values.  If your +data by sampling the QPF values and the SnowAmt values. If your results seem confusing, check to see that the QPF and SnowAmt grids are aligned -in the Grid Manager.  If not, you will be getting time averaged +in the Grid Manager. If not, you will be getting time averaged QPF values over multiple grids.
      7. Close the Python Editor. Select File-->Close.
      - +

      Description of Tool Arguments

      Here is a complete description of the various @@ -183,19 +176,16 @@ argument, simply list it between the parentheses in the method definition. For example:
          def execute(self, QPF, Topo, -SnowAmt_DeltaValue,  +SnowAmt_DeltaValue, FzLevel, varDict):
      • <weName> -- the value for a given weather -element. If you want to -base +element. If you want to base the new value for an element on its current one, you must include it in -the argument list. You may also include other weather elements.  A +the argument list. You may also include other weather elements. A Numeric Array representing the grid values for the weather element is -returned. -Weather element values are as follows:
      • +returned. Weather element values are as follows:
        • Scalar value: floating point values,
        • Vector value: two-tuple of magnitude and direction numeric @@ -203,7 +193,7 @@ arrays, for example:

        •    mag = Wind[0]
          -   dir = Wind[1]
        • Weather value:  A Wx argument +   dir = Wind[1]
        • Weather value: A Wx argument represents a 2-tuple:
          • wxValues : numerical grid of byte values
          • @@ -214,7 +204,7 @@ to the byte value in the wxValues grid.
        @@ -235,19 +225,19 @@ gets MaxT from the March 29 12Z NAM12 run created by GFE initialization.
               MaxT_SFC_BOU_D2D_NAM12_Mar2912  -:  gets MaxT from the March 29 12Z original NAM12 run from D2D.

        +:  gets MaxT from the March 29 12Z original NAM12 run from D2D.

        If you omit the "modeltime", the most recent model run will be selected. For example:

               MaxT_SFC_BOU__NAM12  :              -gets MaxT from the most recent NAM run created by GFE initialization.
        +gets MaxT from the most recent NAM run created by GFE initialization.
               MaxT_SFC_BOU_D2D_NAM12 :   -gets MaxT from the most recent original NAM12 run from D2D.
        +gets MaxT from the most recent original NAM12 run from D2D.
               rh_MB300_BOU_D2D_GFS40 :    -gets rh from the most recent original GFS40 run from D2D.

        +gets rh from the most recent original GFS40 run from D2D.

        For a list of D2D elements and descriptions click here.

        @@ -274,12 +264,12 @@ encountered.

        methods of accessing grids in your Smart Tool, see the section below on the Smart -Script Class Library.  In this library you will find more +Script Class Library. In this library you will find more sophisticated -processing.  For example, if you are not satisfied with a +processing. For example, if you are not satisfied with a time-weighted average of grids over a time range, you can get a sum, max/min or even -the actual grid values themselves.  Or, if you do not know ahead +the actual grid values themselves. Or, if you do not know ahead of time which model you will want to access, you can create a call at execution @@ -310,7 +300,6 @@ the given element grid being modified. Example:
        def execute(self, GridTimeRange):
            gridStartTime = GridTimeRange.startTime()
            hour = gridStartTime.hour()
        @@ -325,139 +314,23 @@ basic methods:

      •     GridTimeRange.endTime()
      •     GridTimeRange.duration() # In seconds
      -


      -The start and end times are AbsTime objects with the following methods: +

      +The start and end times are TimeRange objects.

      -
        -
      •     absTime.hour()
      • -
      •     absTime.day()
      • -
      •     absTime.month()
      • -
      •     absTime.year()
      • -
      -


      +

      Here's an example of creating your own time range relative to the given GridTimeRange:

      def execute(self, GridTimeRange):
      -   import AFPS
      +   import TimeRange
         start = GridTimeRange.startTime()
         end = GridTimeRange.endTime()
      -   timeRange2 = AFPS.TimeRange(start - 24 *3600, end - 24 +   timeRange2 = TimeRange.TimeRange(start - 24 *3600, end - 24 *3600)

         T0 = self.getGrids("Fcst", "T","SFC", timeRange2, noDataError=0)
         if T0 is None:
      -      self.noData()

      -
    • <weName>_MaxGrid -- a numeric array  -of maximum values for the -element over the GridTimeRange
    • -
    • <weName>_MinGrid -- a numeric array of -minimum values for the -elementover -the GridTimeRange
    • -
    • <weName>_SumGrid -- a numeric array of the -sum of values for the -element -over the GridTimeRange
    • -
    • varDict -- a dictionary of variables and values. -The variables and -values -are defined in the VariableList (See below VariableList - section.)
    • -
    • <weName>_GridInfo -- Information about the -weather element grid -including -such things as the time range, the units, the max and min limits, -identifying -information, and grid location. For example:
    • -
      -  -
      def execute(self, MaxT, MaxT_GridInfo):
      -       timeRange = -MaxT_GridInfo.gridTime() -

             #  The start and end -times -are of a class, "AbsTime"
      -       #  which has many useful -methods:
      -       startTime = timeRange.startTime()
      -       year = startTime.year()
      -       month = startTime.month()
      -       day = startTime.day()
      -       hour = startTime.hour()
      -       minute = startTime.minute()
      -       textString = startTime.string()
      -       endTime = timeRange.endTime()

      -

             units = MaxT_GridInfo.units() -
      -       maxLimit = -MaxT_GridInfo.maxLimit()
      -       minLimit = -MaxT_GridInfo.minLimit()

      -

      If there are multiple corresponding grids, a list of gridInfo -objects -will be returned.

      -
    • <weName>_GridHistory -- Information about -the history of the weather -element grid including such things as the time range, the units, the -max -and min limits, identifying information, and grid location. GridHistory -is a list of update events for the grid.  For example:
    • -
      -  -
      def execute(self, PoP, PoP_GridHistory:
      -        print "History", -PoP_GridHistory
      -        for history in -PoP_GridHistory:
      -            -print "\nHistory:"
      -            -print " origin:         ", -history.origin()
      -            -print " originParm:     ", history.originParm()
      -            -print " originTimeRange:", history.originTimeRange()
      -            -print " timeModified:   ", history.timeModified()
      -            -print " whoModified:    ", history.whoModified()
      -            -print " updateTime:     ", history.updateTime()
      -            -print " publishTime:    ", history.publishTime() -

      Results:

      -

          History:
      -         -origin:          -0
      -         -originParm:      -PoP_SFC:BOU_GRID__NAM40_20020326_1200
      -         originTimeRange: (Mar -28 02 07:00:00 GMT, Mar 28 02 10:00:00 GMT)
      -         -timeModified:    -Mar 27 02 23:48:43 GMT
      -         -whoModified:     -423250825:hansen:gfe:32577:0
      -         -updateTime:      -Mar 26 02 17:45:17 GMT
      -         -publishTime:     -Jan 01 70 00:00:00 GMT

      -

      Origin is defined as follows:
      -        enum OriginType {INITIALIZED -= 0, TIME_INTERPOLATED = 1,  SCRATCH = 2, CALCULATED = 3, OTHER = -4};

      -

      If there are multiple corresponding grids, a list of gridHistory -objects -will be returned.

      -
    +      self.noData()
    +

    NOTE: Values supplied to the tool are initial values only i.e. the values of the variables at the beginning of Smart Tool execution. @@ -465,21 +338,14 @@ Changes made by the Smart Tool will not be reflected in the values of the variables passed to the tool.

    -

    Modifying a Tool

    -

    Exercise -Tool-2 -- Modifying a Tool
    -

    -
    The following Exercise will show you how to modify an -existing tool.
    -

    Exercise Tool-2 -- Modifying a Tool

    Modify your SnowAmt_LearningTool to base its new -value  +value on temperature values. Use the following table:
    -

     

    +

    @@ -517,7 +383,7 @@ on temperature values. Use the following table:
      -
    1. Select Modify... on the MB3 popup over the SnowAmt_LearningTool. +
    2. Select Open... on the MB3 popup over the SnowAmt_LearningTool at USER level (drill-down). This opens the Python Editor in which you can make changes.
    3. @@ -534,7 +400,7 @@ the GFE. The changes are effective as soon as you Save. Verify that the tool worked by Sampling the SnowAmt and QPF grid values.
    -
     Click here for Answer +

    Description of VariableList

    @@ -550,13 +416,12 @@ resides in the Python file for the Tool. (Make sure it appears before or after the Tool Class, not within it!) These variables will be solicited from the user prior to executing the Tool.
    -
     
    For example, suppose we want to let the user set threshold values prior to executing our tool named MyTool. Then in the Python module for MyTool, we list:
    -
      +

    VariableList = [
                @@ -623,55 +488,11 @@ height for the dialog must be given.  For example: ("", 500, "scrollbar")
    will add a scrollbar to the dialog and set the dialog -height to 500 pixels.  Only one scrollbar entry is processed per +height to 500 pixels. Only one scrollbar entry is processed per VariableList dialog.
-
    -
  1. To see how these are used, we will examine the -Convective_SmartTool -which -can be found in the examples/smartTools directory of your -release.  -If does not appear in the Edit Actions Dialog when Wx is the active -element, -install it following the instructions in the section Creating -a Smart Tool from an Existing File.
  2. -
  3. Examine the VariableList to see how the variables are defined and -accessed.
  4. -
  5. Notice that we have defined two radio button variables ("Edit -Coverage -or Uncertainty" and "Thunder Y/N") . We have defined the default values -("Coverage" and "Y") for each one and then listed the possible values.
  6. -
-
-
        -VariableList -= [
-
                -("Edit Coverage or Uncertainty" , "Coverage", "radio",
-
                        -["Coverage","Uncertainty"]),
-
                -("Thunder Y/N" , "Y", "radio", ["Y","N"]),
-
            -]
-
    -
  1. Now examine how we access the variable value from -the varDict. The name -"Edit Coverage or Uncertainty" must match the above VariableList -exactly.
  2. -
-
            -coverage = varDict["Edit Coverage or Uncertainty"]
-
            -thunder = varDict["Thunder Y/N"]
-
    -
  1. Run the tool to see how the VariableList is -displayed.
  2. -
  3. Close the Python Editor.
  4. -

Exercise Tool-3 -- Using VariableLists

@@ -684,7 +505,7 @@ Remember to include "varDict" in your argument list to get the value for the user's variable. You will also need to access the variable, Topo. -

Click here for Answer to Exercise Tool-3.

+

Click here for Answer to Exercise Tool-3.


Creating VariableLists @@ -702,7 +523,7 @@ how this might be done:
      ScreenList = ["SCALAR"]
-      from Numeric import * +      from numpy import *

      import ProcessVariableList
@@ -806,8 +627,7 @@ after all grids are processed. Additional methods, "preProcessGrid" and "postProcessGrid" are reserved -for Point-based Tools.   Of -course, +for Point-based Tools. Of course, reserved methods will be called only if you supply them in your tool. They are included as comments in the Smart Tool template that appears when @@ -820,10 +640,8 @@ methods will vary according to the logic of when they are called. You may write your own methods and call them from within others. The only tricky part is in using the funny "self" variable. Here's an example: -
-  +

import SmartScript
-
 
class Tool (SmartScript.SmartScript):
   def __init__(self, dbss):
      @@ -873,7 +691,7 @@ the argument list.

Naming Conventions

To help distinguish the source of methods and variables, Smart Tools (and -Procedures)  follow these naming conventions: +Procedures) follow these naming conventions:
  • User-defined Smart Tool and Procedure methods and variables, which need to span multiple methods, are preceeded by an underscore: e.g @@ -896,15 +714,15 @@ by giving your method or variable a duplicate name.

    Creating a Smart Tool from an Existing File

    -
    Suppose you have an existing smart tool  -file.   +
    Suppose you have an existing smart tool +file. You might receive a file from a repository, from a colleague, or find one in the examples directories of your release. How can you add it to your Edit Action Dialog?
      -
    1. From the Edit Action Dialog Smart Tool Window,  Select MB3 +
    2. From the Localization Perspective Smart Tool folder, Select MB3 --> New...
    3. Enter the name of the Tool and the weather element it modifies.
    4. @@ -940,7 +758,6 @@ SmartScript-8 -- Working with Weather and Discrete
      Exercise SmartScript-9 -- Translating between Smart Initialization and Smart Tools -


    5. Run and test your tool to make sure it works.
    -Click here for Answer to Exercise SmartScript-1. +Click here for Answer to Exercise SmartScript-1.

    Exercise SmartScript-2 -- Accessing Variable Grids @@ -1039,42 +856,41 @@ from which to get the "tp" value.

  • -Click here for Answer to Exercise SmartScript-2. +Click here for Answer to Exercise SmartScript-2.

    Exercise SmartScript-3 -- Making and Accessing Soundings

    -The SmartScript library allows you to make a sounding of Numerical -Python +The SmartScript library allows you to make a sounding of numpy grids. The method, "makeNumericSounding" returns two numerical "cubes" -- one cube for the gh height values for a given set of levels and one cube for the weather parameter values. In this exercise, we will create -a sounding from model data  and use Topo information to determine -the surface temperature.  You will use the "makeNumericSounding" +a sounding from model data and use Topo information to determine +the surface temperature. You will use the "makeNumericSounding" method to get gh and t numerical cubes. You will then have to "walk up" the cubes assigning values directly from the t weather parameter at ground -height.  -For a more information, see  GFESuite Python Tutorial -- Looking Up the Columns of a Cube.
    1. In the SmartScript class, find the method, "makeNumericSounding".  + href="SmartScriptClass.html#makeNumericSounding">makeNumericSounding". Read the documentation to learn how to call this method.
    2. Find the Unit Conversion methods section and examine the methods available.
    3. -
    4. Create a new smart tool which edits T.   Allow the user +
    5. Create a new smart tool which edits T. Allow the user to set -the D2D model using a VariableList.  Assign values from the +the D2D model using a VariableList. Assign values from the sounding -made from the D2D model grids using the Topo information.  You +made from the D2D model grids using the Topo information. You will have to convert Topo from feet to meters and temperature from K to F.
    6. Run and test your tool to make sure it works.
    -Click here for Answer to Exercise SmartScript-3. +Click here for Answer to Exercise SmartScript-3.

    Exercise SmartScript-4 -- @@ -1084,34 +900,17 @@ Soundings

    logical statements, rewrite the tool from Exercise SmartScript-3 and simplify the -"where" statement by using some logical statements.  For more +"where" statement by using some logical statements. For more information, -see the discussion of Simple and Compound statements in   +see the discussion of Simple and Compound statements in + GFESuite Python Tutorial and Programming Guidelines -- Style Suggestions. -

    Click here for Answer to Exercise SmartScript-4.

    - -
    -

    Exercise SmartScript-5 -- -Making and Accessing -Soundings

    -
    Suppose we want to use an interpolated (or -extrapolated) -value for the T value. You can use the SmartScript methods "interpolateScalarValues" -and "extrapolate" -within -"where" statements to do this. In the case the first level, we will -need -to extrapolate instead of interpolate.  Rewrite the tool from -Exercise -SmartScript-4 to handle this. -

    Click here for Answer to Exercise SmartScript-5.

    +

    Click here for Answer to Exercise SmartScript-4.


    -

    Exercise SmartScript-6 -- +

    Exercise SmartScript-5 -- Creating Elements "On-the-Fly"

    It is now possible to create "temporary" weather elements from a Smart Tool and add grids to them. These elements appear in the GridManager @@ -1120,7 +919,6 @@ cannot be saved. So if you unload them or shut down the GFE, they are gone. They can be accessed by subsequent Smart Tools.
    Suppose we want to create a temporary RH element from T an Td. Look at the documentation for the SmartScript method, "createGrid." @@ -1148,14 +946,14 @@ level. For example:

         RH = self.getGrids("TempModel","TempRH", "SFC",GridTimeRange)

    -

    Click here for Answer to Exercise SmartScript-6. +

    Click here for Answer to Exercise SmartScript-5.


    -

    Exercise SmartScript-7 -- +

    Exercise SmartScript-6 -- Working with Weather/Discrete

    Weather and Discrete are similar to each other. They -both are represented as  a 2-tuple:
    +both are represented as a 2-tuple:

    -

    Exercise SmartScript-9 -- +

    Exercise SmartScript-8 -- Translating Between Smart Initialization and Smart Tools

    -To see the correlation between Smart Initialization and Smart Tools, -find -the "calcFreeWind" method in "NAM12.py" and compare to -examples/smartTools/FreeWind_Init.py. -For the most part, the code is similar. However, the Smart Tool had to -access the sounding cubes through the "getNumericSounding" method. It -was -also enhanced to extrapolate and interpolate, but the original Smart -Initialization -code (commented out) works as well. In general, when going between +Overview of the correlation between Smart Initialization and Smart Tools. +For the most part, the code is similar. However, the Smart Tools have +access the sounding cubes through the "getNumericSounding" method. Smart Tools are +also enhanced to extrapolate and interpolate, but the Smart +Initialization code works as well. In general, when going between Smart Initialization and Smart Tools, follow these tips:
      diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsExecutingSmartTools.html b/cave/com.raytheon.viz.gfe/help/SmartToolsExecutingSmartTools.html index bc9a131e90..2bcc2f6be0 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsExecutingSmartTools.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsExecutingSmartTools.html @@ -15,7 +15,7 @@ steps:
    • Set the Weather Element you wish to modify "Editable" by clicking MB2 over -it on the Legend or MB1 in the Grid Manager.  Note that the Edit +it on the Legend or MB1 in the Grid Manager. Note that the Edit Action Dialog displays only the tools which can operate on the "Editable" Weather @@ -48,9 +48,8 @@ case the dialog will disappear as the tool executes).
    • As the Smart Tool executes, you will see its progress indicated on the -Progress -Bar located on the bottom right of the GFE window. -
        +Progress Bar located on the bottom right of the GFE window. +

      If you are unclear at all about Step 1 or Step 2, we strongly recommend that you review those sections of this document. It is very important @@ -59,7 +58,7 @@ you understand how to identify the specific grids and the area you wish to modify before executing any Smart Tool. Without this understanding it is very easy to modify grids in ways you do not intend.
      -
        +

      The following exercises take you through the execution of Smart Tools in the context of two forecasting scenarios. The exercises are @@ -77,17 +76,15 @@ to perform an instruction.
      Convective Scenario
      The following diagram shows the forecast situation which -is addressed in the Convective Scenario.   If the -"Convective_SmartTool"  -does not appear in the list of Edit Actions, follow the instructions in -the section Creating a Smart Tool from an Existing -File -to install it from the examples/smartTools directory of your release. +is addressed in the Convective Scenario. If the +"Convective_SmartTool" +does not appear in the list of Edit Actions, please contact your ITO +for help converting it to AWIPS2 from the AWIPS1 examples/smartTools +directory.

      Follow the instructions below to see how Smart Tools might be -applied -in this kind of situation. +applied in this kind of situation.

      +

      diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsExerciseAnswers.html b/cave/com.raytheon.viz.gfe/help/SmartToolsExerciseAnswers.html index 518ac3261f..bb7521977b 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsExerciseAnswers.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsExerciseAnswers.html @@ -7,7 +7,7 @@
      ToolType = "numeric"
      WeatherElementEdited = "SnowAmt"
      -
      from Numeric import *
      +
      from numpy import *
      import SmartScript
      class Tool (SmartScript.SmartScript):
          def __init__(self, dbss):
      @@ -34,7 +34,7 @@ SnowAmt

      WeatherElementEdited = "SnowAmt"
      -from Numeric import * +from numpy import *
      import SmartScript

      class Tool (SmartScript.SmartScript): @@ -71,7 +71,7 @@ QPF * 10))
      WeatherElementEdited = "SnowAmt"
      -from Numeric import * +from numpy import *
      import SmartScript

      VariableList = [ @@ -117,7 +117,7 @@ elevation), 0, SnowAmt)
              return SnowAmt

      +

      @@ -132,7 +132,7 @@ SmartScript-1
      WeatherElementEdited = "QPF"
      -from Numeric import * +from numpy import *
      import SmartScript

      class Tool (SmartScript.SmartScript): @@ -174,7 +174,7 @@ tp, qpf)
      WeatherElementEdited = "QPF"
      -from Numeric import * +from numpy import *
      import SmartScript

      VariableList = [("Model:" , "", "model")] @@ -209,7 +209,6 @@ tp, qpf)
              return qpf

      Answer to Exercise SmartScript-3

      @@ -220,7 +219,7 @@ SmartScript-3
      WeatherElementEdited = "T"
      -from Numeric import * +from numpy import *
      import SmartScript

      VariableList = [("Model:" , "", "D2D_model")] @@ -314,7 +313,6 @@ T)

              return T_F

      Answer to Exercise SmartScript-4

      @@ -325,7 +323,7 @@ SmartScript-4
      WeatherElementEdited = "T"
      -from Numeric import * +from numpy import *
      import SmartScript

      VariableList = [("Model:" , "", "D2D_model")] @@ -426,150 +424,14 @@ T = where(readyToSet, t_Cube[i], T)

              return T_F

      Answer to Exercise SmartScript-5

      -
      - -
      -
      ToolType = "numeric" -
      -WeatherElementEdited = "T" -
      -from Numeric import * -
      -import SmartScript -

      VariableList = [("Model:" , "", "D2D_model")] -
      -class Tool (SmartScript.SmartScript): -
      -    def __init__(self, dbss): -
      -        -SmartScript.SmartScript.__init__(self, -dbss) -

      -

          def execute(self, GridTimeRange, Topo, varDict): -
      -        "This tool accesses QPF -and tp  grids directly" -

      -

              model = varDict["Model:"] -

      -

              # Convert Topo to meters -
      -        topo_M = -self.convertFtToM(Topo) -

      -

              # Make a sounding cubes -for -T -
      -        # Height will increase in -the sounding and be the -
      -        # first dimension -
      -        levels = -["MB1000","MB950","MB900","MB850","MB800", -
      -        -"MB750","MB700","MB650","MB600"] -
      -        gh_Cube, t_Cube = -self.makeNumericSounding( -
      -             -model, "t", levels, GridTimeRange) -

      -

              print "Cube shapes ", -gh_Cube.shape, -t_Cube.shape -

      -

              # Make an initial T grid -with values of -200 -
      -        # This is an out-of-range -value to help us identify values that -
      -        # have already been set. -
      -        T = (Topo * 0) - 200 -

      -

              # Work "upward" in the -cubes -to assign T -
      -        # We will only set the value -once, i.e. the first time the -
      -       # gh height is greater than the -Topo -
      -        # For each level -
      -        for i in -xrange(gh_Cube.shape[0]): -
      -                -# where ( gh > topo and T == -200 ), -
      -                -#       set to t_Cube value, otherwise -keep -value already set)) -
      -                -notSet = equal(T, -200) -
      -                -aboveGround = greater(gh_Cube[i], topo_M) -
      -                -readyToSet = logical_and(notSet, aboveGround) -
      -                -try: -
      -                    -# Interpolate between levels -
      -                    -T = where(readyToSet, -
      -                                -self.interpolateScalarValues(topo_M,(gh_Cube[i-1],t_Cube[i-1]),(gh_Cube[i],t_Cube[i])), -T) -
      -                -except: -
      -                    -# Handle first level by extrapolating -
      -                    -T = where(readyToSet, -
      -                                -self.extrapolate(topo_M,(gh_Cube[0],t_Cube[0]),(gh_Cube[1],t_Cube[1])), -T) -

      -

              # Convert from K to F -
      -        T_F = self.convertKtoF(T) -

      -

              return T_F -
      -  -

      -

      Answer to Exercise -SmartScript-6

      ToolType = "numeric"
      WeatherElementEdited = "None"
      -from Numeric import * +from numpy import *

      ScreenList = ["T","Td"]

      import SmartScript @@ -616,14 +478,13 @@ timeConstraints=(0, 3600,3600), minAllowedValue = 0.0,
                maxAllowedValue = 100.0, units="%")

      -

      Answer to Exercise SmartScript-7

      +

      Answer to Exercise SmartScript-6

      ToolType = "numeric"
      WeatherElementEdited = "Wx"
      -from Numeric import * +from numpy import *

      import SmartScript

      class Tool (SmartScript.SmartScript): @@ -669,12 +530,12 @@ where(greater_equal(PoP,

              return (wxValues, keys)

      -

      Answer to Exercise SmartScript-8

      +

      Answer to Exercise SmartScript-7

      ToolType = "numeric"
      WeatherElementEdited = "PoP"
      -from Numeric import * +from numpy import *

      import SmartScript

      class Tool (SmartScript.SmartScript): @@ -794,7 +655,6 @@ CO_Boulder

      **Revised Procedure-1  (does not use variableElement)

      MenuItems = ["Edit"]
      ToolList = [
      diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsProcedures.html b/cave/com.raytheon.viz.gfe/help/SmartToolsProcedures.html index ff919166da..799992c333 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsProcedures.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsProcedures.html @@ -55,13 +55,13 @@ Using procedures you can:

      Executing Procedures

      Procedures can be set up to appear under various menu -items on the GFE Main Menu.  Keep in mind that you can make a +items on the GFE Main Menu. Keep in mind that you can make a procedure that can take several minutes to complete, particularly if it includes a lot of interpolation.
        -
      1. Try executing the QPF_SnowAmt Procedure which appears under  +
      2. Try executing the QPF_SnowAmt Procedure which appears under Main Menu --> Edit and runs the QPF_SmartTool followed by the SnowAmt_SmartTool.
      3. @@ -80,17 +80,17 @@ possibility would be to run the Assign_Value tool followed by the Smooth tool.
        -
      1. Choose Main Menu-->Populate-->Define Procedures. From the +
      2. Choose Main Menu-->GFE-->Define Procedures. From the MB3 -Pop-up in -the Procedures Window, choose New....
      3. +Pop-up on +the Procedures folder, choose New....
      4. Enter a Name for your Procedure.
      5. Select OK. A Python Editor window will appear with the Procedure template.
      6. The MenuItems list defines the GFE menu item(s) under which the Procedure is to appear. Possible items are: Populate, Edit, Consistency, -Verify, and Hazards.  +Verify, and Hazards. Set up the MenuItems list, perhaps listing "Edit" as the item under which you want your procedure to appear.
      7. @@ -114,9 +114,8 @@ procedure is run. Procedures can be simple or extremely powerful because of the availability of the Smart Script Class library. (See -the section describing this library ) -

        Click here for Answer to Exercise Procedure-1. -

        +the section describing this library) +

        Answer to Procedure Exercise 1

        Exercise Procedure-2 -- Using the SmartScript Library from a Procedure

        @@ -124,10 +123,10 @@ from a Procedure "procedure-type" commands which allow you to copy data from models, create grids from scratch -and perform interpolattion,  as well as methods for calling Smart -Tools.  In this exercise, we'll create a Procedure to call some of +and perform interpolation, as well as methods for calling Smart +Tools. In this exercise, we'll create a Procedure to call some of these commands. -
      8. Study the SmartScript Libary commands: 
      9. Study the SmartScript Libary commands: copyCmd, createFromScratchCmd, getDatabase, @@ -153,29 +152,28 @@ hours),
      10. Create 1-hour T grids every 3 hours over the new time range,
      11. Run the Smart Tool from Exercise SmartScript-4 over the new time range, -interpolating for missing data by setting the  Missing -Data Mode.  Pass the varDict from the Procedure to the Smart +Data Mode. Pass the varDict from the Procedure to the Smart Tool in the "callSmartTool" command so that the VariableList dialog does not appear twice. For this to work, make sure that the VariableList model field has the same name as that in the Smart Tool.
    -
  • Run and test your Procedure to make sure it works.   +
  • Run and test your Procedure to make sure it works. Note that the Procedure could take some time to execute since the Smart Tool is being -called over a time range of grids.  You can notice the progress of -execution in the Progress Bar. -Also, if you are running the GFE from a terminal window, you will see -status -messages appear in the window.
  • +called over a time range of grids. You can notice the progress of +execution in the progress bar at the bottom right of the display. +Also, if you are running the GFE from a terminal window with a -console +argument, you will see status messages appear in the window. +

    Answer to Procedure Exercise 2

    -Click here for Answer to Exercise Procedure-2. -
     
    +

    Exercise Procedure-3 -- Running Procedures in the @@ -189,12 +187,13 @@ command.
  • Run your the procedure of Exercise Procedure-1 from the command line using -the "runProcedure" command.  Note you will need to specify an edit -area and a time range.  Also, since you will be running the +the "runProcedure" command. Note you will need to specify an edit +area and a time range. Also, since you will be running the Procedure -outside the context of the GFE,  you will have to reference +outside the context of the GFE, you will have to reference specific weather elements instead of "variableElement" in your ToolList.
  • +

    Answer to Procedure Exercise 3

    -Click here for Answer to Exercise Procedure-3. + diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsSmartTools.html b/cave/com.raytheon.viz.gfe/help/SmartToolsSmartTools.html index 143b1b1149..7643ae9081 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsSmartTools.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsSmartTools.html @@ -11,7 +11,6 @@

    Smart Tools

    -
    Smart Tools are Edit Actions that you create. These tools allow you to write an equation that modifies forecast grids in a diff --git a/cave/com.raytheon.viz.gfe/help/SmartToolsUtilities.html b/cave/com.raytheon.viz.gfe/help/SmartToolsUtilities.html index 1939a03c04..c9adddb943 100644 --- a/cave/com.raytheon.viz.gfe/help/SmartToolsUtilities.html +++ b/cave/com.raytheon.viz.gfe/help/SmartToolsUtilities.html @@ -7,39 +7,26 @@ Among Smart Tools and Procedures
    - -

    Utilities

    Edit Action Windows

    -
    So far, we have worked with the Smart Tool Window of -the Edit Action Dialog. We will look at the other window that can be -opened.
    +
    So far, we have modified Smart Tools and Procedures. +We will look at Utilities.
      -
    1. From the Edit Action Dialog, choose Windows-->Show All Windows.
    2. +
    3. From the Localization perspective, choose GFE-->Utilities.
    -
    You will see two windows:
    -
      -
    • Smart Tool Window -- Contains tools for editing -grids.
    • -
    • Utilities Window -- Any kind of Edit Action may -be included here as -well -as general  utilities that may be shared by your Smart Tools and -Procedures.  You will see some utilities listed including the SmartScript library which -you can view from the MB3 popup over the window.You can add Python +you can view from the MB3 popup over the window. You can add Python modules here which might contain methods you wish to share among the Smart Tools and Procedures you've created.
    -The Smart Tools window only contains Tools;  the Utilities window -only contain Utilities. 
    +
    @@ -48,53 +35,40 @@ Utility to Share Among Smart Tools and Procedures
    Suppose that you would like to create your own library -methods to share among your smart tools and procedures.  In this +methods to share among your smart tools and procedures. In this exercise, we will create a Utility that can be imported and accessed from any Smart Tool or Procedure.
      -
    1. From the Edit Action Dialog Utility Window, select -MB3-->New.  -Choose -Kind:  Utility.
    2. +
    3. In Localization perspective under the GFE section, + on the Utility folder, select MB3-->New.
    4. Name your Utility and select OK.
    5. -
    6. A Python window will appear.  Enter some utility method +
    7. A Python window will appear. Enter some utility method within the -utility class.  For example, you could simply copy the +utility class. For example, you could simply copy the "convertFtToM" -method from the SmartScript module.  To follow the naming -conventions, preceed the name of your method with an -underscore.  +method from the SmartScript module. To follow the naming +conventions, precede the name of your method with an +underscore. For example, _convertFtToM.
    8. Now, modify your Smart Tool from the previous Exercise to call -this -method.  +this method. To do this, you must do several things:

      • First, at the beginning of your Smart Tool, insert the statement:

                       import MyUtility

                 where "MyUtility" -is the name of your Utility.

      +is the name of your Utility.

      • Create an instance of your Utility as follows:

      • -  -

         



            class Tool (SmartScript.SmartScript):
                def __init__(self, dbss):
                    @@ -107,13 +81,9 @@ self._myUtility = MyUtility.MyUtility(self._dbss, self.eaMgr())
         

      • Next, call your method as follows:

                  T_F = self._myUtility._convertFtToM(T_K)
       
    9. Run and test your tool to make sure it works.
    -Click here for Answer to Exercise Utility-1.
    -
      -

    Answers to Exercises

    -
    \ No newline at end of file +Click here for Answer to Exercise Utility-1.
    diff --git a/cave/com.raytheon.viz.gfe/help/SpatialEditorDialogs.html b/cave/com.raytheon.viz.gfe/help/SpatialEditorDialogs.html index d9f0595613..3d3a3fa0b3 100644 --- a/cave/com.raytheon.viz.gfe/help/SpatialEditorDialogs.html +++ b/cave/com.raytheon.viz.gfe/help/SpatialEditorDialogs.html @@ -26,24 +26,21 @@ The following dialogs are involked from the Spatial Editor: The Display Attributes Dialog allows the user to choose the type of visualization that is used when the editor is in "image" mode and "graphic" -mode.  -You can never turn off the "Image" display for the "image" mode.  +mode. +You can never turn off the "Image" display for the "image" mode. The dialog is sensitive to the current editor, and the current -mode.  +mode. It will only display those options that are available at that -time.  +time. Note that you must always select 1 image while in image mode, and at least 1 graphic, while in graphic mode. -


    -  +


    -


    Fuzz Value Dialog

    -The Fuzz Value Dialog is opened from the Edit Actions Dialog.  It -allows you to set the value used when definingHomogeneous Edit Areas.

    Type in the fuzz value and click OK or use the slider to set the @@ -55,34 +52,33 @@ dialog.

    -
      +

    -
    +


    Color Table Editor

    The Color Table Editor allows the user to create new and modify existing color enhancement curves for various scalar and vector weather -elements.  For details on how to use the color table editor, see +elements. For details on how to use the color table editor, see the Color Table Editor Dialog documentation.

    -Color Table Editor
    +Color Table Editor



    Color Chooser

    The Color Chooser allows the user to change the "graphic color" for -weather elements.  For details on how to use the color chooser, +weather elements. For details on how to use the color chooser, see the Color Chooser Dialog documentation.

    + src="images/ColorChooser.jpg">

    -
     Back To Top
    +
    Back To Top
    diff --git a/cave/com.raytheon.viz.gfe/help/StatusBar.html b/cave/com.raytheon.viz.gfe/help/StatusBar.html index 3ec6381d14..08f572d35e 100644 --- a/cave/com.raytheon.viz.gfe/help/StatusBar.html +++ b/cave/com.raytheon.viz.gfe/help/StatusBar.html @@ -5,66 +5,49 @@ content="text/html; charset=iso-8859-1"> - 0.0.1 StatusBar + AlertViz Monitor

    -GFE Status Bar

    -January 27, 2009
    +AlertViz +February 17, 2012


    -The Status Bar appears at the bottom of the GFE display. It contains +AlertViz is a separate component of AWIPS2 that is shared among all the +perspectives, including GFE. It contains two -complete status bars, each with a message indicator light and message -display.  -At the right side of the two status bars is an indicator for ISC send -enabling, a progress bar, and the -current -time. When a new message is displayed, the appropriate message light -will -blink. Messages are color-coded (set up in the gfe configuration file) +complete status bars, each with a log list and a message +display. Messages are color-coded (set up in the AlertViz configuration file) and of the following categories:
    • Regular: Successful completion of an operation. (default color: green)
    • Significant: An error message usually indicating an operation cannot be -completed. (default color: yellow)  When a Significant message -occurs, the Significant Messages Dialog will +completed (default color: yellow). When a Significant message +occurs, the Significant Messages Dialog will appear.
    • Urgent: A serious error usually indicating a server or system -problem. -(default color: red) When an Urgent message occurs, the Urgent Messages Dialog will appear.
    • -
    • Alert: A warning to the forecaster of an event  (default +
    • Alert: A warning to the forecaster of an event (default color: orange).
    -To acknowledge a Regular or Alert message and stop the blinking, -click MB1 over the message which will change to gray. -
    -To view a list of previous messages, click on the ^ sign to the left +To acknowledge an Alert popup message, click MB1 over the message +"Acknowledge Last" button which will close the message dialog. +To view a list of previous messages, click on the notepad icon to the right of the Status message. The View Messages -Dialog will appear.
    -
    -The ISC Send Enabling indicator looks like a red traffic light, when -ISC data will not be sent from this GFE, and looks like a green traffic -light, when ISC will be sent from the GFE.  The user can control -the overall ISC send enable through the Consistency->ISC Send Enable -menu entry.  The traffic light is red, to denote no ISC traffic -will be sent, if the ifpServer ISC configuration is -disabled.   If enabled, then ISC data will be sent either on -saving, publishing, or manually sending the grids via the Send -Intersite Coordination dialog.
    +Dialog will appear. Aleternately you can click the "Show Log" button.

    Most of the status messages will appear in the left status -bar.  -The right status bar is reserved for incoming ISC traffic and +bar. +The right status bar is reserved for incoming ISC traffic and Smart Init model arrival messages.

    -


    +



    Urgent Messages @@ -72,11 +55,12 @@ Dialog

    The Urgent Messages Dialog appears with a red message bar. Multiple messages may be active in the Dialog and each must be acknowledged by clicking -"Acknowledge." +"Acknowledge Last". You can acknowledge all the active messages by clicking "Acknowledge -All." +All". A history of all messages, including Urgent Messages, can be viewed in -the View Messages Dialog. +the View Messages Dialog, or by +clicking the "Show Log" button.

    Urgent Message


    Significant @@ -86,37 +70,31 @@ The Significant Messages Dialog appears with a yellow message bar. Multiple messages may be active in the Dialog and each must be acknowledged by clicking -"Acknowledge." +"Acknowledge Last". You can acknowledge all the active messages by clicking "Acknowledge -All." +All". A history of all messages, including Significant Messages, can be viewed in -the View Messages Dialog. -

    Significant

    +the View Messages Dialog, or by clicking the +"Show Log" button. +

    Significant


    View Messages Dialog

    -To view a history of status messages, click on the ^ to the left of the -Status Bar message. The View Messages Dialog will appear. The messages -are color-coded with the most recent listed first. You may scroll or -resize -the window to see all the messages. Click "Close" to close the dialog. -

    +To view a history of status messages, click on the notepad icon to the right of the +Status Bar message. The Log list Dialog will appear. The messages +are listed with level of significance displayed to the right of the time of the +message. The most recent message is listed at the bottom. +Click "Close" to close the dialog. +


    -

    Progress Bar

    -The Progress Bar is on the right-hand side of the Status Bar. It shows -the progress of a smart tool executing over multiple grids. For -point-based -smart tools, if the user clicks B3 over the Progress Bar, the smart -tool -execution will be interrupted.  In this case, the progress is -shown -per grid, so if you are running a point-based smart tool over multiple -grids, you will see the progress bar paint for each grid. -

    +

    Other

    +

    The "C" button causes the message log to be cleared from the display window, however +the messages are still present if the user clicks the notepad button.

    +

    The "i" button at the left side of the AlertViz monitor will display information +about the AlertViz monitor.


    diff --git a/cave/com.raytheon.viz.gfe/help/TCMWindTool.html b/cave/com.raytheon.viz.gfe/help/TCMWindTool.html index d0e20cb9e5..094b4d70bc 100644 --- a/cave/com.raytheon.viz.gfe/help/TCMWindTool.html +++ b/cave/com.raytheon.viz.gfe/help/TCMWindTool.html @@ -27,9 +27,7 @@ lang="en-US"> TCMWind Tool

    -Version 2.3

    -

    -July 6, 2005

    +March 9, 2012


    @@ -75,17 +73,7 @@ a GFE yellow banner.

    TCMWind tool user interface
    -

    -

    -
    -

    -

    -
    -

    -

    -
    + name="Graphic1" align="left">


    @@ -210,7 +198,7 @@ the elevation is greater than zero (above sea level). Note that the scale range is from -20% to +50%. Negative values will increase the wind magnitude by that amount over areas above sea level.


    +
    Make Grid over Selected Time Only

    Selecting “Yes†for this option will produce grids only over a @@ -221,7 +209,18 @@ the same effect as selecting “Noâ€. If you have a time range selected and select “Yes†to “Make Grid Over Selected Time Onlyâ€, but your selected time does not intersect the valid time of the TCM bulletin, a yellow banner will display informing you that you -selected a time outside the time period defined in the bulletin. +selected a time outside the time period defined in the bulletin.

    +MakeWind Swath for TCWindThreat?
    +
    +This option is for use only by those offices that are part of Tropical +Impact Graphics experiment. This option, using the detailed wind radii info +provided calculates a swath of maximum wind for each grid point that incorporates +the specified land friction. This creates a TCMMaxWindComposite object that +gets stored in the server. When the office runs the TCWindThreat tool as part of the tropical +impact grids/graphics, that object is available as one of two options for use as the +deterministic WindMax source. In the context of the TCWindThreat tool, the WindMax +source created by the TCMWindTools would be named TCM. The downside to running +TCMWindTool with this option is that it will take 5 to 6 extra minutes to run.

    The Algorithm

    The algorithm used to calculate the wind field is roughly a Rankine vortex. Wind values at specified radii are defined in the TCM bulletin. @@ -235,19 +234,6 @@ quadrant of Hurricane Irene (17 Oct 1999) is shown in Figure 2 below.
    name="Graphic2" style="border: 0px solid ; width: 516px; height: 537px;" align="left">

    -

    -
    -

    -


    -

    -


    -

    -


    -


    @@ -332,10 +318,5 @@ lead time.


    -


    -

    -

    -
    -

    diff --git a/cave/com.raytheon.viz.gfe/help/TemporalEditorDialogs.html b/cave/com.raytheon.viz.gfe/help/TemporalEditorDialogs.html index 5a8d8d6ceb..9e94fafbc1 100644 --- a/cave/com.raytheon.viz.gfe/help/TemporalEditorDialogs.html +++ b/cave/com.raytheon.viz.gfe/help/TemporalEditorDialogs.html @@ -11,7 +11,7 @@

    Temporal Editor Dialogs


    -May 14, 2004
    +February 14, 2012

  • @@ -33,8 +33,7 @@ Weather Element Dialog The Move Weather Element Dialog provides the capability of moving a weather element from one temporal pane to another temporal pane. -

    +



    Temporal @@ -46,17 +45,16 @@ you selected: Image Visual Type or Graphic Visual Type.

    You can change the settings of any of the attributes listed in the dialog -and click OK.  To close the dialog without +and click OK. To close the dialog without
    making any changes, simply click Cancel.

    -

    +


    Set Weather Dialog

    The set weather dialog is used to define a new weather value, and then -set the data in the temporal editor to that value.  Pressing the +set the data in the temporal editor to that value. Pressing the "SET" button will set the current pickup value for the Wx parm and will also change the data. @@ -71,7 +69,7 @@ PickUpValue dialog that is used for the spatial editor.

    Set Discrete Value Dialog

    The set discrete value dialog is used to define a new discrete value, and -then set the data in the temporal editor to that value.  Pressing +then set the data in the temporal editor to that value. Pressing the "SET" button will set the current pickup value for the discrete parm and will also change the data. @@ -79,9 +77,9 @@ and will also change the data. href="ButtonBarDialogs.html#DiscretePickUpValueDialog">Discrete PickUpValue dialog that is used for the spatial editor.

    -

    Set Discrete Dialog 
    +

    Set Discrete Dialog


    -
     Back To Top
    +
    Back To Top
    diff --git a/cave/com.raytheon.viz.gfe/help/TextFormatter.html b/cave/com.raytheon.viz.gfe/help/TextFormatter.html index 3e6caf76ae..e08d1dcf53 100644 --- a/cave/com.raytheon.viz.gfe/help/TextFormatter.html +++ b/cave/com.raytheon.viz.gfe/help/TextFormatter.html @@ -61,12 +61,10 @@ exercises. Text Formatter Project Presentation at the -FSL Technical Review for GFESuite, September 2003. +FSL Technical Review for GFESuite, September 2003 (updated for AWIPS2). -


    -

    diff --git a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.JPG b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.JPG index a92c1a94e1..628f6ff748 100644 Binary files a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.JPG and b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.JPG differ diff --git a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.html b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.html index 5ec2e880cc..38b94dbeb4 100644 --- a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.html +++ b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide20.html @@ -11,6 +11,6 @@

    20. Product set-up - Set-up Generic Edit Areas


    Previous Slide Next Slide

    -

    Log in as a new user for setting up products. When you are satisfied with a product, you will want to move it to the SITE directory. Create the designated generic edit areas. Some of the core products set-up initially to run with these edit areas as the default
    +

    Log in for setting up products. When you are satisfied with a product, you will want to move it to the SITE directory. Create the designated generic edit areas. Some of the core products set-up initially to run with these edit areas as the default
    diff --git a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide23.JPG b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide23.JPG index 9ec1fa9edd..22b1f76c0d 100644 Binary files a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide23.JPG and b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide23.JPG differ diff --git a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide24.JPG b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide24.JPG index 098361ebc6..1e5b5add56 100644 Binary files a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide24.JPG and b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide24.JPG differ diff --git a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide5.html b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide5.html index b8b3bb015f..cc4ebf1015 100644 --- a/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide5.html +++ b/cave/com.raytheon.viz.gfe/help/TextProductUserGuide/Slide5.html @@ -11,6 +11,6 @@

    5. Introduction - Concepts


    Previous Slide Next Slide

    -

    The GFESuite supports the creation of text products in both tabular and narrative forms. The Local Formatters delivered with the release are considered "templates" in that they meet the NWS directives for the standard core products. You will want to customize them to your local site's requirements. The wording of the narrative products is not considered to be of extremely high quality, but can be characterized as accurate and "good enough." Also, as they become more widely used, we expect to identify bugs and important enhancements. Since the products are written in Python, these can be easily patched into the existing formatters. The infrastructure upon which these products are built consists of C++ and Python modules and provides the framework upon which new local products can be created.
    +

    The GFESuite supports the creation of text products in both tabular and narrative forms. The Local Formatters delivered with the release are considered "templates" in that they meet the NWS directives for the standard core products. You will want to customize them to your local site's requirements. The wording of the narrative products is not considered to be of extremely high quality, but can be characterized as accurate and "good enough." Also, as they become more widely used, we expect to identify bugs and important enhancements. Since the products are written in Python, these can be easily patched into the existing formatters. The infrastructure upon which these products are built consisted of C++ and Python modules in AWIPS1; Java and Python modules in AWIPS2 and provides the framework upon which new local products can be created.
    diff --git a/cave/com.raytheon.viz.gfe/help/TextReference.html b/cave/com.raytheon.viz.gfe/help/TextReference.html index 7e7807c393..d541da4dc0 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReference.html +++ b/cave/com.raytheon.viz.gfe/help/TextReference.html @@ -11,12 +11,10 @@

    -

    Text Products Reference -Guide

    +

    Text Products Reference Guide

    Table of Contents

    Introduction
    -Upgrades and Backward Compatibility
    Product Set-up and Customization
    Infrastructure Reference
    FAQ's
    @@ -27,5 +25,4 @@ Guide Exercises
    Answers to Quiz Questions
    Answers to Exercises
    -Evolution of GFESuite Text Products -- Policy and Project Overview

    - +

    \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceAnswers_to_Exercises.html b/cave/com.raytheon.viz.gfe/help/TextReferenceAnswers_to_Exercises.html index 5311c6fabb..5e889e8672 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceAnswers_to_Exercises.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceAnswers_to_Exercises.html @@ -10,12 +10,8 @@

    Answers to Exercises

    -
    - - -

    Answer to Simple Tabular Product Exercise 1

    ########################################################################
    @@ -239,8 +235,8 @@ thresholds, and methods
    ##
    ##########################################################################
    import SmartElementTable
    -import string, time, re, os, types, copy, AFPS
    -
    +import string, time, re, os, types, copy
    +import TimeRange
    class TextProduct(SmartElementTable.TextProduct):
        Definition = copy.deepcopy(SmartElementTable.TextProduct.Definition)
    @@ -365,7 +361,8 @@ to
    #
    # ---------------------------------------------------------------------

    -import string, time, re, os, types, copy, AFPS
    +import string, time, re, os, types, copy
    +import TimeRange
    import TextRules

    #**********************************************************************
    @@ -666,7 +663,8 @@ to
    #
    # ---------------------------------------------------------------------

    -import string, time, re, os, types, copy, AFPS
    +import string, time, re, os, types, copy
    +import TimeRange
    import TextRules

    #**********************************************************************
    @@ -946,7 +944,8 @@ to
    #
    # ---------------------------------------------------------------------

    -import string, time, re, os, types, copy, AFPS
    +import string, time, re, os, types, copy
    +import TimeRange
    import TextRules

    #**********************************************************************
    @@ -1130,7 +1129,8 @@ to
    #
    # ---------------------------------------------------------------------

    -import string, time, re, os, types, copy, AFPS
    +import string, time, re, os, types, copy
    +import TimeRange
    import TextRules

    #**********************************************************************
    diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceAnswerstoQuizQuestions.html b/cave/com.raytheon.viz.gfe/help/TextReferenceAnswerstoQuizQuestions.html index cb364b8d67..51dbecddc0 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceAnswerstoQuizQuestions.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceAnswerstoQuizQuestions.html @@ -11,17 +11,15 @@

    Answers to Quiz Questions

    -
    - +

    Text Product User Guide -- PART 1

    1. What are the three main steps that the system performs to produce -a test product?    Sampling the data, Analyzing the +a test product? Sampling the data, Analyzing the data, creating text from Text Rules.
    2. -
    3. Where do you find a list of available text products?   Quick-Start Product Set -Up Guide.
    4. +
    5. Where do you find a list of available text products? Quick Start Product Setup.
    6. Where do I find information about a text product such as a description, weather elements needed, edit areas required? In the Documentation section of the Standard file for the product.
    7. @@ -35,7 +33,7 @@ error message, you may find it listed in the TroubleShooting section.  Whenever you get stuck, you can post a help message to the listserver.
    8. Where can I find information about simple settings and options -available for a text product?  In the Documentation section of the +available for a text product? In the Documentation section of the Standard file for the product.
    9. Given that the Infrastructure classes are read-only, how can I make my product behave differently from the baseline? By overriding @@ -44,7 +42,7 @@ thresholds and variables in your Overrides file.
    10. Text Product User Guide -- PART 2

      1. How are the weather elements and phrases for a narrative product -defined? Where can I find this information?  Through Product +defined? Where can I find this information? Through Product Component Definitions found in the Standard file for each product.
      2. What do we mean when we say the narrative phrases are "Analysis-Driven"? By changing the analysis in the Product Component @@ -53,38 +51,38 @@ Definition, we can change the character of the narrative phrases.
      3. weather element to affect the phrasing? Change the analysis method and change the temporal resolution of the analysis.
      4. Where can learn about the various analysis methods available? In -the Sample Analysis +the Sample Analysis Reference section.
      5. How would you change the text of the ZFP so weather would appear -after sky and before the max/min temp?   Change the order of -the phrase methods in the "phraseList" of  the Product Component.
      6. +after sky and before the max/min temp? Change the order of +the phrase methods in the "phraseList" of the Product Component.
      7. How do I locate the thresholds and variables that I will need to -customize my product?  Find the phrase in the Product Component -"phraseList" and look it up in the Narrative +customize my product? Find the phrase in the Product Component +"phraseList" and look it up in the Narrative Phrases -Reference.  The thresholds and variables that affect that +Reference. The thresholds and variables that affect that phrase will be listed there with an indication of the module(s) to search to find them.
      8. Where do I find information about setting up Local Effects? In -the Local +the Local Effects section.
      9. Suppose I want to learn more about the phrases in the first -period of my ZFP product.  How do I locate the Product Component +period of my ZFP product. How do I locate the Product Component definition for that period? Find the "_issuance_list" in the Standard -file for your product.  Study the Narrative Definition to see the +file for your product. Study the Narrative Definition to see the layout of Product Components for different issuances.
      10. What do I do if my Headlines are not showing up in the product? -Check the "allowedHazards" list in the +Check the "allowedHazards" list in the Standard file for your product and make sure it is listed there. If not, override the -"allowedHazards" list in your Overrides +"allowedHazards" list in your Overrides file and add it.
      11. Where can I find information regarding trouble-shooting tips and -strategies?  In the Trouble-shooting +strategies?  In the Trouble-shooting section.
      12. What information should I include when submitting a help request -to the  listserver?     IFPS Version -number,  Product, Description of problem, entire error message(s), +to the listserver? AWIPS Build Version +number, Product, Description of problem, entire error message(s), Overrides file.
      diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceExercises.html b/cave/com.raytheon.viz.gfe/help/TextReferenceExercises.html index f822260bc3..27396e8846 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceExercises.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceExercises.html @@ -98,16 +98,10 @@ Exercise 3: "Phrase Anatomy"
            Phrase Exercise 4: "Creating a New Narrative Product"
      -
      - NOTE: For these exercises, you will be working with the -ZFP_<site>_Overrides file -which you can activate according to the Quick-Start -Product Set -Up instructions.
      -For these Exercises, use the Fcst database instead of Official. +ZFP_<site>_Overrides file. For these Exercises, use the Fcst database instead of Official.

      Thresholds and Variables Exercises

      Thresholds @@ -118,11 +112,12 @@ the Wx grid and a 10 percent PoP value.  Be sure and Save your grids to the Fcst database.
    11. Run the ZFP using the Fcst database and notice that no weather is reported.
    12. -
    13. Open the ZFP_<site>_Overrides file using MB3-->Modify.
    14. +
    15. Open the ZFP_<site>_Overrides file using the Localization perspective to + modify Text Products.
    16. Open the WxPhrases class in the Text Utilities Window of the -Define Text Products Dialog using MB3-->New. Locate the "pop_wx_lower_threshold" -method and copy and paste it into your Overrides file.  Now change +method and copy and paste it into your Overrides file. Now change the default value of 20 percent to 10.
    17. Re-run the ZFP and verify that rain showers are now reported.
    18. @@ -130,23 +125,22 @@ percent to 10. Thresholds Exercise 2: "Working with the temporalCoverage_percentage"
        -
      1. Open the SampleAnalysis class using MB3-->View in the Text -Utilities window.
      2. +
      3. Open the SampleAnalysis class using Localization perspective and browsing to the Text +Utilities folder.
      4. Find the "temporalCoverage_percentage" method. Copy it into the ZFP_<site>_Overrides file at the end.
      5. Create a HeatIndex grid that covers the first 2 hours of the -first period over which the ZFP will run.  Set the value for this +first period over which the ZFP will run. Set the value for this grid to 110 degrees.
      6. Create a HeatIndex grid that covers the last 10 hours of the -first period over which the ZFP will run.   Copy the MaxT +first period over which the ZFP will run. Copy the MaxT grid into this HeatIndex grid.
      7. -
      8. Save your data and run the ZFP.  Note inclusion of the +
      9. Save your data and run the ZFP. Note inclusion of the HeatIndex phrase. Even though the HeatIndex grid does not cover 20 percent of the 12-hour time period, it is included since the ENTIRE -grid -falls within the 12-hour time period.
      10. +grid falls within the 12-hour time period.
      11. Now extend the first HeatIndex grid into the prior period by 2 hours and run the ZFP again. Note that HeatIndex is not reported since the first HeatIndex grid does not cover 20 percent of the 12-hour time @@ -159,31 +153,25 @@ since we lowered the threshold for grid inclusion.
      12. Thresholds Exercise 3: "Working with a Non-linear Threshold"
          -
        1. Locate the Locate the "minimum_range_nlValue_dict" method within the ZFP_<site>_Overrides file.
        2. Set-up a non-linear dictionary for the minimum range so that -values below 40 mph will have a range of 5 mphand those above will have +values below 40 mph will have a range of 5 mph and those above will have a range of 10 mph.
        3. Set up a Wind grid with values between 45 and 65 mph and verify that the phrasing is in 10 mph ranges when you run the ZFP.
        4. Set up a Wind grid with values between 15 and 35 mph and verify that the phrasing is in 5 mph ranges when you run the ZFP.
        -For more information on non-linear thresholds, see the section: Non-Linear -Thresholds.

        Thresholds Exercise 4: "Basing a Threshold on the Current Edit Area"

          -
        1. Use the "currentAreaContains" method to return different Use the "currentAreaContains" method to return different "pop_wx_lower_threshold" values depending on the current edit area.
        2. Run the ZFP to verify that your override works as intended.
        3. -
        4. (For an example, see the section on Arguments to -Narrative Methods.)

        Product Component Exercises

        @@ -193,25 +181,23 @@ Exercise 1: "Working with Analysis-Driven Wind Phrasing"
      13. Copy the entire"Period_1" Product Component method from the AreaFcst standard file into the ZFP_<site>_Overrides file.
      14. Make sure you have significant and variable Winds in the first -period for the edit areas over which the ZFP will run.  They +period for the edit areas over which the ZFP will run. They should be above 5 knots and include minimum and maximum values that range over -at least 25 knots.  They should also vary every 3 hours.
      15. +at least 25 knots. They should also vary every 3 hours.
      16. Run the ZFP and make note of the Wind phrase that results for the first period of each edit area.
      17. Change the "Wind" analysis method from "vectorMedianRange" to "vectorAvg" and run the product again. Did the phrases change?
      18. Change the "Wind" analysis method to "vectorModeratedMinMax" and -run the product again.  Did the phrases change?
      19. +run the product again. Did the phrases change?
      20. Override the "moderated_dict" (from the SampleAnalysis class) in -your ZFP_<site>_Overrides file.  Modify its values for Wind, -re-run the -product and notice any phrase changes that result.
      21. +your ZFP_<site>_Overrides file. Modify its values for Wind, +re-run the product and notice any phrase changes that result.
      22. Change the temporal resolution for the Wind analysis from 6 hours -to 3 hours and run the product again.  To do this, change the [6] -specification to [3] in the "Wind" analysisList entry.  How did -the -phrases change?
      23. +to 3 hours and run the product again. To do this, change the [6] +specification to [3] in the "Wind" analysisList entry. How did +the phrases change?
      Component Exercise 2: "Working with Analysis-Driven Weather Phrasing" @@ -220,15 +206,15 @@ Exercise 2: "Working with Analysis-Driven Weather Phrasing"
      ZFP_<site>_Overrides file (if it is not already there).
    19. Make sure you have significant weather in the Wx grids for the -first period for the edit areas over which the ZFP will run.  Make -at least 3 grids with varying weather conditions.  Make at least +first period for the edit areas over which the ZFP will run. Make +at least 3 grids with varying weather conditions. Make at least one grid which does not end on a 3-hour boundary e.g. ending at 2 pm local time.
    20. Make sure the PoP for the first period is above 20.
    21. Run the ZFP and make note of the Weather phrase that results for the first period of each edit area.
    22. Change the temporal resolution for the Wx analysis from 6 hours -to "[0]" (by grid).  Did the phrases change?
    23. +to "[0]" (by grid). Did the phrases change?
    24. Change the temporal resolution for the Wx analysis to 12 hours and notice the resulting phrase changes.
    @@ -238,13 +224,12 @@ Exercise 3: "Choosing an Alternate Phrase"
  • Copy the "Period_1" product Component Method into the ZFP_<site>_Overrides file (if it is not already there).
  • -
  • Run the ZFP and make note of the temporature phrases that result +
  • Run the ZFP and make note of the temperature phrases that result for the first period of each edit area.
  • -
  • Look up the "highs_range_phrase" and "lows_range_phrase" in the SCALAR WEATHER ELEMENT +
  • Look up the "highs_range_phrase" and "lows_range_phrase" in the SCALAR WEATHER ELEMENT phrase table.
  • -
  • Comment out the "highs_phrase"  and "lows_phrase" in the -"Period_1" component and uncomment the "highs_range_phrase" and +
  • Comment out the "highs_phrase" and "lows_phrase" in the +"Period_1" component and un-comment the "highs_range_phrase" and "lows_range_phrase".
  • Re-run the ZFP and notice the difference in the temperature phrases.
  • @@ -255,23 +240,19 @@ Exercise 4: "Customizing a Phrase"
  • Copy the "Period_1" product Component Method into the ZFP_<site>_Overrides file (if it is not already there).
  • -
  • Choose a phrase and look up its entry in the Narrative Phrases tables +
  • Choose a phrase and look up its entry in the Narrative Phrases tables under the appropriate Weather Element(s).
  • Examine the list of Thresholds and Variables that apply to this phrase.
  • -
  • Select several to override.  For each,
  • +
  • Select several to override. For each,
    • Find it in infrastructure class and copy it into your Overrides file,
    • -
    • Read any documenation comments included with the threshold or +
    • Read any documentation comments included with the threshold or variable method,
    • Modify its value,
    • Re-run the ZFP and notice any resulting phrase changes.
    -
  • If you would like to see an example of phrase customization, see Customizing a Narrative -Phrase.
  • Component Exercise 5: "Working with Basic Local Effects"

    @@ -279,10 +260,8 @@ Exercise 5: "Working with Basic Local Effects"
  • Copy the "Period_1" product Component Method into the ZFP_<site>_Overrides file (if it is not already there).
  • -
  • Set up a basic local effect for the wind_withGusts_phrase.  -If you need help with the steps or to see an example, refer to the Local -Effects section.
  • +
  • Set up a basic local effect for the wind_withGusts_phrase. +
  • Configurable Issuance Exercises

    @@ -290,17 +269,17 @@ Issuance Exercises Issuance Exercise 1: "Working with Configurable Issuance"
    1. Locate the "_10_503_issuance_list" in the AreaFcst standard -file.  Copy it into the ZFP_<site>_Overrides file (be sure +file. Copy it into the ZFP_<site>_Overrides file (be sure to copy the ENTIRE method!)
    2. Locate the "narrativeDefAM" list of components and comment out all except the "Period_1" entry.
    3. Run the ZFP for the "Morning" issuance and notice that you will -see only a Period 1 narrative.  This is a handy way limit the +see only a Period 1 narrative. This is a handy way limit the product output when you are trouble-shooting or developing an enhancement.
    4. -
    5. Locate the "Morning" label in the "return" statement list.  -Alter it and re-run the ZFP.  Notice the dialog that appears has a +
    6. Locate the "Morning" label in the "return" statement list. +Alter it and re-run the ZFP. Notice the dialog that appears has a new default label.
    7. For more information on the "issuance list" and it's entries, see the section: Narrative @@ -310,7 +289,7 @@ Definition and Configurable Issuance -- "def issuance_list"
    8. Headline Exercise 1: "Generating Headlines"

        -
      1. Create  a Hazards grid with a duration within the first +
      2. Create a Hazards grid with a duration within the first period to be covered by the ZFP.
      3. Set its value to "FL.W".
      4. Run the ZFP and note the headline that appears.
      5. @@ -331,26 +310,24 @@ included.

      Simple Tabular Products Exercises

      -

      Simple +

      Simple Tabular Products Exercise 1: "Creating a Weather Element by Area Table Product"

      Create a new Table Product. Your table should show QPF, PoP and Wind across the columns and a set of default Edit Areas down the rows. Do -not -ask the user to specify the Edit Areas at run time. Instead, set them -up -in the table definition. -

      Answer +not ask the user to specify the Edit Areas at run time. Instead, set them +up in the table definition. +

      Answer to Simple Tabular Product Exercise 1

      -

      Simple -Tabular Products Exercise 2:  "Creating an Area By Period Table +

      Simple +Tabular Products Exercise 2: "Creating an Area By Period Table Product"

      Create an "Area By Period" table to show Temperature for a set of Edit Areas at time period intervals. Let the user specify the Edit Areas and the time period interval at run time. Have the table generated beginning with the "Today" time range. -

      Answer +

      Answer to Simple Tabular Product Exercise 2

      Smart Tabular Product Exercises

      @@ -361,46 +338,46 @@ Product Template, we will study the SmartElementTable which can be found in the Define Text Products dialog IF you log on to the GFE as user GFETEST.  It consists of two files: SmartElementTable.py and -SmartElementTable_Local.py.   To activate the product, modify -the Overrides file and uncomment the "displayName". Make sure you have -defined edit areas named "area1", "area2", and "area3".  Run the +SmartElementTable_Local.py. To activate the product, modify +the Overrides file and un-comment the "displayName". Make sure you have +defined edit areas named "area1", "area2", and "area3". Run the product so see the results.

      Note the following in the standard SmartElementTable file:

      -
    9. VariableList:  This allows the user to choose -options at run-time.  In this case, the user will specifiy whether +
    10. VariableList: This allows the user to choose +options at run-time. In this case, the user will specifiy whether a morning or afternoon product is desired.
    11. -
    12. Definition:  This specifies the product type (smart), output -file, edit areas and a product-specific regionList.  The +
    13. Definition: This specifies the product type (smart), output +file, edit areas and a product-specific regionList. The regionList maps the edit areas to regions by which the product results are -grouped.  Note that the "displayName" is set to None.  This +grouped. Note that the "displayName" is set to None. This is -because this file serves only as a base.  The derived Overrides +because this file serves only as a base. The derived Overrides file will specify the "displayName."
    14. -
    15. TextProduct Class:  This inherits from TextRules and +
    16. TextProduct Class: This inherits from TextRules and SampleAnalysis classes.
    17. -
    18. generateForecast:  This part of the code is identical to the +
    19. generateForecast: This part of the code is identical to the Smart Text Product Template, following the same basic steps.
    20. _getAnalysisList: This method (called by _getVariables) returns an analysisList that specifies the statistics desired for each weather element.
    21. _getTimeRange: This method (called by _determineTimeRanges) is in -the TimeRangeUtils module.  Given the name of Time Range (defined +the TimeRangeUtils module. Given the name of Time Range (defined in the GFE by Select Time Range), it returns a TimeRange object.
    22. _getPeriods: This method (called by _determineTimeRanges) is in -the TimeRangeUtils module.  It returns a list of (timeRange, +the TimeRangeUtils module. It returns a list of (timeRange, label) tuples given a timeRange, period, span, and optional labelMethod or labelFormat.
    23. -
    24. _getSampler: This method  (called by _sampleData) is in the -Interfaces module.  It returns a HistoSampler object representing +
    25. _getSampler: This method (called by _sampleData) is in the +Interfaces module. It returns a HistoSampler object representing histograms from sampled data. The method is given an analysisList: -(weather element, method)  tuples, a timeRange list: (timeRange, +(weather element, method) tuples, a timeRange list: (timeRange, label) tuples, and an editArea list: (editArea, label) tuples.
    26. _getStatList: This method (called by _makeProduct) is in the Interfaces module. For each timeRange, it creates a statistics -dictionary for a given list of weather elements and an edit area.  +dictionary for a given list of weather elements and an edit area. The dictionaries are returned in a list which can then be used by the formatting methods to create the appropriate text strings.
    27. _getTempValues and _getPopValues: These methods (called by @@ -409,18 +386,18 @@ use a TableBuilder method, _getScalarValue, which, given a numeric value, returns a text string
    28. - Note the following about the local SmartElementTable_Local file: -
    29. import SmartElementTable:  This is necessary to +Note the following about the local SmartElementTable_Local file: +
    30. import SmartElementTable: This is necessary to have access to the standard class file.
    31. -
    32. Definition:  The Definition section is copied from the +
    33. Definition: The Definition section is copied from the standard file so that entries can be overriden to allow site-specific information such as output file and edit areas.
    34. -
    35. VariableList:  This is not repeated here, but could be if +
    36. VariableList: This is not repeated here, but could be if the local site wanted something different from the one in the standard file.
    37. -
    38. TextProduct Class:  Note that the local class inherits from +
    39. TextProduct Class: Note that the local class inherits from the standard class (SmartElementTable) thus having access to all its -methods as well as those in TextRules and SampleAnalysis.  +methods as well as those in TextRules and SampleAnalysis. Therefore, to override any inherited method, the local class simply provides its own "def" method.
    40. @@ -438,7 +415,7 @@ Temp, PoP, and Humidity in various orders.
    41. Smart Tabular Exercise 2: "Extending the SmartElementTable"

      Extend the SmartElementTable to have the capability of reporting -Wind.  You will have to: +Wind. You will have to:
      • Override and add to "_getAnalysisList"
      • Override and add to "_getTitleDict"
      • @@ -448,52 +425,45 @@ Wind.  You will have to:
      • Test your modifications by changing the "elementList" to include Wind.
      -Answer to Smart Tabular +Answer to Smart Tabular Exercise 2

      Smart Tabular Exercise 3: "Working with the FWFTable"

      To see a more sophisticated example of a Smart Table Product, we will -study the FWFTable.  The Standard andOverrides files are FWFTable, -FWFTable_<site>_Definition,  -and -FWFTable_<site>_Overrides, respectively.  Activate the -FWFTable by setting -it's "displayName" and Run the product. +study the FWFTable. The Standard andOverrides files are FWFTable, +FWFTable_<site>_Definition, and +FWFTable_<site>_Overrides, respectively. Activate the +FWFTable by setting it's "displayName" and Run the product.

      Note the use of the following inherited methods in the base FWFTable standard file:

    42. getCurrentTime: This method (called by -_preProcessProduct) is in the TimeDescriptor module.  It will -format the current time and return a text string.  For a -description of the possible format entries allowed, see the Time Display Formats section.
    43. +_preProcessProduct) is in the TimeDescriptor module. It will +format the current time and return a text string.
    44. getWeekDay: This method (called by _getLabel) is in the -TimeDescriptor module.  It is an all-purpose weekday labeling +TimeDescriptor module. It is an all-purpose weekday labeling method which takes a time range as input and returns a text string -label -(e.g. Today, Tonight, Monday, etc).  It can handle various +label (e.g. Today, Tonight, Monday, etc). It can handle various combinations of upper and lower case, punctuation and holidays.
    45. -
    46. makeRow: This method (called by _makeProduct)  is in the +
    47. makeRow: This method (called by _makeProduct) is in the TableBuilder module. It is a general-purpose method for adding a row to -a table.  Arguments include  a row label, a column width, a +a table. Arguments include: a row label, a column width, a statList and a formatting method with optional arguments.
    48. getStats: This method (called by the text formatting methods) is -in the Interfaces module.  Given a statDict and a weather element -name, it returns the corresponding statistics.   If no data -is -available for the element,  getStats returns "None".  This +in the Interfaces module. Given a statDict and a weather element +name, it returns the corresponding statistics. If no data +is available for the element, getStats returns "None". This should be tested in the text formatting method.
    49. generateProduct: This method (called by _makeProduct) is in the -Interfaces module.  It can be used to "glue" another text product -onto the current one.  (It is similar to the "callSmartTool" -command for Procedures.)  In this case, we are generating and +Interfaces module. It can be used to "glue" another text product +onto the current one. (It is similar to the "callSmartTool" +command for Procedures.) In this case, we are generating and Extended Narrative product onto the tabular portion of the -product.  Notice the the Narrative Definition and Product -Component -Definitions for the Extended Narrative are included in the FWFTable +product. Notice the the Narrative Definition and Product +Component Definitions for the Extended Narrative are included in the FWFTable standard file.
    50. Make the following modifications to the FWFTable_<site>_Overrides -file.  +file. Override portions of the FWFTable standard file if necessary. Make sure to comment changes that you make. Test each change as you go along:
    51. Rearrange the order of the rows of the table by @@ -504,64 +474,62 @@ header.
    52. print statement in your method to verify that it has successfully overridden the one in the Standard file.
    53. Notice that there is a "windAdjustmentFactor" in the Definition -section.  Wind reporting works as follows:  If there is a -Wind20ft grid available, that is used.  If not, the Wind grid +section. Wind reporting works as follows: If there is a +Wind20ft grid available, that is used. If not, the Wind grid values are used after multiplying by the "windAdjustmentFactor" which -has a default of .80.   First, remove any Wind20ft grids that -might be in the Today period.  Run the product so that the Wind -grid values are reported.  Note the Wind values for the Today -period.  Now change the "windAdjustmentFactor" and run the product -again.  Note the change in the reported Wind values.  -Finally, -create a Wind20ft grid in the Today period and assign values distinct -from that in the Wind grid.  Run the product again and verify that +has a default of .80. First, remove any Wind20ft grids that +might be in the Today period. Run the product so that the Wind +grid values are reported. Note the Wind values for the Today +period. Now change the "windAdjustmentFactor" and run the product +again. Note the change in the reported Wind values. +Finally, create a Wind20ft grid in the Today period and assign values distinct +from that in the Wind grid. Run the product again and verify that the Wind20ft values are now being reported.
    54. -Answer to Smart Tabular +Answer to Smart Tabular Exercise 3

      Smart Tabular Exercise 4: "Extending the FWFTable"

      -Add a new row to the FWFTable for WindGust.  Report a WindGust +Add a new row to the FWFTable for WindGust. Report a WindGust value only if the difference between the maximum WindGust and the maximum Wind value is greater than some configurable -threshold.    Use the "Wind20ft" weather element  +threshold. Use the "Wind20ft" weather element for Wind if available, otherwise, use and adjusted "Wind" weather -element value.  The adjusted value will simply be the Wind -magnitude multiplied by the "windAdjustmentFactor".  See if you -can -solve this problem without  reading any further.  If you get +element value. The adjusted value will simply be the Wind +magnitude multiplied by the "windAdjustmentFactor". See if you +can solve this problem without reading any further. If you get stuck, you can read on for some hints.
      • Add a new Definition entry, for example, -"gustWindDifferenceThreshold" and set it to a default value.  +"gustWindDifferenceThreshold" and set it to a default value. Remember that simply by adding this entry to the Definition, the variable, "self._gustWindDifferenceThreshold" will be available to be used in your product.
      • Override the "_getAnalysisList" method and add an entry for -"WindGust."  You will also have to add a entries for "Wind" and -"Wind20ft"  to check the maximum wind for comparison.
      • +"WindGust." You will also have to add a entries for "Wind" and +"Wind20ft" to check the maximum wind for comparison.
      • Add a new method, for example, "_windGust" that tests the difference between maximum Wind and maximum WindGust against the "GustWindDifferenceThreshold" and returns an appropriate string for the -WindGust row entry.  You will want to refer to the "_wind" method +WindGust row entry. You will want to refer to the "_wind" method for help in dealing with the Wind and Wind20ft grids.
      • Add a new method, for example, "_windGust_row", which calls -"makeRow" to create the WindGust row.   The call to "makeRow" +"makeRow" to create the WindGust row. The call to "makeRow" will use your "_windGustEntry" method.
      • Add an entry for WindGust to the "_rowList" that refers to your "_windGust" method
      - Answer to Smart Tabular -Exercise  4
      + Answer to Smart Tabular +Exercise 4

      Narrative Product Exercises

      Narrative Exercise 1: "Accessing the Statistics Dictionary"

      In this exercise, you will practice accessing the Statistics Dictionary -using the "tree.stats.get" command. 
      +using the "tree.stats.get" command.
      1. Put the following code in your ZFP_<site>_Overrides -file:   
        +file:

         def sky_setUp(self, tree, node):    
                if node.getComponentName() @@ -604,34 +572,34 @@ self.scalarConnector)          
      2. Run the ZFP with the default settings and examine the printed -results in the terminal window.   Examine the data to verify +results in the terminal window. Examine the data to verify that the results are correct.
      3. Alter the "tree.stats.get" commands using various arguments and -re-run the product.  Satisfy yourself that that the results are +re-run the product. Satisfy yourself that that the results are correct.

      Narrative Exercise 2: "Narrative Tree Processing Rules"

      This exercise will illustrate the multiple-pass processing of the narrative tree by printing a trace of the methods executed and their -return status. 
      +return status.
      1. Bring up the GFE under userID GFETEST.  There you will find -a Overrides file called "Phrase_Test_Local".  Bring up the +a Overrides file called "Phrase_Test_Local". Bring up the Formatter Launcher Dialog and run this product.
      2. Now we would like to turn on a trace for a phrase and follow it's -progress.  In the "phraseList" for Period_1, comment out all +progress. In the "phraseList" for Period_1, comment out all except -the "weather_phrase".  Now set the Wx grid for the first 12-hour -period to Sct RW- and set the PoP to 60.  Save your data to the +the "weather_phrase". Now set the Wx grid for the first 12-hour +period to Sct RW- and set the PoP to 60. Save your data to the Fcst database. Finally, uncomment the 'Definition["trace"] = 1' in the Definition section.  Now run the product using the Fcst database.
      3. You will see a trace in the terminal window similar to the following which has been annotated and bolded to help you read it:
      Local Formatter executed script:   runIFPText -t -Phrase_Test_Local -g Phrase_Test -h polaris -p 98000000 -d +Phrase_Test_Local -g Phrase_Test -h dx3 -p 9581 -d BOU_GRID__Fcst_00000000_0000 -u GFETEST &
      Finding  Phrase_Test_Local
      Finding  Period_1
      @@ -768,19 +736,19 @@ Progress: 100% Phrase_Test Complete
      to construct the weather phrase.
      • Can you see the levels of the tree i.e. tree level, component -level, phrase level and sub-phrase level?  The tree and sub-phrase +level, phrase level and sub-phrase level? The tree and sub-phrase levels are labeled as "None" since they have no node name.
      • Can you follow the progress from the top of the tree to each of -the nodes?    Notice at each level how different methods -return a DONE status.  After returning DONE, they are not called +the nodes? Notice at each level how different methods +return a DONE status. After returning DONE, they are not called again when traversing the node.
      • Notice the methods at each level. A the top level, we have -"assembleChildWords".  Look this up in the Phrase Builder -module.  What is the trigger condition upon which this method can -execute?  At the Component level, we have "assemblePhrases" and -"wordWrap".   What trigger condition do these have?  We +"assembleChildWords". Look this up in the Phrase Builder +module. What is the trigger condition upon which this method can +execute? At the Component level, we have "assemblePhrases" and +"wordWrap". What trigger condition do these have? We will learn more about the Phrase level methods in a later -session.  +session. For now, notice that some execute immediately while others trigger only after the words are complete.
      • When you are done examining the trace, reverse the changes you @@ -791,16 +759,16 @@ made to restore the "Phrase_Test_Local" file to its original state.
      • with 'Phrase_Test_Local'" In this exercise, you will work with Phrase_Test_Local to understand the Narrative Phrases and -Strategies.  From the GFE Help menu, select "Test Cases" and find -"tp003:  Narrative Phrases Test Cases and Tutorial".  Follow +Strategies. From the GFE Help menu, select "Test Cases" and find +"tp003: Narrative Phrases Test Cases and Tutorial". Follow the instructions for setting up and testing the Phrase_Test_Local file located under the GFETEST userID.

        Narrative Exercise 4: "Working with 'Local_Effects_Test_Local'"

        In this exercise, you will learn about different ways to set up local -effects.  From the GFE Help menu, select "Test Cases" and find -"tp004: Local Effects Test Cases and Tutorial".  Follow the +effects. From the GFE Help menu, select "Test Cases" and find +"tp004: Local Effects Test Cases and Tutorial". Follow the instructions for setting up and testing the the Local_Effects_Test_Local file located under the GFETEST userID.
        @@ -809,27 +777,27 @@ file located under the GFETEST userID.

        Phrase Exercise 1: "Overriding a Word Method"

        In this exercise, you will see how to override a Word Method in order -to alter the wording a phrase.  You will see that although the na
        +to alter the wording a phrase. You will see that although the na
        1. In the ZFP_<site>_Overrides file, override the "snow_words" method (ScalarPhrases).
        2. Change the wording to use a dash instead of the word, "to".  -For example,  "1 to 2 inches" will come out as "1-2" inches.
        3. +For example, "1 to 2 inches" will come out as "1-2" inches.
        -Answer to Phrase Exercise 1
        +Answer to Phrase Exercise 1

        Phrase Builder Exercise 2: "Inter-phrase Dependency"

        In this exercise, you will learn how to use the resulting words from -one phrase to affect the words of another phrase.  For example, +one phrase to affect the words of another phrase. For example, the PoP phrase wording will depend on the type of weather occuring in the period.
          -
        1. Examine the "popMax_words" method from ScalarPhrases.  +
        2. Examine the "popMax_words" method from ScalarPhrases. Notice the "findWords" method that finds the words for the -weather_phrase.  Since the popMax_phrase is dependent on the +weather_phrase. Since the popMax_phrase is dependent on the weather_phrase, it does not execute until the weather_phrase words have been set.
        3. @@ -854,7 +822,7 @@ wxWords == "":
          return self.setWords(node, "null")
                     
        4. Run the product and examine the results in the terminal -window.  Can you explain them?
        5. +window. Can you explain them?

        Phrase Exercise 3: "Phrase Anatomy"

        @@ -864,11 +832,11 @@ and see how they all work together to form the resulting phrase.
      • In the Phrase_Test_Local file,  comment out all phrases EXCEPT the wind_withGusts_phrase in the Period_1 product component.
      • Override the "standard_vector_phraseMethods" from -VectorRelatedPhrases. 
        +VectorRelatedPhrases.
      • Set up one Wind grid and no WindGust grid for the first period.
      • For each phraseMethod in turn (including the setUp and -wordMethods), comment it out and run the product.   Can you +wordMethods), comment it out and run the product. Can you explain the results?
      • Set up two differing 6-hour Wind grids and repeat Step 4.
      • Set up one WindGust grid with a non-null value and repeat Step 4.
      • @@ -882,11 +850,11 @@ phraseMethod combinations to gain insight into phrase building.. product component.
      • Override the "standard_weather_phraseMethods" from WxPhrases.
      • Set up one Wx grid with significant weather for the first -period.  Make sure the corresponding PoP grid is set to at least +period. Make sure the corresponding PoP grid is set to at least 20.
      • For each phraseMethod in turn (including the setUp and -wordMethods), comment it out and run the product.   Can you +wordMethods), comment it out and run the product. Can you explain the results?
      • Set up two differing 6-hour Wx grids and repeat Step 4.
      • Continue to experiment with different data values and @@ -899,11 +867,11 @@ In this exercise, you will add a QPF  phrase to Period_1 for the ZFP product. 
        1. Create a new phrase for QPF and add it to the ZFP product.  -Use the popMax_phrase as a starting point.  For simplicity, report +Use the popMax_phrase as a starting point. For simplicity, report the QPF value as an integer.
        -Try this exercise without reading further.  If you need some more +Try this exercise without reading further. If you need some more hints, read on.
        1. Use the "accumSum" or "accumMinMax" analysis method. Make sure @@ -913,32 +881,21 @@ your phrase can handle either.
        2. phrase_descriptor_dict.
        -Answer to Phrase Exercise 4
        +Answer to Phrase Exercise 4

        Trouble-shooting Exercises

        -

        Trouble Exercise 1:  "Simple +

        Trouble Exercise 1: "Simple Error Message"

        In this exercise, you will look up an error message in the Trouble-shooting section to isolate the problem.
        1. Open the Combinations file in the Define Text Products -dialog.  Replace "area1" with "area15".
        2. +dialog. Replace "area1" with "area15".
        3. Run the ZFP product.
        4. -
        5. Check the terminal window for error messages.  You should -see:  
          -Traceback (most recent call last):
          -  File "<string>", line 1, in ?
          -  File "TextFormatter.py", line 953, in profMain
          -  File "TextFormatter.py", line 894, in main2
          -  File "TextFormatter.py", line 79, in getForecast
          -  File "TextFormatter.py", line 307, in __getRunTimeVariables
          -  File "TextFormatter.py", line 473, in getCombinations
          -  File "TextFormatter.py", line 569, in getEditArea
          -  File "AFPSSup.py", line 2285, in getReferenceData
          -TypeError: IFPClient::getReferenceData()failed : Unable to find -reference data [(area15,P=0,A=0)]
          +
        6. Check the terminal window for error messages. You should +see a stack trace.
        7. -
        8. Look in the Trouble-shooting section -and find the description for this error. 
          +
        9. Look in the Trouble-shooting page +and find the description for this error.
        10. Make the correction and run the product again.
        11. @@ -949,7 +906,7 @@ In this exercise, you will follow the Trouble-shooting Strategy to isolate and fix a problem with a formatter.
          1. Run the product with displayName appearing as "TroubleEx2".
          2. -
          3. Use the Trouble-shooting +
          4. Use the Trouble-shooting Strategy 3 to isolate and fix the problem.
          @@ -958,10 +915,10 @@ Hunt" In this exercise, you will follow the Trouble-shooting Strategy to isolate an infinite loop in processing the narrative tree.
            -
          1. Ask a buddy to set up this exercise by doing steps 2-7.  +
          2. Ask a buddy to set up this exercise by doing steps 2-7. Then do step 8.
          3. In the Text Utilities Window, create a file named -"TroubleEx3".   Remove the template code and create a new +"TroubleEx3". Remove the template code and create a new class:
            class TextProduct:
          4. @@ -970,20 +927,20 @@ Period_1 of the AreaFcst product.
          5. Change the last "setWords" call to a simple "return" statement. Copy it into the TextProduct class in the TroubleEx3 file. Save and close the file.
          6. -
          7. Open the ZFP_<site>_Overrides.  Comment out the +
          8. Open the ZFP_<site>_Overrides. Comment out the "class" declaration and replace it with the following:

            +
             import TroubleEx3
             class TextProduct(TroubleEx3.TextProduct, AreaFcst.TextProduct):
                Definition = -copy.deepcopy(AreaFcst.TextProduct.Definition)
          9. +copy.deepcopy(AreaFcst.TextProduct.Definition)

            +
          10. Run the ZFP and make sure that the product returns an error message instead of text. If not, change the data or the TroubleEx3 file to make sure an error occurs.
          11. Save and close the file and return to your seat.
          12. -
          13. Run the ZFP.  Use Trouble-shooting -Strategy 4 to isolate the problem.   See  how far you can +
          14. Run the ZFP.  Use Trouble-shooting +Strategy 4 to isolate the problem. See how far you can get WITHOUT looking at TroubleEx3!
          diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceFAQs.html b/cave/com.raytheon.viz.gfe/help/TextReferenceFAQs.html index 7f51b7568d..70fb271b29 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceFAQs.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceFAQs.html @@ -16,7 +16,7 @@ a Different Area for Some Phrases
              Range Adjustment Questions/Answers
          -Using Lat/Lon Edit Areas in a Product
          +Using Lat/Lon Edit Areas in a Product


          QUESTIONS/ANSWERS

          The following is a condensation of a -listserver discussion involving Range -Adjustment:
          +listserver discussion involving Range +Adjustment:

          Kyle: In our grids for today, we have no wind speeds greater than 13 knots, but our formatters went @@ -389,8 +389,7 @@ what it was told to do, even if it wasn't what you expected/wanted.
          If you want to look at the range code yourself, look at the applyRangeValues and applyBias methods in TextUtils.

          -

          Using Lat/Lon -Edit Areas in a Product

          +

          Using Lat/Lon Edit Areas in a Product

          Question: I would like to set up a varDict to allow the user to enter in a given latitude and longitude @@ -401,26 +400,6 @@ area.
          1. Set up the VariableList so the suer can enter lat/lon values.  For
          example:

          VariableList = [
          (("forecast point latitude", "lat"), 20.0, "alphaNumeric"),
          (("forecast point longitude", "lon"), -160.0, "alphaNumeric"),
          ]

          2. You can set the Definition["defaultEditAreas"] = [] since it will not
          be used at all.

          3. In your formatter "generateForecast" method, replace this:

          self._areaList = self.getAreaList(argDict)

          with something this:

          self._areaList = self._getLatLonAreaList(argDict)

          4. Finally, include the following method:

          def _getLatLonAreaList(self, argDict):

          area = self.createLatLonArea(float(self._lat), float(self._lon), 10)

          # OPTIONAL SET UP IF YOU WANT THIS AREA SAMPLED FOR HAZARDS
          # Save to server
          self.saveEditAreas([area])
          # Create Hazards Table for this area
          hazards = HazardsTable.HazardsTable(
          argDict["ifpClient"], [[area.id().name()]], "FWS",
          self.filterMethod, argDict["databaseID"],
          self._fullStationID)
          argDict["hazards"] = hazards
          # Remove from server
          self.deleteEditAreas([area])

          return [(area, "areaName")]
                      
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -

          -
          -
          -
          -
          -
          diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceInfrastructureReference.html b/cave/com.raytheon.viz.gfe/help/TextReferenceInfrastructureReference.html index 9f9775c1e0..e62c22df12 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceInfrastructureReference.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceInfrastructureReference.html @@ -18,12 +18,12 @@ the Standard File
             Naming Conventions
             Sample Analysis
                   Statistics By Time Range
          + href="#StatisticsByTime">Statistics By Time Range
                  Arguments to SampleAnalysis methods
                  Checking for Edit Areas
          + href="#Checking_for_Edit_Areas_Sample">Checking for Edit Areas
                  Global Thresholds and Variables
                 
                    
          Combined Element Phrases
                     Marine Phrases
          -           Algorithm for WaveHeight + href="#MARINE">Marine Phrases
          +         Algorithm for WaveHeight and WindWaveHgt Reporting
                     Fire Weather Phrases
          @@ -157,15 +156,15 @@ the Standard Product File argDict  Dictionary containing system information about the -product being created.  In most cases, you will not need to access +product being created. In most cases, you will not need to access information within argDict, but it must be passed for internal system use. fcst - The text string representing the product.   It will + The text string representing the product. It will be in a partially completed state as it is passed to each method in -turn.   Be sure to "return fcst" at the end of a method that +turn. Be sure to "return fcst" at the end of a method that is passed the fcst. diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceIntroduction.html b/cave/com.raytheon.viz.gfe/help/TextReferenceIntroduction.html index a3d09b3589..032020f257 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceIntroduction.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceIntroduction.html @@ -11,9 +11,8 @@

          Introduction

          This reference material is to be used in conjunction with the Text Product User Guide which -gives + href="TextProductUserGuide/Slide1.html">Text Product User Guide which gives high-level explanations and important background information for the -Text Product capability of the GFESuite software.  The User Guide +Text Product capability of the GFESuite software. The User Guide gives links to appropriate sections of this document for more details and extensive examples. diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceProductSet-upand.html b/cave/com.raytheon.viz.gfe/help/TextReferenceProductSet-upand.html index 808983242d..f1e049a01b 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceProductSet-upand.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceProductSet-upand.html @@ -13,7 +13,7 @@ WFO Site InformationWFO Site InformationWFO Site Information

          Product Set-up and Customization

          ifpServer Product Configuration
          EDEX Product Configuration
            Quick Start Product Set up
                  Tabular Products
          @@ -38,7 +38,7 @@ Phrases
          href="#HazardKey">HazardKey
            WFO Site Information

          -

          ifpServer Product Configuration

          +

          EDEX Product Configuration

          The GFESuite set of product formatters are delivered to the field as templates, which are then expanded upon installation. The installation converts the templates into the Baseline, Region, and local (site) @@ -66,29 +66,26 @@ found.

          Quick Start Product Set Up

          This section gives step-by-step instructions to get a product set-up -and running.  The following section "Product Customization Guide" gives instructions on configuring the product and customizing it to your local site.
          • Login to the GFE from a terminal window under a new user ID, -e.g. TextTest.  From a terminal window in the /release/bin -directory, type ./runGFE.  Login as a new user ID such as +e.g. TextTest. From a terminal window in the /awips2/cave +directory, type ./cave.sh -u tester_id -component GFE. Login as a new user ID such as TextTest. -You will use this ID to set up new products and test them.  When +You will use this ID to set up new products and test them. When you are satisfied with a product, you may move it to your SITE -directory.  NOTE: If you have GFESuite text products running from -IFPS 15 or prior versions, you will need to transition them to IFPS 16 -before running operationally.  Please see the section on Upgrades and Backward Compatibility.
          • -
          • Create Edit Areas.  Create edit areas named +directory.
          • +
          • Create Edit Areas. Create edit areas named "area1", -"area2", and "area3".   Some products are set up to run with -these "defaultEditAreas" as noted in the table below.  Other +"area2", and "area3". Some products are set up to run with +these "defaultEditAreas" as noted in the table below. Other products run with a set of edit area Combinations which can be set up through the Formatter Launcher Dialog.
          • -
          • Locate the product you wish to set up.  From the GFE -Main Menu, select "Define Text Products" .  Locate the "Standard" +
          • Locate the product you wish to set up. From the GFE +Main Menu, select "Define Text Products". Locate the "Standard" file for the product you wish to set up in the table below:
                     

          Hazard Products

          -The following Hazard Products are installed automatically.  To run -them:  From the Formatter Launcher, choose -Products-->Hazards. 
          +The following Hazard Products are installed automatically. To run +them: From the Formatter Launcher, choose +Products-->Hazards.

          @@ -812,26 +812,24 @@ FIPS or ZONE codes.

          WINDS NORTHEAST 10 TO 20 KNOTS WITH GUSTS TO AROUND 70 KNOTS VEERING SOUTHEAST 5 TO 15 KNOTS WITH GUSTS AROUND 25 KNOTS IN THE EARLY MORNING.

          -

          When we find this phrase in the Wind and -WindGust Text Rules section , we see that it can be customized in -various ways.  If we want to change the descriptor from "WINDS" to -"WIND", we need to override the phrase_descriptor_dict  -for "Wind".  First, we look to see if it is +

          When we find this phrase in the Wind and +WindGust Text Rules section, we see that it can be customized in +various ways. If we want to change the descriptor from "WINDS" to +"WIND", we need to override the phrase_descriptor_dict +for "Wind". First, we look to see if it is already overridden in the Standard File, AreaFcst, which we -open in the Text Products window of the Define Text Products dialog. We +open in the Text Products folder of the Define Text Products dialog. We can issue a "find" command to see if it is there. It is not, so next we -look in the ConfigVariables utility from the Text Utilities window -and  issue a "find" command.  NOTENOTE: The ConfigVariables Utility is "Read-Only", so you cannot change the method in that file. You MUST copy it into your Overrides file, and in that location, you can change the value which -will -override or supercede the value found in the library -module.  
          +will override or supercede the value found in the library module.

          We notice that the phrase_descriptor_dict -is very lengthy.  We do not have to repeat the entire method. +is very lengthy. We do not have to repeat the entire method. Instead, we can use the dictionary as a starting point and simply change any entries that are relevant to us as follows:

          @@ -861,11 +859,11 @@ unitsDict["kt"] = "kts"
                  return dict The wind_withGusts_phrase reports gusts if they are 10 knots greater -than the maximum wind speed.  Suppose we would like to suppress +than the maximum wind speed. Suppose we would like to suppress reporting gusts unless they are at least 15 knots greater than the -maximum wind speed.  The table for the +maximum wind speed. The table for the "public_windRange_withGusts_phrase" lists a method called gust_wind_difference_threshold. gust_wind_difference_threshold. We can locate it in the VectorRelatedPhrases module and copy and paste it into our Overrides file: @@ -882,7 +880,7 @@ return 15

          Definition and Configurable Issuance -- issuance_list

          Narrative products are composed of a "narrative" which contains a series of "component" phrase -products.   This is used to construct a "narrative" type of +products. This is used to construct a "narrative" type of product of the form:

                  {
          @@ -1092,11 +1090,11 @@ afternoon",
          narrativeDefPM),
                      ]


          -
          NOTE:  Any variables that begin with a "self._" should be -encased in a "try" block.  This is because the "_issuance_list" is + NOTE: Any variables that begin with a "self._" should be +encased in a "try" block. This is because the "_issuance_list" is accessed and examined once BEFORE the product is actually run in order -to set up the input dialog.  During this first examination, the -variables are not yet initialized.  As an example, here is the +to set up the input dialog. During this first examination, the +variables are not yet initialized. As an example, here is the issuance_list from the FWF:

              def @@ -1253,14 +1251,12 @@ afternoon",
          color="#000000">Post-Processing Narrative Phrases

          Although, it is not encouraged, there will be times that you will want to post-process phrases to clean up -undesirable -wording.

          +undesirable wording.

          A "postProcessPhrase" hook is available  for most -phrases.   This  allows you to do string replacement -and/or abbreviations.   Here is the default method from the -PhraseBuilder module.  You may copy it into your Overrides file -and add -additional replacements:

          +phrases. This  allows you to do string replacement +and/or abbreviations. Here is the default method from the +PhraseBuilder module. You may copy it into your Overrides file +and add replacements:

              def postProcessPhrase(self, tree, node):
                  words @@ -1276,9 +1272,9 @@ return self.setWords(node, words)
          AllowedHazards

          Every product that includes Headline phrases also contains a method -that controls which Hazards are mentioned.  This method can be +that controls which Hazards are mentioned. This method can be overridden so that you have control over which weather hazards -(Warnings, Advisories, and Watches) appear in each product.  An +(Warnings, Advisories, and Watches) appear in each product. An example of this method appears below.


          @@ -1338,64 +1334,64 @@ WATER ADVISORY
                      ]

          In this example, we show all of the possible components of the -allowedHazards list.  This list not only controls which Headlines +allowedHazards list. This list not only controls which Headlines appear in each product, but also which VTEC strings appear in the product as well.

          Each line in the allowedHazards list can contain up to three parts: the key for the hazard, the VTEC actions that are allowed for that hazard, -and a category for the hazard.  The only part that is mandatory is -the hazard key.  +and a category for the hazard. The only part that is mandatory is +the hazard key. Usually this key corresponds to a VTEC code, but locally-defined -hazards may be defined as well (See the last entry.) .  The action -list and the category are optional.   The category field can -be used to group hazards.  If more than one hazard in a group is +hazards may be defined as well (See the last entry). The action +list and the category are optional. The category field can +be used to group hazards. If more than one hazard in a group is found, only the highest priority hazard is reported, where priority is -defined by the order of appearance in the list.  In the example -above, if  both a Storm Warning (SR.W) and Gale Warninng (GL.W) +defined by the order of appearance in the list. In the example +above, if both a Storm Warning (SR.W) and Gale Warninng (GL.W) were found in the grids, only the Storm Warning would be -reported.   By the same token, you can have multiple hazards +reported. By the same token, you can have multiple hazards in an area by assigning different categories to each hazard.

          Hazard Key

          The HazardKey is the key that appears in the serverConfig file and -hence in the GFE display when you edit the Hazard grid.  There are -two types of hazard keys, VTEC, and locally-defined.  VTEC hazard +hence in the GFE display when you edit the Hazard grid. There are +two types of hazard keys, VTEC, and locally-defined. VTEC hazard keys follow a particular format and are pre-defined for you in the -VTECTable. However you may also define local hazards as well.  The +VTECTable. However you may also define local hazards as well. The last entry in the above example of the allowedHazards list is a locally-defined hazard.  In this example, it is "SmCrftExCau" which is an -abreviation for "Small Craft Exercise Caution".  To include a +abreviation for "Small Craft Exercise Caution". To include a locally-defined hazard all you need to do is list it all by itself in the allowedHazards list. Once your localConfig is set up properly you will see this hazard appear (generally at the end of the list of hazards) and you can define a Hazard grid that contains this -particulare Hazard.  Once defined in a grid, this hazard will +particular Hazard. Once defined in a grid, this hazard will automatically appear in the product as long as the same hazardKey appears in the allowedHazards list as in the example above.

          -VTEC hazard keys are slightly more complicated.  The presence of +VTEC hazard keys are slightly more complicated. The presence of the key in allowedHazards list is not the only piece of information -necessary for the hazard to appear in the product.  You must also -defined the list of VTEC "action codes" as well.  This action code -list defines which type of VTEC code can appear in your product.  +necessary for the hazard to appear in the product. You must also +defined the list of VTEC "action codes" as well. This action code +list defines which type of VTEC code can appear in your product. For convenience, we include a list including all possible VTEC codes, as well as a list of codes that apply to the Marine-type -products.  In general, you will want to include all of the VTEC -action codes for every VTEC hazard.  In some cases, however, you -may want to limit the set of actions codes in each product. 
          +products. In general, you will want to include all of the VTEC +action codes for every VTEC hazard. In some cases, however, you +may want to limit the set of actions codes in each product.


          WFO Site Information

          -WFO site information is stored in a TextUtility named SiteCFG.  +WFO site information is stored in a TextUtility named SiteCFG. This module is loaded using
          -the familiar BASE, SITE paradigm.  Note that a user other than +the familiar BASE, SITE paradigm. Note that a user other than BASE or SITE should not override
          -this file.  The file contains a dictionary which holds information +this file. The file contains a dictionary which holds information used to configure text products
          -from the BASE template files.  It also is used by the formatter +from the BASE template files. It also is used by the formatter launcher to find the name of
          the backup site.

          @@ -1414,12 +1410,10 @@ SiteInfo= {
                   }
          }

          -  The key is a WFO site id.  This file can be overridden by -the SITE user to modify any desired
          -entries.  Again, it is undefined bahavior (anything can happen) -for any other user other than
          +The key is a WFO site id. This file can be overridden by +the SITE user to modify any desired +entries. Again, it is undefined bahavior (anything can happen) +for any other user other than SITE to modify this file.
          -
          -
          diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceQuizQuestions.html b/cave/com.raytheon.viz.gfe/help/TextReferenceQuizQuestions.html index 25ef00587d..353062456c 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceQuizQuestions.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceQuizQuestions.html @@ -12,8 +12,6 @@

          Quiz Questions


          - -

          Text Product User Guide -- PART 1

          1. What are the three main steps that the system performs to produce @@ -44,7 +42,7 @@ after sky and before the max/min temp?
          2. customize my product?
          3. Where do I find information about setting up Local Effects?
          4. Suppose I want to learn more about the phrases in the first -period of my ZFP product.  How do I locate the Product Component +period of my ZFP product. How do I locate the Product Component definition for that period?
          5. What do I do if my Hazards are not showing up in the product?
          6. Where can I find information regarding trouble-shooting tips and diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceTextProductCreationUser.html b/cave/com.raytheon.viz.gfe/help/TextReferenceTextProductCreationUser.html index cacf7e9368..a9eb555c38 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceTextProductCreationUser.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceTextProductCreationUser.html @@ -12,18 +12,14 @@

            Text Product Creation User Guide

            - - -   Time Display Formats


            -

            Time Display Formats

            The display format for the time period in text or period labels for Simple Tabular products may be specified in the product Definition as "timePeriodFormat" or "periodLabelFormat", -respectively.    Also, Smart Text products have access +respectively. Also, Smart Text products have access to various TimeDescriptor methods such as "getCurrentTime" which use the same "formatting entries" shown below. The general form is a tuple @@ -31,13 +27,11 @@ containing the following:

            (LTorZulu, durationFormat, startFormat, endFormat)

              If LTorZulu is set to "LT", the time period will be reported in local time instead of GMT. By setting a format string to "", that -value is not output.  The formatting entries consist of a keyword -prefixed with an '%'.  The software will substitute the -appropriate -value in place of the %keyword in the format string.  To add extra +value is not output. The formatting entries consist of a keyword +prefixed with an '%'. The software will substitute the appropriate +value in place of the %keyword in the format string. To add extra characters, such as spaces or some text (e.g., "to"), simply add those -characters to the format.    For example, this -timePeriodFormat:

            +characters to the format. For example, this timePeriodFormat:

                  "timePeriodFormat": ("LT", "%H hours ", "%a %b %d, %Y %I:%M %p", " to %a %b %d, %Y %I:%M %p %Z"),

            will yield a time period display such as:

            @@ -130,7 +124,7 @@ year [01,53].  If the week containing January
                                    -1st has four or more days in the new  year, then it is considered +1st has four or more days in the new year, then it is considered week 1; otherwise, it is week 53 of the previous year, and the next week is week 1.
            @@ -163,4 +157,4 @@ characters if no time zone exists).
                    %%        The percent (%) character.

            +

            diff --git a/cave/com.raytheon.viz.gfe/help/TextReferenceTroubleShooting.html b/cave/com.raytheon.viz.gfe/help/TextReferenceTroubleShooting.html index 74ed535ac1..41bc915641 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferenceTroubleShooting.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferenceTroubleShooting.html @@ -11,16 +11,12 @@

            TroubleShooting

            - -   Trouble-shooting +    Trouble-shooting Strategies
                Error Messages and Solutions
                Problems and Solutions -
            - -

            Trouble-shooting Strategies

            Strategy 1 -- "No Output":  Nothing diff --git a/cave/com.raytheon.viz.gfe/help/TextReferencecommandline.html b/cave/com.raytheon.viz.gfe/help/TextReferencecommandline.html index 79a591a646..41e7b2f0ba 100644 --- a/cave/com.raytheon.viz.gfe/help/TextReferencecommandline.html +++ b/cave/com.raytheon.viz.gfe/help/TextReferencecommandline.html @@ -17,15 +17,15 @@ TextFormatter The usual way to execute the Text Formatter is via the Formatter Launcher Dialog in the GFE which automatically generates a command line from the -Text Product definiton.  However, the program can be run -stand-alone with the following command and arguments.  To see the +Text Product definiton. However, the program can be run +stand-alone with the following command and arguments. To see the set-up of these arguments for a given text product, examine the Process Monitor window.

            runIFPText -d -database [-p port] [-h hostname] -t forecastType [-o outputFile] [-u +database -t forecastType [-c configFile] [-o outputFile] [-u username] [-l language] [-A appendFile] [-V {varDict}] [-O serverFile] [-S gfeGenOutputFile] -[-z drtOffset] [-a vtecActiveTableName] [-T] [-E] [-v vtecMode] [-r +[-site siteID] [-z drtOffset] [-a vtecActiveTableName] [-T] [-E] [-v vtecMode] [-r editAreaName] [-w timeRangeName] [-s startTime -e endTime] [-i period]

          the gridded information.
          -
          - - - - - - - - - - - @@ -85,6 +63,16 @@ specified in siteConfig.
          + + + + + + @@ -105,12 +93,23 @@ specified in siteConfig.
          + + + + + + @@ -130,7 +129,7 @@ which to run the formatter.
          @@ -141,7 +140,7 @@ Default is "english".
          - @@ -165,7 +164,7 @@ interface dialog.
          @@ -199,8 +198,8 @@ mode. If vtecMode is specified, it is set to "T". "TEST" mode adds @@ -284,14 +283,14 @@ with variable period (for rows or columns) The -E and -T switches are mutually exclusive.

          -V Switch - run-time VariableList

          This option to provide a run-time VariableList instead -of displaying the user dialog.
          +of displaying the user dialog.

          The dictionary must be in the form of a Python dictionary -string.   For example:
          +string. For example:

            -V  '{("Product Issuance", "productIssuance"):"Morning", ("Issuance Type", "issuanceType"):"Routine"}'

          +

          - + \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/Toolbar.html b/cave/com.raytheon.viz.gfe/help/Toolbar.html index ec5090322f..a3f2f915c5 100644 --- a/cave/com.raytheon.viz.gfe/help/Toolbar.html +++ b/cave/com.raytheon.viz.gfe/help/Toolbar.html @@ -6,107 +6,96 @@ - ButtonBar,html + GFE Suite Documentation - Button Bar

          GFE Toolbar Reference Guide

          -
          February 18, 2004
          +
          January 18, 2012



          -

          +

          This section describes each of the buttons in the button bar and the function that they perform.

          Click on any button to get help for that button.

          +

          Panning +

          +

          Pan

          GFE Layout

          -

          Horizontially/Vertically-opposed EditorsToggle Grid Manager/Temporal EditorExpand Time ScalingContract Time ScalingDeselect allToggle Grid Manager/Temporal EditorExpand Time ScalingContract Time ScalingDeselect allToggle Quick ViewSave Forecast Grids

          + src="images/Normal.jpg" alt="" + style="border: 0px solid ;">Toggle Quick ViewSave Forecast Grids

          Frame Stepping

          -

          Step BackStep Forward

          +

          Step BackStep Forward

          Edit Tools

          -

          Edit ActionsUndo Grid EditSample ToolContour ToolPencil ToolMove/Copy Tool

          +

          Edit ActionsUndo Grid EditSample ToolContour Tool + Pencil ToolMove/Copy Tool

          Edit Areas

          -

          Select Points ToolToggle Edit AreaClear Edit AreaEdit Area QuerySet Edit ModeSave QuickSetQuickSet Slot 1QuickSet Slot 2QuickSet Slot 3QuickSet Slot 4

          +

          Select Points ToolToggle Edit AreaClear Edit AreaEdit Area QuerySet Edit ModeSave QuickSetQuickSet Slot 1 + QuickSet Slot 2QuickSet Slot 3QuickSet Slot 4

          -
          -

          Vertically- and Horizontally-opposed -Editors + +


          +

          +Pan

          -

          This button toggles the GFE arrangement so that the Temporal and -Spatial -Editors Select this button if you want the GFE arranged so that the -Grid -Manager/Temporal and Spatial Editors are either vertically or -horizontally -opposed. -
          +

          This button toggles the GFE Spatial +Editor between map panning on and off. You can pan the map +using your mouse wheel.

          -

          -  -

          +

          Temporal Editor / Grid Manager

          @@ -118,7 +107,7 @@ allows you to toggle between them.



          -Expand Time

          Changes the time scaling for the Grid Manager and Temporal Editor so @@ -126,7 +115,7 @@ that a unit of time is larger. Think of it as a zoom-in time button.



          -Contract Time

          Changes the time scaling for the Grid Manager and Temporal Editor so @@ -134,7 +123,7 @@ that a unit of time is smaller. Think of it as a zoom-out time button.


          -

          Deselect All

          @@ -144,22 +133,22 @@ Manager.


          Grid Manager Display Mode + src="images/Normal.jpg" alt="" + style="">Grid Manager Display Mode

          -

          Allows the user to choose the Grid Manager Display Mode.   +

          Allows the user to choose the Grid Manager Display Mode. The various choices are Normal, History, Saved, Published, Modified, -and Sent.  Depending upon the choice, the color coding and labels +and Sent. Depending upon the choice, the color coding and labels within each grid block of the grid manager will indicate various -states.  For Normal, the colors indicate whether a grid is -displayed and active within the Spatial Editor.  For History, the +states. For Normal, the colors indicate whether a grid is +displayed and active within the Spatial Editor. For History, the color coding indicates the model data source and whether it has been -modified.   Saved, Published, Modified, and Sent use color +modified. Saved, Published, Modified, and Sent use color coding based on the last time the grid was saved, published, modified, or sent via ISC.


          -

          Toggle Quick View

          @@ -177,40 +166,37 @@ is moved over the Grid Manager time blocks. The default is off.



          -Toggle ISC Mode

          Toggle ISC Mode places the GFE in the ISC (Intersite -Coordination Viewing/Editing) mode.  When the GFE is in this mode, +Coordination Viewing/Editing) mode. When the GFE is in this mode, the displayed data in the spatial editor is a composite of the Forecast -grid and the received intersite coordination grids.  The data over +grid and the received intersite coordination grids. The data over your CWA region is from the Forecast database and the remainder of the -displayed grid is the intersite coordination grids.  Toggling ISC -mode affects more than the display.  Sample display, color table -fit -to data operations, move/copy, smooth, and pencil operations are all -affected.  -When in ISC mode, these tools work on the composite Fcst and ISC -grids.  +displayed grid is the intersite coordination grids. Toggling ISC +mode affects more than the display. Sample display, color table +fit to data operations, move/copy, smooth, and pencil operations are all +affected. When in ISC mode, these tools work on the composite Fcst and ISC +grids. Refer to the ISC Training Guide for more details.


          -

          Save Grids to Forecast

          When selected this button causes the Save Forecast dialog to appear which allows you to save your forecast -grids -to the database. +grids to the database.


          -

          Step Back Frame

          @@ -222,7 +208,7 @@ displayed.



          -

          Step Forward Frame

          @@ -232,7 +218,7 @@ If no later grid exists, then the first visible grid is displayed.


          -

          Edit Actions

          @@ -241,7 +227,7 @@ Actions dialog where Smart Tool are found.


          -

          Undo Grid Edit

          @@ -250,7 +236,7 @@ executed.



          -Sample Tool

          Makes the Sample Tool the active tool in the Spatial Editor. The @@ -259,7 +245,6 @@ Tool allows you to display a text representation of the gridded value under the cursor.

          -p port
          -
          Yes
          -
          -p 98000000
          -
          IFPServer port number. Defaults -to that specified in siteConfig.
          -
          -h hostname
          -
          Yes
          -
          -h polaris
          -
          IFPServer host. Defaults to that -specified in siteConfig.
          -
          -t forecastType
          Defines the Forecast Type.
          -c configFile
          +
          Yes
          +
          -c localGfeConfig
          +
          Defines the GFE config file. Default is gfeConfig.
          +
          -o outputFile
          This is a special filename that is used for background processing text formatters to store the output forecast text. The GFE puts on this switch for formatters that are run locally by the GFE -so the forecast text may be gathered at the end of the formatter execution. Formatters run by the ifpServer put on this switch for the same purpose. The +so the forecast text may be gathered at the end of the formatter execution. +Formatters run by EDEX put on this switch for the same purpose. The connection allows for proper behavior in the GFE's Formatter Launcher and Process Monitor.
          -site siteID
          +
          Yes
          +
          -site bou
          +
          Defines the site id to use.
          +
          -u userName
          -l spanish
          Used for formatters that support -foreign languages. The options are "spanish" and "french".  +foreign languages. The options are "spanish" and "french". Default is "english".
          -A /tmp/123.txt
          Append filename.  Output + Append filename. Output text is appending to specified file.
          -O test123
          Output file in the server's -TEXT/PRODGEN directory.
          +product drafts directory.
          -E
          Places the formatter into -"EXPERIMENTAL" mode.  If vtecMode is specified, it is set to -"E".  "EXPERIMENTAL" mode adds "EXPERIMENTAL..." to the MND header.
          +"EXPERIMENTAL" mode. If vtecMode is specified, it is set to +"E". "EXPERIMENTAL" mode adds "EXPERIMENTAL..." to the MND header.
          @@ -285,7 +270,7 @@ the cursor.


          -

          Contour Tool

          @@ -295,7 +280,6 @@ Tool allows you to modify gridded values by adding, deleting and adjusting contours.
          @@ -323,7 +307,7 @@ contours.


          -

          Pencil Tool

          @@ -333,7 +317,6 @@ Tool allows you to modify gridded values by adjusting the position of virtual contours.
          @@ -349,7 +332,7 @@ contours.


          -

          Move/Copy Tool

          @@ -357,7 +340,6 @@ Tool
          Move/Copy Tool allows you to move a defined area of data to a new location.
          @@ -379,16 +361,14 @@ location.


          -

          Select Points Tool

          Makes the Select Points tool the active tool in the Spatial Editor. The Select Points Tool allows you to select areas or grid points to -which -you apply Edit Actions. +which you apply Edit Actions.

          @@ -408,7 +388,7 @@ you apply Edit Actions.


          -

          Toggle Edit Area

          @@ -418,7 +398,7 @@ will be deselected and any area that was not selected will be selected.


          -

          Clear Edit Area

          @@ -426,7 +406,7 @@ Edit Area



          -Edit Area Query

          Displays the Edit @@ -436,8 +416,7 @@ based on gridded values.



          -  -

          Edit Area Mode

          @@ -450,7 +429,7 @@ Intersect


          -

          QuickSet Save

          @@ -460,7 +439,7 @@ saves the current edit area under that slot.


          -

          QuickSet Slot 1

          @@ -474,7 +453,7 @@ causes the current edit area to be stored under this slot.


          -

          QuickSet Slot 2

          @@ -488,7 +467,7 @@ causes the current edit area to be stored under this slot.


          -

          QuickSet Slot 3

          @@ -502,7 +481,7 @@ causes the current edit area to be stored under this slot.


          -

          QuickSet Slot 4

          @@ -516,13 +495,9 @@ causes the current edit area to be stored under this slot.



          -  -
          -  -

          Back To TOC

          - + \ No newline at end of file diff --git a/cave/com.raytheon.viz.gfe/help/VTEC.html b/cave/com.raytheon.viz.gfe/help/VTEC.html index 3a7d694b00..c8089b24ae 100644 --- a/cave/com.raytheon.viz.gfe/help/VTEC.html +++ b/cave/com.raytheon.viz.gfe/help/VTEC.html @@ -12,7 +12,7 @@

          GFESuite VTEC

          -
          April 18, 2006
          +
          March 13, 2012 - THIS VERSION IS NOT COMPLETE

          Table of Contents

          @@ -39,169 +39,104 @@ through the GFE.

          VTEC Program Flow

          The following diagram shows the VTEC program flow through the -GFE.  It consists of three major parts:  VTEC Decoding, VTEC +GFE. It consists of three major parts: VTEC Decoding, VTEC Merging, and Product Formatting.

          VTEC Decoding


          Text bulletins containing VTEC codes -are received over the AWIPS SBN.   These are routed to the -NotifyTextProd AWIPS D2D persistent process.  The NotifyTextProd +are received over the AWIPS SBN. These are routed to the +NotifyTextProd AWIPS D2D persistent process. The NotifyTextProd compares the incoming product against the routing table contained in -the pattern file.  The pattern file is used to determine the -process to be run for that file.   The pattern file used in +the pattern file. The pattern file is used to determine the +process to be run for that file. The pattern file used in the GFESuite/VTEC situation instructs the NotifyTextProd to start the VTECDecoder anytime a W* (all warnings) or FZ* (all routine marine products) arrives.

          The VTECDecoder reads the text product, decodes the UGC strings and the -VTEC strings.   It then merges its findings with the "Active" -table.  The "Active" table represents the currently active (or -recently active) watches, warnings, and advisories.  It tracks +VTEC strings. It then merges its findings with the "Active" +table. The "Active" table represents the currently active (or +recently active) watches, warnings, and advisories. It tracks Event Tracking Numbers (etns) by geographical id (UGC code) and knows the current state of each VTEC through action codes (e.g., NEW, CAN, UPG, EXT) for each product.

          There is a special WOU product that is received as guidance from the -Storm Prediction Center (SPC).   These products, when +Storm Prediction Center (SPC). These products, when decoded, will send an alert message to the GFE (using sendGfeMessage) -informing the forecaster to run the PlotSPCWatches tool.  This +informing the forecaster to run the PlotSPCWatches tool. This allows the latest SPC guidance to be placed into the Hazards grids, where it can further edited by the forecaster. Likewise, the Tropical Prediction Center (TPC) sends out TCV tropical event bulletins, which when decoded, sends an alert message to the GFE informing the -forecaster to run the PlotTPCEvents tool.  This allows the latest +forecaster to run the PlotTPCEvents tool. This allows the latest TPC guidance to be placed into the Hazards grid.

          -The "Active" table is designed to be "locked" when writing.   +The "Active" table is designed to be "locked" when writing. Only the VTECDecoder and MergeVTEC processes lock the table during -their update cycle.   Any client can read the table if the +their update cycle. Any client can read the table if the table is not locked for writing.

          VTEC Flow


          -

          VTEC Merging

          +

          VTEC Merging - NOT COMPLETE


          It is important that the "Active" table be always -up-to-date.   In the outside chance that a warning product is -missed on the SBN, the ifpServer asks surrounding sites for their -"Active" table on a routine basis.   This is sent out as a -request via the WAN.  The adjacent site, upon receiving the +up-to-date. In the outside chance that a warning product is +missed on the SBN, EDEX asks surrounding sites for their +"Active" table on a routine basis. This is sent out as a +request via the WAN. The adjacent site, upon receiving the request, packages the Active table for transmission back to the -requesting site.   The requesting site receives the table and -runs the MergeVTEC routine.  The MergeVTEC routine will add/update +requesting site. The requesting site receives the table and +runs the MergeVTEC routine. The MergeVTEC routine will add/update any records that are newer in the received active table than the -existing active table.  If a warning was issued and the action +existing active table. If a warning was issued and the action code or etn was updated but the local site missed the text bulletin (perhaps during a reboot), the MergeVTEC will update the warning record -in the local table.   The configuration file VTECPartners is +in the local table. The configuration file VTECPartners is critical in this process since it defines the adjacent sites from which to get the active table, as well as the site filtering for the VTECDecoder.

          -VTEC Merge
          -
          -The steps in the VTEC Table Merging process is in three -steps:   request, reply, and merge.  These steps use the -same communication protocol as the Intersite Coordination of Grids -technique. The steps on the diagram above are described below:
          -
          -Request
          -
          -1. The ifpServer starts the requestAT process on a user-specified -interval (defined in VTECPartners.py).
          -2.  The requestAT process writes out the requesting sites -identifier into a disk file.  The AWIPS MHS system works with -email attachements so this information must be stored somewhere.
          -3.  The requestAT process attempts to contact the daemon iscd on -the AWIPS mhs host (ds1 prior to OB7, dx1 OB7 and after). 
          -3a. The inetd process receives the message and starts the iscd daemon -process, if it isn't already running.
          -4. The requestAT process passes the information package to the iscd -daemon.
          -4a. The iscd daemon process spools the information to a disk file.
          -5. When the entire file is complete, the iscd daemon process calls the -msg_send to send the message.
          -5a. The msg_send process reads the spooled file.
          -6.  The msg_send process sends the message via the AWIPS Message -Handler System.
          -
          -Reply
          -
          -7. The remote site's Message Handler System spools the received -information to a temporary file.
          -8.  The Message Handler System calls the iscDataRec process.  -
          -9.  The iscDataRec process communicates the request with the -ifpServer.
          -10. The ifpServer process starts the sendAT process.
          -11. The sendAT process asks the ifpServer for the active table.
          -12.  The sendAT process spools the table to a temporary file.
          -13. The sendAT process attempts to contact the daemon iscd on the AWIPS -mhs (ds1 prior to OB7, dx1 OB7 and after).
          -13a. The inetd process receives the message and starts the iscd daemon -process, if it isn't already running.
          -14. The sendAT process passes the information package containing the -active table to the iscd daemon.
          -14a. The iscd daemon process spools the information to a disk file.
          -15. When the entire file is complete, the iscd daemon process calls the -msg_send to send the message to the requesting site.
          -15a. The msg_send process reads the spooled file.
          -16. The msg_send process sends the message via the AWIPS Message -Handler System.
          -
          -Merge
          -
          -17. The local site's Message Handler System spools the received -information to a temporary file.
          -18. The Message Handler System calls the iscDataRec process.
          -19. The iscDataRec process communicates the request with the ifpServer.
          -20. The ifpServer process starts the ingestAT process.
          -21.  The ingestAT process calls the MergeVTEC module to do the -merging.
          -22. The MergeVTEC module reads the spooled remote VTEC table, and the -local server's active table, performs the merge operation, and then -stores the updated active table.
          -
          -
          -
          +

          Product Formatting

          When a GFE Text Product is run, it first analyzes the GFE Hazards -weather element.   The Hazards grid contains areas of VTEC +weather element. The Hazards grid contains areas of VTEC phenomena and significance, such as WS.W for Winter Storm -Warning.   The Hazards grid contains the "Proposed" set of -hazards.  This is summed into a "Proposed" table.   The -"Active" table is retrieved through the ifpServer and the VTEC +Warning. The Hazards grid contains the "Proposed" set of +hazards. This is summed into a "Proposed" table. The +"Active" table is retrieved through EDEX and the VTEC Comparison module analyzes the proposed and active table and derives -the "Analyzed table".   The "Analyzed" table contains all of +the "Analyzed table". The "Analyzed" table contains all of the proper VTEC action strings and event tracking numbers based on the -VTEC Comparison logic.  For example, if there is a hazard in the +VTEC Comparison logic. For example, if there is a hazard in the active table but not in the proposed table, generally a "CAN" for -cancel is generated.   If there is a new hazard in the +cancel is generated. If there is a new hazard in the proposed table but not a matching one in the active table, then a "NEW" -is issued.  If the logic detects that the user has proposed a +is issued. If the logic detects that the user has proposed a larger area or a longer time for an existing hazard, then the appropriate EXT, EXA, or EXB action codes are generated.

          After the Analyzed table is complete, the hazards are filtered by -product, since not all products contain the same hazards.   +product, since not all products contain the same hazards. The GFE and GHG Text Generation modules create the output -product.   There is a fine line between the GFE and GHG text -generation portion of GFESuite.  They both use the GFE text -formatter infrastructure.  The GFE text formatters are for routine +product. There is a fine line between the GFE and GHG text +generation portion of GFESuite. They both use the GFE text +formatter infrastructure. The GFE text formatters are for routine forecast products and the GHG text formatters are for the watch, warning, and advisory products.

          -The Hazard weather element uses the auxilary data field capability of -Discrete data. The auxilary data field is only used in two cases with +The Hazard weather element uses the auxiliary data field capability of +Discrete data. The auxiliary data field is only used in two cases with Hazards. For convective watches (Tornado Watches and Severe Thunderstorm Watches), the Storm Prediction Center's (SPC) Event Tracking Number -is carried into the auxilary data field. This is used by the VTEC +is carried into the auxiliary data field. This is used by the VTEC logic to determine which watch (or watches) is depicted in the grids. -The second use for the auxilary data field is for GHG-style warning +The second use for the auxiliary data field is for GHG-style warning products. It is used to define a segment number for multi-segmented products.

          @@ -226,48 +161,28 @@ VTEC can be in one of five modes:
        12. Experimental VTEC in an Operational Product ("X")
        13. The mode is controlled by a single file contained in the -data/databases/BASE/TEXT/TextUtility -directory called VTECMessageType.TextUtility (which can be overridden +/awips2/cave/etc/gfe/userPython/textUtilities/regular +directory called VTECMessageType.py (which can be overridden at -the SITE level if necessary).  The product +the SITE level if necessary). The product category, e.g., WSW, should be placed in the file and the VTEC mode indicated by -one of the acceptable letters: "O", "T", "E", "X".  If a product +one of the acceptable letters: "O", "T", "E", "X". If a product category is not in this file, then VTEC is not enabled for that product.

          IMPORTANT: The file in BASE should -not be modified.  Instead the following technique should be +not be modified. Instead the following technique should be followed.
            -
          1. As the "installed user" (typically 'ifps' for AWIPS machines), go -to the ifpServer data directories and find the file   -...data/databases/BASE/TEXT/TextUtility/VTECMessageType.TextUtility.
          2. -
          3. chmod 644 VTECMessageType.TextUtility  (to make it writable)
          4. -
          5. Start a GFE as user "SITE".  Choose GFE -> Define Text -Products.  From the Define Text Products Dialog's Text Utilities -column, find VTECMessageType.  MB3 press over the entry and select -Modify.
          6. -
          7. The Python editor window will appear with the current contents of -the VTECMessageType file.  This will be a copy of the BASE version -if these steps have not been previously done, or your last -modifications to this file.
          8. +
          9. Open the localization perspective and browse to the GFE->TextUtilities.
          10. +
          11. Open the BASE level VTECMessageType.py.
          12. Comment in or out the appropriate lines in the file to -enable/disable VTEC.   Change the message type as appropriate +enable/disable VTEC. Change the message type as appropriate to one of the allowable codes: O, T, E, or X.
          13. -
          14. Save the file, and exit the Python editor.  Exit the GFE.
          15. -
          16. As the "installed user" (typically 'ifps' for AWIPS machines), go -to the ifpServer data directories and find the file -.../data/databases/BASE/TEXT/TextUtility/VTECMessageType.TextUtility.
          17. -
          18. chmod 444 VTECMessageType.TextUtility (to make it read-only)
          19. -
          20. Go to the SITE version of this file:  -.../data/databases/SITE/TEXT/TextUtility/VTECMessageType.TextUtility.
          21. -
          22. chmod 444 VTECMessageType.TextUtility (to make it read-only)
          23. +
          24. Use the File->Save As option to save the file as SITE, and exit the + Python editor. Exit the Localization perspective.
          -By making the file read-only, the GFE will not allow the file to be -modified.  You do not want anyone overriding the values in this -file or you will get inconsistent VTEC coding in the product -formatters.

          The default provided VTECMessageType enables "O" operational VTEC for all products except for the MWS, where VTEC is still experimental "X". @@ -441,18 +356,18 @@ the active table.

          The VTEC Decoder writes to the "Active Table" via exclusive write locking.  A backup copy of the "Active Table" is made after each -modification.  The VTECPartner's VTEC_BACKUP_TABLE_PURGE_TIME +modification. The VTECPartner's VTEC_BACKUP_TABLE_PURGE_TIME specifies the number of hours in which to keep backup copies.


          -

          AWIPS D2D Setup for GFESuite VTEC
          +

          AWIPS D2D Setup for GFESuite VTEC - NOT UPDATED

          The AWIPS NotifyTextProd processes will look for /awips/GFESuite/primary/data/acquire/notifyPattern.txt and /awips/GFESuite/svcbu/data/acquire/notifyPattern.txt.  That file contains routing information for incoming text bulletins based on a WMO -pattern.  Example contents of the "open" file is:
          +pattern. Example contents of the "open" file is:

          #This file is for NotifyTextProd to start the VTECDecoder whenever certain

          IMPORTANT CONFIGURATION:  Once your site has installed OB6, you should add the following to your localConfig file to take advantage of -the extra filtering, but only if you are running IFPS17.6.*.  +the extra filtering, but only if you are running IFPS17.6.*. Versions post IFPS17.6 are automatically configured for the extra filtering.

          @@ -666,10 +581,10 @@ NotifyTextProd in localConfig for additional information.


          Synchronization of the -Active Table from Backup Sites
          +Active Table from Backup Sites - NOT UPDATED

          Synchronization of the Active Table from Backup Sites is used to ensure -that your VTEC table is always up-to-date.   It comes in +that your VTEC table is always up-to-date. It comes in especially handy when you enter service backup and you need the latest active table.  Based on the clock, the ifpServer will make a request for adjacent site's active table.  The remote site(s) @@ -742,14 +657,14 @@ localVTECPartners documentation.


          Debugging/Examining the Active, -Proposed, and Analyzed Tables
          +Proposed, and Analyzed Tables - NOT UPDATED

          The key to VTEC is the correct merging of the proposed and active -table.   For diagnostics, the logging preferences file may be +table. For diagnostics, the logging preferences file may be edited to turn on the verbose and debug output for the VTECDecoder, -VTEC Merging, and product formatting.   The contents of the +VTEC Merging, and product formatting. The contents of the analyzed table will be output at each step of the VTEC -comparison.  This is quite helpful for debugging.
          +comparison. This is quite helpful for debugging.

          For formatters, you will want to enable the debugging for HazardsTable.py.  Here is the complete @@ -1002,9 +917,9 @@ indicates that the event tracking number has not yet been determined.
          @@ -1022,7 +937,7 @@ convective watch with ETN or a segment descriptor.
          @@ -1118,23 +1033,22 @@ or run the test products from the Fcst database while running the official products from the Official database.


          -

          Important Log Files

          +

          Important Log Files - NOT COMPLETE

          There are several log files that contain pertient information about the -VTEC operation.  These are the primary log files:
          +VTEC operation. These are the primary log files:
          Seg
          The assigned segment -number.  This is normally zero for the analyzed and proposed -tables.  The segment number from the VTECDecoder indicates the -ordering of the product.   The proposed table normally does +number. This is normally zero for the analyzed and proposed +tables. The segment number from the VTECDecoder indicates the +ordering of the product. The proposed table normally does not have this entry, except that the forecaster may define a hazard with different segements to aid the hazard formatters in formatting the product.
          @@ -1014,7 +929,7 @@ product.
          Key
          The key is the Discrete Key that -was found in the grids.  Keys with a colon and a number reflect a +was found in the grids. Keys with a colon and a number reflect a convective watch with ETN or a segment descriptor.
          Zone
          The zone is the geographical -identifier or UGC.  UGCs may be Zone or FIPS.  They are edit +identifier or UGC. UGCs may be Zone or FIPS.  They are edit area names for the proposed table and the decoded UGC identifiers for the active table.
          - - - - -
          VTECDecoder
          +
          edex-ingest*
          Logs from the VTEC Decoder, which shows the decoding of each received product and how the VTEC -active table is being changed.  Also logs "yellow banner" -notifications.
          +active table is being changed.
          ifpText*
          +
          cave* in the user caveData subdirectory
          Formatter logs, which contain information about the processing of the Hazards grid and active table, @@ -1143,21 +1057,21 @@ headlines.
          ingestAT*
          +
          edex-ingest-text*
          Received active table logs, showing the records that were merged into your active table.
          requestAT*
          +
          edex-request-productSrvRequest* ??
          Log showing requests from your site to other sites for active tables.
          sendAT*
          +
          ??
          Log showing the sending of the active table from your site to other sites.
          @@ -1166,14 +1080,14 @@ active table from your site to other sites.

          -There are secondary log files that are part of the Intersite +There is a secondary log file that are part of the Intersite Coordination part of the software that also contain some transaction information:
          -

          Back to Table Of Contents


          diff --git a/cave/com.raytheon.viz.gfe/help/VTECPartners.html b/cave/com.raytheon.viz.gfe/help/VTECPartners.html index 6eca85a650..0550f94a8a 100644 --- a/cave/com.raytheon.viz.gfe/help/VTECPartners.html +++ b/cave/com.raytheon.viz.gfe/help/VTECPartners.html @@ -9,8 +9,8 @@ VTECPartners.py -

          VTECPartners.py

          -October 31, 2007
          +

          VTECPartners

          +December 30, 2011

          Table of Contents
          @@ -52,7 +52,7 @@ used to override baseline entries in the VTECPartners.py file.
          @@ -232,7 +232,8 @@ CHANGE ANY CODE BELOW THIS NOTICE

          Modification Technique

          The modification technique requires the user to create a -localVTECPartners.py file in the etc/SITE directory and then override +localVTECPartners.py file in the /awips2/edex/data/utility/common_static/site/SITE_ID/vtec +directory and then override just those elements required.  Refer to the localVTECPartners.py documentation.

          @@ -254,13 +255,14 @@ Sharing of the VTEC active table is accomplished through these steps:
        14. Enabling your site to respond to other requests for your active table.
        15. Enabling your site to request other sites active table.
        16. -
        17. Restarting the ifpServer.
          +
        18. Restarting the EDEX.
        19. Refer to the localVTECPartners.py documentation for more details on the syntax of the localVTECPartners.py file.  Basically you will create a file in -.../etc/SITE called localVTECPartners.py and it will contain at least +/awips2/edex/data/utility/common_static/site/SITE_ID/vtec +called localVTECPartners.py and it will contain at least the following information:

          import @@ -288,18 +290,18 @@ such as:
          = ['DVN','DMX']


          After you have enabled the sharing, you should examine your ingestAT, sendAT, requestAT, iscDataRec log + href="VTEC.html#LogFiles">ingestAT, dumpAT, iscDataRec log files to ensure operations are working as desired.

          -Note: Starting with OB8.3, the sites specified in +Note: The sites specified in VTEC_TABLE_REQUEST_SITES do not represent AWIPS physical sites, but -ifpServers running the specified site domain.  Thus if you specify -'DMX', the software will discover all of the ifpServers on the network -running the domain 'DMX' and choose one of the ifpServers to request -the VTEC table updates from.   The software will first try to +EDEX servers running the specified site domain.  Thus if you specify +'DMX', the software will discover all of the EDEX servers on the network +running the domain 'DMX' and choose one of the servers to request +the VTEC table updates from.  The software will first try to find a message handler ID that matches the domain id, with the known -primary ifpServer location (dx4/98000000), and then will check other +primary GFE location (dx3/98000000), and then will check other hosts and ports and perhaps different message handler ids for the 'DMX' domain.  The log files will indicate where the requests are sent.

          diff --git a/cave/com.raytheon.viz.gfe/help/ViewWCL.html b/cave/com.raytheon.viz.gfe/help/ViewWCL.html index 21d8b31188..1102c46e3a 100644 --- a/cave/com.raytheon.viz.gfe/help/ViewWCL.html +++ b/cave/com.raytheon.viz.gfe/help/ViewWCL.html @@ -139,13 +139,13 @@ for display and coordination only.
          iscd, iscDataRec
          +
          iscDataRec
          Transmitted and Received ISC log files.
          @@ -2208,9 +2122,7 @@ WS.W (WINTER STORM WARNING),
          Contains a list of request sites.  These are the AWIPS site identifiers (nominally -3-letters).  Requests will be sent from the ifpServer to these +3-letters).  Requests will be sent from EDEX to these sites at the interval specified in the VTEC_REMOTE_TABLE_FETCH_TIME entry.

          Here is an example of a WCL grid with two watches displayed. The -brighter blue
          +brighter blue region is the new (proposed) Severe Thunderstorm Watch. The darker red -area to
          +area to the southeast is an existing Tornado Watch. The purple area between -them are counties
          +them are counties which are currently under the Tornado Watch, but will be under the -Severe Thunderstorm
          +Severe Thunderstorm Watch when it is issued.

          WCL Grid 2

          How It Works

          -The ViewWCL procedure reads in saved data written into the ifpServer -databases by the VTEC Decoder.  The data +The ViewWCL procedure reads in saved data written into the EDEX +databases by the VTEC Decoder. The data contains the watch type, the ugc list of counties, the WCL issuance time, and the WCL expiration time.  The procedure then filters the VTEC active table and extracts records that meet all of the following @@ -170,7 +170,7 @@ The final steps are:
          • The procedure calculates the starting and ending time of the "to-be-created" grid by encompassing all events that were filtered, -plus the issuance and expiration time. 
            +plus the issuance and expiration time.
          • Any existing ProposedWatches grids are removed from the GFE.
          • Comparisons are made between the proposed WCL watch and the @@ -178,10 +178,5 @@ active table information to determine the correct "category" for display.
          • The temporary ProposedWatches grid is created and displayed.
          -
          -
          -
          -
          -
          diff --git a/cave/com.raytheon.viz.gfe/help/VirtualParm.html b/cave/com.raytheon.viz.gfe/help/VirtualParm.html index a5b75403f0..6b3fd2557c 100644 --- a/cave/com.raytheon.viz.gfe/help/VirtualParm.html +++ b/cave/com.raytheon.viz.gfe/help/VirtualParm.html @@ -12,7 +12,7 @@

          Virtual Weather Elements Configuration

          -
          May 21, 2004
          +
          February 17, 2012

          @@ -27,34 +27,16 @@ weather element capability of the GFESuite.

          NOTE: This release does not support configurable virtual weather elements, thus -this documentation is incomplete. 
          +this documentation is incomplete.

          Virtual weather elements are enabled for the ISC weather elements MinT, -MaxT, SnowAmt, QPF, and PoP.  See the Intersite +MaxT, SnowAmt, QPF, and PoP. See the Intersite Coordination User's Guide for more details.


          +

          Back to TOC
          -


          -

          Back to Table Of Contents
          -  -
          -  -
          -  -
          -  -
          -  -
          -  -
          -  -
          -  -

          diff --git a/cave/com.raytheon.viz.gfe/help/baseSiteUserConcept.html b/cave/com.raytheon.viz.gfe/help/baseSiteUserConcept.html index d5210a6894..c580f0bdab 100644 --- a/cave/com.raytheon.viz.gfe/help/baseSiteUserConcept.html +++ b/cave/com.raytheon.viz.gfe/help/baseSiteUserConcept.html @@ -12,7 +12,7 @@

          GFESuite Configurability - BASE, SITE, USER Concept

          -
          January 10, 2005
          +
          February 17, 2012

          Table of Contents
          @@ -52,37 +52,37 @@ Programs Other Than the GFE Affected by the BASE, SITE, USER Concept? The GFESuite software uses the concept of site and user overrides. This permits the installed files from the software distribution to not interfere -with local modifications.  Installed files are called BASE -files.  +with local modifications. Installed files are called BASE +files. A site can choose to make changes or override the BASE files by installing -the sites's files in the SITE area.  An individual user can +the sites's files in the SITE area. An individual user can override the BASE and SITE definitions by installing custom user files in the USER -area.  Files under the BASE directories +area. Files under the BASE directories should NEVER be modified by the site or they will be overwritten on the next upgrade. -

          Upon request of data from the ifpServer, the server will first look -for data in the customized user directory.  If the requested data -is found, it is returned.  If not found, the server then looks in -the site directory.  If the requested data is found there, it is -returned.  -If not found, then the server looks in the base directory.  If the -requested data is found in the base directory, it is returned.  If +

          Upon request of data from EDEX, the server will first look +for data in the customized user directory. If the requested data +is found, it is returned. If not found, the server then looks in +the site directory. If the requested data is found there, it is +returned. +If not found, then the server looks in the base directory. If the +requested data is found in the base directory, it is returned. If not found, an error is returned.

          -

          Upon storage of data to the ifpServer, the server will always try to -write into the customized user directory.  If it is successful, +

          Upon storage of data to EDEX, the server will always try to +write into the customized user directory. If it is successful, subsequent reads of the data will always be returned via the customized version of the file.

          -

          Data is retrieved from the ifpServer using different identifiers, +

          Data is retrieved from EDEX using different identifiers, which identify the name of an entity, but not its location (e.g., BASE, SITE, -USER).  When that data is retrieved, the client can then determine +USER). When that data is retrieved, the client can then determine where the data was retrieved.

          There are some special cases: @@ -90,26 +90,22 @@ where the data was retrieved.

          • Server configuration files are not -stored in the server, but still use the concept of BASE and SITE.  +stored in the server, but still use the concept of BASE and SITE. There are no USER-type files for the server configuration since there is only one server per site. See the server configuration information for details.
          • -
          • Grids, topography, and map backgrounds data available through the -ifpServer -are available at only one level.  There is no override capability -for this type of data through the server.  In other words, every -user -of an ifpServer will "see" the identical set of grids, topography, and -map backgrounds.  There aren't separate databases for BASE -Forecast -and SITE or USER Forecast.
          • +
          • Grids, topography, and map backgrounds data available through EDEX +are available at only one level. There is no override capability +for this type of data through the server. In other words, every +user of an EDEX will "see" the identical set of grids, topography, and +map backgrounds. There aren't separate databases for BASE +Forecast and SITE or USER Forecast.
          Some of the files stored in the server are Python files, and others are -non-Python files.  With the non-Python files, you get the choice -of +non-Python files. With the non-Python files, you get the choice of a complete override of SITE and BASE files, i.e., you can't do a simple -merge.  With the Python files, you can either do a complete +merge. With the Python files, you can either do a complete override using SITE and BASE or you can use the Python "import" statement to do partial overrides. @@ -120,17 +116,16 @@ Retrieval Using the BASE, SITE, USER Concept The following illustration shows examples of the files that will be retrieved -by a user.  The search path for users will always be the USER +by a user. The search path for users will always be the USER directory -first, then the SITE followed by the BASE.  If the file is not +first, then the SITE followed by the BASE. If the file is not found, -an error will be returned.  Files in the SITE override files in +an error will be returned. Files in the SITE override files in the -BASE directory.  Files in each USER directory override files in +BASE directory. Files in each USER directory override files in the BASE and SITE.

          Non-Python Case


          This example applies to .

          This table illustrates the different conditions and what file is -retrieved -based on a USER, and based on a user called SITE (which is the site -administrator). +retrieved based on a USER, and based on SITE.

          -  @@ -208,7 +199,6 @@ administrator).


          Python Case


          @@ -219,7 +209,6 @@ arrows indicate the import path as defined in the actual files, the red arrows indicate the final result):

          @@ -292,9 +281,9 @@ indicate the final result):


          Note that for the Python "n" case, the BASE "n" is hidden from the -USER since there is already an "n" in USER.  Therefore a USER who +USER since there is already an "n" in USER. Therefore a USER who uses an "import n" statement in one of the files will not see the BASE -"n", but will see the USER "n".  There is no way to specify in an +"n", but will see the USER "n". There is no way to specify in an import statement whether you want BASE or SITE or USER. In the case of USER "r", no imports were performed at all.
          @@ -305,24 +294,19 @@ Using the BASE, SITE, USER Concept The following illustration shows examples of the files that will be stored -by a user.  The storage path for users is always the USER -directory.   +by a user. The storage path for users is always the USER +directory. If the file is read-only, attempts to store a file with the same name -will -fail. +will fail.

          This table illustrates the different conditions and what file is stored -based on a USER, and based on a user called SITE (which is the site -administrator).   -File "e" in USER is read-only in this example.  Attempts to write -over "e" will fail.  File "a" is located in BASE and a new one is -written to USER.  Even though "a" in BASE is read-only, the user -may -write a file into USER under the same name. +based on a USER, and based on SITE. +File "e" in USER is read-only in this example. Attempts to write +over "e" will fail. File "a" is located in BASE and a new one is +written to USER. Even though "a" in BASE is read-only, the user +may write a file into USER under the same name.

          @@ -392,31 +376,28 @@ write a file into USER under the same name. Multiple users, as long as their login name or specified user name are different, are isolated from each other. This allows individuals to create -their own special set of edit areas, smart tools,  and GFE +their own special set of edit areas, smart tools, and GFE configurations without affecting other users.

          It is quite possible, and probable, to have two different clients, such -as GFEs, running under the same user login name.  This case is not +as GFEs, running under the same user login name. This case is not treated as two different users.

          The following illustration shows examples of the files that will be -stored by two users with different login names.  The storage path -for users is always the USERx directory.   If the file is -read-only, +stored by two users with different login names. The storage path +for users is always the USER directory. If the file is read-only, then attempts to store a file with the same name will fail.

          The table illustrates the different conditions and what file is stored -based two users, USER1 and USER1.  In this example, there are no +based two users, USER1 and USER1. In this example, there are no read-only -files in USER1 or USER2.  Examples are shown for the non-Python files, which don't use the import facility.

          @@ -488,12 +469,12 @@ non-Python files, which don't use the import facility.

          The following illustration shows examples of the files that will be -retrieved by two users.  The search path for users is always the +retrieved by two users. The search path for users is always the USER -directory first, then the SITE followed by the BASE.  If the file -is not found, then an error will be returned.  Files in the SITE +directory first, then the SITE followed by the BASE. If the file +is not found, then an error will be returned. Files in the SITE override -files in the BASE directory.  Files in each USER directory +files in the BASE directory. Files in each USER directory override files in the BASE and SITE.

          @@ -503,14 +484,9 @@ just the user that matches the login name.

          The table illustrates the different conditions and what file is retrieved -based on a user, and based on a user called SITE (which is the site -administrator). +based on a user, and based on SITE.

          -  -

          @@ -582,14 +558,12 @@ the following table. If the BASE, SITE, USER concept is used, then the site can override the initial installation files (BASE), and an individual user -can override the sites's files.  If there is a "Python 'import' +can override the sites's files. If there is a "Python 'import' capability" for a particular data type, that permits partial overrides by using the Python "import" statement to pull in additional files.

          @@ -660,7 +634,7 @@ Element Groups configurations, and color table)
          @@ -717,7 +691,7 @@ configuration guide. @@ -750,13 +724,11 @@ BASE, SITE, and USER Files Located? The location of the server configuration files are shown in the table below:
          NO - this is a special case that -does not use the BASE/SITE/User concept.  All files are written +does not use the BASE/SITE/User concept. All files are written into the SITE-level regardless of user.
          NO
          @@ -671,7 +645,7 @@ into the SITE-level regardless of user.
          products)
          NO - this is a special case that -does not use the BASE/SITE/User concept.  +does not use the BASE/SITE/User concept. All files are written into the SITE-level regardless of user. YES
          GFE Configurations YES. The implementation is done differently than described -here.  +here. For information, see the GFE configuration guide.
          - @@ -764,30 +736,29 @@ below: - - + - - + - - +
          File Purpose Part of Standard ReleaseRPP File Location AWIPS File Location
          yes
          ~/release/data/databases/BASE/*/awips/GFESuite/primary/data/databases/BASE/*/awips2/edex/data/utility/common_static/base/gfe/*
          + /awips2/cave/etc/gfe/userPython/*
          SITE customized files
          no
          ~/release/data/databases/SITE/*/awips/GFESuite/primary/data/databases/SITE/*/awips2/edex/data/utility/common_static/site/site/gfe/*
          + /awips2/edex/data/utility/cave_static/site/site/gfe/userPython/*
          USER customized files
          no
          ~/release/data/databases/username/*/awips/GFESuite/primary/data/databases/username/*/awips2/edex/data/utility/common_static/user/username/gfe/*
          + /awips2/edex/data/utility/cave_static/user/username/gfe/userPython/*
          -

          The BASE files should never be modified.  SITE modifications -are -done in the SITE directories.  User modifications are done in each +

          The BASE files should never be modified. SITE modifications are +done in the SITE directories. User modifications are done in each individual user directory structure.

          @@ -797,70 +768,38 @@ Whether I Am a USER or a SITE? Many of the files supported in this hierarchical scheme are written/controlled -from the GFE.  Starting the GFE with the correct command line -switch -will set the user name appropriately.  Use the user name "SITE" to -become the site administrator.  The command line for the GFE -includes -a "-u" switch to indicate a specific user.  If no user name is -specified, -then the user's login name will be used for the user identifier. -

          Example of starting the GFE to be user "xyz": -

          -

          runGFE -u xyz -

          -

          Example of starting the GFE to be the site administrator: -

          -

          runGFE -u SITE -
          -

          +from the GFE. In AWIPS2, all users are logged in with their assigned +system user id. The software does not treat user vs. site as user +accounts. Site level modifications by users are permitted.

          How Do I Make Modifications to the SITE Files?

          Making modifications to the SITE files can be accomplished two ways:
            -
          1. Start the GFE with the "-u SITE" switch.  The GFE will -access the -server in SITE administrator mode.
          2. +
          3. Start the Localization perspective and make any changes.
          4. Go to the UNIX file system and edit, copy, move, or delete files -from -under -the SITE/* directory.  You can copy files from the BASE/* +from under +the SITE/* directory. You can copy files from the BASE/* directories, but make NO changes to the BASE/* directories or files.
          +

          EDEX and CAVE must be restarted for any changes in common_static. CAVE must +be restarted for any changes in CAVE configuration.


          How Do I Make Modifications to the USER Files?

          -Making modifications to the USER files are simply accomplished by -starting -the GFE with the correct user identifier.  If your login name is -the -correct user identifier, then simply start the GFE with: -

          runGFE -

          -

          If the login name is not the correct user identifier, start the GFE -by specifying the appropriate user identifier on the command line: -

          -

          runGFE -u username -

          -

          -
          -

          How Do I Define a New USER?

          -There are no special files to set up a new user.  The GFESuite -will -simply use the new user specified on the command line. -

          +Making modifications to the USER files are accomplished the same way +as SITE level modifications (see paragraph above).

          Are Programs Other Than the GFE Affected by the BASE, SITE, USER Concept?

          All other GFESuite programs, including ifpIMAGE, and ifpAG, use the BASE, SITE, USER -concept.  -These programs take a "-u" switch to specify the user name.  By +concept. +These programs take a "-u" switch to specify the user name. By default, if the user name is not specified, in which case the SITE user name is used. @@ -868,28 +807,16 @@ used. programs, it is unlikely that you would want individual user configurations to affect -the output.  Therefore the default is SITE. +the output. Therefore the default is SITE.



          Back To Top
          -Back To Table Of Contents +Back To TOC

          +

          -  -
          -  -
          -  -
          -  -
          -  -
          -  diff --git a/cave/com.raytheon.viz.gfe/help/d2dWENames.html b/cave/com.raytheon.viz.gfe/help/d2dWENames.html index 1e1a315e30..9f1f092d80 100644 --- a/cave/com.raytheon.viz.gfe/help/d2dWENames.html +++ b/cave/com.raytheon.viz.gfe/help/d2dWENames.html @@ -13,12 +13,12 @@

          D2D Weather Element Names


          -May 12, 2004
          +January 9, 2012

          -
          Note:  For the most +
          Note:  For the most accurate -information, please use the ncdump command and examine the model data -files +information, please use the hdfview +utility and examine the model data files directly.

          @@ -605,11 +605,7 @@ BL030 BL3060 BL6090 BL90120 BL120150




          -  -
          diff --git a/cave/com.raytheon.viz.gfe/help/directoryLayout.html b/cave/com.raytheon.viz.gfe/help/directoryLayout.html index ca62c39452..7d5f0eaddc 100644 --- a/cave/com.raytheon.viz.gfe/help/directoryLayout.html +++ b/cave/com.raytheon.viz.gfe/help/directoryLayout.html @@ -12,13 +12,15 @@

          GFESuite Directory Layout

          -
          July 23, 2007
          +
          March 27, 2012

          Table of Contents

          Overview
          -Top-Level Runtime Directory +EDEX Top-Level Runtime Directory +
          +CAVE Top-Level Runtime Directory
          Database Directory Structure
          @@ -27,292 +29,152 @@ GFESuite Directory Layout Model Data / Forecast Data File Structure
          -Daily Forecast Critique (dfc) -Directory -Structure -
          -VTEC Directory Structure
          -acquire Directory Structure
          -Text Install Directory Structure
          +Text Products Directory Structure
          MHS Directory Structure

          Overview

          This document describes the install and runtime directory structure for -the  AWIPS and RPP sites.  The only difference in the -directory -structure is the name of the top-level directory.  On AWIPS, the -top-level -directory is /awips/GFESuite/primary or /awips/GFESuite/svcbu on the px -machine, and /awips/GFESuite on the lx machine.  On the RPP -machines, it is normally -$HOME/release.  A description of each file and its purpose is -included.  -The directory tree is described in six parts: +the AWIPS sites. In AWIPS2, directories are split up into EDEX side (server) and +CAVE side (client). On both sides, the top-level directory is /awips2, however +EDEX operations are mainly run on dx3/dx4, with data management (PyPies) on dx1. +CAVE operations and directory structure reside on lx/xt workstations. +This page describes *SOME* of the important directories accessed by GFE. +The directory tree is described in the following parts:



          -

          Top - Level Runtime +

          EDEX Top - Level Runtime Directory

          The top-level runtime directory consists of several other directories. The top-level directories are:
          -  - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + +
          Top-Level Directories Top-Level EDEX Directories
          Directory Name Purpose
          datatop-level data directoryedextop-level data and executables
          doctop-level documentation directory
          productstop-level products directory
          bintop-level executables and scripts directory
          etctop-level configuration directory
          examplestop-level examples directory
          BADholding location for bad database files, ifpServer moves -invalid database -files into this directory.  Sometimes other files that the server -cannot recognize are also moved here. Files located here are deleted -after -seven days.
          -
          patchlocation for "saved" versions of files when a patch is -installed.
          -
          GFESuitetop-level utilities, data and Service Backup
          -

          Top
          -

          The following tables describe files and directory structures within each of the top-level directories:

          -  - + - - + + + + + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
          Data Directories EDEX Sub-Directories
          Filename or Directory Name Purpose
          data/databasestop-level databases directoryedex/bintop-level configuration and startup scripts
          edex/confTop-level edex configuration for logs and services
          data/climoTop-level file for climate data.edex/dataTop-level data, utilities and edex configuration files including localizations + and vcmodule for virtual ISC displays
          data/climo/NCDClocation NCDC climate data filesedex/etcruntime parameters for different edex runtime levels and services like ingest/request
          data/climo/PRISMlocation of PRISM climate data filesedex/liblocation of libraries used by edex
          data/logfileslocation of logfilesedex/logsedex logfiles
          data/mapsinput shapefiles for map generation program
          data/topoinput topography data for topography generation program
          data/dfctop-level Daily Forecast Critique directory
          data/vtec
          -
          directory containing vtec data -files (e.g., active table)
          -
          data/vtec/backup
          -
          directory containing backup -versions of the active table. The MergeTable and VTECDecoder create -backup versions each time the active table changes.
          -
          data/vtec/spool
          -
          directory containing spooled -received -text data from NotifyTextProd (D2D AWIPS process) to be decoded by the -VTEC Decoder.
          -
          data/textInstall
          -
          installation directory -containing templates for the various product formatters.
          -
          data/acquire
          -
          directory containing text -routing table for D2D's NotifyTextProd.  Associated with VTEC.
          -
          edex/webappsscripts run by uengine

          -

           
          -  - + - - + + - - + + - - - - - - +
          Documentation Directories Relevant Top-Level CAVE Directories
          Filename or Directory Name Purpose
          doc/onlinehelplocation of all on-line help *.html filesalertvizAlertViz executables and settings
          doc/testlocation of all test plans *.html files. Numerous -subdirectories are below this top-levelcavecave configurations and executables including cave.sh
          doc/onlinehelp/imageslocation of all on-line help image files
          -
          doc/onlinehelp/xxx
          -
          document directories containing -additional *.html and image files.
          +
          GFESuitecommand line interface executables for GFE

          -  -


          - + - - - - - - - - - - - - - - - - - - - - - - + - - + + + + + + + + + +
          Product Directories Important CAVE Sub-Directories
          Filename or Directory Name Purpose
          products/AGdefault location for output of ascii grid files from ifpAG -product generation
          products/IMAGEdefault location for output of image (PNGs) from ifpIMAGE -product generation
          products/TEXTrecommended location for output of TEXT from GFESuite text -product -generation
          products/ISClocation of files produced for the intersite coordination of -grids -facility by the ifpnetCDF program.
          products/NETCDFrecommended location for output of NETCDF files from ifpnetCDF -program.
          products/ATBL
          -
          location of incoming/outgoing -temporary files for VTEC active table merging
          +
          cave/etc/gfeGFE base level tools, procedures, utilities and configurations
          products/PRACTICE
          -
          location of practice mode text -products. Product files are timestamped and named with their pil.
          -
          cave/etc/ghgGHG monitor executables and configurations
          cave/configurationEclipse runtime settings
          GFESuite/binlocation of command line interface executables


          -

            -
          -

          -

            +

          - + @@ -322,38 +184,20 @@ products. Product files are timestamped and named with their pil.
          - - - - +for AWIPS map coordinates to lat/lon and vice versa - + +show database notifications from EDEX - - - - - - + + - - - - @@ -375,12 +213,6 @@ notifications from the ifpServer - - - - - - - - @@ -413,34 +239,12 @@ program - - - - - - - - - - - - - - - - @@ -448,20 +252,6 @@ generating a netcdf file from text
          a specified database.
          - - - - - - - - - - - - @@ -474,708 +264,99 @@ scripts and programs are not intended to be run directly. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Executable and Script Directories (bin) Executable and Script Directories (/awips2/GFESuite/bin)
          Filename or Directory Name Purpose Configure Text Products utility for querying the afos2awips.txt table for PILs, deleting, and recreating product templates.
          bin/coordConversioncoordinate conversion utility -for -AWIPS map coordinates to lat/lon and vice versa
          bin/dumpAT VTEC active table dump utility -for -AWIPS map coordinates to lat/lon and vice versa
          bin/getNotifybin/getNotify.py notification debug utility to -show database -notifications from the ifpServer
          bin/gfehandleOUP
          -
          GFE interface to the handleOUP -(AWIPS D2D) call.  Sets up the correct environment.
          -
          bin/gfetextdb
          -
          GFE interface to the textdb -(AWIPS D2D) call.  Sets up the correct environment.
          -
          bin/gfeclient.sha wrapper script that allows to execute command line scripts in EDEX
          bin/ghgMonitor
          @@ -361,12 +205,6 @@ notifications from the ifpServer
          GHG Monitor Program
          bin/gpython
          -
          Python interpreter using the GFE.
          -
          bin/ifpAG ifpAG executable bin/ifpBreakAllLocks script to break all locks in the server
          bin/ifpDFCscript to run the interactive daily -forecast -critique viewer
          bin/ifpIMAGE script to run the GFE as the ifpIMAGE @@ -396,12 +228,6 @@ program bin/ifpnetCDF script to run the ifpnetCDF program.
          bin/ifpServerStatsprogram to examine network queues, directory structures, data -states -of the ifpServer
          bin/ifpServerText script to run the iscMosaic program
          bin/makeD2DFile
          -
          script to run the makeD2DFile program
          -
          bin/moveGFEData utility program to move gfe configuration data from one user to another
          bin/ncdumpncdump utility - useful for looking at netcdf files
          bin/ncgen
          -
          ncgen utility - useful for -generating a netcdf file from text
          -
          bin/publishGFEpublishGFE data utility
          bin/purgeAllGrids
          bin/runtop-level directory for executables and "hidden" -scripts.  These -scripts and programs are not intended to be run directly.
          bin/runGFEscript to start GFE
          bin/runIFPServerscript to start the ifpServer
          bin/runIFPText script to run text generation (GFE in background mode) bin/sendGfeMessage
          script to send messages to all -clients connected to the ifpServer, message appears on status bar
          +clients connected to EDEX, message appears in AlertViz
          bin/stopIFPServerscript to stop the ifpServer
          bin/VERSIONText file containing GFESuite version information
          bin/run/archiveObs
          +
          bin/VTECDecoder
          link to gfe executable
          +
          script to run VTEC decoder
          bin/run/archivePointFcst
          +
          bin/src
          link to gfe executable
          -
          bin/run/coordConversioncoordConversion -executable
          -
          bin/run/getNotify
          -
          getNotify executable
          -
          bin/run/gfe
          -
          GFE executable
          -
          bin/run/ghETN
          -
          Get Highest ETN - used by -WarnGen for some products
          -
          bin/run/ghgMonitor
          -
          link to gfe executable
          -
          bin/run/ifpAGifpAG executable
          bin/run/ifpBreakAllLocks
          -
          link to gfe executable
          -
          bin/run/ifpDFC
          -
          link to gfe executable
          -
          bin/run/ifpDFCArchiveroutine to run the archive programs for the daily forecast -critique
          bin/run/ifpIMAGE
          -
          link to gfe executable
          -
          bin/run/ifpInit
          -
          link to gfe executable
          -
          bin/run/ifpnetCDF
          -
          link to gfe exectuable
          -
          bin/run/ifpServerifpServer executable
          bin/run/ifpServerStats
          -
          ifpServerStats executable
          -
          bin/run/ifpServerText
          -
          link to gfe exectuable
          -
          bin/run/ingestAT
          -
          routine to ingest the VTEC active table from an adjacent site.
          -
          bin/run/iscExtract, bin/run/iscExtract1
          -
          Extraction script for intersite -coordination of grids
          bin/run/iscInjectInjection script for intersite -coordination of grids
          bin/run/iscMosaic
          -
          link to gfe executable
          -
          bin/run/MergeVTEC,
          -bin/run/MergeVTEC1
          -
          routine to run the MergeVTEC -program, which merges one active table with another
          -
          bin/run/moveGFEData
          -
          moveGFEData executable
          -
          bin/run/publishGFE
          -
          publishGFE executable
          -
          bin/run/purgeAllGrids
          -
          link to gfe executable
          -
          bin/run/requestAT
          -
          routine that is executed when a -request for the VTEC active table is received
          -
          bin/run/runIFPText
          -
          link to gfe executable
          -
          bin/run/runProcedure
          -
          link to gfe executable
          -
          bin/run/sendAT
          -
          routine to send the VTEC active table to a set of sites
          -
          bin/run/sendGfeMessage
          -
          link to gfe executable
          -
          bin/run/setupTextEA, -bin/run/setupTextEA1
          -
          script plus link to gfe -exectutable for the setupTextEA utility
          -
          bin/run/site.shsite configuration and directory location scripts - -automatically generated -upon install
          -
          bin/run/VTECDecoder, -bin/run/VTECDecoder1
          -
          VTEC product -decoder for decoding incoming text products and maintaining the -"active" table.
          +
          contains sub-directories with executables called by + the scripts listed in this table
          - - -

          -

          -

          -
          -
          -

          +etc/gfe (configuration) Important Directories - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +

          -Etc (configuration) Directory
          Filename or Directory Name Purpose
          etc/BASElocation of configuration files for BASE, which are provided -as part -of the release.  No one should make changes in this directory.combinationsdefault zone combo configuration
          etc/SITElocation of site-tailored configuration files, used to -override settings -from files in etc/BASE.editAreaGroupsdefault edit area groups
          etc/TclTklocation of Tcl/Tk release package used with GFESuiteeditAreasdefault edit areas
          etc/BASE/smartInit: GFS40.py, GFS80.py, NAM80.py, NAM40.py, -gfsLR.py, -NGM80.py, -RUC80.py, Init.py (others -may -be present)smart initialization scripts for -each -modelsampleSetsdefault sample sets
          etc/BASE/logPref: dfc.logPref, gfe.logPref, ifpIMAGE.logPref, -ifpServer.logPref, -isc.logPref (others may be present)logging preferences files for the daily forecast critique, -gfe, ifpIMAGE, -ifpServer, and isc programsuserPythonbaseline smart tools, procedures, gfeConfig files, text products, text utilities, + and other utilities used by tools and procedures
          etc/BASE/gfe.zipBundled GFE Python library
          etc/BASE/idleConfig.txt, idleConfig-unix.txtPython idle editor configuration file
          etc/BASE/ifpcc.so, ifpc.py, logstream.pyPython IFPServer protocol files
          etc/BASE/iscSendRouteBASE.py, etc/BASE/iscSendRouteSVCBCK.pyIntersite and Intrasite -Transmission -Routing Configuration
          etc/BASE/MapFiles.pyMap background configuration file -containing -the names of the map shapefiles
          etc/BASE/Maps.pyMap background configuration file
          etc/BASE/pylib.zipBundled Python library
          etc/BASE/serverConfig.pyifpServer configuration file
          etc/BASE/VTECMessageType.py
          -
          Master control file to -enable/disable VTEC in GFE formatters.
          -
          etc/BASE/VTECPartners.py
          -
          VTEC -configuration file for active table merges, decodes, and coordination -requests.
          -
          etc/SITE/localVTECPartners.py
          -
          Site override file for -VTECPartners.py.
          -
          etc/BASE/siteConfig.pysite configuration and directory location file - -automatically generated -upon install
          etc/BASE/lib-dynloadDynamically loaded Python libraries
          etc/BASE/noaalogo2.png, nwslogo.pngLogo files for the ifpIMAGE -program.
          etc/SITE/iscSendRouteSITE.pyUser created override script for outgoing ISC traffic -routing. Intersite -and Intrasite Transmission Routing ConfigurationweGroupsdefault weather element groups

          -  -
          -  - + - - + + - - - - - - - - - - - - - - + +
          Examples Directory etc/ghg Sub-Directory
          Filename or Directory Name Purpose
          examples/proceduresdirectory containing examples of proceduresconfigcontains default GHG monitor configuration file
          examples/smartToolsdirectory containing examples of smart tools
          examples/textProductsdirectory containing examples of text products
          examples/utilitiesdirectory containing examples of utilities
          examples/smartInit
          -
          directory containing examples of -smart initialization modules
          -
          userPythoncontains the MakeHazard utility and TCMETNDecoder

          -


          -
          -

          - - - - - - - - - - - -
          Patch Directory
          Filename or Directory NamePurpose
          patch/yyyymmdd_hhmmtop-level patch directory. The name of the directory matches -the date/time of the patch identifier. The number of subdirectories -under this directory is based on which files got replaced during the -patch.
          -


          -
          -


          Database Directory Structure

          -
          The top-level directory -from the view of the ifpServer is the databases directory.  -Beneath -that is the BASE, SITE, and all of the user directories.  Within -each -set of user directories are configuration, tools, and other -user-specific -files.  For more information on the BASE, SITE, and USER concept, -see the base, site, and user -concept -guide. -

          -

          The structure within each of the BASE, SITE, and USER directories is -identical, except that the BASE directory has additional items.  -It -is possible that there aren't any SITE or USER directories on the -system -if there haven't been any local configuration changes to the system. -

          -

          Each of these directory structures contain: -
          -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Directory NameDescriptionFormatPart of Release
          GRIDgrid databases -containing grids -for models, Forecast, and Official databases (BASE only)BinaryCreated during first run of ifpServer.
          MAPSmap background cache files (BASE only)Ascii/BinaryCreated during first run of ifpServer.
          TOPOtopography cache files (BASE only)AsciiCreated during first run of ifpServer.
          LOCKgrid database (BASE only) and text file lock filesAsciiCreated during first lock request.
          COLORTABLEcolor table definitions BinaryYES, user may add more through the GFE.
          SAMPLESample set definitionsAsciiNO, user may add entries through the GFE.
          REFERENCEEdit area definitionsAsciiCreated during first run of ifpServer, user may add more -through the -GFE.
          TASKOUTPUT
          -
          Temporary Spooling area for -Background Tasks
          -
          Ascii
          -
          Created when gfe-initiated -background tasks are queued to run on the ifpServer.
          -
          TEXT/BUNDLE
          -
          Saved weather element groups.
          -
          Ascii
          -
          Yes, user may add more through -the GFE.
          -
          TEXT/COMBODATASaved combinations files for -different products.  Also contains the color map for the zone -combiner.BinaryYes.   User creates -combinations files and color maps through the Formatter Launcher.
          TEXT/COMBINATIONS
          -
          Text product combination files.
          -
          Binary
          -
          Yes.  User creates -combinations file through the Formatter -Launcher.
          -
          TEXT/DRAFT
          -
          Contains Product Editor Draft -files.
          -
          Binary
          -
          No.  User creates through -the product editor.
          -
          TEXT/EditAreaGroupEdit area group definitionsBinaryCreated during first run of ifpServer, user may add more -through the -GFE.
          TEXT/GFECONFIGGFE -configuration filesAsciiYES, user may add more through -the GFE.
          TEXT/GHGConfig
          -
          GHG Monitor configuration file
          -
          Binary
          -
          Created upon user command from -the GHG Monitor
          -
          TEXT/ISCGridTemporary caching of ISC edit areas in grid formatBinaryCreated when running the ISC_Discrepancies procedure and used -as a -cache to increase performance.
          TEXT/Procedure
          -
          Contains procedures.
          -
          Ascii
          -
          Yes, user may add more through -the GFE.
          -
          TEXT/PRODGEN
          -
          Temporary holding location for -generated products and scripts.
          -
          Ascii
          -
          No. These files are controlled -by the ifpServer and are temporary in nature.
          -
          TEXT/SELECTTR
          -
          Selection time range definitions
          -
          Ascii
          -
          YES, user may add more through -the GFE.
          -
          TEXT/TextProduct
          -
          Text Product definitions
          -
          Ascii
          -
          YES, user may add more through -the GFE.
          -
          TEXT/TextUtility
          -
          Text Utility definitions
          -
          Ascii
          -
          YES, user may add more through -the GFE.
          -
          TEXT/Tool
          -
          Smart Tool definitions
          -
          Ascii
          -
          YES, user may add more through -the GFE.
          -
          TEXT/UserInfo/ifpUsers.UserInfo
          -
          User and configuration startup -file
          -
          Ascii
          -
          NO, automatically generated.
          -
          TEXT/Utility
          -
          Utility definitions (for smart -tools and procedures)
          -
          Ascii
          -
          YES, user may add more through -the GFE.
          -
          TEXT/VCMODULE
          -
          Virtual Parm Definition Files
          -
          Ascii
          -
          YES, user may add more. -Currently no interface is provided.
          -
          -

          -


          -
          -

          +
          In AWIPS2 the database is on dx1 under /awips2/edex/data/hdf5. +The sub-directories used by GFE are grib and gfe. The grib sub-directory +contains grib model data. The gfe/SITE_ID sub-directory contains GFE grid +databases including Fcst, Official, ISC, Restore, and any model databases. +Topography databases are also found here.

          GRID Database Structure

          -The model, Forecast, and Official databases are stored in the GRID -directory -tree.  The first level subdirectories underneath GRID are the -model -names, e.g., NAM and Fcst.  Within each model directory will be a -series of database files.  A database contains all of the grid and -metadata needed to represent the weather elements.   Each -database actually consists of several netCDF files. +database actually consists one HDF5 file.

          The name of each database represents the:

            @@ -1185,268 +366,42 @@ database actually consists of several netCDF files.
          • Optional Database Type (e.g., V)
          • Date/Time of Model Run (e.g., 20001214_0000)
          -

          Model Data / -Forecast -Data File Structure

          -Each model (e.g., NGM), Forecast, and Official database is stored in -netCDF -file format. There are usually five netCDF files associated with each -model.  -The model name is in the following format:  site_GRID_ot_date_time, +Forecast Data File Structure +Each model (e.g., NAM), Forecast, and Official database is stored in +HDF5 file format. +The model name is in the following format: site_GRID_ot_date_time, where site is the WFO identifier, ot is the optional type, date and time are the date-time stamp for the model valid -time.  +time. If the date/timestamp is all zeros (00000000_0000), then the model is "rolling" -or not time-based.  In this case the files are never purged from +or not time-based. In this case the files are never purged from the -system.  Typically the Forecast and Official databases are set up -to be permanent.  Another word to describe this case is a -singleton -model. -


          -The main file is the *.cdf file.  It contains the following +system. Typically the Forecast and Official databases are set up +to be permanent. Another word to describe this case is a +singleton model. The *.h5 file contains the following information:

            -
          • Weather Element information, such as name, maximum and minimum -possible -values, units, descriptive name, precision, domain and grid size -information.
          • -
          • Inventory (valid times) of each grid for that weather element, -plus an -identifier to which storage area the data is located in, and index -pointers -into the storage area where the grid is actually stored. Links to the -history -storage area and weather key storage area are also present.
          • -
          • Map Projection Information for the database
          • -
          • Definition of Weather - available coverages/probabilities, -intensities, -weather types, visibilities, and optional attributes
          • +
          • Grid data.
          • +
          • Grid Parm Info of each weather element, +that fully describes how the data is represented in the system.
          • +
          • Grid Parm Storage Information for the database
          -The History Storage Area file contains history information for each -grid: -
            -
          • original source for the grid - Initialized from model, time -interpolated, -created from scratch, slider interpolated, other
          • -
          • original weather element name and source
          • -
          • original time range (valid time)
          • -
          • user identifier who has modified the grid
          • -
          • time it was modified
          • -
          -The history storage area file automatically grows as more space is -needed. -

          The byte35x35, short35x35, and float35x35 are storage areas for the -grids.  -The 35x35 signifies the grid size.  If your system has different -grid -sizes, then these numbers will be different.  The byte area stores -grids that are represented in bytes.  The float area stores grids -that are represented in floats.  The short area stores grids that -are represented as a short. The byte area represents grids that are -stored in bytes.  This file automatically grows as more space is -needed. -

          -

          The KeyStorageArea contains keys for each grid of type WEATHER and -DISCRETE.  These grids -are unlike other grids in that an index is stored in the grid, and the -key is needed to decode the index. -
          -

          -
          -

          Daily Forecast Critique (dfc) -Directory -Structure

          -


          -
          -  -
          -  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Filename or LocationPurpose
          dfctop-level daily forecast critique directory
          archivedObsdirectory containing hourly time-stamped files containing -observational -data.  Filenames are in the YYYYMMDD_hhmm format.
          archivedFcstsdirectory containing multiple directories representating -models or -the official forecast database
          archivedFcsts/...directory containing forecast files for models or the -official database.  -The files are timestamped which represent the model run.  The -official -database files are timestamped which represent the time at which the -official -database was published (to the nearest hour).
          dfc/*.picPickled-python files used to keep track of the archived -observations -and forecasts. 
          -


          -

          VTEC Directory Structure

          -The VTEC Directory contains the VTEC "active" table, which represents -the -current state of VTEC for issued products.  There are different -"active" tables present, as well as a spooling and backup directory.
          -
          -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Filename or LocationPurpose
          active.tbl
          -
          Pickled-python file containing the active table representing -the current state of VTEC.
          -
          active.tbllock
          -
          Lock file for the active table, -used to enforce the write locking and read locking.
          -
          PRACTICE.tbl
          -
          Pickled-python file containing -the active table used in PRACTICE mode, represents the current state of -the VTEC in PRACTICE mode.
          -
          PRACTICE.tbllock
          -
          Lock file for the PRACTICE -active table, used to enforce the write lock and read locking.
          -
          empty.tbl
          -
          Empty pickled-python file -containing no records.  Used (manually) in the event the active -table has become hopelessly corrupted.
          -
          empty.tbllock
          -
          Lock file for the "empty" active -table, used to enforce the write lock and read locking.
          -
          spool/*
          -
          Transient files written by the -AWIPS D2D NotifyTextProd process, read by the VTEC Decoder.
          -
          backup/*
          -
          Series of files, generally 168 -hours of backup versions, for the active table.  Each time the -active table changes, the process responsible (VTECDecoder or -ingestAT/MergeVTEC) writes out a compressed version of the previous -state and time stamps it.  Helpful in diagnosing problems or for -manual recovery.
          -
          -
          -
          -
          -
          -

          acquire Directory Structure

          -The acquire directory contains one file named notifyPattern.txt.  -This file is used in conjunction with the AWIPS D2D NotifyTextProd -process to start certain processes when certain text products arrive in -VTEC.   GFESuite uses this routing file to have -NotifyTextProd start the VTECDecoder process to manage the active -table.  See the VTEC Guide for more -details.
          -
          -
          -

          Text Install Directory Structure

          -

          The text install directories are used for configuring the GFE -formatters that are "templated".  When GFE is installed, the -formatters are created from templates.  The templates, and the -routines to expand them into products are contained in the text -installation directory structure.
          +

          Text Products Directory Structure

          +

          The /awips2/edex/data/utility/edex_static/base/textproducts directories +are used for configuring the GFE formatters that are "templated". +When AWIPS is installed, the formatters are created from templates. +The templates, and the routines to expand them into products are contained +in the text installation directory structure. See the Readme.txt file for +detailed information.

          -

            -

          - - - - - - - - - - - - - - - - - - - -
          Filename or LocationPurpose
          afos2awips.txt
          -
          backup table mapping WMOIDs to -PILs for each site.  This table is only used if the primary table -cannot be found on the AWIPS system.
          -
          TextProduct_BASE
          -
          directory containing TextProduct -templates that will be expanded into the BASE/TEXT/TextProduct -directory.
          -
          TextUtility_BASE
          -
          directory containing TextUtility -templates that will be expanded into the BASE/TEXT/TextUtility -directory.
          -
          -
          -

          MHS Directory Structure

          The MHS Directory Structure to support GFESuite is quite small, but @@ -1455,14 +410,11 @@ The directory structure is used to support Intersite Coordination of Grids. The MHS host on AWIPS is "ds1" prior to OB7, and "dx1" OB7 and after. -

          There are two spooling directories for incoming and outgoing -messages -to the AWIPS Message Handling System, and three scripts to support the +

          There os one spooling directory for incoming messages +to the AWIPS Message Handling System, and two scripts to support the intersite coordination grids.

          -  @@ -1471,78 +423,27 @@ intersite coordination grids. - - - + + + - - - + + + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - +
          Part of Release
          /data/adapt/GFESuite/iscDataXmtSpooling directory for intersite coordination data to be -transmitted -over the AWIPS WAN to other sites.Created through isc installation script./awips2/GFESuite/products/ISCISC spooling directory for incoming data.Installed as a part of AWIPS
          /data/adapt/GFESuite/iscDataRecSpooling directory for intersite coordination data that is -received -from the AWIPS WAN.Created through isc installation script./awips2/GFESuite/bin/iscDataRecScript that requests processing from EDEX for grids +received from the AWIPS WAN.Installed as a part of AWIPS
          /awips/adapt/GFESuite/bin/iscdTransmit daemon to send data to the AWIPS MHS system.Installed through isc installation script.
          /awips/adapt/GFESuite/bin/iscDataRecReceive script called by the AWIPS MHS (Message Handling -System) when + /awips2/edex/data/utility/edex_static/base/gfe/isc/iscDataRec.pyReceive script called by the IscDataRecRequestHandler when intersite data has been received from other sites.Installed through isc installation script.
          /awips/adapt/GFESuite/bin/iscReceiveRouteBASE.pyConfiguration information used by the iscDataXmt and -iscDataRec scripts.Created through isc installation script.
          /awips/adapt/GFESuite/bin/logstream.py, PyNet.py, rpc.pyAdditional files needed to support ISC.Created through isc installation script.
          /awips/adapt/GFESuite/bin/iscReceiveRouteSVCBCK.pyService backup override script for iscReceiveRouteBASECreated during service backup operations by scripts.
          /awips/adapt/GFESuite/bin/iscReceiveRouteSITE.pyUser override for incoming routing information. Overrides -iscReceiveRouteBASE.pyUser-created.Installed as a part of AWIPS

          -


          Back to Table Of Contents -
          -  -
          -  -
          -  -
          -  -
          -  -
          -  -
          -  -
          -  -
          -  -

          diff --git a/cave/com.raytheon.viz.gfe/help/docindex.html b/cave/com.raytheon.viz.gfe/help/docindex.html index 3a6f441f0c..0ceaa9b4f1 100644 --- a/cave/com.raytheon.viz.gfe/help/docindex.html +++ b/cave/com.raytheon.viz.gfe/help/docindex.html @@ -16,7 +16,7 @@
        20. Grid Manager
        21. Spatial Editor
        22. Temporal Editor
        23. -
        24. Status Bar
        25. +
        26. AlertViz
    55. GFE Spatial Editor Training Guide
    56. Color Bar
    57. -
    58. Status Bar
    59. +
    60. AlertViz
    61. Behavior of the GFE in ISC (Intersite Coordination) Mode
    62. Spatial Editor Visualizations
    63. @@ -63,7 +63,7 @@
    64. Introduction
    65. Python Concepts
    66. -
    67. Numerical Python
    68. Conversion Methods +
    69. UVToMagDir
    70. MagDirToUV
    71. convertMsecToKts
    72. convertKtoF
    73. KtoF
    74. convertFtoK
    75. FtoK
    76. convertFtToM
    77. Error Handling @@ -123,10 +123,10 @@
    78. createGrid
    79. deleteGrid
    80. highlightGrids
    81. makeHeadlineGrid
    82. Utilities +
    83. findDatabase
    84. getDatabase
    85. getTimeRange
    86. createTimeRange
    87. getSamplePoints
    88. dayTime
    89. determineTimeShift
    90. getEditArea
    91. saveEditArea
    92. setActiveEditArea
    93. clearActiveEditArea
    94. setActiveElement
    95. getActiveElement
    96. getGridCellSwath
    97. getLatLon
    98. getLatLonGrids
    99. getGridCell
    100. getGrid2DBit
    101. getGridTimes
    102. getExprName
    103. getModelName
    104. getD2Dmodel
    105. getParm
    106. getParmByExpr
    107. cacheElements
    108. unCacheElements
    109. loadWEGroup
    110. unloadWE
    111. saveElements
    112. publishElements
    113. combineMode
    114. setCombineMode
    115. getVectorEditMode
    116. setVectorEditMode
    117. getConfigItem
    118. esat
    119. Numeric Library Methods +
    120. getTopo
    121. wxMask/discreteMask
    122. sortUglyStr
    123. getIndex
    124. encodeEditArea
    125. decodeEditArea
    126. getindicies
    127. offset
    128. agradient
    129. diff2
    130. getGridShape
    131. Python Object Methods @@ -532,9 +532,6 @@
    132. Text Product User Guide
    133. -
    134. Upgrades and Backward Compatibility
        -
      -
    135. Product Set-up and Customization
    136. @@ -598,7 +595,7 @@
    137. Main Menu
    138. Button Bar
    139. -
    140. Status Bar
    141. +
    142. AlertViz
    143. User Interface Dialogs
    144. Other GFESuite Programs
    145. Break All Locks
    146. -
    147. coordinate conversion routine -
    148. -
    149. ifpServerStats -
    150. iscMosaic
    151. @@ -663,15 +651,6 @@
    152. getNotify
    153. -
    154. Daily Forecast Critique User's Guide -
    155. -
    156. publishGFE -
    157. ifpServerText
    158. @@ -686,17 +665,11 @@
    159. dumpAT
    160. -
    161. ghETN -
    162. -
    163. makeD2DFile -
    164. Configuration Guides
    165. Server Configuration
    166. Syntax for localWxConfig.py
    167. -
    168. Syntax for Maps.py +
    169. Map Background Configuration
    170. -
    171. Syntax for MapFiles.py -
    172. -
    173. Syntax for localMapFiles.py -
    174. -
    175. Syntax for localMaps.py +
    176. Map Files
    177. Syntax for VTECPartners.py @@ -729,8 +696,8 @@
    178. Syntax for localVTECPartners.py
    179. -
    180. Description of ifpServer required netCDF Format +
    181. Description of EDEX required HDF5 Format
    182. @@ -758,7 +725,7 @@
    183. System Time Range Configuration
    184. User Interface Configuration +
    185. Available Fill Patterns and Line Patterns
    186. Selected Color and Pattern
    187. Time Scale Lines Color and Pattern
    188. Editor Time Line Color, Pattern, and Width
    189. Current System Time Indicator Color
    190. Lock Colors and Patterns
    191. Time Block Colors
    192. Edit Area Color and Border Width
    193. Initial Width of Grid Manager
    194. Initial Legend Mode
    195. Initial Grid Manager Mode
    196. Number of Quick Set Buttons
    197. AlertViz Characteristics
    198. Menu Item Limit Prior to Cascade
    199. Office Domain Expansion
    200. Location of Edit Action Dialog
    201. Initial Layout of Grid Manager and Temporal Editor
    202. Temporal Editor Weather Elements
    203. Grid Manager Last Saved, Modified, Published, and Sent Colors and Times
    204. Sample and Legend Colors @@ -810,33 +777,23 @@
    205. Directory Structures +
    206. Overview
    207. Top-Level Runtime Directory
    208. Database Directory Structure
    209. GRID Directory Structure
    210. Model Data / Forecast Data File Structure
    211. Text Products Directory Structure
    212. MHS Directory Structure
    213. Smart Initialization Configuration
    214. Intersite/Intrasite Coordination of Grids Configuration -
    215. -
    216. Daily Forecast Critique's Configuration +
    217. Configuring Your System for Intersite/Intrasite Coordination of Grids
    218. Configuring the AWIPS system
    219. Sending Intersite Coordination Grids
    220. Accessing the Intersite Coordination Data
    221. Office Types and their Effect on ISC Data
    222. Log files for Intersite Coordination
    223. EDEX Storage of ISC Grids
    224. Mosaic Technique
    225. Temporal Mosaic Technique
    226. Spatial Mosaic Technique
    227. Controlling ISC Processing through Configurations
    228. VTEC Configuration
    229. Virtual Weather Element Configuration
    230. Log Files +
    231. Location of LogFiles
    232. Logging Preferences
    233. -
    234. Release Notes
    235. -
    236. Testing Information -
    237. Splash Screens
    238. diff --git a/cave/com.raytheon.viz.gfe/help/dumpAT.html b/cave/com.raytheon.viz.gfe/help/dumpAT.html index 57a6fe2316..bacfb95c32 100644 --- a/cave/com.raytheon.viz.gfe/help/dumpAT.html +++ b/cave/com.raytheon.viz.gfe/help/dumpAT.html @@ -10,7 +10,7 @@

      dumpAT User's Guide

      -
      August 25, 2005
      +
      January 9, 2012

      Table of Contents

      @@ -31,16 +31,14 @@ meaning of the codes within the VTEC active table, refer to the

      -

      -Running the dumpAT Program

      -
       Restriction:  +

      Running the dumpAT Program

      +
      Restriction: The dumpAT program can only be run from the same machine as the VTEC active table is residing!

      The command line syntax is:
      -
      dumpAT [-w siteid] [-p phenomena] [-s +
      dumpAT -w siteid [-p phenomena] [-s significance] [-a id] [-e etn] [-l pil] [-a action] [-n tableName] [-f tableFilename]

      @@ -60,10 +58,9 @@ tableFilename]
      -w wfoid
      - Optional. May have more than one -w switch.
      + Mandatory. May have more than one -w switch.
      - Defines the WFOID filter.  If not specified, then all -records from all sites will be output.
      + Defines the WFOID filter.
      @@ -154,81 +151,43 @@ active table.
      Example Execution
      The following shows an example of running the dumpAT without any filtering:
      -

      bart > dumpAT +

      lx1-nhda{jdynina}113: ./dumpAT -w LWX
      +INFO:dumpAT:*********** dumpAT ****************
      +INFO:dumpAT:Cmd: -h ec -r 9581 -w LWX
      +INFO:dumpAT:Requesting active table dump from server.
      +INFO:dumpAT:Response received from server.
      +INFO:dumpAT:Number of records (unfiltered): 16
      +INFO:dumpAT:Number of records (filtered): 16
      +INFO:dumpAT:Records:
      +Vtec: /O.CAN.KLWX.WI.Y.0001.000000T0000Z-120102T1000Z/
      +Hdln:
      +Start: Mon Jan 2 08:09:00 2012 1325491740L Action: CAN Pil: NPW
      +End: Mon Jan 2 10:00:00 2012 1325498400L UFN: False RecState: Decoded
      +Purge: Mon Jan 2 09:15:00 2012 1325495700L
      +Issue: Mon Jan 2 08:09:00 2012 1325491740L
      +Phen: WI Sig: Y Office: KLWX Etn: 0001 Seg: 1 Key: WI.Y
      +Zone: MDZ501

      LOG-STATUS: -Log file opened on host bart at Mon Jul  4 19:30:14 2005
      -19:30:14.144 -dumpAT 65 EVENT:  *********** dumpAT ****************
      -19:30:14.146 -dumpAT 79 EVENT:  Cmd: []
      -19:30:14.155 -dumpAT 126 EVENT:  Number of records (unfiltered):  15
      -19:30:14.155 -dumpAT 127 EVENT:  Number of records (filtered):  15
      -19:30:14.163 -dumpAT 128 EVENT:  Records:
      -Vtec: -/X.CON.KSHV.FA.A.0001.000000T0000Z-050705T1500Z/
      -Hdln: ????
      -Start:  -Mon Jul  4 18:07:00 2005 1120500420.0  Action: CON  Pil: -FFA
      -End:    -Tue Jul  5 15:00:00 2005 1120575600.0  UFN: 0
      -Purge:  -Tue Jul  5 02:15:00 2005 1120529700.0
      -Issue:  -Mon Jul  4 18:07:00 2005 1120500420.0
      -Phen: -FA   Sig: A   Office: KSHV   Etn: 0001 -Seg: 1   Key: FA.A
      -Zone: -['ARC027', 'ARC073', 'ARC091', 'ARC099', 'ARC139', 'LAC015', 'LAC017', -'LAC119', 'TXC067', 'TXC073', 'TXC183', 'TXC203', 'TXC315', 'TXC401']
      -
      -Vtec: -/X.NEW.KSHV.LE.A.0001.050704T1408Z-050704T1500Z/
      -Hdln: ????
      -Start:  -Mon Jul  4 14:08:00 2005 1120486080.0  Action: NEW  Pil: -WSW
      -End:    -Mon Jul  4 15:00:00 2005 1120489200.0  UFN: 0
      -Purge:  -Mon Jul  4 15:15:00 2005 1120490100.0
      -Issue:  -Mon Jul  4 14:08:00 2005 1120486080.0
      -Phen: -LE   Sig: A   Office: KSHV   Etn: 0001 -Seg: 1   Key: LE.A
      -Zone: -['ARZ073']
      -
      -
      -19:30:14.164 -dumpAT 135 EVENT:  Final: wctime: 0.02   ,cputime: 0.19
      -

      -


      +Vtec: /O.CON.KLWX.WS.W.0001.000000T0000Z-120103T2200Z/
      +Hdln:
      +Start: Tue Jan 3 15:29:00 2012 1325604540L Action: CON Pil: WSW
      +End: Tue Jan 3 22:00:00 2012 1325628000L UFN: False RecState: Decoded
      +Purge: Tue Jan 3 22:00:00 2012 1325628000L
      +Issue: Tue Jan 3 15:29:00 2012 1325604540L
      +Phen: WS Sig: W Office: KLWX Etn: 0001 Seg: 2 Key: WS.W
      +Zone: MDZ501
      +
      +Vtec: /O.EXT.KLWX.GL.W.0001.000000T0000Z-120104T0000Z/
      +Hdln:
      +Start: Tue Jan 3 22:36:00 2012 1325630160L Action: EXT Pil: MWW
      +End: Wed Jan 4 00:00:00 2012 1325635200L UFN: False RecState: Decoded
      +Purge: Wed Jan 4 06:45:00 2012 1325659500L
      +Issue: Tue Jan 3 22:36:00 2012 1325630160L
      +Phen: GL Sig: W Office: KLWX Etn: 0001 Seg: 1 Key: GL.W
      +Zone: ANZ530
      +
      +
      +INFO:dumpAT:Final: wctime:2.40, cputime:0.28

      diff --git a/cave/com.raytheon.viz.gfe/help/edexHDF5.html b/cave/com.raytheon.viz.gfe/help/edexHDF5.html new file mode 100644 index 0000000000..2e5550d820 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/help/edexHDF5.html @@ -0,0 +1,126 @@ + + + + + + EDEX HDF5 Format + + +

      +EDEX D2D HDF5 File Format

      +March 28, 2012 +
      + +
      +This document describes the format of the HDF5 file that is: +
        +
      • +read by EDEX as a D2D database
      • +
      +If you are interested in the format of the netCDF files generated from +the ifpnetCDF product formatter, or +read +by the iscMosaic program , then refer to +the +netCDF File Format Document. +

      +When data arrives over the SBN, the EDEX JVM ingest thread reads the next available message in AMQP queue +from the QPID message broker. It compares against the distribution XML files loaded into memory on EDEX +startup from /awips2/edex/data/utility/edex_static/base/distribution. If no pattern matches, nothing is +done. Otherwise a metadata record is generated in the appropriate table of the metadata database, and +an HDF5 file is written to /awips2/edex/data/hdf5/grib/MODEL_NAME on dx1. SmartInit is kicked off by +EDEX and generates data in /awips2/edex/data/hdf5/gfe/SITE_ID. You can access the +metadata database on dx1 as user awips. You can view the contents of HDF5 files using either the +free HDFView utility, or h5dump (installed in /awips2/tools/bin).

      +
      +

      About h5dump

      +OPTIONS
      +

      -h, --help          Print a usage message and exit
      +-B, --userblock     Print the content of the user block
      +-H, --header        Print the header only; no data is displayed
      +-i, --object-ids    Print the object ids
      +-V, --version       Print version number and exit
      +-a P, --attribute=P Print the specified attribute
      +-d P, --dataset=P   Print the specified dataset
      +-g P, --group=P     Print the specified group and all members
      +-l P, --soft-link=P Print the value(s) of the specified soft link
      +-o F, --output=F    Output raw data into file F
      +-t P, --datatype=P  Print the specified named data type
      +-w N, --width=N     Set the number of columns of output
      +-x, --xml           Output in XML
      +-D U, --xml-dtd=U   Use the DTD at U +

      Subsetting is available by using the following options with a dataset +attribute. Subsetting is done by selecting a hyperslab from the data. +Thus, the options mirror those for performing a hyperslab selection. +The START and COUNT parameters are mandatory if you do subsetting. +The STRIDE and BLOCK parameters are optional and will default to 1 in +each dimension.

      +-s L, --start=L     Offset of start of subsetting selection
      +-S L, --stride=L    Hyperslab stride
      +-c L, --count=L     Number of blocks to include in selection
      +-k L, --block=L     Size of block in hyperslab

      +P - is the full path from the root group to the object.
      +F - is a filename.
      +N - is an integer greater than 1.
      +L - is a list of integers the number of which are equal to the
      +    number of dimensions in the dataspace being queried
      +U - is a URI reference

      +Examples:
      +
      +  1) Attribute foo of the group /bar_none in file quux.h5
      +

      +    h5dump -a /bar_none/foo quux.h5
      +

      +  2) Selecting a subset from dataset /foo in file quux.h5
      +

      +    h5dump -d /foo -s "0,1" -S "1,1" -c "2,3" -k "2,2" quux.h5 +
      +

      +
      +

      Diagnosing Model Problems

      +If you point the volume browser to a D2D directory and the model is not +appearing, verify that: +
        +
      • EDEX started up without any errors that would affect gfe, i.e., all + configurations loaded normally.
      • +
      • Ingest processes started normally and are up and running.
      • +
      • PyPies are up and running on dx1.
      • +
      • +the file name is in the standard format of yyyymmdd_hhmm, which is the +model base time
      • +
      • +that the file contains all of the required variables, dimensions, and +attributes +as outlined above
      • +
      • +that there isn't more than ONE directory in the D2DDIRS +configuration containing files that have an variable called "model" +with +the same name
      • +
      +If all else fails, you can turn on the debugging logging option in EDEX. +In this mode EDEX will log all problems it finds +with model data files. To turn on this feature, perform the following steps: +
        +
      1. +Edit the file /awips2/edex/conf/log4j-ingest.xml to set level value = "DEBUG" +for the appender ThreadBasedLog. Refer +to the log files document for details.
      2. +
      3. +Stop and restart EDEX.
      4. +
      5. +Look in the server log files. It will show the problems for all +files +it finds. If it doesn't identify your file or directory, re-check +your D2DDIRS +to be sure you have set it up correctly.
      6. +
      +


      +

      + + diff --git a/cave/com.raytheon.viz.gfe/help/getNotify.html b/cave/com.raytheon.viz.gfe/help/getNotify.html index eb2881d867..ef6586f798 100644 --- a/cave/com.raytheon.viz.gfe/help/getNotify.html +++ b/cave/com.raytheon.viz.gfe/help/getNotify.html @@ -10,7 +10,7 @@

      getNotify User's Guide

      -
      April 4, 2006
      +
      January 13, 2012

      Table of Contents

      @@ -25,25 +25,20 @@ getNotify User's Guide

      Overview

      The getNotify program is a diagnostic routine to -connect to the ifpServer, receive notifications of data changes, and -then -output the notifications to the terminal window.  It is handy for -diagnosing notifications that are sent from the server.
      -
      -
      +connect to awips qpid server, receive notifications of data changes, and +then output the notifications to the terminal window. It is handy for +diagnosing notifications that are sent from the server. +


      Running the getNotify Program

      -
       
      The command line syntax is:
      -getNotify -h hostname -p portNumber [-u user] [-l] [-g] [-d] [-s] -[-r] [-c] [-m] [-t] [-b] [-v]
      +python getNotify.py -h hostname -p portNumber [-u user] [-l] [-g] [-d] [-m] [-v]

      A sample command line is:
      -
      getNotify -h dx4f -p 98000000 -g
      -
       
      +
      python getNotify.py -h cpsbn1 -p 5672 -g

      @@ -54,18 +49,17 @@ diagnosing notifications that are sent from the server. - + - + - @@ -86,25 +80,6 @@ notifications. - - - - - - - - - - - - - - - @@ -112,22 +87,6 @@ notifications. - - - - - - - - - - @@ -139,58 +98,35 @@ information about the VTEC Table Change Notifications.
      -h hostname Mandatory (See note)Specifies the host, upon which the ifpServer is runningSpecifies the host, upon which the awips qpid server is running
      -p port Mandatory (See note)Specifies the port, upon which the ifpServer is runningSpecifies the port, upon which the awips qpid server is running
      -u user OptionalSpecifies the user on connection to the ifpServer.  -Defaults to + Specifies the user on connection to the awips qpid server. Defaults to the current UNIX login name.
      If specified, outputs detailed information about database inventory change notifications.
      -sOptionalIf specified, outputs detailed information about sample set -notifications.
      -rOptionalIf specified, outputs detailed information about edit area -(reference -set) notifications.
      -cOptionalIf specified, outputs detailed information about color table -notifications.
      -m If specified, outputs detailed information about user message notifications.
      -tOptionalIf specified, outputs detailed information about TEXT data -notifications.
      -
      -b
      -
      Optional
      -
      If specified, outputs detailed -information about the Server Process Notifications.
      -
      -v
      -Note: The -h serverhost and -p port are -predefined -based on your installation configration of GFESuite.  The -h and --p -will be defined for the server host and port specified during -installation.  -If you wish to connect to another server, then these switches will be -necessary.  If environment variables -${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -p switches.

      -

      Example Data

      The following shows some example output and how it -is interpreted.  This example uses just the -h and -p switches so +is interpreted. This example uses just the -h and -p switches so the program output simply lists the number of received notifications.

      Basic Execution

      -getNotify -h polaris -p 98000000 -

      camper > getNotify -h polaris -p 98000000 -
      -14:47:19.154 Client.C 146 EVENT: Establishing connection to -server on polaris -
      -14:47:19.175 Client.C 161 EVENT: Connection complete to server -on polaris -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0, +

      dx3-nhda{jdynina}112: python getNotify.py -h cpsbn1 -p 5672
      +Get Notifications Diagnostic Program
      +Establishing connection to broker on cpsbn1
      +Establishing connection to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +L=0,G=42,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=25,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=85,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=38,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=29,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=38,D=0,S=0,R=0,C=0,T=0,U=1,B=0,V=0,
      +L=0,G=9,D=0,S=0,R=0,C=0,T=0,U=1,B=0,V=0,
      +L=0,G=3,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=3,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=53,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=14,D=0,S=0,R=0,C=0,T=0,U=1,B=0,V=0,
      +L=0,G=65,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +

      The following table describes the symbol and its meaning:
      @@ -209,32 +145,10 @@ on polaris
      D Database Inventory Change Notifications - - S - Sample Set Notifications - - - R - Edit Area (Reference Set) Notifications - - - C - Color Table Notifications - - - T - Text Notifications (tools, procedures) - M User Message Notifications - - B
      - - Server Process Notifications
      - - V
      @@ -244,541 +158,167 @@ on polaris

      -  -
      -  +

      Note: For AWIPS2, a decision was made to not support the following notification +types:

      +*SampleNotification
      +*ReferenceNotification
      +*ColorSpectrumNotification
      +*TextFileNotification
      +*ProcessStatusNotification

      +because of the architectural +differences between AWIPS1 and AWIPS2, these specific notifications will not +be supported by getNotify.

      Execution with -l switch

      The lock notification message contains the weather element identifier -(ParmID), -and the new lockTable. -

      getNotify -h polaris -p 98000000 -l -g +(ParmID), and the new lockTable. Note, no locks were detected in this case. +

      dx3-nhda{jdynina}113: python getNotify.py -h cpsbn1 -p 5672 -l
      +Get Notifications Diagnostic Program
      +Establishing connection to broker on cpsbn1
      +Establishing connection to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=13,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=9,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=8,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=8,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +

      -15:01:29.779 Client.C 146 EVENT: Establishing connection to server -on polaris -
      -15:01:29.801 Client.C 161 EVENT: Connection complete to server -on polaris -

      -

      L=1,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -LOCK=[TimeOnQueue: 0.000287 PostedTime: Jan 22 02 15:02:27 GMT -Updater: 389696393:mark:gfe:20941:0 -
      -ParmID: MaxT_SFC:BOU_GRID__Fcst_00000000_0000 -
      -ParmId: MaxT_SFC:BOU_GRID__Fcst_00000000_0000 LockTable WsId: -389696393:mark:getNotify:20939:0 -
      -   Lock: TR: (Jan 24 02 10:00:00 GMT, Jan 25 02 04:00:00 -GMT) WsId: 389696393:mark:gfe:20941:0 -

      -

       ] -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -

      Execution with -g switch

      The grid update notification message contains the replacement time range, the weather element identifier (ParmID), and the replacement times of -the -grids. -

      getNotify -h polaris -p 98000000  -g +the grids. +

      dx3-nhda{jdynina}115: python getNotify.py -h cpsbn1 -p 5672 -g
      +Get Notifications Diagnostic Program
      +Establishing connection to broker on cpsbn1
      +Establishing connection to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=21,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +GRID=[
      +ParmID: WVPER_SFC:LWX_GRID_D2D_EPwave10_20120113_1200
      +Replacement TimeRange: (Jan 20 12 12:00:00 , Jan 20 12 13:00:00 )
      +Histories: {(Jan 20 12 12:00:00 , Jan 20 12 13:00:00 ): [Origin: INITIALIZED
      +Origin Parm: WVPER_SFC:LWX_GRID_D2D_EPwave10_20120113_1200
      +Origin Time Range: (Jan 20 12 12:00:00 , Jan 20 12 13:00:00 ) Time Modified: None Who Modified: None
      +Update Time: None
      +Publish Time: None
      +Last Sent Time: None
      +]},
      +ParmID: PERPW_SFC:LWX_GRID_D2D_EPwave10_20120113_1200
      +Replacement TimeRange: (Jan 20 12 12:00:00 , Jan 20 12 13:00:00 )
      +Histories: {(Jan 20 12 12:00:00 , Jan 20 12 13:00:00 ): [Origin: INITIALIZED
      +Origin Parm: PERPW_SFC:LWX_GRID_D2D_EPwave10_20120113_1200
      +Origin Time Range: (Jan 20 12 12:00:00 , Jan 20 12 13:00:00 ) Time Modified: None Who Modified: None
      +Update Time: None
      +Publish Time: None
      +Last Sent Time: None
      +]}

      -15:01:29.779 Client.C 146 EVENT: Establishing connection to server -on polaris -
      -15:01:29.801 Client.C 161 EVENT: Connection complete to server -on polaris -

      -

      L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -

      -

      L=1,G=1,D=0,S=0,R=0,C=0,T=0,M=0 -

      -

      GRID=[TimeOnQueue: 0.000493 PostedTime: Jan 22 02 15:02:30 GMT -Updater: -389696393:mark:gfe:20941:0 -
      -ParmID: MaxT_SFC:BOU_GRID__Fcst_00000000_0000 -
      -Replacement TimeRange: (Jan 24 02 10:00:00 GMT, Jan 25 02 04:00:00 -GMT) -
      -Replacement Times: [(Jan 24 02 10:00:00 GMT, Jan 25 02 04:00:00 -GMT) ] -
      - ] -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -

      Execution with -d switch

      The database inventory change notification message contains the updated inventory, the additions, deletions. -

      L=0,G=0,D=1,S=0,R=0,C=0,T=0,M=0 -
      -DB=[TimeOnQueue: 0.00056 PostedTime: Jan 22 02 16:08:10 GMT -Updater: -2688174985:afps:ifpServer:26672:0 -
      -Inventory: [BOU_GRID__Official_00000000_0000, -BOU_GRID__Fcst_00000000_0000, -BOU_GRID__ISC_00000000_0000, BOU_GRID__LAPS_00000000_0000, -BOU_GRID_D2D_MRF_20020120_0000, -BOU_GRID__MRF_20020120_0000, -BOU_GRID_D2D_GWW_20020121_0000, -BOU_GRID_D2D_MRF_20020121_0000, -BOU_GRID__MRF_20020121_0000, -BOU_GRID_D2D_NGM_20020121_1200, -BOU_GRID__NGM_20020121_1200, -BOU_GRID_D2D_ETA_20020121_1200, -BOU_GRID__NAM_20020121_1200, -BOU_GRID_D2D_GWW_20020121_1200, -BOU_GRID_D2D_MESOETAU_20020121_1800, BOU_GRID__MesoNAM_20020121_1800, -BOU_GRID_D2D_MESOETAS_20020121_1800, BOU_GRID_D2D_AVN_20020121_1800, -BOU_GRID__AVN_20020121_1800, -BOU_GRID__RUC_20020121_2100, -BOU_GRID_D2D_RUC_20020121_2200, -BOU_GRID_D2D_MAPSNationalSurfaceAnalysis_20020122_0100, -BOU_GRID_D2D_RUC_20020122_0000, -BOU_GRID__RUC_20020122_0000, -BOU_GRID_D2D_NGM_20020122_0000, -BOU_GRID__NGM_20020122_0000, -BOU_GRID_D2D_ETA_20020122_0000, BOU_GRID__NAM_20020122_0000, -BOU_GRID_D2D_MESOETAU_20020122_0000, BOU_GRID__MesoNAM_20020122_0000, -BOU_GRID_D2D_MESOETAS_20020122_0000, -BOU_GRID_D2D_MAPSNationalSurfaceAnalysis_20020122_0400, -BOU_GRID_D2D_AVN_20020122_0000, BOU_GRID__AVN_20020122_0000, -BOU_GRID_D2D_LAPS_20020122_1300, BOU_GRID_D2D_LAPS_20020122_1500 ] -
      -Additions: [ ] -
      -Deletions: [BOU_GRID_D2D_LAPS_20020122_1200, -BOU_GRID_D2D_LAPS_20020122_1100 +

      dx3-nhda{jdynina}116: python getNotify.py -h cpsbn1 -p 5672 -d
      +Get Notifications Diagnostic Program
      +Establishing connection to broker on cpsbn1
      +Establishing connection to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=60,D=1,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +DB=[
      +Inventory[AFC_GRID__Restore_00000000_0000,
      +AFC_GRID_Test_Fcst_00000000_0000, AFC_GRID__ISC_00000000_0000,
      +AFC_GRID__RTMA_00000000_0000, AFC_GRID__SAT_00000000_0000, AFC_GRID__MSAS_00000000_0000,
      +AFC_GRID__Official_00000000_0000, AFC_GRID__Fcst_00000000_0000,
      +AFC_GRID_Prac_Fcst_00000000_0000, AFC_GRID__LAPS_00000000_0000, AFC_GRID__AKWAVE_20120113_0000,
      +AFC_GRID__AKWAVE_20120113_0600, AFC_GRID__MOSGuide_20120112_1200,
      +AFC_GRID__MOSGuide_20120113_0000, AFC_GRID__NAM12_20120113_0000, AFC_GRID__NAM12_20120113_0600,
      +AFC_GRID__NamDNG5_20120113_0000, AFC_GRID__NamDNG5_20120113_0600,
      +AFC_GRID_D2D_NAM40_20120113_1200, AFC_GRID_D2D_UKMET-NorthernHemisphere_20120113_1200,
      +AFC_GRID_D2D_TPCProb_20120113_1200, AFC_GRID_D2D_AKWAVE_20120113_0000,
      +AFC_GRID_D2D_OPCTAFBNW_20120111_0000, AFC_GRID_D2D_NAM20_20120113_1200,
      +AFC_GRID_D2D_ENSEMBLE_20120113_0000, AFC_GRID_D2D_NAM95_20120113_0000,
      +AFC_GRID_D2D_TPCProb_20120112_0000, AFC_GRID_D2D_TPCProb_20120113_0000,
      +AFC_GRID_D2D_gfsLR_20120113_0000, AFC_GRID_D2D_MOSGuide_20120112_1200,
      +AFC_GRID_D2D_TPCProb_20120112_0600, AFC_GRID_D2D_RTMA_20120113_1400,
      +AFC_GRID_D2D_TPCProb_20120111_1800, AFC_GRID_D2D_GlobalWave_20120113_0600,
      +AFC_GRID_D2D_OPCTAFBNW_20120113_1200, AFC_GRID_D2D_NAM95_20120113_1200,
      +AFC_GRID_D2D_GFS190_20120113_0600, AFC_GRID_D2D_GFS190_20120113_1200,
      +AFC_GRID_D2D_TPCProb_20120112_1800, AFC_GRID_D2D_gfsLR_20120112_0000,
      +AFC_GRID_D2D_ENSEMBLE_20120112_1200, AFC_GRID_D2D_GlobalWave_20120113_1200,
      +AFC_GRID_D2D_GWW233_20120113_0600, AFC_GRID_D2D_RTMA_20120113_1500,
      +AFC_GRID_D2D_TPCProb_20120112_1200, AFC_GRID_D2D_NamDNG5_20120113_1200,
      +AFC_GRID_D2D_AKWAVE_20120113_0600, AFC_GRID_D2D_OPCTAFBNW_20120113_0000,
      +AFC_GRID_D2D_GFS190_20120113_0000, AFC_GRID_D2D_MOSGuide_20120113_0000,
      +AFC_GRID_D2D_NamDNG5_20120113_0600, AFC_GRID_D2D_gfsLR_20120111_0000,
      +AFC_GRID_D2D_OPCTAFBNW_20120111_1200, AFC_GRID_D2D_NAM12_20120113_1200,
      +AFC_GRID_D2D_OPCTAFBNW_20120112_1200, AFC_GRID_D2D_OPCTAFBNW_20120112_0000,
      +AFC_GRID_D2D_OPCTAFBNW_20120108_1200, AFC_GRID_D2D_TPCProb_20120113_0600,
      +AFC_GRID_D2D_OPCTAFBNW_20120109_0000, AFC_GRID_D2D_UKMET-NorthernHemisphere_20120113_0600,
      +AFC_GRID_EditTopo_Topo_00000000_0000, AFC_GRID_D2D_PRISMClimo_00000000_0000,
      +AFC_GRID_D2D_NCDCClimo_00000000_0000, AFC_GRID_D2D_CRMTopo_00000000_0000,
      +AFC_GRID_D2D_NED_00000000_0000, AFC_GRID_D2D_AKWAVE_20120113_1200]
      +Additions[AFC_GRID_D2D_AKWAVE_20120113_1200]
      +Deletions[],
      ]

      - ]
      -  -

      -

      Execution with -s switch

      -The sample set notification message contains the updated inventory, the -additions, deletions, and changes that occurred.  Each entry is -defined -by a name, a protection (p) field, and an access code (0-BASE, 1-SITE, -2-USER). -

      camper > getNotify -h polaris -p 98000000 -u mark  -r -
      -15:05:03.724 Client.C 146 EVENT: Establishing connection to server -on polaris -
      -15:05:03.737 Client.C 161 EVENT: Connection complete to server -on polaris -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=1,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=1,R=0,C=0,T=0,M=0 -
      -SAMPLE=[TimeOnQueue: 0.000321 PostedTime: Jan 22 02 15:05:27 GMT -Updater: 389696393:mark:gfe:20941:0 -
      -Inventory: [(test,P=0,A=3) ] -
      -Additions: [(test,P=0,A=3) ] -
      -Deletions: [ ] -
      -Changes: [ ] -
      - ] -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -  -
      -  -

      -

      Execution with -r switch

      -The edit area (reference set) notification message contains the updated -inventory, the additions, deletions, and changes that occurred.  -Each -entry is defined by a name, a protection (p) field, and an access code -(0-BASE, 1-SITE, 2-USER). -

      getNotify -h polaris -p 98000000 -u mark -r -
      -15:06:51.755 Client.C 146 EVENT: Establishing connection to server -on polaris -
      -15:06:51.768 Client.C 161 EVENT: Connection complete to server -on polaris -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=1,C=0,T=0,M=0 -
      -REF=[TimeOnQueue: 0.000288 PostedTime: Jan 22 02 15:07:18 GMT -Updater: -389696393:mark:gfe:20941:0 -
      -Inventory: [(ABQ,P=0,A=1), (AMA,P=0,A=1), (BOU,P=0,A=1), -(CO_030,P=0,A=1), -(CO_031,P=0,A=1), (CO_032,P=0,A=1), (CO_033,P=0,A=1), (CO_034,P=0,A=1), -(CO_035,P=0,A=1), (CO_036,P=0,A=1), (CO_037,P=0,A=1), (CO_038,P=0,A=1), -(CO_039,P=0,A=1), (CO_040,P=0,A=1), (CO_041,P=0,A=1), (CO_042,P=0,A=1), -(CO_043,P=0,A=1), (CO_044,P=0,A=1), (CO_045,P=0,A=1), (CO_046,P=0,A=1), -(CO_047,P=0,A=1), (CO_048,P=0,A=1), (CO_049,P=0,A=1), (CO_050,P=0,A=1), -(CO_051,P=0,A=1), (CO_Adams,P=0,A=1), (CO_Arapahoe,P=0,A=1), -(CO_Boulder,P=0,A=1), -(CO_ClearCreek,P=0,A=1), (CO_Denver,P=0,A=1), (CO_Douglas,P=0,A=1), -(CO_Elbert,P=0,A=1), -(CO_Gilpin,P=0,A=1), (CO_Grand,P=0,A=1), (CO_Jackson,P=0,A=1), -(CO_Jefferson,P=0,A=1), -(CO_Larimer,P=0,A=1), (CO_Lincoln,P=0,A=1), (CO_Logan,P=0,A=1), -(CO_Morgan,P=0,A=1), -(CO_Park,P=0,A=1), (CO_Phillips,P=0,A=1), (CO_Sedgwick,P=0,A=1), -(CO_Summit,P=0,A=1), -(CO_Washington,P=0,A=1), (CO_Weld,P=0,A=1), (CYS,P=0,A=1), -(Colorado,P=0,A=1), -(DDC,P=0,A=1), (GJT,P=0,A=1), (GLD,P=0,A=1), (ISC_Area,P=0,A=1), -(ISC_Send_Area,P=0,A=1), -(Kansas,P=0,A=1), (LBF,P=0,A=1), (Nebraska,P=0,A=1), -(NewMexico,P=0,A=1), -(Oklahoma,P=0,A=1), (PUB,P=0,A=1), (RIW,P=0,A=1), -(SouthDakota,P=0,A=1), -(Texas,P=0,A=1), (Wyoming,P=0,A=1), (QuickSet4,P=0,A=3) ] -
      -Additions: [(QuickSet4,P=0,A=3) ] -
      -Deletions: [ ] -
      -Changes: [ ] -
      - ] -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -  -

      -

      Execution with -c switch

      -The color table notification message contains the updated inventory, -the -additions, deletions, and changes that occurred.  Each entry is -defined -by a name, a protection (p) field, and an access code (0-BASE, 1-SITE, -2-USER). -

       getNotify -h polaris -p 98000000 -u mark -m -c -
      -15:08:14.847 Client.C 146 EVENT: Establishing connection to server -on polaris -
      -15:08:14.861 Client.C 161 EVENT: Connection complete to server -on polaris -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=1,T=0,M=0 -
      -COLOR=[TimeOnQueue: 0.000312 PostedTime: Jan 22 02 15:08:38 GMT -Updater: 389696393:mark:gfe:20941:0 -
      -Inventory: [(Cloud,P=0,A=1), (Discrepancy,P=0,A=1), (Gridded -Data,P=0,A=1), -(Hi Range Enhanced,P=0,A=1), (Linear,P=0,A=1), (Low Range -Enhanced,P=0,A=1), -(Mid Range Enhanced,P=0,A=1), (Prob Precip,P=0,A=1), (QPF,P=0,A=1), -(SLCWV,P=0,A=1), -(Steps,P=0,A=1), (Warm To Cold,P=0,A=1), (WaterColor,P=0,A=1), -(newTest,P=0,A=3) -]Additions: [(newTest,P=0,A=3) ] -
      -Deletions: [ ] -
      -Changes: [ ] -
      - ] -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -  -
      -  -

      -

      Execution with -t switch

      -Example output when using the -t switch: -

      camper > getNotify -h polaris -p 98000000 -u mark1 -t -
      -14:52:53.585 Client.C 146 EVENT: Establishing connection to server -on polaris -
      -14:52:53.598 Client.C 161 EVENT: Connection complete to server -on polaris -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 -
      -L=0,G=0,D=0,S=0,R=0,C=0,T=1,M=0 -
      -TEXT=[TimeOnQueue: 0.000276 PostedTime: Jan 22 02 14:52:59 GMT -Updater: 0:::0:0 -
      -Category: UserPython -
      -Inventory: [(n=AdjustValue_Down,c=UserPython,p=1,a=1), -(n=Show_ISC_Area,c=UserPython,p=0,a=1), -(n=WindChillTool,c=UserPython,p=0,a=1), -(n=SnowAmt_SmartTool,c=UserPython,p=0,a=1), -(n=Show_ISC_Grid,c=UserPython,p=0,a=1), -(n=Forecast,c=UserPython,p=1,a=1), -(n=Discrepancy_Value_Grid,c=UserPython,p=0,a=1), -(n=Translator,c=UserPython,p=0,a=1), -(n=HeatIndexTool,c=UserPython,p=0,a=1), -(n=QPF_SmartTool,c=UserPython,p=0,a=1), -(n=MinT_SmartTool,c=UserPython,p=0,a=1), -(n=Holidays,c=UserPython,p=0,a=1), -(n=AdjustValue_Up,c=UserPython,p=1,a=1), -(n=QPF_SnowAmt,c=UserPython,p=0,a=1), -(n=WxMethods,c=UserPython,p=1,a=1), (n=RHTool,c=UserPython,p=0,a=1), -(n=AnalysisMethods,c=UserPython,p=1,a=1), -(n=ISC_Utility,c=UserPython,p=0,a=1), -(n=Assign_Value,c=UserPython,p=1,a=1), -(n=Show_ISC_Highlights,c=UserPython,p=0,a=1), -(n=MaxT_SmartTool,c=UserPython,p=0,a=1), -(n=Smooth,c=UserPython,p=1,a=1), -(n=ISC_Discrepancies,c=UserPython,p=0,a=1), -(n=TextRulesMethods,c=UserPython,p=1,a=1), -(n=ISC_Tool,c=UserPython,p=0,a=2), -(n=SmartScript,c=UserPython,p=1,a=1) ] -
      -Additions: [(n=ISC_Tool,c=UserPython,p=0,a=2) ] -
      -Deletions: [(n=ISC_Tool,c=UserPython,p=0,a=3) ] -
      -Changes: [(n=ISC_Tool,c=UserPython,p=0,a=3) ] -
      - ] -

      -

      Each text notification is output.  The information contained -within -the notification is the text category, the updated inventory, the -additions, -deletions, and changes that occurred.  Each entry is defined by a -name, a category, a protection (p) field, and an access code (0-BASE, -1-SITE, -2-USER). -

      Execution with -m switch

      The user message notification consists of the message, and the priority. -

      L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0 +

      dx3-nhda{jdynina}117: python getNotify.py -h cpsbn1 -p 5672 -m
      +Get Notifications Diagnostic Program
      +Establishing connection to broker on cpsbn1
      +Establishing connection to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +L=0,G=7,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=8,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=15,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=11,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=6,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +USER=[
      +Message: ISC: PBZ ['MinT'] (21/00->21/13) #Grids=1
      +Priority: EVENTA
      +Category: ISC
      +,
      +] +

      -L=3,G=24,D=0,S=0,R=0,C=0,T=0,M=1
      -USER=[TimeOnQueue: 0.00016 PostedTime: Jan 22 02 16:22:19 GMT -Updater: -2688174985:afps:ifpInit:31108:0 -
      -Message: Model Data Arrived: LAPS (BOU) #Grids=3 -
      -Priority: 0 -
      - ] -
      -  -
      -

      -

      Execution with -b switch

      -The server process notification consists of the queue entries and -status.  For processes that are marked "Finished", the output from -standard out and standard err is part of the notification.  In -this example, ifpIMAGE was run on the ifpServer and an error -occurred.   The output from standard out and standard err is -in blue.
      -

      15:52:20.073 -getNotify.C 136 EVENT: L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0,B=1
      -15:52:20.074 getNotify.C 158 -EVENT: PROC=[TimeOnQueue: 0.000847 PostedTime: May
      -13 04 15:52:20 GMT Updater: -2688174985:afps:ifpServer:31720:0
      -ProcStat: [Finished UIname: Png -Images... CmdLine: ifpIMAGE -u SITE -h polaris -p 98000000 -c gfeConfig --o /localhost/home/afps/release/products/IMAGE Id: 1 Originator: -389696393:mark:gfe:13731:0 QueueTime: May 13 04 15:52:19 GMT StartTime: -May 13 04 15:52:19 GMT QueueTime: 0 EndTime: May 13 04 15:52:24 GMT -RunTime: 5
      -Output: ifpIMAGE 305 15:52:20.056 -PngWriter.py 577 EVENT:  ifpIMAGE Starting
      -ifpIMAGE -305 15:52:20.060 PngWriter.py 580 EVENT:  Build Date: Wed May 12 -01:37:43 2004 Built By: mark Built On: camper.fsl.noaa.gov (linux2) -Version: IFPS16 (ver. c) 05/11/04
      -ifpIMAGE -305 15:52:20.098 Client.C 163 EVENT: Establishing connection to server
      -on -polaris:98000000 ver=20040422
      -ifpIMAGE -305 15:52:20.109 Client.C 183 EVENT: Connection complete to server on -polaris
      -ifpIMAGE -305 15:52:20.190 Config.C 250 EVENT: Config::findFile(): initializing -from python module: gfeConfig
      -ifpIMAGE -305 15:52:20.193 DBSubsystem.C 216 EVENT: Server Host: polaris Port: -98000000
      -ifpIMAGE -305 15:52:20.194 DBSubsystem.C 218 EVENT: Username: SITE
      -ifpIMAGE -305 15:52:20.195 DBSubsystem.C 220 EVENT: Build Date: Wed May 12 -01:37:43 2004
      -ifpIMAGE -305 15:52:20.197 DBSubsystem.C 221 EVENT: Built By: mark
      -ifpIMAGE -305 15:52:20.198 DBSubsystem.C 222 EVENT: Built On: camper.fsl.noaa.gov -(linux2)
      -ifpIMAGE -305 15:52:20.199 DBSubsystem.C 223 EVENT: Version: IFPS16 (ver. c) -05/11/04
      -ifpIMAGE -305 15:52:20.263 Client.C 163 EVENT: Establishing connection to server
      -on -polaris:98000000 ver=20040422
      -ifpIMAGE -305 15:52:20.270 Client.C 183 EVENT: Connection complete to server on -polaris
      -ifpIMAGE -305 15:52:20.277 NetworkMgr.C 125 EVENT: Site Identifier: BOU
      -ifpIMAGE -305 15:52:20.279 NetworkMgr.C 139 EVENT: Site TimeZone: MST7MDT
      -ifpIMAGE -305 15:52:20.280 NetworkMgr.C 160 EVENT: Mutable Database: -BOU_GRID__Fcst_00000000_0000
      -ifpIMAGE -305 15:52:20.282 NetworkMgr.C 163 EVENT: Viewable Databases types: [, -D2D, V ]
      -ifpIMAGE -305 15:52:20.288 NetworkMgr.C 167 EVENT: My Workstation ID: -SITE@polaris.fsl.noaa.gov:ifpIMAGE:305:0
      -ifpIMAGE -305 15:52:20.291 NetworkMgr.C 168 EVENT: Network Protocol Version: -[20040422 ]
      -ifpIMAGE -305 15:52:24.650 PngWriter.py 35 EVENT:  Configuration File:  -gfeConfigifpIMAGE 305 15:52:24.745 PngWriter.py 320 PROBLEM:  -Png_parms missing or empty
      -ifpIMAGE -305 15:52:24.751 PngWriter.py 634 BUG:  Traceback (most recent -call last):
      -   -File "./gfe/ui/PngWriter.py", line 632, in main
      -   -File "./gfe/ui/PngWriter.py", line 398, in paint
      -   -File "./gfe/ui/PngWriter.py", line 60, in getParms
      -   -File "./gfe/ui/PngWriter.py", line 321, in initParms
      - UserWarning: -Png_parms missing or empty
      - 
      - ]
      - ]
      -15:52:23.102 getNotify.C 136 -EVENT: L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0,B=0

      Execution with -v switch

      The vtec table change notification consists of the table name, modification time, and modification source:
      -L=0,G=0,D=0,S=0,R=0,C=0,T=0,M=0,V=0,
      -L=3,G=24,D=0,S=0,R=0,C=0,T=0,M=0,V=0,
      -TableName: active
      -ModTime: Nov 11 2004 13:45:20 GMT
      -ModSource: VTECDecoder
      ] +dx3-nhda{jdynina}118: python getNotify.py -h cpsbn1 -p 5672 -v
      +Get Notifications Diagnostic Program
      +Establishing connection to broker on cpsbn1
      +Establishing connection to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +Connection complete to broker on cpsbn1
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +L=0,G=0,D=0,S=0,R=0,C=0,T=0,U=0,B=0,V=0,
      +VTEC=[
      +Table Name: 'OPERATIONAL'
      +ModTime: Jan 13 12 16:54:25 GMT
      +ModSource: VTECDecoder,
      +] +


      -


      -

      -


      -

      diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig.html b/cave/com.raytheon.viz.gfe/help/gfeConfig.html index a3bdac7d25..9b58b4b9a1 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig.html @@ -27,7 +27,7 @@ program. Normally the ifpIMAGE will have its own configuration file that inherits from the gfe configuration and, in some cases, has its own display -options.   Note that single quotes (' ') and double quotes (" +options.  Note that single quotes (' ') and double quotes (" ") are used interchangeably throughout the examples given of the display environment @@ -107,14 +107,10 @@ Monitor
      Formatter Launcher
      -
      -

      -  - diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Algor.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Algor.html index f494840448..4fba586c56 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Algor.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Algor.html @@ -396,10 +396,8 @@ for performance.

      ContourSubSample = 4


      -

       

      -
      diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_DB.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_DB.html index 23bcd7477e..3669f8cb27 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_DB.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_DB.html @@ -138,15 +138,13 @@ specific clipping for a weather element, BOU_mask = "CWA"
      Wind_mask = "CWA"
      mask = "CWA"


      -


      +

      -
      diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Discrete.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Discrete.html index 75517291a6..554a1b9f98 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Discrete.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Discrete.html @@ -133,8 +133,7 @@ used.

      The available fill patterns are:

      -
    239. -WHOLE
    240. +
    241. WHOLE
    242. WIDE
    243. SCATTERED
    244. WIDE_SCATTERED
    245. @@ -177,8 +176,7 @@ Overlap Patterns has been exhausted.

      The available fill patterns are:

      -
    246. -WHOLE
    247. +
    248. WHOLE
    249. WIDE
    250. SCATTERED
    251. WIDE_SCATTERED
    252. @@ -198,9 +196,8 @@ here.


      -
       
      diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_GHist.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_GHist.html index 85f3d3b622..ffa27d7aee 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_GHist.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_GHist.html @@ -227,14 +227,13 @@ color is HistoryModelColor_modelname.

      HistoryModelText_NAM = 'NAM'
      HistoryModelText_MesoNAM = 'NAM'
      HistoryModelText_AVN = 'AVN'

      +


      -

       

      diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_HW.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_HW.html index 24a7bfc3c0..3d9ddd98b3 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_HW.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_HW.html @@ -12,16 +12,9 @@

      GFE/ifpIMAGE Configuration File
      Graphical Hardware Configuration

      -The GFE is intended to run on a host of platforms.  Some -of these platforms contain graphical hardware accelerators.  The -GFE -will attempt to take advantage of the hardware accelerators by using -24-bit -plane visuals, double-buffering extensions, bitmaps, and overlay -planes.  -This section also controls some of the font sizes that are used in the +This section controls some of the font sizes that are used in the GFE.
      -
        +
      @@ -38,13 +31,6 @@ GFE.
      Notes
      - - - - - - @@ -61,30 +47,11 @@ Panes - - - - - -
      Use Bitmaps YESNO
      -
      Fonts YES
      Initial GFE GeometryYESNO
      -

      -


      -

      -Use Bitmaps -The useBitmaps indicate whether bit maps will be used for graphics -performance. -Some PC X servers do not implement a bitmap stipple fill in hardware. -This -can make the default rendering mode of maps (and other bitmaps) slow. -If -you suspect this might be the case, then set the following to 0. -

      useBitmaps = 1

      Fonts

      The fonts used by the GFE can be controlled.  For alignment purposes @@ -124,30 +91,10 @@ change the and image legend colors to prevent conflicts. -

      bgColor = "black"

      -

      Initial GFE Geometry

      -The initial GFE geometry may be specified using the geometry -identifier.  -The height and width of the initial GFE may be specified.  The -default -is that the GFE will occupy 90% of the available space on the -screen.  -This can be a problem for multiple-headed displays, since the GFE may -initially -be displayed across the two graphic heads.  The format of the -geometry -is the standard X format, thus the initial location may also be -specified, -as in the second example.  Refer to the X manuals for details on -the -geometry specification: <>geometry = '800x600'
      --or-
      -geometry = '800x600+200+150'

      -
        +

      bgColor = "black"

      +
      diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Map.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Map.html index 41b242bc57..2965f22508 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Map.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Map.html @@ -69,18 +69,11 @@ Pattern
      - - Map Background Labels - YES - YES -
      - - Map Background Font Offset YES YES - The entry Map_font defines the base font to be used on all + The entry defines the base font to be used on all map backgrounds. @@ -91,44 +84,21 @@ map backgrounds. Backgrounds

      The default map background list can contain zero or more map names.  -Refer to Maps.py in the server configuration file section for the +In AWIPS1 you could refer to Maps.py in the server configuration file section for the possible set of map names, or use the GFE to display the list of available maps -and choose names from the list.

      +and choose names from the list. In AWIPS2, currently a Maps.java file is used +and is not subject to overrides. There are planned changes to address this in +the future.

      The following variable will load the initial loaded set of map backgrounds. -The name of the
      -background should match the list of available maps defined in Maps.py -in the server configuration files.

      -

      MapBackgrounds_default = ['CWA','States']
      +The name of the +background should match the list of available maps defined in Maps.java.

      +

      MapBackgrounds_default = ['CWA','States']

      -

       

      +

       

      Map Background Colors

      -The available set of map background colors is specified in the -MapBackgrounds_availColors.  -At present, all map backgrounds use the first color, unless explicitly -overridden; the other colors are not assigned.  The list of -available -colors is used in the spatial editor popup button 3 menu over the map -legend.  -It is the list of colors that appear in the change graphic color menu. -

      The following variable defines the available colors for the map -backgrounds -that appears
      -in the color list popup button 3 over a map legend.

      -

      MapBackgrounds_availColors = ['gray60', 'yellow', 'white'] -

      -

      Default Map Background colors can be set by map name.  If you -want -a specific map background, such as States, to be a certain color, then -this can be defined in the configuration file.  You can always -change -the map background color to something else during the GFE -session.  -If not specified, the assigned default color for the map background -will -be the first entry in MapBackgrounds_availColors.

      The user may specify a specific color to be used for a map background, rather than getting a random color assigned. Format is @@ -174,33 +144,6 @@ mapName_linePattern.

      States_linePattern = "SOLID"

       

      -

      Map Label Offsets -

      -

      MapLabelXOffset and MapLabelYOffset are the number of pixels you -wish -to move map city labels relative to their "normal" position (Default is -(0,0)).

      -

      MapLabelXOffset = 0
      -MapLabelXOffset = 0
      -

      -

       

      -

      Map -Background Labels

      -

      Labels may be placed on any map background.  The choice of -labels -is limited to the shapefile attributes that are present for the -particular -map background.  For example, the States map background has the -following -attributes in its shapefile: STATE, FIPS, LON, NAME, recnum, LAT, -FE_ZONE.  -The format of specifying a default label attribute for the map -background -is mapName_labelAttribute = attributeName.

      -

      Cities_labelAttribute = "NAME"

      -

      Map Background Font Offset

      The font used for a specific map background display is based on three @@ -227,13 +170,12 @@ NNumbers can range from -2 through +2. Format is mapName_fontOffset.   Do not include a decimal point after these entries.

      States_fontOffset = 0

      +



       
    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Misc.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Misc.html index 6360e8f62c..0a0c74b959 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Misc.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Misc.html @@ -13,9 +13,9 @@

    GFE/ifpIMAGE Configuration File
    Misc. Configuration Items

    -This section contains miscellenous configuration items that don't seem +This section contains miscellaneous configuration items that don't seem to belong in any other category:
    -
      +
    @@ -32,13 +32,6 @@ to belong in any other category:
    Notes
    - - - - - - @@ -62,30 +55,7 @@ Algorithm - - - - - - - - - - - - - - - - - - - +
    Displaced Real Time OffsetYESNO
    -
    Grid Manager Sort Order YES
    Optional -Python Editor -ConfigurationYESNO
    -
    Network TimeoutYESNO
    -
    Product File and Log File Purge ThresholdsYESNO
    -
    helpBrowserProduct File Purge Threshold YES NO
    @@ -94,98 +64,7 @@ Configuration
    -

    -


    -

    -

    Displaced -Real Time -Offset

    -The drt time offset is used to make the GFE (or other application such -as runIFPText and runProcedure) run in displaced real time. -Normally this value is not set, which -means -the GFE runs in real-time.  Setting the value (either in a config -file or via a command line argument) will run the GFE -based -on the start time indicated.  This feature is normally only used -to review archive -cases and using canned data sets for training.  The start time can -be specified in several different ways:
    -
      -
    • As a -string -of "yyyymmdd_hhmm", where yyyy is the year, mm -is -the month, dd is the day, hh is the hour, and mm -is -the minutes. To start the GFE running as if the time was November 7, -2000 at -1505z, -the string would be "200001107_1505".
      -
      -      drtTimeOffset = "20001107_1505"

      -
    • -
    -
    -
      -
    • As a string Syyyymmdd_hhmm in which case, the starting -time will be set to the most recent hour.  This is intended for -use in a classroom setting where several applications (perhaps started -at different times within the same hour) need to be synchronized in -time. 
      -    # NOTES about synchronizing:
      -    # --With the Syyyymmdd_hhmm format -(synchronizing on) the "current time" for all processes started within -a given hour
      -    #   will be the same. This guarantees that -GFE's have the same current time, and ISC grid time stamps are - 
      -    #   synchronized and can be -exchanged.  Formatters launched from the GFE in this mode
      -    #   will be synchronized as well.
      -    #      --This does not solve the -problem in the general case.
      -    #        For -example, if someone starts the GFE at 12:59 and someone
      -    #        else -starts it at 1:01, they will have different offsets and
      -    #        current -times.
      -    # --With the yyyymmdd_hhmm format -(synchronizing off), when the process starts, the current time
      -    #   matches the drtTime in the command -line.  However, with synchronizing
      -    #   on, the current time will be offset by -the fraction of the hour at
      -    #   which the process was started. -Examples:
      -    #     Actual Starting -time:             -20040617_1230
      -    #     -drtTime                          -       20040616_0000
      -    #     Synchronizing off:
      -    #        GFE -Spatial Editor at StartUp: 20040616_0000
      -    #     Synchronizing on:
      -    #        GFE -Spatial Editor at StartUp: 20040616_0030

      -
    • -
    • As a string yyyymmdd_hhmm,yyyymmdd_hhmm  in -which case the offset from the current time will be the first time -minus the second time.  In other words the first time will be -"equated" to the second time.  So for example,  if the -drtTimeOffset is specified as  20040101_0000,20040201_0000  -then the offset will be approximately a month in the past.  In a -training situation, the first time should be the time of the use case -data and the second time should be close to the current time.  -This method guarantees that all applications will be synchronized no -matter when they were started.
    • -
    -

    Grid Manager Sort Order

    The Grid Manager Sort Order defines the order in which weather elements @@ -232,59 +111,21 @@ of the automatic weather element save interval.  The values can range from 0, to indicate Off, up to a reasonable value, such as 60, to save the grids automatically every hour. -

    AutoSaveInterval = 30

    -

    Optional -Python Editor Configuration File

    -This is the name of an optional config file for the python editor -(idle) -used by the GFE.  If this item is defined and the file exists in -the -etc/SITE directory, then the editor will read it and override the -default -configuration.  See the file etc/BASE/idleConfig.txt for -information -on what you can set.  At this time you can not override the key -bindings. -But this should change in the near future. -

    IDLECONF = "yourFile.txt"

    -


    -

    -

    Online help browser

    -Name of the web browser to use for online help. At this time, only -netscape -and mozilla are known to work. -

    helpBrowser = "netscape"

    -

    Network Timeout

    -The network timeout defines the amount of time to wait for any network -transaction.  The GFE could "freeze" for this length of time if -the -server is extremely busy.  It is not recommended that you change -this -number. The network timeout for connecting -to the ifpServer and for waiting for requests is specified in seconds. -

    networkTimeout = 240
    -
    -

    +

    AutoSaveInterval = 30

    -Product Directory Purge and Log -File Purge Thresholds

    +Product Directory Purge Threshold These entries define the number of hours to retain files within the -product directories (.../products) before purging them, and the +product directories before purging them, and the number of days of log files to retain before purging them.

    ProductPurgeHours = 6 -
    -LogFilePurgeDays = 7

    -


    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Png.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Png.html index 2218e29b25..c1a755242d 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Png.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Png.html @@ -72,7 +72,6 @@ elements.  Do not enable this in a normal GFE configuration file since the performance of the GFE will be unacceptable. -   PNG Weather @@ -188,8 +187,6 @@ Name NO YES Used typically with Png_interval. -
    - PNG File Type @@ -197,16 +194,6 @@ Name YES
    -
    - - - - PNG Join Polylines - NO - YES - Special use, usually not with .png file types. -
    - @@ -949,28 +936,10 @@ are case sensitive and only png, svg, and gif have been really tested. 'regis','tek', 'meta' ]

    Png_fileType = 'png'

    -

    Png Join Polylines

    -The Png_joinPolylines is a special use feature intended only for -programs -that use the output of ifpIMAGE for other purposes than for -display.  -Setting this to 1 will cause ifpImage to render contours as polylines -rather -than line segments.  You probably only want to do this for vector -graphics like svg as this takes longer to do and will look no different -with raster output like png. -

    Png_joinPolylines = 0 -
    -


    -


    -

    -
    -

     

    -
    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Pref.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Pref.html index e8d1ea2831..5827127850 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Pref.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Pref.html @@ -78,6 +78,24 @@ Mode
    + + Temporal +Editor Statistics +Mode + YES + NO +
    + + + + Temporal +Editor Statistics +Mode Scales + YES + NO +
    + + Wind Edit Mode YES @@ -115,6 +133,13 @@ Grid Algorithm
    + + Contour Sub-sample + YES + NO +
    + + Select Grids When Stepping YES @@ -214,6 +239,30 @@ relative mode which is defined by "yes" or "no".

     

    + +

    Temporal +Editor Statistics Mode

    +Initial statistics mode for temporal editor range statistics dialog. +Choices are "ABSOLUTE", # "MODERATED", or "STANDARD_DEVIATION". +

    TemporalEditorStatisticsMode = "ABSOLUTE"
    +

    +

      +

    +

    Temporal +Editor Statistics Mode Scales

    +Initial minimum and maximum values for scales on temporal editor range +statistics dialog in moderated and stadard deviation operation modes +(dialog is not shown in absolute mode). Do NOT include a decimal point +for moderated mode values, you MUST include a decimal point for standard +deviation values. +

    TemporalEditorStatisticsModeModeratedMin = 15
    +TemporalEditorStatisticsModeModeratedMax = 15
    +TemporalEditorStatisticsModeStandardDeviationMin = 1.0
    +TemporalEditorStatisticsModeStandardDeviationMax = 1.0

    +

    +

      +

    +

    Wind Edit Mode

    Default setting for editing components of vector parameters. Choices are @@ -278,6 +327,26 @@ Analyzer" or "Internal SIRS Server".

     

    + +

    Contour Sub-sample

    +The Contour Analyzer algorithm can run over a sub-sampled grid +to improve performance. This is usually ok since the contour tool +is mostly used where there is not much detail due to topography. +The value of ContourSubSample is used to divide the x and y dimensions +of the original grid to get the dimensions of the sub-sampled grid. +So, setting ContourSubSample to 4 would cause the Contour Analyzer to +reduce a 400x400 grid to a 100x100 grid for contouring purposes. +This can greatly speed up the algorithm. Setting ContourSubSample to +1 will cause no reduction. +The default value is 4. If ContourSubSample is set to a value less than +or equal to 0 then it will go back to 4. If it is set to a value large +enough to make the sub-sampled grid have an x or y dimension less than 5 +then it will be reduced so that the minimum dimension for x or y will be 5. +

    ContourSubSample = 4
    +

    +

      +

    +

    Select Grids When Stepping

    Specifies whether the selection time range will track the spatial @@ -345,15 +414,9 @@ Drawing Color Specifies the display color for the drawing aspect for the move/copy, select area, and contour drawing tools.  Default is "White".

    Drawing_color = "White"

    -
    -
    -

    - -


    -

     

    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_ProdGen.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_ProdGen.html index 7f1d95478d..dd60aefc07 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_ProdGen.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_ProdGen.html @@ -316,15 +316,10 @@ alphabetical order.

    ProductList = ["Png Images", "Ascii Grids", "YourProducts"]

    -  -


    -


    -

    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Samp.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Samp.html index 8df5de55c9..0776941ca5 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Samp.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Samp.html @@ -417,7 +417,7 @@ that are not surface-based.

     

    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_StartUp.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_StartUp.html index 3bef3e92b9..8e325e6577 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_StartUp.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_StartUp.html @@ -237,9 +237,8 @@ set of zone edit areas, or any other edit area group name.

    EditAreaGroups = ['Misc']


    -


    -

    - +

    + diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_UI.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_UI.html index 3ef93e3a3a..707a84c0bc 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_UI.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_UI.html @@ -133,14 +133,6 @@ Buttons
    - - Status Bar -Characteristics - YES - NO -
    - - Menu Item Limit Prior to Cascade @@ -372,23 +364,7 @@ result in only 7 quick set buttons being displayed.

    QuickSetButtons = 4

    -

     

    -

    Status Bar -Characteristics

    -The status bar appears on the bottom of the GFE.  The user may -control -when the new message indicator blinks on the arrival of a new message -by -adjusting the StatusTimeout entry.  The values are in 0.001ths of -a second. The number of messages kept in the message buffer may be -specified -in MessageLimit. -

    StatusTimeout = 30000
    -MessageLimit = 20
    -

    -

     

    +

     

    Menu Item Limit Prior to Cascade

    @@ -523,7 +499,7 @@ greater than the final "minutes" in the list, is Gray75.




    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_WE.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_WE.html index 42882f49b6..f8176ef266 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_WE.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_WE.html @@ -376,12 +376,19 @@ elements.

    QPF_contourValues = [0.01, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, -0.40, 0.50, +0.40, 0.50,
    -  0.60, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, -2.4, 2.6, 2.8, +  0.60, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, +2.4, 2.6, 2.8,
    -  3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0] +  3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0]

    +Topography_contourValues = [5.0, 10.0, 20.0, 30.0, 40.0, 50.0,
    +   60.0, 70.0, 80.0, 90.0, 100.0, 125.0, 150.0, 175.0, 200.0, 250.0,
    +   300.0, 350.0, 400.0, 450.0, 500.0, 600.0, 700.0, 800.0, 900.0,
    +   1000.0, 1250.0, 1500.0, 1750.0, 2000.0, 2500.0, 3000.0, 3500.0,
    +   4000.0, 4500.0, 5000.0, 5500.0, 6000.0, 6500.0, 7000.0, 7500.0,
    +   8000.0, 8500.0, 9000.0, 9500.0, 10000.0, 11000.0, 12000.0, 13000.0,
    +   14000.0, 15000.0, 16000.0, 17000.0, 18000.0, 19000.0, 20000.0]

    Contour Interval
    The user may also specify a contour interval for a weather @@ -415,9 +422,9 @@ surface-based, the format is weatherElementName_level_deltaValue.  Be sure to include a decimal point. -

    FzLevel_deltaValue = 100.0 +

    FzLevel_deltaValue = 100.0
    +SnowLevel_deltaValue = 100.0

    Fuzz Values

    Fuzz values are weather element specific.  If not defined, it @@ -691,11 +698,11 @@ parmName_level_windBarbDefaultSize.

     

    -

    Wind Arrow Scaling

    -The length of the wind arrows is porportionate to the percentage of the +

    Wind/Swell Arrow Scaling

    +The length of the wind/swell arrows is proportional to the percentage of the magnitude to the maximum allowable magnitude. The user may specify whether -this is a linear or a logrithmetic formula for each vector weather +this is a linear or a logarithmic formula for each vector weather element. The format of these entries is parmName_arrowScaling.  (For non-surface @@ -774,7 +781,9 @@ length if the factor value is 0.01.
      -

    Wind_arrowScaling = 0.03
    +

    Wind_arrowScaling = 0.03
    +Swell_arrowScaling = 0.001
    +Swell2_arrowScaling = 0.001

     

    @@ -883,20 +892,14 @@ SCALAR, VECTOR, WEATHER, and DISCRETE order:

    T_defaultValue = 32.0
    -Wind_SFC_magDefaultValue = 10.0 -
    -Wind_SFC_dirDefaultValue = 90.0 -
    Wx_defaultValue = -"<NoCov>:<NoWx>:<NoInten>:<NoVis>:" +"<NoCov>:<NoWx>:<NoInten>:<NoVis>:"
    +Wind_dirDefaultValue = 90.0
    -Headlines_defaultValue = "<None>"


    -

      -

    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_WECol.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_WECol.html index 00b5165cf4..866508f8ac 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_WECol.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_WECol.html @@ -79,7 +79,7 @@ Color Entries for Weather Type and Intensities


    -

    <>Weather +

    Weather Color Algorithm

    @@ -334,7 +334,7 @@ before a "random" color is chosen.

    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_Zoom.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_Zoom.html index 1a521f3fca..81a08596f0 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_Zoom.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_Zoom.html @@ -13,7 +13,7 @@

    GFE/ifpIMAGE Configuration File
    Dialog and Menu Configuration


    -
      +
    @@ -38,13 +38,6 @@ Configuration - - - - - - @@ -92,36 +85,6 @@ Defaults - - - - - - - - - - - - - - - - - - - @@ -185,30 +148,7 @@ An example for QPF is shown below:

    SetValue_zoom = 4
    QPF_SetValue_zoom = 10

    -

     

    -

     Spatial Editor Zoom -Configuration

    -The Spatial Editor Zoom configuration has two configurable items, the -number -of zoom steps and the zoom factor between steps.  The SEZoomSteps -can range from 3 to 9 and defines the number of zoom steps that are -available -on the editor.  The default value is 5.  The SEZoomFactor -defines -the amount of zoom to be applied for each step.  The value can -range -between 1.1 and 2.5, with the default being 1.5.  A value of 2 -means -each zoom step will zoom up by a factor of 2, so the zoom ratios will -be -1:1, 2:1, 4:1, 8:1, 16:1, etc. -

    The default values in the configuration file are shown below:

    -

    SEZoomFactor = 1.5
    -SEZoomSteps = 5
    -

    -

          
    -

    +

     

    Maximum Set Delta Dialog Values

    The default range of the Set Discrepancy Dialog is 20% of the weather @@ -303,26 +243,8 @@ also be specified. The units are hours and must range between 1 and 24. CreateScratchDefaultInterval = 1
    CreateScratchDefaultDuration = 1


    -
    -Scripts Dialog -Processor Mode
    - -
    -

    -
    -
    -

    Default setting for the Scripts -Dialog Processor Mode.  Options are "Server" and "Local".  It -is recommended that "Server" be used for better performance on the GFE. -

    -ScriptsDialog_Processor = -"Server"


    -
    -
    -
    Wx/Discrete: Show Description
    @@ -373,9 +295,8 @@ and weatherTypeSymbol_defaultIntensity.



    -
     
    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_commonValue.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_commonValue.html index 2c82be6ac3..048468874d 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_commonValue.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_commonValue.html @@ -6,7 +6,7 @@ - gfeConfig - Main Page + gfeConfig - Common Values
    @@ -33,7 +33,7 @@ these sections are separated by a colon (':').  The optional attributes, if any, are separated by commas (',').  The allowable coverages, type, -intensities, visibilities, and attributes are defined by the ifpServer +intensities, visibilities, and attributes are defined by GFE in its serverConfig.py file.

    For DISCRETE weather elements, the format of the string is the @@ -70,11 +70,10 @@ be used for both WEATHER and DISCRETE type of weather elements.


     "Patchy:F:<NoInten>:<NoVis>:<NoAttr>"]

    -

      - diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_font.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_font.html index fbf24778ad..9d1b2e401b 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_font.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_font.html @@ -6,7 +6,7 @@ - gfeConfig - Main Page + gfeConfig - Fonts
    @@ -203,9 +203,7 @@ the display.

    The following table defines the various display types, their entries, -and the software default.

    -
    +and the software default.


    Spatial Editor Zoom ConfigurationYESNO
    -
    Maximum Set Delta Dialog Values YES
    Preselected -Send ISC Dialog Weather Element GroupYESNO
    -
    Send -ISC -Dialog Times ConfigurationYESNO
    -
    Scripts -Dialog Processor Value
    -
    YES
    -
    NO
    -

    -
    Wx/Discrete: Show Description
    @@ -237,25 +235,16 @@ and the software default.
    - - - - - -
     
    Cline_font 2
    Map Background labelsMap_font2
    -
     
    -
    +
    BoundedArea_font = 2
    Cline_font = 2
    -Map_font = 2
    Contour_font = 2


    - diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_formatterLauncher.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_formatterLauncher.html index e55c2ad3cb..2ef77fa26a 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_formatterLauncher.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_formatterLauncher.html @@ -16,7 +16,7 @@ Formatter Launcher

    These configurable items define the formatter launcher, zone combiner, and product output options:
    -
      +
    @@ -157,17 +157,6 @@ Combiner Label Groups
    - - - - - - - - - + @@ -228,9 +224,7 @@ but not for you to edit directly:
    YES
    - - - + @@ -238,9 +232,7 @@ but not for you to edit directly: - - - + @@ -248,22 +240,13 @@ but not for you to edit directly: - - - +

    VTEC Test -Decoder Mode
    -
    YES
    -
    NO
    -
    Special use for testing only
    -
    Product Editor Directory
    @@ -325,22 +314,7 @@ map. 0 for disabled, 1 for enabled.

    ZoneCombiner_LabelGroups = 1
    -
    -
    -
    -
    VTEC -Test Decoder Mode
    -
    -

    Enables the Simulate Transmit buttons on the Formatter Launcher by -setting the value to 1.   This button allows simulating -transmit through the SBN by directly sending data to the VTEC Decoder -(active table).  This differs from the PRACTICE mode simulate -transmit button which sends data to the PRACTICE vtec -table.   This configurable item also enables the "Open File -(Simulate COR)" menu entry.
    -

    -TestVTECDecode -= 0
    +


    ProductOutputDialog_CTAWidth = 575
    ProductOutputDialog_CTAHeight = 300

    - +



    -
    -

     

    -
    - - diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_heading.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_heading.html index 98009baac8..54e5cb398f 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_heading.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_heading.html @@ -26,19 +26,19 @@ file. There should be no reason to change these settings in this file.

    import siteConfig
    GFESUITE_HOME = siteConfig.GFESUITE_HOME
    -GFESUITE_DATDIR = siteConfig.GFESUITE_DATDIR
    -GFESUITE_DOCDIR = siteConfig.GFESUITE_DOCDIR
    +GFESUITE_SERVER = siteConfig.GFESUITE_SERVER
    +GFESUITE_PORT = siteConfig.GFESUITE_PORT
    +GFESUITE_SITEID = siteConfig.GFESUITE_SITEID
    GFESUITE_PRDDIR = siteConfig.GFESUITE_PRDDIR
    -GFESUITE_ETCDIR = siteConfig.GFESUITE_ETCDIR
    +GFESUITE_MHSID = siteConfig.GFESUITE_MHSID
    +GFESUITE_LOGDIR = siteConfig.GFESUITE_LOGDIR
    yes = 1
    no  = 0



    - diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_hiding.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_hiding.html index 187578f675..a5a3e38821 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_hiding.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_hiding.html @@ -33,12 +33,10 @@ applicable to the GFE and ifpIMAGE configuration files.

    HideConfigFile = 1

    -
    -
      - diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_nonWECol.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_nonWECol.html index ae0b38f2a0..33bcdb904b 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_nonWECol.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_nonWECol.html @@ -91,10 +91,7 @@ the minimum wavelength, maximum wavelength, and number of colors that the default color table uses.

    Depending upon the hardware graphics capability in use, you may not -want to increase the number of colors too far.  On 8-bit hardware, -the number of colors totally available is 256 and these must be shared -between applications.  On 24-bit hardware, the number of available -colors is increased. +want to increase the number of colors too far.

    The left wavelength defines the left side value for the color in nanometers. @@ -109,25 +106,7 @@ is displayed. DefaultColorTable_rightWavelength = 650.0
    DefaultColorTable_numColors = 70 -

    -

    The number of colors to use in standard color tables is defined in -the -ColorTable_maxSize entry.  Typically the D2D color tables that are -used in the GFE application contain 256 colors.  This is usually -too -many colors for the display, especially if the display is an 8-bit -X-terminal.  -Depending upon the hardware graphics capability in use, you may not -want -to increase the number of colors too far. -

    -

    The number of colors in these tables are reduced by sampling down to -the number given. -

    -

    ColorTable_maxSize = 70 -
    -  -

    +


    Weather Element Default Color Tables

    @@ -146,7 +125,9 @@ the popup menu over the legend to see a list of color tables. If a default color table is not defined for a parameter, then the spectrum defined in -DefaultColorTable* will be used for the parameter. +DefaultColorTable* will be used for the parameter.
    +

    Note: In AWIPS2 this list is greatly expanded. See gfeConfig.py +for full list.

    T_defaultColorTable="midrange enhanced"
    Td_defaultColorTable="midrange enhanced" @@ -282,8 +263,8 @@ those in the database.

    T_maxColorTableValue = 120.0
    T_minColorTableValue = -30.0
    -

    -


    +WetBulb_maxColorTableValue = 50.0
    +WetBulb_minColorTableValue = 20.0

    The user may also specify that the initial color table is calculated based on the "fit to data" algorithm.  All of the grid values are @@ -310,7 +291,7 @@ entry.

    T_fitToDataColorTable = "None"

    -

      +

    Color Bar Label @@ -331,7 +312,7 @@ does not apply to Weather data types, only scalar and vector.


    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_process.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_process.html index 1fa91fe6f4..3040ef4e36 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_process.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_process.html @@ -69,7 +69,7 @@ characteristics of the GFE.
    This item defines the number of lines that are held in the terminal window displayable from the Process Monitor -Dialog, before scrolling off.  If you aren't able to capture +Dialog, before scrolling off.  If you aren't able to capture as much of the process output as desired, then you should increase this number.  This affects the capacity of the terminal window only.

    ProcessMonitorMaxLines = 2000
    @@ -105,12 +105,8 @@ even if starting a process would exceed this threshold.



    -
    -


    -
    diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfig_sysTR.html b/cave/com.raytheon.viz.gfe/help/gfeConfig_sysTR.html index 6bbc2a441a..3d976a977f 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfig_sysTR.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfig_sysTR.html @@ -6,7 +6,7 @@ - gfeConfig - Main Page + gfeConfig - Time Range
    @@ -38,11 +38,11 @@ and the occurance of locks (for the mutable database).

    SystemTimeRange_afterCurrentTime = 168


    -
      - diff --git a/cave/com.raytheon.viz.gfe/help/gfeConfiguration.html b/cave/com.raytheon.viz.gfe/help/gfeConfiguration.html index 96aa69a756..a7ba1cba9f 100644 --- a/cave/com.raytheon.viz.gfe/help/gfeConfiguration.html +++ b/cave/com.raytheon.viz.gfe/help/gfeConfiguration.html @@ -31,9 +31,9 @@ files.  Some of these files may be overridden by the site or by individual users.  The GFE configuration files define many of the display characteristics of weather elements, such as color tables, contour intervals, user interface fonts, as well as default modes for many of the tool states. -

    By default, the GFE uses a configuration file called gfeConfig.GFECONFIG.  +

    By default, the GFE uses a configuration file called gfeConfig.py. This is provided as an installed file in BASE, and can be overridden by -the site or individual users.   At no +the site or individual users.  At no time should the files that are sent with the software release or install be modified directly.  These will be overwritten with the next upgrade.

    The technique to modify or create new gfe configuration @@ -53,7 +53,7 @@ configuration file is documented here.

    There are several scenarios for modifying the standard gfe configuration option.  The recommended option is partial site overrides and user overrides from the installed base.  You can override all entries in -the gfe configuration file.    +the gfe configuration file. The configuration overrides described below describe the actual locations of the files.  Normally you would define a new configuration file by using the GFE GUI. @@ -73,28 +73,30 @@ This is the default case.  There is nothing you need to do.
     

    Partial Site Override of Standard GFE Configuration (recommended)

    -Start the GFE with username "SITE". Create a new gfe configuration file +Start the Localization perspective from the main menu by selecting +GFE->Define Config and ifpIMAGE Files. Create a new gfe configuration file with just the entries you want to override.  The filename must be different from the base configuration file since you will be importing all of the definitions from the base configuration file. This should be -a small file.  Save the file, which puts it in the SITE area of the +a small file.  Save the file in SITE, which puts it in the SITE area of the server.  The advantage of partial overrides is that new BASE files can be installed and your overrides will still work. Be sure to include the appropriate Python "import" statement.
     

    Partial User Override of Site's or Standard GFE Configuration (recommended)

    -Start the GFE with the particular username for which you wish to create -a gfe configuration file. Create a new gfe configuration file with just +Start the Localization perspective from the main menu by selecting +GFE->Define Config and ifpIMAGE Files for the user for whom you want to create a +new configuration. Create a new gfe configuration file with just the entries you want to override, but use a different name. Be sure to use the Python import statement to include all of the definitions from the SITE or BASE files. (Note: the list of all of the available files are presented to you when you start the GFE.) The created file should be a -small file.   Save the file, which puts it at the user's customized +small file.  Save the file for your user name, which puts it at the user's customized location in the server.  The advantage of partial overrides is that new BASE or SITE  files can be installed and your overrides will still work. -
      +

    Complete Site Override of Standard GFE Configuration (not recommended)

    @@ -108,7 +110,7 @@ The filename should remain the same. The disadvantage of this situation is that you will need to do a careful comparison between newly upgraded files and your modified files after each upgrade, and you will not be able to import files of the same name. -
      +

    Complete User Override of Standard GFE Configuration (not recommended)

    @@ -122,12 +124,9 @@ location. The filename should remain the same. The disadvantage of this situation is that you will need to do a careful comparison between newly upgraded files and your modified files after each upgrade, and you will not be able to import files of the same name. -
     
    +
    -

    -
    -

    How the GFE Gets Its Configuration

    @@ -136,12 +135,13 @@ The GFE and ifpIMAGE programs get their configuration through the standard SITE, USER file access scheme. Only those items that you wish changed are necessary to place in the SITE and USER directories since you can refer to the files at the higher level using the "import" statement. -

    The method you use to place files at the SITE and USER level is to start -the GFE and supply either a user name or "SITE" for the SITE administrator.  +

    The method you use to place files at the SITE and USER level is to access +the Localization perspective either through GFE, or directly and save the +created files to the SITE/USER levels as desired. You then access the define gfe configuration file through the main menu entry GFE->Define -Config and ifpIMAGE files.   Please -do not  modify the files directly in the server directories; instead +Config and ifpIMAGE files.  Please +do not modify the files directly in the server directories; instead use the GFE.

    The illustration shows how the access is performed:
    @@ -203,7 +203,7 @@ not shown):

    Location of Files

    -The gfe configuration files are served out of the ifpServer.  As +The gfe configuration files are served out of EDEX. As a result, you should NEVER edit these files directly.  The location of the gfe configuration files are shown for your convenience, but not for you to edit directly: @@ -214,11 +214,7 @@ but not for you to edit directly:

    Part of Std. Rel.RPP File Location, directory -
    (~/release/data/databases...)
    AWIPS File Location, directory -
    (/data/adapt/ifps/databases...)
    AWIPS File Location, directory
    /BASE/TEXT/GFECONFIG//BASE/TEXT/GFECONFIG//awips2/cave/etc/gfe/userPython/gfeConfig
    NO/SITE/TEXT/GFECONFIG//SITE/TEXT/GFECONFIG//awips2/edex/data/utility/cave_static/site/SITE_ID/gfe/userPython/gfeConfig
    NO/user/TEXT/GFECONFIG//user/TEXT/GFECONFIG//awips2/edex/data/utility/cave_static/user/USER/gfe/userPython/gfeConfig
    -* user is the user name +* USER is the user name


    -
      - - -
      -
      -
      -
      -
      -
      + +
    diff --git a/cave/com.raytheon.viz.gfe/help/ifpAG.html b/cave/com.raytheon.viz.gfe/help/ifpAG.html index 8a6eed87f6..75123ff439 100644 --- a/cave/com.raytheon.viz.gfe/help/ifpAG.html +++ b/cave/com.raytheon.viz.gfe/help/ifpAG.html @@ -5,12 +5,12 @@ content="text/html; charset=iso-8859-1"> - ifpServer ASCII Grid Format and ifpAG Program + ASCII Grid Format and ifpAG Program

    ifpAG User's Guide

    -
    April 4, 2006
    +
    January 4, 2012
    Table of Contents

    @@ -52,14 +52,13 @@ Use of ifpAG to exchange grids between different resolutions of GFESuite

    -
    The current ifpServer (common data server) +
    +
    The current EDEX (common data server) currently -uses a C++ interface to store and retrieve grids in the database. While +uses a Java interface to store and retrieve grids in the database. While this works well for the Graphical Forecast Editor and initialization processes, -it makes it difficult for field sites to store and retrieve data into -the +it makes it difficult for field sites to store and retrieve data into the database.
     
    @@ -81,15 +80,11 @@ program to take 5 kilometer resolution grids from GFESuite and populate another GFESuite running at 2.5 kilometer resolution.  Of course, data resolution -will be lost.    Obviously there are some cases where +will be lost. Obviously there are some cases where grids cannot be transferred, such as the input and output domains don't overlap at all or the projection is different (e.g., Grid211).
    -
    -
    -

    -

    Terminology @@ -102,7 +97,7 @@ basic GFESuite concepts.

    Server Configuration

    -
    The ifpServer configuration file (The GFE configuration file (serverConfig and localConfig) define all parameters, types of databases, and their attributes. The configuration file is @@ -112,7 +107,7 @@ configuration manual for further information.

    Data Types

    -
    The ifpServer supports four different data types: +
    GFE supports four different data types: SCALAR, VECTOR, WEATHER, and DISCRETE. SCALAR is used for parameters whose values can be represented by a single value. VECTOR is used for @@ -129,11 +124,9 @@ grids.
    A parameter identifier is used to uniquely identify an element in the database. A parameter identifier consists of two -parts:
    -
    parameter name, and database identifier. A -complete +parts: parameter name, and database identifier. A complete identifier (in ASCII) may appear like the following in the ASCII grid -file:
    +file:

    Wind
    BOU
    <notype>
    @@ -149,25 +142,25 @@ The example above indicates that the parameter is Wind. It is from (or derived from) 1the May 6, 1998 1200z eta model. The optional type is blank in the above case.
    -
      +

    There may be some databases which always exist, i.e., are not model -time based. Typically the forecast database is handled this way.  -An example identifier for the forecast database is shown below:
    +time based. Typically the forecast database is handled this way. +An example identifier for the forecast database is shown below:

    T
    BOU
    <notype>
    Fcst
    00000000_0000
    -
      +

    The date-time group of all zeros indicate that the database is persistent -and therefore does not have a model run time associated with it.
    -
    A full list of parameters, site identifiers, and -model names supported by the ifpServer is available in the server +and therefore does not have a model run time associated with it. +A full list of parameters, site identifiers, and +model names supported by GFE is available in the server configuration -files.  Refer to the server +files. Refer to the server configuration manual for details. This server configuration files may be tailored @@ -175,43 +168,36 @@ by each site.

    Note that the parameter name may contain a level.  Many of the parameters are surface-based, but for those that are not, the parameter definition is in the form of name_level, such as Wind_MB500 for the -500MB Wind.

    +500MB Wind.

    Time Range (Valid time of grid)

    Time is defined as a TimeRange which consists of a starting and ending time. A TimeRange contains all times from and -including
    -
    the starting time up to but not including the +including the starting time up to but not including the ending time. For example, a TimeRange of 1:00pm to 2:00pm contains all times -from
    -
    1:00pm including 1:00pm up to but not including +from 1:00pm including 1:00pm up to but not including 2:00pm.
    -
      +

    All data stored in the database uses this time definition. The duration -of data is calculated by taking subtracting the starting time
    -
    from the ending time. Note that a duration of -zero +of data is calculated by taking subtracting the starting time +from the ending time. Note that a duration of zero means a snapshot in time. Durations of zero are illegal for the -database -since a
    -
    forecast field must have a valid time range.
    -
      +database since a forecast field must have a valid time range.
    +

    -The format of the time is in yyyymmdd_hhmm. For example,
    -
    19980518_1300
    +The format of the time is in yyyymmdd_hhmm. For example,

    +
    19980518_1300

    indicates May 18, 1998 at 1300z.

    Geographical Location Information

    Associated with each grid is geographical location which is used to position the grid on the earth's surface.The placement -of the
    -
    grid in the world coordinate system is based on +of the grid in the world coordinate system is based on three items:
      @@ -222,8 +208,7 @@ items:
    All of these items are defined in the individual database configuration files. An example of these values are shown below -for the
    -
    Boulder WFO area:
    +for the Boulder WFO area:
    •     projection identifier = Grid211 (AWIPS Conus)
    • @@ -235,11 +220,9 @@ Grid211 (AWIPS Conus)
    This is interpreted as a 73 x 73 point grid whose lowest-left grid point is at the world coordinate (37, 27) on the AWIPS -world
    -
    coordinate projection and whose uppermost-right +world coordinate projection and whose uppermost-right grid -point is at the world coordinate (37+9, 27+9) as shown in the diagram
    -
    below:
    +point is at the world coordinate (37+9, 27+9) as shown in the diagram below:

    @@ -281,8 +264,7 @@ on the specified time constraints. The starting time indicates the time of the first possible grid after 0000z. The duration indicates the length of the grid. The repeat interval defines how often the grid can repeat. -All of the units are in seconds. -
    For example, the illustration below shows the +All of the units are in seconds. For example, the illustration below shows the possible grid boundaries for a time constraint of starting time of 0, duration of @@ -293,8 +275,7 @@ of hours long, but could be 12 or 18 or even 24 hours in length just as long as the starting and ending time of the grid falls on one of the defined -above.
    -
    A time constraint can be defined to have gaps in +above. A time constraint can be defined to have gaps in the data. For example, a 24-hour summary of daytime maximum temperature may have a constraint of starting time 900z, duration of 18 hours, and a repeat interval of 24 hours:
    @@ -308,10 +289,8 @@ a one hour constraint (start time = 0000z, repeat = 1 hour, duration =

    A special case exists which defines no constraints. This is the situation with a start time, repeat, and duration values -all -set to 0. The temporal resolution of the grids can be one second. +all set to 0. The temporal resolution of the grids can be one second.

    Data Format

    The format of the data depends upon whether the @@ -341,7 +320,7 @@ to vision that are present for that gridpoint. The entire set of characters on a single line is called a weather key. A weather key is comprised of weather sub keys.
    -
      +

    A weather subkey consists of four parts and one additional optional part:
    @@ -352,7 +331,7 @@ scattered or slight chance)
        visibility (e.g., 25 m)
        attributes (e.g., "in mountains")
    -
      +

    The general format of a single weather sub key is: coverage:type:intensity:visibility:attributes
    @@ -365,7 +344,7 @@ type or obstruction as a string of characters. The intensity field is a string of characters that denote an intensity. The visibility string denotes the character. The list of optional attributes are comma deliminated.
    -
      +

    Multiple weather sub keys are separated by the caret (^) character like this:
    @@ -376,9 +355,7 @@ There is no (practical) limit to the number of types of weather. Multiple weather types at a single grid point require a weather key that contains -multiple groupings.
    -
    -
    A typical weather key is shown below:
    +multiple groupings. A typical weather key is shown below:

    ISO:T:+:1/4sm:HvyRain^ISO:A:<NoInten>:<NoVis>:SmA

    which is decoded as isolated intense thunder with @@ -410,7 +387,6 @@ that gridpoint. The entire set of characters on a single line is called a discrete key. A discrete key may be  comprised of discrete sub keys.  Subkeys are separated by the '^' character. -

     
    A typical discrete key is shown below:

    WintStmWRN^HiWndWRN

    @@ -430,9 +406,7 @@ the weather element configuration section of the serverConfig documentation for further details.

    Organizational Order of the Grid

    Grids are organized from lower-left across and @@ -447,14 +421,14 @@ shown:
    Running the ifpAG Program
    The program is capable of both storing and retrieving -grids from the ifpServer. -

    Note: when running ifpAG in the normal +grids from EDEX. +

    Note: when running ifpAG in the normal environment, the -h and the -r switches are preset to the values defined by your installation, -and thus the -h and -r switches are not needed.  If you are +and thus the -h and -r switches are not needed. If you are connecting -to a different ifpServer than configured, then you will need the -h and +to a different EDEX than configured, then you will need the -h and -r switches.

    @@ -462,11 +436,11 @@ to a different ifpServer than configured, then you will need the -h and
    The command line syntax is:
    ifpAG -o outputFile -h hostname -r rpcPortNumber --d databaseID [-p parmID] [-s startTime] [-e endTime] [-c +-d databaseID [-p parmID] [-s startTime] [-e endTime] [-u username] [-c domainConfiguration]
    A sample command line is:
    -
    ifpAG -o testIt -h abc.fsl.noaa.gov -r -95000000 +
    ifpAG -o testIt -h dx3-oax -r +9581 -d TEST_GRID__Fcst_00000000_0000 -p Temp -s 19980604_1200 -e 19980605_0000
     
    @@ -480,28 +454,27 @@ domainConfiguration]
    -o filename Mandatory - Specifies the name of the output file.  If "-" is used, + Specifies the name of the output file. If "-" is used, output will go to standard out. -h hostname Mandatory (See Note) - Specifies the host, upon which the ifpServer is running + Specifies the host, upon which EDEX is running -r port Mandatory (See Note) - Specifies the port, upon which the ifpServer is running + Specifies the port, upon which EDEX is running -d databaseid Mandatory Source, a.k.a. database identifier, from which to get the -data.  +data. There may be several databaseIDs (several -d's) specified.  The -format -of the database identifier is: +format of the database identifier is: site_GRID_optType_modelName_modelRunTime. An example is DEN_GRID__eta_19980604_1200. @@ -514,10 +487,15 @@ databases will be processed.  There may be several -p switches present if desired.  The weather element name can include a level, if desired, -such as T_3K.  By default if the level is not specified, it is +such as T_3K. By default if the level is not specified, it is assumed to be SFC. + + -u username + Optional + The user running the program. + -s startTime Optional @@ -545,7 +523,7 @@ Format is yyyyMMDD_HHMM or 19980604_1200. Optional By default, the grids are output in the same projection, domain, and -grid resolution as they are stored in the ifpServer.  You can +grid resolution as they are stored in GFE. You can override the domain configuration by specifying an encoded string in quotes.  @@ -554,22 +532,16 @@ yextent". An example is "35 35 Grid211 28.0 14.0 9.0 9.0". -Note:  that when running ifpAG within the +Note: that when running ifpAG within the standard GFESuite environment, the -h and -r switches are automatically filled -in -for the configured ifpServer and port. If -environment variables ${CDSHOST} or ${CDSPORT} -are defined, then the default server and port will be determined from -the environment variables. +in for the configured EDEX and port.

    Input Mode

    The command line syntax is:
    ifpAG -i inputFile -h hostname -r -rpcPortNumber
    +rpcPortNumber [-u username]
    A sample command line is:
    -
    ifpAG -i testIt -h abc.fsl.noaa.gov -r -95000000
    -
     
    +
    ifpAG -i testIt -h dx3-oax -r 9581 -u jsmith

    @@ -580,57 +552,44 @@ rpcPortNumber - - + - + + + + + +
    -i filename Mandatory Specifies the name of the input file.  If "-" is used, -input will + Specifies the name of the input file. If "-" is used, input will come from standard in.
    -h hostname Mandatory (See Note)Specifies the host, upon which the ifpServer is runningSpecifies the host, upon which EDEX is running
    -r port Mandatory (See Note)Specifies the port, upon which the ifpServer is runningSpecifies the port, upon which EDEX is running
    -u usernameOptionalSpecifies the user running the program
    -Note:  that when running ifpAG within the +Note: that when running ifpAG within the standard GFESuite environment, the -h and -r switches are automatically filled in -for the configured ifpServer and port.   -If environment variables ${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -r switches. +for the configured EDEX and port.

    Special Use of ifpAG to exchange grids between different resolutions of GFESuite

    ifpAG can be used to communicate with different -servers -of GFESuite that are running different resolutions.
    -
    You cannot use ifpAG supplied with the current -version -of GFESuite to communicate with a different version of GFESuite due to -ifpServer protocol changes. If you attempt this, you will receive "RPC -Protocol Version" errors since the program will not be able to -communicate -with the ifpServer.   You can, however; take an ifpAG -executable -from a different release, rename it, and use it to communicate with -your -remote server if the protocol has changed.
    -
    To transfer all data in the Fcst database from -the +servers of GFESuite that are running different resolutions. To transfer +all data in the Fcst database from one server to the other server, you will use a command line similar to that below:
    -

    ifpAG -o - -h rpp-bou -r 98000000 -d +

    ifpAG -o - -h dx3-oax -r 9581 -d BOU_GRID__Fcst_00000000_0000 -| ifpAG -i - -h dx4f -r 98000000 +| ifpAG -i - -h dx3-oax -r 9581


    @@ -639,7 +598,6 @@ BOU_GRID__Fcst_00000000_0000 is interpreted. More than one GRID may be contained in a single file.

    Scalar

    -  @@ -1031,15 +989,7 @@ of yyyymmdd_hhmm
    -
    -  -
    -  - -


    -  diff --git a/cave/com.raytheon.viz.gfe/help/ifpBreakAllLocks.html b/cave/com.raytheon.viz.gfe/help/ifpBreakAllLocks.html index d2f98319e0..e16a4b3444 100644 --- a/cave/com.raytheon.viz.gfe/help/ifpBreakAllLocks.html +++ b/cave/com.raytheon.viz.gfe/help/ifpBreakAllLocks.html @@ -12,12 +12,11 @@ alink="#ff0000">

    ifpBreakAllLocks User's Guide

    -August 1, 2003 +January 4, 2012

    -The ifpBreakAllLocks program is part of the GFESuite software.  +The ifpBreakAllLocks program is part of the GFESuite software. It can be used to break all the locks on all the Weather Elements in -the identified -ifpServer. +the identified GFE. WARNING: This operation may result in the loss of data so the program should be used with caution.
    @@ -26,11 +25,9 @@ data so the program should be used with caution.

    Command Line Switches

    The command line syntax is: -

    ifpBreakAllLocks -h hostname -p rpcPortNumber [-a] [-d +

    ifpBreakAllLocks -h hostname -p rpcPortNumber -s siteID [-a] [-d databaseID]

    -  @@ -41,12 +38,17 @@ databaseID]
    - + - + + + + + + @@ -64,64 +66,29 @@ required.
    -h Mandatory (see Note)Host name upon which the ifpServer is runningHost name upon which EDEX is running
    -p Mandatory (see Note)RPC port upon which the ifpServer is runningRPC port upon which EDEX is running
    -sMandatorySite id for which GFE is running
    -a
    @@ -54,7 +56,7 @@ databaseID]
    Optional
    Specifies that all databases -will have their locks removed.  Either the -a or -d switch is +will have their locks removed. Either the -a or -d switch is required.
    Optional
    Specifies the database that will -have the locks removed.  There may be more than one -d switch -present.  Either the -a or -d switch is required.
    +have the locks removed. There may be more than one -d switch +present. Either the -a or -d switch is required.
    -Note: The -h and -p switches are predefined -when running in an installed GFESuite environment.  They are -defined -to the values specified when installing the software.  If you wish -to connect to a different ifpServer, then the switches will need to be -specified.  If environment variables -${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -p switches. Either the -a or -d switch is -required. +Note: The -h and -p switches are predefined +when running in an installed GFESuite environment. They are defined +to the values specified when installing the software. If you wish +to connect to a different EDEX, then the switches will need to be +specified.


    Sample Output


    -13:14:01.220 BreakAllLocks.py 37 EVENT:  Break All Locks -starting +17:01:04 ifpBreakAllLocks.py INFO: Break All Locks starting
    +17:01:12 ifpBreakAllLocks.py INFO: No locks found
    +17:01:12 ifpBreakAllLocks.py INFO: Break All Locks Finished

    -13:14:01.234 Client.C 146 EVENT: Establishing connection to server -on polaris:98000000 ver=20020314 -
    -13:14:01.251 Client.C 162 EVENT: Connection complete to server -on polaris -
    -13:14:04.140 BreakAllLocks.py 20 EVENT:  Lock:  -T_SFC:BOU_GRID__Fcst_00000000_0000 -(Mar 30 02 08:00:00 GMT, Mar 30 02 09:00:00 GMT) -mark@camper.fsl.noaa.gov:gfe:7781:0 -
    -13:14:04.148 BreakAllLocks.py 20 EVENT:  Lock:  -T_SFC:BOU_GRID__Fcst_00000000_0000 -(Mar 30 02 17:00:00 GMT, Mar 30 02 18:00:00 GMT) -mark@camper.fsl.noaa.gov:gfe:7781:0 -
    -13:14:04.152 BreakAllLocks.py 20 EVENT:  Lock:  -T_SFC:BOU_GRID__Fcst_00000000_0000 -(Mar 31 02 02:00:00 GMT, Mar 31 02 03:00:00 GMT) -mark@camper.fsl.noaa.gov:gfe:7781:0 -
    -13:14:04.156 BreakAllLocks.py 20 EVENT:  Lock:  -T_SFC:BOU_GRID__Fcst_00000000_0000 -(Mar 31 02 13:00:00 GMT, Mar 31 02 14:00:00 GMT) -mark@camper.fsl.noaa.gov:gfe:7781:0 -
    -13:14:05.810 BreakAllLocks.py 37 EVENT:  Break All Locks -Finished -
    - 



    -Return to Table of Contents +Return to TOC diff --git a/cave/com.raytheon.viz.gfe/help/ifpIMAGE.html b/cave/com.raytheon.viz.gfe/help/ifpIMAGE.html index c6278d438b..e52b698c83 100644 --- a/cave/com.raytheon.viz.gfe/help/ifpIMAGE.html +++ b/cave/com.raytheon.viz.gfe/help/ifpIMAGE.html @@ -11,7 +11,7 @@

    The ifpIMAGE User's Guide

    -
    July 23, 2003
    +
    January 4, 2012

    Table Of Contents

    @@ -152,7 +152,7 @@ imagery.
    -
      +

    The configuration of the ifpIMAGE program is not done through command line switches.  Instead it uses a GFE configuration file which is @@ -164,31 +164,27 @@ can be used to specify the configuration file to be used,  the (which defaults to SITE), and optionally the base time. -
    +

    +
    When the ifpIMAGE program is executed, the program reads the specified configuration file, sets up the GFE in background mode, loads the specified data and generates images.  By default, images are generated -for all available grids for the given parameters.  Each output PNG +for all available grids for the given parameters. Each output PNG is named with a unique timestamp to help sort out the many PNG -images.   +images. In addition, an "info" file is generated for each PNG which contains descriptive information about the PNG.

    - -
     
    -
    -

    Configuring ifpIMAGE

    @@ -227,7 +219,6 @@ files end up in the SITE directory.

    Running ifpIMAGE

    The command line options for ifpIMAGE are:
    -  @@ -300,18 +291,17 @@ time or 0000z.
    -

    Note: When running ifpIMAGE in a normally +

    Note: When running ifpIMAGE in a normally configured system, the -h and -p switches are not needed since they will be brought in from your configured installation.  The -o switch defaults to your -release/products/IMAGE directory. If you want to connect to a different -server than the configured ifpServer, then the -h and -p switches are -needed.  +/awips2/cave/etc/gfe/products/IMAGE directory. If you want to connect to a different +server than the configured EDEX, then the -h and -p switches are +needed. If the default destination isn't correct for your purpose, then you -will -need to specify an -o switch.   +will need to specify an -o switch.   If environment variables ${CDSHOST} or ${CDSPORT} are defined, then the default server and port will be determined from the environment variables, unless overridden with the @@ -319,24 +309,20 @@ user specified -h and -p switches.


    Can I Test My Configuration?

    -Yes.  You can  test  your configuration by running the -GFE +Yes.  You can test your configuration by running the GFE with the specified user and configuration filename.  Then you can step frames or animate and the spatial editor will show you the expected results (e.g., colors and other appearance features).

    NOTE: ifpIMAGE by default uses configuration -files that are defined by the "SITE" user.  If you log into the -GFE -as a user (not SITE), and then create a configuration file, then run -the +files that are defined at SITE level. If you create a configuration file at USER level, +then run the ifpIMAGE program, the ifpIMAGE probably will not generate any -images.  -This is caused by storing the configuration file as a user and not -SITE, -and the ifpIMAGE program is looking for your configuration file in -SITE.  +images. +This is caused by storing the configuration file at USER level and not +SITE, and the ifpIMAGE program is looking for your configuration file in +SITE. You can override this behavior using the -u switch to ifpIMAGE.

    @@ -1949,9 +1935,8 @@ file:


    -

    Back to Main Documentation Page +

    Back to TOC

    diff --git a/cave/com.raytheon.viz.gfe/help/ifpServerNETCDF.html b/cave/com.raytheon.viz.gfe/help/ifpServerNETCDF.html index de24ee741f..2e5550d820 100644 --- a/cave/com.raytheon.viz.gfe/help/ifpServerNETCDF.html +++ b/cave/com.raytheon.viz.gfe/help/ifpServerNETCDF.html @@ -5,314 +5,89 @@ content="text/html; charset=iso-8859-1"> - ifpServer netCDF Format + EDEX HDF5 Format

    -ifpServer D2D netCDF File Format

    -October 6, 2002 +EDEX D2D HDF5 File Format +March 28, 2012

    -This document describes the format of the netCDF file that is: +This document describes the format of the HDF5 file that is:
    • -read by the ifpServer as a D2D database
    • +read by EDEX as a D2D database
    If you are interested in the format of the netCDF files generated from -the ifpnetCDF product formatter  or +the ifpnetCDF product formatter, or read by the iscMosaic program , then refer to the netCDF File Format Document. -

    Table of Contents -
    -netCDF Required Dimensions -
    -netCDF Variable Names -
    -netCDF Variable Attributes -
    -netCDF Global Attributes -
    -Diagnosing Model Problems -
    -Example of ncdump -

    -

    -
    -

    netCDF Required Dimensions

    -Each netCDF file is required to contain the following set of -dimensions: -
    -  - - - - - - - - - - - - - - - - - - -
    DimensionDescriptionRequired by GFESuite?
    xX-dimension of all gridsYes
    yY-dimension of all gridsYes

    +When data arrives over the SBN, the EDEX JVM ingest thread reads the next available message in AMQP queue +from the QPID message broker. It compares against the distribution XML files loaded into memory on EDEX +startup from /awips2/edex/data/utility/edex_static/base/distribution. If no pattern matches, nothing is +done. Otherwise a metadata record is generated in the appropriate table of the metadata database, and +an HDF5 file is written to /awips2/edex/data/hdf5/grib/MODEL_NAME on dx1. SmartInit is kicked off by +EDEX and generates data in /awips2/edex/data/hdf5/gfe/SITE_ID. You can access the +metadata database on dx1 as user awips. You can view the contents of HDF5 files using either the +free HDFView utility, or h5dump (installed in /awips2/tools/bin).

    +
    +

    About h5dump

    +OPTIONS
    +

    -h, --help          Print a usage message and exit
    +-B, --userblock     Print the content of the user block
    +-H, --header        Print the header only; no data is displayed
    +-i, --object-ids    Print the object ids
    +-V, --version       Print version number and exit
    +-a P, --attribute=P Print the specified attribute
    +-d P, --dataset=P   Print the specified dataset
    +-g P, --group=P     Print the specified group and all members
    +-l P, --soft-link=P Print the value(s) of the specified soft link
    +-o F, --output=F    Output raw data into file F
    +-t P, --datatype=P  Print the specified named data type
    +-w N, --width=N     Set the number of columns of output
    +-x, --xml           Output in XML
    +-D U, --xml-dtd=U   Use the DTD at U +

    Subsetting is available by using the following options with a dataset +attribute. Subsetting is done by selecting a hyperslab from the data. +Thus, the options mirror those for performing a hyperslab selection. +The START and COUNT parameters are mandatory if you do subsetting. +The STRIDE and BLOCK parameters are optional and will default to 1 in +each dimension.

    +-s L, --start=L     Offset of start of subsetting selection
    +-S L, --stride=L    Hyperslab stride
    +-c L, --count=L     Number of blocks to include in selection
    +-k L, --block=L     Size of block in hyperslab

    +P - is the full path from the root group to the object.
    +F - is a filename.
    +N - is an integer greater than 1.
    +L - is a list of integers the number of which are equal to the
    +    number of dimensions in the dataspace being queried
    +U - is a URI reference

    +Examples:
    +
    +  1) Attribute foo of the group /bar_none in file quux.h5
    +

    +    h5dump -a /bar_none/foo quux.h5
    +

    +  2) Selecting a subset from dataset /foo in file quux.h5
    +

    +    h5dump -d /foo -s "0,1" -S "1,1" -c "2,3" -k "2,2" quux.h5 +

    -

    -  -

    netCDF Variable Names

    -Each netCDF variable name represents a set of grids, plus additional -information: -
    -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
    Variable Name Format
    -
    ExampleData TypeDimensionsDescriptionRequired by GFESuite?
    namegh4-D cube of data, float(#grids, #levels, y,x)The actual gridded data is contained in these variables. -Attributes -are associated with this variable.Yes
    nameLevelsghLevels2-D array of charaters(#levels, charsPerLevel)The names of each of the vertical levels is in this variable, -such -as 500MB.Yes, if there are more than 1 level in the data. If not -specified, -then the level name is assigned "Dflt".
    nameInventoryghInventory2-D array of characters(#grids, #levels)An indicator 0 or 1 is used to denote whether that grid is -present -in the "name" variable. These bits change as model data arrives.Yes
    _tp12, _tp6_tp12, _tp6array of numbers, int#gridsIndicates whether total precipitation is for a 6 hour period -or for -a 12 hour period.  Some models provide QPF grids every 6 hours, -but -the durations of each grid alternates between QPF for the last 6 hours, -and the last 12 hours.No.  If not specified, then it assumed that Total -Precipitation -(_tp) valid accumulation time is the time between grids.
    valtimeMINUSreftimevaltimeMINUSreftimearray of numbers, int# gridsindicates the offset in seconds between the model reference -(base) -time, and the grid.Yes
    reftimereftimesingle number, floatn/aindicates the number of seconds between Jan 1, 1970 at 0000z -and the -model base time (analysis time)No. The D2D convention is to use the file name as the base -model time. -The "reftime" variable is not used.
    modelmodelarray of charactersnamelendefines the model name as it appears in the GFE GUI and -ifpServer databases.  -There can be only ONE netCDF file valid for the same time that has the -same model definition, or the ifpServer/GFE will not see all of them.Yes. The model specified will be modified by eliminating -spaces and -non-alphanumeric characters. Note that the model name may be overridden -using the D2DDIRS -in serverConfig.py and - -localConfig.py. Thus if the "model" variable in the netCDF file -isn't to your liking or there is a conflict with other netCDF files, -you -can effectively change it using the syntax in the D2DDIRS definition.
    staticTopostaticTopo2-D grid, float(y, x)Contains the topography in meters for the model. No. This field is recommended, but not required.

    -

    netCDF variable Attributes

    -
    Every "name" variable in the netCDF -file -has a collection of attributes.  In the table below, we briefly -describe -each attribute and its meaning.  For more information about a -particular -attribute, click on the link. -
    -  -
    -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Attribute NameAttribute DescriptionRequired by GFESuite?
    long_nameContains a descriptive name that describes the variable.No. If long_name is not specified, GFESuite will use the -variable name -instead.
    unitsUnits for the variable.  This is used by the GFE to -display units -in the legend, ifpIMAGE for the units in its legend, and for copy/paste -operations within the GFE to determine how to convert units to the Fcst -database units.Yes.
    valid_rangeMinimum and maximum range of the variable.  This is used -by the -ifpServer to limit the data, and by the GFE to assign color tables to -the -data. (ifpServer also looks for valid_min and valid_max if valid_range -does not exist)No. If not specified, then the minimum is assigned as 0 and -the maximum -assigned as 5000.
    _FillValueFill Value, indicating no data at the point.No.  If not specified, then the fill value is assumed to -be MAXFLOAT.
    -
    -

    -netCDF Global Attributes

    -
      -
    -The following netCDF global attributes are required in order for the -ifpServer to recognize the netCDF file as valid: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
    AttributeDescriptionRequired by GFESuite?
    projNameContains the projection name.  Must be one of the -following: LAMBERT_CONFORMAL, -MERCATOR, STEREOGRAPHIC, LATLON, CYLINDRICAL_EQUIDISTANTYes
    lon00Longitude in degrees of lower-left grid point (0, 0)Yes
    lat00Latitude in degrees of lower-left grid point (0, 0)Yes
    latNxNyLatitude in degrees of upper-right grid point (maxX, maxY)Yes
    lonNxNyLongitude in degrees of upper-right grid point (maxX, maxY)Yes
    centralLonCenter longitude for the mercator projection, where the -mercator projection -is parallel to the Earth's surface. Center longitude for the polar -stereographic -and Lambert Conformal projections, where the projection has north as -straight -up.Yes
    centralLatCenter latitude for the polar stereographic and Lambert -Conformal projections, -where the plane intersects the Earth's surface.Yes
    -
    -

    Diagnosing Model Problems

    -If you point the ifpServer to a D2D directory and the model is not -appearing, -verify that: +If you point the volume browser to a D2D directory and the model is not +appearing, verify that:
      +
    • EDEX started up without any errors that would affect gfe, i.e., all + configurations loaded normally.
    • +
    • Ingest processes started normally and are up and running.
    • +
    • PyPies are up and running on dx1.
    • the file name is in the standard format of yyyymmdd_hhmm, which is the model base time
    • @@ -327,835 +102,25 @@ configuration containing files that have an variable called "model" with the same name
    -If all else fails, you can turn on the debugging logging option in the -ifpServer.  In this mode the ifpServer will log all problems it -finds -with model data files.  To turn on this feature, perform the -following -steps: +If all else fails, you can turn on the debugging logging option in EDEX. +In this mode EDEX will log all problems it finds +with model data files. To turn on this feature, perform the following steps:
    1. -Edit the file release/etc/BASE/logPref/ifpServer.logPref, where release -is the installation directory. On AWIPS-baseline equipment this file is -located at /awips/GFESuite/primary/etc/BASE/logPref/ifpServer.logPref.  Add the -following -line in the middle of the file (before the prefix section).  Refer -to the log files document for details. Add -an entry:     all  D2DFile.C  file debug -= on
    2. +Edit the file /awips2/edex/conf/log4j-ingest.xml to set level value = "DEBUG" +for the appender ThreadBasedLog. Refer +to the log files document for details.
    3. -Stop and restart the ifpServer.
    4. +Stop and restart EDEX.
    5. -Look in the server log files.  It will show the problems for all +Look in the server log files. It will show the problems for all files -it finds.  If it doesn't identify your file or directory, recheck +it finds. If it doesn't identify your file or directory, re-check your D2DDIRS to be sure you have set it up correctly.


    -
    -

    Example of ncdump

    -Header dump of netcdf file -
    -Valid Time dump -
    -model dump -
    -inventory dump -
    -levels dump
    -This is an example of an ncdump -h of an NAM -model, -showing all of the correct fields: -

    ncdump -h 20020327_1200 -

    -

    netcdf 20020327_1200 { -
    -dimensions: -
    -    record = UNLIMITED ; // (11 currently) -
    -    n_valtimes = 15 ; -
    -    data_variables = 20 ; -
    -    charsPerLevel = 10 ; -
    -    namelen = 132 ; -
    -    x = 93 ; -
    -    y = 65 ; -
    -    levels_1 = 1 ; -
    -    levels_2 = 2 ; -
    -    levels_5 = 5 ; -
    -    levels_19 = 19 ; -
    -    levels_25 = 25 ; -
    -variables: -
    -    float gh(record, levels_19, y, x) ; -
    -        gh:long_name = -"Geopotential -height" ; -
    -        gh:units = "m" ; -
    -        gh:udunits = "meters" -; -
    -        gh:uiname = "geoPotHt" -; -
    -        gh:valid_range = 0.f, -20000.f ; -
    -        gh:_FillValue = -99999.f -; -
    -        gh:_n3D = 19 ; -
    -        gh:levels = "MB 1000-100 -by 50" ; -
    -    char ghLevels(levels_19, charsPerLevel) ; -
    -    char ghInventory(n_valtimes, levels_19) ; -
    -    float rh(record, levels_25, y, x) ; -
    -        rh:long_name = "Relative -Humidity" ; -
    -        rh:units = "%" ; -
    -        rh:udunits = "percent" -; -
    -        rh:uiname = "rh" ; -
    -        rh:valid_range = 0.f, -100.f ; -
    -        rh:_FillValue = -99999.f -; -
    -        rh:_n3D = 20 ; -
    -        rh:levels = "FHAG -2  -MB 1000-100 by 50  BL 0>30 30>60 60>90 90>120 -120>150" ; -
    -    char rhLevels(levels_25, charsPerLevel) ; -
    -    char rhInventory(n_valtimes, levels_25) ; -
    -    float t(record, levels_25, y, x) ; -
    -        t:long_name = -"Temperature" -; -
    -        t:units = "K" ; -
    -        t:udunits = -"degree_Kelvin" -; -
    -        t:uiname = "T" ; -
    -        t:valid_range = 180.f, -330.f ; -
    -        t:_FillValue = -99999.f -; -
    -        t:_n3D = 20 ; -
    -        t:levels = "FHAG 2  -MB 1000-100 by 50  BL 0>30 30>60 60>90 90>120 -120>150" ; -
    -    char tLevels(levels_25, charsPerLevel) ; -
    -    char tInventory(n_valtimes, levels_25) ; -
    -    float uw(record, levels_25, y, x) ; -
    -        uw:long_name = "u wind -component" ; -
    -        uw:units = "m/s" ; -
    -        uw:udunits = "meter/sec" -; -
    -        uw:uiname = "uWind" -; -
    -        uw:valid_range = -150.f, -150.f ; -
    -        uw:_FillValue = -99999.f -; -
    -        uw:_n3D = 20 ; -
    -        uw:levels = "FHAG 10 -MB 1000-100 by 50  BL 0>30 30>60 60>90 90>120 -120>150" ; -
    -    char uwLevels(levels_25, charsPerLevel) ; -
    -    char uwInventory(n_valtimes, levels_25) ; -
    -    float vw(record, levels_25, y, x) ; -
    -        vw:long_name = "v wind -component" ; -
    -        vw:units = "m/s" ; -
    -        vw:udunits = "meter/sec" -; -
    -        vw:uiname = "vWind" -; -
    -        vw:valid_range = -150.f, -150.f ; -
    -        vw:_FillValue = -99999.f -; -
    -        vw:_n3D = 20 ; -
    -        vw:levels = "FHAG 10 -MB 1000-100 by 50  BL 0>30 30>60 60>90 90>120 -120>150" ; -
    -    char vwInventory(n_valtimes, levels_25) ; -
    -    float av(record, levels_5, y, x) ; -
    -        av:long_name = "absolute -vorticity" ; -
    -        av:units = "1/s" ; -
    -        av:udunits = "1/second" -; -
    -        av:uiname = "absVort" -; -
    -        av:valid_range = -0.01f, -0.01f ; -
    -        av:_FillValue = -99999.f -; -
    -        av:_n3D = 4 ; -
    -        av:levels = "MB 1000 -850 700 500 250" ; -
    -    char avLevels(levels_5, charsPerLevel) ; -
    -    char avInventory(n_valtimes, levels_5) ; -
    -    float pvv(record, levels_19, y, x) ; -
    -        pvv:long_name = -"Pressure -vertical velocity" ; -
    -        pvv:units = "Pa/s" ; -
    -        pvv:udunits = -"pascal/second" -; -
    -        pvv:uiname = "Pvv" ; -
    -        pvv:valid_range = -2.5f, -2.5f ; -
    -        pvv:_FillValue = --99999.f -; -
    -        pvv:_n3D = 19 ; -
    -        pvv:levels = "MB -1000-100 -by 50" ; -
    -    char pvvLevels(levels_19, charsPerLevel) ; -
    -    char pvvInventory(n_valtimes, levels_19) ; -
    -    float p(record, levels_1, y, x) ; -
    -        p:long_name = "pressure" -; -
    -        p:units = "Pa" ; -
    -        p:udunits = "pascal" -; -
    -        p:uiname = "atmP" ; -
    -        p:valid_range = 0.f, -110000.f ; -
    -        p:_FillValue = -99999.f -; -
    -        p:_n3D = 1 ; -
    -        p:levels = "SFC" ; -
    -    char pLevels(levels_1, charsPerLevel) ; -
    -    char pInventory(n_valtimes, levels_1) ; -
    -    float heli(record, levels_1, y, x) ; -
    -        heli:long_name = -"helicity" -; -
    -        heli:units = "m/s2" -; -
    -        heli:udunits = -"meter/second2" -; -
    -        heli:uiname = "hel" -; -
    -        heli:valid_range = 0.f, -1000.f ; -
    -        heli:_FillValue = --99999.f -; -
    -        heli:_n3D = 0 ; -
    -        heli:levels = "FHAG -0>30" ; -
    -    char heliLevels(levels_1, charsPerLevel) ; -
    -    char heliInventory(n_valtimes, levels_1) ; -
    -    float cape(record, levels_2, y, x) ; -
    -        cape:long_name = -"Convective -Available Potential Energy" ; -
    -        cape:units = "J/kg" -; -
    -        cape:udunits = -"joule/Kilogram" -; -
    -        cape:uiname = "CAPE" -; -
    -        cape:valid_range = 0.f, -6000.f ; -
    -        cape:_FillValue = --99999.f -; -
    -        cape:_n3D = 0 ; -
    -        cape:levels = "SFC BL -0>180" ; -
    -    char capeLevels(levels_2, charsPerLevel) ; -
    -    char capeInventory(n_valtimes, levels_2) ; -
    -    float cin(record, levels_2, y, x) ; -
    -        cin:long_name = -"Convective -Inhibition" ; -
    -        cin:units = "J/kg" ; -
    -        cin:udunits = -"joule/Kilogram" -; -
    -        cin:uiname = "convInhib" -; -
    -        cin:valid_range = 0.f, -400.f ; -
    -        cin:_FillValue = --99999.f -; -
    -        cin:_n3D = 0 ; -
    -        cin:levels = "SFC BL -0>180" ; -
    -    char cinLevels(levels_2, charsPerLevel) ; -
    -    char cinInventory(n_valtimes, levels_2) ; -
    -    float bli(record, levels_1, y, x) ; -
    -        bli:long_name = "Best -lifted index" ; -
    -        bli:units = "K" ; -
    -        bli:udunits = -"degree_Kelvin" -; -
    -        bli:uiname = -"bestLftInd" -; -
    -        bli:valid_range = -20.f, -50.f ; -
    -        bli:_FillValue = --99999.f -; -
    -        bli:_n3D = 0 ; -
    -        bli:levels = "BL -0>180" -; -
    -    char bliLevels(levels_1, charsPerLevel) ; -
    -    char bliInventory(n_valtimes, levels_1) ; -
    -    float pli(record, levels_1, y, x) ; -
    -        pli:long_name = "Parcel -lifted index" ; -
    -        pli:units = "K" ; -
    -        pli:udunits = -"degree_Kelvin" -; -
    -        pli:uiname = -"parcLftInd" -; -
    -        pli:valid_range = -20.f, -50.f ; -
    -        pli:_FillValue = --99999.f -; -
    -        pli:_n3D = 0 ; -
    -        pli:levels = "BL -0>30" -; -
    -    char pliLevels(levels_1, charsPerLevel) ; -
    -    char pliInventory(n_valtimes, levels_1) ; -
    -    float pw(record, levels_1, y, x) ; -
    -        pw:long_name = -"precipitable -water" ; -
    -        pw:units = "mm" ; -
    -        pw:udunits = -"millimeter" -; -
    -        pw:uiname = "precipH2O" -; -
    -        pw:valid_range = 0.f, -300.f ; -
    -        pw:_FillValue = -99999.f -; -
    -        pw:_n3D = 0 ; -
    -        pw:levels = "EA" ; -
    -    char pwLevels(levels_1, charsPerLevel) ; -
    -    char pwInventory(n_valtimes, levels_1) ; -
    -    float emsp(record, levels_1, y, x) ; -
    -        emsp:long_name = "ETA -Mean Sea Level Pressure" ; -
    -        emsp:units = "Pa" ; -
    -        emsp:udunits = "pascal" -; -
    -        emsp:uiname = "ETAMSL" -; -
    -        emsp:valid_range = -80000.f, -110000.f ; -
    -        emsp:_FillValue = --99999.f -; -
    -        emsp:_n3D = 0 ; -
    -        emsp:levels = "MSL" -; -
    -    char emspLevels(levels_1, charsPerLevel) ; -
    -    char emspInventory(n_valtimes, levels_1) ; -
    -    float pmsl(record, levels_1, y, x) ; -
    -        pmsl:long_name = -"pressure -at mean sea level" ; -
    -        pmsl:units = "Pa" ; -
    -        pmsl:udunits = "pascal" -; -
    -        pmsl:uiname = "PMSL" -; -
    -        pmsl:valid_range = -80000.f, -110000.f ; -
    -        pmsl:_FillValue = --99999.f -; -
    -        pmsl:_n3D = 0 ; -
    -        pmsl:levels = "MSL" -; -
    -    char pmslLevels(levels_1, charsPerLevel) ; -
    -    char pmslInventory(n_valtimes, levels_1) ; -
    -    float cp(record, levels_1, y, x) ; -
    -        cp:long_name = -"convective -precipitation" ; -
    -        cp:units = "mm" ; -
    -        cp:udunits = -"millimeter" -; -
    -        cp:uiname = "convPrecip" -; -
    -        cp:valid_range = 0.f, -1000.f ; -
    -        cp:_FillValue = -99999.f -; -
    -        cp:_n3D = 0 ; -
    -        cp:levels = "SFC" ; -
    -    char cpLevels(levels_1, charsPerLevel) ; -
    -    char cpInventory(n_valtimes, levels_1) ; -
    -    float tp(record, levels_1, y, x) ; -
    -        tp:long_name = "total -precipitation" ; -
    -        tp:units = "mm" ; -
    -        tp:udunits = -"millimeter" -; -
    -        tp:uiname = "totPrecip" -; -
    -        tp:valid_range = 0.f, -1000.f ; -
    -        tp:_FillValue = -99999.f -; -
    -        tp:_n3D = 0 ; -
    -        tp:levels = "SFC" ; -
    -    char tpLevels(levels_1, charsPerLevel) ; -
    -    char tpInventory(n_valtimes, levels_1) ; -
    -    float _tp12(n_valtimes) ; -
    -    float _tp6(n_valtimes) ; -
    -    int valtimeMINUSreftime(n_valtimes) ; -
    -        -valtimeMINUSreftime:units -= "seconds" ; -
    -    double reftime ; -
    -        reftime:long_name = -"reference time" ; -
    -        reftime:units = "seconds -since (1970-1-1 00:00:00.0)" ; -
    -    char origin(namelen) ; -
    -    char model(namelen) ; -
    -    float staticTopo(y, x) ; -
    -        staticTopo:units = -"meters" -; -
    -        staticTopo:long_name -= "Topography" ; -
    -        staticTopo:_FillValue -= -99999.f ; -
    -    float staticCoriolis(y, x) ; -
    -        staticCoriolis:units -= "/second" ; -
    -        staticCoriolis:long_name -= "Coriolis parameter" ; -
    -        -staticCoriolis:_FillValue -= -99999.f ; -
    -    float staticSpacing(y, x) ; -
    -        staticSpacing:units -= "meters" ; -
    -        staticSpacing:long_name -= "Grid spacing" ; -
    -        staticSpacing:_FillValue -= -99999.f ; -

    -

    // global attributes: -
    -        :cdlDate = "20010328" -; -
    -        :depictorName = -"grid211@16944264" -; -
    -        :projIndex = 3 ; -
    -        :projName = -"LAMBERT_CONFORMAL" -; -
    -        :centralLat = 25.f ; -
    -        :centralLon = -95.f -; -
    -        :rotation = 25.f ; -
    -        :xMin = -0.255644f ; -
    -        :xMax = 0.196647f ; -
    -        :yMax = -0.562235f ; -
    -        :yMin = -0.876877f ; -
    -        :lat00 = 12.19004f ; -
    -        :lon00 = -133.459f ; -
    -        :latNxNy = 57.28995f -; -
    -        :lonNxNy = -49.38491f -; -
    -        :dxKm = 78.04174f ; -
    -        :dyKm = 78.04293f ; -
    -        :latDxDy = 40.60606f -; -
    -        :lonDxDy = -100.5548f -; -

    -

    Looking at specifics for the -valtimeMINUSreftime: -

    -

    ncdump -v valtimeMINUSreftime 20020327_1200 -

    -

    data: -

    -

     valtimeMINUSreftime = 0, 21600, 43200, 64800, 86400, -108000, -129600, 151200, -
    -    172800, 194400, 216000, 237600, 259200, 280800, -302400 ; -
    -  -

    -

    Looking at specifics for the model: -

    -

    ncdump -v model 20020327_1200 -

    -

    data: -

    -

     model = "ETA" ; -

    -

    Looking at specifics for the inventory bits: -

    -

    ncdump -v ghInventory 20020327_1200 -

    -

    data: -

    -

     ghInventory = -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "1111111111111111111", -
    -  "", -
    -  "", -
    -  "", -
    -  "" ; -
    -  -

    -

    Looking at the specifics for the levels: -

    -

    ncdump -v ghLevels 20020327_1200 -

    -

    data: -

    -

     ghLevels = -
    -  "MB 1000   ", -
    -  "MB 950    ", -
    -  "MB 900    ", -
    -  "MB 850    ", -
    -  "MB 800    ", -
    -  "MB 750    ", -
    -  "MB 700    ", -
    -  "MB 650    ", -
    -  "MB 600    ", -
    -  "MB 550    ", -
    -  "MB 500    ", -
    -  "MB 450    ", -
    -  "MB 400    ", -
    -  "MB 350    ", -
    -  "MB 300    ", -
    -  "MB 250    ", -
    -  "MB 200    ", -
    -  "MB 150    ", -
    -  "MB 100    " ; -
    -  -
    -  -

    diff --git a/cave/com.raytheon.viz.gfe/help/ifpServerText.html b/cave/com.raytheon.viz.gfe/help/ifpServerText.html index 4c2bcedc45..600b6f78fe 100644 --- a/cave/com.raytheon.viz.gfe/help/ifpServerText.html +++ b/cave/com.raytheon.viz.gfe/help/ifpServerText.html @@ -10,7 +10,7 @@

    ifpServerText User's Guide

    -
    April 4, 2006
    +
    January 6, 2012

    Table of Contents @@ -18,20 +18,17 @@ ifpServerText User's Guide

    Running the ifpServerText Program

    -Example Output

    +Example Execution

    Overview

    The ifpServerText is a program to allow reading, -writing, deleting, and inventorying text data in the ifpServer.  -It -is an easy way to store items such as smart tools directly into the -ifpServer.  +writing, deleting, and inventorying text data in EDEX. +It is an easy way to store items such as smart tools directly into EDEX. The following data types are supported:
    -  @@ -82,10 +79,6 @@ The following data types are supported: - - - - @@ -102,18 +95,17 @@ Files

    Running the ifpServerText Program

    -
     
    The command line syntax is:
    -
    ifpServerText -h hostname -p portnumber [-u +
    ifpServerText -h hostname -p portnumber -o siteID [-u user] -[-s -n name -f filename -c class] [-d -n name [-c Config]] [-i [-c -Config] -[-g -f filename -n name [-c Config]] [-m infoType]
    -
      +[-s -n name -f filename -c class] [-d -n name [-c class]] [-i [-c +class] +[-g -f filename -n name [-c class]] [-m infoType]
    +

    A sample command line to store data is:
    -ifpServerText -h dx4f -p 98000000 -s -n MaxT_Tool -f /tmp/maxt.py +ifpServerText -h dx3-oax -p 9581 -o LWX -s -n MaxT_Tool -f /tmp/maxt.py -c Tool
     
    ColorTable Color Tables
    MapMap Backgrounds and Attributes
    Combinations
    @@ -126,19 +118,23 @@ A sample command line to store data is: - + - + + + + + + - - + + @@ -149,14 +145,14 @@ defaults to the UNIX login user.  - + - + - + @@ -193,7 +189,7 @@ information. - - + @@ -218,13 +214,12 @@ is used only for the class type of Config. - + - + - - + - + - +"SelectTR", "Combinations" @@ -266,11 +261,11 @@ Config, - - + @@ -281,435 +276,125 @@ of Config. specified location. - + - +"SelectTR", "Combinations".
    -h hostname Mandatory (See Note)Specifies the host, upon which the ifpServer is running.Specifies the host, upon which EDEX is running.
    -p port Mandatory (See Note)Specifies the port, upon which the ifpServer is running.Specifies the port, upon which EDEX is running.
    -o siteIDMandatorySpecifies the site ID for which EDEX is running.
    -u userOptional. The connection to the ifpServer will be made using this user, -which -defaults to the UNIX login user. OptionalThe connection to EDEX will be made using this user, +which defaults to the UNIX login user.
    MetaData Mode:
    -m infoTypeMandatory for meta mode.Mandatory for meta mode infoType specifies the type of data to be obtained.  Choices are -"site", "sitetimezone", "domain", and "singleton".  The "site" +"site", "sitetimezone", "domain", and "singleton". The "site" will -list the site for which the ifpServer is configured.  The +list the site for which EDEX is configured. The "sitetimezone" -lists the site and the timezone for the ifpServer.  The +lists the site and the timezone for EDEX. The "singleton" lists all of the databases that are configured as singletons. The "domain" @@ -177,13 +173,13 @@ information.
    -sMandatory for save mode.Mandatory for save mode Indicates SAVE mode, requires the -n, -f, and -c switches.
    -n name MandatoryIndicates the name to store the file under in the ifpServerIndicates the name to store the file under in EDEX
    -f filename
    -c class MandatoryIndicates the type of the file.  Must be one of:  + Indicates the type of the file.  Must be one of: Config, "Tool", "Procedure", "Utility", "TextUtility",  "TextProduct", @@ -210,7 +206,7 @@ Config,
    -dMandatory for delete mode.Mandatory for delete mode Indicates DELETE mode, requires the -n switch.  The -c switch is used only for the class type of Config.
    -n name MandatoryIndicates the name of the entry to be deleted from the -ifpServer.Indicates the name of the entry to be deleted from EDEX.
    -c Config-c class MandatoryIndicates the type of the file.  Must be one of:  + Indicates the type of the file.  Must be one of: Config, "Tool", "Procedure", "Utility", "TextUtility",  "TextProduct", @@ -241,21 +236,21 @@ Config,
    -iMandatory for inventory mode.Mandatory for inventory mode Indicates INVENTORY mode.  The -c switch is used only for the class type of Config.
    -c Config-c class MandatoryIndicates the type of the file.  Must be one of:  + Indicates the type of the file.  Must be one of: Config, "Tool", "Procedure", "Utility", "TextUtility",  "TextProduct", "EditArea", "EditAreaGroup", "WeatherElementGroup", ColorTable", "SampleSet", -"SelectTR", "Maps, "Combinations"
    Get Mode:
    -gMandatory for get mode.Indicates GET mode, requires the -n switch.  The -f + Mandatory for get modeIndicates GET mode, requires the -n switch. The -f switch is used to output the resulting file to another file, otherwise the output -goes to the terminal.  The -c switch is used only for the class +goes to the terminal. The -c switch is used only for the class type of Config.
    -c Config-c class MandatoryIndicates the type of the file.  Must be one of:  + Indicates the type of the file. Must be one of: Config, -"Tool", "Procedure", "Utility", "TextUtility",  +"Tool", "Procedure", "Utility", "TextUtility", "TextProduct", "EditArea", "EditAreaGroup", "WeatherElementGroup", ColorTable", "SampleSet", -"SelectTR", "Maps", "Combinations".
    -Note: The -h serverhost and -p port are +Note: The -h serverhost and -p port are predefined -based on your installation configration of GFESuite.  The -h and +based on your installation configuration of GFESuite. The -h and -r will be defined for the server host and port specified during -installation.    +installation. If you wish to connect to another server, then these switches will be -necessary.   If environment -variables ${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -p switches. -


    -

    +necessary.

    Example Execution

    Note that in the following examples, the -h and -p -switches are not included.  They will default to the currently -installed -ifpServer configuration.
    +switches are not included. They will default to the currently +installed EDEX configuration. Also in AWIPS2 the site switch becomes mandatory.

    Saving Data

    -camper> ifpServerText -s -n MyMaxTool -f +camper> ifpServerText -o LWX -s -n MyMaxTool -f ../examples/smartTools/Td_SmartTool.py -c Tool -
    -21:13:02.123 IFPServerText.py 289 EVENT: ifpServerText Starting -
    -21:13:02.132 IFPServerText.py 289 EVENT: Build Date: Mon Sep 2 -01:43:14 2002 Built By: mark Built On: camper.fsl.noaa.gov (linux2) -Version: -development -
    -21:13:02.142 Client.C 161 EVENT: Establishing connection to server -on camper.fsl.noaa.gov:98000000 ver=20020626 -
    -21:13:02.150 Client.C 181 EVENT: Connection complete to server -on camper.fsl.noaa.gov -
    -21:13:02.420 IFPServerText.py 164 EVENT: Saved file -../examples/smartTools/Td_SmartTool.py -under MyMaxTool -
    -21:13:02.425 IFPServerText.py 289 EVENT: ifpServerText Finished -

    Obtaining an Inventory

    -camper > ifpServerText -c Tool -i
    -21:13:53.870 IFPServerText.py 289 EVENT: ifpServerText Starting -
    -21:13:53.878 IFPServerText.py 289 EVENT: Build Date: Mon Sep 2 -01:43:14 2002 Built By: mark Built On: camper.fsl.noaa.gov (linux2) -Version: -development -
    -21:13:53.887 Client.C 161 EVENT: Establishing connection to server -on camper.fsl.noaa.gov:98000000 ver=20020626 -
    -21:13:53.894 Client.C 181 EVENT: Connection complete to server -on camper.fsl.noaa.gov -
    -Name                 -Access    Protect -
    -----                 -------    ------- -
    -AdjustValue_Down      -USER     -Read-Only -
    -AdjustValue_Up        -USER     -Read-Only -
    -Assign_Value          -USER     Read-Only -
    -MyMaxTool             -USER     Read-Write -
    -  +camper > ifpServerText -c Tool -i -o LWX

    Getting Data

    -


    camper > ifpServerText -g -c Tool -n Assign_Value -f -1.txt -
    -15:19:16.275 IFPServerText.py 286 EVENT:  ifpServerText -Starting -
    -15:19:16.279 IFPServerText.py 286 EVENT:  Build Date: Tue -Sep  3 14:33:58 2002 Built By: mark Built On: camper.fsl.noaa.gov -(linux2) Version: development -
    -15:19:16.291 Client.C 161 EVENT: Establishing connection to server -on localhost:98000044 ver=20020626 -
    -15:19:16.312 Client.C 181 EVENT: Connection complete to server -on localhost -
    -15:19:16.436 IFPServerText.py 197 EVENT:  Got  -Assign_Value ---- written to 1.txt -
    -15:19:16.437 IFPServerText.py 286 EVENT:  ifpServerText -Finished -
    -  -
    -  -

    +1.txt -o LWX

    Deleting Data

    -camper > ifpServerText -c Tool -d -n MyTool -
    -15:21:34.030 IFPServerText.py 286 EVENT:  ifpServerText -Starting -
    -15:21:34.034 IFPServerText.py 286 EVENT:  Build Date: Tue -Sep  3 14:33:58 2002 Built By: mark Built On: camper.fsl.noaa.gov -(linux2) Version: development -
    -15:21:34.043 Client.C 161 EVENT: Establishing connection to server -on localhost:98000044 ver=20020626 -
    -15:21:34.059 Client.C 181 EVENT: Connection complete to server -on localhost -
    -15:21:34.359 IFPServerText.py 185 EVENT:  Deleted  MyTool -
    -15:21:34.360 IFPServerText.py 286 EVENT:  ifpServerText -Finished -

    +camper > ifpServerText -c Tool -d -n MyTool -o LWX +


    Output Formats

    The output formats for each of the classes are described in this section.

    Tool, Procedure, Utility, TextUtility, TextProduct, Config, Combinations

    -The output format is the exact copy of the file in the ifpServer. +The output format is the exact copy of the file in EDEX.

    EditArea

    -Note that this format is not identical to the format of the stored data -in the ifpServer, and thus you cannot use the ifpServer format in this -routine.
    +

    In AWIPS2 edit areas are now stored in xml format.

    +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    +< referenceData xmlns:ns2="group">
    + < polygons > MULTIPOLYGON (((-100.74059659999995 39.56791216000005, -100.73749659999999 + 39.56791216000005, -100.72409659999994 39.56801216000008, -100.72139659999999 + 39.56801216000008, -100.72009659999998 39.56571216000003, -100.72009659999998 + 39.56201216000005, -100.71999659999994 39.55391216000004, -100.72009659999998 + 39.54661216000005, -100.71999659999994 39.53941216000004, -100.71999659999994 + 39.53111216000008, -100.71999659999994 39.524712160000036, -100.72009659999998 + 39.520412160000035, -100.72019659999995 39.513312160000055, -100.72019659999995 + 39.50911216000003)))</polygons >
    + </referenceData >

    -INCLUDE (or EXCLUDE) flag for the polygon -
    -25               -(number of points in this polygon) -
    --115.23 40.23         (longitude, -latitude for point 1) -
    --115.11 40.25         (longitude, -latitude for point 2) -
    -...... -

    EditAreaGroup

    The output consists of a list of edit area names, one per line, that are contained within the edit area group, such as: -

    CO_048 +

    1
    +PPLN1HW

    -CO_035 -
    -CO_046 -
    -CO_033 -
    -CO_030 -
    -CO_049 -
    -CO_042 -
    -CO_041 -
    -CO_038 -
    -CO_044 -
    -CO_036 -

    WeatherElementGroup

    -The output consists of the identical format of the weather element -group -in the ifpServer, such as: -

    MinT_SFC:SITE_GRID__Fcst_00000000_0000 -1 +

    In AWIPS2 weather element groups are stored in xml files:

    +

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    +< WEGroup name="FireWx" xmlns:ns2="group" xmlns:ns3="http://www.example.org/productType">
    + < WEItem relativeCycleNumber="-1" parmID="Hazards_SFC:OAX_GRID__Fcst_00000000_0000"/>
    + < WEItem relativeCycleNumber="-1" parmID="PoP_SFC:OAX_GRID__Fcst_00000000_0000"/>
    + < WEItem relativeCycleNumber="-1" parmID="QPF_SFC:OAX_GRID__Fcst_00000000_0000"/>
    + < WEItem relativeCycleNumber="-1" parmID="RH_SFC:OAX_GRID__Fcst_00000000_0000"/>
    + < WEItem relativeCycleNumber="-1" parmID="Sky_SFC:OAX_GRID__Fcst_00000000_0000"/>
    + < WEItem relativeCycleNumber="-1" parmID="T_SFC:OAX_GRID__Fcst_00000000_0000"/>
    + < WEItem relativeCycleNumber="-1" parmID="Td_SFC:OAX_GRID__Fcst_00000000_0000"/>
    +</WEGroup >

    -MaxT_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -T_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -Td_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -Wind_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -Wx_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -Sky_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -PoP_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -SnowAmt_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -QPF_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -FzLevel_SFC:SITE_GRID__Fcst_00000000_0000 -1 -
    -SnowLevel_SFC:SITE_GRID__Fcst_00000000_0000 -1 -

    SelectTR

    The output consists of the identical format of the user-defined selection -time range in the ifpServer, such as: +time range in EDEX, such as:

    54 78

    SampleSet

    -#of samples +

    In AWIPS2 sample sets are stored in xml files:

    +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    +< sampleData xmlns:ns2="group">
    + -95.2074,41.009
    + -95.6972,41.0414
    + -96.4373,41.4339
    + -96.6898,41.8389
    + -98.0257,42.7388
    + -96.75,40.86
    + -95.9,41.3
    + -97.43,41.98
    + -95.92,40.95
    +</sampleData>

    -longitude1 latitude1 -
    -longitude2 latitude2 -
    -....

    ColorTable

    -# of color cells -
    -red1 green1 blue1 -
    -red2 green2 blue2 -
    -..... -

    Maps

    -Map data is much more complicated since there can be POINT, POLYGON, -and -POLYLINE types of map data.  Shapefile attributes are also -included -in the data stream. -

    For POINT data: -
    -POINT -
    -longitude1   latitude1 -
    -label1 -
    -symbolFlag1 -
    -# of attributes -
    -attributeName1: attributeValue1 -
    -attributeName2: attributeValue2 -
    -.... -
    -POINT -
    -longitude2   latitude2 -
    -label2 -
    -symbolFlag2 -
    -# of attributes -
    -attributeName1: attributeValue1 -
    -attributeName2: attributeValue2 -
    -.... -

    -

    For POLYGON data: -

    -

    POLYGON -
    -# of points -
    -longitude1 latitude1 -
    -longitude2 latitude2 -
    -... -
    -# of attributes -
    -attributeName1: attributeValue1 -
    -attributeName2: attributeValue2 -
    -.... -
    -POLYGON -
    -# of points -
    -longitude1 latitude1 -
    -longitude2 latitude2 -
    -... -
    -# of attributes -
    -attributeName1: attributeValue1 -
    -attributeName2: attributeValue2 -
    -.... -

    -

    For POLYLINE data: -

    -

    POLYLINE -
    -# of points -
    -longitude1 latitude1 -
    -longitude2 latitude2 -
    -... -
    -# of attributes -
    -attributeName1: attributeValue1 -
    -attributeName2: attributeValue2 -
    -.... -
    -POLYLINE -
    -# of points -
    -longitude1 latitude1 -
    -longitude2 latitude2 -
    -... -
    -# of attributes -
    -attributeName1: attributeValue1 -
    -attributeName2: attributeValue2 -
    -.... -

    -

    MetaInfo

    -For "site": -
    -siteID -

    For "sitetimezone": -
    -siteID timezone -

    -

    For "singleton": -
    -BOU_GRID__MSAS_00000000_0000 -
    -BOU_GRID__Official_00000000_0000 -
    -BOU_GRID__Fcst_00000000_0000 -
    -BOU_GRID__ISC_00000000_0000 -
    -BOU_GRID__LAPS_00000000_0000 -
    - -

    -

    For "domain": -
    -ProjectionID: Grid211 -
    -Grid Size: (145, 145) -
    -Grid Domain: ((38.0, 27.0), (9.0, 9.0)) -
    -latLonOrigin: (-95.0, 25.0) -
    -projectionID: 'Grid211' -
    -gridPointLL: (1, 1) -
    -lonCenter: 0.0 -
    -latLonUR: (-49.384998321533203, 57.290000915527344) -
    -gridPointUR: (93, 65) -
    -stdParallelTwo: 25.0 -
    -projectionType: 'LAMBERT_CONFORMAL' -
    -stdParallelOne: 25.0 -
    -latIntersect: 0.0 -
    -lonOrigin: 0.0 -
    -latLonLL: (-133.45899963378906, 12.189999580383301) -
    -  +

    In AWIPS2 color tables are stored in xml files:

    +< colorMap >
    + < color r="0" g="0" b="0" a="1" />
    + < color r="0.00392156862745098" g="0.00392156862745098" b="0.00392156862745098" a="1" />
    + < color r="0.00784313725490196" g="0.00784313725490196" b="0.00784313725490196" a="1" />
    + < color r="0.0117647058823529" g="0.0117647058823529" b="0.0117647058823529" a="1" />
    + < color r="0.0156862745098039" g="0.0156862745098039" b="0.0156862745098039" a="1" />
    + < color r="0.0196078431372549" g="0.0196078431372549" b="0.0196078431372549" a="1" />
    + < color r="1" g="1" b="1" a="1" />
    +</colorMap >

    diff --git a/cave/com.raytheon.viz.gfe/help/ifpnetCDF.html b/cave/com.raytheon.viz.gfe/help/ifpnetCDF.html index 4c9a253a0a..405542d88f 100644 --- a/cave/com.raytheon.viz.gfe/help/ifpnetCDF.html +++ b/cave/com.raytheon.viz.gfe/help/ifpnetCDF.html @@ -10,12 +10,12 @@ - iifpnetCDF Formatter User's Guide + ifpnetCDF Formatter User's Guide

    ifpnetCDF Formatter User's Guide

    -
    August 1, 2005
    +
    January 6, 2012


    @@ -37,7 +37,7 @@ Interval File

    Overview

    The ifpnetCDF program reads gridded data -from the ifpServer that you specify and writes the data to a netCDF +from EDEX that you specify and writes the data to a netCDF file. In addtion to the forecast grids, a topography grid, @@ -50,7 +50,7 @@ information, units, and valid times for each grid. The following sections describe how to use this program and document the structure of the resulting netCDF -file.  A special switch is available (-k) to "squish" down the +file. A special switch is available (-k) to "squish" down the formats of the data file to as compact as possible.

    @@ -64,26 +64,19 @@ netCDF file when only a portion of the inventory is required.

    Running the ifpnetCDF Program

    The program is capable of both storing -and retrieving grids from the ifpServer.
    +and retrieving grids from EDEX.
    The command line syntax is:
    -
    ifpnetCDF -o outputFile -h -hostname +
    ifpnetCDF -o outputFile -h hostname -r rpcPortNumber -d databaseID [-p parmID] [-s startTime] [-e endTime] [-m editAreaName] [-u user] [-g] [-t] [-C configurationIntervalName]
    A sample command line is:
    -
    ifpnetCDF -o myGridFile -h -abc.fsl.noaa.gov --r 98000000 -d TEST_GRID__Fcst_00000000_0000 -p T -s 19980604_1200 -e +
    ifpnetCDF -o myGridFile -h dx3-oax +-r 9581 -d TEST_GRID__Fcst_00000000_0000 -p T -s 19980604_1200 -e 19980605_0000 -m BOU -g -c -t -C cdfSample

    -  -
    -  -
    -  @@ -105,7 +98,7 @@ the data will be written to the file ifpnetCDFFile.cdf - @@ -113,7 +106,7 @@ extracted. - @@ -184,8 +177,8 @@ or 20010604_1200. @@ -224,7 +217,7 @@ with +of the data, as defined by EDEX. @@ -251,18 +244,18 @@ back into real numbers.
    Mandatory (See Note)
    Specifies the ifpServer host from which the data will be + Specifies the EDEX host from which the data will be extracted.
    Mandatory (See Note)
    Specifies the ifpServer host from which the data will be + Specifies the EDEX host from which the data will be extracted.
    Specifies an edit area outside of which the grids are clipped with -a fill value. If the edit area is not specified 
    -or is not found in the ifpServer, the entire grid will be written to +a fill value. If the edit area is not specified +or is not found in EDEX, the entire grid will be written to the file unclipped.
    When specified, data values will be "trimmed" or rounded to the precision -of the data, as defined by the ifpServer.
    -k Specifies a configuration interval file which controls the interval/spacing of the grids.  The name identifies a -file within the ifpServer TEXT/Utility directory and must be a Python +file within the EDEX textUtilities directory and must be a Python file in the correct format.
    -Note: The -h and -r switches are predefined if +Note: The -h and -r switches are predefined if you are running ifpnetCDF in the GFESuite installed environment.  The values specified in the installation are picked up automatically. You only -need to specify them if you want to connect to a different ifpServer.   If environment variables ${CDSHOST} or ${CDSPORT} are defined, then the default server and port will be @@ -334,7 +327,7 @@ that contains that explicit time, then the grid is included in the output.

    The configuration interval file is a python file and must reside in the -ifpServer's TEXT/Utility directory.  You can create the file +EDEX textUtilities directory.  You can create the file through the use of the GFE, with the GFE->Define Text Products menu, or by using a conventional text editor and the ifpServerText utility.
    diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust.jpg b/cave/com.raytheon.viz.gfe/help/images/Adjust.jpg new file mode 100644 index 0000000000..65a6f4439f Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust1.png b/cave/com.raytheon.viz.gfe/help/images/Adjust1.png new file mode 100644 index 0000000000..6a6c637b9d Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust1.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust10.png b/cave/com.raytheon.viz.gfe/help/images/Adjust10.png new file mode 100644 index 0000000000..632347c9d3 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust10.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust11.png b/cave/com.raytheon.viz.gfe/help/images/Adjust11.png new file mode 100644 index 0000000000..4e37999121 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust11.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust12.png b/cave/com.raytheon.viz.gfe/help/images/Adjust12.png new file mode 100644 index 0000000000..a292cc461e Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust12.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust13.png b/cave/com.raytheon.viz.gfe/help/images/Adjust13.png new file mode 100644 index 0000000000..dd8c8901f1 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust13.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust2.png b/cave/com.raytheon.viz.gfe/help/images/Adjust2.png new file mode 100644 index 0000000000..4bca8c0d7c Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust2.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust3.png b/cave/com.raytheon.viz.gfe/help/images/Adjust3.png new file mode 100644 index 0000000000..16edeed73b Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust3.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust4.png b/cave/com.raytheon.viz.gfe/help/images/Adjust4.png new file mode 100644 index 0000000000..60e1353844 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust4.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust5.png b/cave/com.raytheon.viz.gfe/help/images/Adjust5.png new file mode 100644 index 0000000000..61d3742b15 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust5.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust6.png b/cave/com.raytheon.viz.gfe/help/images/Adjust6.png new file mode 100644 index 0000000000..c76304c862 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust6.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust7.png b/cave/com.raytheon.viz.gfe/help/images/Adjust7.png new file mode 100644 index 0000000000..e3898829b9 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust7.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust8.png b/cave/com.raytheon.viz.gfe/help/images/Adjust8.png new file mode 100644 index 0000000000..8bc8068c76 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust8.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Adjust9.png b/cave/com.raytheon.viz.gfe/help/images/Adjust9.png new file mode 100644 index 0000000000..ce7592356f Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Adjust9.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ColorChooser.gif b/cave/com.raytheon.viz.gfe/help/images/ColorChooser.gif index 4b73d31cba..e69de29bb2 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/ColorChooser.gif and b/cave/com.raytheon.viz.gfe/help/images/ColorChooser.gif differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ColorChooser.jpg b/cave/com.raytheon.viz.gfe/help/images/ColorChooser.jpg new file mode 100644 index 0000000000..e5925d620f Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ColorChooser.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ColorTableEditor.jpg b/cave/com.raytheon.viz.gfe/help/images/ColorTableEditor.jpg index fcec4291fa..c9cdcd767e 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/ColorTableEditor.jpg and b/cave/com.raytheon.viz.gfe/help/images/ColorTableEditor.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogAboutCAVE.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogAboutCAVE.jpg new file mode 100644 index 0000000000..83e7696eff Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/DialogAboutCAVE.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogAutoSaveInterval.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogAutoSaveInterval.jpg index 54ed91b501..bd59d9bd48 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogAutoSaveInterval.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogAutoSaveInterval.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogColorTableBrightness.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogColorTableBrightness.jpg index e722a7f8ec..90facb9081 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogColorTableBrightness.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogColorTableBrightness.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogColorTableDiscrete.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogColorTableDiscrete.jpg index f64db23835..05f420f90d 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogColorTableDiscrete.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogColorTableDiscrete.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogColorTableRange.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogColorTableRange.jpg index 2aa97041a1..fe3fd10c43 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogColorTableRange.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogColorTableRange.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogComboColors.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogComboColors.jpg index f7107e4e68..a0f02a28f7 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogComboColors.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogComboColors.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogCopyAllGrids.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogCopyAllGrids.jpg index 439e53252d..73d1f4e9fe 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogCopyAllGrids.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogCopyAllGrids.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogCopySelectedGrids.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogCopySelectedGrids.jpg index 2cfd1bfd6f..b09c55013e 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogCopySelectedGrids.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogCopySelectedGrids.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogCreateFromScratch.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogCreateFromScratch.jpg index 4c88941c28..a3c8f08e7e 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogCreateFromScratch.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogCreateFromScratch.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDTR.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDTR.jpg index ec55ff7cf4..7440d9a757 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDTR.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDTR.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDefineConfig.png b/cave/com.raytheon.viz.gfe/help/images/DialogDefineConfig.png index 94c74f5a13..e96186b012 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDefineConfig.png and b/cave/com.raytheon.viz.gfe/help/images/DialogDefineConfig.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDefineProcedures.png b/cave/com.raytheon.viz.gfe/help/images/DialogDefineProcedures.png index 24f2dd9bb8..804e78bb9b 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDefineProcedures.png and b/cave/com.raytheon.viz.gfe/help/images/DialogDefineProcedures.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDefineText.png b/cave/com.raytheon.viz.gfe/help/images/DialogDefineText.png index d68dcd4d97..81329cddfc 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDefineText.png and b/cave/com.raytheon.viz.gfe/help/images/DialogDefineText.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDeleteSamples.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDeleteSamples.jpg index ba19c1d941..0136413588 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDeleteSamples.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDeleteSamples.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDeleteWeatherElementGroup.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDeleteWeatherElementGroup.jpg index fee81c637e..25cff2a672 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDeleteWeatherElementGroup.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDeleteWeatherElementGroup.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDelta.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDelta.jpg index d394f7dbb6..ad566df299 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDelta.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDelta.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDiscreteContains.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDiscreteContains.jpg index 611ca65973..6bdd9702ab 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDiscreteContains.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDiscreteContains.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayAttributes.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayAttributes.jpg index 6822c3011a..0a1499fd5e 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayAttributes.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayAttributes.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo.jpg index baa46630ef..4b44229506 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo1.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo1.jpg index 7b23e2ff62..285f8194aa 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo1.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo2.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo2.jpg index 9a7c2f5d22..342fbaaf4d 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo2.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo2.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo3.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo3.jpg index 6b25d93ff9..d240f99469 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo3.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo3.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo4.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo4.jpg index b6b0dd0618..0e18250ccb 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo4.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo4.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo5.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo5.jpg index 07fc9a8a83..54629beab4 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo5.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo5.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo6.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo6.jpg index 2f5bb5c722..2ca9cfa65b 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo6.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogDisplayInfo6.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogEditAction.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogEditAction.jpg index 81c1dad45e..6efdb799c8 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogEditAction.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogEditAction.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogEditArea.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogEditArea.jpg index 7819b8c70f..6626435522 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogEditArea.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogEditArea.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaAppearance.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaAppearance.jpg index ecd7f40dbf..0cf2728439 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaAppearance.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaAppearance.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDelete.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDelete.jpg index 503678d457..60289c4336 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDelete.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDelete.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDeleteGroup.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDeleteGroup.jpg index 85e862a158..f54dada0a4 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDeleteGroup.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaDeleteGroup.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSave.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSave.jpg index dcaa506ed2..888112c29d 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSave.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSave.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSaveGroup.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSaveGroup.jpg index 42b1f57f87..2e43d005b8 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSaveGroup.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogEditAreaSaveGroup.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogExitGFE.png b/cave/com.raytheon.viz.gfe/help/images/DialogExitGFE.png index 5147b0ba50..4c82e1f942 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogExitGFE.png and b/cave/com.raytheon.viz.gfe/help/images/DialogExitGFE.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogFuzz.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogFuzz.jpg index 2e9df56ff8..064b4cfc13 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogFuzz.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogFuzz.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogInterpAlgorithm.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogInterpAlgorithm.jpg index 276c2f996d..70fc3b7d40 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogInterpAlgorithm.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogInterpAlgorithm.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogInterpolation.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogInterpolation.jpg index e84fe69346..5ea69eb7ac 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogInterpolation.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogInterpolation.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogLoadSamples.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogLoadSamples.jpg index f99b453e53..02e973b183 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogLoadSamples.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogLoadSamples.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogManageHiddenWE.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogManageHiddenWE.jpg index 83012ec379..91e4fc7614 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogManageHiddenWE.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogManageHiddenWE.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogMoveParameter.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogMoveParameter.jpg index b0e9ecc528..14f9ccf3e4 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogMoveParameter.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogMoveParameter.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueDiscrete.png b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueDiscrete.png index d794604f53..464e3a8428 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueDiscrete.png and b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueDiscrete.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueScalar.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueScalar.jpg index 6648bbed17..87cd60afe1 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueScalar.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueScalar.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueVector.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueVector.jpg index 58fe60332a..ff48f5bb2c 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueVector.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueVector.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueWeather.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueWeather.jpg index 0c601f1279..2e323e21c6 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueWeather.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogPickUpValueWeather.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogProcessMonitor5.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogProcessMonitor5.jpg index a728653759..0baadb4aa2 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogProcessMonitor5.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogProcessMonitor5.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogPublish.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogPublish.jpg index 5358e64a4a..2c9fb934cf 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogPublish.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogPublish.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogRequestISC.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogRequestISC.jpg index 4f59ae3abf..499aedcdf9 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogRequestISC.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogRequestISC.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogRevertFcst.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogRevertFcst.jpg index 482a49bfa6..fb78b47548 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogRevertFcst.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogRevertFcst.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSTR.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSTR.jpg index 0219256c2d..0820b70684 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSTR.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSTR.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSamplesLatLon.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSamplesLatLon.jpg index 89d3d5f896..457c646260 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSamplesLatLon.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSamplesLatLon.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSaveFcst.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSaveFcst.jpg index 14571d64f0..1a72fc548a 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSaveFcst.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSaveFcst.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSaveSamples.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSaveSamples.jpg index 46598810aa..806e90f4e0 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSaveSamples.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSaveSamples.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSaveWeatherElementGroup.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSaveWeatherElementGroup.jpg index 1139687f7b..6e2d70ec6b 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSaveWeatherElementGroup.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSaveWeatherElementGroup.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogScripts.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogScripts.jpg index 6cb9a188f2..5ebaf9cd33 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogScripts.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogScripts.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSendISC.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSendISC.jpg index cb8a0085b0..92fd9fc7ef 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSendISC.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSendISC.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSendISC1.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSendISC1.jpg index 960cba9975..84e943f8f8 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSendISC1.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSendISC1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogSetWeather.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogSetWeather.jpg index 58fbf6b1d6..a7fa3b7187 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogSetWeather.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogSetWeather.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogTEStatisticsMode.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogTEStatisticsMode.jpg index b003c45963..193896ca8c 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogTEStatisticsMode.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogTEStatisticsMode.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogTimeScaleDisplayedPeriods.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogTimeScaleDisplayedPeriods.jpg index 91012bef31..3b1a2ae520 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogTimeScaleDisplayedPeriods.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogTimeScaleDisplayedPeriods.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogTimeShift.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogTimeShift.jpg index ff334ef3cc..2bd99aaf89 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogTimeShift.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogTimeShift.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/DialogWeatherContains.jpg b/cave/com.raytheon.viz.gfe/help/images/DialogWeatherContains.jpg index 51e6375e30..bd9f441848 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/DialogWeatherContains.jpg and b/cave/com.raytheon.viz.gfe/help/images/DialogWeatherContains.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ERQCcheck.png b/cave/com.raytheon.viz.gfe/help/images/ERQCcheck.png new file mode 100644 index 0000000000..be3333e684 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ERQCcheck.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Enhanced_Wx.png b/cave/com.raytheon.viz.gfe/help/images/Enhanced_Wx.png new file mode 100644 index 0000000000..d7191d328d Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Enhanced_Wx.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ExitGFEDialog.png b/cave/com.raytheon.viz.gfe/help/images/ExitGFEDialog.png index 785ae6315a..df0544d187 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/ExitGFEDialog.png and b/cave/com.raytheon.viz.gfe/help/images/ExitGFEDialog.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Extrapolate.jpg b/cave/com.raytheon.viz.gfe/help/images/Extrapolate.jpg new file mode 100644 index 0000000000..1890740e79 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Extrapolate.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Extrapolate1.jpg b/cave/com.raytheon.viz.gfe/help/images/Extrapolate1.jpg new file mode 100644 index 0000000000..9c6e9cb24e Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Extrapolate1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/FormatterLauncher.png b/cave/com.raytheon.viz.gfe/help/images/FormatterLauncher.png index 8fa54d35ba..315f384878 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/FormatterLauncher.png and b/cave/com.raytheon.viz.gfe/help/images/FormatterLauncher.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GFEPracticeMode.png b/cave/com.raytheon.viz.gfe/help/images/GFEPracticeMode.png index fd5c8bae96..8e499b8ff2 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GFEPracticeMode.png and b/cave/com.raytheon.viz.gfe/help/images/GFEPracticeMode.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GFEStartup1.png b/cave/com.raytheon.viz.gfe/help/images/GFEStartup1.png index cd33a66dce..dfd19dfa87 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GFEStartup1.png and b/cave/com.raytheon.viz.gfe/help/images/GFEStartup1.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GFEStartup2.png b/cave/com.raytheon.viz.gfe/help/images/GFEStartup2.png index dd4c5446ea..525512f978 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GFEStartup2.png and b/cave/com.raytheon.viz.gfe/help/images/GFEStartup2.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.jpg b/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.jpg index 2e0cd69501..19b09c5a8a 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.jpg and b/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.png b/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.png index 1d78a2bd23..d96cb13338 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.png and b/cave/com.raytheon.viz.gfe/help/images/GFEStartup4.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GFETestMode.png b/cave/com.raytheon.viz.gfe/help/images/GFETestMode.png index eb831b6a90..d9d9bedc18 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GFETestMode.png and b/cave/com.raytheon.viz.gfe/help/images/GFETestMode.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor.png index 5cb22c2fba..fea3492342 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor1.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor1.png index 4a36bf6622..abc6d3448c 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor1.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor1.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor10.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor10.png index 33b4fe1254..a42eec3224 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor10.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor10.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor11.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor11.png index 1dde7f215e..7d38dbc909 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor11.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor11.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor12.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor12.png index 153f39a84f..4770eca455 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor12.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor12.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor14.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor14.png index ce7f0b833d..aa97ae6f06 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor14.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor14.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor20.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor20.png index b62626ff0c..d72c6f61ed 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor20.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor20.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor22.png b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor22.png index 33ce9b5022..b32ac56920 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GHGMonitor22.png and b/cave/com.raytheon.viz.gfe/help/images/GHGMonitor22.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GMButtons.jpg b/cave/com.raytheon.viz.gfe/help/images/GMButtons.jpg index 3e82f5c93b..d2246faa96 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GMButtons.jpg and b/cave/com.raytheon.viz.gfe/help/images/GMButtons.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/GenerateCycloneUI.png b/cave/com.raytheon.viz.gfe/help/images/GenerateCycloneUI.png index 408c44d092..eaaa05fbb0 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/GenerateCycloneUI.png and b/cave/com.raytheon.viz.gfe/help/images/GenerateCycloneUI.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ISC_new.jpg b/cave/com.raytheon.viz.gfe/help/images/ISC_new.jpg new file mode 100644 index 0000000000..b669dae0ae Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ISC_new.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ISC_new1.jpg b/cave/com.raytheon.viz.gfe/help/images/ISC_new1.jpg new file mode 100644 index 0000000000..b0656f044c Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ISC_new1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/LimitValues.png b/cave/com.raytheon.viz.gfe/help/images/LimitValues.png new file mode 100644 index 0000000000..1254437510 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/LimitValues.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/LimitValues1.png b/cave/com.raytheon.viz.gfe/help/images/LimitValues1.png new file mode 100644 index 0000000000..1a247681d9 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/LimitValues1.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/LimitValues2.png b/cave/com.raytheon.viz.gfe/help/images/LimitValues2.png new file mode 100644 index 0000000000..d6ae6e10f3 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/LimitValues2.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/LimitValues3.png b/cave/com.raytheon.viz.gfe/help/images/LimitValues3.png new file mode 100644 index 0000000000..0278825b29 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/LimitValues3.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/LimitValues4.png b/cave/com.raytheon.viz.gfe/help/images/LimitValues4.png new file mode 100644 index 0000000000..958e98598f Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/LimitValues4.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend1.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend1.jpg new file mode 100644 index 0000000000..fe6fc8c800 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend10.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend10.jpg new file mode 100644 index 0000000000..2a127d76cb Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend10.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend11.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend11.jpg new file mode 100644 index 0000000000..ef401b4e91 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend11.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend12.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend12.jpg new file mode 100644 index 0000000000..9683ac0172 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend12.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend13.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend13.jpg new file mode 100644 index 0000000000..538097660f Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend13.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend14.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend14.jpg new file mode 100644 index 0000000000..afae7245a8 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend14.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend15.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend15.jpg new file mode 100644 index 0000000000..34881e9aef Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend15.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend16.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend16.jpg new file mode 100644 index 0000000000..365e6b59cd Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend16.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend17.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend17.jpg new file mode 100644 index 0000000000..ceaadd4aad Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend17.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend18.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend18.jpg new file mode 100644 index 0000000000..1a2ccebb1d Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend18.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend19.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend19.jpg new file mode 100644 index 0000000000..01c63772ca Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend19.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend2.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend2.jpg new file mode 100644 index 0000000000..a1d7800a1e Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend2.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend20.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend20.jpg new file mode 100644 index 0000000000..e2a7a8d2a3 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend20.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend21.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend21.jpg new file mode 100644 index 0000000000..cd5831d45b Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend21.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend22.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend22.jpg new file mode 100644 index 0000000000..b31c436968 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend22.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend23.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend23.jpg new file mode 100644 index 0000000000..1db9d69a1a Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend23.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend3.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend3.jpg new file mode 100644 index 0000000000..a5e0a0c674 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend3.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend4.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend4.jpg new file mode 100644 index 0000000000..8be5985362 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend4.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend5.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend5.jpg new file mode 100644 index 0000000000..10d75b376b Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend5.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend6.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend6.jpg new file mode 100644 index 0000000000..9e01acd229 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend6.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend7.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend7.jpg new file mode 100644 index 0000000000..13f6d13c74 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend7.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend8.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend8.jpg new file mode 100644 index 0000000000..02a670167e Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend8.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ModelBlend9.jpg b/cave/com.raytheon.viz.gfe/help/images/ModelBlend9.jpg new file mode 100644 index 0000000000..a3758c8c98 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/ModelBlend9.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks.png new file mode 100644 index 0000000000..8a78c0d52d Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks1.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks1.png new file mode 100644 index 0000000000..7f164cdd50 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks1.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks10.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks10.png new file mode 100644 index 0000000000..23d74a26f0 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks10.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks2.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks2.png new file mode 100644 index 0000000000..1a7a224a3d Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks2.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks3.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks3.png new file mode 100644 index 0000000000..28da223a66 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks3.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks4.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks4.png new file mode 100644 index 0000000000..7eb0543b6a Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks4.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks5.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks5.png new file mode 100644 index 0000000000..3ce3609710 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks5.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks6.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks6.png new file mode 100644 index 0000000000..3dd9305609 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks6.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks7.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks7.png new file mode 100644 index 0000000000..286b92c465 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks7.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks8.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks8.png new file mode 100644 index 0000000000..6f71b4184b Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks8.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks9.png b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks9.png new file mode 100644 index 0000000000..10ae82c0ed Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/NDFD_QPF_Checks9.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Normal.jpg b/cave/com.raytheon.viz.gfe/help/images/Normal.jpg new file mode 100644 index 0000000000..79f2980009 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Normal.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate.jpg new file mode 100644 index 0000000000..6889d36f17 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate1.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate1.jpg new file mode 100644 index 0000000000..d791f86e57 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate10.png b/cave/com.raytheon.viz.gfe/help/images/Populate10.png new file mode 100644 index 0000000000..05a79b76ab Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate10.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate11.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate11.jpg new file mode 100644 index 0000000000..8a63dc46f7 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate11.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate13.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate13.jpg new file mode 100644 index 0000000000..514d01bec0 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate13.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate2.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate2.jpg new file mode 100644 index 0000000000..7e899c4f11 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate2.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate3.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate3.jpg new file mode 100644 index 0000000000..9fba73236c Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate3.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate4.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate4.jpg new file mode 100644 index 0000000000..7c8a7016ab Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate4.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate5.png b/cave/com.raytheon.viz.gfe/help/images/Populate5.png new file mode 100644 index 0000000000..6fd112f676 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate5.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate6.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate6.jpg new file mode 100644 index 0000000000..41644140ea Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate6.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate7.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate7.jpg new file mode 100644 index 0000000000..0f2a4ba057 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate7.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate8.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate8.jpg new file mode 100644 index 0000000000..0274c5000c Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate8.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/Populate9.jpg b/cave/com.raytheon.viz.gfe/help/images/Populate9.jpg new file mode 100644 index 0000000000..b9bbf76ed3 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/Populate9.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/RemoveWx.png b/cave/com.raytheon.viz.gfe/help/images/RemoveWx.png new file mode 100644 index 0000000000..fbdf2d713c Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/RemoveWx.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/RemoveWx1.png b/cave/com.raytheon.viz.gfe/help/images/RemoveWx1.png new file mode 100644 index 0000000000..284d619342 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/RemoveWx1.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/RemoveWx2.png b/cave/com.raytheon.viz.gfe/help/images/RemoveWx2.png new file mode 100644 index 0000000000..cd738ac396 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/RemoveWx2.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/RemoveWx3.png b/cave/com.raytheon.viz.gfe/help/images/RemoveWx3.png new file mode 100644 index 0000000000..ce0cfe9ee2 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/RemoveWx3.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/RemoveWx4.png b/cave/com.raytheon.viz.gfe/help/images/RemoveWx4.png new file mode 100644 index 0000000000..a5bb223c46 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/RemoveWx4.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/RemoveWx5.png b/cave/com.raytheon.viz.gfe/help/images/RemoveWx5.png new file mode 100644 index 0000000000..82fbba2c81 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/RemoveWx5.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/SaveDialog.png b/cave/com.raytheon.viz.gfe/help/images/SaveDialog.png index 1709e332a3..f06205ef56 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/SaveDialog.png and b/cave/com.raytheon.viz.gfe/help/images/SaveDialog.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/SetDiscreteDialog.png b/cave/com.raytheon.viz.gfe/help/images/SetDiscreteDialog.png index aa5daeaf1e..391122450a 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/SetDiscreteDialog.png and b/cave/com.raytheon.viz.gfe/help/images/SetDiscreteDialog.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/SetWeatherDialog.png b/cave/com.raytheon.viz.gfe/help/images/SetWeatherDialog.png index 64ab6b2b58..49087f2bf6 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/SetWeatherDialog.png and b/cave/com.raytheon.viz.gfe/help/images/SetWeatherDialog.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/SignificantMessage.png b/cave/com.raytheon.viz.gfe/help/images/SignificantMessage.png index 0e44acba78..f06861ef13 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/SignificantMessage.png and b/cave/com.raytheon.viz.gfe/help/images/SignificantMessage.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/StatusBar.jpg b/cave/com.raytheon.viz.gfe/help/images/StatusBar.jpg index 632af30965..1c779da5aa 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/StatusBar.jpg and b/cave/com.raytheon.viz.gfe/help/images/StatusBar.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/TCMWindToolUI.png b/cave/com.raytheon.viz.gfe/help/images/TCMWindToolUI.png index 509dde0caa..0b67d9a95c 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/TCMWindToolUI.png and b/cave/com.raytheon.viz.gfe/help/images/TCMWindToolUI.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.jpg b/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.jpg index d2d5339309..e60ca5dda0 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.jpg and b/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.png b/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.png index cfc387da82..96fa157b18 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.png and b/cave/com.raytheon.viz.gfe/help/images/UrgentMessage.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/VTECFlow.png b/cave/com.raytheon.viz.gfe/help/images/VTECFlow.png index 6f81535575..6c07aeb294 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/VTECFlow.png and b/cave/com.raytheon.viz.gfe/help/images/VTECFlow.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/VTECFlowT.png b/cave/com.raytheon.viz.gfe/help/images/VTECFlowT.png index 92f3cbb19a..f8de31575d 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/VTECFlowT.png and b/cave/com.raytheon.viz.gfe/help/images/VTECFlowT.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ViewMessage.jpg b/cave/com.raytheon.viz.gfe/help/images/ViewMessage.jpg index 02b29b52d1..de1ba8fdca 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/ViewMessage.jpg and b/cave/com.raytheon.viz.gfe/help/images/ViewMessage.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/WEBrowserDialog.png b/cave/com.raytheon.viz.gfe/help/images/WEBrowserDialog.png index 3569f49e3d..efdbd2db2a 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/WEBrowserDialog.png and b/cave/com.raytheon.viz.gfe/help/images/WEBrowserDialog.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/alertViz.jpg b/cave/com.raytheon.viz.gfe/help/images/alertViz.jpg new file mode 100644 index 0000000000..93d41a8695 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/alertViz.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/appLauncher.jpg b/cave/com.raytheon.viz.gfe/help/images/appLauncher.jpg new file mode 100644 index 0000000000..58f0617e2c Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/appLauncher.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/buttonBar.jpg b/cave/com.raytheon.viz.gfe/help/images/buttonBar.jpg new file mode 100644 index 0000000000..7b4d3faa80 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/buttonBar.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/clearEa.jpg b/cave/com.raytheon.viz.gfe/help/images/clearEa.jpg new file mode 100644 index 0000000000..06ac803f65 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/clearEa.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/contour.jpg b/cave/com.raytheon.viz.gfe/help/images/contour.jpg new file mode 100644 index 0000000000..3b329ab05b Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/contour.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/contractTimeScale.jpg b/cave/com.raytheon.viz.gfe/help/images/contractTimeScale.jpg new file mode 100644 index 0000000000..00af69e623 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/contractTimeScale.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/deselectAll.jpg b/cave/com.raytheon.viz.gfe/help/images/deselectAll.jpg new file mode 100644 index 0000000000..c2a97c52d7 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/deselectAll.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/eaButtons.jpg b/cave/com.raytheon.viz.gfe/help/images/eaButtons.jpg new file mode 100644 index 0000000000..34d42867ae Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/eaButtons.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/eaMode.jpg b/cave/com.raytheon.viz.gfe/help/images/eaMode.jpg new file mode 100644 index 0000000000..81e0f42240 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/eaMode.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/editAction.jpg b/cave/com.raytheon.viz.gfe/help/images/editAction.jpg new file mode 100644 index 0000000000..976e789249 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/editAction.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/editArea.jpg b/cave/com.raytheon.viz.gfe/help/images/editArea.jpg new file mode 100644 index 0000000000..4c5f7abed4 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/editArea.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/expandTimeScale.jpg b/cave/com.raytheon.viz.gfe/help/images/expandTimeScale.jpg new file mode 100644 index 0000000000..7c25d41a6f Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/expandTimeScale.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/gfeMainMenu.jpg b/cave/com.raytheon.viz.gfe/help/images/gfeMainMenu.jpg new file mode 100644 index 0000000000..90b5d89a10 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/gfeMainMenu.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/gfeMainMenuSmall.jpg b/cave/com.raytheon.viz.gfe/help/images/gfeMainMenuSmall.jpg new file mode 100644 index 0000000000..0a2169c0d0 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/gfeMainMenuSmall.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/gfeStartMenu.jpg b/cave/com.raytheon.viz.gfe/help/images/gfeStartMenu.jpg new file mode 100644 index 0000000000..7bf1518144 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/gfeStartMenu.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/ifpServerText.png b/cave/com.raytheon.viz.gfe/help/images/ifpServerText.png index c6d1f52fdf..98340cb7f9 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/ifpServerText.png and b/cave/com.raytheon.viz.gfe/help/images/ifpServerText.png differ diff --git a/cave/com.raytheon.viz.gfe/help/images/isc6.jpg b/cave/com.raytheon.viz.gfe/help/images/isc6.jpg index ecdf4523af..220a5ca620 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/isc6.jpg and b/cave/com.raytheon.viz.gfe/help/images/isc6.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/isc7.jpg b/cave/com.raytheon.viz.gfe/help/images/isc7.jpg index a7600f981f..036de2999d 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/isc7.jpg and b/cave/com.raytheon.viz.gfe/help/images/isc7.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/isc_thumb.jpg b/cave/com.raytheon.viz.gfe/help/images/isc_thumb.jpg new file mode 100644 index 0000000000..d917e08461 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/isc_thumb.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/mainMenu.jpg b/cave/com.raytheon.viz.gfe/help/images/mainMenu.jpg index 2bdd1be2bb..728fa53e7e 100644 Binary files a/cave/com.raytheon.viz.gfe/help/images/mainMenu.jpg and b/cave/com.raytheon.viz.gfe/help/images/mainMenu.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/moveCopy.jpg b/cave/com.raytheon.viz.gfe/help/images/moveCopy.jpg new file mode 100644 index 0000000000..2824d6e642 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/moveCopy.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/next.jpg b/cave/com.raytheon.viz.gfe/help/images/next.jpg new file mode 100644 index 0000000000..df87ed2b96 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/next.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/pan.jpg b/cave/com.raytheon.viz.gfe/help/images/pan.jpg new file mode 100644 index 0000000000..d538c11962 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/pan.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/pencil.jpg b/cave/com.raytheon.viz.gfe/help/images/pencil.jpg new file mode 100644 index 0000000000..641cfe7d04 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/pencil.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/previous.jpg b/cave/com.raytheon.viz.gfe/help/images/previous.jpg new file mode 100644 index 0000000000..f9445538c5 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/previous.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/queryEa.jpg b/cave/com.raytheon.viz.gfe/help/images/queryEa.jpg new file mode 100644 index 0000000000..84fdacc96d Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/queryEa.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/quickSet1.jpg b/cave/com.raytheon.viz.gfe/help/images/quickSet1.jpg new file mode 100644 index 0000000000..7a03b87905 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/quickSet1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/quickSet2.jpg b/cave/com.raytheon.viz.gfe/help/images/quickSet2.jpg new file mode 100644 index 0000000000..e81da5acb3 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/quickSet2.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/quickSet3.jpg b/cave/com.raytheon.viz.gfe/help/images/quickSet3.jpg new file mode 100644 index 0000000000..c10286cda1 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/quickSet3.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/quickSet4.jpg b/cave/com.raytheon.viz.gfe/help/images/quickSet4.jpg new file mode 100644 index 0000000000..dda32b23c0 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/quickSet4.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/sample.jpg b/cave/com.raytheon.viz.gfe/help/images/sample.jpg new file mode 100644 index 0000000000..04ce30b5ca Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/sample.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/saveEa.jpg b/cave/com.raytheon.viz.gfe/help/images/saveEa.jpg new file mode 100644 index 0000000000..3e5a8f9ae1 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/saveEa.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/saveIcon.jpg b/cave/com.raytheon.viz.gfe/help/images/saveIcon.jpg new file mode 100644 index 0000000000..c9616c230d Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/saveIcon.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/toggle1.jpg b/cave/com.raytheon.viz.gfe/help/images/toggle1.jpg new file mode 100644 index 0000000000..651b02f093 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/toggle1.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/toggle2.jpg b/cave/com.raytheon.viz.gfe/help/images/toggle2.jpg new file mode 100644 index 0000000000..60fa04e80b Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/toggle2.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/toggleEa.jpg b/cave/com.raytheon.viz.gfe/help/images/toggleEa.jpg new file mode 100644 index 0000000000..18863738a1 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/toggleEa.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/toggleISC.jpg b/cave/com.raytheon.viz.gfe/help/images/toggleISC.jpg new file mode 100644 index 0000000000..fb6bfcf610 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/toggleISC.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/toggleQuickView.jpg b/cave/com.raytheon.viz.gfe/help/images/toggleQuickView.jpg new file mode 100644 index 0000000000..f35f1e4045 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/toggleQuickView.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/images/undo.jpg b/cave/com.raytheon.viz.gfe/help/images/undo.jpg new file mode 100644 index 0000000000..7c0e89cb70 Binary files /dev/null and b/cave/com.raytheon.viz.gfe/help/images/undo.jpg differ diff --git a/cave/com.raytheon.viz.gfe/help/iscMosaic.html b/cave/com.raytheon.viz.gfe/help/iscMosaic.html index 13fd24bf3b..dac26244cc 100644 --- a/cave/com.raytheon.viz.gfe/help/iscMosaic.html +++ b/cave/com.raytheon.viz.gfe/help/iscMosaic.html @@ -5,12 +5,13 @@ content="text/html; charset=iso-8859-1"> + iscMosaic - User's Guide

    iscMosaic User's Guide

    -March 1, 2009
    +January 6, 2012

    Table of Contents

    @@ -132,12 +133,12 @@ The following command line switches are supported by iscMosaic: -h hostname YES  (See Note) - Identifies the hostname upon which the ifpServer is running. + Identifies the hostname upon which EDEX is running. -r rpcport YES (See Note) - Identifies the RPC port number upon which the ifpServer is + Identifies the RPC port number upon which EDEX is processing requests. @@ -263,7 +264,7 @@ netCDF file is used to determine the area mask.  For example, if the netCDF file site id field is "CYS", then the program will attempt to get -the edit area called "ISC_CYS" from the ifpServer and then only merge +the edit area called "ISC_CYS" from EDEX and then only merge those grid points.  If the -n switch is present, then the area mask will be ignored and all grid points in the input netCDF will be merged into @@ -284,7 +285,7 @@ netCDF file is used to determine the area mask.  For example, if the netCDF file site id field is "CYS", then the program will attempt to get -the edit area called "ISC_CYS" from the ifpServer and then only merge +the edit area called "ISC_CYS" from EDEX and then only merge those grid points.  The -a switch identifies the name of the edit area used @@ -293,9 +294,9 @@ for masking. -w message NO - Warn/Alert all clients connected to the ifpServer that data + Warn/Alert all clients connected to EDEX that data has been -processed.  This produces a message on the GFE status bar +processed.  This produces a message on the AlertViz indicating that "message" occurred.  The site identifier, number of grids, valid @@ -339,7 +340,7 @@ for routine use of ifpnetCDF. Grid Delay. Specifies the delay between processing of grids. Defaults to 0.25 seconds. The delay is used to lessen the effect of ISC traffic -on the loading of the ifpServer, and hence affects the GFE performance. +on the loading of EDEX, and hence affects the GFE performance. The value is in seconds, and can be fractional. To eliminate the delay, use the -D 0 @@ -350,9 +351,9 @@ switch. NO
    - Use the office type from the -ifpServer.  Incoming weather elements will be renamed if the data -is from a different office type than your own.   For example, + Use the office type from EDEX. + Incoming weather elements will be renamed if the data +is from a different office type than your own. For example, receiving QPF data from an RFC at a WFO will have QPF stored as QPFrfc.
    @@ -362,7 +363,7 @@ receiving QPF data from an RFC at a WFO will have QPF stored as QPFrfc.
    NO
    Enables the "ISC Sending" for -this process.   Depending upon how the ifpServer ISC +this process.   Depending upon how the EDEX ISC configuration is set, different behaviors may be observed.  If "Send ISC On Save" is set, then the Fcst grids will be sent upon saving.  If "Send ISC On Save" is not set, then the user must @@ -376,16 +377,16 @@ Grids capability.
    NO
    Enables the "translate" mode for -WEATHER and DISCRETE data.   If incoming data is not -considered valid per the ifpServer definition, then the data keys will -be translated to simplier keys that is understood by the -ifpServer.  See translation rules +WEATHER and DISCRETE data. If incoming data is not +considered valid per EDEX definition, then the data keys will +be translated to simpler keys that is understood by EDEX. +See translation rules for more details.
    -Note: The -h serverhost, -r rpcport, and -d +Note: The -h serverhost, -r rpcport, and -d outputDatabaseID are predefined based on your installation configration of GFESuite.  @@ -685,11 +686,11 @@ for this purpose: -h hostname - Hostname upon which the ifpServer is running + Hostname upon which EDEX is running -r portNumber - RPC port number upon which the ifpServer is handling requests + RPC port number upon which EDEX is handling requests -d databaseOutputID @@ -737,40 +738,40 @@ file format documentation.

    Translation Rules

    When the -T switch is specified and incoming data does not conform to -"known values" by the ifpServer definition, iscMosaic will attempt to -translate the data into "known values".    The iscMosaic -log file will indicate which values were translated.   If the +"known values" by the EDEX definition, iscMosaic will attempt to +translate the data into "known values". The iscMosaic +log file will indicate which values were translated. If the -w switch is present, then similar information will be sent to the GFEs as alert (orange) messages on the ISC status bar.

    Discrete Data

    1. If "overlapping" data is input (as denoted by the key^key -format), and the ifpServer is not configured for this weather element +format), and EDEX is not configured for this weather element to have overlapping data, then only the first key is used.    For example, "FW.A^SV.A" will translate into "FW.A".
    2. If data containing aux data fields is input and the field length -exceeds the ifpServer configuration, then the aux data field will be -dropped.   For example, if the aux data field is configured +exceeds EDEX configuration, then the aux data field will be +dropped. For example, if the aux data field is configured to be a maximum of 4 characters and "FW.A:12345" is input, it will be translated into "FW.A".
    3. If data containing an unknown key is input, then the data will be -translated into the first defined value in the ifpServer.   +translated into the first defined value in EDEX.   For many configurations including Hazards, this value is -"<None>".   For example, if "XY.Z" is input, it will be +"<None>". For example, if "XY.Z" is input, it will be translated into "<None>".

    Weather Data

    1. If an unknown visibility is input, then the visibility will be -translated into the first configured visibility element in the -ifpServer, which is normally <NoVis>.   For example, +translated into the first configured visibility element in +EDEX, which is normally <NoVis>.   For example, "Sct:RW:-:52M:" will translate into "Sct:RW:-:<NoVis>".
    2. If an unknown type is input, then the type and all associated -fields will be translated into the first configured type element in the -ifpServer, which is normally <NoWx>.   For example, +fields will be translated into the first configured type element in +EDEX, which is normally <NoWx>. For example, "Sct:ZZZ:+:<NoVis>:" will translate into "<NoCov>:<NoWx>:<NoInten>:<NoVis>:".
    3. If an unknown coverage is input, then the coverage will be diff --git a/cave/com.raytheon.viz.gfe/help/keys.html b/cave/com.raytheon.viz.gfe/help/keys.html index 57de146073..2c0e2adb8e 100644 --- a/cave/com.raytheon.viz.gfe/help/keys.html +++ b/cave/com.raytheon.viz.gfe/help/keys.html @@ -9,18 +9,14 @@

      GFE Keyboard Accelerators

      -September 30, 2004
      +December 30, 2011

      -
      -


      The GFE includes many of the keyboard accelerators that are similar to those implemented in the D2D system. -
      The table below lists each function with its corresponding key.

      -  +
      @@ -69,14 +65,14 @@ The table below lists each function with its corresponding key. - +
      Keypad Enter
      Exit GFEMinimize GFE Ctrl + F4

      Notes

      +

    4. For the keypad keys to work properly, either the Num Lock state must be set to on or the shift key must be depressed when you execute the operation.
    5. diff --git a/cave/com.raytheon.viz.gfe/help/localConfig.html b/cave/com.raytheon.viz.gfe/help/localConfig.html index b934691e8d..bd6e0ddef1 100644 --- a/cave/com.raytheon.viz.gfe/help/localConfig.html +++ b/cave/com.raytheon.viz.gfe/help/localConfig.html @@ -10,7 +10,7 @@

      localConfig.py - Local Server Database Configuration

      -July 24, 2007
      +December 30, 2011


      Table of Contents @@ -93,17 +93,16 @@ Elements

      Overview

      The localConfig.py file is one of several configuration -files for the ifpServer (common database server).  The localConfig +files for GFE. The localConfig file is optional, and is not provided with the install or -release.  -It is added by the field site to override certain features of the -ifpServer +release. +It is added by the field site to override certain features of the GFE database configuration that are defined in the serverConfig.py file.  You should NEVER change the original serverConfig.py since your changes will be overwritten with the next -upgrade.  +upgrade. See the server configuration overview for information on how to make changes that @@ -111,9 +110,9 @@ are supported to the server.

      The localConfig.py file can be used to override many of the definitions in serverConfig.py, but not all of -them.  +them. This document will describe what you can, and what you cannot -override.  +override. If you need to override an element that is not supported by localConfig.py or localWxConfig.py, then refer to @@ -134,15 +133,13 @@ of modifying map definitions to do this. localConfig.py File If you want to make changes to the server database definitions, then -you -will want to add your own localConfig.py file.  Refer to the server -configuration overview file location section  for details on -where -the localConfig.py file should be located. +configuration overview file location section for details on +where the localConfig.py file should be located.

      The first lines of the localConfig.py must have the following -format.  Failure to do so will not let you refer to any of the +format. Failure to do so will not let you refer to any of the definitions in serverConfig.py:

      @@ -151,11 +148,11 @@ in serverConfig.py: import serverConfig

      The syntax appearing in localConfig.py varies depending whether you -are adding new definitions, or changing existing definitions.  +are adding new definitions, or changing existing definitions. Typically when changing existing definitions you will need to prefix the serverConfig -to the name of the variable.  For example, +to the name of the variable. For example,

      var = (a,b,c,d) refers to a local copy of this definition and @@ -172,18 +169,10 @@ editor.


      Testing Your localConfig.py File

      -The recommended way to test your localConfig.py file is to run the -ifpServer -with the -n switch.  The -n switch indicates "no run".  The -server -will start, read in all of the configuration files, and if there are no -syntax errors, will report that fact and exit.  If there are -errors, -you will be directed to the log file where the syntax errors will be -shown.  -The ifpServer -n may be run when the primary ifpServer is running; -i.e., -there is no need to shut it down first. +The recommended way to test your localConfig.py file is to start +EDEX while running a tail command on the /awips2/edex/logs/edex-request-date.log. +If no exceptions result from the changes, you should be fine to proceed into GFE +for further testing.


      What @@ -659,7 +648,7 @@ then the second line needs to be modified to be in this format:

      parms = [([parm1, parm2, parm3], tc1)]

      -

       If you choose to add multiple parms using different time +

      If you choose to add multiple parms using different time constraints, then the second line needs to be modified to be in this format:

      @@ -981,11 +970,7 @@ Local211))

      Note that when changing a projection, you will also be changing the AWIPS world coordinate systems as defined.  This can result in a distorted -map background.  You may have to use the coordConversion -program to help determine your new world coordinates to use in the -SITES -line. +map background.

      Example localConfig.py file
      @@ -994,10 +979,9 @@ line.

      Modify an existing Projection

      Modifying an existing projection is not -supported.  -Attempts to do so will result in the ifpServer aborting on startup. +supported. +Attempts to do so will result in EDEX failing to initialize GFE successfully.


      Remove a Projection

      @@ -1028,7 +1012,6 @@ section of serverConfig.py. following characteristics:
      -  @@ -1510,85 +1493,31 @@ models that you wish to use in the GFE.  The entry in serverConfig.py can be overriden using the following syntax: -

      serverConfig.D2DDIRS = ['directory1', 'directory2', 'directory3'] +

      serverConfig.D2DMODELS = [('directory1', 'model')]

      This definition will completely override the one in serverConfig.py so you will probably want to include those original definitions.

      -

      Here is an example of adding an additional XYZ model on -projection -CONUS211 (refer to the last line): +

      Here is an example of adding an SREF model on +projection SREF12:

      -

      serverConfig.D2DDIRS = -[('/data/fxa/Grid/SBN/netCDF/CONUS212/GFS', 'GFS40'),
      -               -('/data/fxa/Grid/SBN/netCDF/CONUS211/Eta', 'NAM80'),
      -               -('/data/fxa/Grid/SBN/netCDF/CONUS211/NGM', 'NGM80'),
      -               -('/data/fxa/Grid/SBN/netCDF/CONUS202/MRF', 'gfsLR'),
      -               -('/data/fxa/Grid/SBN/netCDF/CONUS211/RUC', 'RUC80'),
      -               -('/data/fxa/Grid/SBN/netCDF/CONUS212/MesoEta', 'NAM40'),
      -               -('/data/fxa/Grid/SBN/netCDF/CONUS215/MesoEta', 'NAM20'),
      -               -'/data/fxa/Grid/FSL/netCDF/MSAS',
      -               -('/data/fxa/Grid/FSL/netCDF/LAPS_Grid/LAPS', 'LAPS'),
      -               -'/data/fxa/Grid/SBN/netCDF/REG233/GWW',
      -               -'/data/fxa/Grid/SBN/netCDF/GRID218/HPCQPF',
      -               -'/data/fxa/Grid/SBN/netCDF/CONUS215/HPCdelta',
      -               -'/data/fxa/Grid/SBN/netCDF/LATLON/GLERL',
      -               -'/data/fxa/Grid/SBN/netCDF/GRID238/GWW',
      -               -'/data/fxa/Grid/SBN/netCDF/CONUS226/TPCtcm',
      -               -('/data/fxa/Grid/SBN/netCDF/GRID218/Eta', 'NAM12'),
      -               -('/data/fxa/Grid/SBN/netCDF/CONUS211/XYZ', 'XYZ')]
      -
      -
      +

      serverConfig.D2DMODELS = [('SREF212', 'SREF')]

      Note that overridding the -complete D2DDIRS is not recommended, since you will +complete D2DMODELS is not recommended, since you will miss baseline updates with each release. Instead, you should use the -append feature to simply add a new entry -without +append feature to simply add a new entry without modifying existing entries as:

      -

      serverConfig.D2DDIRS.append(('/data/fxa/Grid/SBN/netCDF/CONUS212', -'NAM20')) +

      serverConfig.D2DDIRS.append(('CONUS212', 'NAM20'))

      -

      Note that in the above definitions, that some of the lines contain -tuples, and others simply contain a directory name. There is another -format for D2DDIRS that can be used to "change" the -model name seen by the ifpServer. Normally the model name is taken from -the "model" netCDF variable, but if a conflict occurs you will not see -all of the models. The alternative form of each entry in the D2DDIRS is -a tuple consisting of the directory name and the overridden model name. -Thus, if you wanted to add the NAM12 model, but its model variable says -ETA, it will conflict with the CONUS211/ETA. You can force the model -name -to NAM12 using a syntax like this: -

      -

      serverConfig.D2DDIRS.append(('/data/fxa/Grid/SBN/netCDF/GRID218/Eta', -'NAM12')) -

      -

      Note that the ifpServer simply cannot see and -intrepret every type of netCDF file in existance.  Even if the -netCDF +

      Note that GFE simply cannot see and +intrepret every type of hdf5 file in existance. Even if the hdf5 files are D2D-displayable, there may be some missing information in the -files that make the ifpServer ignore the file.  Refer to the ifpServer -netCDF format requirements document for more details. +files that make GFE ignore the file. Refer to the EDEX +hdf5 format requirements document for more details.

      Example localConfig file
      @@ -1597,67 +1526,41 @@ netCDF format requirements document for more details.

      Modifying the list of D2D Directories for satellite data access

      The standard list of D2D directories for satellite access may not -include all of the D2D directories  +include all of the D2D directories that you wish to use in the GFE, or may contain weather element names -that are not desirable.  The entry in serverConfig.py can be overriden using the following syntax: -

      serverConfig.SATDIRS = [('directory1', 'weather element name +

      serverConfig.SATDATA = [('directory1', 'weather element name 1'), ('directory2', 'weather element names 2')]

      This definition will completely override the one in serverConfig.py so you will probably want to include those original definitions.

      -

      Here is an example of redefining the complete list of SATDIRS; this +

      Here is an example of redefining the complete list of SATDATA; this technique is not the best, since you will miss updates to serverConfig and is not recommended:

      -

      serverConfig.SATDIRS = -[("/data/fxa/sat/SBN/netCDF/westCONUS/conus_vis", "visibleWest"),
      +

      serverConfig.SATDATA = +[("NESDIS/GOES-13(N)/East CONUS/Imager Visible", "visibleWest"),
                 -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_i11", "ir11West"),
      -           -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_i12", "ir13West"),
      -           -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_i39", "ir39West"),
      -           -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_iwv", "waterVaporWest"),
      -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_vis", "visibleCentral"),
      -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_i11", "ir11Central"),
      -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_i12", "ir13Central"),
      -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_i39", "ir39Central"),
      -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_iwv", "waterVaporCentral"),
      -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_vis", "visibleEast"),
      -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_i11", "ir11East"),
      -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_i12", "ir13East"),
      -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_i39", "ir39East"),
      -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_iwv", "waterVaporEast")]
      -

      -

      +("NESDIS/GOES-13(N)/East CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporEast")]
      +

      +

      You can also use the append feature to simply add a new entry without modifying existing entries as:

      -

      serverConfig.SATDIRS.append(('/data/fxa/sat/SBN/netCDF/alaska/akBig_i11','ir11')) +

      serverConfig.SATDATA.append(("NESDIS/GOES-13(N)/East CONUS/Imager 3.9 micron IR", "ir39East"))

      -Note that the ifpServer simply cannot see and -intrepret every type of satellite netCDF file in existance.  Even -if the satellite netCDF +Note that GFE simply cannot see and +intrepret every type of satellite hdf5 file in existance. Even +if the satellite hdf5 files are D2D-displayable, there may be some missing information in the -files that make the ifpServer ignore the file.  Refer to the ifpServer -satellite netCDF format requirements document for more details. +files that make GFE ignore the file. Refer to the EDEX +satellite hdf5 format requirements document for more details.

      Example localConfig file


      @@ -1666,10 +1569,8 @@ satellite netCDF format requirements document for more details.

      D2D Model Database Version Specification

      You can override the default number of retained (available) D2D model versions through localConfig.py. This can also be used to define -the number of D2D Satellite images that can be seen through the -ifpServer. -  Further information, including -restrictions, +the number of D2D Satellite images that can be seen through GFE. +Further information, including restrictions, is provided in the serverConfig.py D2D Model Database Version Specification section. The format to override all entries (not recommended) is: @@ -1764,7 +1665,8 @@ The format is:

      Example of adding a new initialization module for LAPS, which we assume -that a user has created a LAPS.py and placed it into release/etc/SITE: +that a user has created a LAPS.py and placed it into +/awips2/edex/data/utility/edex_static/site/SITE_ID/smartinit:

      serverConfig.INITMODULES["LAPS] = ["LAPS"]

      @@ -1835,67 +1737,13 @@ You may override the serverConfig.py's definition of the number of days to keep the GFESuite logs with this syntax:

      serverConfig.LOG_FILE_PURGE_AFTER = 6


      -

      Modifying the Number of Simultaneous Smart -Init -Processes

      -You may override the serverConfig.py's definition of the maximum number -of simultaneous smart initialization processes with this syntax: -

      serverConfig.MAX_INIT_PROCESSES = 1
      -

      -
      -

      Modifying the Number of Simultaneous -Background Tasks
      -

      -You may override the serverConfig.py's definition of the maximum number -of simultaneous background tasks with this syntax: -

      serverConfig.MAX_USER_BACKGROUND_PROCESSES = 1 -

      -

      Background tasks are those submitted by the Graphical Forecast -Editor to run on the ifpServer.  Note that a user can always force -a task to be started through a special command, even if the number of -current processes exceed the maximum allowed.
      -

      -

      -

      -
      -

      Modifying the Number of Hours to Keep -Product -Files

      -


      -You may override the serverConfig.py's definition of the number -of hours to keep generated product files with this syntax: -

      -

      serverConfig.PROD_FILE_PURGE_AFTER = 6 -

      -

      -
      -

      Enabling Daily Forecast Critique, or Disabling -Daily -Forecast Critique

      -The update frequency of the Daily Forecast Critique data collection -programs -may be overridden using the following syntax: -

      # defines the update frequency in minutes of Daily Forecast -Critique -
      -# set to 0 to disable DFC -
      -serverConfig.DFC_UPDATE_INTERVAL = 10 -

      -

      The DFC capability may be disabled by setting the update interval to -0.  It is recommended to keep the update interval in the range of -15-30 minutes. -

      -

      Defining Extra Precision for Certain Weather Elements

      -Weather Elements are stored in their specified precision in the -ifpServer, +Weather Elements are stored in their specified precision in GFE, thus if you have the precision set to 0 for a weather element, it will effectively be stored as integers.  Sometimes you might want additional @@ -1999,28 +1847,21 @@ modify entries, rather than redefining the entire dictionary.

      Automatic Configuration of NotifyTextProd

      NotifyTextProd is a AWIPS D2D process that routes certain text -bulletins to the VTECDecoder.  In pre-OB6 AWIPS systems, the -pattern file was static and "wide open" to warnings throughout the -country.   For performance reasons, in OB6 and later versions -of AWIPS, the pattern file is automatically created upon ifpServer -startup and is customized to the configured site.   This +bulletins to the VTECDecoder. The pattern file is automatically created when GFE +is loaded in EDEX and is customized to the configured site. This reduces the amount of traffic being sent to the VTECDecoder by 90%.

      Due to the staging of the GFESuite and AWIPS softwares, a configuration -item is required to tell the ifpServer to begin generating the custom -pattern file.  This is done through a simple localConfig.py +item is required to tell GFE to begin generating the custom +pattern file. This is done through a simple localConfig.py addition:

      serverConfig.AUTO_CONFIGURE_NOTIFYTEXTPROD = 1

      -Change the -above variable only after you have installed OB6 or performance -concerns or missing warning data may occur!

      Intersite Coordination Grids Configuration - 

      The Intersite Coordination Grids configuration can be overridden in the localConfig.py file. 
      @@ -2035,7 +1876,7 @@ value, use this syntax:
      serverConfig.ISC_ROUTING_TABLE_ADDRESS = "http://exampleurl.nws.noaa.gov"

      Requested ISC Sites

      -The default is to have the ifpServer calculate the list of sites to +The default is to have EDEX calculate the list of sites to request ISC data from based on the generated ISC_xxx edit areas.   This is accomplished by setting the value to None. If you wish to override this value, then use this syntax:
      @@ -2047,9 +1888,9 @@ Be sure to always include your own site; if you don't you won't see your own ISC data in the ISC database.

      Request ISC

      -Setting the value to 0 disables the request of ISC data and the -ifpServer will not register with the ISC Routing Table Web -Server.   To enable the reception of ISC data, you use this +Setting the value to 0 disables the request of ISC data and +EDEX will not register with the ISC Routing Table Web +Server. To enable the reception of ISC data, you use this syntax in the localConfig.py file:

      serverConfig.REQUEST_ISC = 1
      @@ -2072,7 +1913,7 @@ data is stored to the publish database.
      = 1

      Requested ISC Parms

      -The default is to have the ifpServer calculate the list of weather +The default is to have EDEX calculate the list of weather elements to be requested from the list of available weather elements in the Fcst database. This is denoted by setting the variable to None.   The site can override this and specify a list of weather diff --git a/cave/com.raytheon.viz.gfe/help/localVTECPartners.html b/cave/com.raytheon.viz.gfe/help/localVTECPartners.html index 3056857c4d..ca26bf4700 100644 --- a/cave/com.raytheon.viz.gfe/help/localVTECPartners.html +++ b/cave/com.raytheon.viz.gfe/help/localVTECPartners.html @@ -10,7 +10,7 @@

      localVTECPartners.py

      -
      February 18, 2005
      +
      December 30, 2011

      Organization

      @@ -69,8 +69,8 @@ VTECPartners import *


      - diff --git a/cave/com.raytheon.viz.gfe/help/localWxConfig.html b/cave/com.raytheon.viz.gfe/help/localWxConfig.html index 0d8ccbcd53..7d3de91ed6 100644 --- a/cave/com.raytheon.viz.gfe/help/localWxConfig.html +++ b/cave/com.raytheon.viz.gfe/help/localWxConfig.html @@ -11,7 +11,7 @@

      localWxConfig.py - Local Server Database Configuration (Weather Definition)

      -May 13, 2004
      +December 30, 2011


      @@ -44,56 +44,51 @@ can you control from your custom localWxConfig.py file?

      Overview

      The localWxConfig.py file is one of several configuration -files for the ifpServer (common database server).  The -localWxConfig +files for GFE. The localWxConfig file is optional, and is not provided with the install or -release.  -It is added by the field site to override certain features of the -ifpServer +release. +It is added by the field site to override certain features of the GFE database configuration that are defined in the serverConfig.py -file.  You should NEVER change the +file. You should NEVER change the original serverConfig.py since your changes will be overwritten with the next -upgrade.  +upgrade. See the server configuration overview for information on how to make changes that are supported to the server.

      The localWxConfig.py file can be used to override the weather definitions -in serverConfig.py.  This -document -will describe what you can, and what you cannot override.  If you +in serverConfig.py. This document +will describe what you can, and what you cannot override. If you need to override an element that is not supported by localConfig.py -or localWxConfig.py, then refer to the  server configuration overview for details.

      -

      Note: Changing weather definitions can +

      Note: Changing weather definitions can cause problems when sending these grids to other sites via Intersite -Coordination.  +Coordination. If another site receives grids that do not contain valid Weather Definitions at that site, the grid will be rejected.

      -


      Adding Your Own localWxConfig.py File

      If you want to make changes to the server database weather definitions, -then you will want to add your own localWxConfig.py file.  Refer -to -the server +then you will want to add your own localWxConfig.py file. Refer +to the server configuration -overview file location section  for details on where the +overview file location section for details on where the localWxConfig.py file should be located.

      The first lines of the localWxConfig.py must have the following -format.  Failure to do so will not let you refer to any of the +format. Failure to do so will not let you refer to any of the definitions in serverConfig.py:

      @@ -103,11 +98,11 @@ in serverConfig.py:

      The syntax appearing in localWxConfig.py varies depending whether you -are adding new definitions, or changing existing definitions.  +are adding new definitions, or changing existing definitions. Typically when changing existing definitions you will need to prefix the serverConfig -to the name of the variable.  For example, +to the name of the variable. For example,

      var = (a,b,c,d) refers to a local copy of this definition and @@ -131,18 +126,10 @@ fields.


      Testing Your Own localWxConfig.py File

      -The recommended way to test your localConfig.py file is to run the -ifpServer -with the -n switch.  The -n switch indicates "no run".  The -server -will start, read in all of the -
      -configuration files, and if there are no syntax errors, will report -that fact and exit.  If there are errors, you will be directed to -the log file where the syntax errors will be shown.  The -
      -ifpServer -n may be run when the primary ifpServer is running; i.e., -there is no need to shut it down first. +The recommended way to test your localConfigWx.py file is to start EDEX +while running a tail command on the /awips2/edex/logs/edex-request-date.log. +If no exceptions result from the changes, you should be fine to proceed into GFE for +further testing.


      What @@ -150,12 +137,11 @@ can you control from your custom localWxConfig.py file?

      The following table describes what can be done using a custom localWxConfig.py -file.  If the override capability is marked as "NO" and you still +file. If the override capability is marked as "NO" and you still need the modification, you will need to review methods of modifying database configurations for alternative choices.
      @@ -166,7 +152,7 @@ of modifying database configurations for alternative choices. - @@ -443,11 +429,9 @@ OVRPASS. '0', '1/4', '1/2', '3/4', '1', '11/2', '2', '21/2', '3', '4', '5', '6', 'P6']

      -




      -  + diff --git a/cave/com.raytheon.viz.gfe/help/logFiles.html b/cave/com.raytheon.viz.gfe/help/logFiles.html index 0e3f36eac2..f325a1aaad 100644 --- a/cave/com.raytheon.viz.gfe/help/logFiles.html +++ b/cave/com.raytheon.viz.gfe/help/logFiles.html @@ -11,7 +11,7 @@

      logFile Information

      -April 21, 2006
      +March 27, 2012

      Table of Contents
      @@ -20,630 +20,24 @@ Table of Contents
      Logging Preferences
      -Setting Up Logging for Command Line Programs -

      Location of LogFiles

      -Logfiles are stored and automatically purged in the logfiles -directory.  -This location is release/data/logfiles, typically -/awips/GFESuite/primary/data/logfiles -on the dx AWIPS-baselined systems, or /awips/GFESuite/data/logfiles on -the lx AWIPS-baselined systems. Under this directory is a date/time -stamped -directory in the form of yyyymmdd, such as 20020327 for March 27, -2002.  -Within each date's directory are the logging files. -

      The naming of each individual log file is dependent upon the start -up -script for that application.  The following table shows the -program -name and log filename. The collective field indicates whether -subsequent -executions of the program go into individual files (non-collective) or -a single file (collective). -
      -  -
      -  -

      Visibilities YES Possible + Possible Visibilities
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Program NameLogging File NameCollective
      configureTextProductsconfigureTextProducts%P%H%Tno
      coordConversioncoordConversion%P%H%Tno
      dumpATdumpAT%P%H%Tno
      getNotifygetNotify%P%H%Tno
      ghETN
      -
      ghETN%P%H%T  (Note: by -default, no logging occurs for this program)
      -
      no
      -
      ifpAGifpAG%P%H%Tno
      ifpBreakAllLocksifpBreakAllLocks%P%H%Tno
      ifpDFCifpDFC%P%H%Tno
      ifpDFCArchive (archiveObs, archivePointFcst)
      -
      dfc-archiveObs_%H, dfc-archivePointFcst_%Hyes
      ifpIMAGEifpIMAGE_%Hyes
      ifpInitifpInit%P%H%T, when run from the command line, moduleNameInit_%H -when run automatically from the ifpServerno (command line), yes (from ifpServer)
      ifpnetCDFifpnetCDF_%Hyes
      ingestAT
      -
      ingestAT_%H
      -
      yes
      -
      iscExtractiscExtract_%Hyes
      iscInject---none---n/a
      iscMosaiciscMosaic_%Hyes
      gfe (runGFE)gfe%P%H%Tno
      ghgMonitor
      -
      ghgMonitor%P%H%Tno
      -
      ifpServer (runIFPServer)ifpServer%P%H%Tno
      ifpServerStatsifpServerStats%P%H%Tno
      ifpServerTextifpServerText%P%H%Tno
      makeD2DFile
      -
      makeD2DFile%P%H%Tno
      -
      moveGFEDatamoveGFEData%P%H%Tno
      publishGFEpublishGFE%P%H%Tno
      purgeAllGrids
      -
      purgeAllGrids%P%H%T
      -
      no
      -
      requestAT
      -
      requestAT_%H
      -
      yes
      -
      runIFPTextifpText%P%H%Tno
      runProcedureprocedure%P%H%Tno
      sendAT
      -
      sendAT_%H
      -
      yes
      -
      sendGfeMessage
      -
      sendGfeMessage%P%H%T
      -
      no
      -
      VTECDecoder
      -
      VTECDecoder_%H
      -
      yes
      -
      -

      -

      The "% modifiers" are replaced with actual values depending upon the -state of the system.  Here is a complete list of modifiers: -
      -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ModifierMeaning
      %ddisplay being used, i.e., contents of the DISPLAY environment -variable
      %DYear Month Day date string. Identical to %Y%m%d for strftime -or yymmdd -format
      %THour Minute Second time string. Identical to "H%M%S for -strftime of -hhmmss format
      %PProcess identification number
      %NProcess name
      %LLogging directory (top-level) as defined by LOG_DIR -environment variable
      %HHostname of machine
      -

      -

      +In AWIPS2 logfiles are stored in a number of locations for different operations. +EDEX logs are stored in /awips2/edex/logs on dx3/dx4; GFE utilities logs are in +/awips2/GFESuite/logs/SITE_ID on dx3/dx4; text formatter logs are in +~/caveData/etc/user/USER_ID/gfe/logs; CAVE logs are in ~/caveData/logs; AlertViz +logs are in ~/caveData/textLogs. All caveData logs are on the local workstation +where GFE is run. +

      EDEX logs can be configured by modifying the log4j files under /awips2/edex/conf. See +Software +System Design Description (SSDD) for implementation details.


      Logging Preferences

      -Logging uses the AWIPS LogStream facility.  Environment variables -are used to define the location/handling of the logfiles.  These -environment -variables are automatically set for you with many of the GFESuite set -of -programs.  Here is a summary: -
        -
      • LOG_DIR: top level directory for logging files
      • -
      • LOG_PREF: location of logging preferences files
      • -
      • LOG_FILE: definitive logging file names for non-collective logging
      • -
      • COLLECTIVE_FILE: definitive logging file names for collective -logging
      • -
      -GFESuite is set up with various logging preferences files.  These -are located in release/etc/BASE/logPref/*.logPref, typically -/awips/GFESuite/primary/etc/BASE/logPref/*.logPref -on the AWIPS-baselined systems. -

      The following table lists the logPref files and the programs that -use -them.  Note that the program names and the script names which are -used to run the program may be different (for example, ifpServer is the -program name, but runIFPServer is the script that is used to start it): -
      -  -
      -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Logging Preference FilePrograms Using the File
      archiveObs.logPrefifpDFCArchive (archiveObs)
      -
      archivePointFcst.logPrefifpDFCArchive (archivePointFcst)
      -
      configureTextProducts.logPrefconfigureTextProducts
      -
      coordConversion.logPrefcoordConversion
      -
      dumpAT.logPrefdumpAT
      -
      getNotify.logPrefgetNotify
      -
      gfe.logPrefrunGFE (GFE)
      -
      ghETN.logPref
      -
      ghETN
      -
      ghgMonitor.logPref
      -
      ghgMonitor
      -
      ifpAG.logPref
      -
      ifpAG
      -
      ifpBreakAllLocks.logPref
      -
      ifpBreakAllLocks
      -
      ifpDFC.logPref
      -
      ifpDFC
      -
      ifpIMAGE.logPref
      -
      ifpIMAGE
      -
      ifpInit.logPref
      -
      ifpInit
      -
      ifpnetCDF.logPref
      -
      ifpnetCDF
      -
      ifpServer.logPref
      -
      runIFPServer (ifpServer)
      -
      ifpServerStats.logPref
      -
      ifpServerStats
      -
      ifpServerText.logPref
      -
      ifpServerText
      -
      ingestAT.logPref
      -
      ingestAT
      -
      iscExtract.logPref
      -
      iscExtract
      -
      iscMosaic.logPref
      -
      iscMosaic
      -
      makeD2DFile.logPref
      -
      makeD2DFile
      -
      moveGFEData.logPref
      -
      moveGFEData
      -
      publishGFE.logPref
      -
      publishGFE
      -
      purgeAllGrids.logPref
      -
      purgeAllGrids
      -
      requestAT.logPref
      -
      requestAT
      -
      runIFPText.logPref
      -
      runIFPText
      -
      runProcedure.logPref
      -
      runProcedure
      -
      sendAT.logPref
      -
      sendAT
      -
      sendGfeMessage.logPref
      -
      sendGfeMessage
      -
      setupTextEA.logPref
      -
      setupTextEA
      -
      VTECDecoder.logPref
      -
      VTECDecoder
      -
      -

      -

      Here is an example of a logging preferences file: -

      -

      #Process        -Src     -Sink    Category -
      -#               -File -
      -#----------------------------------------- -
      -all             -all     file       -all -= on -
      -all             -all     file       -debug -= off -
      -all             -all     file       -verbose -= off -
      -all             -all     file       -use -= off -
      -all             -all     -tty        -all = off  # nothing goes to a terminal -
      -all             -all     collective all = on -
      -all             -all     collective debug = off -
      -all             -all     collective verbose = off -

      -

      # recommended to see hourly statistics -
      -all   ifpServer.C file verbose = on -
      -all   RunInit.C file verbose = on -
      -all   all       -all    -use = off -

      -

      # Prefixes -
      -all   timeStamp = -on         -# time stamps on -
      -#all   processName = off     # -process -name off -
      -#all   processID = -on         -# process id off -
      -all   fileName = -on         -# filenames wanted -
      -all   lineNo = -on           -# line numbers wanted -

      -

      The first section of the file is a list of process, source file, -sinks -(file, tty, collective), and a category (all, debug, verbose, event, -use, -problem, fatal) with an "on" or "off" appended.  The file is -parsed -sequentially, thus turning a category off first and then turning it -back -on in a later line will result with the category being on. -

      -

      Logging can be enabled/disabled on a per-process basis and filename -basis. -

      -

      The second section defines prefixes.  The format of the log -files -are controlled through this set of definitions.  The time stamps, -process name and id, filename and line number may all be enabled or -disabled -through the logging preferences file. -

      -

      Be careful if changing the logging preferences files.  These -files -are not supported through the BASE, -SITE, USER concept and changes will be overwritten with the next -GFESuite -upgrade. -

      -

      -
      -

      Setting up Logging for Command Line Programs

      -If you run a program that doesn't use one of the GFESuite-supplied -startup -scripts, the logging will not be enabled (by default) and hence you -will -not be able to tell if problems occurred during the execution of the -program. -

      You can set up logging for command line programs by setting the -following -environment variables: -

      -
        -
      • LOG_PREF - points to the logging preferences files (you can use -the -gfe.logPref -if desired)
      • -
      • LOG_DIR - points to the place where logging will occur (normally -you -can -point it to release/data/logfiles, or -/awips/GFESuite/primary/data/logfiles -and then the server will purge the log files for you)
      • -
      • LOG_FILE - not normally needed, if not supplied, then the logging -filename -will be processname_pid_host_time within the .../logfiles/yyyymmdd/ -directories.
      • -
      • COLLECTIVE_FILE - not normally needed.  Controls the logging -filename -in a similar manner to the LOG_FILE but for collective sinks.
      • -
      +Logging preferences for EDEX can be changed by modifying the log4j.xml and log4j-ingest.xml +files for the setting "level value". Acceptable settings are TRACE, DEBUG, INFO, WARN, ERROR, +and FATAL. TRACE is lowest level and FATAL is highest level. A logger set to log at a +certain level will log that level and all higher levels. Example: logger set to WARN level +will log all WARN, ERROR, and FATAL messages, but not TRACE, DEBUG, or INFO levels. +EDEX must be restarted after any changes to the logging configuration. diff --git a/cave/com.raytheon.viz.gfe/help/mapConfig.html b/cave/com.raytheon.viz.gfe/help/mapConfig.html index 5d89f38196..081915bf12 100644 --- a/cave/com.raytheon.viz.gfe/help/mapConfig.html +++ b/cave/com.raytheon.viz.gfe/help/mapConfig.html @@ -6,24 +6,21 @@ - + Map Background Configuration
      -

      Maps.py - Map Background -Configuration

      +

      Map Background Configuration

      -
      January 18, 2006
      +
      April 2, 2012

      Organization

      -Maps.py Format +Format
      Site Information
      Shapefile Names
      Map Definitions
      - Putting it all together -with the maps list
      - Importing localMaps
      + AWIPS standard names
      Shapefile Description @@ -32,82 +29,64 @@ with the maps list
      Attributes

      Overview

      -The Maps.py file defines the attributes of each map.  The server +The Maps.java file defines the attributes of each map. The server when -started looks through the list of maps as defined in the Maps.py file +started looks through the list of maps as defined in the Maps.java file and -generates maps.  These maps may be retrieved through the server -protocol.  +generates maps. These maps may be retrieved through the server +protocol. The map data available through the protocol includes polygons, points, -and arcs.  The information contains the geographical data and the +and arcs. The information contains the geographical data and the set of attributes that define the shape. -

      The map generation software uses shapefiles as the input.  +

      The map generation software uses shapefiles as the input. These shapefiles are filtered by domain (based on the site) and -attributes.  -There are different attributes available for each shapefile.  +attributes. +There are different attributes available for each shapefile. Refer to the AWIPS Map Background Database provided by the National Weather Service for details on the available shapefiles and the attributes contained within each -shapefile.  +shapefile. This information will be needed in order to tailor a map to your site.

      -

      The Maps.py file also is used to define and automatically generate +

      The Maps.java file also is used to define and automatically generate edit -areas based on the shapefile polygons.  The user can select which +areas based on the shapefile polygons. The user can select which polygons will be converted into edit areas and which edit area groups they will be assigned.

      -

      This information is provided for you to -help -you understand the format of Maps.py.  You should NEVER change the -original Maps.py since your changes will be overwritten with the next -upgrade.  -See the server -configuration overview for information on how to make changes that -are supported to the map backgrounds. -

      -

      To override changes in Maps.py, use the In AWIPS1 you could override changes in Maps.py, using the localMaps.py -technique. To override the default map filenames, i.e., source -filenames -for the shapefiles, use the localMapFiles.py -technique. +technique. In AWIPS2, this is slated for implementation under DR9441. To override +the default map filenames, i.e., source filenames +for the shapefiles, use step 3 of the Map Files method instead of the +AWIPS1 localMapFiles.py method.

      -

      To update shapefiles, refer to the MapFiles -documentation, specifically the section on Updating -Shapefiles.
      -

      -


      +

      To update shapefiles, refer to the MapFiles +documentation, specifically the section on Updating Shapefiles.

      Software releases after Jan 1, 2006 separate the map shapefile from the -CORE GFE.   In some applications, such as AWIPS, the map +CORE GFE. In some applications, such as AWIPS, the map shapefile configuration becomes the responsibility of the site since the map shapefiles will no longer be shipped with the GFE -software.   A separate install is available for non-AWIPS -purposes and is posted with the software releases.   If the +software. A separate install is available for non-AWIPS +purposes and is posted with the software releases. If the associated Map Shapefile install is not installed at your site, then sites will be responsible for:
        -
      • creating an etc/SITE/localMapFiles.py that contains the map -filenames for the baselined maps.
        +
      • creating the maps bundles that contain the map filenames for the baselined maps.
      • -
      • Downloading updated shapefiles from either GSD or from the NOAA1 -web server.
        +
      • Downloading updated shapefiles from either GSD or from the NOAA1 web server.


      -

      Maps.py Format

      +

      Format

      Site Information

      -Maps.py inputs the siteConfig file which -provides the site identifier, map directory, and the site's specific grid domains. Several variables are computed:
        @@ -116,617 +95,10 @@ specific grid domains. Several variables are computed: generation routines
      -


      -CWA = siteConfig.GFESUITE_SITEID -
      -MAPDIR = siteConfig.GFESUITE_DATDIR + "/maps/" -
      -  -

      Shapefile Names

      -The names of the shapefiles are contained in MapFiles.py -and overridden in localMapFiles.py.  -The section in Maps.py imports these files. -

      #----------------------------------- -
      -# DO NOT CHANGE THE FOLLOWING SECTION -
      -#------------------------------------ -
      -# Filename Translations -
      -from MapFiles import * -
      -try: -
      -    from localMapFiles import * -
      -except ImportError: -
      -    pass -
      -  -

      +The names of the shapefiles are referenced in the maps database.

      Map Definitions

      -The map definition section defines each map that is desired.  -Only a small portion of the Maps.py is shown here. Numerous examples -with -differing -capabilities are shown. -

      Basic Map

      -This definition is for a basic map, with no filtering of attributes and -no automatic creation of edit areas. The Shapefile object is created in -the first line. The name of the shapefile (ZoneMapName) is assigned to -using the filename in the second line.  The name of the map is -defined -in the third line.  All polygons in the shapefile will be used to -create the name of the map.  The name of the map is the name of -the -CWA, e.g., BOI, appended with _zones, such as BOI_zones. -
      -  -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.name = CWA + '_zones' -

      -

      Filtered Map

      -This definition is for a filtered map with no automatic creation of -edit -areas.  The filter line performs the filtering.  The basic -format -of this line is as follows: -

           pythonMapName.filter(lambda x : -x['ATTRIBUTENAME'] -= AttributeValue) -

      -

      where ATTRIBUTENAME is one of the attributes -in the shapefile, and AttributeValue is the value that must match in -the -shapefile for this shape to be kept in the map. Attributes for the NWS -shapefiles can be obtained from the AWIPS Map Catalog AWIPS -Map Background Database. -

      -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.filter(lambda x : x['CWA'] == CWA) -
      -CWAzones.name = CWA + '_zones' -

      -

      The "lambda" function is a shortcut method of writing a function, -the -code snippet below performs the identical function: -

      -

      def cwaZoneFilt(x): -
      -    return x['CWA'] == CWA -

      -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.filter(cwaZoneFilt) -
      -CWAzones.name = CWA + '_zones' -
      -  -

      -

      Since this is all Python code, there is another technique you can -use -to write a filter function which is complex.  Here is an example -of -writing a filter function for the cities map background to only include -a specific set of cities: -

      -

      mycities = ['Akron', 'Denver', 'Boulder'] -
      -map9 = ShapeFile(MAPDIR) -
      -map9.filename('cities') -
      -map9.filter(lambda x : x['NAME'] in mycities) -
      -map9.name = 'MyCities' -
      -  -

      -

      An alternative method of the above city filter is shown below: -

      -

      def map2Filt(x): -
      -    zcities = ['Akron', 'Denver', 'Boulder'] -
      -    return x['NAME'] in zcities -

      -

      Ycounties = ShapeFile(MAPDIR) -
      -Ycounties.filename('cities') -
      -Ycounties.filter(map2Filt) -
      -Ycounties.name = 'Map2' -

      -

      Complex filters can also be generated in any of the above -formats.  -For example, here is a filter that pulls certain counties (Summit, -Sandusy, -Huron, and Medina) out of a shapefile for a particular state (Ohio) and -cwa (Cleveland): -

      -

      def exampleFilt(x): -
      -    myCounties = ['Summit', 'Sandusky', 'Huron', -'Medina'] -
      -    return x['COUNTYNAME'] in myCounties and x['ST'] -== "OH" and x['CWA'] = 'CLE' -

      -

      OHcounties = ShapeFile(MAPDIR) -
      -OHcounties.filename(CountyMapName) -
      -OHcounties.filter(exampleFilt) -
      -OHcounties.name = 'ExampleOHCounties' -

      -

      Here is another complex filter, for a cities map, that uses the -population -filter, but excludes certain cities. -

      -

      excludedCities  =  ['Clinton', 'Pearl', 'Brandon', -'Ridgeland'] -
      -cities  =  ShapeFile(MAPDIR) -
      -cities.filename('cities') -
      -cities.filter(lambda x,y=excludedCities: float(x['POP_1990']) > -10000 -and  x['NAME'] not in y) -
      -cities.name = "JanCities" -
      -  -
      -Note that the POP_1990 attribute is really a string value, and that the -float() function converts it to a number.  All attributes in the -shapefiles are considered to be strings.  If you want to do number -comparisons, then you need to promote the attribute to a number using -the float() function.
      -

      -

      Filtered Map with Automatically Generated Edit Areas

      -The ifpServer can automatically generate edit areas based on the -information in the shapefiles. The user specifies the "editAreaName" in -the Maps.py or localMaps.py files, and the ifpServer uses that -information to determine the name of each edit area.   There -are three forms to the editAreaName line as shown:
      -
      - - - - - - - - - - - - - - - -
      mapVariable.editAreaName = -"string"
      -
      Single String Format
      -
      mapVariable.editAreaName = -["string1", "string2", "string3"]
      -
      List of Strings Format
      -
      mapVariable.editAreaName = -functionName
      -
      Function Format
      -
      -
      -
      Single String Format
      -This definition is for a filtered map with automatic generation of edit -areas.  All of the generated areas will go into the Misc. edit -area -group. In the example below, the name of each generated edit area is -obtained -from the attribute 'ZONE' in the field editAreaName. The program looks -up the value for the attribute ZONE in the shapefile for each polygon -and -creates an edit area with that name.  The example below uses the -simple -format for the editAreaName, in which only one attribute is specified. -
      -  -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.filter(lambda x : x['CWA'] == CWA) -
      -CWAzones.name = CWA + '_zones' -
      -CWAzones.editAreaName = 'ZONE' -

      -

      Examples of the names of the edit areas generated from the above -snippet -is shown in the following table: -
      -  - - - - - - - - - - - - - - - - - - - - - - - -
      Zone value from shapefileState (not used in this example)Name of Edit Area
      034COZONE034
      041COZONE041
      041NEZONE041
      -

      -

      Note that if a CWA covers more than one state, this simple form of -generating -edit area names will not work.  The "NE" example above illustrates -that the same edit area name was generated even though the zones were -from -different states.  Also note that the naming of the edit area -includes -the name "ZONE" only because the value of the zone value begins with a -number.
      -

      -

      NOTE: -Changing the default set of edit area names as supplied in the baseline -may render your text formatters and VTEC inoperable.  The text -formatters and VTEC assume standard UGC-named edit areas, such as -COZ023 and UTC013.
      -

      -
      List of Strings Format
      -

      The more complex form of the editAreaName involves using -a Python list.  The naming of  an edit area is determined by -using more than one attribute.  This example uses the more complex -form for the editAreaName, in which two attributes are specified. -

      -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.filter(lambda x : x['CWA'] == CWA) -
      -CWAzones.name = CWA + '_zones' -
      -CWAzones.editAreaName = ['STATE','ZONE'] -

      -

      Examples of the names of the edit areas generated from the above -snippet -is shown in the following table: -
      -  - - - - - - - - - - - - - - - - - - - - - - - -
      Zone value from shapefileState (not used in this example)Name of Edit Area
      034COCO_034
      041COCO_041
      041NENE_041
      -

      -

      The edit area name is determined from the value of the STATE -attribute, -followed by an underscore character, and then the value of the ZONE -attribute. -

      -

      Here is the software algorithm for naming of edit areas: -

      -
        -
      • the value for each of the attributes is extracted from the -shapefiles.  -All spaces and non-alphanumeric characters are removed from the -value.  -Example: "Washington Meadows" would be changed to "WashingtonMeadows"
      • -
      • if any of the values end up with an empty string, then the edit -area is -not generated.
      • -
      • the values are put together with an underscore separator for each -of -the -attributes.  Example: Attribute STATE has a value of "CO", -Attribute -ZONE has a value of "034". Result is CO_034.
      • -
      • if the leading character of the result begins with a number, then -the -name -of the first attribute is prefixed to the string.  Example: If the -preceeding string was 034 and its attribute was ZONE, then the -resulting -edit area name becomes ZONE034.
      • -
      -The ordering of the list of attributes can change the naming as shown -in -the following table, which assumes ZONE=034, STATE=CO, WFO=BOU, -NAME=Summit -County/Mosquito Range/Indian Peaks: -
      -  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      editAreaName stringName of Edit Area
      'ZONE'ZONE034
      ['ZONE','STATE']ZONE034_CO
      ['STATE','ZONE']CO_034
      ['WFO','NAME']BOU_SummitCountyMosquitoRangeIndianPeaks
      ['ZONE','NAME','STATE']ZONE034_SummitCountyMosquitoRangeIndianPeaks_CO
      -

      Note that specification of an attribute that doesn't exist will -simply -use the name in the string.  For example, if you are creating edit -areas and you want them of the form ISC_xxx, where xxx is the WFO -identifier.  -The editAreaName string would be the following: -
      -ISCareas.editAreaName = ['ISC', 'WFO']
      -

      -

      NOTE: -Changing -the default set of edit area names as supplied in the baseline may -render your text formatters and VTEC inoperable.  The text -formatters -and VTEC assume standard UGC-named edit areas, such as COZ023 and -UTC013. -

      -
      Function Format
      -
      -Occasionally there is a need to calculate a special edit area name and -the single or list of strings methods are not sufficient.  The -function format requires the user to name a function and then define a -function.  The function has one argument, which receives a -dictionary of attribute names and their values.   The return -value of the function is a string which becomes the edit area name.
      -
      -For example, lets say that we want edit area names based on the county -FIPS code.  The desired format is stateCfips, such as COC013, for -Colorado County #13.  The county shapefile has a 'STATE' -attribute, such as "CO", and it has a 'FIPS' attribute, such as 08013 -for Colorado County #13.   Using the list of strings format, -['STATE', 'C', 'FIPS'], you would end up with CO_C_08013, when we -really want COC013.
      -
      -This is how the code would be implemented:
      -
      -

      def cwaEAN(atts):
      -    fips = atts['FIPS'][-3:]  #take just the last -three characters from the FIPS code
      -    s = atts['STATE'] + "C" + fips  #assemble the -name
      -    return s    #return the complete edit -area name
      -
      -CWAcounties = ShapeFile(MAPDIR)
      -
      -CWAcounties.filename(CountyMapName) -
      -CWAcounties.filter(lambda x : x['CWA'] == CWA) -
      -CWAcounties.name = CWA + '_counties' -
      -CWAcounties.editAreaName = cwaEAN -

      -The "atts" dictionary looks simlilar to the following:
      -{'COUNTYNAME': 'Delta', 'LON': -86.909679999999994, 'TIME_ZONE': 'E', -'FE_AREA': 'sr', 'LAT': 45.82085, 'STATE': 'MI', 'FIPS': '26041', 'CWA':
      -'MQT', 'recnum': 9}
      -
      -and the final string is:  MIC041
      -
      -

        -

      -

      Filtered Map with Automatically Generated Edit Areas with group -definition

      -This is identical to the Filtered Map with Automatically Generated Edit -Areas case except that the user has specified a group name.  All -of -the generated edit areas will be placed in the edit area group called -'Zones'. -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.filter(lambda x : x['CWA'] == CWA) -
      -CWAzones.name = CWA + '_zones' -
      -CWAzones.editAreaName = ['STATE','ZONE'] -
      -CWAzones.groupName = 'Zones' -
      -  -

      -

      Basic Map with Automatically Generated Edit Areas

      -An example of a basic map with automatically generated edit areas: -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.name = CWA + '_zones' -
      -CWAzones.editAreaName = ['STATE','ZONE'] -
      -  -

      -

      Basic Map with Automatically Generated Edit Areas with group -definition

      -An example of a basic map with automatically generated edit areas with -group definition: -

      CWAzones = ShapeFile(MAPDIR) -
      -CWAzones.filename(ZoneMapName) -
      -CWAzones.name = CWA + '_zones' -
      -CWAzones.editAreaName = 'ZONE' -
      -CWAzones.groupName = 'Zones' -
      -  -

      -

      Expanded Maps

      -Maps are automatically clipped by the latitude/longitude domain that is -derived from the site -information in serverConfig.py.  If none of the map polygons -overlap -this lat/lon domain, then the polygon will not be part of the map by -default.  -The expandDomain attribute for any map defined in Maps.py will expand -the -latitude/longitude domain by that specified.  The user can control -the expansion factor in each of the four compass directions. -

      The format of the expandDomain tuple is shown below: -

      -

      mapName.expandDomain = (northExpand, eastExpand, southExpand, -westExpand) -

      -

      For example, to expand the map domain 2 degrees to the north, 3 -degrees -to the east, no expansion to the south, and 1 1/2 degrees to the west, -for the Counties map, the following line would be used. -

      -

      Counties.expandDomain = (2, 3, 0, 1.5) -

      -

      Note that expanding the maps will result in map backgrounds that are -larger.  This translates into slower load times for maps in the -GFE. -
      -  -

      -

      Precision

      -The ifpServer will throw out vertex points of polyline and polygon maps -which are closer togeather than needed for the GFE. Since opinions -differ -on how close points are before they are not needed, a ShapeFile can be -assigned an optional attribute to define this. The attribute is called -precision and is an integer or None assigned like so: -

      CWAzones.precision = 3 -

      -

      The server will then round all values in the data to this number of -decimal places. Adjacent duplicate values will then be removed. This -helps -reduce the amount of data contained in the maps making them faster to -display. -

      -

      By default all polygon and polyline maps will be rounded to a -precision -of 2. The above example overrides this to 3. If a site wishes to do no -rounding then precision can be set to None and this data reduction will -be skipped entirely. -

      -

      In summary, precision can be set to an integer greater than or equal -to zero or None. The best way to change this value is in your -localMaps.py -file. The above example could be placed into localMaps.py to change the -precision of the CWAzones map to 3. -
      -  -
      -  -
      -  -

      -

      Putting it all -Together -with the map list

      -In order for the system to recognize the list of defined maps, they -must -be put all together in a list.  The list MUST be called -maps.  -This example list, shows that there are three maps defined.  The -entries -within the list are the Python variable names (name to the left of the -equal sign on the ShapeFile line). -

      maps = [ CWAcounties, Counties, CWAzones ] -
      -  -

      -

      Importing localMaps

      -The final section of the Maps.py file is the software that checks for a -localMaps configuration and uses it if it exists.  Do not change -this -section of the file. -

      #----------------------------------- -
      -# DO NOT CHANGE THE FOLLOWING SECTION -
      -#------------------------------------ -
      -# import the local maps file -
      -try: -
      -    import localMaps -
      -except: -
      -    pass -
      -  -
      -  -

      +The map definition section defines each map that is desired.


      AWIPS standard names

      The AWIPS standard names table shows a sample filename, as loaded from @@ -934,16 +306,9 @@ width,dec - field type specifications:
      Description - brief statement of field usage.
      -  +
      +
      Back To Top
      -  -
      -  -

      -

      -  - +Back To TOC
      diff --git a/cave/com.raytheon.viz.gfe/help/moveGFEData.html b/cave/com.raytheon.viz.gfe/help/moveGFEData.html index 1c9cf4af19..a377e6403b 100644 --- a/cave/com.raytheon.viz.gfe/help/moveGFEData.html +++ b/cave/com.raytheon.viz.gfe/help/moveGFEData.html @@ -5,12 +5,12 @@ content="text/html; charset=iso-8859-1"> - ifpServerStats User's Guide + moveGFEData User's Guide

      moveGFEData User's Guide

      -
      April 4, 2006
      +
      January 9, 2012

      Table of Contents

      @@ -26,7 +26,7 @@ moveGFEData User's Guide Overview
      The moveGFEData program is a utility to move or copy -configuration files from one user to another.  It can be used with +configuration files from one user to another. It can be used with either one server, to copy/move files from user to user, or two servers, to copy/move files from one user on one server to another user on a @@ -34,19 +34,15 @@ second server.

      -
      -

      Running the moveGFEData Program

      -
       
      The command line syntax is:
      moveGFEData -h hostname -p portnumber -s sourceUser --d destUser [-c] [-a host2 -b port2]
      +-d destUser [-c] [-a host2 -b port2] -w sourceSiteID [-x destSiteID]
      A sample command line is:
      -moveGFEData -h dx4f -p 98000000 -s awipsusr -d SITE
      -
       
      +moveGFEData -h dx3-oax -p 9581 -s auser -d buser -w xxx

      @@ -57,19 +53,19 @@ sourceUser - +which the destination EDEX is running. - +the destination EDEX is running. @@ -92,7 +88,7 @@ data is moved. - - + + + + + + + + + +
      -h hostname Mandatory (See Note)Specifies the host, upon which the source ifpServer is -running.  + Specifies the host, upon which the source EDEX is +running. If -a and -b are not specified, then this also specifies the host upon -which the destination ifpServer is running.
      -p port Mandatory (See Note)Specifies the port, upon which the source ifpServer is + Specifies the port, upon which the source EDEX is running. If -a and -b are not specified, then this also specifies the port upon which -the destination ifpServer is running.
      -s sourceUser
      -a host2 OptionalSpecifies the host, upon which the destination ifpServer is + Specifies the host, upon which the destination EDEX is running. This switch is not necessary if you are copying/moving files between users @@ -101,113 +97,76 @@ on the same server.
      -b port2 OptionalSpecifies the port, upon which the destination ifpServer is + Specifies the port, upon which the destination EDEX is running. This switch is not necessary if you are copying/moving files between users on the same server.
      -w sourceSiteIDMandatorySpecifies the source site ID.
      -x dextSiteIDOptionalSpecifies the destination site ID.
      -Note: The -h serverhost and -p port are +Note: The -h serverhost and -p port are predefined -based on your installation configration of GFESuite.  The -h and +based on your installation configuration of GFESuite. The -h and -p will be defined for the server host and port specified during -installation.    +installation. If you wish to connect to another server, then these switches will be -necessary.   If environment -variables ${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -p switches. +necessary.


      -The program will list the various categories that are valid.  +The program will list the various categories that are valid. The user chooses a category and an inventory is shown of the data owned -by the "sourceUser".  The user chooses the file to move and the +by the "sourceUser". The user chooses the file to move and the program -moves the file.  Then the program displays the updated inventory. +moves the file. Then the program displays the updated inventory.

      Example Execution

      The following shows an example execution of copying -data from user "mark" to user "mark1".  User input is shown in +data from user "jdynina" to user "jdynina1". User input is shown in italics and bold. The program moves the ISC_Tool from mark to mark1. -

      camper > moveGFEData -h polaris -p 98000000 -s mark -d -mark1 +

      camper > moveGFEData -s jdynina -d jdynina1 -w LWX

      -

      ******************* MoveGFEData ****************** +

      19:14:18 moveGFEData.py INFO: MoveGFEData from [jdynina] to [jdynina1]
      +******************* MoveGFEData ******************
      +SourceUser: jdynina
      +DestinationUser: jdynina1

      -SourceUser: mark -
      -DestinationUser: mark1 -

      -<>Enter type of data.  Choose one of the options -
      -0 - exit -
      -1 - Color Tables -
      -2 - Edit Areas (Reference Areas) -
      -3 - Sample Sets -
      -4 - Weather Element Groups -
      -5 - Edit Area Groups -
      -6 - GFE/ifpIMAGE Configurations -
      -7 - Selection Time Ranges -
      -8 - Smart Tools
      +Enter type of data. Choose one of the options:
      +0 - exit
      +1 - Color Tables
      +2 - Edit Areas (Reference Areas)
      +3 - Sample Sets
      +4 - Weather Element Groups
      +5 - Edit Area Groups
      +6 - GFE/ifpIMAGE Configurations
      +7 - Selection Time Ranges
      +8 - Smart Tools
      9 - Procedures
      10 - Utilities
      11 - Text Utilities
      12 - Text Formatters
      -
      13 - Zone Combiner Saved -Combos -and Colors
      +13 - Zone Combiner Saved Combos and Colors
      14 - Zone Combiner Combination Files
      -
      8 -

      ***** Tools, Procedures, Utilities, Formatters ***** +8

      -Current Inventory for User: mark +***** Smart Tools *****
      +No files available to move

      -0.  Exit -
      --1. ALL entries -
      -1.  SnowAmt_SmartTool -
      -2.  ISC_Tool -
      -3.  AdjustDown_wTaper -
      -Enter number to move from mark to mark1 -
      -2 -
      -Current Inventory for User: mark -
      -0.  Exit -
      --1. ALL entries -
      -1.  SnowAmt_SmartTool -
      -2.  AdjustDown_wTaper -
      -Enter number to move from mark to mark1 -
      -0 -
      -camper >

      diff --git a/cave/com.raytheon.viz.gfe/help/netCDFFormat.html b/cave/com.raytheon.viz.gfe/help/netCDFFormat.html index 96e9034570..63e1d087f3 100644 --- a/cave/com.raytheon.viz.gfe/help/netCDFFormat.html +++ b/cave/com.raytheon.viz.gfe/help/netCDFFormat.html @@ -11,7 +11,7 @@ vlink="#551a8b">

      netCDF File Format

      -March 7, 2003 +January 3, 2012


      @@ -22,11 +22,8 @@ generated from the ifpnetCDF product formatter
    6. read by the iscMosaic program
    7. -If you are interested in the format of the netCDF files read by the -ifpServer, -then refer to the ifpServer netCDF -format -document. +In AWIPS1 ifpServer read netCDF files for gridded data. In AWIPS2 this format +has been replaced with HDF5 format.

      Organization of the Gridded Data in the netCDF file
      @@ -37,7 +34,7 @@ Data in the netCDF file

      Organization of the Gridded Data in the netCDF file

      -
      In order to fully understand this +
      To fully understand this section you should know something about how netCDF files are structured in general.  @@ -56,15 +53,12 @@ of the data types are stored as a cube as
      this simple cube form.  For VECTOR weather elements,  two cubes are -
      used, one for the magnitude, one for direction and they are coordinated so that the first magnitude grid corresponds to the first direction grid, -
      and so on.  For WEATHER, one cube is used to store byte values that map into another structure that holds strings that represent the weather -
      values.  The following illustration shows how this WEATHER grid and WEATHER KEY should be used to extract a weather value.

      @@ -75,14 +69,11 @@ the weather grid.  The list on the left shows the actual weather values expressed -
      as a text string.  In order to determine what the weather value is at any given point, you will need both the weather byte grid and the "weather -
      key".  Simply read the byte value in the grid and lookup that value in the key list. -


      netCDF Variable Names

      @@ -185,85 +176,85 @@ about a particular attribute, click on the link.
      -  Attribute Name -   Attribute Description + Attribute Name + Attribute Description -   validTimes -  A list of start and end times for which the grids are + validTimes + A list of start and end times for which the grids are valid. These are ordered start1, end1, start2, end2, etc.  The time is in seconds from Jan 1, 1970 at 0000z. -   descriptiveName -  The descriptive name of the weather element. + descriptiveName + The descriptive name of the weather element. -   gridsize -  the number of grid cells in each grid for this weather + gridsize + The number of grid cells in each grid for this weather element (x, y) -   domainOrigin -   The lower left corner of the grid domain in AWIPS + domainOrigin + The lower left corner of the grid domain in AWIPS coordinates -   domainExtent -   The extent of the domain in AWIPS coordinates + domainExtent + The extent of the domain in AWIPS coordinates -   minMaxAllowedValues -   The minimum and maximum values allowed, respectively + minMaxAllowedValues + The minimum and maximum values allowed, respectively for this weather element -   gridType -   The type of grid.  The types are: SCALAR, VECTOR, + gridType + The type of grid.  The types are: SCALAR, VECTOR, WEATHER -   databaseID -   Database identifier from which the grids were + databaseID + Database identifier from which the grids were extracted. -   siteID -   The site ID of the database from which the grids were + siteID + The site ID of the database from which the grids were extracted. -   units -   The units of the values for these grids. + units + The units of the values for these grids. -   level -   The level of the data.  For forecast data this is + level + The level of the data.  For forecast data this is always "SFC" -   timeConstraints -   Three integers that represent the time constraints for + timeConstraints + Three integers that represent the time constraints for the data.  -See the ifpServer documentation for more details. +See GFE documentation for more details. -   precision -   Data precision for the gridded data.  + precision + Data precision for the gridded data.  -   projection info (12 + projection info (12 items) -   All the infomation needed to reconstruct the + All the infomation needed to reconstruct the projection on which this grid is defined. -   fillValue + fillValue Data fill value which indicates that portions of the grid is not valid. @@ -282,28 +273,23 @@ defaults to 0.

      VaildTimes

      The valid times listed for a weather element define the start time and end time for each grid in terms of seconds since 01 Jan 1970.  This is a -
      standard format for representing time on UNIX systems.  The times listed are organized in pairs.  The first pair applies to the start time and -
      end time of the first grid.  The second pair applies to the start time and end time of the second grid, and so on.  There should be exacty the -
      -same number of validTime pairs +same number of validTime pairs.

      Descriptive Name

      The descriptive name field provides a more detailed description of the parameter.

      GridSize

      The size of the grid in terms of grid cells expressed as a pair of numbers @@ -313,7 +299,6 @@ The (x, y) coordinate origin or lower-left corner of the grid domain in AWIPS coordinates.  The AWIPS coordinates are expressed in terms of the -
      current projection (usually the AWIPS 211 projection).

      DomainExtent

      The (x, y) coordinate of the extent of the office domin expressed in @@ -321,7 +306,6 @@ the same coordinate system as the origin.  This is always the offset from the -
      origin.  Adding this coordinate to the origin give the upper-right coordinate.

      MinMaxAllowedValues

      @@ -330,12 +314,11 @@ expressed as a pair of numbers (min, max).

      GridType

      The data type for the grids.  Possible values are SCALAR, VECTOR, -and WEATHER +and WEATHER.

      DatabaseID

      The database identifier from which the grid originated. It has the format CCC_GRID__Fcst_YYYYMMDD_HHMM where, -
      CCC is the site identifier, YYYY is the year, MM is the number of the month, DD is the day, HH is the hour and MM is the minute

      SiteID

      @@ -343,7 +326,6 @@ The three letter identifier of the site from which the data originated.

      Units

      The parameter units field indicates the units used by the data.

      Level

      The level for this weather element (e.g., 500MB).  All surface data @@ -365,8 +347,8 @@ must be aligned on the specified time constraints. The starting time indicates the time of the first possible grid after 0000z. The duration indicates the length of the grid. The repeat interval defines how often the grid -can repeat. All of the units are in seconds.
      -
      For example, the illustration below +can repeat. All of the units are in seconds. +For example, the illustration below shows the possible grid boundaries for a time constraint of starting time of 0, duration of 6 hours, and repeat interval of 6 hours:
      @@ -377,7 +359,7 @@ minimum of 6 hours long, but could be 12 or 18 or even 24 hours in length just as long as the starting and ending time of the grid falls on one of -the defined above.
    +the defined above. A time constraint can be defined to have gaps in the data. For example, a 24-hour summary of daytime maximum temperature may have a constraint of starting time 900z, duration of 18 hours, and a repeat interval of @@ -397,11 +379,9 @@ temporal resolution of the grids is one hour: constraints. This is the situation with a start time, repeat, and duration values all set to 0. The temporal resolution of the grids can be one -second. +second.


    Data Multiplier and Data Offset

    The data multiplier and data offset fields are only present when the -k @@ -418,7 +398,7 @@ the netCDF data values into real values is:

    Projection Info

    -<>A series of values that allows one to +A series of values that allows one to precisely reconstruct the projection and thus remap the data to any other projection.  These 12 values comprise all of the value required @@ -436,9 +416,7 @@ information, along with the Grid Size, Domain Origin, and Domain Extent information is used to define the location of the sub-grid on the Earth's surface.


    -

    @@ -610,7 +588,7 @@ process, the process identifier (PID), and an optional lock value.
    7 Update TimeTime when the grid was saved to the ifpServer + Time when the grid was saved to GFE (for local grids), or time when the grid was created for Intersite Coordination Grids @@ -700,6 +678,9 @@ For purposes of formatting a netCDF file to be compatible with the iscMosaic program, the fileFormatVersion must be: 20010816 or 20030117.
    -  +

    +
    + diff --git a/cave/com.raytheon.viz.gfe/help/purgeAllGrids.html b/cave/com.raytheon.viz.gfe/help/purgeAllGrids.html index 4789178f33..61146bbec6 100644 --- a/cave/com.raytheon.viz.gfe/help/purgeAllGrids.html +++ b/cave/com.raytheon.viz.gfe/help/purgeAllGrids.html @@ -11,7 +11,7 @@

    purgeAllGrids User's Guide

    -July 23, 2003
    +January 6, 2012


    The purgeAllGrids program is part of the GFESuite software.  @@ -27,9 +27,7 @@ Command Line Switches The command line syntax is:

    purgeAllGrids -h hostname -p rpcPortNumber

    -  @@ -40,12 +38,12 @@ The command line syntax is: - + - +
    -h Mandatory (see Note)Host name upon which the ifpServer is runningHost name upon which EDEX is running
    -p Mandatory (see Note)RPC port upon which the ifpServer is runningRPC port upon which EDEX is running
    -d
    @@ -58,42 +56,22 @@ to purge all grids.
    -Note: The -h and -p switches are predefined -when running in an installed GFESuite environment.  They are +Note: The -h and -p switches are predefined +when running in an installed GFESuite environment. They are defined to the values specified when installing the software.  If you wish -to connect to a different ifpServer, then the switches will need to be +to connect to a different EDEX, then the switches will need to be specified. -  If environment variables ${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -p switches.


    -

    Sample Output

    +

    Sample Input

    purgeAllGrids -d BOU_GRID__Restore_00000000_0000

    -

    19:14:49.778 -PurgeAllGrids.py 73 EVENT:  PurgeAllGrids starting
    -19:14:49.791 Client.C 161 EVENT: -Establishing connection to server on localhost:98000044 ver=20030321
    -19:14:49.802 Client.C 181 EVENT: -Connection complete to server on localhost
    -19:14:49.849 PurgeAllGrids.py 47 -EVENT:  purging all grids from:  -BOU_GRID__Restore_00000000_0000
    -19:14:50.114 PurgeAllGrids.py 73 -EVENT:  PurgeAllGrids finished

    - 



    -Return to Table of Contents +Return to TOC diff --git a/cave/com.raytheon.viz.gfe/help/runProcedure.html b/cave/com.raytheon.viz.gfe/help/runProcedure.html index 44e1579ab0..9c41c113ee 100644 --- a/cave/com.raytheon.viz.gfe/help/runProcedure.html +++ b/cave/com.raytheon.viz.gfe/help/runProcedure.html @@ -6,17 +6,17 @@ - ifpBreakAllLocks + runProcedure

    runProcedure User's Guide


    -May 14, 2004
    +January 4, 2012


    The runProcedure program is part of the GFESuite software which allows the user to run a Procedure from the -command line.  +command line.

    Running the program

    @@ -33,9 +33,7 @@ timeRange]
                   [-m mutableModel] [-z drtTime][-V varDict]

    -  @@ -59,12 +57,12 @@ instructions on creating Procedures. - - @@ -110,17 +108,16 @@ the form of type_model or type_model_time, such as "_Fcst" or - @@ -131,8 +128,8 @@ The varDict must be in the form of a Python dictionary string, e.g.



    Sample Command Line -

    ./runProcedure -n QPF_SnowAmt -u hansen -h pollux -p 98000000 -c -gfeConfig -a BoulderCounty -t Today +

    ./runProcedure -n QPF_SnowAmt -u jsmith -h dx3-oax -p 9581 -c +gfeConfig -a SomeCounty -t Today

    diff --git a/cave/com.raytheon.viz.gfe/help/sendGfeMessage.html b/cave/com.raytheon.viz.gfe/help/sendGfeMessage.html index 611384cca2..754334991a 100644 --- a/cave/com.raytheon.viz.gfe/help/sendGfeMessage.html +++ b/cave/com.raytheon.viz.gfe/help/sendGfeMessage.html @@ -11,20 +11,20 @@

    sendGfeMessage User's Guide

    -May 14, 2004
    +January 4, 2012


    -The sendGfeMessage program is part of the GFESuite software.  +The sendGfeMessage program is part of the GFESuite software. It takes a message specified on the command line and broadcasts it to -all connected clients through the ifpServer.  The message, when -received by the GFE, is displayed on the status bar.
    +all connected clients through EDEX. The message, when +received by the GFE, is displayed in AlertViz.

    Running the program

    Command Line Switches

    The command line syntax is:
    -

    sendGfeMessage -h hostname -p rpcport [-r] [-s] [-u] [-c +

    sendGfeMessage -h hostname -p rpcport [-r] [-s] [-u] [-a] [-c class] -m message

      @@ -39,12 +39,12 @@ class] -m message

    - + - + - @@ -78,7 +78,7 @@ Urgent messages in the GFE will display a red banner.
    @@ -87,8 +87,8 @@ Alert messages in the GFE only appear in the status bar.
    @@ -101,16 +101,11 @@ bar.  Default is "GFE", which appears in the left status bar.
    -hOptional. Host name upon which the ifpServer is running. + Optional. Host name upon which EDEX is running. Default is taken from the siteConfig file.
    -pOptional. RPC port upon which the ifpServer is running. + Optional. RPC port upon which EDEX is running. Default is taken from the siteConfig file.
    -z
    The procedure may be run in the Displaced -Real Time Mode
    +
    The procedure may be run in the Displaced +Real Time Mode.
    -V 
     Use this option to provide -a run-time VariableList instead of displaying the user dialog.
    -The varDict must be in the form of a Python dictionary string, e.g.
    +a run-time VariableList instead of displaying the user dialog. +The varDict must be in the form of a Python dictionary string, e.g.:
                   -V  '{"Input Variable":"variable value", "Another variable": 25}'
    -h Mandatory (see Note)Host name upon which the ifpServer is runningHost name upon which EDEX is running
    -p Mandatory (see Note)RPC port upon which the ifpServer is runningRPC port upon which EDEX is running
    -r
    @@ -68,7 +68,7 @@ class] -m message
    Optional
    Send as an urgent message.  + Send as an urgent message. Urgent messages in the GFE will display a red banner.
    Optional
    Send as an alert message.  -Alert messages in the GFE only appear in the status bar.
    +Alert messages in the GFE only appear in AlertViz.
    Optional
    Message class, used by GFE to -determine whether message should appear in the left or right status -bar.  Default is "GFE", which appears in the left status bar.
    +determine whether message should appear in the left or right AlertViz +bar. Default is "GFE", which appears in the left AlertViz bar.
    -Note: The -h and -p switches are predefined -when running in an installed GFESuite environment.  They are -defined -to the values specified when installing the software.  If you wish -to connect to a different ifpServer, then the switches will need to be -specified. -  If environment variables ${CDSHOST} or -${CDSPORT} are defined, then the default server and port will be -determined from the environment variables, unless overridden with the -user specified -h and -p switches.
    +Note: The -h and -p switches are predefined +when running in an installed GFESuite environment. They are +defined to the values specified when installing the software. If you wish +to connect to a different EDEX, then the switches will need to be +specified.

    The Message Classes that the GFE currently uses are shown in the following table:

    @@ -168,23 +163,12 @@ server to alert forecasters to NDFD issues on missing grids, etc.



    -

    Sample Output

    +

    Example Input

    sendGfeMessage -r -c GFE -m "test from sendGfeMessage"

    -

    19:04:50.709 SendGfeMessage.py 69 EVENT:  SendUserMessage -starting
    -19:04:50.722 Client.C 161 EVENT: Establishing connection to server on -polaris:98000000 ver=20030321
    -19:04:50.740 Client.C 181 EVENT: Connection complete to server on -polaris
    -19:04:50.754 SendGfeMessage.py 60 EVENT:  sending: test from -sendGfeMessage  type= 0  class= GFE
    -19:04:50.763 SendGfeMessage.py 69 EVENT:  SendUserMessage finished

    -  -



    -Return to Table of Contents +Return to TOC diff --git a/cave/com.raytheon.viz.gfe/help/serverConfig.html b/cave/com.raytheon.viz.gfe/help/serverConfig.html index cb922818bd..5715dd67c3 100644 --- a/cave/com.raytheon.viz.gfe/help/serverConfig.html +++ b/cave/com.raytheon.viz.gfe/help/serverConfig.html @@ -11,17 +11,16 @@

    serverConfig.py

    -Sept 29, 2008
    +January 3, 2012

     
    The serverConfig.py file is one -of several configuration files for the ifpServer (common database -server).  +of several configuration files for GFE. The serverConfig.py file defines the general configuration of the databases -and weather elements.  The file is not intended to be +and weather elements. The file is not intended to be field-edited, instead there is a localConfig.py  and localWxConfig.py @@ -119,23 +118,14 @@ fp.close()

    import siteConfig, LogStream, config

    -

    GFESUITE_SITEID = siteConfig.GFESUITE_SITEID +

    GFESUITE_SITEID = siteConfig.GFESUITE_SITEID
    +GFESUITE_MHSID  = siteConfig.GFESUITE_MHSID
    +GFESUITE_SERVER = siteConfig.GFESUITE_SERVER
    +GFESUITE_HOME   = siteConfig.GFESUITE_HOME
    +GFESUITE_PORT   = int(siteConfig.GFESUITE_PORT)
    +GFESUITE_LOGDIR = siteConfig.GFESUITE_LOGDIR
    +GFESUITE_PRDDIR = siteConfig.GFESUITE_PRDDIR

    -GFESUITE_HOME   = siteConfig.GFESUITE_HOME -
    -GFESUITE_PORT   = int(siteConfig.GFESUITE_PORT) -
    -GFESUITE_DATDIR = siteConfig.GFESUITE_DATDIR -
    -GFESUITE_LOGDIR = siteConfig.GFESUITE_LOGDIR -
    -GFESUITE_PRDDIR = siteConfig.GFESUITE_PRDDIR -
    -GFESUITE_SHPDIR = siteConfig.GFESUITE_SHPDIR -
    -GFESUITE_TOPODIR = siteConfig.GFESUITE_TOPODIR -


    Weather Element @@ -380,12 +370,11 @@ Wind", TestKeys)

    ExtraWEPrecision

    -Weather Elements are stored in their specified precision in the -ifpServer, +Weather Elements are stored in their specified precision in GFE, thus if you have the precision set to 0 for a weather element, it will effectively be stored as integers.  Sometimes you might want additional -precision available for certain weather elements in order to faciliate +precision available for certain weather elements in order to facilitate computations on the data.  For those cases, where you don't want to specify a higher precision (which affects labeling, sampling, ISC data @@ -1323,100 +1312,55 @@ NO,   NO,  2, 0)


    D2D Model File Directories

    -The ifpServer automatically scans the D2D model file directories and -provides +EDEX automatically scans the single pre-defined D2D model file directory and provides this data as additional grids for display, or for use in smart tools. -The -user can set the search path to include certain models.  The -search -paths specified define the top of the tree -- all subdirectories are -included.  -For example, simply specifying /data/fxa/Grid/SBN will get all files, -but -many of the directories will be bogus since the files will not -necessarily -be in a compatible netCDF format.
    +The user can define which model directories correspond to which GFE +model.
    -

    D2DDIRS = [('/data/fxa/Grid/SBN/netCDF/CONUS212/GFS', 'GFS40'),
    ('/data/fxa/Grid/SBN/netCDF/CONUS211/NAM', 'NAM80'),
    ('/data/fxa/Grid/SBN/netCDF/CONUS211/NGM', 'NGM80'),
    ('/data/fxa/Grid/SBN/netCDF/CONUS202/MRF', 'gfsLR'),
    ('/data/fxa/Grid/SBN/netCDF/CONUS211/RUC', 'RUC80'),
    ('/data/fxa/Grid/SBN/netCDF/CONUS212/MesoEta', 'NAM40'),
    ('/data/fxa/Grid/SBN/netCDF/CONUS215/MesoEta', 'NAM20'),
    '/data/fxa/Grid/FSL/netCDF/MSAS',
    ('/data/fxa/Grid/FSL/netCDF/LAPS_Grid/LAPS', 'LAPS'),
    '/data/fxa/Grid/SBN/netCDF/REG233/GWW',
    '/data/fxa/Grid/SBN/netCDF/GRID218/HPCQPF',
    '/data/fxa/Grid/SBN/netCDF/CONUS215/HPCdelta',
    '/data/fxa/Grid/SBN/netCDF/LATLON/GLERL',
    '/data/fxa/Grid/SBN/netCDF/GRID238/GWW',
    '/data/fxa/Grid/SBN/netCDF/CONUS226/TPCtcm',
    ('/data/fxa/Grid/SBN/netCDF/GRID218/Eta', 'NAM12')]
    +

    D2DMODELS = [('MRF204', 'gfsLR'), + ('AVN225', 'GFS75'), + 'GWW233', + 'GlobalWave', + ('TPCWindProb', 'TPCProb'), + ]

    The actual syntax in the serverConfig.py file looks more complicated -since it defines the D2DDirs based on the site identifier.  OCONUS +since it defines the D2DMODELS based on the site identifier.  OCONUS sites use a different set of directories.

    Note that the above example has a mixture of tuples and -strings.  There is an alternative form of the D2DDIRS that is used -when the -netCDF +strings. There is an alternative form of the D2DMODELS that is used +when the hdf5 model variable (which determines the name of the model as seen by GFESUITE) conflicts with another model of the same name. Each entry in the list of -D2DDIRS can either be a string, such as above, which indicates the +D2DMODELS can either be a string, such as above, which indicates the directory -path, or it can be a tuple of ('directory path', 'modelName'). If the +name, or it can be a tuple of ('directory name', 'modelName'). If the second -form is used, then the model variable in the netCDF file is ignored and +form is used, then the model variable in the hdf5 file is ignored and the given modelName is used instead.


    D2D Satellite File Directories

    -The ifpServer recognizes the D2D satellite data as a valid data -set.  The ifpServer will scan the listed set of D2D directories -for satellite data for use in display, and smart initialization.  +GFE recognizes the D2D satellite data as a valid data +set. EDEX will scan the listed set of D2D directories +for satellite data for use in display, and smart initialization. Since the satellite data is organized differently than model data, the specification of the D2D satellite directories consist of the directory name, plus the name of the weather element contained within that -directory.  D2D stores one image (one wavelength) within each data +directory. D2D stores one image (one wavelength) within each data file.

    -The format of the entry is a list of tuples.  The tuples are of +The format of the entry is a list of tuples. The tuples are of length two and contain the D2D directory name and weather element name.

    -SATDIRS = -[("/data/fxa/sat/SBN/netCDF/westCONUS/conus_vis", "visibleWest"),
    -           -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_i11", "ir11West"),
    -           -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_i12", "ir13West"),
    -           -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_i39", "ir39West"),
    -           -("/data/fxa/sat/SBN/netCDF/westCONUS/conus_iwv", "waterVaporWest"),
    -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_vis", "visibleCentral"),
    -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_i11", "ir11Central"),
    -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_i12", "ir13Central"),
    -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_i39", "ir39Central"),
    -           -("/data/fxa/sat/SBN/netCDF/conusC/conus_iwv", "waterVaporCentral"),
    -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_vis", "visibleEast"),
    -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_i11", "ir11East"),
    -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_i12", "ir13East"),
    -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_i39", "ir39East"),
    -           -("/data/fxa/sat/SBN/netCDF/eastCONUS/conus_iwv", "waterVaporEast")]
    -
    +SATDATA = [("NESDIS/GOES-13(N)/East CONUS/Imager Visible", "visibleEast"),
    +           ("NESDIS/GOES-13(N)/East CONUS/Imager 11 micron IR", "ir11East"),
    +           ("NESDIS/GOES-13(N)/East CONUS/Imager 12 micron IR", "ir13East"),
    +           ("NESDIS/GOES-13(N)/East CONUS/Imager 3.9 micron IR", "ir39East"),
    +           ("NESDIS/GOES-13(N)/East CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporEast")]



    @@ -1442,7 +1386,7 @@ available databases in the Database Attributes should be greater to or equal to the number of databases specified in the D2D Model Database Version specification. This definition is also used for D2D Satellite Databases -to determine the number of images that can be seen by the ifpServer. +to determine the number of images that can be seen by GFE.

    The format of the entry is:
    #D2DDBVERSIONS = { @@ -1467,11 +1411,10 @@ the number of NAM to 3:


    Initialization Modules

    -The smart initialization technique of GFESuite is initiated from the -ifpServer.  +The smart initialization technique of GFESuite is initiated from EDEX. The serverConfig.py file provides a mapping of D2D directories to initialization -run modules.  For example, here is the section in serverConfig.py: +run modules. For example, here is the section in serverConfig.py:

    INITMODULES = {
        "NAM40" : ["NAM40", "NAM20"],
        "NAM80" : ["NAM80"],
    @@ -1491,7 +1434,7 @@ run modules.  For example, here is the section in serverConfig.py:

    This is standard Python syntax for a dictionary, with the keys on the -left of the colon and the values as a list on the right side.  For +left of the colon and the values as a list on the right side. For example, the first line:

    "NAM40" : ["NAM40", "NAM20"] @@ -1501,7 +1444,7 @@ whenever changes occur in the NAM40 and NAM20 D2D databases.  The "MesoNAM" NAM40/NAM20 is more complicated than most models since it arrives in two completely -separate netCDF files and resolution.  The syntax for the "NAM12" +separate hdf5 files and resolution.  The syntax for the "NAM12" model is more straightforward:

    @@ -1509,7 +1452,7 @@ is more straightforward:

    which indicates that the NAM12 initialization module (named NAM12.py and -found in the release/etc/BASE/smartInit) directory will be executed +found in the /awips2/edex/data/utility/edex_static/base/smartinit) directory will be executed whenever the D2D NAM12 model changes.  Remember that the initialization module is @@ -1590,18 +1533,18 @@ feature of GFESuite:
    Routing Table web service as a string.  If None is specified, then the system will be unable to transmit or receive ISC data.

  • REQUESTED_ISC_SITES - defines the sites, as a list, from which -ISC data will be requested.  If None is specified, then the -ifpServer will automatically calculate the needed isc sites by +ISC data will be requested.  If None is specified, then EDEX +will automatically calculate the needed isc sites by examining the list of ISC_xxx edit areas. 
  • REQUEST_ISC - overall toggle to control the ingest of ISC -data.  If this flag is set to 0, then the ifpServer will not +data.  If this flag is set to 0, then EDEX will not register with the ISC Routing Table web server and no ISC data will be -received.  If this flag is 1, then the ifpServer reigsters with +received.  If this flag is 1, then EDEX reigsters with the web service for the data sets defined in REQUESTED_ISC_SITES.
  • SEND_ISC_ON_SAVE - toggle to turn on the transmission of ISC data when grids are stored in the Fcst database.  The list of sites to -send is obtained from other ifpServer registrations with the ISC +send is obtained from other EDEX registrations with the ISC Routing Table web service. Note that ISC grids will be sent only if the GFE is used to save the grids. For example, if iscMosaic is used to modify the Fcst database, those grids will not be sent via ISC at @@ -1609,14 +1552,14 @@ the time of the save.
  • SEND_ISC_ON_PUBLISH - toggle to turn on the transmission of ISC data when grids are published in the Official database.  The list -of sites to send is obtained from other ifpServer registrations with +of sites to send is obtained from other EDEX registrations with the ISC Routing Table web service.
  • REQUESTED_ISC_PARMS - defines the weather elements desired to be -received for ISC, as a list.  If set to None, then the ifpServer +received for ISC, as a list.  If set to None, then EDEX will automatically set the list to be equivilant of all weather elements in your ISC database.  To receive weather elements from an office that is the same type as yours (e.g., wfo to a wfo), then -simply specify the weather element, such as T.   To receive +simply specify the weather element, such as T.  To receive weather elements from an office that is of a different office type than yoursr (e.g., rfc to a wfo), then specify the weather element followed by the sending office type.  For example, requesting QPF from an @@ -1688,7 +1631,7 @@ Table
    style="font-family: monospace;">
    # list of sites that from which -you want ISC data (If None, ifpServer will

    # automatically calculate the list.)
    @@ -1913,16 +1856,16 @@ configuration file.
    #---------------------------------------------------------------------------
    -import ifpServerConfig +from com.raytheon.edex.plugin.gfe.config import IFPServerConfig, SimpleServerConfig
    +IFPConfigServer = SimpleServerConfig()
    +IFPConfigServer.allowTopoBelowZero = 1

    Server Settings

    The Server Settings section consolidates the entries in the serverConfig.py -and makes them available to the C++ portion of the ifpServer.  -Nothing -should ever be changed in this section: +and makes them available to the Java portion of GFE. +Nothing should ever be changed in this section:

    #----------------------------------------------------------------------------
    # Server settings     DO NOT CHANGE THESE @@ -1930,12 +1873,8 @@ DEFINITIONS
    #----------------------------------------------------------------------------
    -  -



    diff --git a/cave/com.raytheon.viz.gfe/help/serverConfiguration.html b/cave/com.raytheon.viz.gfe/help/serverConfiguration.html index 1d99ad56c4..6906965e3f 100644 --- a/cave/com.raytheon.viz.gfe/help/serverConfiguration.html +++ b/cave/com.raytheon.viz.gfe/help/serverConfiguration.html @@ -11,7 +11,7 @@

    Server Configuration Information

    -
    July 23, 2004
    +
    January 3, 2012

    @@ -32,10 +32,10 @@ Modification Options

    Overview

    -
    The ifpServer uses several configuration files:
    +
    GFE uses several configuration files:
    • - siteConfig.py and site.sh - Defines + siteConfig.py - Defines directory and site variables
    • @@ -51,21 +51,13 @@ serverConfig.py the weather definition in serverConfig.py (Site-level file)
    • - Maps.py - Defines the map backgrounds, + Maps.java - Defines the map backgrounds, and automatically generated edit areas that are available.
    • - localMaps.py - Overrides for the -Maps.py -file (Site-level file).
    • -
    • - MapFiles.py - Defines the shapefile + Map Files - overview - Defines the shapefile names used in the map generation.
    • -
    • - localMapFiles.py - Overrides for -the MapFiles.py -entries (Site-level file).
    • VTECPartners.py - Defines the VTEC coordination and filtering by site.
    • localVTECPartners.py @@ -80,7 +72,7 @@ shipped with the system.
    There are several different options a site has for -making modifications to these files.  At +making modifications to these files. At no time should the files that are sent with the software release or install be modified since these will be overwritten with the next upgrade.  @@ -133,9 +125,8 @@ to identify the server network information
  • to identify the site identifier

  • -<>The VTECPartners.py file +The VTECPartners.py file is used:
    -
    • to configure the site filtering for the Merge VTEC and VTEC Decoder processes
    • @@ -151,55 +142,6 @@ is used:
    • to override the entries in VTECPartners.py.
    -
      -
    -
    The localMapFiles.py -and localMaps.py files are optional -and are -only used to override the standard map definitions shipped with the -system.  -There are several different options a site has for making modifications -to these files.  At no time should the -files -that are sent with the software release or install be modified since -these -will be overwritten with the next upgrade.  See the -section -on file locations for information on -where -the configuration files should be located.
    -The Maps.py file is used to define:
    -
      -
    • -the available set of map backgrounds and
    • -
      the automatically generated set of edit areas -from -the map backgrounds.
      -
    -
    The MapFiles.py file -is used to define:
    -
      -
    • -the shapefile filenames associated with the shapefiles used to generate -the map backgrounds
    • -
    -
    The localMaps.py -file is used:
    -
    - -
      -
    • -to add, remove, or redefine items in the Maps.py file for site use.
    • -
    -
    The localMapFiles.py -file is used:
    -
      -
    • -to override the shapefile filename definitions for all maps. This is -the -file modified when you are manually upgrading to new versions of -shapefiles.
    • -

    @@ -212,7 +154,7 @@ no changes from installed files, complete override of map backgrounds and partial orerride of map backgrounds.

    No Changes From Installed Files

    -This is the default case.  There is nothing you need to do. +This is the default case. There is nothing you need to do.

    Complete Override of Server Configuration (not recommended)

    @@ -240,58 +182,15 @@ Partial Override of Server Configuration just a few changes and/or additions to the server configuration.  It involves creating a local configuration file (localConfig.py) -and overriding certain features.  Not all features in +and overriding certain features. Not all features in serverConfig.py may be redefined or overridden in this manner.  See the localConfig.py -documentation for details.  Weather definitions are overridden +documentation for details. Weather definitions are overridden using the localWxConfig.py file.  VTEC coordination information is overridden using the localVTECPartners.py file.
    -
    -
    -

    -Server Map -Configuration -Modification Options

    -Map backgrounds are handled somewhat differently from the server -database -configuration and are defined in a different file. -

    No Changes From Installed Files

    -This option should be chosen if the Maps.py -file is satisfactory and no changes are required. -

    Partial Override of Map Backgrounds

    -
    This option provides the site control over the -set -of generated map backgrounds and edit areas.  If you want to -change -any item in the Maps.py file, you use the -localMaps.py file to add, modify, -and -remove maps. You use the localMapFiles.py -file to change the shapefile version (or filename) of the source -shapefile.
    -

    -Complete Override of Map Backgrounds (not -recommended)

    -There should be no reason to completely override the Maps.py file since -localMaps.py  -and localMapFiles.py provides all of -the -override capability.  But if you insist, you can copy the Maps.py -file from the original location (leave -the -original one there) to the customized -location.  -Modify it in accordance with the map -configuration -manual.  Since Maps.py doesn't change frequently, all you -should -need to do is a comparison between the newly upgraded files and your -modified -files after each upgrade.
     

    @@ -300,15 +199,14 @@ files after each upgrade. The location of the server configuration files are shown in the table below:
    -  - - @@ -317,63 +215,28 @@ below: - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - @@ -390,7 +253,7 @@ below: - @@ -398,7 +261,6 @@ below:



    diff --git a/cave/com.raytheon.viz.gfe/help/siteConfig.html b/cave/com.raytheon.viz.gfe/help/siteConfig.html index 6e8deb1f68..b8830399d1 100644 --- a/cave/com.raytheon.viz.gfe/help/siteConfig.html +++ b/cave/com.raytheon.viz.gfe/help/siteConfig.html @@ -10,106 +10,30 @@

    siteConfig.py

    -May 14, 2004
    +January 3, 2012

     
    The siteConfig.py file is one -of three configuration files for the ifpServer (common database -server).  +of three configuration files for GFE. The siteConfig.py file defines the site identifier, server hostname, server -port number,  and a series of directories that comprise the +port number, and a series of directories that comprise the GFESuite software.


    import os, socket
                                                                                   
    -GFESUITE_HOME = "/localhost/home/afps/release"
    -GFESUITE_SERVER = "polaris"
    -GFESUITE_PORT   = '98000000'
    -GFESUITE_SITEID = 'BOU'
    -GFESUITE_LOGDIR = '/localhost/home/afps/release/data/logfiles'
    -GFESUITE_ETCDIR = '/localhost/home/afps/release/etc'
    -GFESUITE_DATDIR = '/localhost/home/afps/release/data'
    -GFESUITE_DOCDIR = '/localhost/home/afps/release/doc/onlinehelp'
    -GFESUITE_PRDDIR = '/localhost/home/afps/release/products'
    -GFESUITE_DFCDIR = '/localhost/home/afps/release/data/dfc'
    -GFESUITE_SHPDIR = '/localhost/home/afps/release/data/maps'
    -GFESUITE_TOPODIR = '/localhost/home/afps/release/data/topo'
    -GFESUITE_VTECDIR = '/localhost/home/afps/release/data/vtec'
    -#THIS FILE GENERATED AUTOMATICALLY DURING GFE INSTALL **
    +GFESUITE_HOME = os.environ['EDEX_HOME']+"/../GFESuite"
    +GFESUITE_SERVER = "dx3"
    +GFESUITE_PORT = '98000000'
    +GFESUITE_SITEID = 'OAX'
    +GFESUITE_PRDDIR = GFESUITE_HOME+"/products"
    +GFESUITE_MHSID = 'OAX'
    +GFESUITE_LOGDIR = GFESUITE_HOME+"/logs/"+GFESUITE_SITEID

     

    -

    -
    -

    site.sh

    -There is also a site.sh file which is used by scripts to access the -same -information.  Here is what the site.sh file looks like after it is -generated: -

    #!/bin/sh
    -                                                                                -
    -#THIS FILE GENERATED -AUTOMATICALLY DURING GFE INSTALL **
    -                                                                                -
    -GFESUITE_HOME="/localhost/home/afps/release"
    -GFESUITE_SERVER="polaris"
    -GFESUITE_RPC_PORT="98000000"
    -GFESUITE_SITEID="BOU"
    -GFESUITE_LOGDIR="/localhost/home/afps/release/data/logfiles"
    -GFESUITE_ETCDIR="/localhost/home/afps/release/etc"
    -GFESUITE_DATDIR="/localhost/home/afps/release/data"
    -GFESUITE_DOCDIR="/localhost/home/afps/release/doc/onlinehelp"
    -GFESUITE_PRDDIR="/localhost/home/afps/release/products"
    -GFESUITE_DFCDIR="/localhost/home/afps/release/data/dfc"
    -GFESUITE_SHPDIR="/localhost/home/afps/release/data/maps"
    -GFESUITE_VTECDIR="/localhost/home/afps/release/data/vtec"
    -                                                                                -
    -export -LD_LIBRARY_PATH=$GFESUITE_HOME/etc/BASE
    -export PYTHONHOME=$GFESUITE_HOME
    -export -TCL_LIBRARY="$GFESUITE_ETCDIR/TclTk/tcl"
    -export -TK_LIBRARY="$GFESUITE_ETCDIR/TclTk/tk"
    -export -PATH=$GFESUITE_HOME/bin:$GFESUITE_HOME/bin/run:$PATH
    -export -PYTHONPATH="$GFESUITE_ETCDIR/SITE:$GFESUITE_ETCDIR/BASE:$GFESUITE_ETCDIR/BASE/lib-dynload:$GFESUITE_ETCDIR/BASE/gfe.zip:$GFESUITE_ETCDIR/BASE/pylib.zip:$GFESUITE_OTHERPYTHONPATH"
    -
    -  -
    -  -
    -  -
    -  -

    -


    Back To TOC diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java index 4b4fa0464e..5895942315 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/ParmListeners.java @@ -21,6 +21,7 @@ package com.raytheon.viz.gfe.core.parm; import org.apache.commons.lang.Validate; import org.eclipse.core.runtime.ListenerList; +import org.eclipse.swt.widgets.Display; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.uf.common.dataplugin.gfe.server.lock.LockTable; @@ -57,6 +58,7 @@ import com.raytheon.viz.gfe.core.wxvalue.WxValue; * multiple registration * Feb 23, 2012 #346 dgilling Implement clearParmListeners. * Mar 01, 2012 #346 dgilling Use identity-based ListenerLists. + * Mar 21, 2012 14583 mli fix invalid thread access for PickupValueChange * * * @@ -246,14 +248,13 @@ public class ParmListeners { for (Object listener : this.pickupValueChangedListeners.getListeners()) { final IPickupValueChangedListener casted = (IPickupValueChangedListener) listener; - Runnable notTask = new Runnable() { - + Display.getDefault().asyncExec( new Runnable() { + @Override public void run() { casted.pickupValueChanged(parm, pickupValue); } - }; - notificationPool.schedule(notTask); + }); } } diff --git a/cave/com.raytheon.viz.ghg/com.raytheon.viz.ghg.ecl b/cave/com.raytheon.viz.ghg/com.raytheon.viz.ghg.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.grib.feature/com.raytheon.viz.grib.feature.ecl b/cave/com.raytheon.viz.grib.feature/com.raytheon.viz.grib.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.grid/com.raytheon.viz.grid.ecl b/cave/com.raytheon.viz.grid/com.raytheon.viz.grid.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.grid/localization/styleRules/gridImageryStyleRules.xml b/cave/com.raytheon.viz.grid/localization/styleRules/gridImageryStyleRules.xml index 6d2ce7d639..f00055fb5c 100644 --- a/cave/com.raytheon.viz.grid/localization/styleRules/gridImageryStyleRules.xml +++ b/cave/com.raytheon.viz.grid/localization/styleRules/gridImageryStyleRules.xml @@ -39,7 +39,29 @@ - + + + + + GH + GHxSM + zAGL + HRRR-East + HRRR-West + + + ft + Grid/gridded data + + 0 + 4000 + + + + diff --git a/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java b/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java index 3b9ff8f478..4576a0fdce 100644 --- a/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java +++ b/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java @@ -87,7 +87,8 @@ import com.vividsolutions.jts.geom.GeometryFactory; * ------------ ---------- ----------- -------------------------- * Jun 30, 2009 2524 snaples Initial creation * Feb 29 2010 9909 lbousaidi changed the for loop for getting - * the HRAP grid bin + * the HRAP grid bin + * Apr 17, 2012 9602 mgamazaychikm Changed the HRAP grid j index for loop * * * @author snaples @@ -221,8 +222,8 @@ public class PlotGriddedTempResource extends buf = FloatBuffer.allocate(hrap_grid.maxi * hrap_grid.maxj); /* Get value in the HRAP grid bins. */ - for (j = 0; j < hrap_grid.maxj; j++) { - for (i = 0; i < hrap_grid.maxi; i++) { + for (j = hrap_grid.maxj - 1; j >= 0; j--) { + for (i = 0; i < hrap_grid.maxi; i++) { if (hrap_grid.owner[i][j] == -1) { continue; diff --git a/cave/com.raytheon.viz.mpe/com.raytheon.viz.mpe.ecl b/cave/com.raytheon.viz.mpe/com.raytheon.viz.mpe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/EstMissingStations.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/EstMissingStations.java index 64c2d0b3b6..55a0c2a94a 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/EstMissingStations.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/EstMissingStations.java @@ -141,7 +141,7 @@ public class EstMissingStations { } if (method == 2 && isoh > 0 && isoh1 > 0) { - padj = pdata[j].stn[i].frain[h].data * (isoh1 / isoh); + padj = pdata[j].stn[i].frain[h].data * isoh1 / isoh; } else { padj = pdata[j].stn[i].frain[h].data; } @@ -200,7 +200,7 @@ public class EstMissingStations { if (method == 2 && isoh > 0 && isoh1 > 0) { padj = pdata[j].stn[i].frain[h].data - * (isoh1 / isoh); + * isoh1 / isoh; } else { padj = pdata[j].stn[i].frain[h].data; } diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyPrecip.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyPrecip.java index 0455611550..f35a86def5 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyPrecip.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyPrecip.java @@ -42,7 +42,7 @@ import com.raytheon.viz.mpe.core.MPEDataManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 24, 2009 snaples Initial creation - * + * April , 2012 8672 lbousaidi fixed the reading of the PRISM data. * * * @author snaples @@ -85,7 +85,7 @@ public class MeanMonthlyPrecip { Unit dataUnit = Unit.ONE; displayUnit = NonSI.INCH; - dataUnit = SI.MILLIMETER; + dataUnit = NonSI.INCH; cmc.setDisplayUnit(displayUnit); cmc.setDataUnit(dataUnit); @@ -135,16 +135,21 @@ public class MeanMonthlyPrecip { return false; } pdata = xmfile.getData(); - // for (int i = MaxY - 1; i >= 0; i--) { - for (int i = 0; i < MaxY; ++i) { + short temp=0; + for (int i = MaxY - 1; i >= 0; i--) { if (pdata.length == 0) { System.out.println("Error reading " + pfile); return false; } - + for (int j = 0; j < MaxX; j++) { + + temp = pdata[i * MaxX + j]; + pdata[i * MaxX + j ]=pdata[i + MaxX * (MaxY - 1)]; + pdata[i + MaxX *(MaxY -1)] =temp; + float f = 0; - short s = pdata[i * MaxX + j]; + short s= pdata[j + MaxX * (MaxY - i -1)]; if (s < 0) { if (s == -9999 || s == -999 || s == -99 || (s == -9)) { f = s; diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyTemp.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyTemp.java index 062b92c659..0a758d4651 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyTemp.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/MeanMonthlyTemp.java @@ -35,9 +35,11 @@ import com.raytheon.viz.mpe.core.MPEDataManager; *
      * 
      * SOFTWARE HISTORY
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * Feb 25, 2009            snaples     Initial creation
    + * Date         Ticket#    Engineer    	Description
    + * ------------ ---------- ----------- 	--------------------------
    + * Feb 25, 2009            snaples     	Initial creation
    + * Apr 16, 2012			   mgamazaychik	DR9602 - changed how max and min 
    + * 										temperature data are read from PRISM  
      * 
      * 
    * @@ -129,16 +131,19 @@ public class MeanMonthlyTemp { return false; } pdata = xmfile.getData(); - // for (int i = MaxY - 1; i >= 0; i--) { - for (int i = 0; i < MaxY; ++i) { - if (pdata.length == 0) { - System.out.println("Error reading " + pfile); - return false; - } - + if (pdata.length == 0) { + System.out.println("Error reading " + pfile); + return false; + } + /* + * DR9602 - added to read max temps from PRISM properly + */ + int index=0; + for (int i = MaxY - 1; i >= 0; i--) { for (int j = 0; j < MaxX; j++) { - float f = 0; - short s = pdata[i * MaxX + j]; + float f = 0; + short s = pdata[index]; + index++; if (s < 0) { if (s == -9999 || s == -999) { f = s; @@ -189,16 +194,19 @@ public class MeanMonthlyTemp { return false; } pdata2 = xmfile.getData(); - // for (int i = MaxY - 1; i >= 0; i--) { - for (int i = 0; i < MaxY; ++i) { - if (pdata2.length == 0) { - System.out.println("Error reading " + pfile); - return false; - } - + if (pdata2.length == 0) { + System.out.println("Error reading " + pfile); + return false; + } + /* + * DR9602 - added to read min temps from PRISM properly + */ + int index=0; + for (int i = MaxY - 1; i >= 0; i--) { for (int j = 0; j < MaxX; j++) { - float f = 0; - short s = pdata2[i * MaxX + j]; + float f = 0; + short s = pdata2[index]; + index++; if (s < 0) { if (s == -9999 || s == -999) { f = s; diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/RenderT.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/RenderT.java index 4ae9275821..fb47786aa0 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/RenderT.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/RenderT.java @@ -38,9 +38,10 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Tdata; *
      * 
      * SOFTWARE HISTORY
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * Mar 11, 2009            snaples     Initial creation
    + * Date         Ticket#    Engineer    	Description
    + * ------------ ---------- ----------- 	--------------------------
    + * Mar 11, 2009            snaples     	Initial creation
    + * Apr 16, 2012			   mgamazaychik	DR9602 - made changes to how dist2 is calculated
      * 
      * 
    * @@ -132,10 +133,13 @@ public class RenderT { dist1 = hrap_grid.coord[i][j].lat - temperature_stations.get(hh).lat; - dist2 = (hrap_grid.coord[i][j].lon - temperature_stations - .get(hh).lon) + /* + * DR9602 - Added Math.abs function to get the positive longitude + */ + dist2 = (hrap_grid.coord[i][j].lon - Math.abs(temperature_stations + .get(hh).lon)) * Math.cos((hrap_grid.coord[i][j].lat + temperature_stations - .get(hh).lat) / 2 * conv); + .get(hh).lat) / 2 * conv); dist = Math.pow(dist1, 2) + Math.pow(dist2, 2); @@ -161,10 +165,12 @@ public class RenderT { } if (pcpn_time_step == 2) { - - temp = (temp + ((float) (hrap_grid.min[isom][i][j]) / 10 - temperature_stations - .get(hh).min[isom])) * dist; - + /* + * DR9602 - made changes to improve readability of the code + */ + float hmin = hrap_grid.min[isom][i][j]; + float tmin = temperature_stations.get(hh).min[isom]; + temp = (temp + (hmin / 10 - tmin)) * dist; } value = value + temp; @@ -213,12 +219,15 @@ public class RenderT { continue; } - dist1 = hrap_grid.coord[i][j].lat - - temperature_stations.get(h).lat; - dist2 = (hrap_grid.coord[i][j].lon - temperature_stations - .get(h).lon) - * (Math.cos(hrap_grid.coord[i][j].lat - + temperature_stations.get(h).lat) / 2 * conv); + dist1 = hrap_grid.coord[i][j].lat + - temperature_stations.get(h).lat; + /* + * DR9602 - Added Math.abs function to get the positive longitude + */ + dist2 = (hrap_grid.coord[i][j].lon - Math.abs(temperature_stations + .get(h).lon)) + * Math.cos( ( hrap_grid.coord[i][j].lat + temperature_stations + .get(h).lat ) / 2 * conv); dist = Math.pow(dist1, 2) + Math.pow(dist2, 2); @@ -236,15 +245,19 @@ public class RenderT { dist = 1 / dist; temp = tdata[pcpn_day].tstn[h].tlevel2[time_pos].data; - + /* + * DR9602 - made changes to improve readability of the code + */ if (pcpn_time_step == 1) { - temp = (temp + (hrap_grid.max[isom][i][j] / 10 - temperature_stations - .get(h).max[isom])) * dist; + float hmax = hrap_grid.max[isom][i][j]; + float tmax = temperature_stations.get(h).max[isom]; + temp = (temp + (hmax / 10 - tmax)) * dist;; } if (pcpn_time_step == 2) { - temp = (temp + (hrap_grid.min[isom][i][j] / 10 - temperature_stations - .get(h).min[isom])) * dist; + float hmin = hrap_grid.min[isom][i][j]; + float tmin = temperature_stations.get(h).min[isom]; + temp = (temp + (hmin / 10 - tmin)) * dist; } value = value + temp; diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/TopoCoord.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/TopoCoord.java index 058a375186..a048de1133 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/TopoCoord.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/TopoCoord.java @@ -36,9 +36,12 @@ import com.raytheon.viz.mpe.util.MapPrecipGagesGrid.Topo; *
      * 
      * SOFTWARE HISTORY
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * Feb 25, 2009            snaples     Initial creation
    + * Date         Ticket#    Engineer    	Description
    + * ------------ ---------- ----------- 	--------------------------
    + * Feb 25, 2009            snaples     	Initial creation
    + * Apr 16, 2012			   mgamazaychik	DR9602 - made changes how maxi and maxj are 
    + *									   	calculated to make the code consistent 
    + *										with A1
      * 
      * 
    * @@ -118,10 +121,11 @@ public class TopoCoord { * Determine the total number of longitude increments (in * minutes) and the total number of latitude increments. */ - maxi = (int) Math.ceil((total_lon / Float - .parseFloat(tokens[5]))); - maxj = (int) Math.ceil((total_lat / Float - .parseFloat(tokens[4]))); + /* + * DR9602 - made changes to make the code consistent with A1 + */ + maxi = (int) Math.ceil((total_lon / delta_lon)); + maxj = (int) Math.ceil((total_lat / delta_lat)); /* * Assign the latitude and longitude information read from diff --git a/cave/com.raytheon.viz.pointdata/com.raytheon.viz.pointdata.ecl b/cave/com.raytheon.viz.pointdata/com.raytheon.viz.pointdata.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.pointdata/plugin.xml b/cave/com.raytheon.viz.pointdata/plugin.xml index 0c8b38892c..75332bb6e2 100644 --- a/cave/com.raytheon.viz.pointdata/plugin.xml +++ b/cave/com.raytheon.viz.pointdata/plugin.xml @@ -1,20 +1,20 @@ diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotAlertParser.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotAlertParser.java index 00a582d0ea..e155670c48 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotAlertParser.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotAlertParser.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/cave/com.raytheon.viz.product.awips/com.raytheon.viz.product.awips.ecl b/cave/com.raytheon.viz.product.awips/com.raytheon.viz.product.awips.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.radar.feature/com.raytheon.viz.radar.feature.ecl b/cave/com.raytheon.viz.radar.feature/com.raytheon.viz.radar.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.radar/com.raytheon.viz.radar.ecl b/cave/com.raytheon.viz.radar/com.raytheon.viz.radar.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/RadarPlotInfoRetriever.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/RadarPlotInfoRetriever.java index 388d54cf8c..69760501bb 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/RadarPlotInfoRetriever.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/RadarPlotInfoRetriever.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/cave/com.raytheon.viz.redbook/com.raytheon.viz.redbook.ecl b/cave/com.raytheon.viz.redbook/com.raytheon.viz.redbook.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.satellite.feature/com.raytheon.viz.satellite.feature.ecl b/cave/com.raytheon.viz.satellite.feature/com.raytheon.viz.satellite.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.satellite/com.raytheon.viz.satellite.ecl b/cave/com.raytheon.viz.satellite/com.raytheon.viz.satellite.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.shapefile/com.raytheon.viz.shapefile.ecl b/cave/com.raytheon.viz.shapefile/com.raytheon.viz.shapefile.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.skewT/com.raytheon.viz.skewT.ecl b/cave/com.raytheon.viz.skewT/com.raytheon.viz.skewT.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.spi/com.raytheon.viz.spi.ecl b/cave/com.raytheon.viz.spi/com.raytheon.viz.spi.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.text.feature/com.raytheon.viz.text.feature.ecl b/cave/com.raytheon.viz.text.feature/com.raytheon.viz.text.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.texteditor/com.raytheon.viz.texteditor.ecl b/cave/com.raytheon.viz.texteditor/com.raytheon.viz.texteditor.ecl new file mode 100644 index 0000000000..e69de29bb2 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 a4d76370fc..325f9958a2 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 @@ -85,6 +85,11 @@ import com.raytheon.viz.ui.dialogs.ModeListener; * removed shellListener(). * Jun 03, 2011 9681 cjeanbap Changed list style. * Aug 12, 2011 10045 rferrel Now remembers screen location + * Mar 19, 2012 14624 mhuang Fixed problem of always retrieval of latest + * product when a number of alarm products + * with same afos pil but different issue + * times showed up in the product list of + * current alarm queue window. * * * @author mnash @@ -111,7 +116,7 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements private IQueryTransport queryTransport = null; private java.util.List prodList = null; - + private static CurrentAlarmQueue INSTANCE; private static Point closeLocation; @@ -355,9 +360,20 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements private void displayList() { String command = ""; + String alarmHHMM = ""; if (list != null && list.getItemCount() > 0 && list.getSelectionCount() > 0 && list.getSelection() != null) { command = list.getSelection()[0].split(" ")[0]; + + // Get issue time of current alarm product (DR_14624) + String headTime = list.getSelection()[0].split(" ")[5]; + String[] hdrTimeFields = null; + if (headTime != null) { + hdrTimeFields = headTime.split(":"); + } + if (hdrTimeFields.length >= 2) { + alarmHHMM = hdrTimeFields[0] + hdrTimeFields[1]; + } AlarmAlertLists.getInstance().getCurrentAlarms() .remove(list.getSelectionIndex()); list.remove(list.getSelectionIndex()); @@ -371,6 +387,32 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements if (command != "") { prods = produceTextProduct(command); } + + // Check incoming alarm product matching selected product from + // current Alarm Queue Window (DR_14624) + if (prods != null) { + if (prods.size() == 1) { + String inprod = null; + inprod = prods.get(0).getProduct(); + String[] prodLines = inprod.split("\n"); + String[] hdrFields = prodLines[0].split(" "); + String wmoId = hdrFields[0]; + String site = hdrFields[1]; + String hdrTime = hdrFields[2]; + String hhmm = hdrTime.substring(2); + String bbb = ""; + String awipsId = ""; + + // Use awips command to retrieve correct alarm product if it does + // not match (DR_14624) + if (!alarmHHMM.equals(hhmm)) { + String hdrDate = hdrTime.substring(0,2); + hdrTime = hdrDate.concat(alarmHHMM); + prods = getAwipsTextProduct(awipsId, wmoId, site, hdrTime, bbb); + } + } + } + if (alarmDisplayDlg == null) { alarmDisplayDlg = new AlarmDisplayWindow(shell, prods); alarmDisplayDlg.open(); @@ -516,6 +558,15 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements return prodList; } + /* + * get text product using wmo command (DR_14624) + */ + public java.util.List getAwipsTextProduct(String awipsId, + String wmoId, String site, String hdrTime, String bbb) { + ICommand cmd = CommandFactory.getAwipsCommand(awipsId, wmoId, site, hdrTime, bbb); + executeCommand(cmd); + return prodList; + } /* * (non-Javadoc) * diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/AWIPSHeaderBlockDlg.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/AWIPSHeaderBlockDlg.java old mode 100755 new mode 100644 diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java old mode 100755 new mode 100644 index a8575e9c50..ad6a4251cc --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java @@ -274,6 +274,7 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox; * for queued WarnGen and fixed autosave. * 11Nov2011 11552 rferrel Product no longer needs to be a RESEND in order to be sent. * 14Nov2011 11203 rferrel Header included when exporting a file while in edit mode. + * 08Mar2012 14553 mhuang Add blank line between product header and body. * * * @author lvenable @@ -4387,16 +4388,18 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, if (!Boolean.TRUE.equals(wgcd.getReturnValue())) { return; } - - String body = textEditor.getText(); + + // DR14553 (make upper case in product) + String body = textEditor.getText().toUpperCase(); if (result) { removeOptionalFields(); try { /* update the vtec string in the message */ + // DR14553 (make upper case in product) if (!resend) { body = VtecUtil.getVtec( - removeSoftReturns(textEditor.getText()), true); + removeSoftReturns(textEditor.getText().toUpperCase()), true); } updateTextEditor(body); if ((inEditMode || resend) && saveEditedProduct(false, resend)) { @@ -4620,6 +4623,27 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener, + statusBarLabel.getText().substring(startIndex); } + // DR_14553: Add blank line between product header and body if it + // does not exist in curren product + String[] results = productText.split("\n"); + int numLines = results.length; + String wmoHead = results[0]; + String awipsId = results[1]; + String thirdLine = results[2].trim(); + char[] charLine = thirdLine.toCharArray(); + int thirdLineSize = charLine.length; + String body = ""; + String line = ""; + if (thirdLineSize != 0) { + String header = wmoHead + "\n" + awipsId + "\n\n"; + body = header; + for (int i = 2; i< numLines; ++i) { + line = results[i]; + line += "\n"; + body = body.concat(line); + } + productText = body; + } storedProduct.setProduct(productText.trim()); /* diff --git a/cave/com.raytheon.viz.textworkstation/com.raytheon.viz.textworkstation.ecl b/cave/com.raytheon.viz.textworkstation/com.raytheon.viz.textworkstation.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.ui.personalities.awips/com.raytheon.viz.ui.personalities.awips.ecl b/cave/com.raytheon.viz.ui.personalities.awips/com.raytheon.viz.ui.personalities.awips.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.ui.tools.looping/com.raytheon.viz.ui.tools.looping.ecl b/cave/com.raytheon.viz.ui.tools.looping/com.raytheon.viz.ui.tools.looping.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.ui.tools.map/com.raytheon.viz.ui.tools.map.ecl b/cave/com.raytheon.viz.ui.tools.map/com.raytheon.viz.ui.tools.map.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.ui.tools.nav/com.raytheon.viz.ui.tools.nav.ecl b/cave/com.raytheon.viz.ui.tools.nav/com.raytheon.viz.ui.tools.nav.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.ui/com.raytheon.viz.ui.ecl b/cave/com.raytheon.viz.ui/com.raytheon.viz.ui.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.volumebrowser.feature/com.raytheon.viz.volumebrowser.feature.ecl b/cave/com.raytheon.viz.volumebrowser.feature/com.raytheon.viz.volumebrowser.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.volumebrowser/com.raytheon.viz.volumebrowser.ecl b/cave/com.raytheon.viz.volumebrowser/com.raytheon.viz.volumebrowser.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/LevelMappingFile.xml b/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/LevelMappingFile.xml index 61d10ce462..95e1a53c13 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/LevelMappingFile.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/volumebrowser/LevelMappingFile.xml @@ -1212,8 +1212,6 @@ levelTwoValue="0" /> - diff --git a/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/catalog/GridDataCatalog.java b/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/catalog/GridDataCatalog.java index afaf9cbc4a..66d2f6fd9e 100644 --- a/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/catalog/GridDataCatalog.java +++ b/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/catalog/GridDataCatalog.java @@ -59,15 +59,15 @@ import com.raytheon.viz.grid.rsc.GridResourceData; * *
      * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 11/29/2006   #7         brockwoo    Initial creation
    - * 12/05/2006   #98        brockwoo    Fix for the grid parameter list not
    - *                                     updating when only the model time
    - *                                     changes
    - * Aug 27, 2008 1502       dglazesk    Updated to use JAXB marshalling
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 11/29/2006   #7         brockwoo    Initial creation
    + * 12/05/2006   #98        brockwoo    Fix for the grid parameter list not
    + *                                     updating when only the model time
    + *                                     changes
    + * Aug 27, 2008 1502       dglazesk    Updated to use JAXB marshalling
      *                                     Switched to GridModel from plugin-grib
      * 
      * 
    diff --git a/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/vbui/ProductTableComp.java b/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/vbui/ProductTableComp.java index 6123fadab3..9fa6646035 100644 --- a/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/vbui/ProductTableComp.java +++ b/cave/com.raytheon.viz.volumebrowser/src/com/raytheon/viz/volumebrowser/vbui/ProductTableComp.java @@ -105,6 +105,8 @@ import com.vividsolutions.jts.geom.LineString; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jun 8, 2009 #2161 lvenable Initial creation + * Mar 27, 2012 #14506 Qinglu Lin For cross section plot along a line of + * latitude, swap xStart and xEnd. * * * @@ -935,8 +937,8 @@ public class ProductTableComp extends Composite implements IProductTable, new Coordinate(xEnd, yEnd) }); } else if (selectedPlaneKey.startsWith("Lat")) { double yEnd, yStart, xEnd, xStart; - xEnd = coverageRectangle.getMinX(); - xStart = coverageRectangle.getMaxX(); + xStart = coverageRectangle.getMinX(); + xEnd = coverageRectangle.getMaxX(); yEnd = Double.parseDouble(selectedPlaneKey.replace("Lat", "")); yStart = yEnd; diff --git a/cave/com.raytheon.viz.warngen.feature/com.raytheon.viz.warngen.feature.ecl b/cave/com.raytheon.viz.warngen.feature/com.raytheon.viz.warngen.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.warngen/com.raytheon.viz.warngen.ecl b/cave/com.raytheon.viz.warngen/com.raytheon.viz.warngen.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java index 575eec747f..369370bcaa 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Area.java @@ -64,6 +64,12 @@ import com.vividsolutions.jts.geom.Geometry; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov 15, 2007 #601 chammack Initial Creation. + * Mar 28, 2012 #14691 Qinglu lin Created AffectedAreas' partOfParentRegion based on + * FE_AREA stored in GeospatialData's attributes map, + * instead of calculating them. + * Apr 11, 2012 #14691 Qinglu lin Extra code were added to handle marine warnings as + * MarineZones shapefiles have no FE_AREA. + * Apr 13, 2012 #14691 Qinglu lin Added code for two more fe_area: er and nr. * * * @@ -166,8 +172,7 @@ public class Area { List uniqueFips = new ArrayList(); List areas = new ArrayList(); for (GeospatialData regionFeature : countyMap.values()) { - Geometry regionGeom = regionFeature.geometry; - Geometry parentGeom = regionFeature.parent.geometry; + Geometry regionGeom = regionFeature.geometry; AffectedAreas area = new AffectedAreas(); area.name = regionFeature.attributes.get(areaField).toString(); area.fips = regionFeature.attributes.get(fipsField).toString(); @@ -222,10 +227,68 @@ public class Area { if (parentRegion != null) { area.parentRegion = String.valueOf(parentRegion.attributes .get(parentAreaField)); - - area.partOfParentRegion = GisUtil.asStringList(GisUtil - .calculatePortion(parentGeom, regionGeom.getCentroid() - .getCoordinate())); + String feArea = (String)regionFeature.attributes.get("FE_AREA"); + final List partList = new ArrayList(); + if (feArea == null) { + // Marine warnings + partList.add(""); + } else { + if (feArea.equals("pa")) + partList.add("PA"); + else if(feArea.equals("mi")) + partList.add("MI"); + else if(feArea.equals("pd")) + partList.add("PD"); + else if(feArea.equals("up")) + partList.add("UP"); + else if(feArea.equals("bb")) + partList.add("BB"); + else if(feArea.equals("er")) + partList.add("ER"); + else if(feArea.equals("eu")) + partList.add("EU"); + else if(feArea.equals("sr")) + partList.add("SR"); + else if(feArea.equals("nr")) + partList.add("NR"); + else if(feArea.equals("wu")) + partList.add("WU"); + else if(feArea.equals("ds")) + partList.add("DS"); + else if(feArea.equals("ne")) + partList.add("NE"); + else if(feArea.equals("nw")) + partList.add("NW"); + else if(feArea.equals("se")) + partList.add("SE"); + else if(feArea.equals("sw")) + partList.add("SW"); + else { + for (int i=0; i * @@ -71,7 +73,23 @@ public class ClosestPoint implements Comparable { } - public ClosestPoint(String name, Coordinate point) { + public ClosestPoint(ClosestPoint o) { + this.name = o.name; + this.area = o.area; + this.parentArea = o.parentArea; + this.point = o.point; + this.distance = o.distance; + this.roundedDistance = o.roundedDistance; + this.azimuth = o.azimuth; + this.roundedAzimuth = o.roundedAzimuth; + this.oppositeAzimuth = o.oppositeAzimuth; + this.oppositeRoundedAzimuth = o.oppositeRoundedAzimuth; + this.population = o.population; + this.warngenlev = o.warngenlev; + this.time = o.time; + } + + public ClosestPoint(String name, Coordinate point) { this(name, point, 0, 0); } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java index 3767788c94..a9a566b14f 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java @@ -90,6 +90,9 @@ import com.vividsolutions.jts.geom.Point; * Nov 1, 2007 chammack Initial Creation. * Mar 01, 2012 DR13596 Qinglu Lin Call GisUtil.restoreAlaskaLon() * in getClosestPoints(). + * Apr 18, 2012 DR14733 Qinglu Lin David's fix is used, which creates another + * ClosestPoint object in the for loop + * that loops over availablePoints. * * * @@ -781,34 +784,34 @@ public class Wx { double distance = localDistanceGeom.distance(localPt); if (distance <= thresholdInMeters) { - // Set the distances - cp.distance = distance; - cp.roundedDistance = (int) metersToDistance - .convert(distance); - // check map of currently added points for closer point with // the same name ClosestPoint existingPt = nameMap.get(cp.name); - if (existingPt == null || cp.distance < existingPt.distance) { + if (existingPt == null || distance < existingPt.distance) { + // Set the distances + ClosestPoint cp2 = new ClosestPoint(cp); + cp2.distance = distance; + cp2.roundedDistance = (int) metersToDistance + .convert(distance); // No point by name or we are better at this location if (existingPt != null) { // There was an existing point, remove it pts.remove(existingPt); } GeodeticCalculator gc = new GeodeticCalculator(); - gc.setStartingGeographicPoint(cp.point.x, cp.point.y); + gc.setStartingGeographicPoint(cp2.point.x, cp2.point.y); Coordinate cen = distanceGeom.getCentroid() .getCoordinate(); cen = GisUtil.restoreAlaskaLon(cen); gc.setDestinationGeographicPoint(cen.x, cen.y); - cp.azimuth = gc.getAzimuth(); - cp.oppositeAzimuth = ClosestPoint - .adjustAngle(cp.azimuth + 180); - cp.roundedAzimuth = GeoUtil.roundAzimuth(cp.azimuth); - cp.oppositeRoundedAzimuth = ClosestPoint - .adjustAngle(cp.roundedAzimuth + 180); - nameMap.put(cp.name, cp); - pts.add(cp); + cp2.azimuth = gc.getAzimuth(); + cp2.oppositeAzimuth = ClosestPoint + .adjustAngle(cp2.azimuth + 180); + cp2.roundedAzimuth = GeoUtil.roundAzimuth(cp2.azimuth); + cp2.oppositeRoundedAzimuth = ClosestPoint + .adjustAngle(cp2.roundedAzimuth + 180); + nameMap.put(cp2.name, cp2); + pts.add(cp2); } } } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java index e1aa067dc7..28304d18e7 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java @@ -112,6 +112,8 @@ import com.vividsolutions.jts.geom.Polygon; * Apr 27, 2011 #9250 bkowal getStyle and getName are now used to * get the style and name associated with * a FontData object. + * Apr 16, 2012 #14515 Qinglu Lin Added return at the beginning of changeTemplate() + * if the newly selected product is same as current one. * * * @@ -1366,6 +1368,11 @@ public class WarngenDialog extends CaveSWTDialog implements * - The button that has been clicked */ private void changeTemplate(String templateName) { + + //DR 14515 + if (templateName.equals(warngenLayer.getTemplateName())) + return; + String lastAreaSource = warngenLayer.getConfiguration() .getGeospatialConfig().getAreaSource(); diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java index 8316e36f4c..5d2dd07340 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java @@ -136,6 +136,9 @@ import com.vividsolutions.jts.io.WKTReader; * May 4, 2010 mschenke Initial creation * 02/01/2012 DR 14491 D. Friedman Load/unload only the maps not already loaded * 02/28/2012 DR 13596 Qinglu Lin Call GisUtil.restoreAlaskaLon() in figurePoint(). + * 03/19/2012 DR 14690 Qinglu Lin While newHatchedArea==null, handle the polygon differently + * for initial warning and followup (CON); and + * convert ratio to percentage while doing comparison. * * * @@ -1124,6 +1127,7 @@ public class WarngenLayer extends AbstractStormTrackResource { try { double ratio = intersection.getArea() / geom.getArea(); + double ratioInPercent = ratio * 100.; Double areaOfGeom = (Double) f.attributes.get(AREA); double areaInKmSqOfIntersection = meterSqToKmSq .convert(areaOfGeom * ratio); @@ -1133,14 +1137,14 @@ public class WarngenLayer extends AbstractStormTrackResource { includeArea = areaInKmSqOfIntersection > 1; } else if (getConfiguration().getAreaConfig() .getInclusionAndOr().equalsIgnoreCase("AND")) { - if ((ratio >= getConfiguration().getAreaConfig() + if ((ratioInPercent >= getConfiguration().getAreaConfig() .getInclusionPercent()) && (areaInKmSqOfIntersection > getConfiguration() .getAreaConfig().getInclusionArea())) { includeArea = true; } } else { - if ((ratio >= getConfiguration().getAreaConfig() + if ((ratioInPercent >= getConfiguration().getAreaConfig() .getInclusionPercent()) || (areaInKmSqOfIntersection > getConfiguration() .getAreaConfig().getInclusionArea())) { @@ -1221,22 +1225,43 @@ public class WarngenLayer extends AbstractStormTrackResource { } } if (newHatchedArea == null) { - newHatchedArea = buildArea(getPolygon()); + boolean initialWarning = false; + String[] followUps = this.getConfiguration().getFollowUps(); + if (followUps.length == 0) + initialWarning = true; + else + for (String followup : followUps) { + if (followup.equals("NEW")) { + initialWarning = true; + break; + } + } + if (initialWarning) + state.clear2(); // not to hatch polygon for initial warning + else { + // Snap back for follow-ups + state.setWarningPolygon((Polygon) state + .getMarkedWarningPolygon().clone()); + newHatchedArea = latLonToLocal((Geometry) state + .getMarkedWarningArea().clone()); + state.resetMarked(); + updateWarnedAreas(snapHatchedAreaToPolygon, true); + } } else { - newHatchedArea = localToLatLon(newHatchedArea); + newHatchedArea = localToLatLon(newHatchedArea); + state.setWarningArea(newHatchedArea); + state.mark(newHatchedArea); + newHatchedArea = buildArea(getPolygon()); + // add "W" strings + if (determineInclusion) { + populateStrings(); + } } - state.setWarningArea(newHatchedArea); - state.mark(newHatchedArea); // Apply new hatched area state.geometryChanged = true; issueRefresh(); - // add "W" strings - if (determineInclusion) { - populateStrings(); - } - VizApp.runAsync(new Runnable() { public void run() { if (dialog != null) { diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenUIState.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenUIState.java index 4acdf6d95d..73a88b9a2f 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenUIState.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenUIState.java @@ -35,6 +35,7 @@ import com.vividsolutions.jts.geom.Polygon; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 7, 2010 mschenke Initial creation + * 03/14/2012 DR 14690 Qinglu Lin Add clear2(). * * * @@ -144,13 +145,23 @@ public class WarngenUIState { } public void clear() { - oldWarningArea = null; + warningPolygon = null; + clear2(); + } + + /** + * clear2 + * Same as clear(), except for not assigning null to warningPolygon. + * History + * 03-16-2012 Qinglu Lin DR14690 Created. + */ + public void clear2() { + oldWarningArea = null; oldWarningPolygon = null; oldWarningArea = null; oldWarningPolygon = null; strings.clear(); warningArea = null; - warningPolygon = null; markedWarningArea = null; markedWarningPolygon = null; } diff --git a/cave/com.raytheon.viz.warnings/com.raytheon.viz.warnings.ecl b/cave/com.raytheon.viz.warnings/com.raytheon.viz.warnings.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/AbstractWarningResource.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/AbstractWarningResource.java index 76761d8a06..da22ea3ddd 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/AbstractWarningResource.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/AbstractWarningResource.java @@ -67,6 +67,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; * May 3, 2011 jsanchez Initial creation * Aug 5, 2011 njensen Refactored maps * Aug 22, 2011 10631 njensen Major refactor + * 2012-04-16 DR 14866 D. Friedman Fix sampling error * * * @@ -351,8 +352,11 @@ public abstract class AbstractWarningResource extends AbstractWWAResource } // check if we are in the last frame boolean lastFrame = false; - int frameIdx = this.descriptor.getFramesInfo().getFrameIndex(); - DataTime[] frameTimes = this.descriptor.getFramesInfo().getFrameTimes(); + FramesInfo framesInfo = this.descriptor.getFramesInfo(); + int frameIdx = framesInfo.getFrameIndex(); + DataTime[] frameTimes = framesInfo.getFrameTimes(); + if (frameIdx < 0 || frameIdx >= frameTimes.length) + return "NO DATA"; DataTime time = frameTimes[frameIdx]; TimeRange framePeriod = null; diff --git a/cave/com.raytheon.viz.xdat/com.raytheon.viz.xdat.ecl b/cave/com.raytheon.viz.xdat/com.raytheon.viz.xdat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/ohd.hseb.common/ohd.hseb.common.ecl b/cave/ohd.hseb.common/ohd.hseb.common.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/ohd.hseb.fcstservice/ohd.hseb.fcstservice.ecl b/cave/ohd.hseb.fcstservice/ohd.hseb.fcstservice.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/ohd.hseb.ihfsdb/ohd.hseb.ihfsdb.ecl b/cave/ohd.hseb.ihfsdb/ohd.hseb.ihfsdb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/ohd.hseb.monitor/ohd.hseb.monitor.ecl b/cave/ohd.hseb.monitor/ohd.hseb.monitor.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cave/ohd.hseb.sshp/ohd.hseb.sshp.ecl b/cave/ohd.hseb.sshp/ohd.hseb.sshp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/com.facebook.thrift/com.facebook.thrift.ecl b/cots/com.facebook.thrift/com.facebook.thrift.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/com.mchange/com.mchange.ecl b/cots/com.mchange/com.mchange.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/com.opensymphony.ognl/com.opensymphony.ognl.ecl b/cots/com.opensymphony.ognl/com.opensymphony.ognl.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/com.sun.jna/com.sun.jna.ecl b/cots/com.sun.jna/com.sun.jna.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/com.sun.jndi.nis/com.sun.jndi.nis.ecl b/cots/com.sun.jndi.nis/com.sun.jndi.nis.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/edu.oswego/edu.oswego.ecl b/cots/edu.oswego/edu.oswego.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.activation/javax.activation.ecl b/cots/javax.activation/javax.activation.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.jms/javax.jms.ecl b/cots/javax.jms/javax.jms.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.mail/javax.mail.ecl b/cots/javax.mail/javax.mail.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.measure/javax.measure.ecl b/cots/javax.measure/javax.measure.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.media.opengl.linux32/javax.media.opengl.linux32.ecl b/cots/javax.media.opengl.linux32/javax.media.opengl.linux32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.media.opengl.linux64/javax.media.opengl.linux64.ecl b/cots/javax.media.opengl.linux64/javax.media.opengl.linux64.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.media.opengl.win32/javax.media.opengl.win32.ecl b/cots/javax.media.opengl.win32/javax.media.opengl.win32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.media.opengl/javax.media.opengl.ecl b/cots/javax.media.opengl/javax.media.opengl.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.persistence/javax.persistence.ecl b/cots/javax.persistence/javax.persistence.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/javax.vecmath/javax.vecmath.ecl b/cots/javax.vecmath/javax.vecmath.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/ncsa.hdf5.linux32/ncsa.hdf5.linux32.ecl b/cots/ncsa.hdf5.linux32/ncsa.hdf5.linux32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/ncsa.hdf5.win32/ncsa.hdf5.win32.ecl b/cots/ncsa.hdf5.win32/ncsa.hdf5.win32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/ncsa.hdf5/ncsa.hdf5.ecl b/cots/ncsa.hdf5/ncsa.hdf5.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/net.sf.cglib/net.sf.cglib.ecl b/cots/net.sf.cglib/net.sf.cglib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/net.sf.ehcache/net.sf.ehcache.ecl b/cots/net.sf.ehcache/net.sf.ehcache.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/net.sf.swtaddons/net.sf.swtaddons.ecl b/cots/net.sf.swtaddons/net.sf.swtaddons.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.activemq/org.apache.activemq.ecl b/cots/org.apache.activemq/org.apache.activemq.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.batik/org.apache.batik.ecl b/cots/org.apache.batik/org.apache.batik.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.camel/org.apache.camel.ecl b/cots/org.apache.camel/org.apache.camel.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.beanutils/org.apache.commons.beanutils.ecl b/cots/org.apache.commons.beanutils/org.apache.commons.beanutils.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.cli/org.apache.commons.cli.ecl b/cots/org.apache.commons.cli/org.apache.commons.cli.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.codec/org.apache.commons.codec.ecl b/cots/org.apache.commons.codec/org.apache.commons.codec.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.collections/org.apache.commons.collections.ecl b/cots/org.apache.commons.collections/org.apache.commons.collections.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.configuration/org.apache.commons.configuration.ecl b/cots/org.apache.commons.configuration/org.apache.commons.configuration.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.digester/org.apache.commons.digester.ecl b/cots/org.apache.commons.digester/org.apache.commons.digester.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.lang/org.apache.commons.lang.ecl b/cots/org.apache.commons.lang/org.apache.commons.lang.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.logging/org.apache.commons.logging.ecl b/cots/org.apache.commons.logging/org.apache.commons.logging.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.management/org.apache.commons.management.ecl b/cots/org.apache.commons.management/org.apache.commons.management.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.pool/org.apache.commons.pool.ecl b/cots/org.apache.commons.pool/org.apache.commons.pool.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.commons.validator/org.apache.commons.validator.ecl b/cots/org.apache.commons.validator/org.apache.commons.validator.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.http/org.apache.http.ecl b/cots/org.apache.http/org.apache.http.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.log4j/org.apache.log4j.ecl b/cots/org.apache.log4j/org.apache.log4j.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.mina/org.apache.mina.ecl b/cots/org.apache.mina/org.apache.mina.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.qpid/org.apache.qpid.ecl b/cots/org.apache.qpid/org.apache.qpid.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.tomcat.nativ/org.apache.tomcat.nativ.ecl b/cots/org.apache.tomcat.nativ/org.apache.tomcat.nativ.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.tools.bzip2/org.apache.tools.bzip2.ecl b/cots/org.apache.tools.bzip2/org.apache.tools.bzip2.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.apache.velocity/org.apache.velocity.ecl b/cots/org.apache.velocity/org.apache.velocity.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.dom4j/org.dom4j.ecl b/cots/org.dom4j/org.dom4j.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.eclipse.jetty/org.eclipse.jetty.ecl b/cots/org.eclipse.jetty/org.eclipse.jetty.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.geotools/org.geotools.ecl b/cots/org.geotools/org.geotools.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.hibernate/org.hibernate.ecl b/cots/org.hibernate/org.hibernate.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.jboss.cache/org.jboss.cache.ecl b/cots/org.jboss.cache/org.jboss.cache.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.jep.linux32/libjep.so b/cots/org.jep.linux32/libjep.so old mode 100755 new mode 100644 diff --git a/cots/org.jep.linux32/org.jep.linux32.ecl b/cots/org.jep.linux32/org.jep.linux32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.jep.linux64/libjep.so b/cots/org.jep.linux64/libjep.so old mode 100755 new mode 100644 diff --git a/cots/org.jep.linux64/org.jep.linux64.ecl b/cots/org.jep.linux64/org.jep.linux64.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.jep.win32/org.jep.win32.ecl b/cots/org.jep.win32/org.jep.win32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.jep/org.jep.ecl b/cots/org.jep/org.jep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.jivesoftware.smack/org.jivesoftware.smack.ecl b/cots/org.jivesoftware.smack/org.jivesoftware.smack.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.junit/org.junit.ecl b/cots/org.junit/org.junit.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.objectweb/org.objectweb.ecl b/cots/org.objectweb/org.objectweb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.postgres/org.postgres.ecl b/cots/org.postgres/org.postgres.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.slf4j/org.slf4j.ecl b/cots/org.slf4j/org.slf4j.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.springframework.dm/org.springframework.dm.ecl b/cots/org.springframework.dm/org.springframework.dm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/org.springframework/org.springframework.ecl b/cots/org.springframework/org.springframework.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/ucar.nc2/ucar.nc2.ecl b/cots/ucar.nc2/ucar.nc2.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cots/uk.ltd.getahead/uk.ltd.getahead.ecl b/cots/uk.ltd.getahead/uk.ltd.getahead.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deltaScripts/deltaScripts.ecl b/deltaScripts/deltaScripts.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/build.edex/build.edex.ecl b/edexOsgi/build.edex/build.edex.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm index 619a22cd8f..8050df9ff7 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm @@ -1,4 +1,5 @@ ##### UPDATED 3/2/12 12.2.1-4 BY EVAN BOOKBINDER +##### Qinglu Lin 04-04-2012 DR 14691. #* #################################################################################################### @@ -253,6 +254,39 @@ SOUTH## EXTREME ## #end #end +#if($list.contains($directionSet, "PA")) +THE PANHANDLE OF## +#end +#if($list.contains($directionSet, "MI")) +MIDDLE## +#end +#if($list.contains($directionSet, "PD")) +THE PIEDMONT OF## +#end +#if($list.contains($directionSet, "UP")) +UPSTATE## +#end +#if($list.contains($directionSet, "BB")) +BIG BEND## +#end +#if($list.contains($directionSet, "ER")) +EAST CENTRAL UPPER## +#end +#if($list.contains($directionSet, "EU")) +EASTERN UPPER## +#end +#if($list.contains($directionSet, "SR")) +SOUTH CENTRAL UPPER## +#end +#if($list.contains($directionSet, "NR")) +NORTH CENTRAL UPPER## +#end +#if($list.contains($directionSet, "WU")) +WESTERN UPPER## +#end +#if($list.contains($directionSet, "DS")) +DEEP SOUTH## +#end #if($list.contains($directionSet, "NORTH")) NORTH## #end @@ -264,6 +298,18 @@ EAST## #end #if($list.contains($directionSet, "WEST")) WEST## +#end +#if($list.contains($directionSet, "NE")) +NORTHEAST## +#end +#if($list.contains($directionSet, "NW")) +NORTHWEST## +#end +#if($list.contains($directionSet, "SE")) +SOUTHEAST## +#end +#if($list.contains($directionSet, "SW")) +SOUTHWEST## #end #if($useCentral && $list.contains($directionSet, "CENTRAL")) #if ($list.contains($directionSet, "NORTH") || $list.contains($directionSet, "SOUTH") || $list.contains($directionSet, "EAST") ||$list.contains($directionSet, "WEST")) diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml index 1d4bac0d0d..a94cae4b68 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml @@ -5,6 +5,8 @@ Mike Dangelo 01-25-2012 at CRH TIM Evan Bookbinder 2-24-2012 for OB12.2.1 Phil Kurimski 2-28-2012 for OB12.2.1-3 + Qinglu Lin 04-04-2012 DR 14691. Added tag. + --> @@ -204,6 +206,7 @@ COUNTYNAME NAME STATE + FE_AREA countyTypes.txt FIPS NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml index 4d0fe2281b..231d017250 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml @@ -5,6 +5,7 @@ Mike and Phil 01-25-2012 at CRH TIM Evan Bookbinder 09-16-2011 for OB11.8.0-8 Phil Kurimski 03-02-2012 for OB12.1.1-4 + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -166,6 +167,7 @@ COUNTYNAME NAME STATE + FE_AREA countyTypes.txt FIPS NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml index 5ac13ae050..9ef695da9c 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml @@ -2,7 +2,9 @@ + Phil Kurimski 2-29-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> @@ -197,6 +199,7 @@ STATE_ZONE NAME STATE + FE_AREA countyTypes.txt NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml index 9ebaa9cafb..07185126ab 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml @@ -2,7 +2,9 @@ + Phil Kurimski 2-29-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> @@ -249,6 +251,7 @@ STATE_ZONE NAME STATE + FE_AREA countyTypes.txt NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml index dfa51957e9..d18790cbec 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml @@ -3,7 +3,8 @@ Mike Dangelo 09-19-2011 at TIM Alaska Mike Dangelo 01-25-2012 at CRH TIM Evan Bookbinder 2-24-2012 - Phil Kurimski 2-28-2012 + Phil Kurimski 2-28-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -236,6 +237,7 @@ COUNTYNAME NAME STATE + FE_AREA countyTypes.txt FIPS NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml index 11c69f5810..145045990e 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml @@ -3,6 +3,7 @@ Edited by Mike Dangelo 01-25-2012 at CRH TIM Edited by Evan Bookbinder 2-24-2012 Edited by Phil Kurimski 2-28-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -181,6 +182,7 @@ NAME STATE + FE_AREA countyTypes.txt NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup_Zones.xml index c510be1645..efe8e417bd 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup_Zones.xml @@ -2,7 +2,9 @@ + Phil Kurimski 2-29-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> @@ -214,6 +216,7 @@ STATE_ZONE NAME STATE + FE_AREA countyTypes.txt NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml index 172aecd894..ebd55fe99d 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml @@ -2,7 +2,9 @@ + Phil Kurimski 2-29-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> @@ -257,6 +259,7 @@ STATE_ZONE NAME STATE + FE_AREA countyTypes.txt NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/customTemplate.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/customTemplate.xml index 4524a1bc49..c96e01abc3 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/customTemplate.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/customTemplate.xml @@ -1,3 +1,6 @@ + + @@ -96,6 +99,7 @@ COUNTYNAME NAME STATE + FE_AREA countyTypes.txt FIPS NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/damInfoBullet.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/damInfoBullet.xml old mode 100755 new mode 100644 diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/damInfoBulletName.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/damInfoBulletName.xml old mode 100755 new mode 100644 diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml index 8d6cef67e6..9fd918e725 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml @@ -1,5 +1,6 @@ @@ -111,6 +112,7 @@ COUNTYNAME NAME STATE + FE_AREA countyTypes.txt FIPS NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml index fbceee500e..9a99fb309d 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml @@ -1,6 +1,7 @@ @@ -121,6 +122,7 @@ COUNTYNAME NAME STATE + FE_AREA countyTypes.txt FIPS NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/ffwfaw.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/ffwfaw.xml index cc65a3e41f..fc06317912 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/ffwfaw.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/ffwfaw.xml @@ -2,6 +2,7 @@ @@ -255,6 +256,7 @@ NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml index 8d51784bf2..31f40e99ac 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml @@ -5,6 +5,7 @@ Modified by Phil Kurimski 09-23-2011 for burn scars and mud slides Modified by Mike Dangelo 01-25-2012 at CRH TIM Modified by Mike Dangelo 02-23-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -217,6 +218,7 @@ NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml index 808deac39d..bae885e23f 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml @@ -5,6 +5,7 @@ Modified by Mike Dangelo 01-25-2012 at CRH TIM Modified by Mike Dangelo 02-23-2012 Modified by Phil Kurimski 3-02-2012 OB12.2.1-4 + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -176,6 +177,7 @@ NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml index d256f5ef36..6fb1a163a6 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml @@ -2,7 +2,9 @@ + Phil Kurimski 2-29-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> @@ -180,6 +182,7 @@ NAME NAME STATE + FE_AREA countyTypes.txt STATE_ZONE diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml index facef76c93..693ea1ad18 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml @@ -4,7 +4,9 @@ + Phil Kurimski 2-29-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> @@ -213,6 +215,7 @@ NAME NAME STATE + FE_AREA countyTypes.txt STATE_ZONE diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml index e485bf5935..d92fc21ff2 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml @@ -3,7 +3,9 @@ + Modified Phil Kurimski 01-26-2012 OB 12.1.1-1 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> mi @@ -273,6 +275,7 @@ NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml index 38f88b2d61..682fe1cfd8 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml @@ -2,7 +2,9 @@ + Modified Phil Kurimski 01-26-2012 OB 12.1.1-1 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> @@ -300,6 +302,7 @@ NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml index 2f5716c271..218996ec53 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml @@ -4,6 +4,7 @@ Modified Phil Kurimski 09-23-2011 OB 11.0.8-8 Modified Phil Kurimski 01-26-2012 OB 12.1.1-1 Modified Phil Kurimski 02-29-2012 OB 12.2.1-3 + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -302,6 +303,7 @@ NAME NAME STATE + FE_AREA countyTypes.txt STATE_ZONE diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml index b0545a41b4..267fadbb12 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml @@ -4,7 +4,9 @@ Modified Evan Bookbinder 09-16-2011 OB 11.0.8-8 Modified Phil Kurimski 09-21-2011 OB 11.0.8-8 Modified Phil Kurimski 01-26-2012 OB 12.1.1-1 - Modified Phil Kurimski 02-29-2012 OB 12.2.1-3 --> + Modified Phil Kurimski 02-29-2012 OB 12.2.1-3 + Qinglu Lin 04-04-2012 DR 14691. Added tag. +--> mi @@ -273,6 +275,7 @@ NAME NAME STATE + FE_AREA countyTypes.txt STATE_ZONE diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml index e2a16626bf..60241e67ed 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml @@ -6,6 +6,7 @@ 9-17-2011 Merge in OB11.8.0-8 NEW XML SYNTAX CHANGES Mike Dangelo WFO CTP 9-22-2011 to add in remarks and lines which will allow Zone-based products (Alaska TIM) Phil Kurimski WFO DTX 2-28-2012 to fix parse string issues + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -202,6 +203,7 @@ NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml index 57c3614fd7..a80e071ac7 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml @@ -5,6 +5,7 @@ Mike Dangelo WFO CTP 9-22-2011 to add in remarks and lines which will allow Zone-based products (Alaska TIM) EVAN BOOKBINDER WFO EAX 11-4-2011 removed bulletDefaults that prevented auto selection EVAN BOOKBINDER WFO EAX 2-24-2012 corrected parseString errors that prevented auto selection + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml index 88edc1bde3..36aa500757 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml @@ -1,7 +1,9 @@ - + @@ -138,6 +140,7 @@ NAME NAME STATE + FE_AREA countyTypes.txt STATE_ZONE diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml index 398ca991df..153b333332 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml @@ -5,6 +5,7 @@ 9-15-2011 Merge in OB11.8.0-8 Coding Changes, Zone Codes Mike Dangelo 02-27-2012 minor tweaks Phil Kurimski 3-01-2012 + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -137,6 +138,7 @@ NAME NAME STATE + FE_AREA countyTypes.txt STATE_ZONE diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml index a9500f8f79..b006fecc36 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml @@ -1,6 +1,7 @@ @@ -78,6 +79,7 @@ NAME NAME STATE + FE_AREA countyTypes.txt STATE_ZONE NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/sws_county.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/sws_county.xml index c6f1b6eebd..8c0112aa8a 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/sws_county.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/sws_county.xml @@ -1,4 +1,6 @@ + @@ -68,6 +70,7 @@ COUNTYNAME NAME STATE + FE_AREA countyTypes.txt FIPS NAME diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml index 99ea8b582f..049f1729d4 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml @@ -6,6 +6,7 @@ 9-15-2011 Merge in OB11.8.0-8 NEW XML SYNTAX CHANGES Mike Dangelo WFO CTP 9-22-2011 to add in remarks and lines which will allow Zone-based products (Alaska TIM) EVAN BOOKBINDER WFO EAX 2-24-2012 corrected parseString errors that prevented auto selection + Qinglu Lin 04-04-2012 DR 14691. Added tag. --> @@ -190,6 +191,7 @@ NAME STATE + FE_AREA countyTypes.txt FIPS diff --git a/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py b/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py index 068e8be862..510d2f736e 100644 --- a/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py +++ b/edexOsgi/build.edex/esb/data/utility/edex_static/base/config/gfe/serverConfig.py @@ -1,1880 +1,1880 @@ -## -# 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. -## -# NOTE: THIS FILE SHOULD NOT BE USER-MODIFIED. INSTEAD REFER TO THE -# LOCAL CONFIG DOCUMENTATION ON HOW TO OVERRIDE SETTINGS IN THIS FILE. - -#---------------------------------------------------------------------------- -# USEFUL DEFINES -#---------------------------------------------------------------------------- -#import siteConfig, LogStream, config, imp -import siteConfig,imp - -BASELINE = getattr(siteConfig, 'BASELINE', 0) - -# imports the named module. If the module -# does not exist, it is just ignored. But -# if it exists and has an error, the exception -# is thrown. If the module was imported returns -# true. -def siteImport(modName): - try: - fp, path, des = imp.find_module(modName) - if fp: - fp.close() - except ImportError: - return 0 - globals()[modName] = __import__(modName) - return 1 - -GFESUITE_SITEID = siteConfig.GFESUITE_SITEID -GFESUITE_MHSID = siteConfig.GFESUITE_MHSID -GFESUITE_SERVER = siteConfig.GFESUITE_SERVER -GFESUITE_HOME = siteConfig.GFESUITE_HOME -GFESUITE_PORT = int(siteConfig.GFESUITE_PORT) -#GFESUITE_DATDIR = siteConfig.GFESUITE_DATDIR -GFESUITE_LOGDIR = siteConfig.GFESUITE_LOGDIR -GFESUITE_PRDDIR = siteConfig.GFESUITE_PRDDIR -#GFESUITE_SHPDIR = siteConfig.GFESUITE_SHPDIR -#GFESUITE_TOPODIR = siteConfig.GFESUITE_TOPODIR -#GFESUITE_VTECDIR = siteConfig.GFESUITE_VTECDIR - -SID = GFESUITE_SITEID - -ALASKA_SITES = ['AFG', 'AJK', 'AICE', 'ALU', 'AER', 'ACR', 'AFC'] -GreatLake_SITES = ['LOT', 'MKX', 'GRB', 'DLH', 'MQT', 'APX', 'GRR', 'DTX', - 'IWX', 'CLE', 'BUF', 'PBZ', 'ILM', 'IND', 'ILX', 'MPX', 'FGF'] -CONUS_EAST_SITES = ['ALY', 'AKQ', 'APX', 'BGM', 'BMX', 'BOX', 'BTV', 'BUF', - 'CAE', 'CAR', 'CHS', 'CLE', 'CTP', 'DTX', 'FFC', 'GRR', - 'GSP', 'GYX', 'ILM', 'ILN', 'IND', 'JAN', 'JAX', 'JKL', - 'LCH', 'LMK', 'LWX', 'MEG', 'MFL', 'MHX', 'MLB', 'MOB', - 'MQT', 'MRX', 'OKX', 'PAH', 'PBZ', 'PHI', 'RAH', 'RLX', - 'RNK', 'TAE', 'TBW', 'ALR', 'RHA', 'TAR', 'TIR'] -RFC_SITES = ["ACR", "FWR", "KRF", "MSR", "ORN", "PTR", - "RHA", "RSA", "STR", "TAR", "TIR", "TUA"] - -#--------------------------------------------------------------------------- -# -# Weather Element configuration section. -# -#--------------------------------------------------------------------------- - -SCALAR = 'Scalar' -VECTOR = 'Vector' -WEATHER = 'Weather' -DISCRETE = 'Discrete' -YES = 1 -NO = 0 - -#SCALAR, VECTOR -# name/type/units/description/max/min/precision/rateParm/ -#WEATHER -# name/WEATHER/units/description/ -#DISCRETE -# keyDef = [(keySym, keyDesc), (keySym, keyDesc)] -# name/DISCRETE/units/description/overlapCapable/keyDef/ - -# Standard Public Weather Elements -SID = GFESUITE_SITEID -Temp = ("T", SCALAR, "F", "Surface Temperature", 120.0, -80.0, 0, NO) -Td = ("Td", SCALAR, "F", "Dewpoint", 120.0, -80.0, 0, NO) -MaxT = ("MaxT", SCALAR, "F", "Maximum Temperature", 120.0, -80.0, 0, NO) -MinT = ("MinT", SCALAR, "F", "Minimum Temperature", 120.0, -80.0, 0, NO) -HeatIndex = ("HeatIndex", SCALAR, "F", "Heat Index", 130.0, -80.0, 0, NO) -WindChill = ("WindChill", SCALAR, "F", "Wind Chill", 120.0, -120.0, 0, NO) -QPF = ("QPF", SCALAR, "in", "QPF", 5.0, 0.0, 2, YES) -Wind = ("Wind", VECTOR, "kts", "Surface Wind", 125.0, 0.0, 0, NO) -# special for TPC hurricane winds -HiWind = ("Wind", VECTOR, "kts", "Surface Wind", 200.0, 0.0, 0, NO) -Weather = ("Wx", WEATHER, "wx", "Weather") -IceAcc = ("IceAccum", SCALAR, "in", "Ice Accumulation", 12.0, 0.0, 1, YES) -SnowAmt = ("SnowAmt", SCALAR, "in", "Snowfall amount", 20.0, 0.0, 1, YES) -StormTotalSnow = ("StormTotalSnow", SCALAR, "in","Storm Total Snow", 50.0, - 0.0, 1, YES) -PoP = ("PoP", SCALAR, "%", "Prob of Precip", 100.0, 0.0, 0, NO) -PoP6 = ("PoP6", SCALAR, "%", "Prob of Precip (6hr)", 100.0, 0.0, 0, NO) -PoP12 = ("PoP12", SCALAR, "%", "Prob of Precip (12hr)", 100.0, 0.0, 0, NO) -TstmPrb3 = ("TstmPrb3", SCALAR, "%", "Prob of Tstorm (3hr)", 100.0, 0.0, 0, NO) -TstmPrb6 = ("TstmPrb6", SCALAR, "%", "Prob of Tstorm (6hr)", 100.0, 0.0, 0, NO) -TstmPrb12 = ("TstmPrb12", SCALAR, "%", "Prob of Tstorm (12hr)", 100.0, 0.0, 0, - NO) -Sky = ("Sky", SCALAR, "%", "Sky Condition", 100.0, 0.0, 0, NO) -FzLevel = ("FzLevel", SCALAR, "ft", "Freezing level", 30000.0, 0.0, 0, NO) -SnowLevel = ("SnowLevel", SCALAR, "ft", "Snow Level", 18000.0, 0.0, 0, NO) -RH = ("RH", SCALAR, "%", "Relative Humidity", 100.0, 0.0, 0, NO) - -# DR20541 and 20482 - add collaborate PoP, SnowAmt, QPF and ndfd QPF tools -PoP12hr = ("PoP12hr", SCALAR, "%", "12 hr Chance of Precip", 100.0, 0.0, 0, NO) -QPF6hr = ("QPF6hr", SCALAR, "in", "6 hr Precipitation (in)", 5.0, 0.0, 2, YES) -SnowAmt6hr = ("SnowAmt6hr", SCALAR, "in", "6 hr Snowfall", 30.0, 0.0, 1, YES) - -# Cobb SnowTool included. -SnowRatio = ('SnowRatio', SCALAR, '%', 'Snow Ratio', 40.0, 0.0, 1, YES) -#totalVV = ('totalVV', SCALAR, 'ubar/s', 'Total VV', 400.0, 0.0, 0, YES) -cape = ("cape", SCALAR, "1unit", "CAPE", 8000.0, 0.0, 1, NO) -ApparentT = ("ApparentT", SCALAR, "F", "Apparent Temperature", 130.0, -120.0, 0, NO) -UWaveDir = ("UWaveDir", SCALAR, "m/s", "U WaveDir Comp", 0.50, -0.50, 3, NO) -VWaveDir = ("VWaveDir", SCALAR, "m/s", "V WaveDir Comp", 0.50, -0.50, 3, NO) -LkSfcT = ("LkSfcT", SCALAR, "C", "Lake Surface T", 40.0, -2.0, 1, NO) -SnowMap = ("SnowMap", SCALAR, "in", "Snowfall Map", 20.0, 0.0, 1, YES) -WaveDir = ("WaveDir", VECTOR, "m/s", "Wave Direction", 5.0, 0.0, 2, NO) -StormTotalQPF = ('StormTotalQPF', SCALAR, 'in', 'Storm Total QPF (in)', 10.0, 0.0, 2, YES) -SeasonTotalSnow = ('SeasonTotalSnow', SCALAR, 'in', 'Season Total Snow (in)', 150.0, 0.0, 2, YES) - -# Marine Weather Elements -WindWaveHeight = ("WindWaveHgt", SCALAR, "ft", "Wind Wave Height", - 100.0, 0.0, 0, NO) -WaveHeight = ("WaveHeight", SCALAR, "ft", "Total Wave Height", - 100.0, 0.0, 0, NO) -Swell = ("Swell", VECTOR, "ft", "Primary Swell", 100.0, 0.0, 0, NO) -Swell2 = ("Swell2", VECTOR, "ft", "Secondary Swell", 100.0, 0.0, 0, NO) -Period = ("Period", SCALAR, "sec", "Primary Period", 20.0, 0.0, 0, NO) -Period2 = ("Period2", SCALAR, "sec", "Secondary Period", 20.0, 0.0, 0, NO) -WindGust = ("WindGust", SCALAR, "kts", "Wind Gust", 125.0, 0.0, 0, NO) -IceCoverage = ("IceCoverage", SCALAR, "%", "Ice Coverage Amount", - 100.0, 0.0, 0, NO) -SurfHeight = ("SurfHeight", SCALAR, "ft", "Total Wave Height", - 100.0, 0.0, 0, NO) -##########DCS3499 -SigWaveHgt = ("SigWaveHgt", SCALAR, "ft", - "Significant wave height of combined wind waves and swells", - 30.0, 0.0, 0, NO) -WindWaveHgt = ("WindWaveHgt", SCALAR, "ft", "Significant wave height of wind waves", - 30.0, 0.0, 0, NO) -WindWavePeriod = ("WindWavePeriod", SCALAR, "sec.", "Wind wave peak period", 20.0, 0.0, 0, NO) -WindWaveDir = ("WindWaveDir", VECTOR, "degree", "Direction of wind waves", 100.0, 0.0, 0, NO) - -# Fire Weather Weather Elements -LAL = ("LAL", SCALAR, "cat", "Lightning Activity Level", 6.0, 1.0, 0, NO) -CWR = ("CWR", SCALAR, "%", "Chance of Wetting Rain", 100.0, 0.0, 0, NO) -Haines = ("Haines", SCALAR, "cat", "Haines Index", 6.0, 2.0, 0, NO) -MixHgt = ("MixHgt", SCALAR, "ft", "Mixing Height", 20000.0, 0.0, 0, NO) -Wind20ft = ("Wind20ft", VECTOR, "kts", "20ft. Wind", 125.0, 0.0, 0, NO) -FreeWind = ("FreeWind", VECTOR, "kts", "Free Air Wind", 125.0, 0.0, 0, NO) -TransWind = ("TransWind", VECTOR, "kts", "Transport Wind", 125.0, 0.0, 0, NO) -Stability = ("Stability",SCALAR,"cat","Stability", 6.0,1.0,0, NO) -HrsOfSun = ("HrsOfSun",SCALAR,"hrs","Hours of Sun",24.0,0.0,1, YES) -MarineLayer = ("MarineLayer",SCALAR,"ft","Depth of Marine Layer", - 20000.0,0.0,0,NO) -InvBurnOffTemp = ("InvBurnOffTemp",SCALAR,"F","Inversion Burn-off Temperature", - 120.0,-30.0,0, NO) -VentRate = ("VentRate", SCALAR, "kt*ft", "VentRate", 500000.0, 0.0, 0, NO) -DSI = ("DSI", SCALAR, "index", "DSI", 6.0, 0.0, 0, NO) -MaxRH = ("MaxRH", SCALAR, "%", "Maximum Relative Humidity", - 100.0, 0.0, 0, NO) -MinRH = ("MinRH", SCALAR, "%", "Minimum Relative Humidity", - 100.0, 0.0, 0, NO) -Wetflag = ("Wetflag", SCALAR, "yn", "1300LT WetFlag", 1.0, 0.0, 0, NO) -Ttrend = ("Ttrend", SCALAR, "F", "24hr Temperature Trend", 50.0, -50.0, 0, NO) -RHtrend = ("RHtrend", SCALAR, "F", "24hr Relative Humidity Trend", - 100.0, -100.0, 0, NO) - -# HPC Delta weather elements -DeltaMinT = ("DeltaMinT", SCALAR, "F", "Delta Minimum Temperature", - 50.0, -50.0, 0, NO) -DeltaMaxT = ("DeltaMaxT", SCALAR, "F", "Delta Maximum Temperature", - 50.0, -50.0, 0, NO) -DeltaWind = ("DeltaWind", VECTOR, "kts", "Surface Delta Wind", - 125.0, 0.0, 0, NO) -DeltaSky = ("DeltaSky", SCALAR, "%", "Delta Sky Condition", - 100.0, -100.0, 0, NO) -DeltaPoP = ("DeltaPoP", SCALAR, "%", "Delta Prob of Precip", - 100.0, -100.0, 0, NO) - -# Special LAPS parms -Radar = ("Radar", SCALAR, "dbz", "Radar Reflectivity", 80.0, -20.0, 0, NO) - -# RTMA parms -QPE = ("QPE", SCALAR, "in", "QPE", 5.0, 0.0, 2, YES) -#if SID in ALASKA_SITES: - not sure if this needs to be like that -if SID in ALASKA_SITES or SID in ["HFO", "SJU"]: - TUnc = ("TUnc", SCALAR, "F", "Temperature Anl Uncertainty", 20.0, 0.0, 0, NO) - TdUnc = ("TdUnc", SCALAR, "F", "Dewpoint Anl Uncertainty", 25.0, 0.0, 0, NO) -else: - TUnc = ("TUnc", SCALAR, "F", "Temperature Anl Uncertainty", 10.0, 0.0, 0, NO) - TdUnc = ("TdUnc", SCALAR, "F", "Dewpoint Anl Uncertainty", 15.0, 0.0, 0, NO) -WSpdUnc = ("WSpdUnc", SCALAR, "kts", "WSpd Anl Uncertainty", 12.0, 0.0, 0, NO) -WDirUnc = ("WDirUnc", SCALAR, "deg", "WDir Anl Uncertainty", 10.0, 0.0, 0, NO) - -# NamDNG5 parms -QPF3 = ("QPF3", SCALAR, "in", "3HR QPF", 3.0, 0.0, 2, YES) -QPF6 = ("QPF6", SCALAR, "in", "6HR QPF", 5.0, 0.0, 2, YES) -QPF12 = ("QPF12", SCALAR, "in", "12HR QPF", 10.0, 0.0, 2, YES) -Vis = ("Vis", SCALAR, "SM", "Visibility", 10.0, 0.0, 2, NO) -SnowAmt6 = ("SnowAmt6", SCALAR, "in", "Snowfall amount (6hr)", 20.0, 0.0, 1, YES) - -MaxT3 = ("MaxT3", SCALAR, "F", "3hr Maximum Temperature", 120.0, -80.0, 0, NO) -MinT3 = ("MinT3", SCALAR, "F", "3hr Minimum Temperature", 120.0, -80.0, 0, NO) -MaxRH3 = ("MaxRH3", SCALAR, "%", "3hr Maximum Relative Humidity", 100.0, 0.0, 0, NO) - -# Parms for Satellite -SatVisE = ("VisibleE", SCALAR, "count", "Satellite Albdo %", - 255.0, 0.0, 0, NO) -SatIR11E = ("IR11E", SCALAR, "C", "11 micron temperature", 58.0, -111.0, 0, NO) -SatIR13E = ("IR13E", SCALAR, "C", "13 micron temperature", 50.0, -111.0, 0, NO) -SatIR39E = ("IR39E", SCALAR, "C", "3.9 micron temperature", 50.0, - -111.0, 0, NO) -SatWVE = ("WaterVaporE", SCALAR, "C", "water vapor temperature", - -11.0, -62.0, 0, NO) -SatFogE = ("FogE", SCALAR, "C", "ir11 - ir39", 50.0, -111.0, 0, NO) - -SatVisW = ("VisibleW", SCALAR, "count", "Satellite Albdo %", - 255.0, 0.0, 0, NO) -SatIR11W = ("IR11W", SCALAR, "C", "11 micron temperature", 58.0, -111.0, 0, NO) -SatIR13W = ("IR13W", SCALAR, "C", "13 micron temperature", 50.0, -111.0, 0, NO) -SatIR39W = ("IR39W", SCALAR, "C", "3.9 micron temperature", 50.0, - -111.0, 0, NO) -SatWVW = ("WaterVaporW", SCALAR, "C", "water vapor temperature", - -11.0, -62.0, 0, NO) -SatFogW = ("FogW", SCALAR, "C", "ir11 - ir39", 50.0, -111.0, 0, NO) - -# TPC Wind Probability parms -prob34 = ("prob34", SCALAR, "%", "WS34 CPROB", 100.0, 0.0, 0, NO) -prob50 = ("prob50", SCALAR, "%", "WS50 CPROB", 100.0, 0.0, 0, NO) -prob64 = ("prob64", SCALAR, "%", "WS64 CPROB", 100.0, 0.0, 0, NO) -pws34 = ("pws34", SCALAR, "%", "34WSIPROB", 100.0, 0.0, 0, NO) -pws50 = ("pws50", SCALAR, "%", "50WSIPROB", 100.0, 0.0, 0, NO) -pws64 = ("pws64", SCALAR, "%", "64WSIPROB", 100.0, 0.0, 0, NO) -pwsD34 = ("pwsD34", SCALAR, "%", "Day34WSIPROB", 100.0, 0.0, 0, NO) -pwsN34 = ("pwsN34", SCALAR, "%", "Night34WSIPROB", 100.0, 0.0, 0, NO) -pwsD64 = ("pwsD64", SCALAR, "%", "Day64WSIPROB", 100.0, 0.0, 0, NO) -pwsN64 = ("pwsN64", SCALAR, "%", "Night64WSI PROB", 100.0, 0.0, 0, NO) -pws34int = ("pws34int", SCALAR, "%", "34WSIntPROB", 100.0, 0.0, 0, NO) -pws64int = ("pws64int", SCALAR, "%", "64WSIntPROB", 100.0, 0.0, 0, NO) - -# Surge parms for HLS -SurgeHtPlusTide = ("SurgeHtPlusTide", SCALAR, "ft", "SurgeHtPlusTide", 50.0, -100.0, 2, NO) -SurgeHtPlusTideWTopo = ("SurgeHtPlusTideWTopo", SCALAR, "ft", "SurgeHtPlusTideWTopo", 50.0, -100.0, 2, NO) - -# Hazards -HazardKeys = [] -HazardKeys.append(("", "")) #1st one must be None -import VTECTable -kys = VTECTable.VTECTable.keys() -kys.sort() -for k in kys: - HazardKeys.append((k, VTECTable.VTECTable[k]['hdln'])) - -#H-VTEC keys - will someday add these back in -#("hydroER", "Hydro - Excessive Rainfall"), -#("hydroSM", "Hydro - Snow melt"), -#("hydroRS", "Rain and Snow melt"), -#("hydroDM", "Dam or Levee Failure"), -#("hydroGO", "Glacier-Dammed Lake Outburst"), -#("hydroIJ", "Ice Jam"), -#("hydroIC", "Rain and/or Snow melt and/or Ice Jam"), - -Hazards = ("Hazards", DISCRETE, "wwa", "Hazards", YES, HazardKeys, 4) - -# Scalar/Vector Weather Elements that Require Extra Precision (due to their -# use in calculations) Either form may be used. -ExtraWEPrecision = [] - - -#--------------------------------------------------------------------------- -# -# Weather configuration section -# -#--------------------------------------------------------------------------- - -# list of possible visibilities -visibilities = ['', '0SM', '1/4SM', '1/2SM', '3/4SM', '1SM', '11/2SM', - '2SM', '21/2SM', '3SM', '4SM', '5SM', '6SM', 'P6SM'] - -# list of possible coverages and probabilities -NOCOV = ('', 'No Coverage') -ISOD = ('Iso', 'Isolated') -SCT = ('Sct', 'Scattered') -NUM = ('Num', 'Numerous') -WIDE = ('Wide', 'Widespread') -OCNL = ('Ocnl', 'Occasional') -SCHC = ('SChc', 'Slight Chance Of') -CHC = ('Chc', 'Chance Of') -LKLY = ('Lkly', 'Likely') -DEFN = ('Def', 'Definite') -PATCHY = ('Patchy', 'Patchy') -AREAS = ('Areas', 'Areas of') -FQT = ('Frq', 'Frequent') -BRIEF = ('Brf', 'Brief') -PERIODS = ('Pds', 'Periods of') -INTM = ('Inter', 'Intermittent') - -# list of possible intensities -INTEN_NONE = ('', 'No intensity') -INTEN_VERYLIGHT = ('--', 'Very Light') -INTEN_LIGHT = ('-', 'Light') -INTEN_MOD = ('m', 'Moderate') -INTEN_HEAVY = ('+', 'Heavy') -INTEN_SEVERE = ('+', 'Severe') -INTEN_DENSE = ('+', 'Dense') - -# list of optional attributes -FQTLTG = ('FL', 'Frequent Lightning') -GUSTS = ('GW', 'Gusty Winds') -HVYRAFL = ('HvyRn', 'Heavy Rainfall') -DMGWND = ('DmgW', 'Damaging Winds') -SMALLH = ('SmA', 'Small Hail') -LARGEH = ('LgA', 'Large Hail') -OUTLYNG = ('OLA','in the outlying areas') -GRASSY = ('OGA','on grassy areas') -OVRPASS = ('OBO','on bridges and overpasses') -OR = ('OR', 'or') -DRY = ('Dry', 'dry') -PRIMARY = ('Primary', 'Highest Ranking') -MENTION = ('Mention', 'Include Unconditionally') -TORNADO = ('TOR', 'Tornadoes') - -# list of each weather types -NOWX = ('', 'No Weather', - [NOCOV], - [INTEN_NONE], - []) -THUNDER = ('T', 'Thunderstorms', - [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, - PERIODS, INTM], - [INTEN_NONE, INTEN_SEVERE], - [PRIMARY, MENTION, FQTLTG, HVYRAFL, GUSTS, DMGWND, DRY, - LARGEH, SMALLH, TORNADO]) -RAIN = ('R', 'Rain', - [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -RAINSHOWERS = ('RW', 'Rain Showers', - [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, - PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -DRIZZLE = ('L', 'Drizzle', - [PATCHY, AREAS, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, - BRIEF, PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -FZRAIN = ('ZR', 'Freezing Rain', - [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -FZDRIZZLE = ('ZL', 'Freezing Drizzle', - [PATCHY, AREAS, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, - BRIEF, PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -SNOW = ('S', 'Snow', - [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -SNOWSHOWERS = ('SW', 'Snow Showers', - [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, - BRIEF, PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -SLEET = ('IP', 'Sleet', - [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], - [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION, OR]) -FOG = ('F', 'Fog', - [PATCHY, AREAS, WIDE], - [INTEN_NONE, INTEN_DENSE], - [PRIMARY, MENTION]) -FREEZEFOG = ('ZF', 'Freezing Fog', - [PATCHY, AREAS, WIDE], - [INTEN_NONE, INTEN_DENSE], - [PRIMARY, MENTION]) -ICEFOG = ('IF', 'Ice Fog', - [PATCHY, AREAS, WIDE], - [INTEN_NONE], - [PRIMARY, MENTION]) -ICECRYSTAL = ('IC', 'Ice Crystals', - [PATCHY, AREAS, WIDE], - [INTEN_NONE], - [PRIMARY, MENTION]) -HAZE = ('H', 'Haze', - [DEFN], - [INTEN_NONE], - [PRIMARY, MENTION]) -BLWGSNOW = ('BS', 'Blowing Snow', - [AREAS,PATCHY,DEFN], - [INTEN_NONE], - [PRIMARY, MENTION]) -BLWGSAND = ('BN', 'Blowing Sand', - [AREAS,PATCHY,DEFN], - [INTEN_NONE], - [PRIMARY, MENTION]) -SMOKE = ('K', 'Smoke', - [AREAS, PATCHY, DEFN], - [INTEN_NONE], - [PRIMARY, MENTION]) -BLWGDUST = ('BD', 'Blowing Dust', - [AREAS,PATCHY,DEFN], - [INTEN_NONE], - [PRIMARY, MENTION]) -FROST = ('FR','Frost', - [AREAS, PATCHY, WIDE], - [INTEN_NONE], - [PRIMARY, MENTION, OUTLYNG]) -FRZSPRAY = ('ZY','Freezing Spray', - [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL], - [INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], - [PRIMARY, MENTION]) -VOLASH = ('VA','Volcanic Ash', - [NOCOV], - [INTEN_NONE], - [PRIMARY, MENTION]) -WATERSPOUT = ('WP','Waterspouts', - [ISOD, SCHC, CHC, LKLY, DEFN], - [INTEN_NONE], - [PRIMARY, MENTION]) - - -types = [NOWX, THUNDER, WATERSPOUT, RAIN, RAINSHOWERS, - DRIZZLE, FZRAIN, FZDRIZZLE, SNOW, SNOWSHOWERS, - SLEET, FOG, FREEZEFOG, ICEFOG, ICECRYSTAL ,HAZE, BLWGSNOW, - BLWGSAND, SMOKE, BLWGDUST, FROST, FRZSPRAY, VOLASH] - - -#----------------------------------- -# DO NOT CHANGE THE FOLLOWING SECTION -#------------------------------------ -if not BASELINE and siteImport('localWxConfig'): - types = localWxConfig.types - -#--------------------------------------------------------------------------- -# -# Projection Configuration section. -# -#--------------------------------------------------------------------------- -NONE = 0 -LAMBERT_CONFORMAL = 1 -MERCATOR = 2 -POLAR_STEREOGRAPHIC = 3 -LATLON = 4 - -# projectionID / projectionType / latLonLL / latLonUR / -# latLonOrigin / stdParallelOne / stdParallelTwo / gridPointLL / gridPointUR -# latIntersect / lonCenter / lonOrigin - -Grid201 = ('Grid201',POLAR_STEREOGRAPHIC, - (-150.00, -20.826), (-20.90846, 30.0), - (0.0, 0.0), 0.0, 0.0, (1, 1), (65, 65), 0.0, 0.0, -105.0) - -Grid202 = ('Grid202', POLAR_STEREOGRAPHIC, - (-141.028, 7.838), (-18.576, 35.617), - (0.0, 0.0), 0.0, 0.0, (1, 1), (65, 43), 0.0, 0.0, -105.0) - -Grid203 = ('Grid203', POLAR_STEREOGRAPHIC, - (-185.837, 19.132), (-53.660, 57.634), - (0.0, 0.0), 0.0, 0.0, (1, 1), (45, 39), 0.0, 0.0, -150.0) - -Grid204 = ('Grid204', MERCATOR, - (-250.0, -25.0), (-109.129, 60.644), - (0.0, 0.0), 0.0, 0.0, (1, 1), (93, 68), 0.0, -179.564, 0.0) - -Grid205 = ('Grid205', POLAR_STEREOGRAPHIC, - (-84.904, 0.616), (-15.000, 45.620), - (0.0, 0.0), 0.0, 0.0, (1, 1), (45, 39), 0.0, 0.0, -60.0) - -Grid206 = ('Grid206', LAMBERT_CONFORMAL, - (-117.991, 22.289), (-73.182, 51.072), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (51, 41), 0.0, 0.0, 0.0) - -Grid207 = ('Grid207', POLAR_STEREOGRAPHIC, - (-175.641, 42.085), (-93.689, 63.976), - (0.0, 0.0), 0.0, 0.0, (1, 1), (49, 35), 0.0, 0.0, -150.0) - -Grid208 = ('Grid208', MERCATOR, - (-166.219, 10.656), (-147.844, 27.917), - (0.0, 0.0), 0.0, 0.0, (1, 1), (25, 25), 0.0, -157.082, 0.0) - -Grid209 = ('Grid209', LAMBERT_CONFORMAL, - (-117.991, 22.289), (-73.182, 51.072), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (101, 81), 0.0, 0.0, 0.0) - -Grid210 = ('Grid210', MERCATOR, - (-77.000, 9.000), (-58.625, 26.422), - (0.0, 0.0), 0.0, 0.0, (1, 1), (25, 25), 0.0, -67.812, 0.0) - -Grid211 = ('Grid211', LAMBERT_CONFORMAL, - (-133.459, 12.190), (-49.385, 57.290), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (93, 65), 0.0, 0.0, 0.0) - -Grid212 = ('Grid212', LAMBERT_CONFORMAL, - (-133.459, 12.190), (-49.385, 57.290), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (185, 129), 0.0, 0.0, 0.0) - -Grid213 = ('Grid213', POLAR_STEREOGRAPHIC, - (-141.028, 7.838), (-18.577, 35.617), - (0.0, 0.0), 0.0, 0.0, (1, 1), (129, 85), 0.0, 0.0, -105.0) - -Grid214 = ('Grid214', POLAR_STEREOGRAPHIC, - (-175.641, 42.085), (-93.689, 63.975), - (0.0, 0.0), 0.0, 0.0, (1, 1), (97, 69), 0.0, 0.0, -150.0) - -# (new alaska grid) -Grid214AK = ('Grid214AK', POLAR_STEREOGRAPHIC, - (-178.571, 40.5301), (-93.689, 63.975), - (0.0, 0.0), 0.0, 0.0, (1,1), (104, 70), 0.0, 0.0, -150.0) - -Grid215 = ('Grid215', LAMBERT_CONFORMAL, - (-133.459, 12.190), (-49.385, 57.290), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (369, 257), 0.0, 0.0, 0.0) - -Grid216 = ('Grid216', POLAR_STEREOGRAPHIC, - (-173.000, 30.000), (-62.850, 70.111), - (0.0, 0.0), 0.0, 0.0, (1, 1), (139, 107), 0.0, 0.0, -135.0) - -Grid217 = ('Grid217', POLAR_STEREOGRAPHIC, - (-173.000, 30.000), (-62.850, 70.111), - (0.0, 0.0), 0.0, 0.0, (1, 1), (277, 213), 0.0, 0.0, -135.0) - -Grid218 = ('Grid218', LAMBERT_CONFORMAL, - (-133.459, 12.190), (-49.385, 57.290), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (614, 428), 0.0, 0.0, 0.0) - -Grid219 = ('Grid219', POLAR_STEREOGRAPHIC, - (-119.559, 25.008), (60.339, 24.028), - (0.0, 0.0), 0.0, 0.0, (1, 1), (385, 465), 0.0, 0.0, -80.0) - -Grid221 = ('Grid221', LAMBERT_CONFORMAL, - (-145.500, 1.000), (-2.566, 46.352), - (-107.0, 50.0), 50.0, 50.0, (1, 1), (349, 277), 0.0, 0.0, 0.0) - -Grid222 = ('Grid222', LAMBERT_CONFORMAL, - (-145.500, 1.000), (-2.566, 46.352), - (-107.0, 50.0), 50.0, 50.0, (1, 1), (59, 47), 0.0, 0.0, 0.0) - -Grid225 = ('Grid225', MERCATOR, - (-250.0, -25.0), (-109.129, 60.644), - (0.0, 0.0), 0.0, 0.0, (1, 1), (185, 135), 0.0, -179.564, 0.0) - -Grid226 = ('Grid226', LAMBERT_CONFORMAL, - (-133.459, 12.190), (-49.385, 57.290), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (737, 513), 0.0, 0.0, 0.0) - -Grid227 = ('Grid227', LAMBERT_CONFORMAL, - (-133.459, 12.190), (-49.385, 57.290), - (-95.0, 25.0), 25.0, 25.0, (1, 1), (1473, 1025), 0.0, 0.0, 0.0) - -Grid228 = ('Grid228', LATLON, - (0.0, 90.0), (359.0, -90.0), (0.0, 0.0), 0.0, 0.0, - (1, 1), (144, 73), 0.0, 0.0, 0.0) - -Grid229 = ('Grid229', LATLON, - (0.0, 90.0), (359.0, -90.0), - (0.0, 0.0), 0.0, 0.0, (1, 1), (360, 181), 0.0, 0.0, 0.0) - -Grid230 = ('Grid230', LATLON, - (0.0, 90.0), (359.5, -90.0), - (0.0, 0.0), 0.0, 0.0, (1, 1), (720, 361), 0.0, 0.0, 0.0) - -Grid231 = ('Grid231', LATLON, - (0.0, 0.0), (359.5, 90.0), - (0.0, 0.0), 0.0, 0.0, (1, 1), (720, 181), 0.0, 0.0, 0.0) - -Grid232 = ('Grid232', LATLON, - (0.0, 0.0), (359.0, 90.0), - (0.0, 0.0), 0.0, 0.0, (1, 1), (360, 91), 0.0, 0.0, 0.0) - -Grid233 = ('Grid233', LATLON, - (0.0, -78.0), (358.750, 78.0), - (0.0, 0.0), 0.0, 0.0, (1, 1), (288, 157), 0.0, 0.0, 0.0) - -Grid234 = ('Grid234', LATLON, - (-98.000, 15.0), (-65.000, -45.0), - (0.0, 0.0), 0.0, 0.0, (1, 1), (133, 121), 0.0, 0.0, 0.0) - -Grid235 = ('Grid235', LATLON, - (0.250, 89.750), (359.750, -89.750), - (0.0, 0.0), 0.0, 0.0, (1, 1), (720, 360), 0.0, 0.0, 0.0) - -HRAP = ('HRAP', POLAR_STEREOGRAPHIC, - (-119.036, 23.097), (-75.945396, 53.480095), - (0.0, 0.0), 0.0, 0.0, (1, 1), (801, 881), 0.0, 0.0, -105.0) - -# list of all projections -allProjections = [Grid201, Grid202, Grid203, Grid204, Grid205, Grid206, - Grid207, Grid208, Grid209, Grid210, Grid211, Grid212, Grid213, Grid214, - Grid214AK, Grid215, Grid216, Grid217, Grid218, Grid219, Grid221, Grid222, - Grid225, Grid226, Grid227, Grid228, Grid229, Grid230, Grid231, Grid232, - Grid233, Grid234, Grid235, HRAP] - -#--------------------------------------------------------------------------- -# -# Grid Domain configuration section -# -#--------------------------------------------------------------------------- -# -# xdim/ydim: Defines the dimensions of the grids. (GFE grid size) -# -# origin: Defines the lower-left corner of the grid (point 0,0) in -# world coordinates. -# -# extent: Defines the "size" of the grid in world coordinates. The upper -# right corner is the origin+extent. -# -# TimeZone: Defines the timezone used by this site in standard TZ format. -# Refer to /usr/share/zoneinfo/zone.tab for the correct settings. -# -# Projection: Defines the projection identifier to be used for this domain. - -# Note that all parameters for an existing database must use the same -# projection, though not necessarily the same grid size and location. - -# These values are set up for AWIPS. There is a script at the end -# of this section that adjusts the resolution for the RPP sites. - -# [xdim, ydim] / (origin) /( extent) / TimeZone / Projection / OfficeType -SITES = { -#WFOs - # Experimental combined AFC site - 'AFC' : ([1057, 449], (1.0, 19.00), (66.0, 28.0), 'America/Anchorage', - Grid214AK, "wfo"), - - 'ABQ' : ([145, 145], (36.00, 22.00), (9.0, 9.0), 'MST7MDT', Grid211,"wfo"), - 'ABR' : ([145, 145], (45.00, 35.00), (9.0, 9.0), 'CST6CDT', Grid211,"wfo"), - 'AER' : ([369, 337], (44.00, 23.00), (23.0, 21.0), 'America/Anchorage', - Grid214AK, "wfo"), - 'AFG' : ([313, 201], (27.0, 39.0), (39.0, 25.0), 'America/Anchorage', - Grid214AK, "wfo"), - 'AJK' : ([337, 241], (62.0, 23.0), (21.0, 15.0), 'America/Juneau', - Grid214AK, "wfo"), - 'AKQ' : ([145, 145], (68.00, 25.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'ALU' : ([433, 225], (1.0, 19.0), (54.0, 28.0), 'America/Anchorage', - Grid214AK, "wfo"), - 'ALY' : ([145, 145], (70.00, 33.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'AMA' : ([145, 145], (41.00, 21.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'APX' : ([145, 145], (58.00, 34.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'ARX' : ([145, 145], (52.00, 33.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'BGM' : ([145, 145], (68.00, 33.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'BIS' : ([145, 145], (43.00, 37.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'BMX' : ([145, 145], (58.00, 19.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'BOI' : ([177, 177], (25.00, 34.00), (11.0, 11.0), 'MST7MDT', Grid211, "wfo"), - 'BOU' : ([145, 145], (38.00, 27.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'BOX' : ([193, 193], (74.00, 33.00), (12.0, 12.0), 'EST5EDT', Grid211, "wfo"), - 'BRO' : ([145, 145], (44.00, 10.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'BTV' : ([145, 145], (72.00, 36.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'BUF' : ([145, 145], (66.00, 32.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'BYZ' : ([145, 145], (36.00, 37.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'CAE' : ([145, 145], (65.00, 20.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'CAR' : ([145, 145], (75.00, 39.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'CHS' : ([145, 145], (65.00, 18.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'CLE' : ([145, 145], (62.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'CRP' : ([145, 145], (45.00, 11.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'CTP' : ([145, 145], (67.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'CYS' : ([145, 145], (37.00, 31.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'DDC' : ([145, 145], (43.00, 24.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'DLH' : ([145, 145], (50.00, 37.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'DMX' : ([145, 145], (49.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'DTX' : ([161, 161], (57.00, 34.00), (10.0, 10.0), 'EST5EDT', Grid211, "wfo"), - 'DVN' : ([145, 145], (52.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'EAX' : ([145, 145], (50.00, 27.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'EKA' : ([145, 145], (20.00, 31.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'EPZ' : ([145, 145], (36.00, 16.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'EWX' : ([145, 145], (44.00, 12.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'FFC' : ([145, 145], (61.00, 18.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'FGF' : ([145, 145], (45.00, 39.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'FGZ' : ([145, 145], (29.00, 23.00), (9.0, 9.0), 'US/Arizona', Grid211, "wfo"), - 'FSD' : ([177, 177], (43.00, 32.00), (11.0, 11.0), 'CST6CDT', Grid211, "wfo"), - 'FWD' : ([145, 145], (45.00, 17.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'GGW' : ([145, 145], (36.00, 39.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'GID' : ([145, 145], (44.00, 28.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'GJT' : ([145, 145], (34.00, 27.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'GLD' : ([145, 145], (41.00, 26.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'GRB' : ([145, 145], (54.00, 35.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'GRR' : ([145, 145], (58.00, 33.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'GSP' : ([145, 145], (63.00, 21.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'GUM' : ([433, 225], (15.00, 20.00), (27.0, 14.0), 'Pacific/Guam', Grid204, "wfo"), - 'GYX' : ([145, 145], (75.00, 37.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'HFO' : ([321, 225], (7.00, 11.00), (10.0, 7.0), 'Pacific/Honolulu', - Grid208, 'wfo'), - 'HGX' : ([145, 145], (48.00, 13.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'HNX' : ([145, 145], (22.00, 24.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'HUN' : ([145, 145], (57.00, 20.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'ICT' : ([145, 145], (45.00, 25.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'ILM' : ([145, 145], (67.00, 21.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'ILN' : ([145, 145], (60.00, 27.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'ILX' : ([145, 145], (55.00, 27.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'IND' : ([145, 145], (58.00, 27.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'IWX' : ([145, 145], (58.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'JAN' : ([145, 145], (54.00, 18.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'JAX' : ([145, 145], (64.00, 14.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'JKL' : ([145, 145], (61.00, 25.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'KEY' : ([145, 145], (66.00, 8.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'LBF' : ([145, 145], (43.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'LCH' : ([145, 145], (52.00, 15.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'LIX' : ([145, 145], (54.00, 14.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'LKN' : ([145, 145], (25.00, 30.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'LMK' : ([145, 145], (59.00, 25.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'LOT' : ([145, 145], (55.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'LOX' : ([145, 145], (21.00, 23.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'LSX' : ([145, 145], (52.00, 25.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'LUB' : ([145, 145], (39.00, 17.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'LWX' : ([145, 145], (67.00, 27.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'LZK' : ([145, 145], (51.00, 20.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'MAF' : ([145, 145], (40.00, 16.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'MEG' : ([145, 145], (54.00, 22.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'MFL' : ([145, 145], (66.00, 9.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'MFR' : ([145, 145], (20.00, 34.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'MHX' : ([145, 145], (68.00, 22.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'MKX' : ([145, 145], (55.00, 33.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'MLB' : ([145, 145], (66.00, 12.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'MOB' : ([145, 145], (57.00, 16.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'MPX' : ([145, 145], (50.00, 34.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'MQT' : ([145, 145], (56.00, 36.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'MRX' : ([145, 145], (61.00, 22.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'MSO' : ([145, 145], (29.00, 39.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'MTR' : ([145, 145], (20.00, 26.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'OAX' : ([145, 145], (45.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'OHX' : ([145, 145], (58.00, 22.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'OKX' : ([145, 145], (71.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'OTX' : ([145, 145], (25.00, 40.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'OUN' : ([145, 145], (44.00, 21.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'PAH' : ([145, 145], (56.00, 24.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'PBZ' : ([145, 145], (65.00, 29.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'PDT' : ([145, 145], (23.00, 38.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'PHI' : ([145, 145], (70.00, 28.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'PIH' : ([145, 145], (30.00, 34.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'PQR' : ([145, 145], (19.00, 38.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'PSR' : ([145, 145], (28.00, 20.00), (9.0, 9.0), 'US/Arizona', Grid211, "wfo"), - 'PUB' : ([145, 145], (38.00, 26.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'RAH' : ([145, 145], (66.00, 22.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'REV' : ([145, 145], (23.00, 29.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'RIW' : ([145, 145], (35.00, 33.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'RLX' : ([145, 145], (63.00, 26.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'RNK' : ([145, 145], (64.00, 24.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'SEW' : ([145, 145], (21.00, 42.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'SGF' : ([145, 145], (51.00, 24.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'SGX' : ([145, 145], (24.00, 21.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'SHV' : ([145, 145], (50.00, 17.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'SJT' : ([145, 145], (43.00, 16.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'SJU': ([32, 28], (10.0, 10.0), (8.0, 7.0), 'America/Puerto_Rico',Grid210, "wfo"), - 'SLC' : ([161, 161], (30.00, 28.00), (10.0, 10.0), 'MST7MDT', Grid211, "wfo"), - 'STO' : ([145, 145], (20.00, 28.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), - 'TAE' : ([145, 145], (60.00, 15.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'TBW' : ([145, 145], (64.00, 11.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), - 'TFX' : ([145, 145], (32.00, 39.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'TOP' : ([145, 145], (47.00, 26.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'TSA' : ([145, 145], (48.00, 22.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), - 'TWC' : ([145, 145], (29.00, 20.00), (9.0, 9.0), 'US/Arizona', Grid211, "wfo"), - 'UNR' : ([145, 145], (40.00, 34.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), - 'VEF' : ([145, 145], (26.00, 25.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), -#RFCs - 'ACR' : ([271, 173], (20.0, 21.0), (57.0, 40.0), 'America/Anchorage', - Grid214, "rfc"), # this grid is at 10 km resolution - 'ALR' : ([299, 278], (59.0, 11.0), (17.0, 19.0), 'CST6CDT', Grid211, "rfc"), - 'FWR' : ([362, 334], (36.0, 11.0), (20.0, 20.0), 'CST6CDT', Grid211, "rfc"), - 'KRF' : ([408, 356], (33.0, 27.0), (26.0, 22.0), 'CST6CDT', Grid211, "rfc"), - 'MSR' : ([381, 304], (43.0, 28.0), (24.0, 20.0), 'CST6CDT', Grid211, "rfc"), - 'ORN' : ([303, 216], (51.0, 16.0), (18.0, 14.0), 'CST6CDT', Grid211, "rfc"), - 'PTR' : ([218, 308], (21.0, 35.0), (17.0, 19.0), 'PST8PDT', Grid211, "rfc"), - 'RHA' : ([132, 140], (69.0, 28.0), (7.0, 10.0), 'EST5EDT', Grid211, "rfc"), - 'RSA' : ([140, 296], (21.0, 23.0), (12.0, 17.0), 'PST8PDT', Grid211, "rfc"), - 'STR' : ([171, 307], (29.0, 20.0), (13.0, 18.0), 'MST7MDT', Grid211, "rfc"), - 'TAR' : ([226, 164], (69.0, 34.0), (13.0, 13.0), 'EST5EDT', Grid211, "rfc"), - 'TIR' : ([220, 171], (59.0, 25.0), (13.0, 12.0), 'EST5EDT', Grid211, "rfc"), - 'TUA' : ([281, 168], (39.0, 22.0), (18.0, 10.0), 'CST6CDT', Grid211, "rfc"), - -#Special Sites - Updated NHC and OPC domains in OB9.3 - 'US' : ([267, 159], (18.0, 9.5), (67.0, 40.0), 'EDT5EDT', Grid211, "other"), - 'FSL' : ([161, 145], (38.50, 27.00), (10.0, 9.0), 'MST7MDT', Grid211, "other"), - 'NH1' : ([667, 461], (69.5, 4.5), (52.03125, 35.9375), 'EST5EDT', Grid204, "wfo"), - 'NH2' : ([950, 289], (-33.0, -7.0), (148.276, 45.0), 'EST5EDT', Grid210, "wfo"), - 'ONA' : ([244, 383], (68.9375, 19.5625), (15.1875, 23.875), 'EST5EDT', Grid211, "wfo"), - 'ONP' : ([396, 415], (8.1875, 21.5625), (24.6875, 25.875), 'PST8PDT', Grid211, "wfo"), - -#Ice Desk for AFC - 'AICE' : ([560, 340], (9.0, 11.0), (29.0, 19.0), 'America/Anchorage', - Grid203, "nc"), -#Nested for GUM (future) - 'GUMa': ([193, 193], (23.0, 26.0), (3.0, 3.0), 'Pacific/Guam', Grid204, "other"), -#Regional Offices - 'VUY' : ([337,449], (62.00, 19.00), (21.0, 28.0), 'EST5EDT', Grid211, "ro"), - 'BCQ' : ([145,145], (50.00, 27.00), (9.0, 9.0), 'CST6CDT', Grid211, "ro"), - 'EHU' : ([361,361], (27.00, 10.00), (45.0, 20.0), 'CST6CDT', Grid211, "ro"), - 'VHW' : ([161,161], (30.00, 28.00), (10.0, 10.0), 'MST7MDT', Grid211, "ro"), - 'PBP' : ([321,225], (7.00, 11.00), (10.0, 7.0), 'Pacific/Honolulu', Grid208, "ro"), - 'ARE' : ([369,337], (44.00, 23.00), (23.0, 21.0), 'America/Anchorage', Grid214AK, "ro"), - 'ARW' : ([433,225], (1.00, 19.00), (54.0, 21.0), 'America/Anchorage', Grid214AK, "ro"), - -#National Centers - 'HAK' : ( [825,553], ( 1.0, 1.0), (103.0, 69.0), 'EST5EDT', Grid214AK, "nc"), - 'HUS' : ([1073,689], (19.0, 8.0), ( 67.0, 43.0), 'EST5EDT', Grid211, "nc"), -} - - -#--------------------------------------------------------------------------- -# -# Time Constraint configuration section -# -#--------------------------------------------------------------------------- -HOUR = 3600 -DAY = 24 * HOUR - -# Start: is the number of seconds since 0000z for the first grid of the day -# Repeat: is the number of seconds from start until the next grid starts -# Duration: is the length of the grid in number of seconds - -# Examples of constraints: -# Hourly temperatures -# HrTemp = (0, HOUR, HOUR) -# QPF that is 6 hours long, aligned on 0000z, exists for every 6 hours -# Q = (0, HOUR*6, HOUR*6) -# - -# fixed time constraints: start / repeat / duration -TC_1M = (0, 60, 60) # 1 minute -TC1 = (0, HOUR, HOUR) -TC3 = (0, 3 * HOUR, HOUR) -TC6 = (0, 6 * HOUR, HOUR) -TC12 = (0, 12 * HOUR, HOUR) -TC3NG = (0, 3 * HOUR, 3 * HOUR) -TC6NG = (0, 6 * HOUR, 6 * HOUR) -TC12NG = (0, 12 * HOUR, 12 * HOUR) -TC061212 = (6 * HOUR, 12 * HOUR, 12 * HOUR) -Persistent = (0, 0, 0) # special time constraint - -# Local-time based time constraints. Does not automatically account for -# daylight savings time. The dst flag is 0 for standard time and manually -# set to 1 for daylight time (if desired). The start is specified in -# seconds local time, e.g., 6*HOUR would indicate 6am. -def localTC(start,repeat,duration,dst): - timezone = SITES[GFESUITE_SITEID][3] - import pytz - tz = pytz.timezone(timezone) - delta = tz.utcoffset(0) - tz.dst(0); - offset = delta.days*86400 + delta.seconds - start = start - offset - if dst == 1: - start = start - 3600 #daylight savings flag - if start >= 3600 * 24: - start = start - 3600 * 24 - elif start < 0: - start = start + 3600 * 24 - return (start, repeat, duration) - -# The following time constraints are based on local standard time. -# Change the last parameter from 0 to 1 to force daylight savings time -# always. -# PWS TCs changed in OB9.3 for new 6 hour data from NHC -MaxTTC = localTC(7*HOUR, 24*HOUR, 13*HOUR, 0) -MinTTC = localTC(19*HOUR, 24*HOUR, 14*HOUR, 0) -MaxRHTC = localTC(15*HOUR, 24*HOUR, 18*HOUR, 0) -MinRHTC = localTC(3*HOUR, 24*HOUR, 18*HOUR, 0) -LT3NG = localTC(0*HOUR, 3*HOUR, 3*HOUR, 0) -LT6NG = localTC(0*HOUR, 6*HOUR, 6*HOUR, 0) -LT12NG = localTC(6*HOUR, 12*HOUR, 12*HOUR, 0) -LTMOS = localTC(6*HOUR, 12*HOUR, 12*HOUR, 0) #special MOS local time -MaxTTCMOS = localTC(6*HOUR, 24*HOUR, 12*HOUR, 0) #special MOS maxT -MinTTCMOS = localTC(18*HOUR, 24*HOUR, 12*HOUR, 0) #special MOS minT -LT24 = localTC(0*HOUR, 24*HOUR, 24*HOUR, 0) -FireWx1300TC = localTC(13*HOUR, 24*HOUR, 1*HOUR, 0) #special FireWx 1pm snap -#DR3511 DeltaMaxTTC = localTC(7*HOUR, 24*HOUR, 16*HOUR, 0) # just for HPCdeltaMaxT -PWSDTC = localTC(11*HOUR, 24*HOUR, 12*HOUR, 0) -PWSNTC = localTC(23*HOUR, 24*HOUR, 12*HOUR, 0) - -#--------------------------------------------------------------------------- -# -# Database/(Model) Attribute Configuration -# -#--------------------------------------------------------------------------- -# -# name: The model name of the database -# -# format: Either 'GRID' or 'DFM' -# -# type: Optional type of the database -# -# single: YES or NO. YES if this database always exists and is not -# based on model-times. NO if this database is created/destroyed and -# is based on model-runs. When created, the names of these databases have -# time stamps. -# -# official: YES or NO. YES if this is an official database from which -# products can be generated. NO if this is a conventional database. -# -# numVer: Number of versions of this database to retain. -# -# purgeAge: Number of hours in the past before grids will be automatically -# purged from the database. If 0, then purging is disabled. -# - -YES = 1 -NO = 0 -GRID = 'GRID' -# name / format / type / single / official / numVer / purgeAge - -Fcst = ('Fcst', GRID, '', YES, NO, 1, 24) -Practice = ('Fcst', GRID, 'Prac', YES, NO, 1, 24) -TestFcst = ('Fcst', GRID, 'Test', YES, NO, 1, 24) -Restore = ('Restore', GRID, '', YES, NO, 1, 24) -Test = ('Test', GRID, 'test', NO, NO, 1, 0) -Official = ('Official', GRID, '', YES, YES, 1, 24) -ISC = ('ISC', GRID, '', YES, NO, 1, 12) -LAPS = ('LAPS', GRID, '', YES, NO, 1, 30) -SAT = ('SAT', GRID, '', YES, NO, 1, 12) -HPCGuide = ('HPCGuide', GRID, '', NO, NO, 2, 0) -NAM12 = ('NAM12', GRID, '', NO, NO, 2, 0) -NAM40 = ('NAM40', GRID, '', NO, NO, 2, 0) -NAM80 = ('NAM80', GRID, '', NO, NO, 2, 0) -NAM95 = ('NAM95', GRID, '', NO, NO, 2, 0) -NGM80 = ('NGM80', GRID, '', NO, NO, 2, 0) -NGM95 = ('NGM95', GRID, '', NO, NO, 2, 0) -GFS40 = ('GFS40', GRID, '', NO, NO, 2, 0) -GFS80 = ('GFS80', GRID, '', NO, NO, 2, 0) -GFS190 = ('GFS190', GRID, '', NO, NO, 2, 0) -GFS75 = ('GFS75', GRID, '', NO, NO, 2, 0) -gfsLR = ('gfsLR', GRID, '', NO, NO, 2, 0) -RUC13 = ('RUC13', GRID, '', NO, NO, 2, 0) -RUC80 = ('RUC80', GRID, '', NO, NO, 2, 0) -HPCGrid = ('HPCGRID', GRID, '', NO, NO, 2, 0) -AKwave10 = ('AKwave10', GRID, '', NO, NO, 2, 0) -AKwave4 = ('AKwave4', GRID, '', NO, NO, 2, 0) -EPwave10 = ('EPwave10', GRID, '', NO, NO, 2, 0) -GlobalWave = ('GlobalWave', GRID, '', NO, NO, 2, 0) -GLWM = ('GLWM', GRID, '', NO, NO, 2, 0)##########DCS3499 -HIRESWarw = ('HIRESWarw', GRID, '', NO, NO, 2, 0)##########DCS3501 -HIRESWnmm = ('HIRESWnmm', GRID, '', NO, NO, 2, 0) -#### SPC = ('SPC', GRID, '', NO, NO, 2, 0)###DR20634 -WCwave10 = ('WCwave10', GRID, '', NO, NO, 2, 0) -WCwave4 = ('WCwave4', GRID, '', NO, NO, 2, 0) -WNAwave10 = ('WNAwave10', GRID, '', NO, NO, 2, 0) -WNAwave4 = ('WNAwave4', GRID, '', NO, NO, 2, 0) -GWW = ('GWW', GRID, '', NO, NO, 2, 0) -HPCQPF = ('HPCQPF', GRID, '', NO, NO, 4, 0) -RFCQPF = ('RFCQPF', GRID, '', NO, NO, 4, 0) -#DR3511 HPCDelta = ('HPCdelta', GRID, '', NO, NO, 2, 0) -TPCTCM = ('TPCtcm', GRID, '', NO, NO, 2, 0) -MSAS = ('MSAS', GRID, '', YES, NO, 1, 36) -GLERL = ('GLERL', GRID, '', NO, NO, 2, 0) -AKWAVE = ('AKWAVE', GRID, '', NO, NO, 2, 0) -WNAWAVE = ('WNAWAVE', GRID, '', NO, NO, 2, 0) -DGEX = ('DGEX', GRID, '', NO, NO, 2, 0) -OPCTAFBE = ('OPCTAFBE', GRID, '', NO, NO, 2, 0) -OPCTAFBNW = ('OPCTAFBNW', GRID, '', NO, NO, 2, 0) -OPCTAFBSW = ('OPCTAFBSW', GRID, '', NO, NO, 2, 0) -MOSGuide = ('MOSGuide', GRID, '', NO, NO, 2, 0) -RTMA = ('RTMA', GRID, '', YES, NO, 1, 36) -NamDNG5 = ('NamDNG5', GRID, '', NO, NO, 2, 0) -TPCProb = ('TPCProb', GRID, '', NO, NO, 30, 0) -SREF = ('SREF', GRID, '', NO, NO, 3, 0) - -#--------------------------------------------------------------------------- -# -# D2D Model Database Version Specification -# -#--------------------------------------------------------------------------- -# D2D database retention values - defaults to 2 if not specified -# Dictionary format. Also used for the number of versions of satellite -# images that are seen. -D2DDBVERSIONS = { - "MSAS": 6, - "LAPS": 6, - "Satellite": 6, - "HPCERP": 5, - "TPCProb": 30, - } - -#--------------------------------------------------------------------------- -# -# Search path for D2D (awips) model files. -# -#--------------------------------------------------------------------------- -# Alaska OCONUS -if SID in ALASKA_SITES: - D2DMODELS = [('mesoEta216', 'NAM40'), - ('mesoEta217', 'NAM20'), - ('AVN203', 'GFS190'), - ('MRF203', 'gfsLR'), - ('NGM207', 'NGM95'), - ('ETA207', 'NAM95'), - 'GWW233', - ('ETA242', 'NAM12'), - 'ECMWF-LowRes','ECMWF', - 'UKMET-NorthernHemisphere', 'UKMET', - 'ENSEMBLE', - ('DGEX186', 'DGEX'), - ('OPCWave181', 'OPCTAFBNW'), - ('AKWAVE239', 'AKWAVE'), - 'AKwave10', - 'AKwave4', - 'GlobalWave', - ('AK-RTMA','RTMA'), - ('AK-NamDNG5','NamDNG5'), - ('MOSGuide-AK', 'MOSGuide'), - ('HiResW-ARW-AK', 'HIRESWarw'), - ('HiResW-NMM-AK', 'HIRESWnmm'), - ('SPCGuide', 'SPC'), - ('TPCWindProb', 'TPCProb'), - ] - -# Hawaii OCONUS -elif SID == "HFO": - D2DMODELS = [('MRF204', 'gfsLR'), - ('AVN225', 'GFS75'), - 'GWW233', - 'GlobalWave', - 'EPwave10', - 'EPwave4', - ('HI-RTMA','RTMA'), - ('HI-NamDNG5','NamDNG5'), - ('HiResW-ARW-HI', 'HIRESWarw'), - ('HiResW-NMM-HI', 'HIRESWnmm'), - ('SPCGuide', 'SPC'), - ('TPCWindProb', 'TPCProb'), - ('ECMWF-HiRes','ECMWFHiRes'), - ] - -# San Juan OCONUS -elif SID == "SJU": - D2DMODELS = [('AVN211', 'GFS80'), - ('GFS212', 'GFS40'), - ('ETA', 'NAM80'), - ('NGM', 'NGM80'), - ('MRF205', 'gfsLR'), - ('OPCWave180', 'OPCTAFBE'), - 'HurWind226', - 'GWW233', - 'GlobalWave', - 'WNAwave10', - 'WNAwave4', - ('PR-RTMA','RTMA'), - ('PR-NamDNG5','NamDNG5'), - ('HiResW-ARW-SJU', 'HIRESWarw'), - ('HiResW-NMM-SJU', 'HIRESWnmm'), - ('SPCGuide', 'SPC'), - ('TPCWindProb', 'TPCProb'), - ('ECMWF-HiRes','ECMWFHiRes'), - ] - -# Guam OCONUS -elif SID == "GUM": - D2DMODELS = [('MRF204', 'gfsLR'), - ('AVN225', 'GFS75'), - 'GWW233', - 'GlobalWave', - ('TPCWindProb', 'TPCProb'), - ] - -#CONUS sites -elif SID in CONUS_EAST_SITES: - D2DMODELS = [('GFS212', 'GFS40'), - ('AVN211', 'GFS80'), - ('ETA', 'NAM80'), - ('NGM', 'NGM80'), - ('MRF', 'gfsLR'), - ('RUC130', 'RUC13'), - ('RUC', 'RUC80'), - ('mesoEta212', 'NAM40'), - ('mesoEta215', 'NAM20'), - 'MSAS', - ('LAPS', 'LAPS'), - 'GWW233', - ('HPCqpf', 'HPCQPF'), - ('HPCqpfNDFD', 'HPCERP'), - ('RFCqpf', 'RFCQPF'), -#DR3511 'HPCdelta', - 'GLERL', - 'WNAWAVE238', - 'TPCSurgeProb', # DCS3462 - 'GlobalWave', - 'EPwave10', - 'AKwave10', - 'AKwave4', - 'WCwave10', - 'WCwave4', - 'WNAwave10', - 'WNAwave4', - 'HurWind226', - ('DGEX185', 'DGEX'), - ('ETA218', 'NAM12'), - 'HPCGuide', - ('OPCWave180', 'OPCTAFBE'), - ('OPCWave181', 'OPCTAFBNW'), - ('OPCWave182', 'OPCTAFBSW'), - 'MOSGuide', - 'RTMA', - 'NamDNG5', - ('TPCWindProb','TPCProb'), - ('SREF212', 'SREF'), - #############DCS3501 - ('HiResW-ARW-East', 'HIRESWarw'), - ('HiResW-NMM-East', 'HIRESWnmm'), - ('SPCGuide', 'SPC'), - ('ECMWF-HiRes','ECMWFHiRes'), - #(GFESUITE_HOME + '/data/climo/PRISM'), - #(GFESUITE_HOME + '/data/climo/NCDC'), - ] - -else: #######DCS3501 WEST_CONUS - - D2DMODELS = [('GFS212', 'GFS40'), - ('AVN211', 'GFS80'), - ('ETA', 'NAM80'), - ('NGM', 'NGM80'), - ('MRF', 'gfsLR'), - ('RUC130', 'RUC13'), - ('RUC', 'RUC80'), - ('mesoEta212', 'NAM40'), - ('mesoEta215', 'NAM20'), - 'MSAS', - ('LAPS', 'LAPS'), - 'GWW233', - ('HPCqpf', 'HPCQPF'), - ('HPCqpfNDFD', 'HPCERP'), - ('RFCqpf', 'RFCQPF'), -#DR3511 'HPCdelta', - 'GLERL', - 'WNAWAVE238', - 'TPCSurgeProb', # DCS3462 - 'GlobalWave', - 'EPwave10', - 'WCwave10', - 'WCwave4', - 'WNAwave10', - 'WNAwave4', - 'AKwave10', - 'AKwave4', - 'AKWAVE', - 'HurWind226', - ('DGEX185', 'DGEX'), - ('ETA218', 'NAM12'), - 'HPCGuide', - ('OPCWave180', 'OPCTAFBE'), - ('OPCWave181', 'OPCTAFBNW'), - ('OPCWave182', 'OPCTAFBSW'), - 'MOSGuide', - 'RTMA', - 'NamDNG5', - ('TPCWindProb','TPCProb'), - ('SREF212', 'SREF'), - #############DCS3501 - ('HiResW-ARW-West', 'HIRESWarw'), - ('HiResW-NMM-West', 'HIRESWnmm'), - ('SPCGuide', 'SPC'), - ('ECMWF-HiRes','ECMWFHiRes'), - #(GFESUITE_HOME + '/data/climo/PRISM'), - #(GFESUITE_HOME + '/data/climo/NCDC'), - ] - -if SID in GreatLake_SITES: - D2DMODELS.append(('GRLKwave', 'GLWM')) - -#--------------------------------------------------------------------------- -# -# Where to find (and what to call) satellite data. -# -#--------------------------------------------------------------------------- -# - -# This table contains directory names and weather element names. - -# Alaska OCONUS -if SID in ALASKA_SITES: - SATDATA = [] - -# Hawaii OCONUS -elif SID == "HFO": - SATDATA = [] - -# San Juan OCONUS -elif SID == "SJU": - SATDATA = [("NESDIS/GOES-13(N)/East CONUS/Imager Visible", "visibleEast"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 11 micron IR", "ir11East"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 12 micron IR", "ir13East"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 3.9 micron IR", "ir39East"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporEast")] - -# Guam OCONUS -elif SID == "GUM": - SATDATA = [] - -#CONUS sites -else: - SATDATA = [("NESDIS/GOES-11(L)/West CONUS/Imager Visible", "visibleWest"), - ("NESDIS/GOES-11(L)/West CONUS/Imager 11 micron IR", "ir11West"), - ("NESDIS/GOES-11(L)/West CONUS/Imager 12 micron IR", "ir13West"), - ("NESDIS/GOES-11(L)/West CONUS/Imager 3.9 micron IR", "ir39West"), - ("NESDIS/GOES-11(L)/West CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporWest"), - ("NESDIS/GOES-13(N)/East CONUS/Imager Visible", "visibleEast"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 11 micron IR", "ir11East"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 12 micron IR", "ir13East"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 3.9 micron IR", "ir39East"), - ("NESDIS/GOES-13(N)/East CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporEast")] - -#--------------------------------------------------------------------------- -# -# Smart Initialization Configuration -# -#--------------------------------------------------------------------------- -# -# RFCs -if SID in RFC_SITES: - INITMODULES = {} #disable smart inits for RFCs - -# Alaska OCONUS -elif SID in ALASKA_SITES: - INITMODULES = { -# "AKNAM40" : ["NAM40", "NAM20"], - "AKWAVE" : ['AKWAVE'], -# "AKwave4" : ['AKwave4'], -# "AKwave10" : ['AKwave10'], -# "GlobalWave" : ["GlobalWave"], -# "NAM95" : ["NAM95"], -# "NGM95" : ["NGM95"], -# "gfsLR" : ["gfsLR"], - "NAM12" : ["NAM12"], - "GFS80" : ["GFS80"], -# "GFS190" : ["GFS190"], -#DCS3501 - "HIRESWarw" : ["HIRESWarw"], - "HIRESWnmm" : ["HIRESWnmm"], -#DR20634 "SPC" : ["SPC"], - "LAPS" : ["LAPS"], - "HPCQPF" : ['HPCQPF'], - "RFCQPF" : ['RFCQPF'], - "MSAS" : ['MSAS'], -# "HPCdelta" : ['HPCdelta'], - "SAT" : ['Satellite'], - "DGEX" : ['DGEX'], -# "GWW" : ["GWW"], -# "OPCTAFBNW" : ['OPCTAFBNW'], - "RTMA": ['RTMA'], - "NamDNG5" : ["NamDNG5"], - "AKMOSGuide" : ['MOSGuide'], - } - -# Hawaii OCONUS -elif SID == "HFO": - INITMODULES= { - "GFS75" : ["GFS75"], -#####DCS3501 - "HIRESWarw" : ["HIRESWarw"], - "HIRESWnmm" : ["HIRESWnmm"], -##DR20634 "SPC" : ["SPC"], -# "GlobalWave" : ["GlobalWave"], -# "EPwave10" : ["EPwEave10"], -# "GWW" : ["GWW"], -# "gfsLR" : ["gfsLR"], - "RTMA": ['RTMA'], - "NamDNG5" : ["NamDNG5"], - } - -# San Juan OCONUS -elif SID == "SJU": - #initialization module to model mappings - INITMODULES = { -# "NAM40" : ["NAM40", "NAM20"], -# "NAM80" : ["NAM80"], - "RUC13" : ["RUC13"], - "RUC80" : ["RUC80"], -# "gfsLR" : ["gfsLR"], -# "NGM80" : ["NGM80"], - "NAM12" : ["NAM12"], - "GFS80" : ["GFS80"], - "GFS40" : ["GFS40"], -#####DCS3501 - "HIRESWarw" : ["HIRESWarw"], - "HIRESWnmm" : ["HIRESWnmm"], -#DR20634 "SPC" : ["SPC"], - "LAPS" : ["LAPS"], - "HPCQPF" : ['HPCQPF'], - "RFCQPF" : ['RFCQPF'], - "MSAS" : ['MSAS'], -# "HPCdelta" : ['HPCdelta'], - "SAT" : ['Satellite'], -# "GWW" : ["GWW"], -# "OPCTAFBE" : ['OPCTAFBE'], -# "GlobalWave" : ["GlobalWave"], -# "EPwave10" : ["EPwEave10"], - "RTMA": ['RTMA'], - "NamDNG5" : ["NamDNG5"], - } - -# Guam OCONUS -elif SID == "GUM": - INITMODULES= { - "GFS75" : ["GFS75"], -# "GWW" : ["GWW"], -# "gfsLR" : ["gfsLR"], -# "GlobalWave" : ["GlobalWave"], - "RTMA": ['RTMA'], - } - -#CONUS sites -else: - #initialization module to model mappings - INITMODULES = { - "RUC13" : ["RUC13"], - "RUC80" : ["RUC80"], - "NAM12" : ["NAM12"], - "GFS40" : ["GFS40"], - "GFS80" : ["GFS80"], - "LAPS" : ["LAPS"], - "HPCQPF" : ['HPCQPF'], - "RFCQPF" : ['RFCQPF'], - "MSAS" : ['MSAS'], - "SAT" : ['Satellite'], - "DGEX" : ['DGEX'], - "MOSGuide" : ['MOSGuide'], - "HPCGuide" : ['HPCGuide'], - "RTMA": ['RTMA'], - "NamDNG5" : ["NamDNG5"], - "SREF" : ["SREF"], -#########DCS3501 - "GLWM" : ["GLWM"], - "HIRESWarw" : ["HIRESWarw"], - "HIRESWnmm" : ["HIRESWnmm"], -#DR20634 "SPC" : ["SPC"], -# "GlobalWave" : ["GlobalWave"], -# "EPwave10" : ["EPwave10"], -# "WCwave10" : ["WCwave10"], -# "WCwave4" : ["WCwave4"], -# "WNAwave10" : ["WNAwave10"], -# "WNAwave4" : ["WNAwave4"], - } - -#initialization skip certain model runs -INITSKIPS = { - "RUC13" : [1,2,4,5,7,8,10,11,13,14,16,17,19,20,22,23], - "RUC80" : [1,2,4,5,7,8,10,11,13,14,16,17,19,20,22,23] - } - -#--------------------------------------------------------------------------- -# -# D2D Accumulative Weather Elements -# -#--------------------------------------------------------------------------- -# This is a listing of D2D model name, and weather elements. The -# weather elements defined in this list are treated as accumulative -# elements, thus the snapshot time of the grid is converted to be a -# grid with timestep duration, starting the previous model timestep and -# going up to but not including the snapshot time. -D2DAccumulativeElements= { - "GFS40": ["tp", "cp", "crain", "csnow", "cfrzr", "cicep"], - "GFS80": ["tp", "cp"], - "GFS75": ["tp", "cp"], - "GFS190": ["tp", "cp"], - "NAM95": ["tp", "cp"], - "NAM80": ["tp", "cp"], - "NAM40": ["tp", "cp"], - "NAM20": ["tp", "cp"], - "NAM12": ["tp", "cp", "crain", "csnow", "cfrzr", "cicep"], - "NGM80": ["tp", "cp"], - "NGM95": ["tp", "cp"], - "gfsLR": ["tp", "cp"], - "RUC13": ["tp", "cp"], - "RUC80": ["tp", "cp"], - "MSAS": ["tp", "cp"], - "LAPS": ["pc"], - "DGEX": ["tp"], - "HPCQPF": ["tpHPC"], - "RFCQPF": ["tpHPC"], -#DR3511 "HPCdelta": ["pop", "tcc"], - "HPCGuide": ["pop"], - 'MOSGuide': ['pop12hr', 'pop6hr', 'thp12hr', 'thp3hr', 'thp6hr', 'tcc', 'tp6hr', 'tp12hr', 'wgs'], -#############DCS3501 - "HIRESWarw": ["tp"], - "HIRESWnmm": ["tp"], -#DR20634 "SPC": ["tp"], - - #Dummy ones for the transition from Eta to NAM. These are ignored. - # These will be removed after OB7.1. - #"Eta95": [], - #"Eta80": [], - #"Eta40": [], - #"Eta20": [], - #"Eta12": [], - - } - -#--------------------------------------------------------------------------- -# -# Intersite Coordination Configurations -# -#--------------------------------------------------------------------------- -# base urls for the ISC Routing Table -ISC_ROUTING_TABLE_ADDRESS = { - "ANCF" : "http://165.92.30.69:8080/irt", - "BNCF" : "http://165.92.180.25:8080/irt" - } - - -# list of sites that from which you want ISC data (If None, ifpServer will -# automatically calculate the list.) Should always include your own site. -REQUESTED_ISC_SITES = None - -# Overall ISC request flag. Must be set to 1 in order to request and receive -# ISC data. Must be 1 to register with the IRT. -REQUEST_ISC = 0 - -# Sending control flag. Set to 1 to send isc when data is saved. -SEND_ISC_ON_SAVE = 0 - -# Sending control flag. Set to 1 to send isc when data is published. -SEND_ISC_ON_PUBLISH = 0 - -# List of weather elements to request for ISC. If set to None, it defaults -# to the list of all weather elements in the Fcst database. -REQUESTED_ISC_PARMS = None - -# Transmission script for sending data. This is the script that iscExtract -# and other routines (e.g., vtec table sharing) will call to perform the -# actual transmission of data. -TRANSMIT_SCRIPT = GFESUITE_HOME + '/bin/gfe_msg_send -s %SUBJECT -a %ADDRESSES -i %WMOID -c 11 -p 0 -e %ATTACHMENTS' - - -# Extra ISC parms (weather elements). These are a list of the baseline -# weather elements to be added as extra parms to the ISC database. This -# is necessary when receiving ISC grids from a site that is a different -# office type than your own. You never need to add weather elements -# to the ISC database that is your own office type. The format of this -# entry is a list of tuples. The tuple is a list of weather elements -# objects (such as Temp and not "T"), and an office type, such as "rfc". -EXTRA_ISC_PARMS = [([QPF], 'rfc'), ([QPF], 'wfo')] - -#--------------------------------------------------------------------------- -# -# Misc. Configurations -# -#--------------------------------------------------------------------------- -# defines the number of days to keep log files -LOG_FILE_PURGE_AFTER = 28 - -# auto configure NotifyTextProd -- set after OB6 -AUTO_CONFIGURE_NOTIFYTEXTPROD = 1 #0=off,1=on - - -#----------------------------------- -# DO NOT CHANGE THE FOLLOWING SECTION -#------------------------------------ -# import the local config file -localParms = localNAM12Parms = localRUC13Parms = localRUC80Parms = localNGM80Parms = [] -localGFS80Parms = localgfsLRParms = localNAM40Parms = localDBs = [] -localOPCWavEParms = localOPCWavNWParms = localOPCWavSWParms = [] -localMOSGuideParms = localGFS40Parms = [] -localNAM80Parms = localLAPSParms = localISCParms = localGWWParms = [] -localNAM95Parms = localNGM95Parms = localDGEXParms = [] -localMSASParms = localGLERLParms = localWNAWAVEParms = localAKWAVEParms = [] -localMOSParms = localHPCQPFParms = localRFCQPFParms = [] -#DR3511 localHPCDeltaParms = [] -localTCMParms = localSATParms = localGFS75Parms = localGFS190Parms = [] -localAKwave10Parms = localAKwave4Parms = localEPwave10Parms = localGlobalWaveParms = [] -localWCwave10Parms = localWCwave4Parms = localWNAwave10Parms = localWNAwave4Parms = [] -localGLWMParms = [] #####DCS3499 -localParms = localHIRESWarwParms = localHIRESWnmmParms = [] #######DCS3501 -#DR20634 localParms = localSPCParms = [] -localHPCGuideParms = [] -localRTMAParms = [] -localNamDNG5Parms = [] -localSREFParms = [] -localTPCProbParms = [] -localISCExtraParms = [] - -myOfficeType = SITES[GFESUITE_SITEID][5] - -if not BASELINE and siteImport('localConfig'): - #ensure office type is set properly in localConfig SITES[] - if len(SITES[GFESUITE_SITEID]) == 5: - a = list(SITES[GFESUITE_SITEID]) - a.append(myOfficeType) - SITES[GFESUITE_SITEID] = tuple(a) - else: - myOfficeType = SITES[GFESUITE_SITEID] #probably from localConfig - - localParms = getattr(localConfig, 'parms', localParms) - localNAM12Parms = getattr(localConfig, 'parmsNAM12', localNAM12Parms) - localOPCWavEParms = getattr(localConfig, 'parmsOPCWavE', localOPCWavEParms) - localOPCWavSWParms = getattr(localConfig, 'parmsOPCWavSW', - localOPCWavSWParms) - localOPCWavNWParms = getattr(localConfig, 'parmsOPCWavNW', - localOPCWavNWParms) - localNAM40Parms = getattr(localConfig, 'parmsNAM40', localNAM40Parms) - localNAM80Parms = getattr(localConfig, 'parmsNAM80', localNAM80Parms) - localNAM95Parms = getattr(localConfig, 'parmsNAM95', localNAM95Parms) - localRUC13Parms = getattr(localConfig, 'parmsRUC13', localRUC13Parms) - localRUC80Parms = getattr(localConfig, 'parmsRUC80', localRUC80Parms) - localNGM80Parms = getattr(localConfig, 'parmsNGM80', localNGM80Parms) - localNGM95Parms = getattr(localConfig, 'parmsNGM95', localNGM95Parms) - localGFS40Parms = getattr(localConfig, 'parmsGFS40', localGFS40Parms) - localGFS80Parms = getattr(localConfig, 'parmsGFS80', localGFS80Parms) - localGFS190Parms = getattr(localConfig, 'parmsGFS190', localGFS190Parms) - localGFS75Parms = getattr(localConfig, 'parmsGFS75', localGFS75Parms) - localgfsLRParms = getattr(localConfig, 'parmsgfsLR', localgfsLRParms) - localISCParms = getattr(localConfig, 'parmsISC', localISCParms) - localGWWParms = getattr(localConfig, 'parmsGWW', localGWWParms) - localGLWMParms = getattr(localConfig, 'parmsGLWM', localGLWMParms) #########DCS3499 - localHIRESWarwParms = getattr(localConfig, 'parmsHIRESWarw', localHIRESWarwParms) ########DCS3501 - localHIRESWnmmParms = getattr(localConfig, 'parmsHIRESWnmm', localHIRESWnmmParms) -#DR20634 localSPCParms = getattr(localConfig, 'parmsSPC', localSPCParms) - localWNAWAVEParms = getattr(localConfig, 'parmsWNAWAVE', localWNAWAVEParms) - localAKWAVEParms = getattr(localConfig, 'parmsAKWAVE', localAKWAVEParms) - localLAPSParms = getattr(localConfig, 'parmsLAPS', localLAPSParms) - localMOSGuideParms = getattr(localConfig, 'parmsMOSGuide', - localMOSGuideParms) - localSREFParms = getattr(localConfig, 'parmsSREF', localSREFParms) - localSATParms = getattr(localConfig, 'parmsSAT', localSATParms) - localMSASParms = getattr(localConfig, 'parmsMSAS', localMSASParms) - localGLERLParms = getattr(localConfig, 'parmsGLERL', localGLERLParms) - localDBs = getattr(localConfig, 'dbs', localDBs) - localMOSParms = getattr(localConfig, 'parmsMOS', localMOSParms) - localHPCQPFParms = getattr(localConfig, 'parmsHPCQPF', localHPCQPFParms) - localRFCQPFParms = getattr(localConfig, 'parmsRFCQPF', localRFCQPFParms) -#DR3511 localHPCDeltaParms = getattr(localConfig, 'parmsHPCDelta', -#DR3511 localHPCDeltaParms) - localTCMParms = getattr(localConfig, 'parmsTCM', localTCMParms) - localDGEXParms = getattr(localConfig, 'parmsDGEX', localDGEXParms) - localHPCGuideParms = getattr(localConfig, 'parmsHPCGuide', - localHPCGuideParms) - localRTMAParms = getattr(localConfig, 'parmsRTMA', localRTMAParms) - localNamDNG5Parms = getattr(localConfig, 'parmsNamDNG5', localNamDNG5Parms) - localTPCProbParms = getattr(localConfig, 'parmsTPCProb', localTPCProbParms) - - #note that extraISCparms are not in the standard format. These - #are a list of ([p, p, p, p], officeType) - localISCExtraParms = getattr(localConfig, 'extraISCparms', localISCExtraParms) - -#--------------------------------------------------------------------------- -# Parm groups. Combine parms with time constraints -# list of ([parms], timeConstraints) -#--------------------------------------------------------------------------- - -# 6 hourly -STD6_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC6), - ([Haines, MixHgt, FreeWind, TransWind, VentRate], TC6), - ([DSI, Stability, Ttrend, RHtrend], TC6), - ([SnowAmt, PoP, CWR], TC6NG), ([QPF, Weather, IceAcc, LAL], TC6NG), - ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), - ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), - ([MaxT], MaxTTC), ([MinT], MinTTC), - ([Wetflag], FireWx1300TC)] - -# hourly -STD1_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC1), - ([Haines, MixHgt, FreeWind, TransWind], TC1), - ([DSI, Stability, VentRate, Ttrend, RHtrend], TC1), - ([SnowAmt, PoP, CWR], TC1), ([QPF, Weather, IceAcc, LAL], TC1), - ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), - ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), - ([MaxT], MaxTTC), ([MinT], MinTTC), - ([Wetflag], FireWx1300TC)] - -# 3 hourly -STD3_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC3), - ([Haines, MixHgt, FreeWind, TransWind], TC3), - ([DSI, Stability, VentRate, Ttrend, RHtrend], TC3), - ([SnowAmt, PoP, CWR], TC3NG), ([QPF, IceAcc, Weather, LAL], TC3NG), - ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), - ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), - ([MaxT], MaxTTC), ([MinT], MinTTC), - ([Wetflag], FireWx1300TC)] - -######DCS3501 -# 3 hourly-HIRESW -STD3_MODEL_HIRESW = [([Temp, Td, RH, Wind, FzLevel], TC3), - ([MixHgt, FreeWind, TransWind], TC3), ([QPF, CWR], TC3NG), - ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), - ([MaxT], MaxTTC), ([MinT], MinTTC)] - -# 12 hourly -STD12_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC12), - ([Haines, MixHgt, FreeWind, TransWind], TC12), - ([DSI, Stability, VentRate, Ttrend, RHtrend], TC12), - ([SnowAmt, PoP, CWR], TC12NG), - ([QPF, IceAcc, Weather, LAL], TC12NG), - ([MaxT], MaxTTC), ([MinT], MinTTC), - ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), - ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), - ([Wetflag], FireWx1300TC)] - -# MOS (Model) -MOS_MODEL = [([Temp, Td, Wind, Weather, Sky], TC1), - ([MaxT], MaxTTCMOS), ([MinT], MinTTCMOS), - ([SnowAmt, PoP], LTMOS), ([QPF], TC6NG)] - -# Fcst and official database parameter groupings -OFFICIALDBS = [([Temp, Td, Wind, Weather, Sky, FzLevel, SnowLevel], TC1), - ([HeatIndex, WindChill, RH, SnowAmt, CWR, QPF], TC1), - ([PoP, Ttrend, RHtrend, Wind20ft], TC1), - ([MinT], MinTTC), ([MaxT], MaxTTC), - ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), - ([WaveHeight, SurfHeight, WindGust, Swell, Swell2, Period, Period2], TC1), - ([VentRate, LAL, Haines, MixHgt, FreeWind, TransWind], TC1), - ([WindWaveHeight, DSI, Stability, MarineLayer], TC1), - ([HrsOfSun, InvBurnOffTemp], LT24), - ([IceAcc, IceCoverage, Hazards], TC1), - ([Wetflag], FireWx1300TC), - ([StormTotalSnow], TC1), - # Tropical parms - ([prob34, prob50, prob64], TC1), - ([pws34,pws50,pws64,SurgeHtPlusTide,SurgeHtPlusTideWTopo], TC1), - ([pwsD34,pwsD64], PWSDTC), - ([pwsN34,pwsN64], PWSNTC), - ([pws34int,pws64int], TC6NG), - # DR20541 and 20482 - ([PoP12hr], TC12NG), - ([QPF6hr, SnowAmt6hr], TC6NG), - ([cape], LT6NG), - ([ApparentT, HeatIndex, WindChill, UWaveDir, VWaveDir, LkSfcT, SnowMap, WaveDir, SnowRatio, StormTotalQPF], TC1), - ] - -# Global Wave Watch III, WNAWAVE, AKWAVE Model database parameter groupings -WAVEPARMS = [([WindWaveHeight, WaveHeight, SurfHeight, Wind], TC6), - ([Swell, Swell2, Period, Period2], TC6)] - -# GLWM Model database parameter groupings -GLWMPARMS = [([SigWaveHgt, WindWaveHgt, WindWaveDir, WindWavePeriod], TC1)] -######DCS3501 -# HIRESW database parameter groupings -HIRESWarwPARMS = [([Temp], TC3)] -HIRESWnmmPARMS = [([Temp], TC3)] -#DR20634 SPCPARMS = [([Temp], TC1)] - -# LAPS database parameter groupings -LAPSPARMS = [([Temp, Td, Wind, Weather, Sky, SnowAmt, QPF, Radar], TC1)] - -# MOS Guide parameters - this is supposed to be a fix to the baseline error - we'll see -#MOSGuidePARMS = [([Temp, Td, Wind, RH], TC3), -# ([MinT], MinTTC), ([MaxT], MaxTTC), -# ([PoP6, PoP12, TstmPrb3, TstmPrb6, TstmPrb12, Sky, WindGust, QPF6, QPF12], TC6NG)] -MOSGuidePARMS = [([Temp, Td, Wind, RH], TC1), - ([MinT], MinTTC), ([MaxT], MaxTTC), - ([TstmPrb3], TC3NG), - ([PoP6, TstmPrb6, Sky, WindGust, QPF6], TC6NG), - ([PoP12, PoP, QPF12, QPF, TstmPrb12], TC12NG)] - -# OPC TAF parameters (for NW, SW, and E) -OPCTAFBPARMS = [([WindWaveHeight, WaveHeight], TC1)] - -# SAT database parameter groupings -SATPARMS = [([SatVisE, SatIR11E, SatIR13E, SatIR39E, SatWVE, SatFogE], TC_1M), - ([SatVisW, SatIR11W, SatIR13W, SatIR39W, SatWVW, SatFogW], TC_1M)] - -# MSAS database parameter groupings -MSASPARMS = [([Temp, Td, Wind], TC1)] - -# GLERL database parameter groupings -GLERLPARMS = [([WaveHeight, Period, Swell], TC1)] - -# SREF database parameter groupings -SREFPARMS = [([Temp, Td, Wind], TC1)] - -HPCQPF_MODEL = [([QPF], TC6NG)] -RFCQPF_MODEL = [([QPF], TC6NG)] - -#DR3511 HPCDELTA_MODEL = [([DeltaMinT], MinTTC), ([DeltaMaxT], DeltaMaxTTC), -#DR3511 ([DeltaWind], TC12), -#DR3511 ([DeltaPoP, DeltaSky], TC12NG)] -#DR3511 -HPCGUIDE_MODEL = [([MaxT], MaxTTC), ([MinT], MinTTC), - ([Sky, Td, Wind], TC6), ([PoP], TC12NG)] - -# This model has Wind, but we use a different definition here since we -# want to higher maximum velocity to be allowed. -TPCTCM_MODEL = [([HiWind], TC3)] - -# RTMA database parameter groupings -#if SID in ALASKA_SITES: - not sure if this is right -if SID in ALASKA_SITES or SID in ["HFO", "SJU"]: - RTMAPARMS = [([Temp,Td,RH,Wind],TC1), - ([MinT],MinTTC), ([MaxT],MaxTTC), - ([MinRH],MinRHTC), ([MaxRH],MaxRHTC), - ([TUnc,TdUnc,WSpdUnc,WDirUnc],TC1)] -else: - RTMAPARMS = [([Temp,Td,RH,Wind,QPE,Sky],TC1), - ([MinT],MinTTC), ([MaxT],MaxTTC), - ([MinRH],MinRHTC), ([MaxRH],MaxRHTC), - ([TUnc,TdUnc,WSpdUnc,WDirUnc],TC1)] - -# NamDNG5 database parameter groupings -NamDNG5PARMS = [([Temp, Td, RH, Wind, Sky, WindGust, Vis], TC3), - ([MixHgt, TransWind, SnowLevel], TC3), - ([MinT], MinTTC), ([MaxT], MaxTTC), - ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), - ([QPF3, PoP, SnowAmt], TC3NG), - ([QPF6, PoP6, SnowAmt6], TC6NG), ([QPF12, PoP12], TC12NG), - ([MaxT3, MinT3, MaxRH3], TC3NG), - ] - -TPCProbPARMS = [([prob34, prob50, prob64], TC1), - ([pws34,pws50,pws64], TC1), - ([pwsD34,pwsD64], PWSDTC), - ([pwsN34,pwsN64], PWSNTC), - ] - -# Cobb snow tool -parmsNAM12 = [([SnowRatio], TC1)] -parmsGFS40 = [([SnowRatio], TC1)] -#--------------------------------------------------------------------------- -# Databases for a site. -# list of (Database, [parms]) -#--------------------------------------------------------------------------- -DATABASES = [(Official, OFFICIALDBS + localParms), - (Fcst, OFFICIALDBS + localParms), - (Practice, OFFICIALDBS + localParms), - (TestFcst, OFFICIALDBS + localParms), - (NAM80, STD6_MODEL + localNAM80Parms), - (NAM95, STD6_MODEL + localNAM95Parms), - (RUC13, STD1_MODEL + localRUC13Parms), - (RUC80, STD1_MODEL + localRUC80Parms), - (NGM80, STD6_MODEL + localNGM80Parms), - (NGM95, STD6_MODEL + localNGM95Parms), - (GFS40, STD6_MODEL + localGFS40Parms), - (GFS80, STD6_MODEL + localGFS80Parms), - (GFS75, STD6_MODEL + localGFS75Parms), - (GFS190, STD6_MODEL + localGFS190Parms), - (NAM40, STD3_MODEL + localNAM40Parms), - (NAM12, STD3_MODEL + localNAM12Parms), - (gfsLR, STD12_MODEL + localgfsLRParms), - (GWW, WAVEPARMS + localGWWParms), - (WNAWAVE, WAVEPARMS + localWNAWAVEParms), - (AKWAVE, WAVEPARMS + localAKWAVEParms), - (AKwave10, WAVEPARMS + localAKwave10Parms), - (AKwave4, WAVEPARMS + localAKwave4Parms), - (EPwave10, WAVEPARMS + localEPwave10Parms), - (GlobalWave, WAVEPARMS + localGlobalWaveParms), - (GLWM, GLWMPARMS + localGLWMParms), #####DCS3499 - (HIRESWarw, STD3_MODEL + localHIRESWarwParms), #####DCS3501 - (HIRESWnmm, STD3_MODEL + localHIRESWnmmParms), -#DR20634 (SPC, SPCPARMS + localSPCParms), - (WCwave10, WAVEPARMS + localWCwave10Parms), - (WCwave4, WAVEPARMS + localWCwave4Parms), - (WNAwave10, WAVEPARMS + localWNAwave10Parms), - (WNAwave4, WAVEPARMS + localWNAwave4Parms), - (HPCGrid, MOS_MODEL + localMOSParms), - (HPCQPF, HPCQPF_MODEL + localHPCQPFParms), - (RFCQPF, RFCQPF_MODEL + localRFCQPFParms), -#DR3511 (HPCDelta, HPCDELTA_MODEL + localHPCDeltaParms), - (HPCGuide, HPCGUIDE_MODEL + localHPCGuideParms), - (TPCTCM, TPCTCM_MODEL + localTCMParms), - (DGEX, STD6_MODEL + localDGEXParms), - (LAPS, LAPSPARMS + localLAPSParms), - (MOSGuide, MOSGuidePARMS + localMOSGuideParms), - (SREF, SREFPARMS + localSREFParms), - (OPCTAFBE, OPCTAFBPARMS + localOPCWavEParms), - (OPCTAFBNW, OPCTAFBPARMS + localOPCWavNWParms), - (OPCTAFBSW, OPCTAFBPARMS + localOPCWavSWParms), - (SAT, SATPARMS + localSATParms), - (MSAS, MSASPARMS + localMSASParms), - (GLERL, GLERLPARMS + localGLERLParms), - (RTMA, RTMAPARMS + localRTMAParms), - (NamDNG5, NamDNG5PARMS + localNamDNG5Parms), - (TPCProb, TPCProbPARMS + localTPCProbParms), - (Test, OFFICIALDBS + localParms)] + localDBs - -# Intersite coordination database parameter groupings, based on -# OFFICIALDBS, but time constraint is always TC1 -ISCPARMS = [] -for wes, tc in (OFFICIALDBS + localISCParms): - ISCPARMS.append((wes, TC1)) -# We also add in any extraISCparms as needed, but only for office -# types other than our own. -for wes, officeType in (EXTRA_ISC_PARMS + localISCExtraParms): - if myOfficeType == officeType: - continue - for we in wes: - wecopy = list(we) - wecopy[0] = wecopy[0] + officeType #rename the weather element - wecopy = tuple(wecopy) - ISCPARMS.append(([wecopy], TC1)) - -# Restore database parameter groupings (based on OFFICIALDBS, but TC1) -RESTOREPARMS = [] -for wes, tc in (OFFICIALDBS + localParms): - RESTOREPARMS.append((wes, TC1)) - -# Now add the ISC and Restore databases to the DATABASES groupings -DATABASES.append((Restore, RESTOREPARMS)) -DATABASES.append((ISC, ISCPARMS)) - -#--------------------------------------------------------------------------- -# -# General server configuration section -# -#--------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Server settings DO NOT CHANGE THESE DEFINITIONS -#---------------------------------------------------------------------------- -from com.raytheon.edex.plugin.gfe.config import IFPServerConfig, SimpleServerConfig -IFPConfigServer = SimpleServerConfig() -#IFPConfigServer.allowedNodes = [] -IFPConfigServer.allowTopoBelowZero = 1 - - -def doIt(): - # Import the local site configuration file (if it exists) - import doConfig -# import VTECPartners - (models, projections, vis, wx, desDef, allSites, domain, siteId, timeZone,officeTypes) = \ - doConfig.parse(GFESUITE_SITEID, DATABASES, types, visibilities, SITES, - allProjections) - IFPConfigServer.models = models - IFPConfigServer.projectionData = projections - IFPConfigServer.weatherVisibilities = vis - IFPConfigServer.weatherTypes = wx - IFPConfigServer.discreteDefinitions = desDef - IFPConfigServer.allSites = allSites - IFPConfigServer.officeTypes = officeTypes - IFPConfigServer.siteID = siteId - IFPConfigServer.timeZone = timeZone - IFPConfigServer.d2dModels = doConfig.d2dParse(D2DMODELS) - IFPConfigServer.satDirs = doConfig.parseSat(SATDATA) - IFPConfigServer.domain = domain - - (serverHost, mhsid, \ - rpcPort, \ - initMethods, accumulativeD2DElements, \ - initSkips, d2dVersions, \ - logFilePurgeAfter, \ - prdDir, baseDir, \ - extraWEPrecision, \ - autoConfigureNotifyTextProd, \ - iscRoutingTableAddress, \ - requestedISCsites, requestISC, \ - sendiscOnSave, sendiscOnPublish, \ - requestedISCparms, \ - transmitScript) \ - = doConfig.otherParse(\ - GFESUITE_SERVER, GFESUITE_MHSID, \ - GFESUITE_PORT, INITMODULES, - D2DAccumulativeElements, - INITSKIPS, D2DDBVERSIONS, LOG_FILE_PURGE_AFTER, - GFESUITE_PRDDIR, GFESUITE_HOME, - ExtraWEPrecision, AUTO_CONFIGURE_NOTIFYTEXTPROD, ISC_ROUTING_TABLE_ADDRESS, - REQUESTED_ISC_SITES, REQUEST_ISC, SEND_ISC_ON_SAVE, SEND_ISC_ON_PUBLISH, - REQUESTED_ISC_PARMS, TRANSMIT_SCRIPT) - IFPConfigServer.serverHost = serverHost - IFPConfigServer.mhsid = mhsid - IFPConfigServer.rpcPort = rpcPort - IFPConfigServer.initMethods = initMethods - IFPConfigServer.accumulativeD2DElements = accumulativeD2DElements - IFPConfigServer.initSkips = initSkips - IFPConfigServer.d2dVersions = d2dVersions - IFPConfigServer.logFilePurgeAfter = logFilePurgeAfter - IFPConfigServer.prdDir = prdDir - IFPConfigServer.baseDir = baseDir - IFPConfigServer.extraWEPrecision = extraWEPrecision - IFPConfigServer.autoConfigureNotifyTextProd = autoConfigureNotifyTextProd - IFPConfigServer.iscRoutingTableAddress = iscRoutingTableAddress - IFPConfigServer.requestedISCsites = requestedISCsites - IFPConfigServer.requestISC = requestISC - IFPConfigServer.sendiscOnSave = sendiscOnSave - IFPConfigServer.sendiscOnPublish = sendiscOnPublish - IFPConfigServer.requestedISCparms = requestedISCparms - IFPConfigServer.transmitScript = transmitScript - -doIt() +## +# 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. +## +# NOTE: THIS FILE SHOULD NOT BE USER-MODIFIED. INSTEAD REFER TO THE +# LOCAL CONFIG DOCUMENTATION ON HOW TO OVERRIDE SETTINGS IN THIS FILE. + +#---------------------------------------------------------------------------- +# USEFUL DEFINES +#---------------------------------------------------------------------------- +#import siteConfig, LogStream, config, imp +import siteConfig,imp + +BASELINE = getattr(siteConfig, 'BASELINE', 0) + +# imports the named module. If the module +# does not exist, it is just ignored. But +# if it exists and has an error, the exception +# is thrown. If the module was imported returns +# true. +def siteImport(modName): + try: + fp, path, des = imp.find_module(modName) + if fp: + fp.close() + except ImportError: + return 0 + globals()[modName] = __import__(modName) + return 1 + +GFESUITE_SITEID = siteConfig.GFESUITE_SITEID +GFESUITE_MHSID = siteConfig.GFESUITE_MHSID +GFESUITE_SERVER = siteConfig.GFESUITE_SERVER +GFESUITE_HOME = siteConfig.GFESUITE_HOME +GFESUITE_PORT = int(siteConfig.GFESUITE_PORT) +#GFESUITE_DATDIR = siteConfig.GFESUITE_DATDIR +GFESUITE_LOGDIR = siteConfig.GFESUITE_LOGDIR +GFESUITE_PRDDIR = siteConfig.GFESUITE_PRDDIR +#GFESUITE_SHPDIR = siteConfig.GFESUITE_SHPDIR +#GFESUITE_TOPODIR = siteConfig.GFESUITE_TOPODIR +#GFESUITE_VTECDIR = siteConfig.GFESUITE_VTECDIR + +SID = GFESUITE_SITEID + +ALASKA_SITES = ['AFG', 'AJK', 'AICE', 'ALU', 'AER', 'ACR', 'AFC'] +GreatLake_SITES = ['LOT', 'MKX', 'GRB', 'DLH', 'MQT', 'APX', 'GRR', 'DTX', + 'IWX', 'CLE', 'BUF', 'PBZ', 'ILN', 'IND', 'ILX', 'MPX', 'FGF'] +CONUS_EAST_SITES = ['ALY', 'AKQ', 'APX', 'BGM', 'BMX', 'BOX', 'BTV', 'BUF', + 'CAE', 'CAR', 'CHS', 'CLE', 'CTP', 'DTX', 'FFC', 'GRR', + 'GSP', 'GYX', 'ILM', 'ILN', 'IND', 'JAN', 'JAX', 'JKL', + 'LCH', 'LMK', 'LWX', 'MEG', 'MFL', 'MHX', 'MLB', 'MOB', + 'MQT', 'MRX', 'OKX', 'PAH', 'PBZ', 'PHI', 'RAH', 'RLX', + 'RNK', 'TAE', 'TBW', 'ALR', 'RHA', 'TAR', 'TIR'] +RFC_SITES = ["ACR", "FWR", "KRF", "MSR", "ORN", "PTR", + "RHA", "RSA", "STR", "TAR", "TIR", "TUA"] + +#--------------------------------------------------------------------------- +# +# Weather Element configuration section. +# +#--------------------------------------------------------------------------- + +SCALAR = 'Scalar' +VECTOR = 'Vector' +WEATHER = 'Weather' +DISCRETE = 'Discrete' +YES = 1 +NO = 0 + +#SCALAR, VECTOR +# name/type/units/description/max/min/precision/rateParm/ +#WEATHER +# name/WEATHER/units/description/ +#DISCRETE +# keyDef = [(keySym, keyDesc), (keySym, keyDesc)] +# name/DISCRETE/units/description/overlapCapable/keyDef/ + +# Standard Public Weather Elements +SID = GFESUITE_SITEID +Temp = ("T", SCALAR, "F", "Surface Temperature", 120.0, -80.0, 0, NO) +Td = ("Td", SCALAR, "F", "Dewpoint", 120.0, -80.0, 0, NO) +MaxT = ("MaxT", SCALAR, "F", "Maximum Temperature", 120.0, -80.0, 0, NO) +MinT = ("MinT", SCALAR, "F", "Minimum Temperature", 120.0, -80.0, 0, NO) +HeatIndex = ("HeatIndex", SCALAR, "F", "Heat Index", 130.0, -80.0, 0, NO) +WindChill = ("WindChill", SCALAR, "F", "Wind Chill", 120.0, -120.0, 0, NO) +QPF = ("QPF", SCALAR, "in", "QPF", 5.0, 0.0, 2, YES) +Wind = ("Wind", VECTOR, "kts", "Surface Wind", 125.0, 0.0, 0, NO) +# special for TPC hurricane winds +HiWind = ("Wind", VECTOR, "kts", "Surface Wind", 200.0, 0.0, 0, NO) +Weather = ("Wx", WEATHER, "wx", "Weather") +IceAcc = ("IceAccum", SCALAR, "in", "Ice Accumulation", 12.0, 0.0, 1, YES) +SnowAmt = ("SnowAmt", SCALAR, "in", "Snowfall amount", 20.0, 0.0, 1, YES) +StormTotalSnow = ("StormTotalSnow", SCALAR, "in","Storm Total Snow", 50.0, + 0.0, 1, YES) +PoP = ("PoP", SCALAR, "%", "Prob of Precip", 100.0, 0.0, 0, NO) +PoP6 = ("PoP6", SCALAR, "%", "Prob of Precip (6hr)", 100.0, 0.0, 0, NO) +PoP12 = ("PoP12", SCALAR, "%", "Prob of Precip (12hr)", 100.0, 0.0, 0, NO) +TstmPrb3 = ("TstmPrb3", SCALAR, "%", "Prob of Tstorm (3hr)", 100.0, 0.0, 0, NO) +TstmPrb6 = ("TstmPrb6", SCALAR, "%", "Prob of Tstorm (6hr)", 100.0, 0.0, 0, NO) +TstmPrb12 = ("TstmPrb12", SCALAR, "%", "Prob of Tstorm (12hr)", 100.0, 0.0, 0, + NO) +Sky = ("Sky", SCALAR, "%", "Sky Condition", 100.0, 0.0, 0, NO) +FzLevel = ("FzLevel", SCALAR, "ft", "Freezing level", 30000.0, 0.0, 0, NO) +SnowLevel = ("SnowLevel", SCALAR, "ft", "Snow Level", 18000.0, 0.0, 0, NO) +RH = ("RH", SCALAR, "%", "Relative Humidity", 100.0, 0.0, 0, NO) + +# DR20541 and 20482 - add collaborate PoP, SnowAmt, QPF and ndfd QPF tools +PoP12hr = ("PoP12hr", SCALAR, "%", "12 hr Chance of Precip", 100.0, 0.0, 0, NO) +QPF6hr = ("QPF6hr", SCALAR, "in", "6 hr Precipitation (in)", 5.0, 0.0, 2, YES) +SnowAmt6hr = ("SnowAmt6hr", SCALAR, "in", "6 hr Snowfall", 30.0, 0.0, 1, YES) + +# Cobb SnowTool included. +SnowRatio = ('SnowRatio', SCALAR, '%', 'Snow Ratio', 40.0, 0.0, 1, YES) +#totalVV = ('totalVV', SCALAR, 'ubar/s', 'Total VV', 400.0, 0.0, 0, YES) +cape = ("cape", SCALAR, "1unit", "CAPE", 8000.0, 0.0, 1, NO) +ApparentT = ("ApparentT", SCALAR, "F", "Apparent Temperature", 130.0, -120.0, 0, NO) +UWaveDir = ("UWaveDir", SCALAR, "m/s", "U WaveDir Comp", 0.50, -0.50, 3, NO) +VWaveDir = ("VWaveDir", SCALAR, "m/s", "V WaveDir Comp", 0.50, -0.50, 3, NO) +LkSfcT = ("LkSfcT", SCALAR, "C", "Lake Surface T", 40.0, -2.0, 1, NO) +SnowMap = ("SnowMap", SCALAR, "in", "Snowfall Map", 20.0, 0.0, 1, YES) +WaveDir = ("WaveDir", VECTOR, "m/s", "Wave Direction", 5.0, 0.0, 2, NO) +StormTotalQPF = ('StormTotalQPF', SCALAR, 'in', 'Storm Total QPF (in)', 10.0, 0.0, 2, YES) +SeasonTotalSnow = ('SeasonTotalSnow', SCALAR, 'in', 'Season Total Snow (in)', 150.0, 0.0, 2, YES) + +# Marine Weather Elements +WindWaveHeight = ("WindWaveHgt", SCALAR, "ft", "Wind Wave Height", + 100.0, 0.0, 0, NO) +WaveHeight = ("WaveHeight", SCALAR, "ft", "Total Wave Height", + 100.0, 0.0, 0, NO) +Swell = ("Swell", VECTOR, "ft", "Primary Swell", 100.0, 0.0, 0, NO) +Swell2 = ("Swell2", VECTOR, "ft", "Secondary Swell", 100.0, 0.0, 0, NO) +Period = ("Period", SCALAR, "sec", "Primary Period", 20.0, 0.0, 0, NO) +Period2 = ("Period2", SCALAR, "sec", "Secondary Period", 20.0, 0.0, 0, NO) +WindGust = ("WindGust", SCALAR, "kts", "Wind Gust", 125.0, 0.0, 0, NO) +IceCoverage = ("IceCoverage", SCALAR, "%", "Ice Coverage Amount", + 100.0, 0.0, 0, NO) +SurfHeight = ("SurfHeight", SCALAR, "ft", "Total Wave Height", + 100.0, 0.0, 0, NO) +##########DCS3499 +SigWaveHgt = ("SigWaveHgt", SCALAR, "ft", + "Significant wave height of combined wind waves and swells", + 30.0, 0.0, 0, NO) +WindWaveHgt = ("WindWaveHgt", SCALAR, "ft", "Significant wave height of wind waves", + 30.0, 0.0, 0, NO) +WindWavePeriod = ("WindWavePeriod", SCALAR, "sec.", "Wind wave peak period", 20.0, 0.0, 0, NO) +WindWaveDir = ("WindWaveDir", VECTOR, "degree", "Direction of wind waves", 100.0, 0.0, 0, NO) + +# Fire Weather Weather Elements +LAL = ("LAL", SCALAR, "cat", "Lightning Activity Level", 6.0, 1.0, 0, NO) +CWR = ("CWR", SCALAR, "%", "Chance of Wetting Rain", 100.0, 0.0, 0, NO) +Haines = ("Haines", SCALAR, "cat", "Haines Index", 6.0, 2.0, 0, NO) +MixHgt = ("MixHgt", SCALAR, "ft", "Mixing Height", 20000.0, 0.0, 0, NO) +Wind20ft = ("Wind20ft", VECTOR, "kts", "20ft. Wind", 125.0, 0.0, 0, NO) +FreeWind = ("FreeWind", VECTOR, "kts", "Free Air Wind", 125.0, 0.0, 0, NO) +TransWind = ("TransWind", VECTOR, "kts", "Transport Wind", 125.0, 0.0, 0, NO) +Stability = ("Stability",SCALAR,"cat","Stability", 6.0,1.0,0, NO) +HrsOfSun = ("HrsOfSun",SCALAR,"hrs","Hours of Sun",24.0,0.0,1, YES) +MarineLayer = ("MarineLayer",SCALAR,"ft","Depth of Marine Layer", + 20000.0,0.0,0,NO) +InvBurnOffTemp = ("InvBurnOffTemp",SCALAR,"F","Inversion Burn-off Temperature", + 120.0,-30.0,0, NO) +VentRate = ("VentRate", SCALAR, "kt*ft", "VentRate", 500000.0, 0.0, 0, NO) +DSI = ("DSI", SCALAR, "index", "DSI", 6.0, 0.0, 0, NO) +MaxRH = ("MaxRH", SCALAR, "%", "Maximum Relative Humidity", + 100.0, 0.0, 0, NO) +MinRH = ("MinRH", SCALAR, "%", "Minimum Relative Humidity", + 100.0, 0.0, 0, NO) +Wetflag = ("Wetflag", SCALAR, "yn", "1300LT WetFlag", 1.0, 0.0, 0, NO) +Ttrend = ("Ttrend", SCALAR, "F", "24hr Temperature Trend", 50.0, -50.0, 0, NO) +RHtrend = ("RHtrend", SCALAR, "F", "24hr Relative Humidity Trend", + 100.0, -100.0, 0, NO) + +# HPC Delta weather elements +DeltaMinT = ("DeltaMinT", SCALAR, "F", "Delta Minimum Temperature", + 50.0, -50.0, 0, NO) +DeltaMaxT = ("DeltaMaxT", SCALAR, "F", "Delta Maximum Temperature", + 50.0, -50.0, 0, NO) +DeltaWind = ("DeltaWind", VECTOR, "kts", "Surface Delta Wind", + 125.0, 0.0, 0, NO) +DeltaSky = ("DeltaSky", SCALAR, "%", "Delta Sky Condition", + 100.0, -100.0, 0, NO) +DeltaPoP = ("DeltaPoP", SCALAR, "%", "Delta Prob of Precip", + 100.0, -100.0, 0, NO) + +# Special LAPS parms +Radar = ("Radar", SCALAR, "dbz", "Radar Reflectivity", 80.0, -20.0, 0, NO) + +# RTMA parms +QPE = ("QPE", SCALAR, "in", "QPE", 5.0, 0.0, 2, YES) +#if SID in ALASKA_SITES: - not sure if this needs to be like that +if SID in ALASKA_SITES or SID in ["HFO", "SJU"]: + TUnc = ("TUnc", SCALAR, "F", "Temperature Anl Uncertainty", 20.0, 0.0, 0, NO) + TdUnc = ("TdUnc", SCALAR, "F", "Dewpoint Anl Uncertainty", 25.0, 0.0, 0, NO) +else: + TUnc = ("TUnc", SCALAR, "F", "Temperature Anl Uncertainty", 10.0, 0.0, 0, NO) + TdUnc = ("TdUnc", SCALAR, "F", "Dewpoint Anl Uncertainty", 15.0, 0.0, 0, NO) +WSpdUnc = ("WSpdUnc", SCALAR, "kts", "WSpd Anl Uncertainty", 12.0, 0.0, 0, NO) +WDirUnc = ("WDirUnc", SCALAR, "deg", "WDir Anl Uncertainty", 10.0, 0.0, 0, NO) + +# NamDNG5 parms +QPF3 = ("QPF3", SCALAR, "in", "3HR QPF", 3.0, 0.0, 2, YES) +QPF6 = ("QPF6", SCALAR, "in", "6HR QPF", 5.0, 0.0, 2, YES) +QPF12 = ("QPF12", SCALAR, "in", "12HR QPF", 10.0, 0.0, 2, YES) +Vis = ("Vis", SCALAR, "SM", "Visibility", 10.0, 0.0, 2, NO) +SnowAmt6 = ("SnowAmt6", SCALAR, "in", "Snowfall amount (6hr)", 20.0, 0.0, 1, YES) + +MaxT3 = ("MaxT3", SCALAR, "F", "3hr Maximum Temperature", 120.0, -80.0, 0, NO) +MinT3 = ("MinT3", SCALAR, "F", "3hr Minimum Temperature", 120.0, -80.0, 0, NO) +MaxRH3 = ("MaxRH3", SCALAR, "%", "3hr Maximum Relative Humidity", 100.0, 0.0, 0, NO) + +# Parms for Satellite +SatVisE = ("VisibleE", SCALAR, "count", "Satellite Albdo %", + 255.0, 0.0, 0, NO) +SatIR11E = ("IR11E", SCALAR, "C", "11 micron temperature", 58.0, -111.0, 0, NO) +SatIR13E = ("IR13E", SCALAR, "C", "13 micron temperature", 50.0, -111.0, 0, NO) +SatIR39E = ("IR39E", SCALAR, "C", "3.9 micron temperature", 50.0, + -111.0, 0, NO) +SatWVE = ("WaterVaporE", SCALAR, "C", "water vapor temperature", + -11.0, -62.0, 0, NO) +SatFogE = ("FogE", SCALAR, "C", "ir11 - ir39", 50.0, -111.0, 0, NO) + +SatVisW = ("VisibleW", SCALAR, "count", "Satellite Albdo %", + 255.0, 0.0, 0, NO) +SatIR11W = ("IR11W", SCALAR, "C", "11 micron temperature", 58.0, -111.0, 0, NO) +SatIR13W = ("IR13W", SCALAR, "C", "13 micron temperature", 50.0, -111.0, 0, NO) +SatIR39W = ("IR39W", SCALAR, "C", "3.9 micron temperature", 50.0, + -111.0, 0, NO) +SatWVW = ("WaterVaporW", SCALAR, "C", "water vapor temperature", + -11.0, -62.0, 0, NO) +SatFogW = ("FogW", SCALAR, "C", "ir11 - ir39", 50.0, -111.0, 0, NO) + +# TPC Wind Probability parms +prob34 = ("prob34", SCALAR, "%", "WS34 CPROB", 100.0, 0.0, 0, NO) +prob50 = ("prob50", SCALAR, "%", "WS50 CPROB", 100.0, 0.0, 0, NO) +prob64 = ("prob64", SCALAR, "%", "WS64 CPROB", 100.0, 0.0, 0, NO) +pws34 = ("pws34", SCALAR, "%", "34WSIPROB", 100.0, 0.0, 0, NO) +pws50 = ("pws50", SCALAR, "%", "50WSIPROB", 100.0, 0.0, 0, NO) +pws64 = ("pws64", SCALAR, "%", "64WSIPROB", 100.0, 0.0, 0, NO) +pwsD34 = ("pwsD34", SCALAR, "%", "Day34WSIPROB", 100.0, 0.0, 0, NO) +pwsN34 = ("pwsN34", SCALAR, "%", "Night34WSIPROB", 100.0, 0.0, 0, NO) +pwsD64 = ("pwsD64", SCALAR, "%", "Day64WSIPROB", 100.0, 0.0, 0, NO) +pwsN64 = ("pwsN64", SCALAR, "%", "Night64WSI PROB", 100.0, 0.0, 0, NO) +pws34int = ("pws34int", SCALAR, "%", "34WSIntPROB", 100.0, 0.0, 0, NO) +pws64int = ("pws64int", SCALAR, "%", "64WSIntPROB", 100.0, 0.0, 0, NO) + +# Surge parms for HLS +SurgeHtPlusTide = ("SurgeHtPlusTide", SCALAR, "ft", "SurgeHtPlusTide", 50.0, -100.0, 2, NO) +SurgeHtPlusTideWTopo = ("SurgeHtPlusTideWTopo", SCALAR, "ft", "SurgeHtPlusTideWTopo", 50.0, -100.0, 2, NO) + +# Hazards +HazardKeys = [] +HazardKeys.append(("", "")) #1st one must be None +import VTECTable +kys = VTECTable.VTECTable.keys() +kys.sort() +for k in kys: + HazardKeys.append((k, VTECTable.VTECTable[k]['hdln'])) + +#H-VTEC keys - will someday add these back in +#("hydroER", "Hydro - Excessive Rainfall"), +#("hydroSM", "Hydro - Snow melt"), +#("hydroRS", "Rain and Snow melt"), +#("hydroDM", "Dam or Levee Failure"), +#("hydroGO", "Glacier-Dammed Lake Outburst"), +#("hydroIJ", "Ice Jam"), +#("hydroIC", "Rain and/or Snow melt and/or Ice Jam"), + +Hazards = ("Hazards", DISCRETE, "wwa", "Hazards", YES, HazardKeys, 4) + +# Scalar/Vector Weather Elements that Require Extra Precision (due to their +# use in calculations) Either form may be used. +ExtraWEPrecision = [] + + +#--------------------------------------------------------------------------- +# +# Weather configuration section +# +#--------------------------------------------------------------------------- + +# list of possible visibilities +visibilities = ['', '0SM', '1/4SM', '1/2SM', '3/4SM', '1SM', '11/2SM', + '2SM', '21/2SM', '3SM', '4SM', '5SM', '6SM', 'P6SM'] + +# list of possible coverages and probabilities +NOCOV = ('', 'No Coverage') +ISOD = ('Iso', 'Isolated') +SCT = ('Sct', 'Scattered') +NUM = ('Num', 'Numerous') +WIDE = ('Wide', 'Widespread') +OCNL = ('Ocnl', 'Occasional') +SCHC = ('SChc', 'Slight Chance Of') +CHC = ('Chc', 'Chance Of') +LKLY = ('Lkly', 'Likely') +DEFN = ('Def', 'Definite') +PATCHY = ('Patchy', 'Patchy') +AREAS = ('Areas', 'Areas of') +FQT = ('Frq', 'Frequent') +BRIEF = ('Brf', 'Brief') +PERIODS = ('Pds', 'Periods of') +INTM = ('Inter', 'Intermittent') + +# list of possible intensities +INTEN_NONE = ('', 'No intensity') +INTEN_VERYLIGHT = ('--', 'Very Light') +INTEN_LIGHT = ('-', 'Light') +INTEN_MOD = ('m', 'Moderate') +INTEN_HEAVY = ('+', 'Heavy') +INTEN_SEVERE = ('+', 'Severe') +INTEN_DENSE = ('+', 'Dense') + +# list of optional attributes +FQTLTG = ('FL', 'Frequent Lightning') +GUSTS = ('GW', 'Gusty Winds') +HVYRAFL = ('HvyRn', 'Heavy Rainfall') +DMGWND = ('DmgW', 'Damaging Winds') +SMALLH = ('SmA', 'Small Hail') +LARGEH = ('LgA', 'Large Hail') +OUTLYNG = ('OLA','in the outlying areas') +GRASSY = ('OGA','on grassy areas') +OVRPASS = ('OBO','on bridges and overpasses') +OR = ('OR', 'or') +DRY = ('Dry', 'dry') +PRIMARY = ('Primary', 'Highest Ranking') +MENTION = ('Mention', 'Include Unconditionally') +TORNADO = ('TOR', 'Tornadoes') + +# list of each weather types +NOWX = ('', 'No Weather', + [NOCOV], + [INTEN_NONE], + []) +THUNDER = ('T', 'Thunderstorms', + [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, + PERIODS, INTM], + [INTEN_NONE, INTEN_SEVERE], + [PRIMARY, MENTION, FQTLTG, HVYRAFL, GUSTS, DMGWND, DRY, + LARGEH, SMALLH, TORNADO]) +RAIN = ('R', 'Rain', + [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +RAINSHOWERS = ('RW', 'Rain Showers', + [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, + PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +DRIZZLE = ('L', 'Drizzle', + [PATCHY, AREAS, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, + BRIEF, PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +FZRAIN = ('ZR', 'Freezing Rain', + [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +FZDRIZZLE = ('ZL', 'Freezing Drizzle', + [PATCHY, AREAS, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, + BRIEF, PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +SNOW = ('S', 'Snow', + [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +SNOWSHOWERS = ('SW', 'Snow Showers', + [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, + BRIEF, PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +SLEET = ('IP', 'Sleet', + [WIDE, SCHC, CHC, LKLY, DEFN, OCNL, FQT, BRIEF, PERIODS, INTM], + [INTEN_VERYLIGHT, INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION, OR]) +FOG = ('F', 'Fog', + [PATCHY, AREAS, WIDE], + [INTEN_NONE, INTEN_DENSE], + [PRIMARY, MENTION]) +FREEZEFOG = ('ZF', 'Freezing Fog', + [PATCHY, AREAS, WIDE], + [INTEN_NONE, INTEN_DENSE], + [PRIMARY, MENTION]) +ICEFOG = ('IF', 'Ice Fog', + [PATCHY, AREAS, WIDE], + [INTEN_NONE], + [PRIMARY, MENTION]) +ICECRYSTAL = ('IC', 'Ice Crystals', + [PATCHY, AREAS, WIDE], + [INTEN_NONE], + [PRIMARY, MENTION]) +HAZE = ('H', 'Haze', + [DEFN], + [INTEN_NONE], + [PRIMARY, MENTION]) +BLWGSNOW = ('BS', 'Blowing Snow', + [AREAS,PATCHY,DEFN], + [INTEN_NONE], + [PRIMARY, MENTION]) +BLWGSAND = ('BN', 'Blowing Sand', + [AREAS,PATCHY,DEFN], + [INTEN_NONE], + [PRIMARY, MENTION]) +SMOKE = ('K', 'Smoke', + [AREAS, PATCHY, DEFN], + [INTEN_NONE], + [PRIMARY, MENTION]) +BLWGDUST = ('BD', 'Blowing Dust', + [AREAS,PATCHY,DEFN], + [INTEN_NONE], + [PRIMARY, MENTION]) +FROST = ('FR','Frost', + [AREAS, PATCHY, WIDE], + [INTEN_NONE], + [PRIMARY, MENTION, OUTLYNG]) +FRZSPRAY = ('ZY','Freezing Spray', + [ISOD, SCT, NUM, WIDE, SCHC, CHC, LKLY, DEFN, OCNL], + [INTEN_LIGHT, INTEN_MOD, INTEN_HEAVY], + [PRIMARY, MENTION]) +VOLASH = ('VA','Volcanic Ash', + [NOCOV], + [INTEN_NONE], + [PRIMARY, MENTION]) +WATERSPOUT = ('WP','Waterspouts', + [ISOD, SCHC, CHC, LKLY, DEFN], + [INTEN_NONE], + [PRIMARY, MENTION]) + + +types = [NOWX, THUNDER, WATERSPOUT, RAIN, RAINSHOWERS, + DRIZZLE, FZRAIN, FZDRIZZLE, SNOW, SNOWSHOWERS, + SLEET, FOG, FREEZEFOG, ICEFOG, ICECRYSTAL ,HAZE, BLWGSNOW, + BLWGSAND, SMOKE, BLWGDUST, FROST, FRZSPRAY, VOLASH] + + +#----------------------------------- +# DO NOT CHANGE THE FOLLOWING SECTION +#------------------------------------ +if not BASELINE and siteImport('localWxConfig'): + types = localWxConfig.types + +#--------------------------------------------------------------------------- +# +# Projection Configuration section. +# +#--------------------------------------------------------------------------- +NONE = 0 +LAMBERT_CONFORMAL = 1 +MERCATOR = 2 +POLAR_STEREOGRAPHIC = 3 +LATLON = 4 + +# projectionID / projectionType / latLonLL / latLonUR / +# latLonOrigin / stdParallelOne / stdParallelTwo / gridPointLL / gridPointUR +# latIntersect / lonCenter / lonOrigin + +Grid201 = ('Grid201',POLAR_STEREOGRAPHIC, + (-150.00, -20.826), (-20.90846, 30.0), + (0.0, 0.0), 0.0, 0.0, (1, 1), (65, 65), 0.0, 0.0, -105.0) + +Grid202 = ('Grid202', POLAR_STEREOGRAPHIC, + (-141.028, 7.838), (-18.576, 35.617), + (0.0, 0.0), 0.0, 0.0, (1, 1), (65, 43), 0.0, 0.0, -105.0) + +Grid203 = ('Grid203', POLAR_STEREOGRAPHIC, + (-185.837, 19.132), (-53.660, 57.634), + (0.0, 0.0), 0.0, 0.0, (1, 1), (45, 39), 0.0, 0.0, -150.0) + +Grid204 = ('Grid204', MERCATOR, + (-250.0, -25.0), (-109.129, 60.644), + (0.0, 0.0), 0.0, 0.0, (1, 1), (93, 68), 0.0, -179.564, 0.0) + +Grid205 = ('Grid205', POLAR_STEREOGRAPHIC, + (-84.904, 0.616), (-15.000, 45.620), + (0.0, 0.0), 0.0, 0.0, (1, 1), (45, 39), 0.0, 0.0, -60.0) + +Grid206 = ('Grid206', LAMBERT_CONFORMAL, + (-117.991, 22.289), (-73.182, 51.072), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (51, 41), 0.0, 0.0, 0.0) + +Grid207 = ('Grid207', POLAR_STEREOGRAPHIC, + (-175.641, 42.085), (-93.689, 63.976), + (0.0, 0.0), 0.0, 0.0, (1, 1), (49, 35), 0.0, 0.0, -150.0) + +Grid208 = ('Grid208', MERCATOR, + (-166.219, 10.656), (-147.844, 27.917), + (0.0, 0.0), 0.0, 0.0, (1, 1), (25, 25), 0.0, -157.082, 0.0) + +Grid209 = ('Grid209', LAMBERT_CONFORMAL, + (-117.991, 22.289), (-73.182, 51.072), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (101, 81), 0.0, 0.0, 0.0) + +Grid210 = ('Grid210', MERCATOR, + (-77.000, 9.000), (-58.625, 26.422), + (0.0, 0.0), 0.0, 0.0, (1, 1), (25, 25), 0.0, -67.812, 0.0) + +Grid211 = ('Grid211', LAMBERT_CONFORMAL, + (-133.459, 12.190), (-49.385, 57.290), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (93, 65), 0.0, 0.0, 0.0) + +Grid212 = ('Grid212', LAMBERT_CONFORMAL, + (-133.459, 12.190), (-49.385, 57.290), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (185, 129), 0.0, 0.0, 0.0) + +Grid213 = ('Grid213', POLAR_STEREOGRAPHIC, + (-141.028, 7.838), (-18.577, 35.617), + (0.0, 0.0), 0.0, 0.0, (1, 1), (129, 85), 0.0, 0.0, -105.0) + +Grid214 = ('Grid214', POLAR_STEREOGRAPHIC, + (-175.641, 42.085), (-93.689, 63.975), + (0.0, 0.0), 0.0, 0.0, (1, 1), (97, 69), 0.0, 0.0, -150.0) + +# (new alaska grid) +Grid214AK = ('Grid214AK', POLAR_STEREOGRAPHIC, + (-178.571, 40.5301), (-93.689, 63.975), + (0.0, 0.0), 0.0, 0.0, (1,1), (104, 70), 0.0, 0.0, -150.0) + +Grid215 = ('Grid215', LAMBERT_CONFORMAL, + (-133.459, 12.190), (-49.385, 57.290), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (369, 257), 0.0, 0.0, 0.0) + +Grid216 = ('Grid216', POLAR_STEREOGRAPHIC, + (-173.000, 30.000), (-62.850, 70.111), + (0.0, 0.0), 0.0, 0.0, (1, 1), (139, 107), 0.0, 0.0, -135.0) + +Grid217 = ('Grid217', POLAR_STEREOGRAPHIC, + (-173.000, 30.000), (-62.850, 70.111), + (0.0, 0.0), 0.0, 0.0, (1, 1), (277, 213), 0.0, 0.0, -135.0) + +Grid218 = ('Grid218', LAMBERT_CONFORMAL, + (-133.459, 12.190), (-49.385, 57.290), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (614, 428), 0.0, 0.0, 0.0) + +Grid219 = ('Grid219', POLAR_STEREOGRAPHIC, + (-119.559, 25.008), (60.339, 24.028), + (0.0, 0.0), 0.0, 0.0, (1, 1), (385, 465), 0.0, 0.0, -80.0) + +Grid221 = ('Grid221', LAMBERT_CONFORMAL, + (-145.500, 1.000), (-2.566, 46.352), + (-107.0, 50.0), 50.0, 50.0, (1, 1), (349, 277), 0.0, 0.0, 0.0) + +Grid222 = ('Grid222', LAMBERT_CONFORMAL, + (-145.500, 1.000), (-2.566, 46.352), + (-107.0, 50.0), 50.0, 50.0, (1, 1), (59, 47), 0.0, 0.0, 0.0) + +Grid225 = ('Grid225', MERCATOR, + (-250.0, -25.0), (-109.129, 60.644), + (0.0, 0.0), 0.0, 0.0, (1, 1), (185, 135), 0.0, -179.564, 0.0) + +Grid226 = ('Grid226', LAMBERT_CONFORMAL, + (-133.459, 12.190), (-49.385, 57.290), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (737, 513), 0.0, 0.0, 0.0) + +Grid227 = ('Grid227', LAMBERT_CONFORMAL, + (-133.459, 12.190), (-49.385, 57.290), + (-95.0, 25.0), 25.0, 25.0, (1, 1), (1473, 1025), 0.0, 0.0, 0.0) + +Grid228 = ('Grid228', LATLON, + (0.0, 90.0), (359.0, -90.0), (0.0, 0.0), 0.0, 0.0, + (1, 1), (144, 73), 0.0, 0.0, 0.0) + +Grid229 = ('Grid229', LATLON, + (0.0, 90.0), (359.0, -90.0), + (0.0, 0.0), 0.0, 0.0, (1, 1), (360, 181), 0.0, 0.0, 0.0) + +Grid230 = ('Grid230', LATLON, + (0.0, 90.0), (359.5, -90.0), + (0.0, 0.0), 0.0, 0.0, (1, 1), (720, 361), 0.0, 0.0, 0.0) + +Grid231 = ('Grid231', LATLON, + (0.0, 0.0), (359.5, 90.0), + (0.0, 0.0), 0.0, 0.0, (1, 1), (720, 181), 0.0, 0.0, 0.0) + +Grid232 = ('Grid232', LATLON, + (0.0, 0.0), (359.0, 90.0), + (0.0, 0.0), 0.0, 0.0, (1, 1), (360, 91), 0.0, 0.0, 0.0) + +Grid233 = ('Grid233', LATLON, + (0.0, -78.0), (358.750, 78.0), + (0.0, 0.0), 0.0, 0.0, (1, 1), (288, 157), 0.0, 0.0, 0.0) + +Grid234 = ('Grid234', LATLON, + (-98.000, 15.0), (-65.000, -45.0), + (0.0, 0.0), 0.0, 0.0, (1, 1), (133, 121), 0.0, 0.0, 0.0) + +Grid235 = ('Grid235', LATLON, + (0.250, 89.750), (359.750, -89.750), + (0.0, 0.0), 0.0, 0.0, (1, 1), (720, 360), 0.0, 0.0, 0.0) + +HRAP = ('HRAP', POLAR_STEREOGRAPHIC, + (-119.036, 23.097), (-75.945396, 53.480095), + (0.0, 0.0), 0.0, 0.0, (1, 1), (801, 881), 0.0, 0.0, -105.0) + +# list of all projections +allProjections = [Grid201, Grid202, Grid203, Grid204, Grid205, Grid206, + Grid207, Grid208, Grid209, Grid210, Grid211, Grid212, Grid213, Grid214, + Grid214AK, Grid215, Grid216, Grid217, Grid218, Grid219, Grid221, Grid222, + Grid225, Grid226, Grid227, Grid228, Grid229, Grid230, Grid231, Grid232, + Grid233, Grid234, Grid235, HRAP] + +#--------------------------------------------------------------------------- +# +# Grid Domain configuration section +# +#--------------------------------------------------------------------------- +# +# xdim/ydim: Defines the dimensions of the grids. (GFE grid size) +# +# origin: Defines the lower-left corner of the grid (point 0,0) in +# world coordinates. +# +# extent: Defines the "size" of the grid in world coordinates. The upper +# right corner is the origin+extent. +# +# TimeZone: Defines the timezone used by this site in standard TZ format. +# Refer to /usr/share/zoneinfo/zone.tab for the correct settings. +# +# Projection: Defines the projection identifier to be used for this domain. + +# Note that all parameters for an existing database must use the same +# projection, though not necessarily the same grid size and location. + +# These values are set up for AWIPS. There is a script at the end +# of this section that adjusts the resolution for the RPP sites. + +# [xdim, ydim] / (origin) /( extent) / TimeZone / Projection / OfficeType +SITES = { +#WFOs + # Experimental combined AFC site + 'AFC' : ([1057, 449], (1.0, 19.00), (66.0, 28.0), 'America/Anchorage', + Grid214AK, "wfo"), + + 'ABQ' : ([145, 145], (36.00, 22.00), (9.0, 9.0), 'MST7MDT', Grid211,"wfo"), + 'ABR' : ([145, 145], (45.00, 35.00), (9.0, 9.0), 'CST6CDT', Grid211,"wfo"), + 'AER' : ([369, 337], (44.00, 23.00), (23.0, 21.0), 'America/Anchorage', + Grid214AK, "wfo"), + 'AFG' : ([313, 201], (27.0, 39.0), (39.0, 25.0), 'America/Anchorage', + Grid214AK, "wfo"), + 'AJK' : ([337, 241], (62.0, 23.0), (21.0, 15.0), 'America/Juneau', + Grid214AK, "wfo"), + 'AKQ' : ([145, 145], (68.00, 25.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'ALU' : ([433, 225], (1.0, 19.0), (54.0, 28.0), 'America/Anchorage', + Grid214AK, "wfo"), + 'ALY' : ([145, 145], (70.00, 33.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'AMA' : ([145, 145], (41.00, 21.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'APX' : ([145, 145], (58.00, 34.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'ARX' : ([145, 145], (52.00, 33.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'BGM' : ([145, 145], (68.00, 33.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'BIS' : ([145, 145], (43.00, 37.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'BMX' : ([145, 145], (58.00, 19.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'BOI' : ([177, 177], (25.00, 34.00), (11.0, 11.0), 'MST7MDT', Grid211, "wfo"), + 'BOU' : ([145, 145], (38.00, 27.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'BOX' : ([193, 193], (74.00, 33.00), (12.0, 12.0), 'EST5EDT', Grid211, "wfo"), + 'BRO' : ([145, 145], (44.00, 10.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'BTV' : ([145, 145], (72.00, 36.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'BUF' : ([145, 145], (66.00, 32.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'BYZ' : ([145, 145], (36.00, 37.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'CAE' : ([145, 145], (65.00, 20.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'CAR' : ([145, 145], (75.00, 39.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'CHS' : ([145, 145], (65.00, 18.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'CLE' : ([145, 145], (62.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'CRP' : ([145, 145], (45.00, 11.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'CTP' : ([145, 145], (67.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'CYS' : ([145, 145], (37.00, 31.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'DDC' : ([145, 145], (43.00, 24.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'DLH' : ([145, 145], (50.00, 37.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'DMX' : ([145, 145], (49.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'DTX' : ([161, 161], (57.00, 34.00), (10.0, 10.0), 'EST5EDT', Grid211, "wfo"), + 'DVN' : ([145, 145], (52.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'EAX' : ([145, 145], (50.00, 27.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'EKA' : ([145, 145], (20.00, 31.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'EPZ' : ([145, 145], (36.00, 16.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'EWX' : ([145, 145], (44.00, 12.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'FFC' : ([145, 145], (61.00, 18.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'FGF' : ([145, 145], (45.00, 39.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'FGZ' : ([145, 145], (29.00, 23.00), (9.0, 9.0), 'US/Arizona', Grid211, "wfo"), + 'FSD' : ([177, 177], (43.00, 32.00), (11.0, 11.0), 'CST6CDT', Grid211, "wfo"), + 'FWD' : ([145, 145], (45.00, 17.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'GGW' : ([145, 145], (36.00, 39.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'GID' : ([145, 145], (44.00, 28.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'GJT' : ([145, 145], (34.00, 27.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'GLD' : ([145, 145], (41.00, 26.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'GRB' : ([145, 145], (54.00, 35.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'GRR' : ([145, 145], (58.00, 33.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'GSP' : ([145, 145], (63.00, 21.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'GUM' : ([433, 225], (15.00, 20.00), (27.0, 14.0), 'Pacific/Guam', Grid204, "wfo"), + 'GYX' : ([145, 145], (75.00, 37.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'HFO' : ([321, 225], (7.00, 11.00), (10.0, 7.0), 'Pacific/Honolulu', + Grid208, 'wfo'), + 'HGX' : ([145, 145], (48.00, 13.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'HNX' : ([145, 145], (22.00, 24.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'HUN' : ([145, 145], (57.00, 20.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'ICT' : ([145, 145], (45.00, 25.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'ILM' : ([145, 145], (67.00, 21.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'ILN' : ([145, 145], (60.00, 27.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'ILX' : ([145, 145], (55.00, 27.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'IND' : ([145, 145], (58.00, 27.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'IWX' : ([145, 145], (58.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'JAN' : ([145, 145], (54.00, 18.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'JAX' : ([145, 145], (64.00, 14.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'JKL' : ([145, 145], (61.00, 25.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'KEY' : ([145, 145], (66.00, 8.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'LBF' : ([145, 145], (43.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'LCH' : ([145, 145], (52.00, 15.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'LIX' : ([145, 145], (54.00, 14.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'LKN' : ([145, 145], (25.00, 30.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'LMK' : ([145, 145], (59.00, 25.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'LOT' : ([145, 145], (55.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'LOX' : ([145, 145], (21.00, 23.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'LSX' : ([145, 145], (52.00, 25.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'LUB' : ([145, 145], (39.00, 17.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'LWX' : ([145, 145], (67.00, 27.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'LZK' : ([145, 145], (51.00, 20.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'MAF' : ([145, 145], (40.00, 16.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'MEG' : ([145, 145], (54.00, 22.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'MFL' : ([145, 145], (66.00, 9.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'MFR' : ([145, 145], (20.00, 34.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'MHX' : ([145, 145], (68.00, 22.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'MKX' : ([145, 145], (55.00, 33.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'MLB' : ([145, 145], (66.00, 12.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'MOB' : ([145, 145], (57.00, 16.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'MPX' : ([145, 145], (50.00, 34.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'MQT' : ([145, 145], (56.00, 36.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'MRX' : ([145, 145], (61.00, 22.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'MSO' : ([145, 145], (29.00, 39.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'MTR' : ([145, 145], (20.00, 26.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'OAX' : ([145, 145], (45.00, 30.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'OHX' : ([145, 145], (58.00, 22.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'OKX' : ([145, 145], (71.00, 30.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'OTX' : ([145, 145], (25.00, 40.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'OUN' : ([145, 145], (44.00, 21.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'PAH' : ([145, 145], (56.00, 24.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'PBZ' : ([145, 145], (65.00, 29.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'PDT' : ([145, 145], (23.00, 38.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'PHI' : ([145, 145], (70.00, 28.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'PIH' : ([145, 145], (30.00, 34.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'PQR' : ([145, 145], (19.00, 38.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'PSR' : ([145, 145], (28.00, 20.00), (9.0, 9.0), 'US/Arizona', Grid211, "wfo"), + 'PUB' : ([145, 145], (38.00, 26.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'RAH' : ([145, 145], (66.00, 22.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'REV' : ([145, 145], (23.00, 29.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'RIW' : ([145, 145], (35.00, 33.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'RLX' : ([145, 145], (63.00, 26.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'RNK' : ([145, 145], (64.00, 24.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'SEW' : ([145, 145], (21.00, 42.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'SGF' : ([145, 145], (51.00, 24.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'SGX' : ([145, 145], (24.00, 21.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'SHV' : ([145, 145], (50.00, 17.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'SJT' : ([145, 145], (43.00, 16.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'SJU': ([32, 28], (10.0, 10.0), (8.0, 7.0), 'America/Puerto_Rico',Grid210, "wfo"), + 'SLC' : ([161, 161], (30.00, 28.00), (10.0, 10.0), 'MST7MDT', Grid211, "wfo"), + 'STO' : ([145, 145], (20.00, 28.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), + 'TAE' : ([145, 145], (60.00, 15.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'TBW' : ([145, 145], (64.00, 11.00), (9.0, 9.0), 'EST5EDT', Grid211, "wfo"), + 'TFX' : ([145, 145], (32.00, 39.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'TOP' : ([145, 145], (47.00, 26.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'TSA' : ([145, 145], (48.00, 22.00), (9.0, 9.0), 'CST6CDT', Grid211, "wfo"), + 'TWC' : ([145, 145], (29.00, 20.00), (9.0, 9.0), 'US/Arizona', Grid211, "wfo"), + 'UNR' : ([145, 145], (40.00, 34.00), (9.0, 9.0), 'MST7MDT', Grid211, "wfo"), + 'VEF' : ([145, 145], (26.00, 25.00), (9.0, 9.0), 'PST8PDT', Grid211, "wfo"), +#RFCs + 'ACR' : ([271, 173], (20.0, 21.0), (57.0, 40.0), 'America/Anchorage', + Grid214, "rfc"), # this grid is at 10 km resolution + 'ALR' : ([299, 278], (59.0, 11.0), (17.0, 19.0), 'CST6CDT', Grid211, "rfc"), + 'FWR' : ([362, 334], (36.0, 11.0), (20.0, 20.0), 'CST6CDT', Grid211, "rfc"), + 'KRF' : ([408, 356], (33.0, 27.0), (26.0, 22.0), 'CST6CDT', Grid211, "rfc"), + 'MSR' : ([381, 304], (43.0, 28.0), (24.0, 20.0), 'CST6CDT', Grid211, "rfc"), + 'ORN' : ([303, 216], (51.0, 16.0), (18.0, 14.0), 'CST6CDT', Grid211, "rfc"), + 'PTR' : ([218, 308], (21.0, 35.0), (17.0, 19.0), 'PST8PDT', Grid211, "rfc"), + 'RHA' : ([132, 140], (69.0, 28.0), (7.0, 10.0), 'EST5EDT', Grid211, "rfc"), + 'RSA' : ([140, 296], (21.0, 23.0), (12.0, 17.0), 'PST8PDT', Grid211, "rfc"), + 'STR' : ([171, 307], (29.0, 20.0), (13.0, 18.0), 'MST7MDT', Grid211, "rfc"), + 'TAR' : ([226, 164], (69.0, 34.0), (13.0, 13.0), 'EST5EDT', Grid211, "rfc"), + 'TIR' : ([220, 171], (59.0, 25.0), (13.0, 12.0), 'EST5EDT', Grid211, "rfc"), + 'TUA' : ([281, 168], (39.0, 22.0), (18.0, 10.0), 'CST6CDT', Grid211, "rfc"), + +#Special Sites - Updated NHC and OPC domains in OB9.3 + 'US' : ([267, 159], (18.0, 9.5), (67.0, 40.0), 'EDT5EDT', Grid211, "other"), + 'FSL' : ([161, 145], (38.50, 27.00), (10.0, 9.0), 'MST7MDT', Grid211, "other"), + 'NH1' : ([667, 461], (69.5, 4.5), (52.03125, 35.9375), 'EST5EDT', Grid204, "wfo"), + 'NH2' : ([950, 289], (-33.0, -7.0), (148.276, 45.0), 'EST5EDT', Grid210, "wfo"), + 'ONA' : ([244, 383], (68.9375, 19.5625), (15.1875, 23.875), 'EST5EDT', Grid211, "wfo"), + 'ONP' : ([396, 415], (8.1875, 21.5625), (24.6875, 25.875), 'PST8PDT', Grid211, "wfo"), + +#Ice Desk for AFC + 'AICE' : ([560, 340], (9.0, 11.0), (29.0, 19.0), 'America/Anchorage', + Grid203, "nc"), +#Nested for GUM (future) + 'GUMa': ([193, 193], (23.0, 26.0), (3.0, 3.0), 'Pacific/Guam', Grid204, "other"), +#Regional Offices + 'VUY' : ([337,449], (62.00, 19.00), (21.0, 28.0), 'EST5EDT', Grid211, "ro"), + 'BCQ' : ([145,145], (50.00, 27.00), (9.0, 9.0), 'CST6CDT', Grid211, "ro"), + 'EHU' : ([361,361], (27.00, 10.00), (45.0, 20.0), 'CST6CDT', Grid211, "ro"), + 'VHW' : ([161,161], (30.00, 28.00), (10.0, 10.0), 'MST7MDT', Grid211, "ro"), + 'PBP' : ([321,225], (7.00, 11.00), (10.0, 7.0), 'Pacific/Honolulu', Grid208, "ro"), + 'ARE' : ([369,337], (44.00, 23.00), (23.0, 21.0), 'America/Anchorage', Grid214AK, "ro"), + 'ARW' : ([433,225], (1.00, 19.00), (54.0, 21.0), 'America/Anchorage', Grid214AK, "ro"), + +#National Centers + 'HAK' : ( [825,553], ( 1.0, 1.0), (103.0, 69.0), 'EST5EDT', Grid214AK, "nc"), + 'HUS' : ([1073,689], (19.0, 8.0), ( 67.0, 43.0), 'EST5EDT', Grid211, "nc"), +} + + +#--------------------------------------------------------------------------- +# +# Time Constraint configuration section +# +#--------------------------------------------------------------------------- +HOUR = 3600 +DAY = 24 * HOUR + +# Start: is the number of seconds since 0000z for the first grid of the day +# Repeat: is the number of seconds from start until the next grid starts +# Duration: is the length of the grid in number of seconds + +# Examples of constraints: +# Hourly temperatures +# HrTemp = (0, HOUR, HOUR) +# QPF that is 6 hours long, aligned on 0000z, exists for every 6 hours +# Q = (0, HOUR*6, HOUR*6) +# + +# fixed time constraints: start / repeat / duration +TC_1M = (0, 60, 60) # 1 minute +TC1 = (0, HOUR, HOUR) +TC3 = (0, 3 * HOUR, HOUR) +TC6 = (0, 6 * HOUR, HOUR) +TC12 = (0, 12 * HOUR, HOUR) +TC3NG = (0, 3 * HOUR, 3 * HOUR) +TC6NG = (0, 6 * HOUR, 6 * HOUR) +TC12NG = (0, 12 * HOUR, 12 * HOUR) +TC061212 = (6 * HOUR, 12 * HOUR, 12 * HOUR) +Persistent = (0, 0, 0) # special time constraint + +# Local-time based time constraints. Does not automatically account for +# daylight savings time. The dst flag is 0 for standard time and manually +# set to 1 for daylight time (if desired). The start is specified in +# seconds local time, e.g., 6*HOUR would indicate 6am. +def localTC(start,repeat,duration,dst): + timezone = SITES[GFESUITE_SITEID][3] + import pytz + tz = pytz.timezone(timezone) + delta = tz.utcoffset(0) - tz.dst(0); + offset = delta.days*86400 + delta.seconds + start = start - offset + if dst == 1: + start = start - 3600 #daylight savings flag + if start >= 3600 * 24: + start = start - 3600 * 24 + elif start < 0: + start = start + 3600 * 24 + return (start, repeat, duration) + +# The following time constraints are based on local standard time. +# Change the last parameter from 0 to 1 to force daylight savings time +# always. +# PWS TCs changed in OB9.3 for new 6 hour data from NHC +MaxTTC = localTC(7*HOUR, 24*HOUR, 13*HOUR, 0) +MinTTC = localTC(19*HOUR, 24*HOUR, 14*HOUR, 0) +MaxRHTC = localTC(15*HOUR, 24*HOUR, 18*HOUR, 0) +MinRHTC = localTC(3*HOUR, 24*HOUR, 18*HOUR, 0) +LT3NG = localTC(0*HOUR, 3*HOUR, 3*HOUR, 0) +LT6NG = localTC(0*HOUR, 6*HOUR, 6*HOUR, 0) +LT12NG = localTC(6*HOUR, 12*HOUR, 12*HOUR, 0) +LTMOS = localTC(6*HOUR, 12*HOUR, 12*HOUR, 0) #special MOS local time +MaxTTCMOS = localTC(6*HOUR, 24*HOUR, 12*HOUR, 0) #special MOS maxT +MinTTCMOS = localTC(18*HOUR, 24*HOUR, 12*HOUR, 0) #special MOS minT +LT24 = localTC(0*HOUR, 24*HOUR, 24*HOUR, 0) +FireWx1300TC = localTC(13*HOUR, 24*HOUR, 1*HOUR, 0) #special FireWx 1pm snap +#DR3511 DeltaMaxTTC = localTC(7*HOUR, 24*HOUR, 16*HOUR, 0) # just for HPCdeltaMaxT +PWSDTC = localTC(11*HOUR, 24*HOUR, 12*HOUR, 0) +PWSNTC = localTC(23*HOUR, 24*HOUR, 12*HOUR, 0) + +#--------------------------------------------------------------------------- +# +# Database/(Model) Attribute Configuration +# +#--------------------------------------------------------------------------- +# +# name: The model name of the database +# +# format: Either 'GRID' or 'DFM' +# +# type: Optional type of the database +# +# single: YES or NO. YES if this database always exists and is not +# based on model-times. NO if this database is created/destroyed and +# is based on model-runs. When created, the names of these databases have +# time stamps. +# +# official: YES or NO. YES if this is an official database from which +# products can be generated. NO if this is a conventional database. +# +# numVer: Number of versions of this database to retain. +# +# purgeAge: Number of hours in the past before grids will be automatically +# purged from the database. If 0, then purging is disabled. +# + +YES = 1 +NO = 0 +GRID = 'GRID' +# name / format / type / single / official / numVer / purgeAge + +Fcst = ('Fcst', GRID, '', YES, NO, 1, 24) +Practice = ('Fcst', GRID, 'Prac', YES, NO, 1, 24) +TestFcst = ('Fcst', GRID, 'Test', YES, NO, 1, 24) +Restore = ('Restore', GRID, '', YES, NO, 1, 24) +Test = ('Test', GRID, 'test', NO, NO, 1, 0) +Official = ('Official', GRID, '', YES, YES, 1, 24) +ISC = ('ISC', GRID, '', YES, NO, 1, 12) +LAPS = ('LAPS', GRID, '', YES, NO, 1, 30) +SAT = ('SAT', GRID, '', YES, NO, 1, 12) +HPCGuide = ('HPCGuide', GRID, '', NO, NO, 2, 0) +NAM12 = ('NAM12', GRID, '', NO, NO, 2, 0) +NAM40 = ('NAM40', GRID, '', NO, NO, 2, 0) +NAM80 = ('NAM80', GRID, '', NO, NO, 2, 0) +NAM95 = ('NAM95', GRID, '', NO, NO, 2, 0) +NGM80 = ('NGM80', GRID, '', NO, NO, 2, 0) +NGM95 = ('NGM95', GRID, '', NO, NO, 2, 0) +GFS40 = ('GFS40', GRID, '', NO, NO, 2, 0) +GFS80 = ('GFS80', GRID, '', NO, NO, 2, 0) +GFS190 = ('GFS190', GRID, '', NO, NO, 2, 0) +GFS75 = ('GFS75', GRID, '', NO, NO, 2, 0) +gfsLR = ('gfsLR', GRID, '', NO, NO, 2, 0) +RUC13 = ('RUC13', GRID, '', NO, NO, 2, 0) +RUC80 = ('RUC80', GRID, '', NO, NO, 2, 0) +HPCGrid = ('HPCGRID', GRID, '', NO, NO, 2, 0) +AKwave10 = ('AKwave10', GRID, '', NO, NO, 2, 0) +AKwave4 = ('AKwave4', GRID, '', NO, NO, 2, 0) +EPwave10 = ('EPwave10', GRID, '', NO, NO, 2, 0) +GlobalWave = ('GlobalWave', GRID, '', NO, NO, 2, 0) +GLWM = ('GLWM', GRID, '', NO, NO, 2, 0)##########DCS3499 +HIRESWarw = ('HIRESWarw', GRID, '', NO, NO, 2, 0)##########DCS3501 +HIRESWnmm = ('HIRESWnmm', GRID, '', NO, NO, 2, 0) +#### SPC = ('SPC', GRID, '', NO, NO, 2, 0)###DR20634 +WCwave10 = ('WCwave10', GRID, '', NO, NO, 2, 0) +WCwave4 = ('WCwave4', GRID, '', NO, NO, 2, 0) +WNAwave10 = ('WNAwave10', GRID, '', NO, NO, 2, 0) +WNAwave4 = ('WNAwave4', GRID, '', NO, NO, 2, 0) +GWW = ('GWW', GRID, '', NO, NO, 2, 0) +HPCQPF = ('HPCQPF', GRID, '', NO, NO, 4, 0) +RFCQPF = ('RFCQPF', GRID, '', NO, NO, 4, 0) +#DR3511 HPCDelta = ('HPCdelta', GRID, '', NO, NO, 2, 0) +TPCTCM = ('TPCtcm', GRID, '', NO, NO, 2, 0) +MSAS = ('MSAS', GRID, '', YES, NO, 1, 36) +GLERL = ('GLERL', GRID, '', NO, NO, 2, 0) +AKWAVE = ('AKWAVE', GRID, '', NO, NO, 2, 0) +WNAWAVE = ('WNAWAVE', GRID, '', NO, NO, 2, 0) +DGEX = ('DGEX', GRID, '', NO, NO, 2, 0) +OPCTAFBE = ('OPCTAFBE', GRID, '', NO, NO, 2, 0) +OPCTAFBNW = ('OPCTAFBNW', GRID, '', NO, NO, 2, 0) +OPCTAFBSW = ('OPCTAFBSW', GRID, '', NO, NO, 2, 0) +MOSGuide = ('MOSGuide', GRID, '', NO, NO, 2, 0) +RTMA = ('RTMA', GRID, '', YES, NO, 1, 36) +NamDNG5 = ('NamDNG5', GRID, '', NO, NO, 2, 0) +TPCProb = ('TPCProb', GRID, '', NO, NO, 30, 0) +SREF = ('SREF', GRID, '', NO, NO, 3, 0) + +#--------------------------------------------------------------------------- +# +# D2D Model Database Version Specification +# +#--------------------------------------------------------------------------- +# D2D database retention values - defaults to 2 if not specified +# Dictionary format. Also used for the number of versions of satellite +# images that are seen. +D2DDBVERSIONS = { + "MSAS": 6, + "LAPS": 6, + "Satellite": 6, + "HPCERP": 5, + "TPCProb": 30, + } + +#--------------------------------------------------------------------------- +# +# Search path for D2D (awips) model files. +# +#--------------------------------------------------------------------------- +# Alaska OCONUS +if SID in ALASKA_SITES: + D2DMODELS = [('mesoEta216', 'NAM40'), + ('mesoEta217', 'NAM20'), + ('AVN203', 'GFS190'), + ('MRF203', 'gfsLR'), + ('NGM207', 'NGM95'), + ('ETA207', 'NAM95'), + 'GWW233', + ('ETA242', 'NAM12'), + 'ECMWF-LowRes','ECMWF', + 'UKMET-NorthernHemisphere', 'UKMET', + 'ENSEMBLE', + ('DGEX186', 'DGEX'), + ('OPCWave181', 'OPCTAFBNW'), + ('AKWAVE239', 'AKWAVE'), + 'AKwave10', + 'AKwave4', + 'GlobalWave', + ('AK-RTMA','RTMA'), + ('AK-NamDNG5','NamDNG5'), + ('MOSGuide-AK', 'MOSGuide'), + ('HiResW-ARW-AK', 'HIRESWarw'), + ('HiResW-NMM-AK', 'HIRESWnmm'), + ('SPCGuide', 'SPC'), + ('TPCWindProb', 'TPCProb'), + ] + +# Hawaii OCONUS +elif SID == "HFO": + D2DMODELS = [('MRF204', 'gfsLR'), + ('AVN225', 'GFS75'), + 'GWW233', + 'GlobalWave', + 'EPwave10', + 'EPwave4', + ('HI-RTMA','RTMA'), + ('HI-NamDNG5','NamDNG5'), + ('HiResW-ARW-HI', 'HIRESWarw'), + ('HiResW-NMM-HI', 'HIRESWnmm'), + ('SPCGuide', 'SPC'), + ('TPCWindProb', 'TPCProb'), + ('ECMWF-HiRes','ECMWFHiRes'), + ] + +# San Juan OCONUS +elif SID == "SJU": + D2DMODELS = [('AVN211', 'GFS80'), + ('GFS212', 'GFS40'), + ('ETA', 'NAM80'), + ('NGM', 'NGM80'), + ('MRF205', 'gfsLR'), + ('OPCWave180', 'OPCTAFBE'), + 'HurWind226', + 'GWW233', + 'GlobalWave', + 'WNAwave10', + 'WNAwave4', + ('PR-RTMA','RTMA'), + ('PR-NamDNG5','NamDNG5'), + ('HiResW-ARW-SJU', 'HIRESWarw'), + ('HiResW-NMM-SJU', 'HIRESWnmm'), + ('SPCGuide', 'SPC'), + ('TPCWindProb', 'TPCProb'), + ('ECMWF-HiRes','ECMWFHiRes'), + ] + +# Guam OCONUS +elif SID == "GUM": + D2DMODELS = [('MRF204', 'gfsLR'), + ('AVN225', 'GFS75'), + 'GWW233', + 'GlobalWave', + ('TPCWindProb', 'TPCProb'), + ] + +#CONUS sites +elif SID in CONUS_EAST_SITES: + D2DMODELS = [('GFS212', 'GFS40'), + ('AVN211', 'GFS80'), + ('ETA', 'NAM80'), + ('NGM', 'NGM80'), + ('MRF', 'gfsLR'), + ('RUC130', 'RUC13'), + ('RUC', 'RUC80'), + ('mesoEta212', 'NAM40'), + ('mesoEta215', 'NAM20'), + 'MSAS', + ('LAPS', 'LAPS'), + 'GWW233', + ('HPCqpf', 'HPCQPF'), + ('HPCqpfNDFD', 'HPCERP'), + ('RFCqpf', 'RFCQPF'), +#DR3511 'HPCdelta', + 'GLERL', + 'WNAWAVE238', + 'TPCSurgeProb', # DCS3462 + 'GlobalWave', + 'EPwave10', + 'AKwave10', + 'AKwave4', + 'WCwave10', + 'WCwave4', + 'WNAwave10', + 'WNAwave4', + 'HurWind226', + ('DGEX185', 'DGEX'), + ('ETA218', 'NAM12'), + 'HPCGuide', + ('OPCWave180', 'OPCTAFBE'), + ('OPCWave181', 'OPCTAFBNW'), + ('OPCWave182', 'OPCTAFBSW'), + 'MOSGuide', + 'RTMA', + 'NamDNG5', + ('TPCWindProb','TPCProb'), + ('SREF212', 'SREF'), + #############DCS3501 + ('HiResW-ARW-East', 'HIRESWarw'), + ('HiResW-NMM-East', 'HIRESWnmm'), + ('SPCGuide', 'SPC'), + ('ECMWF-HiRes','ECMWFHiRes'), + #(GFESUITE_HOME + '/data/climo/PRISM'), + #(GFESUITE_HOME + '/data/climo/NCDC'), + ] + +else: #######DCS3501 WEST_CONUS + + D2DMODELS = [('GFS212', 'GFS40'), + ('AVN211', 'GFS80'), + ('ETA', 'NAM80'), + ('NGM', 'NGM80'), + ('MRF', 'gfsLR'), + ('RUC130', 'RUC13'), + ('RUC', 'RUC80'), + ('mesoEta212', 'NAM40'), + ('mesoEta215', 'NAM20'), + 'MSAS', + ('LAPS', 'LAPS'), + 'GWW233', + ('HPCqpf', 'HPCQPF'), + ('HPCqpfNDFD', 'HPCERP'), + ('RFCqpf', 'RFCQPF'), +#DR3511 'HPCdelta', + 'GLERL', + 'WNAWAVE238', + 'TPCSurgeProb', # DCS3462 + 'GlobalWave', + 'EPwave10', + 'WCwave10', + 'WCwave4', + 'WNAwave10', + 'WNAwave4', + 'AKwave10', + 'AKwave4', + 'AKWAVE', + 'HurWind226', + ('DGEX185', 'DGEX'), + ('ETA218', 'NAM12'), + 'HPCGuide', + ('OPCWave180', 'OPCTAFBE'), + ('OPCWave181', 'OPCTAFBNW'), + ('OPCWave182', 'OPCTAFBSW'), + 'MOSGuide', + 'RTMA', + 'NamDNG5', + ('TPCWindProb','TPCProb'), + ('SREF212', 'SREF'), + #############DCS3501 + ('HiResW-ARW-West', 'HIRESWarw'), + ('HiResW-NMM-West', 'HIRESWnmm'), + ('SPCGuide', 'SPC'), + ('ECMWF-HiRes','ECMWFHiRes'), + #(GFESUITE_HOME + '/data/climo/PRISM'), + #(GFESUITE_HOME + '/data/climo/NCDC'), + ] + +if SID in GreatLake_SITES: + D2DMODELS.append(('GRLKwave', 'GLWM')) + +#--------------------------------------------------------------------------- +# +# Where to find (and what to call) satellite data. +# +#--------------------------------------------------------------------------- +# + +# This table contains directory names and weather element names. + +# Alaska OCONUS +if SID in ALASKA_SITES: + SATDATA = [] + +# Hawaii OCONUS +elif SID == "HFO": + SATDATA = [] + +# San Juan OCONUS +elif SID == "SJU": + SATDATA = [("NESDIS/GOES-13(N)/East CONUS/Imager Visible", "visibleEast"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 11 micron IR", "ir11East"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 12 micron IR", "ir13East"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 3.9 micron IR", "ir39East"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporEast")] + +# Guam OCONUS +elif SID == "GUM": + SATDATA = [] + +#CONUS sites +else: + SATDATA = [("NESDIS/GOES-11(L)/West CONUS/Imager Visible", "visibleWest"), + ("NESDIS/GOES-11(L)/West CONUS/Imager 11 micron IR", "ir11West"), + ("NESDIS/GOES-11(L)/West CONUS/Imager 12 micron IR", "ir13West"), + ("NESDIS/GOES-11(L)/West CONUS/Imager 3.9 micron IR", "ir39West"), + ("NESDIS/GOES-11(L)/West CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporWest"), + ("NESDIS/GOES-13(N)/East CONUS/Imager Visible", "visibleEast"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 11 micron IR", "ir11East"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 12 micron IR", "ir13East"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 3.9 micron IR", "ir39East"), + ("NESDIS/GOES-13(N)/East CONUS/Imager 6.7-6.5 micron IR (WV)", "waterVaporEast")] + +#--------------------------------------------------------------------------- +# +# Smart Initialization Configuration +# +#--------------------------------------------------------------------------- +# +# RFCs +if SID in RFC_SITES: + INITMODULES = {} #disable smart inits for RFCs + +# Alaska OCONUS +elif SID in ALASKA_SITES: + INITMODULES = { +# "AKNAM40" : ["NAM40", "NAM20"], + "AKWAVE" : ['AKWAVE'], +# "AKwave4" : ['AKwave4'], +# "AKwave10" : ['AKwave10'], +# "GlobalWave" : ["GlobalWave"], +# "NAM95" : ["NAM95"], +# "NGM95" : ["NGM95"], +# "gfsLR" : ["gfsLR"], + "NAM12" : ["NAM12"], + "GFS80" : ["GFS80"], +# "GFS190" : ["GFS190"], +#DCS3501 + "HIRESWarw" : ["HIRESWarw"], + "HIRESWnmm" : ["HIRESWnmm"], +#DR20634 "SPC" : ["SPC"], + "LAPS" : ["LAPS"], + "HPCQPF" : ['HPCQPF'], + "RFCQPF" : ['RFCQPF'], + "MSAS" : ['MSAS'], +# "HPCdelta" : ['HPCdelta'], + "SAT" : ['Satellite'], + "DGEX" : ['DGEX'], +# "GWW" : ["GWW"], +# "OPCTAFBNW" : ['OPCTAFBNW'], + "RTMA": ['RTMA'], + "NamDNG5" : ["NamDNG5"], + "AKMOSGuide" : ['MOSGuide'], + } + +# Hawaii OCONUS +elif SID == "HFO": + INITMODULES= { + "GFS75" : ["GFS75"], +#####DCS3501 + "HIRESWarw" : ["HIRESWarw"], + "HIRESWnmm" : ["HIRESWnmm"], +##DR20634 "SPC" : ["SPC"], +# "GlobalWave" : ["GlobalWave"], +# "EPwave10" : ["EPwEave10"], +# "GWW" : ["GWW"], +# "gfsLR" : ["gfsLR"], + "RTMA": ['RTMA'], + "NamDNG5" : ["NamDNG5"], + } + +# San Juan OCONUS +elif SID == "SJU": + #initialization module to model mappings + INITMODULES = { +# "NAM40" : ["NAM40", "NAM20"], +# "NAM80" : ["NAM80"], + "RUC13" : ["RUC13"], + "RUC80" : ["RUC80"], +# "gfsLR" : ["gfsLR"], +# "NGM80" : ["NGM80"], + "NAM12" : ["NAM12"], + "GFS80" : ["GFS80"], + "GFS40" : ["GFS40"], +#####DCS3501 + "HIRESWarw" : ["HIRESWarw"], + "HIRESWnmm" : ["HIRESWnmm"], +#DR20634 "SPC" : ["SPC"], + "LAPS" : ["LAPS"], + "HPCQPF" : ['HPCQPF'], + "RFCQPF" : ['RFCQPF'], + "MSAS" : ['MSAS'], +# "HPCdelta" : ['HPCdelta'], + "SAT" : ['Satellite'], +# "GWW" : ["GWW"], +# "OPCTAFBE" : ['OPCTAFBE'], +# "GlobalWave" : ["GlobalWave"], +# "EPwave10" : ["EPwEave10"], + "RTMA": ['RTMA'], + "NamDNG5" : ["NamDNG5"], + } + +# Guam OCONUS +elif SID == "GUM": + INITMODULES= { + "GFS75" : ["GFS75"], +# "GWW" : ["GWW"], +# "gfsLR" : ["gfsLR"], +# "GlobalWave" : ["GlobalWave"], + "RTMA": ['RTMA'], + } + +#CONUS sites +else: + #initialization module to model mappings + INITMODULES = { + "RUC13" : ["RUC13"], + "RUC80" : ["RUC80"], + "NAM12" : ["NAM12"], + "GFS40" : ["GFS40"], + "GFS80" : ["GFS80"], + "LAPS" : ["LAPS"], + "HPCQPF" : ['HPCQPF'], + "RFCQPF" : ['RFCQPF'], + "MSAS" : ['MSAS'], + "SAT" : ['Satellite'], + "DGEX" : ['DGEX'], + "MOSGuide" : ['MOSGuide'], + "HPCGuide" : ['HPCGuide'], + "RTMA": ['RTMA'], + "NamDNG5" : ["NamDNG5"], + "SREF" : ["SREF"], +#########DCS3501 + "GLWM" : ["GLWM"], + "HIRESWarw" : ["HIRESWarw"], + "HIRESWnmm" : ["HIRESWnmm"], +#DR20634 "SPC" : ["SPC"], +# "GlobalWave" : ["GlobalWave"], +# "EPwave10" : ["EPwave10"], +# "WCwave10" : ["WCwave10"], +# "WCwave4" : ["WCwave4"], +# "WNAwave10" : ["WNAwave10"], +# "WNAwave4" : ["WNAwave4"], + } + +#initialization skip certain model runs +INITSKIPS = { + "RUC13" : [1,2,4,5,7,8,10,11,13,14,16,17,19,20,22,23], + "RUC80" : [1,2,4,5,7,8,10,11,13,14,16,17,19,20,22,23] + } + +#--------------------------------------------------------------------------- +# +# D2D Accumulative Weather Elements +# +#--------------------------------------------------------------------------- +# This is a listing of D2D model name, and weather elements. The +# weather elements defined in this list are treated as accumulative +# elements, thus the snapshot time of the grid is converted to be a +# grid with timestep duration, starting the previous model timestep and +# going up to but not including the snapshot time. +D2DAccumulativeElements= { + "GFS40": ["tp", "cp", "crain", "csnow", "cfrzr", "cicep"], + "GFS80": ["tp", "cp"], + "GFS75": ["tp", "cp"], + "GFS190": ["tp", "cp"], + "NAM95": ["tp", "cp"], + "NAM80": ["tp", "cp"], + "NAM40": ["tp", "cp"], + "NAM20": ["tp", "cp"], + "NAM12": ["tp", "cp", "crain", "csnow", "cfrzr", "cicep"], + "NGM80": ["tp", "cp"], + "NGM95": ["tp", "cp"], + "gfsLR": ["tp", "cp"], + "RUC13": ["tp", "cp"], + "RUC80": ["tp", "cp"], + "MSAS": ["tp", "cp"], + "LAPS": ["pc"], + "DGEX": ["tp"], + "HPCQPF": ["tpHPC"], + "RFCQPF": ["tpHPC"], +#DR3511 "HPCdelta": ["pop", "tcc"], + "HPCGuide": ["pop"], + 'MOSGuide': ['pop12hr', 'pop6hr', 'thp12hr', 'thp3hr', 'thp6hr', 'tcc', 'tp6hr', 'tp12hr', 'wgs'], +#############DCS3501 + "HIRESWarw": ["tp"], + "HIRESWnmm": ["tp"], +#DR20634 "SPC": ["tp"], + + #Dummy ones for the transition from Eta to NAM. These are ignored. + # These will be removed after OB7.1. + #"Eta95": [], + #"Eta80": [], + #"Eta40": [], + #"Eta20": [], + #"Eta12": [], + + } + +#--------------------------------------------------------------------------- +# +# Intersite Coordination Configurations +# +#--------------------------------------------------------------------------- +# base urls for the ISC Routing Table +ISC_ROUTING_TABLE_ADDRESS = { + "ANCF" : "http://165.92.30.69:8080/irt", + "BNCF" : "http://165.92.180.25:8080/irt" + } + + +# list of sites that from which you want ISC data (If None, ifpServer will +# automatically calculate the list.) Should always include your own site. +REQUESTED_ISC_SITES = None + +# Overall ISC request flag. Must be set to 1 in order to request and receive +# ISC data. Must be 1 to register with the IRT. +REQUEST_ISC = 0 + +# Sending control flag. Set to 1 to send isc when data is saved. +SEND_ISC_ON_SAVE = 0 + +# Sending control flag. Set to 1 to send isc when data is published. +SEND_ISC_ON_PUBLISH = 0 + +# List of weather elements to request for ISC. If set to None, it defaults +# to the list of all weather elements in the Fcst database. +REQUESTED_ISC_PARMS = None + +# Transmission script for sending data. This is the script that iscExtract +# and other routines (e.g., vtec table sharing) will call to perform the +# actual transmission of data. +TRANSMIT_SCRIPT = GFESUITE_HOME + '/bin/gfe_msg_send -s %SUBJECT -a %ADDRESSES -i %WMOID -c 11 -p 0 -e %ATTACHMENTS' + + +# Extra ISC parms (weather elements). These are a list of the baseline +# weather elements to be added as extra parms to the ISC database. This +# is necessary when receiving ISC grids from a site that is a different +# office type than your own. You never need to add weather elements +# to the ISC database that is your own office type. The format of this +# entry is a list of tuples. The tuple is a list of weather elements +# objects (such as Temp and not "T"), and an office type, such as "rfc". +EXTRA_ISC_PARMS = [([QPF], 'rfc'), ([QPF], 'wfo')] + +#--------------------------------------------------------------------------- +# +# Misc. Configurations +# +#--------------------------------------------------------------------------- +# defines the number of days to keep log files +LOG_FILE_PURGE_AFTER = 28 + +# auto configure NotifyTextProd -- set after OB6 +AUTO_CONFIGURE_NOTIFYTEXTPROD = 1 #0=off,1=on + + +#----------------------------------- +# DO NOT CHANGE THE FOLLOWING SECTION +#------------------------------------ +# import the local config file +localParms = localNAM12Parms = localRUC13Parms = localRUC80Parms = localNGM80Parms = [] +localGFS80Parms = localgfsLRParms = localNAM40Parms = localDBs = [] +localOPCWavEParms = localOPCWavNWParms = localOPCWavSWParms = [] +localMOSGuideParms = localGFS40Parms = [] +localNAM80Parms = localLAPSParms = localISCParms = localGWWParms = [] +localNAM95Parms = localNGM95Parms = localDGEXParms = [] +localMSASParms = localGLERLParms = localWNAWAVEParms = localAKWAVEParms = [] +localMOSParms = localHPCQPFParms = localRFCQPFParms = [] +#DR3511 localHPCDeltaParms = [] +localTCMParms = localSATParms = localGFS75Parms = localGFS190Parms = [] +localAKwave10Parms = localAKwave4Parms = localEPwave10Parms = localGlobalWaveParms = [] +localWCwave10Parms = localWCwave4Parms = localWNAwave10Parms = localWNAwave4Parms = [] +localGLWMParms = [] #####DCS3499 +localParms = localHIRESWarwParms = localHIRESWnmmParms = [] #######DCS3501 +#DR20634 localParms = localSPCParms = [] +localHPCGuideParms = [] +localRTMAParms = [] +localNamDNG5Parms = [] +localSREFParms = [] +localTPCProbParms = [] +localISCExtraParms = [] + +myOfficeType = SITES[GFESUITE_SITEID][5] + +if not BASELINE and siteImport('localConfig'): + #ensure office type is set properly in localConfig SITES[] + if len(SITES[GFESUITE_SITEID]) == 5: + a = list(SITES[GFESUITE_SITEID]) + a.append(myOfficeType) + SITES[GFESUITE_SITEID] = tuple(a) + else: + myOfficeType = SITES[GFESUITE_SITEID] #probably from localConfig + + localParms = getattr(localConfig, 'parms', localParms) + localNAM12Parms = getattr(localConfig, 'parmsNAM12', localNAM12Parms) + localOPCWavEParms = getattr(localConfig, 'parmsOPCWavE', localOPCWavEParms) + localOPCWavSWParms = getattr(localConfig, 'parmsOPCWavSW', + localOPCWavSWParms) + localOPCWavNWParms = getattr(localConfig, 'parmsOPCWavNW', + localOPCWavNWParms) + localNAM40Parms = getattr(localConfig, 'parmsNAM40', localNAM40Parms) + localNAM80Parms = getattr(localConfig, 'parmsNAM80', localNAM80Parms) + localNAM95Parms = getattr(localConfig, 'parmsNAM95', localNAM95Parms) + localRUC13Parms = getattr(localConfig, 'parmsRUC13', localRUC13Parms) + localRUC80Parms = getattr(localConfig, 'parmsRUC80', localRUC80Parms) + localNGM80Parms = getattr(localConfig, 'parmsNGM80', localNGM80Parms) + localNGM95Parms = getattr(localConfig, 'parmsNGM95', localNGM95Parms) + localGFS40Parms = getattr(localConfig, 'parmsGFS40', localGFS40Parms) + localGFS80Parms = getattr(localConfig, 'parmsGFS80', localGFS80Parms) + localGFS190Parms = getattr(localConfig, 'parmsGFS190', localGFS190Parms) + localGFS75Parms = getattr(localConfig, 'parmsGFS75', localGFS75Parms) + localgfsLRParms = getattr(localConfig, 'parmsgfsLR', localgfsLRParms) + localISCParms = getattr(localConfig, 'parmsISC', localISCParms) + localGWWParms = getattr(localConfig, 'parmsGWW', localGWWParms) + localGLWMParms = getattr(localConfig, 'parmsGLWM', localGLWMParms) #########DCS3499 + localHIRESWarwParms = getattr(localConfig, 'parmsHIRESWarw', localHIRESWarwParms) ########DCS3501 + localHIRESWnmmParms = getattr(localConfig, 'parmsHIRESWnmm', localHIRESWnmmParms) +#DR20634 localSPCParms = getattr(localConfig, 'parmsSPC', localSPCParms) + localWNAWAVEParms = getattr(localConfig, 'parmsWNAWAVE', localWNAWAVEParms) + localAKWAVEParms = getattr(localConfig, 'parmsAKWAVE', localAKWAVEParms) + localLAPSParms = getattr(localConfig, 'parmsLAPS', localLAPSParms) + localMOSGuideParms = getattr(localConfig, 'parmsMOSGuide', + localMOSGuideParms) + localSREFParms = getattr(localConfig, 'parmsSREF', localSREFParms) + localSATParms = getattr(localConfig, 'parmsSAT', localSATParms) + localMSASParms = getattr(localConfig, 'parmsMSAS', localMSASParms) + localGLERLParms = getattr(localConfig, 'parmsGLERL', localGLERLParms) + localDBs = getattr(localConfig, 'dbs', localDBs) + localMOSParms = getattr(localConfig, 'parmsMOS', localMOSParms) + localHPCQPFParms = getattr(localConfig, 'parmsHPCQPF', localHPCQPFParms) + localRFCQPFParms = getattr(localConfig, 'parmsRFCQPF', localRFCQPFParms) +#DR3511 localHPCDeltaParms = getattr(localConfig, 'parmsHPCDelta', +#DR3511 localHPCDeltaParms) + localTCMParms = getattr(localConfig, 'parmsTCM', localTCMParms) + localDGEXParms = getattr(localConfig, 'parmsDGEX', localDGEXParms) + localHPCGuideParms = getattr(localConfig, 'parmsHPCGuide', + localHPCGuideParms) + localRTMAParms = getattr(localConfig, 'parmsRTMA', localRTMAParms) + localNamDNG5Parms = getattr(localConfig, 'parmsNamDNG5', localNamDNG5Parms) + localTPCProbParms = getattr(localConfig, 'parmsTPCProb', localTPCProbParms) + + #note that extraISCparms are not in the standard format. These + #are a list of ([p, p, p, p], officeType) + localISCExtraParms = getattr(localConfig, 'extraISCparms', localISCExtraParms) + +#--------------------------------------------------------------------------- +# Parm groups. Combine parms with time constraints +# list of ([parms], timeConstraints) +#--------------------------------------------------------------------------- + +# 6 hourly +STD6_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC6), + ([Haines, MixHgt, FreeWind, TransWind, VentRate], TC6), + ([DSI, Stability, Ttrend, RHtrend], TC6), + ([SnowAmt, PoP, CWR], TC6NG), ([QPF, Weather, IceAcc, LAL], TC6NG), + ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), + ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), + ([MaxT], MaxTTC), ([MinT], MinTTC), + ([Wetflag], FireWx1300TC)] + +# hourly +STD1_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC1), + ([Haines, MixHgt, FreeWind, TransWind], TC1), + ([DSI, Stability, VentRate, Ttrend, RHtrend], TC1), + ([SnowAmt, PoP, CWR], TC1), ([QPF, Weather, IceAcc, LAL], TC1), + ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), + ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), + ([MaxT], MaxTTC), ([MinT], MinTTC), + ([Wetflag], FireWx1300TC)] + +# 3 hourly +STD3_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC3), + ([Haines, MixHgt, FreeWind, TransWind], TC3), + ([DSI, Stability, VentRate, Ttrend, RHtrend], TC3), + ([SnowAmt, PoP, CWR], TC3NG), ([QPF, IceAcc, Weather, LAL], TC3NG), + ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), + ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), + ([MaxT], MaxTTC), ([MinT], MinTTC), + ([Wetflag], FireWx1300TC)] + +######DCS3501 +# 3 hourly-HIRESW +STD3_MODEL_HIRESW = [([Temp, Td, RH, Wind, FzLevel], TC3), + ([MixHgt, FreeWind, TransWind], TC3), ([QPF, CWR], TC3NG), + ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), + ([MaxT], MaxTTC), ([MinT], MinTTC)] + +# 12 hourly +STD12_MODEL = [([Temp, Td, RH, Wind, Wind20ft, Sky, FzLevel, SnowLevel], TC12), + ([Haines, MixHgt, FreeWind, TransWind], TC12), + ([DSI, Stability, VentRate, Ttrend, RHtrend], TC12), + ([SnowAmt, PoP, CWR], TC12NG), + ([QPF, IceAcc, Weather, LAL], TC12NG), + ([MaxT], MaxTTC), ([MinT], MinTTC), + ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), + ([MarineLayer, HrsOfSun, InvBurnOffTemp], LT24), + ([Wetflag], FireWx1300TC)] + +# MOS (Model) +MOS_MODEL = [([Temp, Td, Wind, Weather, Sky], TC1), + ([MaxT], MaxTTCMOS), ([MinT], MinTTCMOS), + ([SnowAmt, PoP], LTMOS), ([QPF], TC6NG)] + +# Fcst and official database parameter groupings +OFFICIALDBS = [([Temp, Td, Wind, Weather, Sky, FzLevel, SnowLevel], TC1), + ([HeatIndex, WindChill, RH, SnowAmt, CWR, QPF], TC1), + ([PoP, Ttrend, RHtrend, Wind20ft], TC1), + ([MinT], MinTTC), ([MaxT], MaxTTC), + ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), + ([WaveHeight, SurfHeight, WindGust, Swell, Swell2, Period, Period2], TC1), + ([VentRate, LAL, Haines, MixHgt, FreeWind, TransWind], TC1), + ([WindWaveHeight, DSI, Stability, MarineLayer], TC1), + ([HrsOfSun, InvBurnOffTemp], LT24), + ([IceAcc, IceCoverage, Hazards], TC1), + ([Wetflag], FireWx1300TC), + ([StormTotalSnow], TC1), + # Tropical parms + ([prob34, prob50, prob64], TC1), + ([pws34,pws50,pws64,SurgeHtPlusTide,SurgeHtPlusTideWTopo], TC1), + ([pwsD34,pwsD64], PWSDTC), + ([pwsN34,pwsN64], PWSNTC), + ([pws34int,pws64int], TC6NG), + # DR20541 and 20482 + ([PoP12hr], TC12NG), + ([QPF6hr, SnowAmt6hr], TC6NG), + ([cape], LT6NG), + ([ApparentT, HeatIndex, WindChill, UWaveDir, VWaveDir, LkSfcT, SnowMap, WaveDir, SnowRatio, StormTotalQPF], TC1), + ] + +# Global Wave Watch III, WNAWAVE, AKWAVE Model database parameter groupings +WAVEPARMS = [([WindWaveHeight, WaveHeight, SurfHeight, Wind], TC6), + ([Swell, Swell2, Period, Period2], TC6)] + +# GLWM Model database parameter groupings +GLWMPARMS = [([SigWaveHgt, WindWaveHgt, WindWaveDir, WindWavePeriod], TC1)] +######DCS3501 +# HIRESW database parameter groupings +HIRESWarwPARMS = [([Temp], TC3)] +HIRESWnmmPARMS = [([Temp], TC3)] +#DR20634 SPCPARMS = [([Temp], TC1)] + +# LAPS database parameter groupings +LAPSPARMS = [([Temp, Td, Wind, Weather, Sky, SnowAmt, QPF, Radar], TC1)] + +# MOS Guide parameters - this is supposed to be a fix to the baseline error - we'll see +#MOSGuidePARMS = [([Temp, Td, Wind, RH], TC3), +# ([MinT], MinTTC), ([MaxT], MaxTTC), +# ([PoP6, PoP12, TstmPrb3, TstmPrb6, TstmPrb12, Sky, WindGust, QPF6, QPF12], TC6NG)] +MOSGuidePARMS = [([Temp, Td, Wind, RH], TC1), + ([MinT], MinTTC), ([MaxT], MaxTTC), + ([TstmPrb3], TC3NG), + ([PoP6, TstmPrb6, Sky, WindGust, QPF6], TC6NG), + ([PoP12, PoP, QPF12, QPF, TstmPrb12], TC12NG)] + +# OPC TAF parameters (for NW, SW, and E) +OPCTAFBPARMS = [([WindWaveHeight, WaveHeight], TC1)] + +# SAT database parameter groupings +SATPARMS = [([SatVisE, SatIR11E, SatIR13E, SatIR39E, SatWVE, SatFogE], TC_1M), + ([SatVisW, SatIR11W, SatIR13W, SatIR39W, SatWVW, SatFogW], TC_1M)] + +# MSAS database parameter groupings +MSASPARMS = [([Temp, Td, Wind], TC1)] + +# GLERL database parameter groupings +GLERLPARMS = [([WaveHeight, Period, Swell], TC1)] + +# SREF database parameter groupings +SREFPARMS = [([Temp, Td, Wind], TC1)] + +HPCQPF_MODEL = [([QPF], TC6NG)] +RFCQPF_MODEL = [([QPF], TC6NG)] + +#DR3511 HPCDELTA_MODEL = [([DeltaMinT], MinTTC), ([DeltaMaxT], DeltaMaxTTC), +#DR3511 ([DeltaWind], TC12), +#DR3511 ([DeltaPoP, DeltaSky], TC12NG)] +#DR3511 +HPCGUIDE_MODEL = [([MaxT], MaxTTC), ([MinT], MinTTC), + ([Sky, Td, Wind], TC6), ([PoP], TC12NG)] + +# This model has Wind, but we use a different definition here since we +# want to higher maximum velocity to be allowed. +TPCTCM_MODEL = [([HiWind], TC3)] + +# RTMA database parameter groupings +#if SID in ALASKA_SITES: - not sure if this is right +if SID in ALASKA_SITES or SID in ["HFO", "SJU"]: + RTMAPARMS = [([Temp,Td,RH,Wind],TC1), + ([MinT],MinTTC), ([MaxT],MaxTTC), + ([MinRH],MinRHTC), ([MaxRH],MaxRHTC), + ([TUnc,TdUnc,WSpdUnc,WDirUnc],TC1)] +else: + RTMAPARMS = [([Temp,Td,RH,Wind,QPE,Sky],TC1), + ([MinT],MinTTC), ([MaxT],MaxTTC), + ([MinRH],MinRHTC), ([MaxRH],MaxRHTC), + ([TUnc,TdUnc,WSpdUnc,WDirUnc],TC1)] + +# NamDNG5 database parameter groupings +NamDNG5PARMS = [([Temp, Td, RH, Wind, Sky, WindGust, Vis], TC3), + ([MixHgt, TransWind, SnowLevel], TC3), + ([MinT], MinTTC), ([MaxT], MaxTTC), + ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), + ([QPF3, PoP, SnowAmt], TC3NG), + ([QPF6, PoP6, SnowAmt6], TC6NG), ([QPF12, PoP12], TC12NG), + ([MaxT3, MinT3, MaxRH3], TC3NG), + ] + +TPCProbPARMS = [([prob34, prob50, prob64], TC1), + ([pws34,pws50,pws64], TC1), + ([pwsD34,pwsD64], PWSDTC), + ([pwsN34,pwsN64], PWSNTC), + ] + +# Cobb snow tool +parmsNAM12 = [([SnowRatio], TC1)] +parmsGFS40 = [([SnowRatio], TC1)] +#--------------------------------------------------------------------------- +# Databases for a site. +# list of (Database, [parms]) +#--------------------------------------------------------------------------- +DATABASES = [(Official, OFFICIALDBS + localParms), + (Fcst, OFFICIALDBS + localParms), + (Practice, OFFICIALDBS + localParms), + (TestFcst, OFFICIALDBS + localParms), + (NAM80, STD6_MODEL + localNAM80Parms), + (NAM95, STD6_MODEL + localNAM95Parms), + (RUC13, STD1_MODEL + localRUC13Parms), + (RUC80, STD1_MODEL + localRUC80Parms), + (NGM80, STD6_MODEL + localNGM80Parms), + (NGM95, STD6_MODEL + localNGM95Parms), + (GFS40, STD6_MODEL + localGFS40Parms), + (GFS80, STD6_MODEL + localGFS80Parms), + (GFS75, STD6_MODEL + localGFS75Parms), + (GFS190, STD6_MODEL + localGFS190Parms), + (NAM40, STD3_MODEL + localNAM40Parms), + (NAM12, STD3_MODEL + localNAM12Parms), + (gfsLR, STD12_MODEL + localgfsLRParms), + (GWW, WAVEPARMS + localGWWParms), + (WNAWAVE, WAVEPARMS + localWNAWAVEParms), + (AKWAVE, WAVEPARMS + localAKWAVEParms), + (AKwave10, WAVEPARMS + localAKwave10Parms), + (AKwave4, WAVEPARMS + localAKwave4Parms), + (EPwave10, WAVEPARMS + localEPwave10Parms), + (GlobalWave, WAVEPARMS + localGlobalWaveParms), + (GLWM, GLWMPARMS + localGLWMParms), #####DCS3499 + (HIRESWarw, STD3_MODEL + localHIRESWarwParms), #####DCS3501 + (HIRESWnmm, STD3_MODEL + localHIRESWnmmParms), +#DR20634 (SPC, SPCPARMS + localSPCParms), + (WCwave10, WAVEPARMS + localWCwave10Parms), + (WCwave4, WAVEPARMS + localWCwave4Parms), + (WNAwave10, WAVEPARMS + localWNAwave10Parms), + (WNAwave4, WAVEPARMS + localWNAwave4Parms), + (HPCGrid, MOS_MODEL + localMOSParms), + (HPCQPF, HPCQPF_MODEL + localHPCQPFParms), + (RFCQPF, RFCQPF_MODEL + localRFCQPFParms), +#DR3511 (HPCDelta, HPCDELTA_MODEL + localHPCDeltaParms), + (HPCGuide, HPCGUIDE_MODEL + localHPCGuideParms), + (TPCTCM, TPCTCM_MODEL + localTCMParms), + (DGEX, STD6_MODEL + localDGEXParms), + (LAPS, LAPSPARMS + localLAPSParms), + (MOSGuide, MOSGuidePARMS + localMOSGuideParms), + (SREF, SREFPARMS + localSREFParms), + (OPCTAFBE, OPCTAFBPARMS + localOPCWavEParms), + (OPCTAFBNW, OPCTAFBPARMS + localOPCWavNWParms), + (OPCTAFBSW, OPCTAFBPARMS + localOPCWavSWParms), + (SAT, SATPARMS + localSATParms), + (MSAS, MSASPARMS + localMSASParms), + (GLERL, GLERLPARMS + localGLERLParms), + (RTMA, RTMAPARMS + localRTMAParms), + (NamDNG5, NamDNG5PARMS + localNamDNG5Parms), + (TPCProb, TPCProbPARMS + localTPCProbParms), + (Test, OFFICIALDBS + localParms)] + localDBs + +# Intersite coordination database parameter groupings, based on +# OFFICIALDBS, but time constraint is always TC1 +ISCPARMS = [] +for wes, tc in (OFFICIALDBS + localISCParms): + ISCPARMS.append((wes, TC1)) +# We also add in any extraISCparms as needed, but only for office +# types other than our own. +for wes, officeType in (EXTRA_ISC_PARMS + localISCExtraParms): + if myOfficeType == officeType: + continue + for we in wes: + wecopy = list(we) + wecopy[0] = wecopy[0] + officeType #rename the weather element + wecopy = tuple(wecopy) + ISCPARMS.append(([wecopy], TC1)) + +# Restore database parameter groupings (based on OFFICIALDBS, but TC1) +RESTOREPARMS = [] +for wes, tc in (OFFICIALDBS + localParms): + RESTOREPARMS.append((wes, TC1)) + +# Now add the ISC and Restore databases to the DATABASES groupings +DATABASES.append((Restore, RESTOREPARMS)) +DATABASES.append((ISC, ISCPARMS)) + +#--------------------------------------------------------------------------- +# +# General server configuration section +# +#--------------------------------------------------------------------------- + +#---------------------------------------------------------------------------- +# Server settings DO NOT CHANGE THESE DEFINITIONS +#---------------------------------------------------------------------------- +from com.raytheon.edex.plugin.gfe.config import IFPServerConfig, SimpleServerConfig +IFPConfigServer = SimpleServerConfig() +#IFPConfigServer.allowedNodes = [] +IFPConfigServer.allowTopoBelowZero = 1 + + +def doIt(): + # Import the local site configuration file (if it exists) + import doConfig +# import VTECPartners + (models, projections, vis, wx, desDef, allSites, domain, siteId, timeZone,officeTypes) = \ + doConfig.parse(GFESUITE_SITEID, DATABASES, types, visibilities, SITES, + allProjections) + IFPConfigServer.models = models + IFPConfigServer.projectionData = projections + IFPConfigServer.weatherVisibilities = vis + IFPConfigServer.weatherTypes = wx + IFPConfigServer.discreteDefinitions = desDef + IFPConfigServer.allSites = allSites + IFPConfigServer.officeTypes = officeTypes + IFPConfigServer.siteID = siteId + IFPConfigServer.timeZone = timeZone + IFPConfigServer.d2dModels = doConfig.d2dParse(D2DMODELS) + IFPConfigServer.satDirs = doConfig.parseSat(SATDATA) + IFPConfigServer.domain = domain + + (serverHost, mhsid, \ + rpcPort, \ + initMethods, accumulativeD2DElements, \ + initSkips, d2dVersions, \ + logFilePurgeAfter, \ + prdDir, baseDir, \ + extraWEPrecision, \ + autoConfigureNotifyTextProd, \ + iscRoutingTableAddress, \ + requestedISCsites, requestISC, \ + sendiscOnSave, sendiscOnPublish, \ + requestedISCparms, \ + transmitScript) \ + = doConfig.otherParse(\ + GFESUITE_SERVER, GFESUITE_MHSID, \ + GFESUITE_PORT, INITMODULES, + D2DAccumulativeElements, + INITSKIPS, D2DDBVERSIONS, LOG_FILE_PURGE_AFTER, + GFESUITE_PRDDIR, GFESUITE_HOME, + ExtraWEPrecision, AUTO_CONFIGURE_NOTIFYTEXTPROD, ISC_ROUTING_TABLE_ADDRESS, + REQUESTED_ISC_SITES, REQUEST_ISC, SEND_ISC_ON_SAVE, SEND_ISC_ON_PUBLISH, + REQUESTED_ISC_PARMS, TRANSMIT_SCRIPT) + IFPConfigServer.serverHost = serverHost + IFPConfigServer.mhsid = mhsid + IFPConfigServer.rpcPort = rpcPort + IFPConfigServer.initMethods = initMethods + IFPConfigServer.accumulativeD2DElements = accumulativeD2DElements + IFPConfigServer.initSkips = initSkips + IFPConfigServer.d2dVersions = d2dVersions + IFPConfigServer.logFilePurgeAfter = logFilePurgeAfter + IFPConfigServer.prdDir = prdDir + IFPConfigServer.baseDir = baseDir + IFPConfigServer.extraWEPrecision = extraWEPrecision + IFPConfigServer.autoConfigureNotifyTextProd = autoConfigureNotifyTextProd + IFPConfigServer.iscRoutingTableAddress = iscRoutingTableAddress + IFPConfigServer.requestedISCsites = requestedISCsites + IFPConfigServer.requestISC = requestISC + IFPConfigServer.sendiscOnSave = sendiscOnSave + IFPConfigServer.sendiscOnPublish = sendiscOnPublish + IFPConfigServer.requestedISCparms = requestedISCparms + IFPConfigServer.transmitScript = transmitScript + +doIt() diff --git a/edexOsgi/build.edex/esb/etc/ingestDat.sh b/edexOsgi/build.edex/esb/etc/ingestDat.sh index a90e7a6d4b..85400eab6b 100644 --- a/edexOsgi/build.edex/esb/etc/ingestDat.sh +++ b/edexOsgi/build.edex/esb/etc/ingestDat.sh @@ -21,7 +21,7 @@ export INIT_MEM=256 # in Meg if [ $HIGH_MEM_FLAG == "on" ]; then - export MAX_MEM=1280 # in Meg + export MAX_MEM=1792 # in Meg else export MAX_MEM=768 # in Meg fi diff --git a/edexOsgi/build.edex/opt/db/ddl/ncep/loadState.sql b/edexOsgi/build.edex/opt/db/ddl/ncep/loadState.sql index 8d19db7f7e..50f0553e72 100644 --- a/edexOsgi/build.edex/opt/db/ddl/ncep/loadState.sql +++ b/edexOsgi/build.edex/opt/db/ddl/ncep/loadState.sql @@ -1,60 +1,60 @@ COPY stns.STATE (STATEID , STATENAME) FROM stdin with delimiter as ','; -AL,ALABAMA -AK,ALASKA -AZ,ARIZONA -AR,ARKANSAS -CA,CALIFORNIA -CO,COLORADO -CT,CONNECTICUT -DE,DELAWARE -DC,DISTRICT OF COLUMBIA -FL,FLORIDA -GA,GEORGIA -HI,HAWAII -ID,IDAHO -IL,ILLINOIS -IN,INDIANA -IA,IOWA -KS,KANSAS -KY,KENTUCKY -LA,LOUISIANA -ME,MAINE -MD,MARYLAND -MA,MASSACHUSETTS -MI,MICHIGAN -MN,MINNESOTA -MS,MISSISSIPPI -MO,MISSOURI -MT,MONTANA -NE,NEBRASKA -NV,NEVADA -NH,NEW HAMPSHIRE -NJ,NEW JERSEY -NM,NEW MEXICO -NY,NEW YORK -NC,NORTH CAROLINA -ND,NORTH DAKOTA -OH,OHIO -OK,OKLAHOMA -OR,OREGON -PA,PENNSYLVANIA -RI,RHODE ISLAND -SC,SOUTH CAROLINA -SD,SOUTH DAKOTA -TN,TENNESSEE -TX,TEXAS -UT,UTAH -VT,VERMONT -VA,VIRGINIA -WA,WASHINGTON -WV,WEST VIRGINIA -WI,WISCONSIN -WY,WYOMING -LH,LAKE HURON -LO,LAKE ONTARIO -LM,LAKE MICHIGAN -LE,LAKE ERIE -LS,LAKE SUPERIOR -CW,COASTAL WATERS -PR,PUERTO RICO +AL,ALABAMA +AK,ALASKA +AZ,ARIZONA +AR,ARKANSAS +CA,CALIFORNIA +CO,COLORADO +CT,CONNECTICUT +DE,DELAWARE +DC,DISTRICT OF COLUMBIA +FL,FLORIDA +GA,GEORGIA +HI,HAWAII +ID,IDAHO +IL,ILLINOIS +IN,INDIANA +IA,IOWA +KS,KANSAS +KY,KENTUCKY +LA,LOUISIANA +ME,MAINE +MD,MARYLAND +MA,MASSACHUSETTS +MI,MICHIGAN +MN,MINNESOTA +MS,MISSISSIPPI +MO,MISSOURI +MT,MONTANA +NE,NEBRASKA +NV,NEVADA +NH,NEW HAMPSHIRE +NJ,NEW JERSEY +NM,NEW MEXICO +NY,NEW YORK +NC,NORTH CAROLINA +ND,NORTH DAKOTA +OH,OHIO +OK,OKLAHOMA +OR,OREGON +PA,PENNSYLVANIA +RI,RHODE ISLAND +SC,SOUTH CAROLINA +SD,SOUTH DAKOTA +TN,TENNESSEE +TX,TEXAS +UT,UTAH +VT,VERMONT +VA,VIRGINIA +WA,WASHINGTON +WV,WEST VIRGINIA +WI,WISCONSIN +WY,WYOMING +LH,LAKE HURON +LO,LAKE ONTARIO +LM,LAKE MICHIGAN +LE,LAKE ERIE +LS,LAKE SUPERIOR +CW,COASTAL WATERS +PR,PUERTO RICO \. diff --git a/edexOsgi/build.edex/opt/db/ddl/setup/postgresql.conf b/edexOsgi/build.edex/opt/db/ddl/setup/postgresql.conf index cca205eebc..29d7883eaa 100644 --- a/edexOsgi/build.edex/opt/db/ddl/setup/postgresql.conf +++ b/edexOsgi/build.edex/opt/db/ddl/setup/postgresql.conf @@ -1,471 +1,471 @@ -# ----------------------------- -# PostgreSQL configuration file -# ----------------------------- -# -# This file consists of lines of the form: -# -# name = value -# -# (The '=' is optional.) White space may be used. Comments are introduced -# with '#' anywhere on a line. The complete list of option names and -# allowed values can be found in the PostgreSQL documentation. The -# commented-out settings shown in this file represent the default values. -# -# Please note that re-commenting a setting is NOT sufficient to revert it -# to the default value, unless you restart the server. -# -# Any option can also be given as a command line switch to the server, -# e.g., 'postgres -c log_connections=on'. Some options can be changed at -# run-time with the 'SET' SQL command. -# -# This file is read on server startup and when the server receives a -# SIGHUP. If you edit the file on a running system, you have to SIGHUP the -# server for the changes to take effect, or use "pg_ctl reload". Some -# settings, which are marked below, require a server shutdown and restart -# to take effect. -# -# Memory units: kB = kilobytes MB = megabytes GB = gigabytes -# Time units: ms = milliseconds s = seconds min = minutes h = hours d = days - - -#--------------------------------------------------------------------------- -# FILE LOCATIONS -#--------------------------------------------------------------------------- - -# The default values of these variables are driven from the -D command line -# switch or PGDATA environment variable, represented here as ConfigDir. - -#data_directory = 'ConfigDir' # use data in another directory - # (change requires restart) -#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file - # (change requires restart) -#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file - # (change requires restart) - -# If external_pid_file is not explicitly set, no extra PID file is written. -#external_pid_file = '(none)' # write an extra PID file - # (change requires restart) - - -#--------------------------------------------------------------------------- -# CONNECTIONS AND AUTHENTICATION -#--------------------------------------------------------------------------- - -# - Connection Settings - - -listen_addresses = '*' # what IP address(es) to listen on; - # comma-separated list of addresses; - # defaults to 'localhost', '*' = all - # (change requires restart) -#port = 5432 # (change requires restart) -max_connections = 300 # (change requires restart) -# Note: increasing max_connections costs ~400 bytes of shared memory per -# connection slot, plus lock space (see max_locks_per_transaction). You -# might also need to raise shared_buffers to support more connections. -#superuser_reserved_connections = 3 # (change requires restart) -#unix_socket_directory = '' # (change requires restart) -#unix_socket_group = '' # (change requires restart) -#unix_socket_permissions = 0777 # octal - # (change requires restart) -#bonjour_name = '' # defaults to the computer name - # (change requires restart) - -# - Security & Authentication - - -#authentication_timeout = 1min # 1s-600s -#ssl = off # (change requires restart) -#password_encryption = on -#db_user_namespace = off - -# Kerberos -#krb_server_keyfile = '' # (change requires restart) -#krb_srvname = 'postgres' # (change requires restart) -#krb_server_hostname = '' # empty string matches any keytab entry - # (change requires restart) -#krb_caseins_users = off # (change requires restart) - -# - TCP Keepalives - -# see 'man 7 tcp' for details - -#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; - # 0 selects the system default -#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; - # 0 selects the system default -#tcp_keepalives_count = 0 # TCP_KEEPCNT; - # 0 selects the system default - - -#--------------------------------------------------------------------------- -# RESOURCE USAGE (except WAL) -#--------------------------------------------------------------------------- - -# - Memory - - -shared_buffers = 1024MB # min 128kB or max_connections*16kB - # (change requires restart) -temp_buffers = 16MB # min 800kB -#max_prepared_transactions = 5 # can be 0 or more - # (change requires restart) -# Note: increasing max_prepared_transactions costs ~600 bytes of shared memory -# per transaction slot, plus lock space (see max_locks_per_transaction). -work_mem = 8MB # min 64kB -maintenance_work_mem = 32MB # min 1MB -#max_stack_depth = 2MB # min 100kB - -# - Free Space Map - - -max_fsm_pages = 153600 # min max_fsm_relations*16, 6 bytes each - # (change requires restart) -#max_fsm_relations = 1000 # min 100, ~70 bytes each - # (change requires restart) - -# - Kernel Resource Usage - - -#max_files_per_process = 1000 # min 25 - # (change requires restart) -#shared_preload_libraries = '' # (change requires restart) - -# - Cost-Based Vacuum Delay - - -#vacuum_cost_delay = 0 # 0-1000 milliseconds -#vacuum_cost_page_hit = 1 # 0-10000 credits -#vacuum_cost_page_miss = 10 # 0-10000 credits -#vacuum_cost_page_dirty = 20 # 0-10000 credits -#vacuum_cost_limit = 200 # 0-10000 credits - -# - Background writer - - -#bgwriter_delay = 200ms # 10-10000ms between rounds -#bgwriter_lru_percent = 1.0 # 0-100% of LRU buffers scanned/round -#bgwriter_lru_maxpages = 5 # 0-1000 buffers max written/round -#bgwriter_all_percent = 0.333 # 0-100% of all buffers scanned/round -#bgwriter_all_maxpages = 5 # 0-1000 buffers max written/round - - -#--------------------------------------------------------------------------- -# WRITE AHEAD LOG -#--------------------------------------------------------------------------- - -# - Settings - - -fsync = off # turns forced synchronization on or off -#wal_sync_method = fsync # the default is the first option - # supported by the operating system: - # open_datasync - # fdatasync - # fsync - # fsync_writethrough - # open_sync -#full_page_writes = on # recover from partial page writes -#wal_buffers = 64kB # min 32kB - # (change requires restart) -commit_delay = 50000 # range 0-100000, in microseconds -commit_siblings = 5 # range 1-1000 - -# - Checkpoints - - -checkpoint_segments = 10 # in logfile segments, min 1, 16MB each -#checkpoint_timeout = 5min # range 30s-1h -#checkpoint_warning = 30s # 0 is off - -# - Archiving - - -#archive_command = '' # command to use to archive a logfile segment -#archive_timeout = 0 # force a logfile segment switch after this - # many seconds; 0 is off - - -#--------------------------------------------------------------------------- -# QUERY TUNING -#--------------------------------------------------------------------------- - -# - Planner Method Configuration - - -#enable_bitmapscan = on -#enable_hashagg = on -#enable_hashjoin = on -#enable_indexscan = on -#enable_mergejoin = on -#enable_nestloop = on -#enable_seqscan = on -#enable_sort = on -#enable_tidscan = on - -# - Planner Cost Constants - - -#seq_page_cost = 1.0 # measured on an arbitrary scale -#random_page_cost = 4.0 # same scale as above -#cpu_tuple_cost = 0.01 # same scale as above -#cpu_index_tuple_cost = 0.005 # same scale as above -#cpu_operator_cost = 0.0025 # same scale as above -effective_cache_size = 2048MB - -# - Genetic Query Optimizer - - -#geqo = on -#geqo_threshold = 12 -#geqo_effort = 5 # range 1-10 -#geqo_pool_size = 0 # selects default based on effort -#geqo_generations = 0 # selects default based on effort -#geqo_selection_bias = 2.0 # range 1.5-2.0 - -# - Other Planner Options - - -#default_statistics_target = 10 # range 1-1000 -#constraint_exclusion = off -#from_collapse_limit = 8 -#join_collapse_limit = 8 # 1 disables collapsing of explicit - # JOINs - - -#--------------------------------------------------------------------------- -# ERROR REPORTING AND LOGGING -#--------------------------------------------------------------------------- - -# - Where to Log - - -#log_destination = 'stderr' # Valid values are combinations of - # stderr, syslog and eventlog, - # depending on platform. - -# This is used when logging to stderr: -logging_collector = on # Enable capturing of stderr into log - # files - # (change requires restart) - -# These are only used if redirect_stderr is on: -log_directory = 'pg_log' # Directory where log files are written - # Can be absolute or relative to PGDATA -#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file name pattern. - # Can include strftime() escapes -log_truncate_on_rotation = on # If on, any existing log file of the same - # name as the new log file will be - # truncated rather than appended to. But - # such truncation only occurs on - # time-driven rotation, not on restarts - # or size-driven rotation. Default is - # off, meaning append to existing files - # in all cases. -log_rotation_age = 1d # Automatic rotation of logfiles will - # happen after that time. 0 to - # disable. -log_rotation_size = 0 # Automatic rotation of logfiles will - # happen after that much log - # output. 0 to disable. - -# These are relevant when logging to syslog: -#syslog_facility = 'LOCAL0' -#syslog_ident = 'postgres' - - -# - When to Log - - -#client_min_messages = notice # Values, in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # log - # notice - # warning - # error - -#log_min_messages = notice # Values, in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic - -#log_error_verbosity = default # terse, default, or verbose messages - -log_min_error_statement = log # Values in order of increasing severity: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic (effectively off) - -#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements - # and their durations. - -#silent_mode = off # DO NOT USE without syslog or - # redirect_stderr - # (change requires restart) - -# - What to Log - - -#debug_print_parse = off -#debug_print_rewritten = off -#debug_print_plan = off -#debug_pretty_print = off -#log_connections = off -#log_disconnections = off -#log_duration = off -log_line_prefix='%t %x %d : %h : ' - # Special values: - # %u = user name - # %d = database name - # %r = remote host and port - # %h = remote host - # %p = PID - # %t = timestamp (no milliseconds) - # %m = timestamp with milliseconds - # %i = command tag - # %c = session id - # %l = session line number - # %s = session start timestamp - # %x = transaction id - # %q = stop here in non-session - # processes - # %% = '%' - # e.g. '<%u%%%d> ' -#log_statement = 'none' # none, ddl, mod, all -#log_hostname = off - - -#--------------------------------------------------------------------------- -# RUNTIME STATISTICS -#--------------------------------------------------------------------------- - -# - Query/Index Statistics Collector - - -#stats_command_string = on -#update_process_title = on - -#stats_block_level = off -track_counts = on -#stats_reset_on_server_start = off # (change requires restart) - - -# - Statistics Monitoring - - -#log_parser_stats = off -#log_planner_stats = off -#log_executor_stats = off -#log_statement_stats = off - - -#--------------------------------------------------------------------------- -# AUTOVACUUM PARAMETERS -#--------------------------------------------------------------------------- - -autovacuum = on # enable autovacuum subprocess? - # 'on' requires stats_start_collector - # and stats_row_level to also be on -#autovacuum_naptime = 1min # time between autovacuum runs -#autovacuum_vacuum_threshold = 500 # min # of tuple updates before - # vacuum -#autovacuum_analyze_threshold = 250 # min # of tuple updates before - # analyze -#autovacuum_vacuum_scale_factor = 0.2 # fraction of rel size before - # vacuum -#autovacuum_analyze_scale_factor = 0.1 # fraction of rel size before - # analyze -#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum - # (change requires restart) -#autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for - # autovacuum, -1 means use - # vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for - # autovacuum, -1 means use - # vacuum_cost_limit - - -#--------------------------------------------------------------------------- -# CLIENT CONNECTION DEFAULTS -#--------------------------------------------------------------------------- - -# - Statement Behavior - - -#search_path = '"$user",public' # schema names -#default_tablespace = '' # a tablespace name, '' uses - # the default -#check_function_bodies = on -#default_transaction_isolation = 'read committed' -#default_transaction_read_only = off -#statement_timeout = 0 # 0 is disabled -#vacuum_freeze_min_age = 100000000 - -# - Locale and Formatting - - -datestyle = 'iso, mdy' -timezone = GMT # actually, defaults to TZ - # environment setting -#timezone_abbreviations = 'Default' # select the set of available timezone - # abbreviations. Currently, there are - # Default - # Australia - # India - # However you can also create your own - # file in share/timezonesets/. -#extra_float_digits = 0 # min -15, max 2 -#client_encoding = 'en_US.UTF-8' # actually, defaults to database - # encoding - -# These settings are initialized by initdb -- they might be changed -lc_messages = 'en_US.UTF-8' # locale for system error message - # strings -lc_monetary = 'en_US.UTF-8' # locale for monetary formatting -lc_numeric = 'en_US.UTF-8' # locale for number formatting -lc_time = 'en_US.UTF-8' # locale for time formatting - -# - Other Defaults - - -#explain_pretty_print = on -#dynamic_library_path = '$libdir' -#local_preload_libraries = '' - - -#--------------------------------------------------------------------------- -# LOCK MANAGEMENT -#--------------------------------------------------------------------------- - -#deadlock_timeout = 1s -#max_locks_per_transaction = 64 # min 10 - # (change requires restart) -# Note: each lock table slot uses ~270 bytes of shared memory, and there are -# max_locks_per_transaction * (max_connections + max_prepared_transactions) -# lock table slots. - - -#--------------------------------------------------------------------------- -# VERSION/PLATFORM COMPATIBILITY -#--------------------------------------------------------------------------- - -# - Previous Postgres Versions - - -#add_missing_from = off -#array_nulls = on -#backslash_quote = safe_encoding # on, off, or safe_encoding -#default_with_oids = off -#escape_string_warning = on -#standard_conforming_strings = off -#regex_flavor = advanced # advanced, extended, or basic -#sql_inheritance = on - -# - Other Platforms & Clients - - -#transform_null_equals = off - - -#--------------------------------------------------------------------------- -# CUSTOMIZED OPTIONS -#--------------------------------------------------------------------------- - -#custom_variable_classes = '' # list of custom variable class names +# ----------------------------- +# PostgreSQL configuration file +# ----------------------------- +# +# This file consists of lines of the form: +# +# name = value +# +# (The '=' is optional.) White space may be used. Comments are introduced +# with '#' anywhere on a line. The complete list of option names and +# allowed values can be found in the PostgreSQL documentation. The +# commented-out settings shown in this file represent the default values. +# +# Please note that re-commenting a setting is NOT sufficient to revert it +# to the default value, unless you restart the server. +# +# Any option can also be given as a command line switch to the server, +# e.g., 'postgres -c log_connections=on'. Some options can be changed at +# run-time with the 'SET' SQL command. +# +# This file is read on server startup and when the server receives a +# SIGHUP. If you edit the file on a running system, you have to SIGHUP the +# server for the changes to take effect, or use "pg_ctl reload". Some +# settings, which are marked below, require a server shutdown and restart +# to take effect. +# +# Memory units: kB = kilobytes MB = megabytes GB = gigabytes +# Time units: ms = milliseconds s = seconds min = minutes h = hours d = days + + +#--------------------------------------------------------------------------- +# FILE LOCATIONS +#--------------------------------------------------------------------------- + +# The default values of these variables are driven from the -D command line +# switch or PGDATA environment variable, represented here as ConfigDir. + +#data_directory = 'ConfigDir' # use data in another directory + # (change requires restart) +#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file + # (change requires restart) +#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file + # (change requires restart) + +# If external_pid_file is not explicitly set, no extra PID file is written. +#external_pid_file = '(none)' # write an extra PID file + # (change requires restart) + + +#--------------------------------------------------------------------------- +# CONNECTIONS AND AUTHENTICATION +#--------------------------------------------------------------------------- + +# - Connection Settings - + +listen_addresses = '*' # what IP address(es) to listen on; + # comma-separated list of addresses; + # defaults to 'localhost', '*' = all + # (change requires restart) +#port = 5432 # (change requires restart) +max_connections = 300 # (change requires restart) +# Note: increasing max_connections costs ~400 bytes of shared memory per +# connection slot, plus lock space (see max_locks_per_transaction). You +# might also need to raise shared_buffers to support more connections. +#superuser_reserved_connections = 3 # (change requires restart) +#unix_socket_directory = '' # (change requires restart) +#unix_socket_group = '' # (change requires restart) +#unix_socket_permissions = 0777 # octal + # (change requires restart) +#bonjour_name = '' # defaults to the computer name + # (change requires restart) + +# - Security & Authentication - + +#authentication_timeout = 1min # 1s-600s +#ssl = off # (change requires restart) +#password_encryption = on +#db_user_namespace = off + +# Kerberos +#krb_server_keyfile = '' # (change requires restart) +#krb_srvname = 'postgres' # (change requires restart) +#krb_server_hostname = '' # empty string matches any keytab entry + # (change requires restart) +#krb_caseins_users = off # (change requires restart) + +# - TCP Keepalives - +# see 'man 7 tcp' for details + +#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; + # 0 selects the system default +#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; + # 0 selects the system default +#tcp_keepalives_count = 0 # TCP_KEEPCNT; + # 0 selects the system default + + +#--------------------------------------------------------------------------- +# RESOURCE USAGE (except WAL) +#--------------------------------------------------------------------------- + +# - Memory - + +shared_buffers = 1024MB # min 128kB or max_connections*16kB + # (change requires restart) +temp_buffers = 16MB # min 800kB +#max_prepared_transactions = 5 # can be 0 or more + # (change requires restart) +# Note: increasing max_prepared_transactions costs ~600 bytes of shared memory +# per transaction slot, plus lock space (see max_locks_per_transaction). +work_mem = 8MB # min 64kB +maintenance_work_mem = 32MB # min 1MB +#max_stack_depth = 2MB # min 100kB + +# - Free Space Map - + +max_fsm_pages = 3500000 # min max_fsm_relations*16, 6 bytes each + # (change requires restart) +max_fsm_relations = 1500 # min 100, ~70 bytes each + # (change requires restart) + +# - Kernel Resource Usage - + +#max_files_per_process = 1000 # min 25 + # (change requires restart) +#shared_preload_libraries = '' # (change requires restart) + +# - Cost-Based Vacuum Delay - + +#vacuum_cost_delay = 0 # 0-1000 milliseconds +#vacuum_cost_page_hit = 1 # 0-10000 credits +#vacuum_cost_page_miss = 10 # 0-10000 credits +#vacuum_cost_page_dirty = 20 # 0-10000 credits +#vacuum_cost_limit = 200 # 0-10000 credits + +# - Background writer - + +#bgwriter_delay = 200ms # 10-10000ms between rounds +#bgwriter_lru_percent = 1.0 # 0-100% of LRU buffers scanned/round +#bgwriter_lru_maxpages = 5 # 0-1000 buffers max written/round +#bgwriter_all_percent = 0.333 # 0-100% of all buffers scanned/round +#bgwriter_all_maxpages = 5 # 0-1000 buffers max written/round + + +#--------------------------------------------------------------------------- +# WRITE AHEAD LOG +#--------------------------------------------------------------------------- + +# - Settings - + +fsync = off # turns forced synchronization on or off +#wal_sync_method = fsync # the default is the first option + # supported by the operating system: + # open_datasync + # fdatasync + # fsync + # fsync_writethrough + # open_sync +#full_page_writes = on # recover from partial page writes +#wal_buffers = 64kB # min 32kB + # (change requires restart) +commit_delay = 50000 # range 0-100000, in microseconds +commit_siblings = 5 # range 1-1000 + +# - Checkpoints - + +checkpoint_segments = 10 # in logfile segments, min 1, 16MB each +#checkpoint_timeout = 5min # range 30s-1h +#checkpoint_warning = 30s # 0 is off + +# - Archiving - + +#archive_command = '' # command to use to archive a logfile segment +#archive_timeout = 0 # force a logfile segment switch after this + # many seconds; 0 is off + + +#--------------------------------------------------------------------------- +# QUERY TUNING +#--------------------------------------------------------------------------- + +# - Planner Method Configuration - + +#enable_bitmapscan = on +#enable_hashagg = on +#enable_hashjoin = on +#enable_indexscan = on +#enable_mergejoin = on +#enable_nestloop = on +#enable_seqscan = on +#enable_sort = on +#enable_tidscan = on + +# - Planner Cost Constants - + +#seq_page_cost = 1.0 # measured on an arbitrary scale +#random_page_cost = 4.0 # same scale as above +#cpu_tuple_cost = 0.01 # same scale as above +#cpu_index_tuple_cost = 0.005 # same scale as above +#cpu_operator_cost = 0.0025 # same scale as above +effective_cache_size = 2048MB + +# - Genetic Query Optimizer - + +#geqo = on +#geqo_threshold = 12 +#geqo_effort = 5 # range 1-10 +#geqo_pool_size = 0 # selects default based on effort +#geqo_generations = 0 # selects default based on effort +#geqo_selection_bias = 2.0 # range 1.5-2.0 + +# - Other Planner Options - + +#default_statistics_target = 10 # range 1-1000 +#constraint_exclusion = off +#from_collapse_limit = 8 +#join_collapse_limit = 8 # 1 disables collapsing of explicit + # JOINs + + +#--------------------------------------------------------------------------- +# ERROR REPORTING AND LOGGING +#--------------------------------------------------------------------------- + +# - Where to Log - + +#log_destination = 'stderr' # Valid values are combinations of + # stderr, syslog and eventlog, + # depending on platform. + +# This is used when logging to stderr: +logging_collector = on # Enable capturing of stderr into log + # files + # (change requires restart) + +# These are only used if redirect_stderr is on: +log_directory = 'pg_log' # Directory where log files are written + # Can be absolute or relative to PGDATA +#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file name pattern. + # Can include strftime() escapes +log_truncate_on_rotation = on # If on, any existing log file of the same + # name as the new log file will be + # truncated rather than appended to. But + # such truncation only occurs on + # time-driven rotation, not on restarts + # or size-driven rotation. Default is + # off, meaning append to existing files + # in all cases. +log_rotation_age = 1d # Automatic rotation of logfiles will + # happen after that time. 0 to + # disable. +log_rotation_size = 0 # Automatic rotation of logfiles will + # happen after that much log + # output. 0 to disable. + +# These are relevant when logging to syslog: +#syslog_facility = 'LOCAL0' +#syslog_ident = 'postgres' + + +# - When to Log - + +#client_min_messages = notice # Values, in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # log + # notice + # warning + # error + +#log_min_messages = notice # Values, in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic + +#log_error_verbosity = default # terse, default, or verbose messages + +log_min_error_statement = log # Values in order of increasing severity: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic (effectively off) + +#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements + # and their durations. + +#silent_mode = off # DO NOT USE without syslog or + # redirect_stderr + # (change requires restart) + +# - What to Log - + +#debug_print_parse = off +#debug_print_rewritten = off +#debug_print_plan = off +#debug_pretty_print = off +#log_connections = off +#log_disconnections = off +#log_duration = off +log_line_prefix='%t %x %d : %h : ' + # Special values: + # %u = user name + # %d = database name + # %r = remote host and port + # %h = remote host + # %p = PID + # %t = timestamp (no milliseconds) + # %m = timestamp with milliseconds + # %i = command tag + # %c = session id + # %l = session line number + # %s = session start timestamp + # %x = transaction id + # %q = stop here in non-session + # processes + # %% = '%' + # e.g. '<%u%%%d> ' +#log_statement = 'none' # none, ddl, mod, all +#log_hostname = off + + +#--------------------------------------------------------------------------- +# RUNTIME STATISTICS +#--------------------------------------------------------------------------- + +# - Query/Index Statistics Collector - + +#stats_command_string = on +#update_process_title = on + +#stats_block_level = off +track_counts = on +#stats_reset_on_server_start = off # (change requires restart) + + +# - Statistics Monitoring - + +#log_parser_stats = off +#log_planner_stats = off +#log_executor_stats = off +#log_statement_stats = off + + +#--------------------------------------------------------------------------- +# AUTOVACUUM PARAMETERS +#--------------------------------------------------------------------------- + +autovacuum = on # enable autovacuum subprocess? + # 'on' requires stats_start_collector + # and stats_row_level to also be on +#autovacuum_naptime = 1min # time between autovacuum runs +#autovacuum_vacuum_threshold = 500 # min # of tuple updates before + # vacuum +#autovacuum_analyze_threshold = 250 # min # of tuple updates before + # analyze +#autovacuum_vacuum_scale_factor = 0.2 # fraction of rel size before + # vacuum +#autovacuum_analyze_scale_factor = 0.1 # fraction of rel size before + # analyze +#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum + # (change requires restart) +#autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for + # autovacuum, -1 means use + # vacuum_cost_delay +#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for + # autovacuum, -1 means use + # vacuum_cost_limit + + +#--------------------------------------------------------------------------- +# CLIENT CONNECTION DEFAULTS +#--------------------------------------------------------------------------- + +# - Statement Behavior - + +#search_path = '"$user",public' # schema names +#default_tablespace = '' # a tablespace name, '' uses + # the default +#check_function_bodies = on +#default_transaction_isolation = 'read committed' +#default_transaction_read_only = off +#statement_timeout = 0 # 0 is disabled +#vacuum_freeze_min_age = 100000000 + +# - Locale and Formatting - + +datestyle = 'iso, mdy' +timezone = GMT # actually, defaults to TZ + # environment setting +#timezone_abbreviations = 'Default' # select the set of available timezone + # abbreviations. Currently, there are + # Default + # Australia + # India + # However you can also create your own + # file in share/timezonesets/. +#extra_float_digits = 0 # min -15, max 2 +#client_encoding = 'en_US.UTF-8' # actually, defaults to database + # encoding + +# These settings are initialized by initdb -- they might be changed +lc_messages = 'en_US.UTF-8' # locale for system error message + # strings +lc_monetary = 'en_US.UTF-8' # locale for monetary formatting +lc_numeric = 'en_US.UTF-8' # locale for number formatting +lc_time = 'en_US.UTF-8' # locale for time formatting + +# - Other Defaults - + +#explain_pretty_print = on +#dynamic_library_path = '$libdir' +#local_preload_libraries = '' + + +#--------------------------------------------------------------------------- +# LOCK MANAGEMENT +#--------------------------------------------------------------------------- + +#deadlock_timeout = 1s +#max_locks_per_transaction = 64 # min 10 + # (change requires restart) +# Note: each lock table slot uses ~270 bytes of shared memory, and there are +# max_locks_per_transaction * (max_connections + max_prepared_transactions) +# lock table slots. + + +#--------------------------------------------------------------------------- +# VERSION/PLATFORM COMPATIBILITY +#--------------------------------------------------------------------------- + +# - Previous Postgres Versions - + +#add_missing_from = off +#array_nulls = on +#backslash_quote = safe_encoding # on, off, or safe_encoding +#default_with_oids = off +#escape_string_warning = on +#standard_conforming_strings = off +#regex_flavor = advanced # advanced, extended, or basic +#sql_inheritance = on + +# - Other Platforms & Clients - + +#transform_null_equals = off + + +#--------------------------------------------------------------------------- +# CUSTOMIZED OPTIONS +#--------------------------------------------------------------------------- + +#custom_variable_classes = '' # list of custom variable class names diff --git a/edexOsgi/com.raytheon.edex.adaptersrv/com.raytheon.edex.adaptersrv.ecl b/edexOsgi/com.raytheon.edex.adaptersrv/com.raytheon.edex.adaptersrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/com.raytheon.edex.autobldsrv.ecl b/edexOsgi/com.raytheon.edex.autobldsrv/com.raytheon.edex.autobldsrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.collaboration/com.raytheon.edex.collaboration.ecl b/edexOsgi/com.raytheon.edex.collaboration/com.raytheon.edex.collaboration.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.common/com.raytheon.edex.common.ecl b/edexOsgi/com.raytheon.edex.common/com.raytheon.edex.common.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.feature.uframe/com.raytheon.edex.feature.uframe.ecl b/edexOsgi/com.raytheon.edex.feature.uframe/com.raytheon.edex.feature.uframe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.ingestsrv/com.raytheon.edex.ingestsrv.ecl b/edexOsgi/com.raytheon.edex.ingestsrv/com.raytheon.edex.ingestsrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.kml/com.raytheon.edex.kml.ecl b/edexOsgi/com.raytheon.edex.kml/com.raytheon.edex.kml.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.meteolib/com.raytheon.edex.meteolib.ecl b/edexOsgi/com.raytheon.edex.meteolib/com.raytheon.edex.meteolib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.monitorsrv/com.raytheon.edex.monitorsrv.ecl b/edexOsgi/com.raytheon.edex.monitorsrv/com.raytheon.edex.monitorsrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.msgutility/com.raytheon.edex.msgutility.ecl b/edexOsgi/com.raytheon.edex.msgutility/com.raytheon.edex.msgutility.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.notifysrv/com.raytheon.edex.notifysrv.ecl b/edexOsgi/com.raytheon.edex.notifysrv/com.raytheon.edex.notifysrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.airep/com.raytheon.edex.plugin.airep.ecl b/edexOsgi/com.raytheon.edex.plugin.airep/com.raytheon.edex.plugin.airep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.binlightning/com.raytheon.edex.plugin.binlightning.ecl b/edexOsgi/com.raytheon.edex.plugin.binlightning/com.raytheon.edex.plugin.binlightning.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.bufrmos/com.raytheon.edex.plugin.bufrmos.ecl b/edexOsgi/com.raytheon.edex.plugin.bufrmos/com.raytheon.edex.plugin.bufrmos.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.bufrmos/src/com/raytheon/edex/plugin/bufrmos/common/BufrMosData.java b/edexOsgi/com.raytheon.edex.plugin.bufrmos/src/com/raytheon/edex/plugin/bufrmos/common/BufrMosData.java old mode 100755 new mode 100644 diff --git a/edexOsgi/com.raytheon.edex.plugin.bufrua/com.raytheon.edex.plugin.bufrua.ecl b/edexOsgi/com.raytheon.edex.plugin.bufrua/com.raytheon.edex.plugin.bufrua.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.ccfp/com.raytheon.edex.plugin.ccfp.ecl b/edexOsgi/com.raytheon.edex.plugin.ccfp/com.raytheon.edex.plugin.ccfp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/com.raytheon.edex.plugin.gfe.ecl b/edexOsgi/com.raytheon.edex.plugin.gfe/com.raytheon.edex.plugin.gfe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java index 9799c8fb70..7ccd4f1896 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java @@ -279,7 +279,7 @@ public class GFEDao extends DefaultPluginDao { // commit persistIndividually = true; index = commitPoint; - notDone = false; + notDone = true; } tx = sess.beginTransaction(); diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/ifpnetCDF.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/ifpnetCDF.py index 48aa2055f4..b5b35a4939 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/ifpnetCDF.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/ifpnetCDF.py @@ -525,14 +525,13 @@ def storeLatLonGrids(client, file, databaseID, maskGrid, krunch, clipArea): latLonGrid = numpy.reshape(latLonGrid, (2,gridLoc.getNy().intValue(),gridLoc.getNx().intValue()), order='F') - # recast the arrays for compatibility with netCDF - lonGrid = numpy.flipud(latLonGrid[0]) - latGrid = numpy.flipud(latLonGrid[1]) - - # clip them - latGrid = clipToExtrema(latGrid, clipArea) - lonGrid = clipToExtrema(lonGrid, clipArea) + lonGrid = clipToExtrema(latLonGrid[0], clipArea) + latGrid = clipToExtrema(latLonGrid[1], clipArea) + + # recast the arrays for compatibility with netCDF + lonGrid = numpy.flipud(lonGrid) + latGrid = numpy.flipud(latGrid) # clipped size clipSize = (clipArea[1] - clipArea[0] + 1, clipArea[3] - clipArea[2] + 1) @@ -620,6 +619,7 @@ def storeTopoGrid(client, file, databaseID, maskGrid, clipArea): # Get the topo grid topoGrid = TopoDatabaseManager.getTopoDatabase(DatabaseID(databaseID).getSiteId()).getTopo().__numpy__[0] topoGrid = clipToExtrema(topoGrid, clipArea) + topoGrid = numpy.flipud(topoGrid) # clipped size clipGridSize = (clipArea[1] - clipArea[0] + 1, clipArea[3] - clipArea[2] + 1) diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py index 23c3285770..1a1ef4c91f 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscMosaic.py @@ -151,7 +151,11 @@ class WECache(object): self._inv.insert(index, tr) history = ArrayList() for h in hist: - history.add(GridDataHistory(h)) + #strip out grid history to allow for publishing correctly + #when merging Fcst/Official out of A1 + hh = GridDataHistory(h) + hh.setPublishTime(None) + history.add(hh) if gridType == 'SCALAR': self._we.setItemScalar(timeRange, grid.astype(numpy.float32), history) elif gridType == 'VECTOR': diff --git a/edexOsgi/com.raytheon.edex.plugin.goessounding/com.raytheon.edex.plugin.goessounding.ecl b/edexOsgi/com.raytheon.edex.plugin.goessounding/com.raytheon.edex.plugin.goessounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/com.raytheon.edex.plugin.grib.ecl b/edexOsgi/com.raytheon.edex.plugin.grib/com.raytheon.edex.plugin.grib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/topo/StaticTopoData.java b/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/topo/StaticTopoData.java index 1210784cf3..aca194ab73 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/topo/StaticTopoData.java +++ b/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/plugin/grib/topo/StaticTopoData.java @@ -20,11 +20,11 @@ package com.raytheon.edex.plugin.grib.topo; -import java.awt.image.Raster; import java.io.File; import java.io.FileInputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; @@ -32,19 +32,32 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import javax.media.jai.Interpolation; import javax.media.jai.JAI; import org.geotools.coverage.grid.GeneralGridEnvelope; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridCoverageFactory; import org.geotools.coverage.grid.GridGeometry2D; +import org.geotools.factory.Hints; import org.geotools.geometry.DirectPosition2D; import org.geotools.geometry.GeneralEnvelope; import org.geotools.geometry.jts.ReferencedEnvelope; +import org.geotools.referencing.CRS; +import org.geotools.referencing.ReferencingFactoryFinder; +import org.geotools.referencing.operation.AbstractCoordinateOperationFactory; +import org.geotools.referencing.operation.builder.GridToEnvelopeMapper; +import org.geotools.referencing.operation.transform.IdentityTransform; import org.opengis.geometry.DirectPosition; +import org.opengis.metadata.spatial.PixelOrientation; +import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.crs.GeographicCRS; +import org.opengis.referencing.crs.ProjectedCRS; +import org.opengis.referencing.datum.PixelInCell; +import org.opengis.referencing.operation.CoordinateOperationFactory; import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.MathTransformFactory; +import org.opengis.referencing.operation.TransformException; import com.raytheon.edex.plugin.grib.spatial.GribSpatialCache; import com.raytheon.edex.plugin.grib.util.GribParamInfoLookup; @@ -87,6 +100,7 @@ import com.vividsolutions.jts.geom.Envelope; * 09/27/2010 6394 bphillip Initial creation * 10/08/2010 6394 bphillip Rewrote sections for optimal reading and writing performance * 09/19/2011 10955 rferrel Use RunProcess + * 04/18/2012 DR 14694 D. Friedman Fixes for static topography generation * * * @@ -583,7 +597,7 @@ public class StaticTopoData { * fully populated */ float[] finalData = null; - + for (String topoData : TOPO_FILES) { for (String dataSet : TopoAttributes.attributeMap.keySet()) { if (dataSet.startsWith(topoData)) { @@ -599,11 +613,15 @@ public class StaticTopoData { break; } } - + for (int i = 0; i < finalData.length; i++) { - if (Float.isNaN(finalData[i]) || finalData[i] == DATA_FILL) { - finalData[i] = TOPO_FILL; - } + float v = finalData[i]; + if (Float.isNaN(v)) + finalData[i] = TOPO_FILL; + else if (v == DATA_FILL || (v > -0.5 && v < 0.5)) + finalData[i] = 0.0f; + else + finalData[i] = v; } return finalData; @@ -683,48 +701,62 @@ public class StaticTopoData { inGeom.getEnvelope2D(), inCrs); refEnv = refEnv.transform(topoCrs, true); - DirectPosition upperCorner = topoGeom.getCRSToGrid2D().transform( + DirectPosition upperCorner = topoGeom.getCRSToGrid2D(PixelOrientation.UPPER_LEFT).transform( refEnv.getUpperCorner(), null); - DirectPosition lowerCorner = topoGeom.getCRSToGrid2D().transform( + DirectPosition lowerCorner = topoGeom.getCRSToGrid2D(PixelOrientation.UPPER_LEFT).transform( refEnv.getLowerCorner(), null); - int minx = (int) Math.floor(Math.min((int) lowerCorner.getOrdinate(0), - (int) upperCorner.getOrdinate(0))); - int maxx = (int) Math.ceil(Math.max((int) upperCorner.getOrdinate(0), - (int) lowerCorner.getOrdinate(0))); - int miny = (int) Math.floor(Math.min((int) upperCorner.getOrdinate(1), - (int) lowerCorner.getOrdinate(1))); - int maxy = (int) Math.ceil(Math.max((int) lowerCorner.getOrdinate(1), - (int) upperCorner.getOrdinate(1))); + int minx = (int) Math.floor(Math.min(lowerCorner.getOrdinate(0), + upperCorner.getOrdinate(0))); + int maxx = (int) Math.ceil(Math.max(upperCorner.getOrdinate(0), + lowerCorner.getOrdinate(0))); + int miny = (int) Math.floor(Math.min(upperCorner.getOrdinate(1), + lowerCorner.getOrdinate(1))); + int maxy = (int) Math.ceil(Math.max(lowerCorner.getOrdinate(1), + upperCorner.getOrdinate(1))); - if (minx - DATA_MARGIN >= 0) { - minx -= DATA_MARGIN; + if ("world".equals(name)) { + if (minx - DATA_MARGIN < 0 || + minx - DATA_MARGIN >= nx || + maxx + DATA_MARGIN >= nx || + maxx + DATA_MARGIN < 0) { + /* TODO: Have to do quite a bit more for minimal world + * projection subset. Just load the whole thing for now. + */ + minx = miny = 0; + maxx = nx; + maxy = ny; + } } else { - minx = 0; - } - - if (miny - DATA_MARGIN >= 0) { - miny -= DATA_MARGIN; - } else { - miny = 0; - } - - if (maxx + DATA_MARGIN <= nx) { - maxx += DATA_MARGIN; - } else { - maxx = nx; - } - - if (maxy + DATA_MARGIN <= ny) { - maxy += DATA_MARGIN; - } else { - maxy = ny; + if (minx - DATA_MARGIN >= 0) { + minx -= DATA_MARGIN; + } else { + minx = 0; + } + + if (miny - DATA_MARGIN >= 0) { + miny -= DATA_MARGIN; + } else { + miny = 0; + } + + if (maxx + DATA_MARGIN <= nx) { + maxx += DATA_MARGIN; + } else { + maxx = nx; + } + + if (maxy + DATA_MARGIN <= ny) { + maxy += DATA_MARGIN; + } else { + maxy = ny; + } } double[] input = new double[] { minx, miny, maxx, maxy }; double[] output = new double[input.length]; - topoGeom.getGridToCRS() + topoGeom.getGridToCRS(PixelInCell.CELL_CORNER) .transform(input, 0, output, 0, input.length / 2); DirectPosition dpUpper = new DirectPosition2D(Math.max(output[0], @@ -762,20 +794,19 @@ public class StaticTopoData { GridCoverage2D topoCoverage = factory.create("coverage", slabData, correctedRefEnv); // Reproject the data into the requested CRS and geometry - GridCoverage2D result = MapUtil - .reprojectCoverage(topoCoverage, inCrs, inGeom, - Interpolation.getInstance(Interpolation.INTERP_BICUBIC)); - - // Read the data into the float array - Raster data = result.getRenderedImage().getData(); float[] f1 = null; - f1 = data.getPixels(data.getMinX(), data.getMinY(), data.getWidth(), - data.getHeight(), f1); + try { + f1 = simpleResample(topoCoverage, slabData, inGeom, name, minx, miny); + } catch (Exception e) { + statusHandler.error("rasample failed", e); + throw e; + } + if (finalData == null) { finalData = f1; } else { for (int idx = 0; idx < f1.length; idx++) { - if (Float.isNaN(finalData[idx])) { + if (Float.isNaN(finalData[idx]) || finalData[idx] <= DATA_FILL) { finalData[idx] = f1[idx]; } } @@ -784,6 +815,183 @@ public class StaticTopoData { return finalData; } + float[] simpleResample(GridCoverage2D sourceGC, float[][] sourceData, GridGeometry2D targetGG, String pfx, int minx, int miny) { + int sourceWidth = sourceGC.getGridGeometry().getGridRange2D().getSpan(0); + int sourceHeight = sourceGC.getGridGeometry().getGridRange2D().getSpan(1); + int targetWidth = targetGG.getGridRange2D().getSpan(0); + int targetHeight = targetGG.getGridRange2D().getSpan(1); + float[] output = new float[targetWidth * targetHeight]; + Arrays.fill(output, Float.NaN); + + ArrayList transforms = new ArrayList(); + ArrayList toGeoXforms = new ArrayList(); + ArrayList sourceToGeoXforms = new ArrayList(); + + MathTransform targetGtoCRS = targetGG.getGridToCRS(PixelInCell.CELL_CENTER); + MathTransform sourceCRStoG = sourceGC.getGridGeometry().getCRSToGrid2D(PixelOrientation.CENTER); + CoordinateReferenceSystem targetCRS = targetGG.getCoordinateReferenceSystem(); + CoordinateReferenceSystem sourceCRS = sourceGC.getCoordinateReferenceSystem(); + + transforms.add(targetGtoCRS); + if (! CRS.equalsIgnoreMetadata(sourceCRS, targetCRS)) { + GeographicCRS sourceGeoCRS = null; + GeographicCRS targetGeoCRS = null; + if (sourceCRS instanceof ProjectedCRS) { + sourceGeoCRS = ((ProjectedCRS) sourceCRS).getBaseCRS(); + } + if (targetCRS instanceof ProjectedCRS) { + targetGeoCRS = ((ProjectedCRS) targetCRS).getBaseCRS(); + } + try { + transforms.add(CRS.findMathTransform(targetCRS, targetGeoCRS, true)); + toGeoXforms.addAll(transforms); + if (CRS.equalsIgnoreMetadata(sourceGeoCRS, targetGeoCRS)) { + // nothing... + } else { + transforms.add(CRS.findMathTransform(targetGeoCRS, sourceGeoCRS)); + } + transforms.add(CRS.findMathTransform(sourceGeoCRS, sourceCRS, true)); + sourceToGeoXforms.add(0, CRS.findMathTransform(sourceCRS, sourceGeoCRS)); + } catch (FactoryException e) { + // TODO: log + return output; + } + } + transforms.add(sourceCRStoG); + sourceToGeoXforms.add(0, sourceGC.getGridGeometry().getGridToCRS(PixelInCell.CELL_CENTER)); + + MathTransform mt; + try { + mt = concatenateTransforms(transforms); + } catch (FactoryException e1) { + // TODO: log + return output; + } + + double[] coord = new double[2]; + + /* + * Output index. Assumes we iterate top-left to bottom-right in + * row-major order. + */ + int oi = 0; + for (int y = 0; y < targetHeight; ++y) { + for (int x = 0; x < targetWidth; ++x) { + coord[0] = x; + coord[1] = y; + try { + mt.transform(coord, 0, coord, 0, 1); + } catch (TransformException e) { + continue; + } + + // Integer cell coordinates of upper-left cell of the 2x2 cell sample area + int sulx = (int) coord[0]; + int suly = (int) coord[1]; + + double fx = coord[0] - sulx; + double fy = coord[1] - suly; + + double tv = 0; // sum of weighted valid values + double tw = 0; // sum of valid weights + float v0; + double w0; + if (sulx >= 0 && suly >= 0 && sulx < sourceWidth - 1 + && suly < sourceHeight - 1) { + if (valid(v0 = fix(sourceData[suly][sulx]))) { + w0 = (1-fx)*(1-fy); + tv += v0 * w0; + tw += w0; + } + if (valid(v0 = fix(sourceData[suly][sulx+1]))) { + w0 = (fx)*(1-fy); + tv += v0 * w0; + tw += w0; + } + if (valid(v0 = fix(sourceData[suly+1][sulx]))) { + w0 = (1-fx)*(fy); + tv += v0 * w0; + tw += w0; + } + if (valid(v0 = fix(sourceData[suly+1][sulx+1]))) { + w0 = (fx)*(fy); + tv += v0 * w0; + tw += w0; + } + } else { + if (isValidCoord(sulx, suly, sourceWidth, sourceHeight) + && valid(v0 = fix(sourceData[suly][sulx]))) { + w0 = (1-fx)*(1-fy); + tv += v0 * w0; + tw += w0; + } + if (isValidCoord(sulx + 1, suly, sourceWidth, sourceHeight) + && valid(v0 = fix(sourceData[suly][sulx+1]))) { + w0 = (fx)*(1-fy); + tv += v0 * w0; + tw += w0; + } + if (isValidCoord(sulx, suly + 1, sourceWidth, sourceHeight) + && valid(v0 = fix(sourceData[suly+1][sulx]))) { + w0 = (1-fx)*(fy); + tv += v0 * w0; + tw += w0; + } + if (isValidCoord(sulx + 1, suly + 1, sourceWidth, sourceHeight) + && valid(v0 = fix(sourceData[suly+1][sulx+1]))) { + w0 = (fx)*(fy); + tv += v0 * w0; + tw += w0; + } + } + if (tw != 0) { + output[oi++] = (float) (tv / tw); + } + + } + } + + return output; + + } + + private static final boolean isValidCoord(int ulx, int uly, int nx, int ny) { + return ulx >= 0 && uly >= 0 && ulx < nx && uly < ny; + } + + private static final boolean valid(float v) { + return ! Float.isNaN(v) && v > DATA_FILL; + } + + // A1: passes N -9999 to test_grhi_remap, setting + // all source -9999 values to 0. + private static float fix(float v) { + return v > DATA_FILL ? v : 0; + } + + private MathTransform concatenateTransforms(ArrayList transforms) throws FactoryException { + Hints hints = new Hints(); + final CoordinateOperationFactory factory = + ReferencingFactoryFinder.getCoordinateOperationFactory(hints); + final MathTransformFactory mtFactory; + if (factory instanceof AbstractCoordinateOperationFactory) { + mtFactory = ((AbstractCoordinateOperationFactory) factory).getMathTransformFactory(); + } else { + mtFactory = ReferencingFactoryFinder.getMathTransformFactory(hints); + } + + MathTransform mt = null; + for (MathTransform mti : transforms/*int i = 0; i < transforms.size(); ++i*/) { + if (mt == null) + mt = mti; + else { + mt = mtFactory.createConcatenatedTransform(mt, mti); + } + } + + return mt != null ? mt : IdentityTransform.create(2); + } + /** * Reads the raw data from the topo files * @@ -908,9 +1116,17 @@ public class StaticTopoData { Math.max(ll.getOrdinate(1), ur.getOrdinate(1))); envelope.setCoordinateReferenceSystem(crs); + + GridToEnvelopeMapper mapper = new GridToEnvelopeMapper(); + mapper.setEnvelope(envelope); + mapper.setGridRange(new GeneralGridEnvelope( + new int[] { 1, 1 }, new int[] { nx, ny }, false)); + mapper.setPixelAnchor(PixelInCell.CELL_CENTER); + mapper.setReverseAxis(new boolean[] { false, true }); + MathTransform mt = mapper.createTransform(); - return new GridGeometry2D(new GeneralGridEnvelope( - new int[] { 0, 0 }, new int[] { nx, ny }, false), envelope); + return new GridGeometry2D(PixelInCell.CELL_CORNER, mt, envelope, + null); } catch (Exception e) { throw new GribException("Error creating grid geometry", e); diff --git a/edexOsgi/com.raytheon.edex.plugin.ldad/com.raytheon.edex.plugin.ldad.ecl b/edexOsgi/com.raytheon.edex.plugin.ldad/com.raytheon.edex.plugin.ldad.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.ldadhydro/com.raytheon.edex.plugin.ldadhydro.ecl b/edexOsgi/com.raytheon.edex.plugin.ldadhydro/com.raytheon.edex.plugin.ldadhydro.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.ldadmanual/com.raytheon.edex.plugin.ldadmanual.ecl b/edexOsgi/com.raytheon.edex.plugin.ldadmanual/com.raytheon.edex.plugin.ldadmanual.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.ldadprofiler/com.raytheon.edex.plugin.ldadprofiler.ecl b/edexOsgi/com.raytheon.edex.plugin.ldadprofiler/com.raytheon.edex.plugin.ldadprofiler.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.modelsounding/com.raytheon.edex.plugin.modelsounding.ecl b/edexOsgi/com.raytheon.edex.plugin.modelsounding/com.raytheon.edex.plugin.modelsounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.obs/com.raytheon.edex.plugin.obs.ecl b/edexOsgi/com.raytheon.edex.plugin.obs/com.raytheon.edex.plugin.obs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.pirep/com.raytheon.edex.plugin.pirep.ecl b/edexOsgi/com.raytheon.edex.plugin.pirep/com.raytheon.edex.plugin.pirep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.poessounding/com.raytheon.edex.plugin.poessounding.ecl b/edexOsgi/com.raytheon.edex.plugin.poessounding/com.raytheon.edex.plugin.poessounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.profiler/com.raytheon.edex.plugin.profiler.ecl b/edexOsgi/com.raytheon.edex.plugin.profiler/com.raytheon.edex.plugin.profiler.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.radar/com.raytheon.edex.plugin.radar.ecl b/edexOsgi/com.raytheon.edex.plugin.radar/com.raytheon.edex.plugin.radar.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.recco/com.raytheon.edex.plugin.recco.ecl b/edexOsgi/com.raytheon.edex.plugin.recco/com.raytheon.edex.plugin.recco.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.redbook/com.raytheon.edex.plugin.redbook.ecl b/edexOsgi/com.raytheon.edex.plugin.redbook/com.raytheon.edex.plugin.redbook.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/com.raytheon.edex.plugin.satellite.ecl b/edexOsgi/com.raytheon.edex.plugin.satellite/com.raytheon.edex.plugin.satellite.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java index 45a754bd6b..00e8d8dbd1 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java @@ -64,6 +64,7 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader; * 11/11/2008 chammack Refactored to be thread safe in camel * 02/05/2010 4120 jkorman Modified removeWmoHeader to handle WMOHeader in * various start locations. + * 04/17/2012 14724 kshresth This is a temporary workaround - Projection off CONUS * * * @@ -351,6 +352,23 @@ public class SatelliteDecoder extends AbstractDecoder { SatMapCoverage mapCoverage = null; try { +/** + * This is a temporary workaround for DR14724, hopefully to be removed after NESDIS changes + * the product header + */ + if ((mapProjection == 3) + && (record.getPhysicalElement().equalsIgnoreCase("Imager 13 micron (IR)") ) + && (record.getSectorID().equalsIgnoreCase("West CONUS"))){ + nx = 1100; + ny = 1280; + dx = 4063.5f; + dy = 4063.5f; + la1 = 12.19f; + lo1 = -133.4588f; + } +/** + * End of DR14724 + */ mapCoverage = SatSpatialFactory.getInstance() .getMapCoverage(mapProjection, nx, ny, dx, dy, lov, latin, la1, lo1, la2, lo2); diff --git a/edexOsgi/com.raytheon.edex.plugin.sfcobs/com.raytheon.edex.plugin.sfcobs.ecl b/edexOsgi/com.raytheon.edex.plugin.sfcobs/com.raytheon.edex.plugin.sfcobs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.shef/com.raytheon.edex.plugin.shef.ecl b/edexOsgi/com.raytheon.edex.plugin.shef/com.raytheon.edex.plugin.shef.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.taf/com.raytheon.edex.plugin.taf.ecl b/edexOsgi/com.raytheon.edex.plugin.taf/com.raytheon.edex.plugin.taf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.text/com.raytheon.edex.plugin.text.ecl b/edexOsgi/com.raytheon.edex.plugin.text/com.raytheon.edex.plugin.text.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.textlightning/com.raytheon.edex.plugin.textlightning.ecl b/edexOsgi/com.raytheon.edex.plugin.textlightning/com.raytheon.edex.plugin.textlightning.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.warning/com.raytheon.edex.plugin.warning.ecl b/edexOsgi/com.raytheon.edex.plugin.warning/com.raytheon.edex.plugin.warning.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java b/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java index 8da1ac14a4..1bf8f8ebc4 100644 --- a/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java +++ b/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java @@ -83,7 +83,8 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jul 18, 2011 rjpeter Initial creation - * + * Mar 29, 2012 #14691 Qinglu Lin Added returned value of getFeArea() of + * AreaConfiguration to areaFields List. * * * @author rjpeter @@ -303,6 +304,7 @@ public class GeospatialDataGenerator { areaFields.add(areaConfig.getAreaField()); areaFields.add(areaConfig.getFipsField()); areaFields.add(areaConfig.getAreaNotationField()); + areaFields.add(areaConfig.getFeAreaField()); rval.setFipsField(areaConfig.getFipsField()); rval.setAreaFields(areaFields); rval.setTimeZoneSource(geoConfig.getTimezoneSource()); diff --git a/edexOsgi/com.raytheon.edex.product.uframe/com.raytheon.edex.product.uframe.ecl b/edexOsgi/com.raytheon.edex.product.uframe/com.raytheon.edex.product.uframe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.productsrv/com.raytheon.edex.productsrv.ecl b/edexOsgi/com.raytheon.edex.productsrv/com.raytheon.edex.productsrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.rpgenvdata/com.raytheon.edex.rpgenvdata.ecl b/edexOsgi/com.raytheon.edex.rpgenvdata/com.raytheon.edex.rpgenvdata.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.textdb/com.raytheon.edex.textdb.ecl b/edexOsgi/com.raytheon.edex.textdb/com.raytheon.edex.textdb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.uengine/com.raytheon.edex.uengine.ecl b/edexOsgi/com.raytheon.edex.uengine/com.raytheon.edex.uengine.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.edex.utilitysrv/com.raytheon.edex.utilitysrv.ecl b/edexOsgi/com.raytheon.edex.utilitysrv/com.raytheon.edex.utilitysrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.messaging.mhs/com.raytheon.messaging.mhs.ecl b/edexOsgi/com.raytheon.messaging.mhs/com.raytheon.messaging.mhs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.activetable/com.raytheon.uf.common.activetable.ecl b/edexOsgi/com.raytheon.uf.common.activetable/com.raytheon.uf.common.activetable.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.alertmonitor/com.raytheon.uf.common.alertmonitor.ecl b/edexOsgi/com.raytheon.uf.common.alertmonitor/com.raytheon.uf.common.alertmonitor.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.alertviz/com.raytheon.uf.common.alertviz.ecl b/edexOsgi/com.raytheon.uf.common.alertviz/com.raytheon.uf.common.alertviz.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.auth/com.raytheon.uf.common.auth.ecl b/edexOsgi/com.raytheon.uf.common.auth/com.raytheon.uf.common.auth.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.awipstools/com.raytheon.uf.common.awipstools.ecl b/edexOsgi/com.raytheon.uf.common.awipstools/com.raytheon.uf.common.awipstools.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.cache/com.raytheon.uf.common.cache.ecl b/edexOsgi/com.raytheon.uf.common.cache/com.raytheon.uf.common.cache.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.climo/com.raytheon.uf.common.climo.ecl b/edexOsgi/com.raytheon.uf.common.climo/com.raytheon.uf.common.climo.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.colormap/com.raytheon.uf.common.colormap.ecl b/edexOsgi/com.raytheon.uf.common.colormap/com.raytheon.uf.common.colormap.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.comm/com.raytheon.uf.common.comm.ecl b/edexOsgi/com.raytheon.uf.common.comm/com.raytheon.uf.common.comm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.acars/com.raytheon.uf.common.dataplugin.acars.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.acars/com.raytheon.uf.common.dataplugin.acars.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/com.raytheon.uf.common.dataplugin.acarssounding.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/com.raytheon.uf.common.dataplugin.acarssounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.airep/com.raytheon.uf.common.dataplugin.airep.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.airep/com.raytheon.uf.common.dataplugin.airep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/com.raytheon.uf.common.dataplugin.binlightning.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/com.raytheon.uf.common.dataplugin.binlightning.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrascat/com.raytheon.uf.common.dataplugin.bufrascat.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrascat/com.raytheon.uf.common.dataplugin.bufrascat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrhdw/com.raytheon.uf.common.dataplugin.bufrhdw.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrhdw/com.raytheon.uf.common.dataplugin.bufrhdw.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrmthdw/com.raytheon.uf.common.dataplugin.bufrmthdw.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrmthdw/com.raytheon.uf.common.dataplugin.bufrmthdw.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrncwf/com.raytheon.uf.common.dataplugin.bufrncwf.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrncwf/com.raytheon.uf.common.dataplugin.bufrncwf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrquikscat/com.raytheon.uf.common.dataplugin.bufrquikscat.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrquikscat/com.raytheon.uf.common.dataplugin.bufrquikscat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrsigwx/com.raytheon.uf.common.dataplugin.bufrsigwx.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrsigwx/com.raytheon.uf.common.dataplugin.bufrsigwx.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrssmi/com.raytheon.uf.common.dataplugin.bufrssmi.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrssmi/com.raytheon.uf.common.dataplugin.bufrssmi.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/com.raytheon.uf.common.dataplugin.bufrua.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/com.raytheon.uf.common.dataplugin.bufrua.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.cwa/com.raytheon.uf.common.dataplugin.cwa.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.cwa/com.raytheon.uf.common.dataplugin.cwa.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.cwat/com.raytheon.uf.common.dataplugin.cwat.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.cwat/com.raytheon.uf.common.dataplugin.cwat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/com.raytheon.uf.common.dataplugin.ffmp.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/com.raytheon.uf.common.dataplugin.ffmp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPRecord.java index 8f4ef6b972..5caec839f7 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPRecord.java @@ -66,7 +66,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 06/03/09 2521 D. Hladky Initial release - * + * 16/04/12 DR 14511 G. Zhang Replacing synchronized object * * * @author dhladky @@ -509,8 +509,8 @@ public class FFMPRecord extends ServerSpecificPersistablePluginDataObject SourceXML source = FFMPSourceConfigurationManager.getInstance() .getSource(sourceName); Long pfaf = basin.getPfaf(); - - synchronized (template) { + //DR 14511: FFMPResource.paintInternal() uses template, causing GUI delay + synchronized (/*template*/template.getPrimaryDomain()) { for (DomainXML domain : template.getDomains()) { diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.fog/com.raytheon.uf.common.dataplugin.fog.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.fog/com.raytheon.uf.common.dataplugin.fog.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.fssobs/com.raytheon.uf.common.dataplugin.fssobs.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.fssobs/com.raytheon.uf.common.dataplugin.fssobs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/com.raytheon.uf.common.dataplugin.gfe.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/com.raytheon.uf.common.dataplugin.gfe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/com.raytheon.uf.common.dataplugin.goessounding.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/com.raytheon.uf.common.dataplugin.goessounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.grib/com.raytheon.uf.common.dataplugin.grib.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.grib/com.raytheon.uf.common.dataplugin.grib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ldadhydro/com.raytheon.uf.common.dataplugin.ldadhydro.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.ldadhydro/com.raytheon.uf.common.dataplugin.ldadhydro.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ldadmesonet/com.raytheon.uf.common.dataplugin.ldadmesonet.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.ldadmesonet/com.raytheon.uf.common.dataplugin.ldadmesonet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.level/com.raytheon.uf.common.dataplugin.level.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.level/com.raytheon.uf.common.dataplugin.level.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.lsr/com.raytheon.uf.common.dataplugin.lsr.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.lsr/com.raytheon.uf.common.dataplugin.lsr.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.npp.viirs/com.raytheon.uf.common.dataplugin.npp.viirs.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.npp.viirs/com.raytheon.uf.common.dataplugin.npp.viirs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.obs/com.raytheon.uf.common.dataplugin.obs.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.obs/com.raytheon.uf.common.dataplugin.obs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.pirep/com.raytheon.uf.common.dataplugin.pirep.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.pirep/com.raytheon.uf.common.dataplugin.pirep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/com.raytheon.uf.common.dataplugin.poessounding.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/com.raytheon.uf.common.dataplugin.poessounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.preciprate/com.raytheon.uf.common.dataplugin.preciprate.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.preciprate/com.raytheon.uf.common.dataplugin.preciprate.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.profiler/com.raytheon.uf.common.dataplugin.profiler.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.profiler/com.raytheon.uf.common.dataplugin.profiler.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.qc/com.raytheon.uf.common.dataplugin.qc.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.qc/com.raytheon.uf.common.dataplugin.qc.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.qpf/com.raytheon.uf.common.dataplugin.qpf.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.qpf/com.raytheon.uf.common.dataplugin.qpf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/com.raytheon.uf.common.dataplugin.radar.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/com.raytheon.uf.common.dataplugin.radar.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.satellite/com.raytheon.uf.common.dataplugin.satellite.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.satellite/com.raytheon.uf.common.dataplugin.satellite.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.scan/com.raytheon.uf.common.dataplugin.scan.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.scan/com.raytheon.uf.common.dataplugin.scan.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.sfcobs/com.raytheon.uf.common.dataplugin.sfcobs.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.sfcobs/com.raytheon.uf.common.dataplugin.sfcobs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.shef/com.raytheon.uf.common.dataplugin.shef.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.shef/com.raytheon.uf.common.dataplugin.shef.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.svrwx/com.raytheon.uf.common.dataplugin.svrwx.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.svrwx/com.raytheon.uf.common.dataplugin.svrwx.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.tcg/com.raytheon.uf.common.dataplugin.tcg.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.tcg/com.raytheon.uf.common.dataplugin.tcg.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/com.raytheon.uf.common.dataplugin.tcs.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/com.raytheon.uf.common.dataplugin.tcs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.text/com.raytheon.uf.common.dataplugin.text.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.text/com.raytheon.uf.common.dataplugin.text.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/com.raytheon.uf.common.dataplugin.vaa.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/com.raytheon.uf.common.dataplugin.vaa.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.vil/com.raytheon.uf.common.dataplugin.vil.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.vil/com.raytheon.uf.common.dataplugin.vil.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/com.raytheon.uf.common.dataplugin.warning.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/com.raytheon.uf.common.dataplugin.warning.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaConfiguration.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaConfiguration.java index 903cf92c7b..014f5a3d6a 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaConfiguration.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaConfiguration.java @@ -42,6 +42,7 @@ import com.raytheon.uf.common.dataquery.requests.RequestableMetadataMarshaller; * ------------ ---------- ----------- -------------------------- * Nov 26, 2007 chammack Initial Creation. * Aug 26, 2008 #1502 bclement Added JAXB annotations + * Mar 29, 2012 #14691 Qinglu Lin Added feAreaField and its getter and setter. * * * @@ -69,6 +70,9 @@ public class AreaConfiguration { @XmlElement private String areaField; + @XmlElement + private String feAreaField; + @XmlElement private String fipsField; @@ -131,6 +135,13 @@ public class AreaConfiguration { return areaField; } + /** + * @return the feAreaField + */ + public String getFeAreaField() { + return feAreaField; + } + /** * @param areaField * the areaField to set @@ -139,6 +150,14 @@ public class AreaConfiguration { this.areaField = areaField; } + /** + * @param feAreaField + * the feAreaField to set + */ + public void setFeAreaField(String feAreaField) { + this.feAreaField = feAreaField; + } + /** * @return the areaNotationTranslationFile */ diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaSourceConfiguration.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaSourceConfiguration.java index bd4ad47a66..83d1995be4 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaSourceConfiguration.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/AreaSourceConfiguration.java @@ -12,6 +12,23 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.dataquery.requests.RequestableMetadataMarshaller; +/** + * AreaSourceConfiguration + * + *
    + * 
    + *    SOFTWARE HISTORY
    + *   
    + *    Date         Ticket#     Engineer    Description
    + *    ------------ ----------  ----------- --------------------------
    + *    Mar 29, 2012 #14691      Qinglu Lin  Added feAreaField and its getter and setter, etc. 
    + * 
    + * 
    + * + * @author + * @version 1 + */ + @XmlAccessorType(XmlAccessType.NONE) public class AreaSourceConfiguration { @XmlAccessorType(XmlAccessType.NONE) @@ -31,6 +48,9 @@ public class AreaSourceConfiguration { @XmlElement private String areaField; + @XmlElement + private String feAreaField; + @XmlElement private String fipsField; @@ -74,6 +94,7 @@ public class AreaSourceConfiguration { setVariable("areas"); setAreaField(areaConfig.getAreaField()); setAreaNotationField(areaConfig.getAreaNotationField()); + setFeAreaField(areaConfig.getFeAreaField()); setAreaNotationTranslationFile(areaConfig .getAreaNotationTranslationFile()); setFipsField(areaConfig.getFipsField()); @@ -90,6 +111,7 @@ public class AreaSourceConfiguration { public AreaConfiguration getAreaConfig() { AreaConfiguration areaConfig = new AreaConfiguration(); areaConfig.setAreaField(areaField); + areaConfig.setFeAreaField(feAreaField); areaConfig.setAreaNotationField(areaNotationField); areaConfig.setAreaNotationTranslationFile(areaNotationTranslationFile); areaConfig.setFipsField(fipsField); @@ -119,10 +141,18 @@ public class AreaSourceConfiguration { return areaField; } + public String getFeAreaField() { + return feAreaField; + } + public void setAreaField(String areaField) { this.areaField = areaField; } + public void setFeAreaField(String feAreaField) { + this.feAreaField = feAreaField; + } + public String getFipsField() { return fipsField; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java index 8aa1e6cc7a..a26724d931 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java @@ -56,6 +56,11 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jul 18, 2011 rjpeter Initial creation + * Mar 29, 2012 #14691 Qinglu Lin Added returned value of getFeAreaField() of + * AreaSourceConfiguration to areaFields List. + * Apr 11, 2012 #14691 Qinglu Lin For marine warnings, getFeAreaField() returns null. + * So, do not add the returned value of getFeAreaField() + * to areaFields. * * * @@ -242,11 +247,20 @@ public class GeospatialFactory { AreaSourceConfiguration[] ascs = template.getAreaSources(); for (AreaSourceConfiguration asc : ascs) { - List areaFields = new ArrayList(4); - areaFields.add(WarningConstants.GID); + List areaFields; + String tmp = asc.getFeAreaField(); + if (tmp == null) { + areaFields = new ArrayList(4); + } else { + areaFields = new ArrayList(5); + } + areaFields.add(WarningConstants.GID); areaFields.add(asc.getAreaField()); + if (tmp != null) { + areaFields.add(tmp); + } areaFields.add(asc.getFipsField()); - areaFields.add(asc.getAreaNotationField()); + areaFields.add(asc.getAreaNotationField()); GeospatialMetadata gmd = new GeospatialMetadata(); gmd.setAreaSource(asc.getAreaSource()); diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin/com.raytheon.uf.common.dataplugin.ecl b/edexOsgi/com.raytheon.uf.common.dataplugin/com.raytheon.uf.common.dataplugin.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dataquery/com.raytheon.uf.common.dataquery.ecl b/edexOsgi/com.raytheon.uf.common.dataquery/com.raytheon.uf.common.dataquery.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.datastorage.hdf5/com.raytheon.uf.common.datastorage.hdf5.ecl b/edexOsgi/com.raytheon.uf.common.datastorage.hdf5/com.raytheon.uf.common.datastorage.hdf5.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.datastorage.remote/com.raytheon.uf.common.datastorage.remote.ecl b/edexOsgi/com.raytheon.uf.common.datastorage.remote/com.raytheon.uf.common.datastorage.remote.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.datastorage/com.raytheon.uf.common.datastorage.ecl b/edexOsgi/com.raytheon.uf.common.datastorage/com.raytheon.uf.common.datastorage.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.derivparam/com.raytheon.uf.common.derivparam.ecl b/edexOsgi/com.raytheon.uf.common.derivparam/com.raytheon.uf.common.derivparam.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.dissemination/com.raytheon.uf.common.dissemination.ecl b/edexOsgi/com.raytheon.uf.common.dissemination/com.raytheon.uf.common.dissemination.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.geospatial/com.raytheon.uf.common.geospatial.ecl b/edexOsgi/com.raytheon.uf.common.geospatial/com.raytheon.uf.common.geospatial.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.hlstopo/com.raytheon.uf.common.hlstopo.ecl b/edexOsgi/com.raytheon.uf.common.hlstopo/com.raytheon.uf.common.hlstopo.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.hydro/com.raytheon.uf.common.hydro.ecl b/edexOsgi/com.raytheon.uf.common.hydro/com.raytheon.uf.common.hydro.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.jms/com.raytheon.uf.common.jms.ecl b/edexOsgi/com.raytheon.uf.common.jms/com.raytheon.uf.common.jms.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java index 031903f524..8f4cfd2b35 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java @@ -44,6 +44,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 15, 2011 rjpeter Initial creation + * Mar 08, 2012 194 njensen Improved safety of close() * * * @@ -182,6 +183,11 @@ public class JmsPooledConnection implements ExceptionListener { if (canClose) { synchronized (this) { + // njensen: I moved removing the connection from the pool to be + // the first thing in this block instead of last thing so + // there's no chance it could be closed and then retrieved from + // the pool by something else + connFactory.removeConnectionFromPool(this); if (conn != null) { try { conn.stop(); @@ -207,11 +213,10 @@ public class JmsPooledConnection implements ExceptionListener { conn.close(); } catch (Exception e) { statusHandler.handle(Priority.INFO, - "Failed to close connection", e); + "Failed to close connection " + conn, e); } } conn = null; - connFactory.removeConnectionFromPool(this); } } @@ -237,13 +242,17 @@ public class JmsPooledConnection implements ExceptionListener { synchronized (stateLock) { if (availableSession != null) { - if (availableSession.expired(System.currentTimeMillis(), - resourceRetention)) { - availableSession.getPooledObject().close(); - count++; - availableSession = null; - } else { - sessionToCheck = availableSession.getPooledObject(); + // njensen: I added the synchronized line below so we're + // synchronized on availableSession.stateLock + synchronized (availableSession.getPooledObject().getStateLock()) { + if (availableSession.expired(System.currentTimeMillis(), + resourceRetention)) { + availableSession.getPooledObject().close(); + count++; + availableSession = null; + } else { + sessionToCheck = availableSession.getPooledObject(); + } } } } diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java index 91941b3039..50d894d38a 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java @@ -41,6 +41,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 18, 2011 rjpeter Initial creation + * Mar 08, 2012 194 njensen Improved logging * * * @@ -160,10 +161,11 @@ public class JmsPooledConsumer { if (close) { if (consumer != null) { try { + statusHandler.info("Closing consumer " + consumer); // njensen consumer.close(); } catch (Throwable e) { statusHandler.handle(Priority.INFO, - "Failed to close producer", e); + "Failed to close consumer " + consumer, e); } consumer = null; } diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java index 3d61c8837f..892a90a511 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java @@ -44,6 +44,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 18, 2011 rjpeter Initial creation + * Mar 08, 2012 194 njensen Improved logging * * * @@ -160,6 +161,7 @@ public class JmsPooledProducer { if (close) { if (producer != null) { try { + statusHandler.info("Closing producer " + producer); // njensen producer.close(); } catch (Throwable e) { statusHandler.handle(Priority.INFO, diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java index 6a66f95125..c04465fd73 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java @@ -48,6 +48,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Apr 15, 2011 rjpeter Initial creation + * Mar 08, 2012 194 njensen Improved logging * * * @@ -471,7 +472,7 @@ public class JmsPooledSession { sess.close(); } catch (Exception e) { statusHandler.handle(Priority.INFO, - "Failed to close session", e); + "Failed to close session " + sess, e); } } } diff --git a/edexOsgi/com.raytheon.uf.common.localization/com.raytheon.uf.common.localization.ecl b/edexOsgi/com.raytheon.uf.common.localization/com.raytheon.uf.common.localization.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.management/com.raytheon.uf.common.management.ecl b/edexOsgi/com.raytheon.uf.common.management/com.raytheon.uf.common.management.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.menus/com.raytheon.uf.common.menus.ecl b/edexOsgi/com.raytheon.uf.common.menus/com.raytheon.uf.common.menus.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.message/com.raytheon.uf.common.message.ecl b/edexOsgi/com.raytheon.uf.common.message/com.raytheon.uf.common.message.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.monitor.cpg/com.raytheon.uf.common.monitor.cpg.ecl b/edexOsgi/com.raytheon.uf.common.monitor.cpg/com.raytheon.uf.common.monitor.cpg.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.monitor/com.raytheon.uf.common.monitor.ecl b/edexOsgi/com.raytheon.uf.common.monitor/com.raytheon.uf.common.monitor.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/xml/SourceXML.java b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/xml/SourceXML.java index a753bf4070..c4112d1a81 100644 --- a/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/xml/SourceXML.java +++ b/edexOsgi/com.raytheon.uf.common.monitor/src/com/raytheon/uf/common/monitor/xml/SourceXML.java @@ -27,8 +27,8 @@ package com.raytheon.uf.common.monitor.xml; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 29 Jan, 2010 3915 dhladky Initial creation + * 18 Apr. 2012 DR 14619 dhladky Replace isOverride() * - * * @author dhladky * @version 1.0 */ @@ -415,7 +415,7 @@ public class SourceXML implements ISerializableObject { * @param key * @param param * @return - */ + *//* 2012-04-18: Old version: keep for reference: Gang Zhang private boolean isOverride(String key, String param) { if (sourceOverrideDataMap != null) { if (sourceOverrideDataMap.containsKey(key)) { @@ -427,5 +427,26 @@ public class SourceXML implements ISerializableObject { return false; } +*/ + /**2012-04-18: code is from David Hladky in Omaha + * for DR 14619/14620. Gang Zhang is checked in + * Check to see if we are overridden + * + * @param key + * @param param + * @return + */ + private boolean isOverride(String key, String param) { + if (sourceOverrideDataMap != null) { + if (sourceOverrideDataMap.containsKey(key)) { + for (SourceOverrideParamXML paramx: sourceOverrideDataMap.get(key)) { + if (paramx.getParam().equals(param)) { + return true; + } + } + } + } + return false; + } } diff --git a/edexOsgi/com.raytheon.uf.common.mpe/com.raytheon.uf.common.mpe.ecl b/edexOsgi/com.raytheon.uf.common.mpe/com.raytheon.uf.common.mpe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.ohd/com.raytheon.uf.common.ohd.ecl b/edexOsgi/com.raytheon.uf.common.ohd/com.raytheon.uf.common.ohd.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.plugin.nwsauth/com.raytheon.uf.common.plugin.nwsauth.ecl b/edexOsgi/com.raytheon.uf.common.plugin.nwsauth/com.raytheon.uf.common.plugin.nwsauth.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.pointdata/com.raytheon.uf.common.pointdata.ecl b/edexOsgi/com.raytheon.uf.common.pointdata/com.raytheon.uf.common.pointdata.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.pypies/com.raytheon.uf.common.pypies.ecl b/edexOsgi/com.raytheon.uf.common.pypies/com.raytheon.uf.common.pypies.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.python/com.raytheon.uf.common.python.ecl b/edexOsgi/com.raytheon.uf.common.python/com.raytheon.uf.common.python.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.qpf/com.raytheon.uf.common.qpf.ecl b/edexOsgi/com.raytheon.uf.common.qpf/com.raytheon.uf.common.qpf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.serialization.comm/com.raytheon.uf.common.serialization.comm.ecl b/edexOsgi/com.raytheon.uf.common.serialization.comm/com.raytheon.uf.common.serialization.comm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.serialization/com.raytheon.uf.common.serialization.ecl b/edexOsgi/com.raytheon.uf.common.serialization/com.raytheon.uf.common.serialization.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.site/com.raytheon.uf.common.site.ecl b/edexOsgi/com.raytheon.uf.common.site/com.raytheon.uf.common.site.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.site/src/com/raytheon/uf/common/site/SiteMap.java b/edexOsgi/com.raytheon.uf.common.site/src/com/raytheon/uf/common/site/SiteMap.java index 437e66a8a9..27a94e85c9 100644 --- a/edexOsgi/com.raytheon.uf.common.site/src/com/raytheon/uf/common/site/SiteMap.java +++ b/edexOsgi/com.raytheon.uf.common.site/src/com/raytheon/uf/common/site/SiteMap.java @@ -50,6 +50,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jul 16, 2010 bfarmer Initial creation + * Apr 09, 2012 DR14765 mhuang Map out correct CCCC site ID for backup + * sites. * * * @@ -142,7 +144,7 @@ public class SiteMap { LocalizationLevel.SITE); file = pathMgr.getFile(lc, AFOS_LOOKUP_FILENAME); loadAfosLookupFile(file, siteToSiteMap); - + // load national category lc = pathMgr.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.BASE); @@ -325,6 +327,19 @@ public class SiteMap { // if site not found default to K if (site == null) { site = "K" + site3LetterId; + } else { + // DR_14765, in case the site hashed out from combined mapping + // table from both national_category_table and afo_lookup_table + // does not start with K but not from site3LetterTo4LetterOerride.dat + // which are starting with P or T + char[] siteChar = site.toCharArray(); + if (siteChar[0] != 'K') { + if (!((siteChar[0] == 'P' && (siteChar[1] == 'A' || siteChar[1] == 'G' + || siteChar[1] == 'H')) || + (siteChar[0] == 'T' && siteChar[1] == 'S'))) { + site = "K" + site3LetterId; + } + } } return site; diff --git a/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/site3LetterTo4LetterOverride.dat b/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/site3LetterTo4LetterOverride.dat index d1b7204387..8b2f954ef6 100644 --- a/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/site3LetterTo4LetterOverride.dat +++ b/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/site3LetterTo4LetterOverride.dat @@ -6,8 +6,6 @@ ACR PACR AFC PAFC AFG PAFG AJK PAJK -CTP KCTP GUM PGUM HFO PHFO -PHI KPHI SJU TSJU diff --git a/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/textdb/national_category_table.template b/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/textdb/national_category_table.template index f5d09eedc6..2763da447b 100644 --- a/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/textdb/national_category_table.template +++ b/edexOsgi/com.raytheon.uf.common.site/utility/common_static/base/textdb/national_category_table.template @@ -1424,7 +1424,6 @@ KCSQ DSM KCSV MEM KCTB GTF KCTJ ATL -KCTP PHL KCTY MIA KCTZ RDU KCUB CAE diff --git a/edexOsgi/com.raytheon.uf.common.sounding/com.raytheon.uf.common.sounding.ecl b/edexOsgi/com.raytheon.uf.common.sounding/com.raytheon.uf.common.sounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.status/com.raytheon.uf.common.status.ecl b/edexOsgi/com.raytheon.uf.common.status/com.raytheon.uf.common.status.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.time/com.raytheon.uf.common.time.ecl b/edexOsgi/com.raytheon.uf.common.time/com.raytheon.uf.common.time.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.topo/com.raytheon.uf.common.topo.ecl b/edexOsgi/com.raytheon.uf.common.topo/com.raytheon.uf.common.topo.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.common.util/com.raytheon.uf.common.util.ecl b/edexOsgi/com.raytheon.uf.common.util/com.raytheon.uf.common.util.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/com.raytheon.uf.edex.activetable.ecl b/edexOsgi/com.raytheon.uf.edex.activetable/com.raytheon.uf.edex.activetable.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.alertviz/com.raytheon.uf.edex.alertviz.ecl b/edexOsgi/com.raytheon.uf.edex.alertviz/com.raytheon.uf.edex.alertviz.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.auth/com.raytheon.uf.edex.auth.ecl b/edexOsgi/com.raytheon.uf.edex.auth/com.raytheon.uf.edex.auth.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.awipstools/com.raytheon.uf.edex.awipstools.ecl b/edexOsgi/com.raytheon.uf.edex.awipstools/com.raytheon.uf.edex.awipstools.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.bufrtools/com.raytheon.uf.edex.bufrtools.ecl b/edexOsgi/com.raytheon.uf.edex.bufrtools/com.raytheon.uf.edex.bufrtools.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.core/com.raytheon.uf.edex.core.ecl b/edexOsgi/com.raytheon.uf.edex.core/com.raytheon.uf.edex.core.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.cpgsrv/com.raytheon.uf.edex.cpgsrv.ecl b/edexOsgi/com.raytheon.uf.edex.cpgsrv/com.raytheon.uf.edex.cpgsrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.dat.utils/com.raytheon.uf.edex.dat.utils.ecl b/edexOsgi/com.raytheon.uf.edex.dat.utils/com.raytheon.uf.edex.dat.utils.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.database/com.raytheon.uf.edex.database.ecl b/edexOsgi/com.raytheon.uf.edex.database/com.raytheon.uf.edex.database.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.decodertools/com.raytheon.uf.edex.decodertools.ecl b/edexOsgi/com.raytheon.uf.edex.decodertools/com.raytheon.uf.edex.decodertools.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.dissemination/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.dissemination/META-INF/MANIFEST.MF index a8bb99278e..3271cd17ff 100644 --- a/edexOsgi/com.raytheon.uf.edex.dissemination/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.dissemination/META-INF/MANIFEST.MF @@ -17,7 +17,8 @@ Import-Package: com.raytheon.edex.exception, com.raytheon.uf.common.status, com.raytheon.uf.edex.core, com.raytheon.uf.edex.database, - com.raytheon.uf.edex.database.purge + com.raytheon.uf.edex.database.purge, + org.apache.camel Require-Bundle: org.jep;bundle-version="1.0.0", com.raytheon.edex.plugin.text, com.raytheon.uf.common.site;bundle-version="1.12.1174", diff --git a/edexOsgi/com.raytheon.uf.edex.dissemination/com.raytheon.uf.edex.dissemination.ecl b/edexOsgi/com.raytheon.uf.edex.dissemination/com.raytheon.uf.edex.dissemination.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.dissemination/res/spring/dissemination-request.xml b/edexOsgi/com.raytheon.uf.edex.dissemination/res/spring/dissemination-request.xml index 61e995f388..7dad8559e6 100644 --- a/edexOsgi/com.raytheon.uf.edex.dissemination/res/spring/dissemination-request.xml +++ b/edexOsgi/com.raytheon.uf.edex.dissemination/res/spring/dissemination-request.xml @@ -4,13 +4,29 @@ http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - - + + + + + + + + + + + java.lang.Throwable + + + + + + - + + dhr @@ -34,6 +32,26 @@ + + + + java.lang.Throwable + + + + + + + + + + + + + @@ -44,8 +62,8 @@ - + + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrMessage.java b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrMessage.java new file mode 100644 index 0000000000..349417268c --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrMessage.java @@ -0,0 +1,102 @@ +/** + * 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.edex.ohd.pproc; + +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +/** + * A class that describes a DHR radar record that needs to be ingested. + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * Mar 09, 2012            dgilling    Initial creation
    + * 
    + * 
    + * + * @author dgilling + * @version 1.0 + */ + +@DynamicSerialize +public class HPEDhrMessage { + + @DynamicSerializeElement + private byte[] data; + + @DynamicSerializeElement + private String radarId; + + @DynamicSerializeElement + private String dtype; + + @DynamicSerializeElement + private String dt; + + public byte[] getData() { + return data; + } + + /** + * For use by Thrift serialization/deserialization only. Do not use. + */ + public HPEDhrMessage() { + + } + + public HPEDhrMessage(byte[] data, String radid, String dtype, String dt) { + this.data = data; + this.radarId = radid; + this.dtype = dtype; + this.dt = dt; + } + + public void setData(byte[] data) { + this.data = data; + } + + public String getRadarId() { + return radarId; + } + + public void setRadarId(String radarId) { + this.radarId = radarId; + } + + public String getDtype() { + return dtype; + } + + public void setDtype(String dtype) { + this.dtype = dtype; + } + + public String getDt() { + return dt; + } + + public void setDt(String dt) { + this.dt = dt; + } +} diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java index 551488a32b..535c0f2637 100644 --- a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java +++ b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java @@ -30,11 +30,14 @@ import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import com.raytheon.uf.common.ohd.AppsDefaults; +import com.raytheon.uf.common.serialization.SerializationException; +import com.raytheon.uf.common.serialization.SerializationUtil; +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.util.FileUtil; +import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.core.EdexException; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; @@ -48,6 +51,8 @@ import com.raytheon.uf.edex.ohd.MainMethod; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 20, 2010 4200 snaples Initial creation + * Mar 09, 2012 417 dgilling Refactor to use two-stage queue + * process. * * * @author snaples @@ -55,62 +60,225 @@ import com.raytheon.uf.edex.ohd.MainMethod; */ public class HPEDhrSrv { - private Log logger = LogFactory.getLog(getClass()); - - private AppsDefaults appsDefaults = AppsDefaults.getInstance(); - - private CoreDao dao; - - private File outFile; + private static final transient IUFStatusHandler logger = UFStatus + .getHandler(HPEDhrSrv.class); private static final Pattern WMO_PATTERN = Pattern .compile("([A-Z]{4}[0-9]{2} [A-Z]{4} [0-9]{6})\\x0D\\x0D\\x0A(\\w{6})\\x0D\\x0D\\x0A"); - /** WMO header regex */ - // private static final Pattern wmoPat = Pattern - // .compile("(\\p{Alpha}{4}\\d{2}) (\\p{Alnum}{4}) (\\d{6})"); - - private static final Pattern ldmPat = Pattern + private static final Pattern LDM_PATTERN = Pattern .compile("(\\p{Alpha}{3})(\\p{Alpha}{3})"); - private static final Pattern radPat = Pattern + private static final Pattern RAD_PATTERN = Pattern .compile("(\\p{Alpha}{4}).(\\d{2,3}).(\\d{8}_\\d{4})"); - private final String DHR = "DHR"; + private static final String DHRTYPE = "32"; - private final String dhrtype = "32"; + private static final String DSPTYPE1 = "138"; - private final String dsptype1 = "138"; + private static final String DSPTYPE2 = "80"; - private final String dsptype2 = "80"; + private static final String DHR = "DHR"; - private final String DSP = "DSP"; + private static final String DSP = "DSP"; - private final String STP = "STP"; + private static final String STP = "STP"; - public Object process(File hpeFile) throws EdexException { - // logger.info("Starting HPE Check message."); - checkMessage(hpeFile); + private static final int RADID_IDX = 0; - return null; + private static final int DTYPE_IDX = 1; + + private static final int DT_IDX = 2; + + private static final String JMS_QUEUE_URI = "jms-generic:queue:dhrProcess"; + + private AppsDefaults appsDefaults = AppsDefaults.getInstance(); + + /** + * Route endpoint for "dhrIngestRoute". Takes a message, writes the file to + * disk, and then runs the DHR data processing scripts so the file is + * ingested. + * + * @param message + * A HPEDhrMessage describing the DHR radar file to + * be ingested. + */ + public void process(HPEDhrMessage message) { + // logger.info("Starting HPE process message."); + try { + writeFile(message); + } catch (FileNotFoundException e) { + logger.handle(Priority.PROBLEM, "HPE cannot create output file.", e); + return; + } catch (IOException e) { + logger.handle(Priority.PROBLEM, + "HPE Error writing updated contents of HPE file", e); + return; + } + runGatherScripts(); } /** + * DPA radar files have been known to contain extra bytes at the beginning + * of the file. These bytes will cause the DHR decoder to fail. + *

    + * This method removes the leading bytes to ensure proper decoding of DHR + * files. * - * @param dhrFile - * The radar server message - * @throws EdexException - * If IOExceptions occur + * @param message + * A HPEDhrMessage describing the DHR radar file to + * be ingested. + * @throws FileNotFoundException + * If the output file cannot be created or opened for any + * reason. + * @throws IOException + * If an I/O error occurs while writing the file. */ - private void checkMessage(File hpeFile) throws EdexException { + private void writeFile(HPEDhrMessage message) throws FileNotFoundException, + IOException { + String dtype = message.getDtype(); + String outname = dtype + message.getRadarId() + "." + message.getDt(); + String outPath; + if (dtype.equals(DHR)) { + outPath = appsDefaults.getToken("dhr_prod_dir"); + } else { + outPath = appsDefaults.getToken("dsp_prod_dir"); + } + File oP = new File(outPath); + if (!oP.exists()) { + oP.mkdirs(); + } - boolean proc = false; - // logger.info("Starting HPE CheckFile. "); - proc = checkFile(hpeFile); - if (proc == false) { + byte[] fileContents = message.getData(); + int offset = findStartRadarData(new String(fileContents, 0, 80)); + String outFile = FileUtil.join(outPath, outname); + BufferedOutputStream outStream = null; + + try { + outStream = new BufferedOutputStream(new FileOutputStream(outFile)); + // logger.info("HPE Writing contents of file to " + + // outFile); + outStream.write(fileContents, offset, fileContents.length - offset); + } finally { + if (outStream != null) { + outStream.close(); + } + } + } + + /** + * Route endpoint for "dhrIngestFilter". Reads the given file to memory and + * determines whether or not this file is a DHR radar file. If it is, a + * message is sent to a JMS queue so it is later ingested. + * + * @param hpeFile + * The radar file to check. + */ + public void filter(File hpeFile) { + // logger.info("Starting HPE Check message."); + byte[] fileContents = new byte[0]; + try { + fileContents = readHpeFile(hpeFile); + } catch (FileNotFoundException e) { + logger.handle(Priority.PROBLEM, + "HPE Cannot find file: " + hpeFile.toString(), e); + } catch (IOException e) { + logger.handle(Priority.PROBLEM, "HPE Error reading file: " + + hpeFile.toString(), e); + } + + if (fileContents.length < 80) { return; } + + // check header + String fileStartStr = new String(fileContents, 0, 80); + // array will hold radar id, dtype, and dt information. using array so + // its contents can be modified by the checkFile() method. + String[] fileMetadata = new String[3]; + boolean validFile = checkFile(hpeFile.getName(), fileStartStr, + fileMetadata); + + // write file to queue + if (validFile) { + try { + sendFileToQueue(fileContents, fileMetadata[RADID_IDX], + fileMetadata[DTYPE_IDX], fileMetadata[DT_IDX]); + } catch (SerializationException e) { + logger.handle(Priority.PROBLEM, + "HPE can't serialize HPEDhrMessage for file: " + + hpeFile.toString(), e); + } catch (EdexException e) { + logger.handle(Priority.PROBLEM, + "HPE can't send message to QPID queue for file: " + + hpeFile.toString(), e); + } + } + // logger.info("Finished HPE CheckFile. "); + } + + /** + * Reads the given radar file to memory for later processing by the + * filter function. + * + * @param hpeFile + * The file to read. + * @return The contents of the file. + * @throws FileNotFoundException + * If the specified file does not exist or cannot be opened. + * @throws IOException + * If an I/O error occurs while reading the file. + */ + private byte[] readHpeFile(File hpeFile) throws FileNotFoundException, + IOException { + BufferedInputStream inStream = null; + byte[] fileContents = null; + + try { + inStream = new BufferedInputStream(new FileInputStream(hpeFile)); + fileContents = new byte[(int) hpeFile.length()]; + inStream.read(fileContents); + } finally { + if (inStream != null) { + inStream.close(); + } + } + + return fileContents; + } + + /** + * Takes the given parameters and constructs a HPEDhrMessage to + * be placed onto the queue used by HPEDhrSrv for actual data + * processing. + * + * @param data + * The contents of the radar file. + * @param radid + * The radar id for the given file. + * @param dtype + * The file's dtype. + * @param dt + * The file's dt. + * @throws SerializationException + * If the constructed HPEDhrMessage cannot be + * serialized by Thrift. + * @throws EdexException + * If the message cannot be placed onto the QPID queue for DHR + * data processing. + */ + private void sendFileToQueue(byte[] data, String radid, String dtype, + String dt) throws SerializationException, EdexException { + HPEDhrMessage message = new HPEDhrMessage(data, radid, dtype, dt); + byte[] messageData = SerializationUtil.transformToThrift(message); + EDEXUtil.getMessageProducer().sendAsyncUri(JMS_QUEUE_URI, messageData); + } + + /** + * Runs the DSPgather and DHRgather data processing scripts. + */ + private void runGatherScripts() { // logger.info("Starting HPE DSP gather."); int exitValue = MainMethod.runProgram("ksh", appsDefaults.getToken("pproc_bin") + "/DSPgather"); @@ -135,86 +303,55 @@ public class HPEDhrSrv { } /** - * DPA radar files have been known to contain extra bytes at the beginning - * of the file. These bytes will cause the DHR decoder to fail. - *

    - * This method removes the leading bytes to ensure proper decoding of DHR - * files + * Given a radar file name and file header, this function determines whether + * or not this file is a DHR radar file. * * @param fileName - * The name of the DHR radar file - * @throws EdexException - * If IOExceptions occur + * The name of the radar file + * @param fileHeader + * The first 80 bytes from the radar file. + * @param metadata + * A length 3 String array that will be used to pass + * the radar id, dtype, and dt back to the caller. + * @return If the specified file is a DHR radar file. */ - private boolean checkFile(File hpeFile) throws EdexException { - /* - * Read the contents of the file into memory. - */ - BufferedInputStream inStream = null; - try { - inStream = new BufferedInputStream(new FileInputStream(hpeFile)); - } catch (FileNotFoundException e) { - throw new EdexException("HPE Cannot find file: " + hpeFile, e); - } - byte[] fileContents = new byte[(int) hpeFile.length()]; - try { - inStream.read(fileContents); - } catch (IOException e) { - throw new EdexException("HPE Error reading file: " + hpeFile, e); - } finally { - try { - inStream.close(); - } catch (IOException e1) { - throw new EdexException("HPE Error closing stream to file: " - + hpeFile, e1); - } - } - String outPath = ""; - String fname = hpeFile.getName(); - String radid = ""; - String dtype = ""; - String dt = ""; - String outname = ""; - - Matcher r = radPat.matcher(fname); - /* - * Copy off the first few bytes to see if leading bytes are present - * before the WMO header - */ - if (fileContents.length < 80) { - return false; - } - String fileStartStr = new String(fileContents, 0, 80); - + private boolean checkFile(String fileName, String fileHeader, + String[] metadata) { /* * Find the WMO header */ - Matcher wmomat = WMO_PATTERN.matcher(fileStartStr); - Matcher dhrmat = ldmPat.matcher(fileStartStr); + Matcher r = RAD_PATTERN.matcher(fileName); + Matcher wmomat = WMO_PATTERN.matcher(fileHeader); if (r.find()) { // logger.info("HPE DHRSrv found Radar file."); - radid = r.group(1).substring(1).toUpperCase().trim(); + // getting the radid + metadata[RADID_IDX] = r.group(1).substring(1).toUpperCase().trim(); String ftype = r.group(2); - dt = r.group(3); - if (ftype.equals(dhrtype)) { - dtype = DHR; + // getting the dt + metadata[DT_IDX] = r.group(3); + // getting the dtype + if (ftype.equals(DHRTYPE)) { + metadata[DTYPE_IDX] = DHR; // logger.info("HPE DHRSrv found Radar file type DHR."); - } else if (ftype.equals(dsptype1) || ftype.equals(dsptype2)) { - dtype = DSP; + } else if (ftype.equals(DSPTYPE1) || ftype.equals(DSPTYPE2)) { + metadata[DTYPE_IDX] = DSP; // logger.info("HPE DHRSrv found Radar file type DSP."); } else { // logger.info("HPE DHRSrv found Radar type unknown."); return false; } } else if (wmomat.find()) { + Matcher dhrmat = LDM_PATTERN.matcher(fileHeader); if (dhrmat.find()) { - // logger.info("HPE DHRSrv found LDM file."); - dt = wmomat.group(1).substring(wmomat.group(1).length() - 6); - radid = dhrmat.group(2).toUpperCase().trim(); - dtype = dhrmat.group(1).toUpperCase().trim(); - if (!dtype.equals(DSP) || !dtype.equals(STP) - || !dtype.equals(DHR)) { + // logger.info("HPEDHRSrv found LDM file."); + metadata[DT_IDX] = wmomat.group(1).substring( + wmomat.group(1).length() - 6); + metadata[RADID_IDX] = dhrmat.group(2).toUpperCase().trim(); + metadata[DTYPE_IDX] = dhrmat.group(1).toUpperCase().trim(); + if ((!metadata[DTYPE_IDX].equals(DSP)) + && (!metadata[DTYPE_IDX].equals(STP)) + && (!metadata[DTYPE_IDX].equals(DHR))) { return false; } } else { @@ -223,80 +360,42 @@ public class HPEDhrSrv { } else { return false; } + // logger.info("HPE DHRSrv querying db for radid=" + radid // + " and use_radar=T."); String query = String.format( "select * from radarloc where radid='%s' and use_radar='T' ", - radid); - dao = new CoreDao(DaoConfig.forDatabase("ihfs")); + metadata[RADID_IDX]); + CoreDao dao = new CoreDao(DaoConfig.forDatabase("ihfs")); Object[] rs = dao.executeSQLQuery(query); - // logger.info("HPE DHRSrv querying db done."); - if (rs.length > 0) { - outname = dtype + radid + "." + dt; - if (dtype.equals(DHR)) { - outPath = appsDefaults.getToken("dhr_prod_dir"); - } else { - outPath = appsDefaults.getToken("dsp_prod_dir"); - } - File oP = new File(outPath); - if (!oP.exists()) { - oP.mkdir(); - } - - int offset = 0; - offset = findStartRadarData(fileStartStr); - outFile = new File(FileUtil.join(outPath, outname)); - BufferedOutputStream outStream = null; - - try { - outStream = new BufferedOutputStream(new FileOutputStream( - outFile)); - } catch (FileNotFoundException e) { - throw new EdexException("HPE Cannot find file: " + outFile, e); - } - - try { - outStream.write(fileContents, offset, fileContents.length - - offset); - // logger.info("HPE Re-writing contents of file: " + hpeFile - // + " to " + outFile); - } catch (IOException e) { - throw new EdexException( - "HPE Error writing updated contents of HPE file: " - + outFile, e); - } finally { - try { - outStream.close(); - } catch (IOException e1) { - throw new EdexException("HPE Unable to close file: " - + outFile, e1); - } - } - return true; - } else { - return false; - } + return (rs.length > 0); } + /** + * Given the header data from a radar file, this function determines the + * ending offset of the WMO header. + * + * @param headerInfo + * The header data from a radar file. + * @return Returns the offset after the last character in the WMO header. + */ private int findStartRadarData(String headerInfo) { - int startOfRadarData = 0; Matcher matcher = WMO_PATTERN.matcher(headerInfo); - boolean foundHeader = matcher.find(); - if (foundHeader) { - startOfRadarData = matcher.end(); + if (matcher.find()) { + return matcher.end(); } - return startOfRadarData; + return 0; } public static final void main(String[] args) { String input = "SDUS53_ABR_DSP_201538_185076111.rad"; String input2 = "koax.32.20111020_1553"; - Matcher m = ldmPat.matcher(input); - Matcher p = radPat.matcher(input2); + Matcher m = LDM_PATTERN.matcher(input); + Matcher p = RAD_PATTERN.matcher(input2); if (m.find()) { System.out.println(m.group(0)); diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.acars/com.raytheon.uf.edex.plugin.acars.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.acars/com.raytheon.uf.edex.plugin.acars.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.acarssounding/com.raytheon.uf.edex.plugin.acarssounding.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.acarssounding/com.raytheon.uf.edex.plugin.acarssounding.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrascat/com.raytheon.uf.edex.plugin.bufrascat.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.bufrascat/com.raytheon.uf.edex.plugin.bufrascat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrhdw/com.raytheon.uf.edex.plugin.bufrhdw.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.bufrhdw/com.raytheon.uf.edex.plugin.bufrhdw.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrmthdw/com.raytheon.uf.edex.plugin.bufrmthdw.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.bufrmthdw/com.raytheon.uf.edex.plugin.bufrmthdw.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrncwf/com.raytheon.uf.edex.plugin.bufrncwf.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.bufrncwf/com.raytheon.uf.edex.plugin.bufrncwf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrquikscat/com.raytheon.uf.edex.plugin.bufrquikscat.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.bufrquikscat/com.raytheon.uf.edex.plugin.bufrquikscat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrsigwx/com.raytheon.uf.edex.plugin.bufrsigwx.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.bufrsigwx/com.raytheon.uf.edex.plugin.bufrsigwx.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrssmi/com.raytheon.uf.edex.plugin.bufrssmi.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.bufrssmi/com.raytheon.uf.edex.plugin.bufrssmi.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.cwa/com.raytheon.uf.edex.plugin.cwa.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.cwa/com.raytheon.uf.edex.plugin.cwa.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.cwat/com.raytheon.uf.edex.plugin.cwat.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.cwat/com.raytheon.uf.edex.plugin.cwat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.ffmp/com.raytheon.uf.edex.plugin.ffmp.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.ffmp/com.raytheon.uf.edex.plugin.ffmp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.ffmp/src/com/raytheon/uf/edex/plugin/ffmp/FFMPURIFilter.java b/edexOsgi/com.raytheon.uf.edex.plugin.ffmp/src/com/raytheon/uf/edex/plugin/ffmp/FFMPURIFilter.java index 89ab65930f..48700ae689 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.ffmp/src/com/raytheon/uf/edex/plugin/ffmp/FFMPURIFilter.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.ffmp/src/com/raytheon/uf/edex/plugin/ffmp/FFMPURIFilter.java @@ -48,7 +48,7 @@ import com.raytheon.uf.edex.core.props.PropertiesFactory; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 06/21/2009 2521 dhladky Initial Creation. - * + * 18/04/2012 DR14619/20 dhladky Replace setMatchURIs() * * * @author dhladky @@ -244,7 +244,7 @@ public class FFMPURIFilter extends URIFilter { } return newKey.toString(); } - +/*2012-04-18: Old code keep for refefence. Gang Zhang @Override public void setMatchURIs() { FFMPSourceConfigurationManager sourceConfig = FFMPSourceConfigurationManager @@ -311,7 +311,7 @@ public class FFMPURIFilter extends URIFilter { } } } - +*/ /** * Grab the most recent XMRG file time by HPE file type * @@ -555,4 +555,78 @@ public class FFMPURIFilter extends URIFilter { return new FFMPURIGenerateMessage(this); } + /** + * 2012-04-18: Code from David Hladky in Omaha. + */ + @Override + public void setMatchURIs() { + FFMPSourceConfigurationManager sourceConfig = FFMPSourceConfigurationManager + .getInstance(); + FFMPRunConfigurationManager runConfig = FFMPRunConfigurationManager + .getInstance(); + FFMPRunXML runner = runConfig.getRunner(PropertiesFactory.getInstance() + .getEnvProperties().getEnvValue("SITENAME")); + + for (SourceXML source : sourceConfig.getSources()) { + + SourceIngestConfigXML sicx = runner.getSourceIngest(source + .getSourceName()); + // just use an average time, not the expiration + long duration = 60 * 1000l * 10; + // setup URI filtering for PDO/RADAR types, multiple RADAR sites + // possible, don't process gages + + if (!source.getSourceType().equals( + FFMPSourceConfigurationManager.SOURCE_TYPE.GAGE + .getSourceType())) { + + if (sicx != null && sicx.getDataKey().size() > 0) { + + for (String dataKey : sicx.getDataKey()) { + + String matcher = null; + // RFC FFG, special matching criteria and override potentials + if (source.isRfc()) { + String pathReplace = source.getDataPath(dataKey); + if (pathReplace.equals(source.getDataPath())) { + matcher = replaceWildCard( + "FFG-" + dataKey.substring(1), + source.getDataPath(), + sicx.getUriSubLocation()); + } else { + matcher = pathReplace; + } + } + // All others use this pattern + else { + matcher = replaceWildCard(dataKey, + source.getDataPath(dataKey), + sicx.getUriSubLocation()); + } + // take care of time match + matcher = replaceWildCard(URIFilter.wildCard, matcher, + 2); + Pattern pattern = Pattern.compile(matcher); + patternKeys.put(source.getSourceName() + ":" + dataKey, + pattern); + getMatchURIs().put(pattern, duration); + } + } else { + // XMRG dosen't use the URI Filtering + if (source.getDataType().equals( + FFMPSourceConfigurationManager.DATA_TYPE.XMRG + .getDataType())) { + sourceFileTimes.put(source, + getMostRecentXMRGTime(source)); + } else { + // only the time has a match replace + String matcher = replaceWildCard(URIFilter.wildCard, + source.getDataPath(), 2); + Pattern pattern = Pattern.compile(matcher); + getMatchURIs().put(pattern, duration); + } + } + } + } + } } diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.fog/com.raytheon.uf.edex.plugin.fog.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.fog/com.raytheon.uf.edex.plugin.fog.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.fssobs/com.raytheon.uf.edex.plugin.fssobs.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.fssobs/com.raytheon.uf.edex.plugin.fssobs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.ldadmesonet/com.raytheon.uf.edex.plugin.ldadmesonet.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.ldadmesonet/com.raytheon.uf.edex.plugin.ldadmesonet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.level.handler/com.raytheon.uf.edex.plugin.level.handler.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.level.handler/com.raytheon.uf.edex.plugin.level.handler.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.level/com.raytheon.uf.edex.plugin.level.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.level/com.raytheon.uf.edex.plugin.level.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.loctables/com.raytheon.uf.edex.plugin.loctables.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.loctables/com.raytheon.uf.edex.plugin.loctables.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.lsr/com.raytheon.uf.edex.plugin.lsr.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.lsr/com.raytheon.uf.edex.plugin.lsr.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.manualIngest/com.raytheon.uf.edex.plugin.manualIngest.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.manualIngest/com.raytheon.uf.edex.plugin.manualIngest.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/com.raytheon.uf.edex.plugin.mesowest.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/com.raytheon.uf.edex.plugin.mesowest.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.npp.viirs/com.raytheon.uf.edex.plugin.npp.viirs.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.npp.viirs/com.raytheon.uf.edex.plugin.npp.viirs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/com.raytheon.uf.edex.plugin.nwsauth.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/com.raytheon.uf.edex.plugin.nwsauth.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.preciprate/com.raytheon.uf.edex.plugin.preciprate.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.preciprate/com.raytheon.uf.edex.plugin.preciprate.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.qc/com.raytheon.uf.edex.plugin.qc.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.qc/com.raytheon.uf.edex.plugin.qc.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.qpf/com.raytheon.uf.edex.plugin.qpf.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.qpf/com.raytheon.uf.edex.plugin.qpf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.satellite.mcidas/com.raytheon.uf.edex.plugin.satellite.mcidas.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.satellite.mcidas/com.raytheon.uf.edex.plugin.satellite.mcidas.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.scan.common/com.raytheon.uf.edex.plugin.scan.common.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.scan.common/com.raytheon.uf.edex.plugin.scan.common.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.scan/com.raytheon.uf.edex.plugin.scan.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.scan/com.raytheon.uf.edex.plugin.scan.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.svrwx/com.raytheon.uf.edex.plugin.svrwx.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.svrwx/com.raytheon.uf.edex.plugin.svrwx.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.tcg/com.raytheon.uf.edex.plugin.tcg.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.tcg/com.raytheon.uf.edex.plugin.tcg.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.tcs/com.raytheon.uf.edex.plugin.tcs.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.tcs/com.raytheon.uf.edex.plugin.tcs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.vaa/com.raytheon.uf.edex.plugin.vaa.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.vaa/com.raytheon.uf.edex.plugin.vaa.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.vil/com.raytheon.uf.edex.plugin.vil.ecl b/edexOsgi/com.raytheon.uf.edex.plugin.vil/com.raytheon.uf.edex.plugin.vil.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.pointdata/com.raytheon.uf.edex.pointdata.ecl b/edexOsgi/com.raytheon.uf.edex.pointdata/com.raytheon.uf.edex.pointdata.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.purgesrv/com.raytheon.uf.edex.purgesrv.ecl b/edexOsgi/com.raytheon.uf.edex.purgesrv/com.raytheon.uf.edex.purgesrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.python.decoder/com.raytheon.uf.edex.python.decoder.ecl b/edexOsgi/com.raytheon.uf.edex.python.decoder/com.raytheon.uf.edex.python.decoder.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.site/com.raytheon.uf.edex.site.ecl b/edexOsgi/com.raytheon.uf.edex.site/com.raytheon.uf.edex.site.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.textdbsrv/com.raytheon.uf.edex.textdbsrv.ecl b/edexOsgi/com.raytheon.uf.edex.textdbsrv/com.raytheon.uf.edex.textdbsrv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.edex.topo/com.raytheon.uf.edex.topo.ecl b/edexOsgi/com.raytheon.uf.edex.topo/com.raytheon.uf.edex.topo.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.tools.cli/com.raytheon.uf.tools.cli.ecl b/edexOsgi/com.raytheon.uf.tools.cli/com.raytheon.uf.tools.cli.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.tools.cli/impl/mhsAckNotify b/edexOsgi/com.raytheon.uf.tools.cli/impl/mhsAckNotify new file mode 100644 index 0000000000..a5e3a55493 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.tools.cli/impl/mhsAckNotify @@ -0,0 +1,31 @@ +#!/bin/bash +############################################################################## +# Provides a simple wrapper to the mhsAckNotify Python module allowing that module +# to be executed as a command line tool without requiring the .py extension. +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 04/06/2012 10388 mhuang Initial creation +############################################################################## + +# this allows you to run this script from outside of ./bin +path_to_script=`readlink -f $0` +RUN_FROM_DIR=`dirname $path_to_script` + +BASE_AWIPS_DIR=`dirname $RUN_FROM_DIR` + +# source the env +source ${RUN_FROM_DIR}/setup.env + +# setup the environment needed to run the the Python +export LD_LIBRARY_PATH=${BASE_AWIPS_DIR}/src/lib:${PYTHON_INSTALL}/lib +export PYTHONPATH=${RUN_FROM_DIR}/src:$PYTHONPATH + +# execute the Python module +_PYTHON="${PYTHON_INSTALL}/bin/python" +_MODULE="${RUN_FROM_DIR}/src/qpidNotify/mhsAckNotify.py" + +# quoting of '$@' is used to prevent command line interpretation +$_PYTHON $_MODULE "$@" diff --git a/edexOsgi/com.raytheon.uf.tools.cli/impl/src/qpidNotify/mhsAckNotify.py b/edexOsgi/com.raytheon.uf.tools.cli/impl/src/qpidNotify/mhsAckNotify.py new file mode 100644 index 0000000000..3de94ae6ff --- /dev/null +++ b/edexOsgi/com.raytheon.uf.tools.cli/impl/src/qpidNotify/mhsAckNotify.py @@ -0,0 +1,100 @@ +############################################################################## +# Notifies EDEX of an ACK or NACK from MHS +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 04/06/2012 10388 D. Friedman Initial version +############################################################################## + +import getopt +import os +import os.path +import sys + +import qpid +from qpid.util import connect +from qpid.connection import Connection +from qpid.datatypes import Message, uuid4 + +DESTINATION = 'amq.topic' +TOPIC_NAME = 'mhs.ackmgr' + +class MhsAckNotification: + def __init__(self): + self.messageId = None + self.sender = None + self.response = None + +def remove_file(*parts): + path = os.path.join(*parts) + if os.path.exists(path): + os.remove(path) + +def run(): + mhs_data_dir = os.getenv('MHS_DATA', '/data/fxa/mhs') + notif = MhsAckNotification() + + opts, args = getopt.getopt(sys.argv[1:], 'm:r:s:') + for k, v in opts: + if k == '-m': + notif.messageId = v + elif k == '-r': + notif.response = v + elif k == '-s': + notif.sender = v + + if notif.messageId: + # Delete the .doc file + if mhs_data_dir: + try: + fn = '%s-%s.doc' %(notif.messageId, notif.sender) + if notif.response == 'ACK': + remove_file(mhs_data_dir, 'ackq', fn) + elif notif.response == 'NACK': + # A1 just uses message ID, but that does not look right... + # Do both to be safe + remove_file(mhs_data_dir, 'nackq', fn) + remove_file(mhs_data_dir, 'nackq', '%s.doc' % (notif.messageId, )) + except: + sys.stderr.write("mhsAckNotify: error removing MHS file: %s\n" % (sys.exc_info()[1],)) + + try: + # TODO: Should have BROKER_ADDR in CLI setup.env. + broker_addr = os.getenv('BROKER_ADDR') + if broker_addr is None: + broker_addr = os.getenv('DEFAULT_HOST') + if broker_addr == 'ec': + broker_addr = 'cp1f' + if broker_addr is None: + broker_addr = 'localhost' + + socket = connect(broker_addr, 5672) + except: + sys.stderr.write("mhsAckNotify: connect to %s: %s\n" % (broker_addr, sys.exc_info()[1],)) + return 1 + + try: + connection = Connection (sock=socket) + connection.start() + session = connection.session(str(uuid4())) + + props = session.delivery_properties(routing_key=TOPIC_NAME) + head = session.message_properties(application_headers={'sender':notif.sender, + 'response':notif.response}) + session.message_transfer(destination=DESTINATION, message=Message(props, head, notif.messageId)) + session.close(timeout=10) + connection.close() + except: + sys.stderr.write("mhsAckNotify: error sending message: %s\n" % (sys.exc_info()[1],)) + return 1 + else: + sys.stderr.write("mhsAckNotify: message ID not specified\n") + sys.stderr.write("usage: mhsAckNotify -m -s -r \n") + return 1 + + return 0 + +if __name__ == '__main__': + sys.exit(run()) diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/com.raytheon.uf.tools.gfesuite.servicebackup.ecl b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/com.raytheon.uf.tools.gfesuite.servicebackup.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_configuration b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_configuration old mode 100755 new mode 100644 index 23836108b7..e011a11baf --- a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_configuration +++ b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_configuration @@ -70,12 +70,16 @@ log_msg Copying edex site configuration for site ${CAPS_SITE} to temporary direc cp -r ${LOCALIZATION_PATH}/edex_static/site/${CAPS_SITE}/config/gfe $edexDest/site log_msg 50 -log_msg Copying cave site configuration for site ${CAPS_SITE} to temporary directory... -cp -r ${LOCALIZATION_PATH}/cave_static/site/${CAPS_SITE}/gfe $caveDest/site +log_msg Copying edex smartinit for site ${CAPS_SITE} to temporary directory... +cp -r ${LOCALIZATION_PATH}/edex_static/site/${CAPS_SITE}/smartinit $edexDest/site log_msg 60 +log_msg Copying cave site configuration for site ${CAPS_SITE} to temporary directory... +cp -r ${LOCALIZATION_PATH}/cave_static/site/${CAPS_SITE}/gfe $caveDest/site +log_msg 70 + # Tar up everything. -log_msg 65 +log_msg 75 log_msg Tarring and zipping configuration to file GFEconfig.${SITE}.tar.gz tar cf - GFEconfig|gzip -9 - > GFEconfig.${SITE}.tar.gz if [ $? -ne 0 ] @@ -88,12 +92,12 @@ fi log_msg Cleaning up temporary files rm -fR GFEconfig -log_msg 75 +log_msg 85 log_msg Preparing compressed file for exporting to central server... log_msg Compressing to file svc_bkup_${SITE}.tar tar cf svc_bkup_${SITE}.tar *.gz siteID.txt -log_msg 85 +log_msg 95 #check for failure of the tar file if [ $? -ne 0 ] @@ -113,7 +117,7 @@ rm siteID.txt log_msg Sending the tar file to the central server... -log_msg 90 +log_msg 100 # Check to see if ${SVCBU_WMO_HEADER} is assigned a value. If so, call msg_send with -i. # Otherwise, don't call it with -i @@ -143,5 +147,5 @@ log_msg Successfully sent message. MESSAGE ID: $msgSendOutput #echo ${SVCBU_HOME}/* | xargs rm -rf rm -f ${LOCK_DIR}/${SITE}exportConfig log_msg Configuration data has been exported! -log_msg 100 +log_msg 110 exit 0 diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_grids b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_grids old mode 100755 new mode 100644 diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/proc_receive_config b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/proc_receive_config index ab02d11677..5dee535a17 100644 --- a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/proc_receive_config +++ b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/proc_receive_config @@ -99,6 +99,7 @@ log_msg "Copying files into position..." log_msg "Checking if localization directories exist for ${SITE_CAPS}" edex_site_dest=${LOCALIZATION_PATH}/edex_static/site/${SITE_CAPS}/config +edex_site_si_dest=${LOCALIZATION_PATH}/edex_static/site/${SITE_CAPS} common_site_dest=${LOCALIZATION_PATH}/common_static/site/${SITE_CAPS} cave_site_dest=${LOCALIZATION_PATH}/cave_static/site/${SITE_CAPS} @@ -129,8 +130,10 @@ cp -r GFEconfig/common_static/site/gfe ${common_site_dest} log_msg 70 cp -r GFEconfig/edex_static/site/gfe ${edex_site_dest} log_msg 80 -cp -r GFEconfig/cave_static/site/gfe ${cave_site_dest} +cp -r GFEconfig/edex_static/site/smartinit ${edex_site_si_dest} log_msg 90 +cp -r GFEconfig/cave_static/site/gfe ${cave_site_dest} +log_msg 100 log_msg "Files successfully copied!" log_msg "Changing ownership of received configuration" @@ -147,7 +150,7 @@ else fi -log_msg 95 +log_msg 105 #Change the MHS ID of the received configuration backup_config=${LOCALIZATION_PATH}/edex_static/site/${my_site_caps}/config/gfe/siteConfig.py @@ -167,6 +170,6 @@ cd ${SVCBU_HOME} rm -rf * rm -f ${LOCK_DIR}/importConfiguration -log_msg 100 +log_msg 110 touch ${LOCK_DIR}/${SITE}svcbuMode -log_msg "Configuration Import Complete!" \ No newline at end of file +log_msg "Configuration Import Complete!" diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite/com.raytheon.uf.tools.gfesuite.ecl b/edexOsgi/com.raytheon.uf.tools.gfesuite/com.raytheon.uf.tools.gfesuite.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/meteolib.jni.linux32/meteolib.jni.linux32.ecl b/edexOsgi/meteolib.jni.linux32/meteolib.jni.linux32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/meteolib.jni.linux64/libmeteoLib.so b/edexOsgi/meteolib.jni.linux64/libmeteoLib.so index 7165f66184..8cec4f9682 100644 Binary files a/edexOsgi/meteolib.jni.linux64/libmeteoLib.so and b/edexOsgi/meteolib.jni.linux64/libmeteoLib.so differ diff --git a/edexOsgi/meteolib.jni.linux64/meteolib.jni.linux64.ecl b/edexOsgi/meteolib.jni.linux64/meteolib.jni.linux64.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/meteolib.jni.win32/meteolib.jni.win32.ecl b/edexOsgi/meteolib.jni.win32/meteolib.jni.win32.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/edexOsgi/meteolib.jni/meteolib.jni.ecl b/edexOsgi/meteolib.jni/meteolib.jni.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ldm/ldm.ecl b/ldm/ldm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/localApps/localApps.ecl b/localApps/localApps.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/localization/localization.OAX/localization.OAX.ecl b/localization/localization.OAX/localization.OAX.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/localization/localization.TBW/localization.TBW.ecl b/localization/localization.TBW/localization.TBW.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Cab.xml b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Cab.xml index 54bd28f5b3..2fbcdb284c 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Cab.xml +++ b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Cab.xml @@ -1,465 +1,465 @@ - - - - Microsoft.Deployment.Compression.Cab - - - -

    - Disposes of resources allocated by the cabinet engine. - - If true, the method has been called directly or indirectly by a user's code, - so managed and unmanaged resources will be disposed. If false, the method has been called by the - runtime from inside the finalizer, and only unmanaged resources will be disposed. - - - - Disposes of resources allocated by the cabinet engine. - - If true, the method has been called directly or indirectly by a user's code, - so managed and unmanaged resources will be disposed. If false, the method has been called by the - runtime from inside the finalizer, and only unmanaged resources will be disposed. - - - - Engine capable of packing and unpacking archives in the cabinet format. - - - - - Creates a new instance of the cabinet engine. - - - - - Disposes of resources allocated by the cabinet engine. - - If true, the method has been called directly - or indirectly by a user's code, so managed and unmanaged resources - will be disposed. If false, the method has been called by the runtime - from inside the finalizer, and only unmanaged resources will be - disposed. - - - - Creates a cabinet or chain of cabinets. - - A context interface to handle opening - and closing of cabinet and file streams. - The paths of the files in the archive (not - external file paths). - The maximum number of bytes for one - cabinet before the contents are chained to the next cabinet, or zero - for unlimited cabinet size. - The cabinet could not be - created. - - The stream context implementation may provide a mapping from the - file paths within the cabinet to the external file paths. - Smaller folder sizes can make it more efficient to extract - individual files out of large cabinet packages. - - - - - Checks whether a Stream begins with a header that indicates - it is a valid cabinet file. - - Stream for reading the cabinet file. - True if the stream is a valid cabinet file - (with no offset); false otherwise. - - - - Gets information about files in a cabinet or cabinet chain. - - A context interface to handle opening - and closing of cabinet and file streams. - A predicate that can determine - which files to process, optional. - Information about files in the cabinet stream. - The cabinet provided - by the stream context is not valid. - - The predicate takes an internal file - path and returns true to include the file or false to exclude it. - - - - - Extracts files from a cabinet or cabinet chain. - - A context interface to handle opening - and closing of cabinet and file streams. - An optional predicate that can determine - which files to process. - The cabinet provided - by the stream context is not valid. - - The predicate takes an internal file - path and returns true to include the file or false to exclude it. - - - - - Exception class for cabinet operations. - - - - - Creates a new CabException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new CabException with a specified error message. - - The message that describes the error. - - - - Creates a new CabException. - - - - - Initializes a new instance of the CabException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Sets the SerializationInfo with information about the exception. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Gets the FCI or FDI cabinet engine error number. - - A cabinet engine error number, or 0 if the exception was - not related to a cabinet engine error number. - - - - Gets the Win32 error code. - - A Win32 error code, or 0 if the exception was - not related to a Win32 error. - - - - Disposes of resources allocated by the cabinet engine. - - If true, the method has been called directly or indirectly by a user's code, - so managed and unmanaged resources will be disposed. If false, the method has been called by the - runtime from inside the finalizer, and only unmanaged resources will be disposed. - - - - Object representing a compressed file within a cabinet package; provides operations for getting - the file properties and extracting the file. - - - - - Creates a new CabinetFileInfo object representing a file within a cabinet in a specified path. - - An object representing the cabinet containing the file. - The path to the file within the cabinet. Usually, this is a simple file - name, but if the cabinet contains a directory structure this may include the directory. - - - - Creates a new CabinetFileInfo object with all parameters specified, - used internally when reading the metadata out of a cab. - - The internal path and name of the file in the cab. - The folder number containing the file. - The cabinet number where the file starts. - The stored attributes of the file. - The stored last write time of the file. - The uncompressed size of the file. - - - - Initializes a new instance of the CabinetFileInfo class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Sets the SerializationInfo with information about the archive. - - The SerializationInfo that holds the serialized object data. - The StreamingContext that contains contextual information - about the source or destination. - - - - Refreshes the information in this object with new data retrieved - from an archive. - - Fresh instance for the same file just - read from the archive. - - This implementation refreshes the . - - - - - Gets or sets the cabinet that contains this file. - - - The CabinetInfo instance that retrieved this file information -- this - may be null if the CabinetFileInfo object was returned directly from a - stream. - - - - - Gets the full path of the cabinet that contains this file. - - The full path of the cabinet that contains this file. - - - - Gets the number of the folder containing this file. - - The number of the cabinet folder containing this file. - A single folder or the first folder of a cabinet - (or chain of cabinets) is numbered 0. - - - - Object representing a cabinet file on disk; provides access to - file-based operations on the cabinet file. - - - Generally, the methods on this class are much easier to use than the - stream-based interfaces provided by the class. - - - - - Creates a new CabinetInfo object representing a cabinet file in a specified path. - - The path to the cabinet file. When creating a cabinet file, this file does not - necessarily exist yet. - - - - Initializes a new instance of the CabinetInfo class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Creates a compression engine that does the low-level work for - this object. - - A new instance. - - Each instance will be d - immediately after use. - - - - - Gets information about the files contained in the archive. - - A list of objects, each - containing information about a file in the archive. - - - - Gets information about the certain files contained in the archive file. - - The search string, such as - "*.txt". - A list of objects, each containing - information about a file in the archive. - - - - Generic class for managing allocations of integer handles - for objects of a certain type. - - The type of objects the handles refer to. - - - - Auto-resizing list of objects for which handles have been allocated. - Each handle is just an index into this list. When a handle is freed, - the list item at that index is set to null. - - - - - Creates a new HandleManager instance. - - - - - Allocates a new handle for an object. - - Object that the handle will refer to. - New handle that can be later used to retrieve the object. - - - - Frees a handle that was previously allocated. Afterward the handle - will be invalid and the object it referred to can no longer retrieved. - - Handle to be freed. - - - - Gets the object of a handle, or null if the handle is invalid. - - The integer handle previously allocated - for the desired object. - The object for which the handle was allocated. - - - - Native DllImport methods and related structures and constants used for - cabinet creation and extraction via cabinet.dll. - - - - - A direct import of constants, enums, structures, delegates, and functions from fci.h. - Refer to comments in fci.h for documentation. - - - - - Error codes that can be returned by FCI. - - - - - FCI compression algorithm types and parameters. - - - - - Reason for FCI status callback. - - - - - Cabinet information structure used for FCI initialization and GetNextCabinet callback. - - - - - Ensures that the FCI handle is safely released. - - - - - Creates a new unintialized handle. The handle will be initialized - when it is marshalled back from native code. - - - - - Releases the handle by calling FDIDestroy(). - - True if the release succeeded. - - - - Checks if the handle is invalid. An FCI handle is invalid when it is zero. - - - - - A direct import of constants, enums, structures, delegates, and functions from fdi.h. - Refer to comments in fdi.h for documentation. - - - - - Error codes that can be returned by FDI. - - - - - Type of notification message for the FDI Notify callback. - - - - - Cabinet information structure filled in by FDI IsCabinet. - - - - - Cabinet notification details passed to the FDI Notify callback. - - - - - Ensures that the FDI handle is safely released. - - - - - Creates a new unintialized handle. The handle will be initialized - when it is marshalled back from native code. - - - - - Releases the handle by calling FDIDestroy(). - - True if the release succeeded. - - - - Checks if the handle is invalid. An FDI handle is invalid when it is zero. - - - - - Error info structure for FCI and FDI. - - Before being passed to FCI or FDI, this structure is - pinned in memory via a GCHandle. The pinning is necessary - to be able to read the results, since the ERF structure doesn't - get marshalled back out after an error. - - - - Clears the error information. - - - - - Gets or sets the cabinet error code. - - - - - Gets or sets the Win32 error code. - - - - - GCHandle doesn't like the bool type, so use an int underneath. - - - - + + + + Microsoft.Deployment.Compression.Cab + + + + + Disposes of resources allocated by the cabinet engine. + + If true, the method has been called directly or indirectly by a user's code, + so managed and unmanaged resources will be disposed. If false, the method has been called by the + runtime from inside the finalizer, and only unmanaged resources will be disposed. + + + + Disposes of resources allocated by the cabinet engine. + + If true, the method has been called directly or indirectly by a user's code, + so managed and unmanaged resources will be disposed. If false, the method has been called by the + runtime from inside the finalizer, and only unmanaged resources will be disposed. + + + + Engine capable of packing and unpacking archives in the cabinet format. + + + + + Creates a new instance of the cabinet engine. + + + + + Disposes of resources allocated by the cabinet engine. + + If true, the method has been called directly + or indirectly by a user's code, so managed and unmanaged resources + will be disposed. If false, the method has been called by the runtime + from inside the finalizer, and only unmanaged resources will be + disposed. + + + + Creates a cabinet or chain of cabinets. + + A context interface to handle opening + and closing of cabinet and file streams. + The paths of the files in the archive (not + external file paths). + The maximum number of bytes for one + cabinet before the contents are chained to the next cabinet, or zero + for unlimited cabinet size. + The cabinet could not be + created. + + The stream context implementation may provide a mapping from the + file paths within the cabinet to the external file paths. + Smaller folder sizes can make it more efficient to extract + individual files out of large cabinet packages. + + + + + Checks whether a Stream begins with a header that indicates + it is a valid cabinet file. + + Stream for reading the cabinet file. + True if the stream is a valid cabinet file + (with no offset); false otherwise. + + + + Gets information about files in a cabinet or cabinet chain. + + A context interface to handle opening + and closing of cabinet and file streams. + A predicate that can determine + which files to process, optional. + Information about files in the cabinet stream. + The cabinet provided + by the stream context is not valid. + + The predicate takes an internal file + path and returns true to include the file or false to exclude it. + + + + + Extracts files from a cabinet or cabinet chain. + + A context interface to handle opening + and closing of cabinet and file streams. + An optional predicate that can determine + which files to process. + The cabinet provided + by the stream context is not valid. + + The predicate takes an internal file + path and returns true to include the file or false to exclude it. + + + + + Exception class for cabinet operations. + + + + + Creates a new CabException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new CabException with a specified error message. + + The message that describes the error. + + + + Creates a new CabException. + + + + + Initializes a new instance of the CabException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Sets the SerializationInfo with information about the exception. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Gets the FCI or FDI cabinet engine error number. + + A cabinet engine error number, or 0 if the exception was + not related to a cabinet engine error number. + + + + Gets the Win32 error code. + + A Win32 error code, or 0 if the exception was + not related to a Win32 error. + + + + Disposes of resources allocated by the cabinet engine. + + If true, the method has been called directly or indirectly by a user's code, + so managed and unmanaged resources will be disposed. If false, the method has been called by the + runtime from inside the finalizer, and only unmanaged resources will be disposed. + + + + Object representing a compressed file within a cabinet package; provides operations for getting + the file properties and extracting the file. + + + + + Creates a new CabinetFileInfo object representing a file within a cabinet in a specified path. + + An object representing the cabinet containing the file. + The path to the file within the cabinet. Usually, this is a simple file + name, but if the cabinet contains a directory structure this may include the directory. + + + + Creates a new CabinetFileInfo object with all parameters specified, + used internally when reading the metadata out of a cab. + + The internal path and name of the file in the cab. + The folder number containing the file. + The cabinet number where the file starts. + The stored attributes of the file. + The stored last write time of the file. + The uncompressed size of the file. + + + + Initializes a new instance of the CabinetFileInfo class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Sets the SerializationInfo with information about the archive. + + The SerializationInfo that holds the serialized object data. + The StreamingContext that contains contextual information + about the source or destination. + + + + Refreshes the information in this object with new data retrieved + from an archive. + + Fresh instance for the same file just + read from the archive. + + This implementation refreshes the . + + + + + Gets or sets the cabinet that contains this file. + + + The CabinetInfo instance that retrieved this file information -- this + may be null if the CabinetFileInfo object was returned directly from a + stream. + + + + + Gets the full path of the cabinet that contains this file. + + The full path of the cabinet that contains this file. + + + + Gets the number of the folder containing this file. + + The number of the cabinet folder containing this file. + A single folder or the first folder of a cabinet + (or chain of cabinets) is numbered 0. + + + + Object representing a cabinet file on disk; provides access to + file-based operations on the cabinet file. + + + Generally, the methods on this class are much easier to use than the + stream-based interfaces provided by the class. + + + + + Creates a new CabinetInfo object representing a cabinet file in a specified path. + + The path to the cabinet file. When creating a cabinet file, this file does not + necessarily exist yet. + + + + Initializes a new instance of the CabinetInfo class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Creates a compression engine that does the low-level work for + this object. + + A new instance. + + Each instance will be d + immediately after use. + + + + + Gets information about the files contained in the archive. + + A list of objects, each + containing information about a file in the archive. + + + + Gets information about the certain files contained in the archive file. + + The search string, such as + "*.txt". + A list of objects, each containing + information about a file in the archive. + + + + Generic class for managing allocations of integer handles + for objects of a certain type. + + The type of objects the handles refer to. + + + + Auto-resizing list of objects for which handles have been allocated. + Each handle is just an index into this list. When a handle is freed, + the list item at that index is set to null. + + + + + Creates a new HandleManager instance. + + + + + Allocates a new handle for an object. + + Object that the handle will refer to. + New handle that can be later used to retrieve the object. + + + + Frees a handle that was previously allocated. Afterward the handle + will be invalid and the object it referred to can no longer retrieved. + + Handle to be freed. + + + + Gets the object of a handle, or null if the handle is invalid. + + The integer handle previously allocated + for the desired object. + The object for which the handle was allocated. + + + + Native DllImport methods and related structures and constants used for + cabinet creation and extraction via cabinet.dll. + + + + + A direct import of constants, enums, structures, delegates, and functions from fci.h. + Refer to comments in fci.h for documentation. + + + + + Error codes that can be returned by FCI. + + + + + FCI compression algorithm types and parameters. + + + + + Reason for FCI status callback. + + + + + Cabinet information structure used for FCI initialization and GetNextCabinet callback. + + + + + Ensures that the FCI handle is safely released. + + + + + Creates a new unintialized handle. The handle will be initialized + when it is marshalled back from native code. + + + + + Releases the handle by calling FDIDestroy(). + + True if the release succeeded. + + + + Checks if the handle is invalid. An FCI handle is invalid when it is zero. + + + + + A direct import of constants, enums, structures, delegates, and functions from fdi.h. + Refer to comments in fdi.h for documentation. + + + + + Error codes that can be returned by FDI. + + + + + Type of notification message for the FDI Notify callback. + + + + + Cabinet information structure filled in by FDI IsCabinet. + + + + + Cabinet notification details passed to the FDI Notify callback. + + + + + Ensures that the FDI handle is safely released. + + + + + Creates a new unintialized handle. The handle will be initialized + when it is marshalled back from native code. + + + + + Releases the handle by calling FDIDestroy(). + + True if the release succeeded. + + + + Checks if the handle is invalid. An FDI handle is invalid when it is zero. + + + + + Error info structure for FCI and FDI. + + Before being passed to FCI or FDI, this structure is + pinned in memory via a GCHandle. The pinning is necessary + to be able to read the results, since the ERF structure doesn't + get marshalled back out after an error. + + + + Clears the error information. + + + + + Gets or sets the cabinet error code. + + + + + Gets or sets the Win32 error code. + + + + + GCHandle doesn't like the bool type, so use an int underneath. + + + + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Zip.xml b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Zip.xml index edbdf6ea8e..214d229562 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Zip.xml +++ b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.Zip.xml @@ -1,514 +1,514 @@ - - - - Microsoft.Deployment.Compression.Zip - - - - - Used to trick a DeflateStream into reading from or writing to - a series of (chunked) streams instead of a single steream. - - - - - Wraps a source stream and calcaluates a CRC over all bytes that are read or written. - - - The CRC algorithm matches that used in the standard ZIP file format. - - - - - Creates a new CrcStream instance from a source stream. - - Underlying stream where bytes will be read from or written to. - - - - Sets the position within the source stream. - - A byte offset relative to the origin parameter. - A value of type SeekOrigin indicating - the reference point used to obtain the new position. - The new position within the source stream. - - Note the CRC is only calculated over bytes that are actually read or - written, so any bytes skipped by seeking will not contribute to the CRC. - - - - - Sets the length of the source stream. - - The desired length of the - stream in bytes. - - - - Reads a sequence of bytes from the source stream and advances - the position within the stream by the number of bytes read. - - An array of bytes. When this method returns, the buffer - contains the specified byte array with the values between offset and - (offset + count - 1) replaced by the bytes read from the current source. - The zero-based byte offset in buffer at which to begin - storing the data read from the current stream. - The maximum number of bytes to be read from the current stream. - The total number of bytes read into the buffer. This can be less - than the number of bytes requested if that many bytes are not currently available, - or zero (0) if the end of the stream has been reached. - - - - Writes a sequence of bytes to the source stream and advances the - current position within this stream by the number of bytes written. - - An array of bytes. This method copies count - bytes from buffer to the current stream. - The zero-based byte offset in buffer at which - to begin copying bytes to the current stream. - The number of bytes to be written to the - current stream. - - - - Flushes the source stream. - - - - - Closes the underlying stream. - - - - - Updates the CRC with a range of bytes that were read or written. - - - - - Computes a table that speeds up calculation of the CRC. - - - - - Reflects the ordering of certain number of bits. For exmample when reflecting - one byte, bit one is swapped with bit eight, bit two with bit seven, etc. - - - - - Gets the current CRC over all bytes that have been read or written - since this instance was created. - - - - - Gets the underlying stream that this stream reads from or writes to. - - - - - Gets a value indicating whether the source stream supports reading. - - true if the stream supports reading; otherwise, false. - - - - Gets a value indicating whether the source stream supports writing. - - true if the stream supports writing; otherwise, false. - - - - Gets a value indicating whether the source stream supports seeking. - - true if the stream supports seeking; otherwise, false. - - - - Gets the length of the source stream. - - - - - Gets or sets the position of the source stream. - - - - - Identifies the compression method or "algorithm" - used for a single file within a zip archive. - - - Proprietary zip implementations may define additional compression - methods outside of those included here. - - - - - The file is stored (no compression) - - - - - The file is Shrunk - - - - - The file is Reduced with compression factor 1 - - - - - The file is Reduced with compression factor 2 - - - - - The file is Reduced with compression factor 3 - - - - - The file is Reduced with compression factor 4 - - - - - The file is Imploded - - - - - The file is Deflated; - the most common and widely-compatible form of zip compression. - - - - - The file is Deflated using the enhanced Deflate64 method. - - - - - The file is compressed using the BZIP2 algorithm. - - - - - The file is compressed using the LZMA algorithm. - - - - - The file is compressed using the PPMd algorithm. - - - - - Exception class for zip operations. - - - - - Creates a new ZipException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new ZipException with a specified error message. - - The message that describes the error. - - - - Creates a new ZipException. - - - - - Initializes a new instance of the ZipException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Sets the SerializationInfo with information about the exception. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Engine capable of packing and unpacking archives in the zip format. - - - - - Registers a delegate that can create a warpper stream for - compressing or uncompressing the data of a source stream. - - Compression method being registered. - Indicates registration for ether - compress or decompress mode. - Delegate being registered. - - For compression, the delegate accepts a stream that writes to the archive - and returns a wrapper stream that compresses bytes as they are written. - For decompression, the delegate accepts a stream that reads from the archive - and returns a wrapper stream that decompresses bytes as they are read. - This wrapper stream model follows the design used by - System.IO.Compression.DeflateStream, and indeed that class is used - to implement the Deflate compression method by default. - To unregister a delegate, call this method again and pass - null for the delegate parameter. - - - When the ZipEngine class is initialized, the Deflate compression method - is automatically registered like this: - - ZipEngine.RegisterCompressionStreamCreator( - ZipCompressionMethod.Deflate, - CompressionMode.Compress, - delegate(Stream stream) { - return new DeflateStream(stream, CompressionMode.Compress, true); - }); - ZipEngine.RegisterCompressionStreamCreator( - ZipCompressionMethod.Deflate, - CompressionMode.Decompress, - delegate(Stream stream) { - return new DeflateStream(stream, CompressionMode.Decompress, true); - }); - - - - - Creates a new instance of the zip engine. - - - - - Checks whether a Stream begins with a header that indicates - it is a valid archive file. - - Stream for reading the archive file. - True if the stream is a valid zip archive - (with no offset); false otherwise. - - - - Gets the offset of an archive that is positioned 0 or more bytes - from the start of the Stream. - - A stream for reading the archive. - The offset in bytes of the archive, - or -1 if no archive is found in the Stream. - The archive must begin on a 4-byte boundary. - - - - Gets information about files in a zip archive or archive chain. - - A context interface to handle opening - and closing of archive and file streams. - A predicate that can determine - which files to process, optional. - Information about files in the archive stream. - The archive provided - by the stream context is not valid. - - The predicate takes an internal file - path and returns true to include the file or false to exclude it. - - - - - Reads all the file headers from the central directory in the main archive. - - - - - Locates and reads the end of central directory record near the - end of the archive. - - - - - Creates a zip archive or chain of zip archives. - - A context interface to handle opening - and closing of archive and file streams. - An array of file lists. Each list is - compressed into one stream in the archive. - The maximum number of bytes for one archive - before the contents are chained to the next archive, or zero for unlimited - archive size. - The archive could not be - created. - - The stream context implementation may provide a mapping from the file - paths within the archive to the external file paths. - - - - - Moves to the next archive in the sequence if necessary. - - - - - Adds one file to a zip archive in the process of being created. - - - - - Writes compressed bytes of one file to the archive, - keeping track of the CRC and number of bytes written. - - - - - Extracts files from a zip archive or archive chain. - - A context interface to handle opening - and closing of archive and file streams. - An optional predicate that can determine - which files to process. - The archive provided - by the stream context is not valid. - - The predicate takes an internal file - path and returns true to include the file or false to exclude it. - - - - - Unpacks a single file from an archive or archive chain. - - - - - Decompresses bytes for one file from an archive or archive chain, - checking the crc at the end. - - - - - Gets the comment from the last-examined archive, - or sets the comment to be added to any created archives. - - - - - Object representing a compressed file within a zip package; provides operations for getting - the file properties and extracting the file. - - - - - Creates a new ZipFileInfo object representing a file within a zip in a specified path. - - An object representing the zip archive containing the file. - The path to the file within the zip archive. Usually, this is a simple file - name, but if the zip archive contains a directory structure this may include the directory. - - - - Creates a new ZipFileInfo object with all parameters specified, - used internally when reading the metadata out of a zip archive. - - The internal path and name of the file in the zip archive. - The zip archive number where the file starts. - The stored attributes of the file. - The stored last write time of the file. - The uncompressed size of the file. - The compressed size of the file. - Compression algorithm used for this file. - - - - Initializes a new instance of the ZipFileInfo class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Sets the SerializationInfo with information about the archive. - - The SerializationInfo that holds the serialized object data. - The StreamingContext that contains contextual information - about the source or destination. - - - - Gets the compressed size of the file in bytes. - - - - - Gets the method used to compress this file. - - - - - Object representing a zip file on disk; provides access to - file-based operations on the zip file. - - - Generally, the methods on this class are much easier to use than the - stream-based interfaces provided by the class. - - - - - Creates a new CabinetInfo object representing a zip file in a specified path. - - The path to the zip file. When creating a zip file, this file does not - necessarily exist yet. - - - - Initializes a new instance of the CabinetInfo class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Creates a compression engine that does the low-level work for - this object. - - A new instance. - - Each instance will be d - immediately after use. - - - - - Gets information about the files contained in the archive. - - A list of objects, each - containing information about a file in the archive. - - - - Gets information about the certain files contained in the archive file. - - The search string, such as - "*.txt". - A list of objects, each containing - information about a file in the archive. - - - + + + + Microsoft.Deployment.Compression.Zip + + + + + Used to trick a DeflateStream into reading from or writing to + a series of (chunked) streams instead of a single steream. + + + + + Wraps a source stream and calcaluates a CRC over all bytes that are read or written. + + + The CRC algorithm matches that used in the standard ZIP file format. + + + + + Creates a new CrcStream instance from a source stream. + + Underlying stream where bytes will be read from or written to. + + + + Sets the position within the source stream. + + A byte offset relative to the origin parameter. + A value of type SeekOrigin indicating + the reference point used to obtain the new position. + The new position within the source stream. + + Note the CRC is only calculated over bytes that are actually read or + written, so any bytes skipped by seeking will not contribute to the CRC. + + + + + Sets the length of the source stream. + + The desired length of the + stream in bytes. + + + + Reads a sequence of bytes from the source stream and advances + the position within the stream by the number of bytes read. + + An array of bytes. When this method returns, the buffer + contains the specified byte array with the values between offset and + (offset + count - 1) replaced by the bytes read from the current source. + The zero-based byte offset in buffer at which to begin + storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + The total number of bytes read into the buffer. This can be less + than the number of bytes requested if that many bytes are not currently available, + or zero (0) if the end of the stream has been reached. + + + + Writes a sequence of bytes to the source stream and advances the + current position within this stream by the number of bytes written. + + An array of bytes. This method copies count + bytes from buffer to the current stream. + The zero-based byte offset in buffer at which + to begin copying bytes to the current stream. + The number of bytes to be written to the + current stream. + + + + Flushes the source stream. + + + + + Closes the underlying stream. + + + + + Updates the CRC with a range of bytes that were read or written. + + + + + Computes a table that speeds up calculation of the CRC. + + + + + Reflects the ordering of certain number of bits. For exmample when reflecting + one byte, bit one is swapped with bit eight, bit two with bit seven, etc. + + + + + Gets the current CRC over all bytes that have been read or written + since this instance was created. + + + + + Gets the underlying stream that this stream reads from or writes to. + + + + + Gets a value indicating whether the source stream supports reading. + + true if the stream supports reading; otherwise, false. + + + + Gets a value indicating whether the source stream supports writing. + + true if the stream supports writing; otherwise, false. + + + + Gets a value indicating whether the source stream supports seeking. + + true if the stream supports seeking; otherwise, false. + + + + Gets the length of the source stream. + + + + + Gets or sets the position of the source stream. + + + + + Identifies the compression method or "algorithm" + used for a single file within a zip archive. + + + Proprietary zip implementations may define additional compression + methods outside of those included here. + + + + + The file is stored (no compression) + + + + + The file is Shrunk + + + + + The file is Reduced with compression factor 1 + + + + + The file is Reduced with compression factor 2 + + + + + The file is Reduced with compression factor 3 + + + + + The file is Reduced with compression factor 4 + + + + + The file is Imploded + + + + + The file is Deflated; + the most common and widely-compatible form of zip compression. + + + + + The file is Deflated using the enhanced Deflate64 method. + + + + + The file is compressed using the BZIP2 algorithm. + + + + + The file is compressed using the LZMA algorithm. + + + + + The file is compressed using the PPMd algorithm. + + + + + Exception class for zip operations. + + + + + Creates a new ZipException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new ZipException with a specified error message. + + The message that describes the error. + + + + Creates a new ZipException. + + + + + Initializes a new instance of the ZipException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Sets the SerializationInfo with information about the exception. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Engine capable of packing and unpacking archives in the zip format. + + + + + Registers a delegate that can create a warpper stream for + compressing or uncompressing the data of a source stream. + + Compression method being registered. + Indicates registration for ether + compress or decompress mode. + Delegate being registered. + + For compression, the delegate accepts a stream that writes to the archive + and returns a wrapper stream that compresses bytes as they are written. + For decompression, the delegate accepts a stream that reads from the archive + and returns a wrapper stream that decompresses bytes as they are read. + This wrapper stream model follows the design used by + System.IO.Compression.DeflateStream, and indeed that class is used + to implement the Deflate compression method by default. + To unregister a delegate, call this method again and pass + null for the delegate parameter. + + + When the ZipEngine class is initialized, the Deflate compression method + is automatically registered like this: + + ZipEngine.RegisterCompressionStreamCreator( + ZipCompressionMethod.Deflate, + CompressionMode.Compress, + delegate(Stream stream) { + return new DeflateStream(stream, CompressionMode.Compress, true); + }); + ZipEngine.RegisterCompressionStreamCreator( + ZipCompressionMethod.Deflate, + CompressionMode.Decompress, + delegate(Stream stream) { + return new DeflateStream(stream, CompressionMode.Decompress, true); + }); + + + + + Creates a new instance of the zip engine. + + + + + Checks whether a Stream begins with a header that indicates + it is a valid archive file. + + Stream for reading the archive file. + True if the stream is a valid zip archive + (with no offset); false otherwise. + + + + Gets the offset of an archive that is positioned 0 or more bytes + from the start of the Stream. + + A stream for reading the archive. + The offset in bytes of the archive, + or -1 if no archive is found in the Stream. + The archive must begin on a 4-byte boundary. + + + + Gets information about files in a zip archive or archive chain. + + A context interface to handle opening + and closing of archive and file streams. + A predicate that can determine + which files to process, optional. + Information about files in the archive stream. + The archive provided + by the stream context is not valid. + + The predicate takes an internal file + path and returns true to include the file or false to exclude it. + + + + + Reads all the file headers from the central directory in the main archive. + + + + + Locates and reads the end of central directory record near the + end of the archive. + + + + + Creates a zip archive or chain of zip archives. + + A context interface to handle opening + and closing of archive and file streams. + An array of file lists. Each list is + compressed into one stream in the archive. + The maximum number of bytes for one archive + before the contents are chained to the next archive, or zero for unlimited + archive size. + The archive could not be + created. + + The stream context implementation may provide a mapping from the file + paths within the archive to the external file paths. + + + + + Moves to the next archive in the sequence if necessary. + + + + + Adds one file to a zip archive in the process of being created. + + + + + Writes compressed bytes of one file to the archive, + keeping track of the CRC and number of bytes written. + + + + + Extracts files from a zip archive or archive chain. + + A context interface to handle opening + and closing of archive and file streams. + An optional predicate that can determine + which files to process. + The archive provided + by the stream context is not valid. + + The predicate takes an internal file + path and returns true to include the file or false to exclude it. + + + + + Unpacks a single file from an archive or archive chain. + + + + + Decompresses bytes for one file from an archive or archive chain, + checking the crc at the end. + + + + + Gets the comment from the last-examined archive, + or sets the comment to be added to any created archives. + + + + + Object representing a compressed file within a zip package; provides operations for getting + the file properties and extracting the file. + + + + + Creates a new ZipFileInfo object representing a file within a zip in a specified path. + + An object representing the zip archive containing the file. + The path to the file within the zip archive. Usually, this is a simple file + name, but if the zip archive contains a directory structure this may include the directory. + + + + Creates a new ZipFileInfo object with all parameters specified, + used internally when reading the metadata out of a zip archive. + + The internal path and name of the file in the zip archive. + The zip archive number where the file starts. + The stored attributes of the file. + The stored last write time of the file. + The uncompressed size of the file. + The compressed size of the file. + Compression algorithm used for this file. + + + + Initializes a new instance of the ZipFileInfo class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Sets the SerializationInfo with information about the archive. + + The SerializationInfo that holds the serialized object data. + The StreamingContext that contains contextual information + about the source or destination. + + + + Gets the compressed size of the file in bytes. + + + + + Gets the method used to compress this file. + + + + + Object representing a zip file on disk; provides access to + file-based operations on the zip file. + + + Generally, the methods on this class are much easier to use than the + stream-based interfaces provided by the class. + + + + + Creates a new CabinetInfo object representing a zip file in a specified path. + + The path to the zip file. When creating a zip file, this file does not + necessarily exist yet. + + + + Initializes a new instance of the CabinetInfo class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Creates a compression engine that does the low-level work for + this object. + + A new instance. + + Each instance will be d + immediately after use. + + + + + Gets information about the files contained in the archive. + + A list of objects, each + containing information about a file in the archive. + + + + Gets information about the certain files contained in the archive file. + + The search string, such as + "*.txt". + A list of objects, each containing + information about a file in the archive. + + + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.xml b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.xml index c91c899dff..259a9a58b3 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.xml +++ b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Compression.xml @@ -1,1936 +1,1936 @@ - - - - Microsoft.Deployment.Compression - - - - - Base exception class for compression operations. Compression libraries should - derive subclass exceptions with more specific error information relevent to the - file format. - - - - - Creates a new ArchiveException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new ArchiveException with a specified error message. - - The message that describes the error. - - - - Creates a new ArchiveException. - - - - - Initializes a new instance of the ArchiveException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Abstract object representing a compressed file within an archive; - provides operations for getting the file properties and unpacking - the file. - - - - - Creates a new ArchiveFileInfo object representing a file within - an archive in a specified path. - - An object representing the archive - containing the file. - The path to the file within the archive. - Usually, this is a simple file name, but if the archive contains - a directory structure this may include the directory. - - - - Creates a new ArchiveFileInfo object with all parameters specified; - used by subclasses when reading the metadata out of an archive. - - The internal path and name of the file in - the archive. - The archive number where the file - starts. - The stored attributes of the file. - The stored last write time of the - file. - The uncompressed size of the file. - - - - Initializes a new instance of the ArchiveFileInfo class with - serialized data. - - The SerializationInfo that holds the serialized - object data about the exception being thrown. - The StreamingContext that contains contextual - information about the source or destination. - - - - Sets the SerializationInfo with information about the archive. - - The SerializationInfo that holds the serialized - object data. - The StreamingContext that contains contextual - information about the source or destination. - - - - Gets the full path to the file. - - The same as - - - - Deletes the file. NOT SUPPORTED. - - Files cannot be deleted - from an existing archive. - - - - Refreshes the attributes and other cached information about the file, - by re-reading the information from the archive. - - - - - Extracts the file. - - The destination path where the file - will be extracted. - - - - Extracts the file, optionally overwriting any existing file. - - The destination path where the file - will be extracted. - If true, - will be overwritten if it exists. - is false - and exists. - - - - Opens the archive file for reading without actually extracting the - file to disk. - - - A stream for reading directly from the packed file. Like any stream - this should be closed/disposed as soon as it is no longer needed. - - - - - Opens the archive file reading text with UTF-8 encoding without - actually extracting the file to disk. - - - A reader for reading text directly from the packed file. Like any reader - this should be closed/disposed as soon as it is no longer needed. - - - To open an archived text file with different encoding, use the - method and pass the returned stream to one of - the constructor overloads. - - - - - Refreshes the information in this object with new data retrieved - from an archive. - - Fresh instance for the same file just - read from the archive. - - Subclasses may override this method to refresh sublcass fields. - However they should always call the base implementation first. - - - - - Gets the name of the file. - - The name of the file, not including any path. - - - - Gets the internal path of the file in the archive. - - The internal path of the file in the archive, not including - the file name. - - - - Gets the full path to the file. - - The full path to the file, including the full path to the - archive, the internal path in the archive, and the file name. - - For example, the path "C:\archive.cab\file.txt" refers to - a file "file.txt" inside the archive "archive.cab". - - - - - Gets or sets the archive that contains this file. - - - The ArchiveInfo instance that retrieved this file information -- this - may be null if the ArchiveFileInfo object was returned directly from - a stream. - - - - - Gets the full path of the archive that contains this file. - - The full path of the archive that contains this file. - - - - Gets the number of the archive where this file starts. - - The number of the archive where this file starts. - A single archive or the first archive in a chain is - numbered 0. - - - - Checks if the file exists within the archive. - - True if the file exists, false otherwise. - - - - Gets the uncompressed size of the file. - - The uncompressed size of the file in bytes. - - - - Gets the attributes of the file. - - The attributes of the file as stored in the archive. - - - - Gets the last modification time of the file. - - The last modification time of the file as stored in the - archive. - - - - Abstract object representing a compressed archive on disk; - provides access to file-based operations on the archive. - - - - - Creates a new ArchiveInfo object representing an archive in a - specified path. - - The path to the archive. When creating an archive, - this file does not necessarily exist yet. - - - - Initializes a new instance of the ArchiveInfo class with serialized data. - - The SerializationInfo that holds the serialized object - data about the exception being thrown. - The StreamingContext that contains contextual - information about the source or destination. - - - - Gets the full path of the archive. - - The full path of the archive. - - - - Deletes the archive. - - - - - Copies an existing archive to another location. - - The destination file path. - - - - Copies an existing archive to another location, optionally - overwriting the destination file. - - The destination file path. - If true, the destination file will be - overwritten if it exists. - - - - Moves an existing archive to another location. - - The destination file path. - - - - Checks if the archive contains a valid archive header. - - True if the file is a valid archive; false otherwise. - - - - Gets information about the files contained in the archive. - - A list of objects, each - containing information about a file in the archive. - - - - Gets information about the certain files contained in the archive file. - - The search string, such as - "*.txt". - A list of objects, each containing - information about a file in the archive. - - - - Extracts all files from an archive to a destination directory. - - Directory where the files are to be - extracted. - - - - Extracts all files from an archive to a destination directory, - optionally extracting only newer files. - - Directory where the files are to be - extracted. - Handler for receiving progress - information; this may be null if progress is not desired. - - - - Extracts a single file from the archive. - - The name of the file in the archive. Also - includes the internal path of the file, if any. File name matching - is case-insensitive. - The path where the file is to be - extracted on disk. - If already exists, - it will be overwritten. - - - - Extracts multiple files from the archive. - - The names of the files in the archive. - Each name includes the internal path of the file, if any. File name - matching is case-insensitive. - This parameter may be null, but if - specified it is the root directory for any relative paths in - . - The paths where the files are to be - extracted on disk. If this parameter is null, the files will be - extracted with the names from the archive. - - If any extracted files already exist on disk, they will be overwritten. -

    The and - parameters cannot both be null.

    -
    -
    - - - Extracts multiple files from the archive, optionally extracting - only newer files. - - The names of the files in the archive. - Each name includes the internal path of the file, if any. File name - matching is case-insensitive. - This parameter may be null, but if - specified it is the root directory for any relative paths in - . - The paths where the files are to be - extracted on disk. If this parameter is null, the files will be - extracted with the names from the archive. - Handler for receiving progress information; - this may be null if progress is not desired. - - If any extracted files already exist on disk, they will be overwritten. -

    The and - parameters cannot both be null.

    -
    -
    - - - Extracts multiple files from the archive. - - A mapping from internal file paths to - external file paths. Case-senstivity when matching internal paths - depends on the IDictionary implementation. - This parameter may be null, but if - specified it is the root directory for any relative external paths - in . - - If any extracted files already exist on disk, they will be overwritten. - - - - - Extracts multiple files from the archive. - - A mapping from internal file paths to - external file paths. Case-senstivity when matching internal - paths depends on the IDictionary implementation. - This parameter may be null, but if - specified it is the root directory for any relative external - paths in . - Handler for receiving progress - information; this may be null if progress is not desired. - - If any extracted files already exist on disk, they will be overwritten. - - - - - Opens a file inside the archive for reading without actually - extracting the file to disk. - - The name of the file in the archive. Also - includes the internal path of the file, if any. File name matching - is case-insensitive. - - A stream for reading directly from the packed file. Like any stream - this should be closed/disposed as soon as it is no longer needed. - - - - - Opens a file inside the archive for reading text with UTF-8 encoding - without actually extracting the file to disk. - - The name of the file in the archive. Also - includes the internal path of the file, if any. File name matching - is case-insensitive. - - A reader for reading text directly from the packed file. Like any reader - this should be closed/disposed as soon as it is no longer needed. - - - To open an archived text file with different encoding, use the - method and pass the returned stream to one of - the constructor overloads. - - - - - Compresses all files in a directory into the archive. - Does not include subdirectories. - - The directory containing the - files to be included. - - Uses maximum compression level. - - - - - Compresses all files in a directory into the archive, optionally - including subdirectories. - - This parameter may be null, but - if specified it is the root directory - for any relative paths in . - If true, recursively include - files in subdirectories. - The compression level used when creating - the archive. - Handler for receiving progress information; - this may be null if progress is not desired. - - The files are stored in the archive using their relative file paths in - the directory tree, if supported by the archive file format. - - - - - Compresses files into the archive, specifying the names used to - store the files in the archive. - - This parameter may be null, but - if specified it is the root directory - for any relative paths in . - The list of files to be included in - the archive. - The names of the files as they are stored - in the archive. Each name - includes the internal path of the file, if any. This parameter may - be null, in which case the files are stored in the archive with their - source file names and no path information. - - Uses maximum compression level. -

    Duplicate items in the array will cause - an .

    -
    -
    - - - Compresses files into the archive, specifying the names used to - store the files in the archive. - - This parameter may be null, but if - specified it is the root directory - for any relative paths in . - The list of files to be included in - the archive. - The names of the files as they are stored in - the archive. Each name includes the internal path of the file, if any. - This parameter may be null, in which case the files are stored in the - archive with their source file names and no path information. - The compression level used when creating the - archive. - Handler for receiving progress information; - this may be null if progress is not desired. - - Duplicate items in the array will cause - an . - - - - - Compresses files into the archive, specifying the names used - to store the files in the archive. - - This parameter may be null, but if - specified it is the root directory - for any relative paths in . - A mapping from internal file paths to - external file paths. - - Uses maximum compression level. - - - - - Compresses files into the archive, specifying the names used to - store the files in the archive. - - This parameter may be null, but if - specified it is the root directory - for any relative paths in . - A mapping from internal file paths to - external file paths. - The compression level used when creating - the archive. - Handler for receiving progress information; - this may be null if progress is not desired. - - - - Given a directory, gets the relative paths of all files in the - directory, optionally including all subdirectories. - - The directory to search. - True to include subdirectories - in the search. - A list of file paths relative to the directory. - - - - Retrieves information about one file from this archive. - - Path of the file in the archive. - File information, or null if the file was not found - in the archive. - - - - Creates a compression engine that does the low-level work for - this object. - - A new compression engine instance that matches the specific - subclass of archive. - - Each instance will be d - immediately after use. - - - - - Creates a case-insensitive dictionary mapping from one list of - strings to the other. - - List of keys. - List of values that are mapped 1-to-1 to - the keys. - A filled dictionary of the strings. - - - - Recursive-descent helper function for - GetRelativeFilePathsInDirectoryTree. - - The root directory of the search. - The relative directory to be - processed now. - True to descend into - subdirectories. - List of files found so far. - - - - Uses a CompressionEngine to get ArchiveFileInfo objects from this - archive, and then associates them with this ArchiveInfo instance. - - Optional predicate that can determine - which files to process. - A list of objects, each - containing information about a file in the archive. - - - - Gets the directory that contains the archive. - - A DirectoryInfo object representing the parent directory of the - archive. - - - - Gets the full path of the directory that contains the archive. - - The full path of the directory that contains the archive. - - - - Gets the size of the archive. - - The size of the archive in bytes. - - - - Gets the file name of the archive. - - The file name of the archive, not including any path. - - - - Checks if the archive exists. - - True if the archive exists; else false. - - - - Contains the data reported in an archive progress event. - - - - - Creates a new ArchiveProgressEventArgs object from specified event parameters. - - type of status message - name of the file being processed - number of the current file being processed - total number of files to be processed - number of bytes processed so far when compressing or extracting a file - total number of bytes in the current file - name of the current Archive - current Archive number, when processing a chained set of Archives - total number of Archives in a chained set - number of compressed bytes processed so far during an extraction - total number of compressed bytes to be processed during an extraction - number of uncompressed file bytes processed so far - total number of uncompressed file bytes to be processed - - - - Gets the type of status message. - - A value indicating what type of progress event occurred. - - The handler may choose to ignore some types of progress events. - For example, if the handler will only list each file as it is - compressed/extracted, it can ignore events that - are not of type . - - - - - Gets the name of the file being processed. (The name of the file within the Archive; not the external - file path.) Also includes the internal path of the file, if any. Valid for - , , - and messages. - - The name of the file currently being processed, or null if processing - is currently at the stream or archive level. - - - - Gets the number of the current file being processed. The first file is number 0, and the last file - is -1. Valid for , - , and messages. - - The number of the file currently being processed, or the most recent - file processed if processing is currently at the stream or archive level. - - - - Gets the total number of files to be processed. Valid for all message types. - - The total number of files to be processed that are known so far. - - - - Gets the number of bytes processed so far when compressing or extracting a file. Valid for - , , - and messages. - - The number of uncompressed bytes processed so far for the current file, - or 0 if processing is currently at the stream or archive level. - - - - Gets the total number of bytes in the current file. Valid for , - , and messages. - - The uncompressed size of the current file being processed, - or 0 if processing is currently at the stream or archive level. - - - - Gets the name of the current archive. Not necessarily the name of the archive on disk. - Valid for all message types. - - The name of the current archive, or an empty string if no name was specified. - - - - Gets the current archive number, when processing a chained set of archives. Valid for all message types. - - The number of the current archive. - The first archive is number 0, and the last archive is - -1. - - - - Gets the total number of known archives in a chained set. Valid for all message types. - - The total number of known archives in a chained set. - - When using the compression option to auto-split into multiple archives based on data size, - this value will not be accurate until the end. - - - - - Gets the number of compressed bytes processed so far during extraction - of the current archive. Valid for all extraction messages. - - The number of compressed bytes processed so far during extraction - of the current archive. - - - - Gets the total number of compressed bytes to be processed during extraction - of the current archive. Valid for all extraction messages. - - The total number of compressed bytes to be processed during extraction - of the current archive. - - - - Gets the number of uncompressed bytes processed so far among all files. Valid for all message types. - - The number of uncompressed file bytes processed so far among all files. - - When compared to , this can be used as a measure of overall progress. - - - - - Gets the total number of uncompressed file bytes to be processed. Valid for all message types. - - The total number of uncompressed bytes to be processed among all files. - - - - The type of progress event. - - -

    PACKING EXAMPLE: The following sequence of events might be received when - extracting a simple archive file with 2 files.

    - - Message TypeDescription - StartArchive Begin extracting archive - StartFile Begin extracting first file - PartialFile Extracting first file - PartialFile Extracting first file - FinishFile Finished extracting first file - StartFile Begin extracting second file - PartialFile Extracting second file - FinishFile Finished extracting second file - FinishArchiveFinished extracting archive - -

    -

    UNPACKING EXAMPLE: Packing 3 files into 2 archive chunks, where the second file is - continued to the second archive chunk.

    - - Message TypeDescription - StartFile Begin compressing first file - FinishFile Finished compressing first file - StartFile Begin compressing second file - PartialFile Compressing second file - PartialFile Compressing second file - FinishFile Finished compressing second file - StartArchive Begin writing first archive - PartialArchiveWriting first archive - FinishArchive Finished writing first archive - StartFile Begin compressing third file - PartialFile Compressing third file - FinishFile Finished compressing third file - StartArchive Begin writing second archive - PartialArchiveWriting second archive - FinishArchive Finished writing second archive - -
    -
    - - Status message before beginning the packing or unpacking an individual file. - - - Status message (possibly reported multiple times) during the process of packing or unpacking a file. - - - Status message after completion of the packing or unpacking an individual file. - - - Status message before beginning the packing or unpacking an archive. - - - Status message (possibly reported multiple times) during the process of packing or unpacking an archiv. - - - Status message after completion of the packing or unpacking of an archive. - - - - Provides a basic implementation of the archive pack and unpack stream context - interfaces, based on a list of archive files, a default directory, and an - optional mapping from internal to external file paths. - - - This class can also handle creating or extracting chained archive packages. - - - - - This interface provides the methods necessary for the - to open and close streams for archives - and files. The implementor of this interface can use any kind of logic - to determine what kind of streams to open and where. - - - - - Gets the name of the archive with a specified number. - - The 0-based index of the archive - within the chain. - The name of the requested archive. May be an empty string - for non-chained archives, but may never be null. - The archive name is the name stored within the archive, used for - identification of the archive especially among archive chains. That - name is often, but not necessarily the same as the filename of the - archive package. - - - - Opens a stream for writing an archive package. - - The 0-based index of the archive within - the chain. - The name of the archive that was returned - by . - True if the stream should be truncated when - opened (if it already exists); false if an existing stream is being - re-opened for writing additional data. - Instance of the compression engine - doing the operations. - A writable Stream where the compressed archive bytes will be - written, or null to cancel the archive creation. - - If this method returns null, the archive engine will throw a - FileNotFoundException. - - - - - Closes a stream where an archive package was written. - - The 0-based index of the archive within - the chain. - The name of the archive that was previously - returned by - . - A stream that was previously returned by - and is now ready to be closed. - - If there is another archive package in the chain, then after this stream - is closed a new stream will be opened. - - - - - Opens a stream to read a file that is to be included in an archive. - - The path of the file within the archive. This is often, - but not necessarily, the same as the relative path of the file outside - the archive. - Returned attributes of the opened file, to be - stored in the archive. - Returned last-modified time of the opened file, - to be stored in the archive. - A readable Stream where the file bytes will be read from before - they are compressed, or null to skip inclusion of the file and continue to - the next file. - - - - Closes a stream that has been used to read a file. - - The path of the file within the archive; the same as - the path provided - when the stream was opened. - A stream that was previously returned by - and is now ready to be closed. - - - - Gets extended parameter information specific to the compression - format being used. - - Name of the option being requested. - Parameters for the option; for per-file options, - the first parameter is typically the internal file path. - Option value, or null to use the default behavior. - - This method provides a way to set uncommon options during packaging, or a - way to handle aspects of compression formats not supported by the base library. - For example, this may be used by the zip compression library to - specify different compression methods/levels on a per-file basis. - The available option names, parameters, and expected return values - should be documented by each compression library. - - - - - This interface provides the methods necessary for the to open - and close streams for archives and files. The implementor of this interface can use any - kind of logic to determine what kind of streams to open and where - - - - - Opens the archive stream for reading. - - The zero-based index of the archive to open. - The name of the archive being opened. - Instance of the compression engine doing the operations. - A stream from which archive bytes are read, or null to cancel extraction - of the archive. - - When the first archive in a chain is opened, the name is not yet known, so the - provided value will be an empty string. When opening further archives, the - provided value is the next-archive name stored in the previous archive. This - name is often, but not necessarily, the same as the filename of the archive - package to be opened. - If this method returns null, the archive engine will throw a - FileNotFoundException. - - - - - Closes a stream where an archive package was read. - - The archive number of the stream to close. - The name of the archive being closed. - The stream that was previously returned by - and is now ready to be closed. - - - - Opens a stream for writing extracted file bytes. - - The path of the file within the archive. This is often, but - not necessarily, the same as the relative path of the file outside the archive. - The uncompressed size of the file to be extracted. - The last write time of the file to be extracted. - A stream where extracted file bytes are to be written, or null to skip - extraction of the file and continue to the next file. - - The implementor may use the path, size and date information to dynamically - decide whether or not the file should be extracted. - - - - - Closes a stream where an extracted file was written. - - The path of the file within the archive. - The stream that was previously returned by - and is now ready to be closed. - The attributes of the extracted file. - The last write time of the file. - - The implementor may wish to apply the attributes and date to the newly-extracted file. - - - - - Creates a new ArchiveFileStreamContext with a archive file and - no default directory or file mapping. - - The path to a archive file that will be - created or extracted. - - - - Creates a new ArchiveFileStreamContext with a archive file, default - directory and mapping from internal to external file paths. - - The path to a archive file that will be - created or extracted. - The default root directory where files will be - located, optional. - A mapping from internal file paths to external file - paths, optional. - - If the mapping is not null and a file is not included in the mapping, - the file will be skipped. - If the external path in the mapping is a simple file name or - relative file path, it will be concatenated onto the default directory, - if one was specified. - For more about how the default directory and files mapping are - used, see and - . - - - - - Creates a new ArchiveFileStreamContext with a list of archive files, - a default directory and a mapping from internal to external file paths. - - A list of paths to archive files that will be - created or extracted. - The default root directory where files will be - located, optional. - A mapping from internal file paths to external file - paths, optional. - - When creating chained archives, the list - should include at least enough archives to handle the entire set of - input files, based on the maximum archive size that is passed to the - .. - If the mapping is not null and a file is not included in the mapping, - the file will be skipped. - If the external path in the mapping is a simple file name or - relative file path, it will be concatenated onto the default directory, - if one was specified. - For more about how the default directory and files mapping are used, - see and - . - - - - - Gets the name of the archive with a specified number. - - The 0-based index of the archive within - the chain. - The name of the requested archive. May be an empty string - for non-chained archives, but may never be null. - This method returns the file name of the archive from the - list with the specified index, or an empty - string if the archive number is outside the bounds of the list. The - file name should not include any directory path. - - - - Opens a stream for writing an archive. - - The 0-based index of the archive within - the chain. - The name of the archive that was returned - by . - True if the stream should be truncated when - opened (if it already exists); false if an existing stream is being - re-opened for writing additional data. - Instance of the compression engine - doing the operations. - A writable Stream where the compressed archive bytes will be - written, or null to cancel the archive creation. - - This method opens the file from the list - with the specified index. If the archive number is outside the bounds - of the list, this method returns null. - If the flag is set, this method - will seek to the start of any existing archive in the file, or to the - end of the file if the existing file is not an archive. - - - - - Closes a stream where an archive package was written. - - The 0-based index of the archive within - the chain. - The name of the archive that was previously - returned by . - A stream that was previously returned by - and is now ready to be closed. - - - - Opens a stream to read a file that is to be included in an archive. - - The path of the file within the archive. - The returned attributes of the opened file, - to be stored in the archive. - The returned last-modified time of the - opened file, to be stored in the archive. - A readable Stream where the file bytes will be read from - before they are compressed, or null to skip inclusion of the file and - continue to the next file. - - This method opens a file using the following logic: - - If the and the mapping - are both null, the path is treated as relative to the current directory, - and that file is opened. - If the is not null but the - mapping is null, the path is treated as relative to that directory, and - that file is opened. - If the is null but the - mapping is not null, the path parameter is used as a key into the mapping, - and the resulting value is the file path that is opened, relative to the - current directory (or it may be an absolute path). If no mapping exists, - the file is skipped. - If both the and the - mapping are specified, the path parameter is used as a key into the - mapping, and the resulting value is the file path that is opened, relative - to the specified directory (or it may be an absolute path). If no mapping - exists, the file is skipped. - - - - - - Closes a stream that has been used to read a file. - - The path of the file within the archive; the same as - the path provided when the stream was opened. - A stream that was previously returned by - and is now ready to be closed. - - - - Gets extended parameter information specific to the compression format - being used. - - Name of the option being requested. - Parameters for the option; for per-file options, - the first parameter is typically the internal file path. - Option value, or null to use the default behavior. - - This implementation does not handle any options. Subclasses may override - this method to allow for non-default behavior. - - - - - Opens the archive stream for reading. - - The zero-based index of the archive to - open. - The name of the archive being opened. - Instance of the compression engine - doing the operations. - A stream from which archive bytes are read, or null to cancel - extraction of the archive. - - This method opens the file from the list with - the specified index. If the archive number is outside the bounds of the - list, this method returns null. - If the flag is set, this method will - seek to the start of any existing archive in the file, or to the end of - the file if the existing file is not an archive. - - - - - Closes a stream where an archive was read. - - The archive number of the stream - to close. - The name of the archive being closed. - The stream that was previously returned by - and is now ready to be closed. - - - - Opens a stream for writing extracted file bytes. - - The path of the file within the archive. - The uncompressed size of the file to be - extracted. - The last write time of the file to be - extracted. - A stream where extracted file bytes are to be written, or null - to skip extraction of the file and continue to the next file. - - This method opens a file using the following logic: - - If the and the mapping - are both null, the path is treated as relative to the current directory, - and that file is opened. - If the is not null but the - mapping is null, the path is treated as relative to that directory, and - that file is opened. - If the is null but the - mapping is not null, the path parameter is used as a key into the mapping, - and the resulting value is the file path that is opened, relative to the - current directory (or it may be an absolute path). If no mapping exists, - the file is skipped. - If both the and the - mapping are specified, the path parameter is used as a key into the - mapping, and the resulting value is the file path that is opened, - relative to the specified directory (or it may be an absolute path). - If no mapping exists, the file is skipped. - - If the flag is set, the file - is skipped if a file currently exists in the same path with an equal - or newer write time. - - - - - Closes a stream where an extracted file was written. - - The path of the file within the archive. - The stream that was previously returned by - and is now ready to be closed. - The attributes of the extracted file. - The last write time of the file. - - After closing the extracted file stream, this method applies the date - and attributes to that file. - - - - - Translates an internal file path to an external file path using the - and the mapping, according to - rules documented in and - . - - The path of the file with the archive. - The external path of the file, or null if there is no - valid translation. - - - - Gets or sets the list of archive files that are created or extracted. - - The list of archive files that are created or extracted. - - - - Gets or sets the default root directory where files are located. - - The default root directory where files are located. - - For details about how the default directory is used, - see and . - - - - - Gets or sets the mapping from internal file paths to external file paths. - - A mapping from internal file paths to external file paths. - - For details about how the files mapping is used, - see and . - - - - - Gets or sets a flag that can prevent extracted files from overwriting - newer files that already exist. - - True to prevent overwriting newer files that already exist - during extraction; false to always extract from the archive regardless - of existing files. - - - - Gets or sets a flag that enables creating or extracting an archive - at an offset within an existing file. (This is typically used to open - archive-based self-extracting packages.) - - True to search an existing package file for an archive offset - or the end of the file;/ false to always create or open a plain - archive file. - - - - Stream context used to extract a single file from an archive into a memory stream. - - - - - Creates a new BasicExtractStreamContext that reads from the specified archive stream. - - Archive stream to read from. - - - - Opens the archive stream for reading. Returns a DuplicateStream instance, - so the stream may be virtually opened multiple times. - - The archive number to open (ignored; 0 is assumed). - The name of the archive being opened. - Instance of the compression engine doing the operations. - A stream from which archive bytes are read. - - - - Does *not* close the stream. The archive stream should be managed by - the code that invokes the archive extraction. - - The archive number of the stream to close. - The name of the archive being closed. - The stream being closed. - - - - Opens a stream for writing extracted file bytes. The returned stream is a MemoryStream - instance, so the file is extracted straight into memory. - - Path of the file within the archive. - The uncompressed size of the file to be extracted. - The last write time of the file. - A stream where extracted file bytes are to be written. - - - - Does *not* close the file stream. The file stream is saved in memory so it can - be read later. - - Path of the file within the archive. - The file stream to be closed. - The attributes of the extracted file. - The last write time of the file. - - - - Gets the stream for the extracted file, or null if no file was extracted. - - - - - Base class for an engine capable of packing and unpacking a particular - compressed file format. - - - - - Creates a new instance of the compression engine base class. - - - - - Disposes the compression engine. - - - - - Disposes of resources allocated by the compression engine. - - - - - Creates an archive. - - A context interface to handle opening - and closing of archive and file streams. - The paths of the files in the archive - (not external file paths). - The archive could not be - created. - - The stream context implementation may provide a mapping from the - file paths within the archive to the external file paths. - - - - - Creates an archive or chain of archives. - - A context interface to handle opening - and closing of archive and file streams. - The paths of the files in the archive (not - external file paths). - The maximum number of bytes for one - archive before the contents are chained to the next archive, or zero - for unlimited archive size. - The archive could not be - created. - - The stream context implementation may provide a mapping from the file - paths within the archive to the external file paths. - - - - - Checks whether a Stream begins with a header that indicates - it is a valid archive. - - Stream for reading the archive file. - True if the stream is a valid archive - (with no offset); false otherwise. - - - - Gets the offset of an archive that is positioned 0 or more bytes - from the start of the Stream. - - A stream for reading the archive. - The offset in bytes of the archive, - or -1 if no archive is found in the Stream. - The archive must begin on a 4-byte boundary. - - - - Gets information about all files in an archive stream. - - A stream for reading the archive. - Information about all files in the archive stream. - The stream is not a valid - archive. - - - - Gets information about files in an archive or archive chain. - - A context interface to handle opening - and closing of archive and file streams. - A predicate that can determine - which files to process, optional. - Information about files in the archive stream. - The archive provided - by the stream context is not valid. - - The predicate takes an internal file - path and returns true to include the file or false to exclude it. - - - - - Gets the list of files in an archive Stream. - - A stream for reading the archive. - A list of the paths of all files contained in the - archive. - The stream is not a valid - archive. - - - - Gets the list of files in an archive or archive chain. - - A context interface to handle opening - and closing of archive and file streams. - A predicate that can determine - which files to process, optional. - An array containing the names of all files contained in - the archive or archive chain. - The archive provided - by the stream context is not valid. - - The predicate takes an internal file - path and returns true to include the file or false to exclude it. - - - - - Reads a single file from an archive stream. - - A stream for reading the archive. - The path of the file within the archive - (not the external file path). - A stream for reading the extracted file, or null - if the file does not exist in the archive. - The stream is not a valid - archive. - The entire extracted file is cached in memory, so this - method requires enough free memory to hold the file. - - - - Extracts files from an archive or archive chain. - - A context interface to handle opening - and closing of archive and file streams. - An optional predicate that can determine - which files to process. - The archive provided - by the stream context is not valid. - - The predicate takes an internal file - path and returns true to include the file or false to exclude it. - - - - - Called by sublcasses to distribute a packing or unpacking progress - event to listeners. - - Event details. - - - - Disposes of resources allocated by the compression engine. - - If true, the method has been called - directly or indirectly by a user's code, so managed and unmanaged - resources will be disposed. If false, the method has been called by - the runtime from inside the finalizer, and only unmanaged resources - will be disposed. - - - - Compresion utility function for converting old-style - date and time values to a DateTime structure. - - - - - Compresion utility function for converting a DateTime structure - to old-style date and time values. - - - - - Occurs when the compression engine reports progress in packing - or unpacking an archive. - - - - - - Gets or sets a flag indicating whether temporary files are created - and used during compression. - - True if temporary files are used; false if compression is done - entirely in-memory. - The value of this property is true by default. Using temporary - files can greatly reduce the memory requirement of compression, - especially when compressing large archives. However, setting this property - to false may yield slightly better performance when creating small - archives. Or it may be necessary if the process does not have sufficient - privileges to create temporary files. - - - - Compression level to use when compressing files. - - A compression level ranging from minimum to maximum compression, - or no compression. - - - - Specifies the compression level ranging from minimum compresion to - maximum compression, or no compression at all. - - - Although only four values are enumerated, any integral value between - and can also be used. - - - - Do not compress files, only store. - - - Minimum compression; fastest. - - - A compromize between speed and compression efficiency. - - - Maximum compression; slowest. - - - - Wraps a source stream and carries additional items that are disposed when the stream is closed. - - - - - Creates a new a cargo stream. - - source of the stream - List of additional items that are disposed when the stream is closed. - The order of the list is the order in which the items are disposed. - - - - Flushes the source stream. - - - - - Sets the length of the source stream. - - The desired length of the stream in bytes. - - - - Closes the source stream and also closes the additional objects that are carried. - - - - - Reads from the source stream. - - An array of bytes. When this method returns, the buffer - contains the specified byte array with the values between offset and - (offset + count - 1) replaced by the bytes read from the source. - The zero-based byte offset in buffer at which to begin - storing the data read from the stream. - The maximum number of bytes to be read from the stream. - The total number of bytes read into the buffer. This can be less - than the number of bytes requested if that many bytes are not currently available, - or zero (0) if the end of the stream has been reached. - - - - Writes to the source stream. - - An array of bytes. This method copies count - bytes from buffer to the stream. - The zero-based byte offset in buffer at which - to begin copying bytes to the stream. - The number of bytes to be written to the stream. - - - - Changes the position of the source stream. - - A byte offset relative to the origin parameter. - A value of type SeekOrigin indicating the reference - point used to obtain the new position. - The new position within the stream. - - - - Gets the source stream of the cargo stream. - - - - - Gets the list of additional items that are disposed when the stream is closed. - The order of the list is the order in which the items are disposed. The contents can be modified any time. - - - - - Gets a value indicating whether the source stream supports reading. - - true if the stream supports reading; otherwise, false. - - - - Gets a value indicating whether the source stream supports writing. - - true if the stream supports writing; otherwise, false. - - - - Gets a value indicating whether the source stream supports seeking. - - true if the stream supports seeking; otherwise, false. - - - - Gets the length of the source stream. - - - - - Gets or sets the position of the source stream. - - - - - Duplicates a source stream by maintaining a separate position. - - - WARNING: duplicate streams are not thread-safe with respect to each other or the original stream. - If multiple threads use duplicate copies of the same stream, they must synchronize for any operations. - - - - - Creates a new duplicate of a stream. - - source of the duplicate - - - - Retrieves the original stream from a possible duplicate stream. - - Possible duplicate stream. - If the stream is a DuplicateStream, returns - the duplicate's source; otherwise returns the same stream. - - - - Flushes the source stream. - - - - - Sets the length of the source stream. - - The desired length of the stream in bytes. - - - - Closes the underlying stream, effectively closing ALL duplicates. - - - - - Reads from the source stream while maintaining a separate position - and not impacting the source stream's position. - - An array of bytes. When this method returns, the buffer - contains the specified byte array with the values between offset and - (offset + count - 1) replaced by the bytes read from the current source. - The zero-based byte offset in buffer at which to begin - storing the data read from the current stream. - The maximum number of bytes to be read from the current stream. - The total number of bytes read into the buffer. This can be less - than the number of bytes requested if that many bytes are not currently available, - or zero (0) if the end of the stream has been reached. - - - - Writes to the source stream while maintaining a separate position - and not impacting the source stream's position. - - An array of bytes. This method copies count - bytes from buffer to the current stream. - The zero-based byte offset in buffer at which - to begin copying bytes to the current stream. - The number of bytes to be written to the - current stream. - - - - Changes the position of this stream without impacting the - source stream's position. - - A byte offset relative to the origin parameter. - A value of type SeekOrigin indicating the reference - point used to obtain the new position. - The new position within the current stream. - - - - Gets the original stream that was used to create the duplicate. - - - - - Gets a value indicating whether the source stream supports reading. - - true if the stream supports reading; otherwise, false. - - - - Gets a value indicating whether the source stream supports writing. - - true if the stream supports writing; otherwise, false. - - - - Gets a value indicating whether the source stream supports seeking. - - true if the stream supports seeking; otherwise, false. - - - - Gets the length of the source stream. - - - - - Gets or sets the position of the current stream, - ignoring the position of the source stream. - - - - - Wraps a source stream and offsets all read/write/seek calls by a given value. - - - This class is used to trick archive an packing or unpacking process - into reading or writing at an offset into a file, primarily for - self-extracting packages. - - - - - Creates a new OffsetStream instance from a source stream - and using a specified offset. - - Underlying stream for which all calls will be offset. - Positive or negative number of bytes to offset. - - - - Reads a sequence of bytes from the source stream and advances - the position within the stream by the number of bytes read. - - An array of bytes. When this method returns, the buffer - contains the specified byte array with the values between offset and - (offset + count - 1) replaced by the bytes read from the current source. - The zero-based byte offset in buffer at which to begin - storing the data read from the current stream. - The maximum number of bytes to be read from the current stream. - The total number of bytes read into the buffer. This can be less - than the number of bytes requested if that many bytes are not currently available, - or zero (0) if the end of the stream has been reached. - - - - Writes a sequence of bytes to the source stream and advances the - current position within this stream by the number of bytes written. - - An array of bytes. This method copies count - bytes from buffer to the current stream. - The zero-based byte offset in buffer at which - to begin copying bytes to the current stream. - The number of bytes to be written to the - current stream. - - - - Reads a byte from the stream and advances the position within the - source stream by one byte, or returns -1 if at the end of the stream. - - The unsigned byte cast to an Int32, or -1 if at the - end of the stream. - - - - Writes a byte to the current position in the source stream and - advances the position within the stream by one byte. - - The byte to write to the stream. - - - - Flushes the source stream. - - - - - Sets the position within the current stream, which is - equal to the position within the source stream minus the offset. - - A byte offset relative to the origin parameter. - A value of type SeekOrigin indicating - the reference point used to obtain the new position. - The new position within the current stream. - - - - Sets the effective length of the stream, which is equal to - the length of the source stream minus the offset. - - The desired length of the - current stream in bytes. - - - - Closes the underlying stream. - - - - - Gets the underlying stream that this OffsetStream calls into. - - - - - Gets the number of bytes to offset all calls before - redirecting to the underlying stream. - - - - - Gets a value indicating whether the source stream supports reading. - - true if the stream supports reading; otherwise, false. - - - - Gets a value indicating whether the source stream supports writing. - - true if the stream supports writing; otherwise, false. - - - - Gets a value indicating whether the source stream supports seeking. - - true if the stream supports seeking; otherwise, false. - - - - Gets the effective length of the stream, which is equal to - the length of the source stream minus the offset. - - - - - Gets or sets the effective position of the stream, which - is equal to the position of the source stream minus the offset. - - -
    -
    + + + + Microsoft.Deployment.Compression + + + + + Base exception class for compression operations. Compression libraries should + derive subclass exceptions with more specific error information relevent to the + file format. + + + + + Creates a new ArchiveException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new ArchiveException with a specified error message. + + The message that describes the error. + + + + Creates a new ArchiveException. + + + + + Initializes a new instance of the ArchiveException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Abstract object representing a compressed file within an archive; + provides operations for getting the file properties and unpacking + the file. + + + + + Creates a new ArchiveFileInfo object representing a file within + an archive in a specified path. + + An object representing the archive + containing the file. + The path to the file within the archive. + Usually, this is a simple file name, but if the archive contains + a directory structure this may include the directory. + + + + Creates a new ArchiveFileInfo object with all parameters specified; + used by subclasses when reading the metadata out of an archive. + + The internal path and name of the file in + the archive. + The archive number where the file + starts. + The stored attributes of the file. + The stored last write time of the + file. + The uncompressed size of the file. + + + + Initializes a new instance of the ArchiveFileInfo class with + serialized data. + + The SerializationInfo that holds the serialized + object data about the exception being thrown. + The StreamingContext that contains contextual + information about the source or destination. + + + + Sets the SerializationInfo with information about the archive. + + The SerializationInfo that holds the serialized + object data. + The StreamingContext that contains contextual + information about the source or destination. + + + + Gets the full path to the file. + + The same as + + + + Deletes the file. NOT SUPPORTED. + + Files cannot be deleted + from an existing archive. + + + + Refreshes the attributes and other cached information about the file, + by re-reading the information from the archive. + + + + + Extracts the file. + + The destination path where the file + will be extracted. + + + + Extracts the file, optionally overwriting any existing file. + + The destination path where the file + will be extracted. + If true, + will be overwritten if it exists. + is false + and exists. + + + + Opens the archive file for reading without actually extracting the + file to disk. + + + A stream for reading directly from the packed file. Like any stream + this should be closed/disposed as soon as it is no longer needed. + + + + + Opens the archive file reading text with UTF-8 encoding without + actually extracting the file to disk. + + + A reader for reading text directly from the packed file. Like any reader + this should be closed/disposed as soon as it is no longer needed. + + + To open an archived text file with different encoding, use the + method and pass the returned stream to one of + the constructor overloads. + + + + + Refreshes the information in this object with new data retrieved + from an archive. + + Fresh instance for the same file just + read from the archive. + + Subclasses may override this method to refresh sublcass fields. + However they should always call the base implementation first. + + + + + Gets the name of the file. + + The name of the file, not including any path. + + + + Gets the internal path of the file in the archive. + + The internal path of the file in the archive, not including + the file name. + + + + Gets the full path to the file. + + The full path to the file, including the full path to the + archive, the internal path in the archive, and the file name. + + For example, the path "C:\archive.cab\file.txt" refers to + a file "file.txt" inside the archive "archive.cab". + + + + + Gets or sets the archive that contains this file. + + + The ArchiveInfo instance that retrieved this file information -- this + may be null if the ArchiveFileInfo object was returned directly from + a stream. + + + + + Gets the full path of the archive that contains this file. + + The full path of the archive that contains this file. + + + + Gets the number of the archive where this file starts. + + The number of the archive where this file starts. + A single archive or the first archive in a chain is + numbered 0. + + + + Checks if the file exists within the archive. + + True if the file exists, false otherwise. + + + + Gets the uncompressed size of the file. + + The uncompressed size of the file in bytes. + + + + Gets the attributes of the file. + + The attributes of the file as stored in the archive. + + + + Gets the last modification time of the file. + + The last modification time of the file as stored in the + archive. + + + + Abstract object representing a compressed archive on disk; + provides access to file-based operations on the archive. + + + + + Creates a new ArchiveInfo object representing an archive in a + specified path. + + The path to the archive. When creating an archive, + this file does not necessarily exist yet. + + + + Initializes a new instance of the ArchiveInfo class with serialized data. + + The SerializationInfo that holds the serialized object + data about the exception being thrown. + The StreamingContext that contains contextual + information about the source or destination. + + + + Gets the full path of the archive. + + The full path of the archive. + + + + Deletes the archive. + + + + + Copies an existing archive to another location. + + The destination file path. + + + + Copies an existing archive to another location, optionally + overwriting the destination file. + + The destination file path. + If true, the destination file will be + overwritten if it exists. + + + + Moves an existing archive to another location. + + The destination file path. + + + + Checks if the archive contains a valid archive header. + + True if the file is a valid archive; false otherwise. + + + + Gets information about the files contained in the archive. + + A list of objects, each + containing information about a file in the archive. + + + + Gets information about the certain files contained in the archive file. + + The search string, such as + "*.txt". + A list of objects, each containing + information about a file in the archive. + + + + Extracts all files from an archive to a destination directory. + + Directory where the files are to be + extracted. + + + + Extracts all files from an archive to a destination directory, + optionally extracting only newer files. + + Directory where the files are to be + extracted. + Handler for receiving progress + information; this may be null if progress is not desired. + + + + Extracts a single file from the archive. + + The name of the file in the archive. Also + includes the internal path of the file, if any. File name matching + is case-insensitive. + The path where the file is to be + extracted on disk. + If already exists, + it will be overwritten. + + + + Extracts multiple files from the archive. + + The names of the files in the archive. + Each name includes the internal path of the file, if any. File name + matching is case-insensitive. + This parameter may be null, but if + specified it is the root directory for any relative paths in + . + The paths where the files are to be + extracted on disk. If this parameter is null, the files will be + extracted with the names from the archive. + + If any extracted files already exist on disk, they will be overwritten. +

    The and + parameters cannot both be null.

    +
    +
    + + + Extracts multiple files from the archive, optionally extracting + only newer files. + + The names of the files in the archive. + Each name includes the internal path of the file, if any. File name + matching is case-insensitive. + This parameter may be null, but if + specified it is the root directory for any relative paths in + . + The paths where the files are to be + extracted on disk. If this parameter is null, the files will be + extracted with the names from the archive. + Handler for receiving progress information; + this may be null if progress is not desired. + + If any extracted files already exist on disk, they will be overwritten. +

    The and + parameters cannot both be null.

    +
    +
    + + + Extracts multiple files from the archive. + + A mapping from internal file paths to + external file paths. Case-senstivity when matching internal paths + depends on the IDictionary implementation. + This parameter may be null, but if + specified it is the root directory for any relative external paths + in . + + If any extracted files already exist on disk, they will be overwritten. + + + + + Extracts multiple files from the archive. + + A mapping from internal file paths to + external file paths. Case-senstivity when matching internal + paths depends on the IDictionary implementation. + This parameter may be null, but if + specified it is the root directory for any relative external + paths in . + Handler for receiving progress + information; this may be null if progress is not desired. + + If any extracted files already exist on disk, they will be overwritten. + + + + + Opens a file inside the archive for reading without actually + extracting the file to disk. + + The name of the file in the archive. Also + includes the internal path of the file, if any. File name matching + is case-insensitive. + + A stream for reading directly from the packed file. Like any stream + this should be closed/disposed as soon as it is no longer needed. + + + + + Opens a file inside the archive for reading text with UTF-8 encoding + without actually extracting the file to disk. + + The name of the file in the archive. Also + includes the internal path of the file, if any. File name matching + is case-insensitive. + + A reader for reading text directly from the packed file. Like any reader + this should be closed/disposed as soon as it is no longer needed. + + + To open an archived text file with different encoding, use the + method and pass the returned stream to one of + the constructor overloads. + + + + + Compresses all files in a directory into the archive. + Does not include subdirectories. + + The directory containing the + files to be included. + + Uses maximum compression level. + + + + + Compresses all files in a directory into the archive, optionally + including subdirectories. + + This parameter may be null, but + if specified it is the root directory + for any relative paths in . + If true, recursively include + files in subdirectories. + The compression level used when creating + the archive. + Handler for receiving progress information; + this may be null if progress is not desired. + + The files are stored in the archive using their relative file paths in + the directory tree, if supported by the archive file format. + + + + + Compresses files into the archive, specifying the names used to + store the files in the archive. + + This parameter may be null, but + if specified it is the root directory + for any relative paths in . + The list of files to be included in + the archive. + The names of the files as they are stored + in the archive. Each name + includes the internal path of the file, if any. This parameter may + be null, in which case the files are stored in the archive with their + source file names and no path information. + + Uses maximum compression level. +

    Duplicate items in the array will cause + an .

    +
    +
    + + + Compresses files into the archive, specifying the names used to + store the files in the archive. + + This parameter may be null, but if + specified it is the root directory + for any relative paths in . + The list of files to be included in + the archive. + The names of the files as they are stored in + the archive. Each name includes the internal path of the file, if any. + This parameter may be null, in which case the files are stored in the + archive with their source file names and no path information. + The compression level used when creating the + archive. + Handler for receiving progress information; + this may be null if progress is not desired. + + Duplicate items in the array will cause + an . + + + + + Compresses files into the archive, specifying the names used + to store the files in the archive. + + This parameter may be null, but if + specified it is the root directory + for any relative paths in . + A mapping from internal file paths to + external file paths. + + Uses maximum compression level. + + + + + Compresses files into the archive, specifying the names used to + store the files in the archive. + + This parameter may be null, but if + specified it is the root directory + for any relative paths in . + A mapping from internal file paths to + external file paths. + The compression level used when creating + the archive. + Handler for receiving progress information; + this may be null if progress is not desired. + + + + Given a directory, gets the relative paths of all files in the + directory, optionally including all subdirectories. + + The directory to search. + True to include subdirectories + in the search. + A list of file paths relative to the directory. + + + + Retrieves information about one file from this archive. + + Path of the file in the archive. + File information, or null if the file was not found + in the archive. + + + + Creates a compression engine that does the low-level work for + this object. + + A new compression engine instance that matches the specific + subclass of archive. + + Each instance will be d + immediately after use. + + + + + Creates a case-insensitive dictionary mapping from one list of + strings to the other. + + List of keys. + List of values that are mapped 1-to-1 to + the keys. + A filled dictionary of the strings. + + + + Recursive-descent helper function for + GetRelativeFilePathsInDirectoryTree. + + The root directory of the search. + The relative directory to be + processed now. + True to descend into + subdirectories. + List of files found so far. + + + + Uses a CompressionEngine to get ArchiveFileInfo objects from this + archive, and then associates them with this ArchiveInfo instance. + + Optional predicate that can determine + which files to process. + A list of objects, each + containing information about a file in the archive. + + + + Gets the directory that contains the archive. + + A DirectoryInfo object representing the parent directory of the + archive. + + + + Gets the full path of the directory that contains the archive. + + The full path of the directory that contains the archive. + + + + Gets the size of the archive. + + The size of the archive in bytes. + + + + Gets the file name of the archive. + + The file name of the archive, not including any path. + + + + Checks if the archive exists. + + True if the archive exists; else false. + + + + Contains the data reported in an archive progress event. + + + + + Creates a new ArchiveProgressEventArgs object from specified event parameters. + + type of status message + name of the file being processed + number of the current file being processed + total number of files to be processed + number of bytes processed so far when compressing or extracting a file + total number of bytes in the current file + name of the current Archive + current Archive number, when processing a chained set of Archives + total number of Archives in a chained set + number of compressed bytes processed so far during an extraction + total number of compressed bytes to be processed during an extraction + number of uncompressed file bytes processed so far + total number of uncompressed file bytes to be processed + + + + Gets the type of status message. + + A value indicating what type of progress event occurred. + + The handler may choose to ignore some types of progress events. + For example, if the handler will only list each file as it is + compressed/extracted, it can ignore events that + are not of type . + + + + + Gets the name of the file being processed. (The name of the file within the Archive; not the external + file path.) Also includes the internal path of the file, if any. Valid for + , , + and messages. + + The name of the file currently being processed, or null if processing + is currently at the stream or archive level. + + + + Gets the number of the current file being processed. The first file is number 0, and the last file + is -1. Valid for , + , and messages. + + The number of the file currently being processed, or the most recent + file processed if processing is currently at the stream or archive level. + + + + Gets the total number of files to be processed. Valid for all message types. + + The total number of files to be processed that are known so far. + + + + Gets the number of bytes processed so far when compressing or extracting a file. Valid for + , , + and messages. + + The number of uncompressed bytes processed so far for the current file, + or 0 if processing is currently at the stream or archive level. + + + + Gets the total number of bytes in the current file. Valid for , + , and messages. + + The uncompressed size of the current file being processed, + or 0 if processing is currently at the stream or archive level. + + + + Gets the name of the current archive. Not necessarily the name of the archive on disk. + Valid for all message types. + + The name of the current archive, or an empty string if no name was specified. + + + + Gets the current archive number, when processing a chained set of archives. Valid for all message types. + + The number of the current archive. + The first archive is number 0, and the last archive is + -1. + + + + Gets the total number of known archives in a chained set. Valid for all message types. + + The total number of known archives in a chained set. + + When using the compression option to auto-split into multiple archives based on data size, + this value will not be accurate until the end. + + + + + Gets the number of compressed bytes processed so far during extraction + of the current archive. Valid for all extraction messages. + + The number of compressed bytes processed so far during extraction + of the current archive. + + + + Gets the total number of compressed bytes to be processed during extraction + of the current archive. Valid for all extraction messages. + + The total number of compressed bytes to be processed during extraction + of the current archive. + + + + Gets the number of uncompressed bytes processed so far among all files. Valid for all message types. + + The number of uncompressed file bytes processed so far among all files. + + When compared to , this can be used as a measure of overall progress. + + + + + Gets the total number of uncompressed file bytes to be processed. Valid for all message types. + + The total number of uncompressed bytes to be processed among all files. + + + + The type of progress event. + + +

    PACKING EXAMPLE: The following sequence of events might be received when + extracting a simple archive file with 2 files.

    + + Message TypeDescription + StartArchive Begin extracting archive + StartFile Begin extracting first file + PartialFile Extracting first file + PartialFile Extracting first file + FinishFile Finished extracting first file + StartFile Begin extracting second file + PartialFile Extracting second file + FinishFile Finished extracting second file + FinishArchiveFinished extracting archive + +

    +

    UNPACKING EXAMPLE: Packing 3 files into 2 archive chunks, where the second file is + continued to the second archive chunk.

    + + Message TypeDescription + StartFile Begin compressing first file + FinishFile Finished compressing first file + StartFile Begin compressing second file + PartialFile Compressing second file + PartialFile Compressing second file + FinishFile Finished compressing second file + StartArchive Begin writing first archive + PartialArchiveWriting first archive + FinishArchive Finished writing first archive + StartFile Begin compressing third file + PartialFile Compressing third file + FinishFile Finished compressing third file + StartArchive Begin writing second archive + PartialArchiveWriting second archive + FinishArchive Finished writing second archive + +
    +
    + + Status message before beginning the packing or unpacking an individual file. + + + Status message (possibly reported multiple times) during the process of packing or unpacking a file. + + + Status message after completion of the packing or unpacking an individual file. + + + Status message before beginning the packing or unpacking an archive. + + + Status message (possibly reported multiple times) during the process of packing or unpacking an archiv. + + + Status message after completion of the packing or unpacking of an archive. + + + + Provides a basic implementation of the archive pack and unpack stream context + interfaces, based on a list of archive files, a default directory, and an + optional mapping from internal to external file paths. + + + This class can also handle creating or extracting chained archive packages. + + + + + This interface provides the methods necessary for the + to open and close streams for archives + and files. The implementor of this interface can use any kind of logic + to determine what kind of streams to open and where. + + + + + Gets the name of the archive with a specified number. + + The 0-based index of the archive + within the chain. + The name of the requested archive. May be an empty string + for non-chained archives, but may never be null. + The archive name is the name stored within the archive, used for + identification of the archive especially among archive chains. That + name is often, but not necessarily the same as the filename of the + archive package. + + + + Opens a stream for writing an archive package. + + The 0-based index of the archive within + the chain. + The name of the archive that was returned + by . + True if the stream should be truncated when + opened (if it already exists); false if an existing stream is being + re-opened for writing additional data. + Instance of the compression engine + doing the operations. + A writable Stream where the compressed archive bytes will be + written, or null to cancel the archive creation. + + If this method returns null, the archive engine will throw a + FileNotFoundException. + + + + + Closes a stream where an archive package was written. + + The 0-based index of the archive within + the chain. + The name of the archive that was previously + returned by + . + A stream that was previously returned by + and is now ready to be closed. + + If there is another archive package in the chain, then after this stream + is closed a new stream will be opened. + + + + + Opens a stream to read a file that is to be included in an archive. + + The path of the file within the archive. This is often, + but not necessarily, the same as the relative path of the file outside + the archive. + Returned attributes of the opened file, to be + stored in the archive. + Returned last-modified time of the opened file, + to be stored in the archive. + A readable Stream where the file bytes will be read from before + they are compressed, or null to skip inclusion of the file and continue to + the next file. + + + + Closes a stream that has been used to read a file. + + The path of the file within the archive; the same as + the path provided + when the stream was opened. + A stream that was previously returned by + and is now ready to be closed. + + + + Gets extended parameter information specific to the compression + format being used. + + Name of the option being requested. + Parameters for the option; for per-file options, + the first parameter is typically the internal file path. + Option value, or null to use the default behavior. + + This method provides a way to set uncommon options during packaging, or a + way to handle aspects of compression formats not supported by the base library. + For example, this may be used by the zip compression library to + specify different compression methods/levels on a per-file basis. + The available option names, parameters, and expected return values + should be documented by each compression library. + + + + + This interface provides the methods necessary for the to open + and close streams for archives and files. The implementor of this interface can use any + kind of logic to determine what kind of streams to open and where + + + + + Opens the archive stream for reading. + + The zero-based index of the archive to open. + The name of the archive being opened. + Instance of the compression engine doing the operations. + A stream from which archive bytes are read, or null to cancel extraction + of the archive. + + When the first archive in a chain is opened, the name is not yet known, so the + provided value will be an empty string. When opening further archives, the + provided value is the next-archive name stored in the previous archive. This + name is often, but not necessarily, the same as the filename of the archive + package to be opened. + If this method returns null, the archive engine will throw a + FileNotFoundException. + + + + + Closes a stream where an archive package was read. + + The archive number of the stream to close. + The name of the archive being closed. + The stream that was previously returned by + and is now ready to be closed. + + + + Opens a stream for writing extracted file bytes. + + The path of the file within the archive. This is often, but + not necessarily, the same as the relative path of the file outside the archive. + The uncompressed size of the file to be extracted. + The last write time of the file to be extracted. + A stream where extracted file bytes are to be written, or null to skip + extraction of the file and continue to the next file. + + The implementor may use the path, size and date information to dynamically + decide whether or not the file should be extracted. + + + + + Closes a stream where an extracted file was written. + + The path of the file within the archive. + The stream that was previously returned by + and is now ready to be closed. + The attributes of the extracted file. + The last write time of the file. + + The implementor may wish to apply the attributes and date to the newly-extracted file. + + + + + Creates a new ArchiveFileStreamContext with a archive file and + no default directory or file mapping. + + The path to a archive file that will be + created or extracted. + + + + Creates a new ArchiveFileStreamContext with a archive file, default + directory and mapping from internal to external file paths. + + The path to a archive file that will be + created or extracted. + The default root directory where files will be + located, optional. + A mapping from internal file paths to external file + paths, optional. + + If the mapping is not null and a file is not included in the mapping, + the file will be skipped. + If the external path in the mapping is a simple file name or + relative file path, it will be concatenated onto the default directory, + if one was specified. + For more about how the default directory and files mapping are + used, see and + . + + + + + Creates a new ArchiveFileStreamContext with a list of archive files, + a default directory and a mapping from internal to external file paths. + + A list of paths to archive files that will be + created or extracted. + The default root directory where files will be + located, optional. + A mapping from internal file paths to external file + paths, optional. + + When creating chained archives, the list + should include at least enough archives to handle the entire set of + input files, based on the maximum archive size that is passed to the + .. + If the mapping is not null and a file is not included in the mapping, + the file will be skipped. + If the external path in the mapping is a simple file name or + relative file path, it will be concatenated onto the default directory, + if one was specified. + For more about how the default directory and files mapping are used, + see and + . + + + + + Gets the name of the archive with a specified number. + + The 0-based index of the archive within + the chain. + The name of the requested archive. May be an empty string + for non-chained archives, but may never be null. + This method returns the file name of the archive from the + list with the specified index, or an empty + string if the archive number is outside the bounds of the list. The + file name should not include any directory path. + + + + Opens a stream for writing an archive. + + The 0-based index of the archive within + the chain. + The name of the archive that was returned + by . + True if the stream should be truncated when + opened (if it already exists); false if an existing stream is being + re-opened for writing additional data. + Instance of the compression engine + doing the operations. + A writable Stream where the compressed archive bytes will be + written, or null to cancel the archive creation. + + This method opens the file from the list + with the specified index. If the archive number is outside the bounds + of the list, this method returns null. + If the flag is set, this method + will seek to the start of any existing archive in the file, or to the + end of the file if the existing file is not an archive. + + + + + Closes a stream where an archive package was written. + + The 0-based index of the archive within + the chain. + The name of the archive that was previously + returned by . + A stream that was previously returned by + and is now ready to be closed. + + + + Opens a stream to read a file that is to be included in an archive. + + The path of the file within the archive. + The returned attributes of the opened file, + to be stored in the archive. + The returned last-modified time of the + opened file, to be stored in the archive. + A readable Stream where the file bytes will be read from + before they are compressed, or null to skip inclusion of the file and + continue to the next file. + + This method opens a file using the following logic: + + If the and the mapping + are both null, the path is treated as relative to the current directory, + and that file is opened. + If the is not null but the + mapping is null, the path is treated as relative to that directory, and + that file is opened. + If the is null but the + mapping is not null, the path parameter is used as a key into the mapping, + and the resulting value is the file path that is opened, relative to the + current directory (or it may be an absolute path). If no mapping exists, + the file is skipped. + If both the and the + mapping are specified, the path parameter is used as a key into the + mapping, and the resulting value is the file path that is opened, relative + to the specified directory (or it may be an absolute path). If no mapping + exists, the file is skipped. + + + + + + Closes a stream that has been used to read a file. + + The path of the file within the archive; the same as + the path provided when the stream was opened. + A stream that was previously returned by + and is now ready to be closed. + + + + Gets extended parameter information specific to the compression format + being used. + + Name of the option being requested. + Parameters for the option; for per-file options, + the first parameter is typically the internal file path. + Option value, or null to use the default behavior. + + This implementation does not handle any options. Subclasses may override + this method to allow for non-default behavior. + + + + + Opens the archive stream for reading. + + The zero-based index of the archive to + open. + The name of the archive being opened. + Instance of the compression engine + doing the operations. + A stream from which archive bytes are read, or null to cancel + extraction of the archive. + + This method opens the file from the list with + the specified index. If the archive number is outside the bounds of the + list, this method returns null. + If the flag is set, this method will + seek to the start of any existing archive in the file, or to the end of + the file if the existing file is not an archive. + + + + + Closes a stream where an archive was read. + + The archive number of the stream + to close. + The name of the archive being closed. + The stream that was previously returned by + and is now ready to be closed. + + + + Opens a stream for writing extracted file bytes. + + The path of the file within the archive. + The uncompressed size of the file to be + extracted. + The last write time of the file to be + extracted. + A stream where extracted file bytes are to be written, or null + to skip extraction of the file and continue to the next file. + + This method opens a file using the following logic: + + If the and the mapping + are both null, the path is treated as relative to the current directory, + and that file is opened. + If the is not null but the + mapping is null, the path is treated as relative to that directory, and + that file is opened. + If the is null but the + mapping is not null, the path parameter is used as a key into the mapping, + and the resulting value is the file path that is opened, relative to the + current directory (or it may be an absolute path). If no mapping exists, + the file is skipped. + If both the and the + mapping are specified, the path parameter is used as a key into the + mapping, and the resulting value is the file path that is opened, + relative to the specified directory (or it may be an absolute path). + If no mapping exists, the file is skipped. + + If the flag is set, the file + is skipped if a file currently exists in the same path with an equal + or newer write time. + + + + + Closes a stream where an extracted file was written. + + The path of the file within the archive. + The stream that was previously returned by + and is now ready to be closed. + The attributes of the extracted file. + The last write time of the file. + + After closing the extracted file stream, this method applies the date + and attributes to that file. + + + + + Translates an internal file path to an external file path using the + and the mapping, according to + rules documented in and + . + + The path of the file with the archive. + The external path of the file, or null if there is no + valid translation. + + + + Gets or sets the list of archive files that are created or extracted. + + The list of archive files that are created or extracted. + + + + Gets or sets the default root directory where files are located. + + The default root directory where files are located. + + For details about how the default directory is used, + see and . + + + + + Gets or sets the mapping from internal file paths to external file paths. + + A mapping from internal file paths to external file paths. + + For details about how the files mapping is used, + see and . + + + + + Gets or sets a flag that can prevent extracted files from overwriting + newer files that already exist. + + True to prevent overwriting newer files that already exist + during extraction; false to always extract from the archive regardless + of existing files. + + + + Gets or sets a flag that enables creating or extracting an archive + at an offset within an existing file. (This is typically used to open + archive-based self-extracting packages.) + + True to search an existing package file for an archive offset + or the end of the file;/ false to always create or open a plain + archive file. + + + + Stream context used to extract a single file from an archive into a memory stream. + + + + + Creates a new BasicExtractStreamContext that reads from the specified archive stream. + + Archive stream to read from. + + + + Opens the archive stream for reading. Returns a DuplicateStream instance, + so the stream may be virtually opened multiple times. + + The archive number to open (ignored; 0 is assumed). + The name of the archive being opened. + Instance of the compression engine doing the operations. + A stream from which archive bytes are read. + + + + Does *not* close the stream. The archive stream should be managed by + the code that invokes the archive extraction. + + The archive number of the stream to close. + The name of the archive being closed. + The stream being closed. + + + + Opens a stream for writing extracted file bytes. The returned stream is a MemoryStream + instance, so the file is extracted straight into memory. + + Path of the file within the archive. + The uncompressed size of the file to be extracted. + The last write time of the file. + A stream where extracted file bytes are to be written. + + + + Does *not* close the file stream. The file stream is saved in memory so it can + be read later. + + Path of the file within the archive. + The file stream to be closed. + The attributes of the extracted file. + The last write time of the file. + + + + Gets the stream for the extracted file, or null if no file was extracted. + + + + + Base class for an engine capable of packing and unpacking a particular + compressed file format. + + + + + Creates a new instance of the compression engine base class. + + + + + Disposes the compression engine. + + + + + Disposes of resources allocated by the compression engine. + + + + + Creates an archive. + + A context interface to handle opening + and closing of archive and file streams. + The paths of the files in the archive + (not external file paths). + The archive could not be + created. + + The stream context implementation may provide a mapping from the + file paths within the archive to the external file paths. + + + + + Creates an archive or chain of archives. + + A context interface to handle opening + and closing of archive and file streams. + The paths of the files in the archive (not + external file paths). + The maximum number of bytes for one + archive before the contents are chained to the next archive, or zero + for unlimited archive size. + The archive could not be + created. + + The stream context implementation may provide a mapping from the file + paths within the archive to the external file paths. + + + + + Checks whether a Stream begins with a header that indicates + it is a valid archive. + + Stream for reading the archive file. + True if the stream is a valid archive + (with no offset); false otherwise. + + + + Gets the offset of an archive that is positioned 0 or more bytes + from the start of the Stream. + + A stream for reading the archive. + The offset in bytes of the archive, + or -1 if no archive is found in the Stream. + The archive must begin on a 4-byte boundary. + + + + Gets information about all files in an archive stream. + + A stream for reading the archive. + Information about all files in the archive stream. + The stream is not a valid + archive. + + + + Gets information about files in an archive or archive chain. + + A context interface to handle opening + and closing of archive and file streams. + A predicate that can determine + which files to process, optional. + Information about files in the archive stream. + The archive provided + by the stream context is not valid. + + The predicate takes an internal file + path and returns true to include the file or false to exclude it. + + + + + Gets the list of files in an archive Stream. + + A stream for reading the archive. + A list of the paths of all files contained in the + archive. + The stream is not a valid + archive. + + + + Gets the list of files in an archive or archive chain. + + A context interface to handle opening + and closing of archive and file streams. + A predicate that can determine + which files to process, optional. + An array containing the names of all files contained in + the archive or archive chain. + The archive provided + by the stream context is not valid. + + The predicate takes an internal file + path and returns true to include the file or false to exclude it. + + + + + Reads a single file from an archive stream. + + A stream for reading the archive. + The path of the file within the archive + (not the external file path). + A stream for reading the extracted file, or null + if the file does not exist in the archive. + The stream is not a valid + archive. + The entire extracted file is cached in memory, so this + method requires enough free memory to hold the file. + + + + Extracts files from an archive or archive chain. + + A context interface to handle opening + and closing of archive and file streams. + An optional predicate that can determine + which files to process. + The archive provided + by the stream context is not valid. + + The predicate takes an internal file + path and returns true to include the file or false to exclude it. + + + + + Called by sublcasses to distribute a packing or unpacking progress + event to listeners. + + Event details. + + + + Disposes of resources allocated by the compression engine. + + If true, the method has been called + directly or indirectly by a user's code, so managed and unmanaged + resources will be disposed. If false, the method has been called by + the runtime from inside the finalizer, and only unmanaged resources + will be disposed. + + + + Compresion utility function for converting old-style + date and time values to a DateTime structure. + + + + + Compresion utility function for converting a DateTime structure + to old-style date and time values. + + + + + Occurs when the compression engine reports progress in packing + or unpacking an archive. + + + + + + Gets or sets a flag indicating whether temporary files are created + and used during compression. + + True if temporary files are used; false if compression is done + entirely in-memory. + The value of this property is true by default. Using temporary + files can greatly reduce the memory requirement of compression, + especially when compressing large archives. However, setting this property + to false may yield slightly better performance when creating small + archives. Or it may be necessary if the process does not have sufficient + privileges to create temporary files. + + + + Compression level to use when compressing files. + + A compression level ranging from minimum to maximum compression, + or no compression. + + + + Specifies the compression level ranging from minimum compresion to + maximum compression, or no compression at all. + + + Although only four values are enumerated, any integral value between + and can also be used. + + + + Do not compress files, only store. + + + Minimum compression; fastest. + + + A compromize between speed and compression efficiency. + + + Maximum compression; slowest. + + + + Wraps a source stream and carries additional items that are disposed when the stream is closed. + + + + + Creates a new a cargo stream. + + source of the stream + List of additional items that are disposed when the stream is closed. + The order of the list is the order in which the items are disposed. + + + + Flushes the source stream. + + + + + Sets the length of the source stream. + + The desired length of the stream in bytes. + + + + Closes the source stream and also closes the additional objects that are carried. + + + + + Reads from the source stream. + + An array of bytes. When this method returns, the buffer + contains the specified byte array with the values between offset and + (offset + count - 1) replaced by the bytes read from the source. + The zero-based byte offset in buffer at which to begin + storing the data read from the stream. + The maximum number of bytes to be read from the stream. + The total number of bytes read into the buffer. This can be less + than the number of bytes requested if that many bytes are not currently available, + or zero (0) if the end of the stream has been reached. + + + + Writes to the source stream. + + An array of bytes. This method copies count + bytes from buffer to the stream. + The zero-based byte offset in buffer at which + to begin copying bytes to the stream. + The number of bytes to be written to the stream. + + + + Changes the position of the source stream. + + A byte offset relative to the origin parameter. + A value of type SeekOrigin indicating the reference + point used to obtain the new position. + The new position within the stream. + + + + Gets the source stream of the cargo stream. + + + + + Gets the list of additional items that are disposed when the stream is closed. + The order of the list is the order in which the items are disposed. The contents can be modified any time. + + + + + Gets a value indicating whether the source stream supports reading. + + true if the stream supports reading; otherwise, false. + + + + Gets a value indicating whether the source stream supports writing. + + true if the stream supports writing; otherwise, false. + + + + Gets a value indicating whether the source stream supports seeking. + + true if the stream supports seeking; otherwise, false. + + + + Gets the length of the source stream. + + + + + Gets or sets the position of the source stream. + + + + + Duplicates a source stream by maintaining a separate position. + + + WARNING: duplicate streams are not thread-safe with respect to each other or the original stream. + If multiple threads use duplicate copies of the same stream, they must synchronize for any operations. + + + + + Creates a new duplicate of a stream. + + source of the duplicate + + + + Retrieves the original stream from a possible duplicate stream. + + Possible duplicate stream. + If the stream is a DuplicateStream, returns + the duplicate's source; otherwise returns the same stream. + + + + Flushes the source stream. + + + + + Sets the length of the source stream. + + The desired length of the stream in bytes. + + + + Closes the underlying stream, effectively closing ALL duplicates. + + + + + Reads from the source stream while maintaining a separate position + and not impacting the source stream's position. + + An array of bytes. When this method returns, the buffer + contains the specified byte array with the values between offset and + (offset + count - 1) replaced by the bytes read from the current source. + The zero-based byte offset in buffer at which to begin + storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + The total number of bytes read into the buffer. This can be less + than the number of bytes requested if that many bytes are not currently available, + or zero (0) if the end of the stream has been reached. + + + + Writes to the source stream while maintaining a separate position + and not impacting the source stream's position. + + An array of bytes. This method copies count + bytes from buffer to the current stream. + The zero-based byte offset in buffer at which + to begin copying bytes to the current stream. + The number of bytes to be written to the + current stream. + + + + Changes the position of this stream without impacting the + source stream's position. + + A byte offset relative to the origin parameter. + A value of type SeekOrigin indicating the reference + point used to obtain the new position. + The new position within the current stream. + + + + Gets the original stream that was used to create the duplicate. + + + + + Gets a value indicating whether the source stream supports reading. + + true if the stream supports reading; otherwise, false. + + + + Gets a value indicating whether the source stream supports writing. + + true if the stream supports writing; otherwise, false. + + + + Gets a value indicating whether the source stream supports seeking. + + true if the stream supports seeking; otherwise, false. + + + + Gets the length of the source stream. + + + + + Gets or sets the position of the current stream, + ignoring the position of the source stream. + + + + + Wraps a source stream and offsets all read/write/seek calls by a given value. + + + This class is used to trick archive an packing or unpacking process + into reading or writing at an offset into a file, primarily for + self-extracting packages. + + + + + Creates a new OffsetStream instance from a source stream + and using a specified offset. + + Underlying stream for which all calls will be offset. + Positive or negative number of bytes to offset. + + + + Reads a sequence of bytes from the source stream and advances + the position within the stream by the number of bytes read. + + An array of bytes. When this method returns, the buffer + contains the specified byte array with the values between offset and + (offset + count - 1) replaced by the bytes read from the current source. + The zero-based byte offset in buffer at which to begin + storing the data read from the current stream. + The maximum number of bytes to be read from the current stream. + The total number of bytes read into the buffer. This can be less + than the number of bytes requested if that many bytes are not currently available, + or zero (0) if the end of the stream has been reached. + + + + Writes a sequence of bytes to the source stream and advances the + current position within this stream by the number of bytes written. + + An array of bytes. This method copies count + bytes from buffer to the current stream. + The zero-based byte offset in buffer at which + to begin copying bytes to the current stream. + The number of bytes to be written to the + current stream. + + + + Reads a byte from the stream and advances the position within the + source stream by one byte, or returns -1 if at the end of the stream. + + The unsigned byte cast to an Int32, or -1 if at the + end of the stream. + + + + Writes a byte to the current position in the source stream and + advances the position within the stream by one byte. + + The byte to write to the stream. + + + + Flushes the source stream. + + + + + Sets the position within the current stream, which is + equal to the position within the source stream minus the offset. + + A byte offset relative to the origin parameter. + A value of type SeekOrigin indicating + the reference point used to obtain the new position. + The new position within the current stream. + + + + Sets the effective length of the stream, which is equal to + the length of the source stream minus the offset. + + The desired length of the + current stream in bytes. + + + + Closes the underlying stream. + + + + + Gets the underlying stream that this OffsetStream calls into. + + + + + Gets the number of bytes to offset all calls before + redirecting to the underlying stream. + + + + + Gets a value indicating whether the source stream supports reading. + + true if the stream supports reading; otherwise, false. + + + + Gets a value indicating whether the source stream supports writing. + + true if the stream supports writing; otherwise, false. + + + + Gets a value indicating whether the source stream supports seeking. + + true if the stream supports seeking; otherwise, false. + + + + Gets the effective length of the stream, which is equal to + the length of the source stream minus the offset. + + + + + Gets or sets the effective position of the stream, which + is equal to the position of the source stream minus the offset. + + +
    +
    diff --git a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Resources.xml b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Resources.xml index 2059d5d4ab..3d4b628ce1 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Resources.xml +++ b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.Resources.xml @@ -1,443 +1,443 @@ - - - - Microsoft.Deployment.Resources - - - - - Represents a Win32 resource which can be loaded from and saved to a PE file. - - - - - Creates a new Resource object without any data. The data can be later loaded from a file. - - Type of the resource; may be one of the ResourceType constants or a user-defined type. - Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". - Locale of the resource - - - - Creates a new Resource object with data. The data can be later saved to a file. - - Type of the resource; may be one of the ResourceType constants or a user-defined type. - Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". - Locale of the resource - Raw resource data - - - - Loads the resource data from a file. The file is searched for a resource with matching type, name, and locale. - - Win32 PE file containing the resource - - - - Saves the resource to a file. Any existing resource data with matching type, name, and locale is overwritten. - - Win32 PE file to contain the resource - - - - Tests if type, name, and locale of this Resource object match another Resource object. - - Resource object to be compared - True if the objects represent the same resource; false otherwise. - - - - Gets a hash code for this Resource object. - - Hash code generated from the resource type, name, and locale. - - - - Gets or sets the type of the resource. This may be one of the ResourceType constants - or a user-defined type name. - - - - - Gets or sets the name of the resource. For a numeric resource identifier, the decimal number is prefixed with a "#". - - - - - Gets or sets the locale of the resource. - - - - - Gets or sets the raw data of the resource. - - - - - Allows reading and editing of resource data in a Win32 PE file. - - - To use this class: - Create a new ResourceCollection - Locate resources for the collection by calling one of the methods - Load data of one or more s from a file by calling the method of the - Resource class, or load them all at once (more efficient) with the method of the ResourceCollection. - Read and/or edit data of the individual Resource objects using the methods on that class. - Save data of one or more s to a file by calling the method of the - Resource class, or save them all at once (more efficient) with the method of the ResourceCollection. - - - - - - Creates a new, empty ResourceCollection. - - - - - Locates all resources in a file, including all resource types and languages. For each located resource, - a instance (or subclass) is added to the collection. - - The file to be searched for resources. - resources could not be read from the file - - - - Locates all resources in a file of a given type, including all languages. For each located resource, - a instance (or subclass) is added to the collection. - - The file to be searched for resources. - The type of resource to search for; may be one of the ResourceType constants or a user-defined type. - resources could not be read from the file - - - - Locates all resources in a file of a given type and language. For each located resource, - a instance (or subclass) is added to the collection. - - The file to be searched for resources. - The type of resource to search for; may be one of the ResourceType constants or a user-defined type. - The name of the resource to search for. - resources could not be read from the file - - - - For all resources in the collection, loads their data from a resource file. - - The file from which resources are loaded. - - - - For all resources in the collection, saves their data to a resource file. - - The file to which resources are saved. - - - - Adds a new item to the collection. - - The Resource to add. - - - - Removes an item to the collection. - - The Resource to remove. - - - - Gets the index of an item in the collection. - - The Resource to search for. - The index of the item, or -1 if not found. - - - - Inserts a item into the collection. - - The insertion index. - The Resource to insert. - - - - Tests if the collection contains an item. - - The Resource to search for. - true if the item is found; false otherwise - - - - Copies the collection into an array. - - The array to copy into. - The starting index in the destination array. - - - - Removes all resources from the collection. - - - - - Gets an enumerator over all resources in the collection. - - - - - - Gets or sets the element at the specified index. - - - - - Gets the number of resources in the collection. - - - - - Represents either a standard integer resource type or a custom resource type name. - - - - - Creates a new resource type from a string resource name. - - String resource name, - or an integer resource type prefixed by a #. - - - - Creates a new integer resource type. - - Integer value of a well-known resource type. - - - - Gets a string representation of the resource type. - - The custom resource name, or the name of a well-known resource type. - - - - Tests whether one resource type equals another object. - - Other object. - True if equal, else false. - - - - Tests whether one resource type equals another. - - Other resource type. - True if equal, else false. - - - - Gets a hash code suitable for using the resource type as a dictionary key. - - Hash code based on the resource type string. - - - - Implicitly converts a string to a ResourceType. - - String resource type to convert. - ResourceType object. - - - - Explicitly converts a ResourceType to a string. - - ResourceType object to convert. - The resource type string. - - Unlike , this conversion does not return - the common name of well-known integer resource types. Therefore, - the returned string is suitable for passing directly to Win32 - resource APIs that accept resource type strings. - - - - - Gets a flag indicating whether the resource type is an integer type. - - - - - Gets the integer value of the resource type, or -1 if the resource type is not an integer. - - - - - Identifies build types of a versioned file. - - - - - Identifies the type of a versioned file. - - - - - Identifies the sub-type of a versioned file. - - - - - A subclass of Resource which provides specific methods for manipulating the resource data. - - - The resource is of type (RT_VERSION). - - - - - Creates a new VersionResource object without any data. The data can be later loaded from a file. - - Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". - Locale of the resource - - - - Creates a new VersionResource object with data. The data can be later saved to a file. - - Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". - Locale of the resource - Raw resource data - - - - Adds a new version string table for a locale. - - Locale of the table - The new string table, or the existing table if the locale already existed. - - - - Removes a version string table for a locale. - - Locale of the table - - - - Checks if a version string table exists for a given locale. - - Locale to search for - True if a string table was found for the locale; false otherwise. - - - - Removes all string tables from the version resource. - - - - - Copies the version string tables to an array, starting at a particular array index. - - The one-dimensional Array that is the destination of the elements copied - from the collection. The Array must have zero-based indexing. - The zero-based index in array at which copying begins. - - - - Gets an enumerator that can iterate over the version string tables in the collection. - - An enumerator that returns objects. - - - - Gets an enumerator that can iterate over the version string tables in the collection. - - An enumerator that returns objects. - - - - Gets or sets the raw data of the resource. The data is in the format of the VS_VERSIONINFO structure. - - - - - Gets or sets the binary locale-independent file version of the version resource. - - - - - Gets or sets the binary locale-independent product version of the version resource. - - - - - Gets or sets a bitmask that specifies the build types of the file. - - - - - Gets or sets the general type of the file. - - - - - Gets or sets the specific type of the file. - - - - - Gets or sets the binary creation date and time. - - - - - Gets the string table for a specific locale, or null if there is no table for that locale. - - - - - - - Gets the number string tables in the version resource. - - - - - Represents a string table of a file version resource. - - - - - Removes all strings from the string table. - - - - - Gets an enumeration over all strings in the table. - - Enumeration of string name and value pairs - - - - Gets the locale (LCID) of the string table. - - - - - Gets or sets a string value. - - Name of the string. - - - - Gets a collection of all the names of the strings in the table. - - - - - Gets a collection of all the values in the table. - - - - - Gets the number of strings in the table. - - - - + + + + Microsoft.Deployment.Resources + + + + + Represents a Win32 resource which can be loaded from and saved to a PE file. + + + + + Creates a new Resource object without any data. The data can be later loaded from a file. + + Type of the resource; may be one of the ResourceType constants or a user-defined type. + Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". + Locale of the resource + + + + Creates a new Resource object with data. The data can be later saved to a file. + + Type of the resource; may be one of the ResourceType constants or a user-defined type. + Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". + Locale of the resource + Raw resource data + + + + Loads the resource data from a file. The file is searched for a resource with matching type, name, and locale. + + Win32 PE file containing the resource + + + + Saves the resource to a file. Any existing resource data with matching type, name, and locale is overwritten. + + Win32 PE file to contain the resource + + + + Tests if type, name, and locale of this Resource object match another Resource object. + + Resource object to be compared + True if the objects represent the same resource; false otherwise. + + + + Gets a hash code for this Resource object. + + Hash code generated from the resource type, name, and locale. + + + + Gets or sets the type of the resource. This may be one of the ResourceType constants + or a user-defined type name. + + + + + Gets or sets the name of the resource. For a numeric resource identifier, the decimal number is prefixed with a "#". + + + + + Gets or sets the locale of the resource. + + + + + Gets or sets the raw data of the resource. + + + + + Allows reading and editing of resource data in a Win32 PE file. + + + To use this class: + Create a new ResourceCollection + Locate resources for the collection by calling one of the methods + Load data of one or more s from a file by calling the method of the + Resource class, or load them all at once (more efficient) with the method of the ResourceCollection. + Read and/or edit data of the individual Resource objects using the methods on that class. + Save data of one or more s to a file by calling the method of the + Resource class, or save them all at once (more efficient) with the method of the ResourceCollection. + + + + + + Creates a new, empty ResourceCollection. + + + + + Locates all resources in a file, including all resource types and languages. For each located resource, + a instance (or subclass) is added to the collection. + + The file to be searched for resources. + resources could not be read from the file + + + + Locates all resources in a file of a given type, including all languages. For each located resource, + a instance (or subclass) is added to the collection. + + The file to be searched for resources. + The type of resource to search for; may be one of the ResourceType constants or a user-defined type. + resources could not be read from the file + + + + Locates all resources in a file of a given type and language. For each located resource, + a instance (or subclass) is added to the collection. + + The file to be searched for resources. + The type of resource to search for; may be one of the ResourceType constants or a user-defined type. + The name of the resource to search for. + resources could not be read from the file + + + + For all resources in the collection, loads their data from a resource file. + + The file from which resources are loaded. + + + + For all resources in the collection, saves their data to a resource file. + + The file to which resources are saved. + + + + Adds a new item to the collection. + + The Resource to add. + + + + Removes an item to the collection. + + The Resource to remove. + + + + Gets the index of an item in the collection. + + The Resource to search for. + The index of the item, or -1 if not found. + + + + Inserts a item into the collection. + + The insertion index. + The Resource to insert. + + + + Tests if the collection contains an item. + + The Resource to search for. + true if the item is found; false otherwise + + + + Copies the collection into an array. + + The array to copy into. + The starting index in the destination array. + + + + Removes all resources from the collection. + + + + + Gets an enumerator over all resources in the collection. + + + + + + Gets or sets the element at the specified index. + + + + + Gets the number of resources in the collection. + + + + + Represents either a standard integer resource type or a custom resource type name. + + + + + Creates a new resource type from a string resource name. + + String resource name, + or an integer resource type prefixed by a #. + + + + Creates a new integer resource type. + + Integer value of a well-known resource type. + + + + Gets a string representation of the resource type. + + The custom resource name, or the name of a well-known resource type. + + + + Tests whether one resource type equals another object. + + Other object. + True if equal, else false. + + + + Tests whether one resource type equals another. + + Other resource type. + True if equal, else false. + + + + Gets a hash code suitable for using the resource type as a dictionary key. + + Hash code based on the resource type string. + + + + Implicitly converts a string to a ResourceType. + + String resource type to convert. + ResourceType object. + + + + Explicitly converts a ResourceType to a string. + + ResourceType object to convert. + The resource type string. + + Unlike , this conversion does not return + the common name of well-known integer resource types. Therefore, + the returned string is suitable for passing directly to Win32 + resource APIs that accept resource type strings. + + + + + Gets a flag indicating whether the resource type is an integer type. + + + + + Gets the integer value of the resource type, or -1 if the resource type is not an integer. + + + + + Identifies build types of a versioned file. + + + + + Identifies the type of a versioned file. + + + + + Identifies the sub-type of a versioned file. + + + + + A subclass of Resource which provides specific methods for manipulating the resource data. + + + The resource is of type (RT_VERSION). + + + + + Creates a new VersionResource object without any data. The data can be later loaded from a file. + + Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". + Locale of the resource + + + + Creates a new VersionResource object with data. The data can be later saved to a file. + + Name of the resource. For a numeric resource identifier, prefix the decimal number with a "#". + Locale of the resource + Raw resource data + + + + Adds a new version string table for a locale. + + Locale of the table + The new string table, or the existing table if the locale already existed. + + + + Removes a version string table for a locale. + + Locale of the table + + + + Checks if a version string table exists for a given locale. + + Locale to search for + True if a string table was found for the locale; false otherwise. + + + + Removes all string tables from the version resource. + + + + + Copies the version string tables to an array, starting at a particular array index. + + The one-dimensional Array that is the destination of the elements copied + from the collection. The Array must have zero-based indexing. + The zero-based index in array at which copying begins. + + + + Gets an enumerator that can iterate over the version string tables in the collection. + + An enumerator that returns objects. + + + + Gets an enumerator that can iterate over the version string tables in the collection. + + An enumerator that returns objects. + + + + Gets or sets the raw data of the resource. The data is in the format of the VS_VERSIONINFO structure. + + + + + Gets or sets the binary locale-independent file version of the version resource. + + + + + Gets or sets the binary locale-independent product version of the version resource. + + + + + Gets or sets a bitmask that specifies the build types of the file. + + + + + Gets or sets the general type of the file. + + + + + Gets or sets the specific type of the file. + + + + + Gets or sets the binary creation date and time. + + + + + Gets the string table for a specific locale, or null if there is no table for that locale. + + + + + + + Gets the number string tables in the version resource. + + + + + Represents a string table of a file version resource. + + + + + Removes all strings from the string table. + + + + + Gets an enumeration over all strings in the table. + + Enumeration of string name and value pairs + + + + Gets the locale (LCID) of the string table. + + + + + Gets or sets a string value. + + Name of the string. + + + + Gets a collection of all the names of the strings in the table. + + + + + Gets a collection of all the values in the table. + + + + + Gets the number of strings in the table. + + + + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Linq.xml b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Linq.xml index c297f89279..428fb760ac 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Linq.xml +++ b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Linq.xml @@ -1,434 +1,434 @@ - - - - Microsoft.Deployment.WindowsInstaller.Linq - - - - - Apply to a subclass of QRecord to indicate the name of - the table the record type is to be used with. - - - If this attribute is not used on a record type, the default - table name will be derived from the record type name. (An - optional underscore suffix is stripped.) - - - - - Creates a new DatabaseTableAttribute for the specified table. - - name of the table associated with the record type - - - - Gets or sets the table associated with the record type. - - - - - Apply to a property on a subclass of QRecord to indicate - the name of the column the property is to be associated with. - - - If this attribute is not used on a property, the default - column name will be the same as the property name. - - - - - Creates a new DatabaseColumnAttribute which maps a - record property to a column. - - name of the column associated with the property - - - - Gets or sets the column associated with the record property. - - - - - Generic record entity for queryable databases, - and base for strongly-typed entity subclasses. - - - Several predefined specialized subclasses are provided for common - standard tables. Subclasses for additional standard tables - or custom tables are not necessary, but they are easy to create - and make the coding experience much nicer. - When creating subclasses, the following attributes may be - useful: , - - - - - - Do not call. Use QTable.NewRecord() instead. - - - Subclasses must also provide a public parameterless constructor. - QRecord constructors are only public due to implementation - reasons (to satisfy the new() constraint on the QTable generic - class). They are not intended to be called by user code other than - a subclass constructor. If the constructor is invoked directly, - the record instance will not be properly initialized (associated - with a database table) and calls to methods on the instance - will throw a NullReferenceException. - - - - - - Used by subclasses to get a field as an integer. - - zero-based column index of the field - - - - Used by subclasses to get a field as a nullable integer. - - zero-based column index of the field - - - - Dumps all record fields to a string. - - - - - Update multiple fields in the record (and the database). - - column names of fields to update - new values for each field being updated - - - - Update multiple fields in the record (and the database). - - column indexes of fields to update - new values for each field being updated - - The record (primary keys) must already exist in the table. - Updating primary key fields is not yet implemented; use Delete() - and Insert() instead. - - - - - Inserts the record in the database. - - - The record (primary keys) may not already exist in the table. - Use to get a new - record. Prmary keys and all required fields - must be filled in before insertion. - - - - - Inserts the record into the table. - - true if the record is temporarily - inserted, to be visible only as long as the database is open - - The record (primary keys) may not already exist in the table. - Use to get a new - record. Prmary keys and all required fields - must be filled in before insertion. - - - - - Deletes the record from the table if it exists. - - - - - Not yet implemented. - - - - - Not yet implemented. - - - - - Not yet implemented. - - - - - Not yet implemented. - - - - - Not yet implemented. - - - - - Not yet implemented. - - - - - Not yet implemented. - - - - - Gets the number of fields in the record. - - - - - Gets or sets a record field. - - column name of the field - - Setting a field value will automatically update the database. - - - - - Gets or sets a record field. - - zero-based column index of the field - - Setting a field value will automatically update the database. - - - - - Allows any Database instance to be converted into a queryable database. - - - - - Converts any Database instance into a queryable database. - - - Queryable database instance that operates on the same - MSI handle. - - This extension method is meant for convenient on-the-fly conversion. - If the existing database instance already happens to be a QDatabase, - then it is returned unchanged. Otherwise since the new database - carries the same MSI handle, only one of the instances needs to be - closed, not both. - - - - - Queryable MSI database - extends the base Database class with - LINQ query functionality along with predefined entity types - for common tables. - - - - - Opens an existing database in read-only mode. - - Path to the database file. - the database could not be created/opened - - Because this constructor initiates database access, it cannot be used with a - running installation. - The Database object should be d after use. - The finalizer will close the handle if it is still open, however due to the nondeterministic - nature of finalization it is best that the handle be closed manually as soon as it is no - longer needed, as leaving lots of unused handles open can degrade performance. - - - - - Opens an existing database with another database as output. - - Path to the database to be read. - Open mode for the database - Database object representing the created or opened database - the database could not be created/opened - - When a database is opened as the output of another database, the summary information stream - of the output database is actually a read-only mirror of the original database and thus cannot - be changed. Additionally, it is not persisted with the database. To create or modify the - summary information for the output database it must be closed and re-opened. - The returned Database object should be d after use. - The finalizer will close the handle if it is still open, however due to the nondeterministic - nature of finalization it is best that the handle be closed manually as soon as it is no - longer needed, as leaving lots of unused handles open can degrade performance. - - - - - Opens an existing database or creates a new one. - - Path to the database file. If an empty string - is supplied, a temporary database is created that is not persisted. - Open mode for the database - the database could not be created/opened - - To make and save changes to a database first open the database in transaction, - create or, or direct mode. After making the changes, always call the Commit method - before closing the database handle. The Commit method flushes all buffers. - Always call the Commit method on a database that has been opened in direct - mode before closing the database. Failure to do this may corrupt the database. - Because this constructor initiates database access, it cannot be used with a - running installation. - The Database object should be d after use. - The finalizer will close the handle if it is still open, however due to the nondeterministic - nature of finalization it is best that the handle be closed manually as soon as it is no - longer needed, as leaving lots of unused handles open can degrade performance. - - - - - Creates a new database from an MSI handle. - - Native MSI database handle. - True if the handle should be closed - when the database object is disposed - Path of the database file, if known - Mode the handle was originally opened in - - - - Gets or sets a log where all MSI SQL queries are written. - - - The log can be useful for debugging, or simply to watch the LINQ magic in action. - - - - - Gets a queryable table from the datbaase. - - name of the table - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - Queryable standard table with predefined specialized record type. - - - - Represents one table in a LINQ-queryable Database. - - type that represents one record in the table - - This class is the primary gateway to all LINQ to MSI query functionality. - The TRecord generic parameter may be the general - class, or a specialized subclass of QRecord. - - - - - Infers the name of the table this instance will be - associated with. - - table name - - The table name is retrieved from a DatabaseTableAttribute - on the record type if it exists; otherwise the name is - derived from the name of the record type itself. - (An optional underscore suffix on the record type name is dropped.) - - - - - Creates a new QTable, inferring the table name - from the name of the record type parameter. - - database that contains the table - - - - Creates a new QTable with an explicit table name. - - database that contains the table - name of the table - - - - Enumerates over all records in the table. - - - - - - Creates a new record that can be inserted into this table. - - a record with all fields initialized to null - - Primary keys and required fields must be filled in with - non-null values before the record can be inserted. - The record is tied to this table in this database; - it cannot be inserted into another table or database. - - - - - Gets schema information about the table. - - - - - Gets the database this table is associated with. - - - - - Implements the LINQ to MSI query functionality. - - the result type of the current query -- - either some kind of QRecord, or some projection of record data - - - + + + + Microsoft.Deployment.WindowsInstaller.Linq + + + + + Apply to a subclass of QRecord to indicate the name of + the table the record type is to be used with. + + + If this attribute is not used on a record type, the default + table name will be derived from the record type name. (An + optional underscore suffix is stripped.) + + + + + Creates a new DatabaseTableAttribute for the specified table. + + name of the table associated with the record type + + + + Gets or sets the table associated with the record type. + + + + + Apply to a property on a subclass of QRecord to indicate + the name of the column the property is to be associated with. + + + If this attribute is not used on a property, the default + column name will be the same as the property name. + + + + + Creates a new DatabaseColumnAttribute which maps a + record property to a column. + + name of the column associated with the property + + + + Gets or sets the column associated with the record property. + + + + + Generic record entity for queryable databases, + and base for strongly-typed entity subclasses. + + + Several predefined specialized subclasses are provided for common + standard tables. Subclasses for additional standard tables + or custom tables are not necessary, but they are easy to create + and make the coding experience much nicer. + When creating subclasses, the following attributes may be + useful: , + + + + + + Do not call. Use QTable.NewRecord() instead. + + + Subclasses must also provide a public parameterless constructor. + QRecord constructors are only public due to implementation + reasons (to satisfy the new() constraint on the QTable generic + class). They are not intended to be called by user code other than + a subclass constructor. If the constructor is invoked directly, + the record instance will not be properly initialized (associated + with a database table) and calls to methods on the instance + will throw a NullReferenceException. + + + + + + Used by subclasses to get a field as an integer. + + zero-based column index of the field + + + + Used by subclasses to get a field as a nullable integer. + + zero-based column index of the field + + + + Dumps all record fields to a string. + + + + + Update multiple fields in the record (and the database). + + column names of fields to update + new values for each field being updated + + + + Update multiple fields in the record (and the database). + + column indexes of fields to update + new values for each field being updated + + The record (primary keys) must already exist in the table. + Updating primary key fields is not yet implemented; use Delete() + and Insert() instead. + + + + + Inserts the record in the database. + + + The record (primary keys) may not already exist in the table. + Use to get a new + record. Prmary keys and all required fields + must be filled in before insertion. + + + + + Inserts the record into the table. + + true if the record is temporarily + inserted, to be visible only as long as the database is open + + The record (primary keys) may not already exist in the table. + Use to get a new + record. Prmary keys and all required fields + must be filled in before insertion. + + + + + Deletes the record from the table if it exists. + + + + + Not yet implemented. + + + + + Not yet implemented. + + + + + Not yet implemented. + + + + + Not yet implemented. + + + + + Not yet implemented. + + + + + Not yet implemented. + + + + + Not yet implemented. + + + + + Gets the number of fields in the record. + + + + + Gets or sets a record field. + + column name of the field + + Setting a field value will automatically update the database. + + + + + Gets or sets a record field. + + zero-based column index of the field + + Setting a field value will automatically update the database. + + + + + Allows any Database instance to be converted into a queryable database. + + + + + Converts any Database instance into a queryable database. + + + Queryable database instance that operates on the same + MSI handle. + + This extension method is meant for convenient on-the-fly conversion. + If the existing database instance already happens to be a QDatabase, + then it is returned unchanged. Otherwise since the new database + carries the same MSI handle, only one of the instances needs to be + closed, not both. + + + + + Queryable MSI database - extends the base Database class with + LINQ query functionality along with predefined entity types + for common tables. + + + + + Opens an existing database in read-only mode. + + Path to the database file. + the database could not be created/opened + + Because this constructor initiates database access, it cannot be used with a + running installation. + The Database object should be d after use. + The finalizer will close the handle if it is still open, however due to the nondeterministic + nature of finalization it is best that the handle be closed manually as soon as it is no + longer needed, as leaving lots of unused handles open can degrade performance. + + + + + Opens an existing database with another database as output. + + Path to the database to be read. + Open mode for the database + Database object representing the created or opened database + the database could not be created/opened + + When a database is opened as the output of another database, the summary information stream + of the output database is actually a read-only mirror of the original database and thus cannot + be changed. Additionally, it is not persisted with the database. To create or modify the + summary information for the output database it must be closed and re-opened. + The returned Database object should be d after use. + The finalizer will close the handle if it is still open, however due to the nondeterministic + nature of finalization it is best that the handle be closed manually as soon as it is no + longer needed, as leaving lots of unused handles open can degrade performance. + + + + + Opens an existing database or creates a new one. + + Path to the database file. If an empty string + is supplied, a temporary database is created that is not persisted. + Open mode for the database + the database could not be created/opened + + To make and save changes to a database first open the database in transaction, + create or, or direct mode. After making the changes, always call the Commit method + before closing the database handle. The Commit method flushes all buffers. + Always call the Commit method on a database that has been opened in direct + mode before closing the database. Failure to do this may corrupt the database. + Because this constructor initiates database access, it cannot be used with a + running installation. + The Database object should be d after use. + The finalizer will close the handle if it is still open, however due to the nondeterministic + nature of finalization it is best that the handle be closed manually as soon as it is no + longer needed, as leaving lots of unused handles open can degrade performance. + + + + + Creates a new database from an MSI handle. + + Native MSI database handle. + True if the handle should be closed + when the database object is disposed + Path of the database file, if known + Mode the handle was originally opened in + + + + Gets or sets a log where all MSI SQL queries are written. + + + The log can be useful for debugging, or simply to watch the LINQ magic in action. + + + + + Gets a queryable table from the datbaase. + + name of the table + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + Queryable standard table with predefined specialized record type. + + + + Represents one table in a LINQ-queryable Database. + + type that represents one record in the table + + This class is the primary gateway to all LINQ to MSI query functionality. + The TRecord generic parameter may be the general + class, or a specialized subclass of QRecord. + + + + + Infers the name of the table this instance will be + associated with. + + table name + + The table name is retrieved from a DatabaseTableAttribute + on the record type if it exists; otherwise the name is + derived from the name of the record type itself. + (An optional underscore suffix on the record type name is dropped.) + + + + + Creates a new QTable, inferring the table name + from the name of the record type parameter. + + database that contains the table + + + + Creates a new QTable with an explicit table name. + + database that contains the table + name of the table + + + + Enumerates over all records in the table. + + + + + + Creates a new record that can be inserted into this table. + + a record with all fields initialized to null + + Primary keys and required fields must be filled in with + non-null values before the record can be inserted. + The record is tied to this table in this database; + it cannot be inserted into another table or database. + + + + + Gets schema information about the table. + + + + + Gets the database this table is associated with. + + + + + Implements the LINQ to MSI query functionality. + + the result type of the current query -- + either some kind of QRecord, or some projection of record data + + + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Package.xml b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Package.xml index 1450ade6ed..f42c60b698 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Package.xml +++ b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.Package.xml @@ -1,679 +1,679 @@ - - - - Microsoft.Deployment.WindowsInstaller.Package - - - - - Handles status messages generated when operations are performed on an - or . - - - installPackage.Message += new InstallPackageMessageHandler(Console.WriteLine); - - - - - Provides access to powerful build, maintenance, and analysis operations on an - installation package (.MSI or .MSM). - - - - - Creates a new InstallPackage object. The file source directory and working - directory are the same as the location as the package file. - - Path to the install package to be created or opened - Open mode for the database - - - - Creates a new InstallPackage object, specifying an alternate file source - directory and/or working directory. - - Path to the install package to be created or opened - Open mode for the database - Location to obtain source files and cabinets when extracting - or updating files in the working directory. This is often the location of an original - copy of the package that is not meant to be modified. If this parameter is null, it - defaults to the directory of . - Location where files will be extracted to/updated from. Also - the location where a temporary folder is created during some operations. If this - parameter is null, it defaults to the directory of . - If the source location is different than the working directory, then - no files will be modified at the source location. - - - - - Sends a message to the event-handler. - - Message string, containing 0 or more format items - Items to be formatted - - - - Gets the list of file keys that have the specified long file name. - - File name to search for (case-insensitive) - Array of file keys, or a 0-length array if none are found - - - - Gets the list of file keys whose long file names match a specified - regular-expression search pattern. - - Regular expression search pattern - Array of file keys, or a 0-length array if none are found - - - - Extracts all files to the . The files are extracted - to the relative directory matching their . - - If any files have the uncompressed attribute, they will be copied - from the . - - - - Extracts a specified list of files to the . The files - are extracted to the relative directory matching their . - - List of file key strings to extract - If any files have the uncompressed attribute, they will be copied - from the . - - - - Updates the install package with new files from the . The - files must be in the relative directory matching their . - This method re-compresses and packages the files if necessary, and also updates the - following data: File.FileSize, File.Version, File.Language, MsiFileHash.HashPart* - - - The cabinet compression level used during re-cabbing can be configured with the - property. - - - - - Updates the install package with new files from the . The - files must be in the relative directory matching their . - This method re-compresses and packages the files if necessary, and also updates the - following data: File.FileSize, File.Version, File.Language, MsiFileHash.HashPart?. - - List of file key strings to update - - This method does not change the media structure of the package, so it may require extracting - and re-compressing a large cabinet just to update one file. -

    The cabinet compression level used during re-cabbing can be configured with the - property.

    -
    -
    - - - Consolidates a package by combining and re-compressing all files into a single - internal or external cabinet. - - - If an installation package was built from many merge modules, this - method can somewhat decrease package size, complexity, and installation time. -

    This method will also convert a package with all or mostly uncompressed - files into a package where all files are compressed.

    -

    If the package contains any not-yet-applied binary file patches (for - example, a package generated by a call to ) then - this method will apply the patches before compressing the updated files.

    -

    This method edits the database summary information and the File, Media - and Patch tables as necessary to maintain a valid installation package.

    -

    The cabinet compression level used during re-cabbing can be configured with the - property.

    -
    -
    - - - Rebuilds the cached directory structure information accessed by the - and properties. This - should be done after modifying the File, Component, or Directory - tables, or else the cached information may no longer be accurate. - - - - - Applies a patch package to the database, resulting in an installation package that - has the patch built-in. - - The patch package to be applied - Optional name of the specific transform to apply. - This parameter is usually left null, which causes the patch to be searched for - a transform that is valid to apply to this database. - - If the patch contains any binary file patches, they will not immediately be applied - to the target files, though they will at installation time. -

    After calling this method you can use to apply - the file patches immediately and also discard any outdated files from the package.

    -
    -
    - - - Handle this event to receive status messages when operations are performed - on the install package. - - - installPackage.Message += new InstallPackageMessageHandler(Console.WriteLine); - - - - - Gets or sets the location to obtain source files and cabinets when - extracting or updating files in the working directory. This is often - the location of an original copy of the package that is not meant - to be modified. - - - - - Gets or sets the location where files will be extracted to/updated from. Also - the location where a temporary folder is created during some operations. - - - - - Gets a mapping from Directory keys to source/target paths. - - - If the Directory table is modified, this mapping - will be outdated until you call . - - - - - Gets a mapping from File keys to source/target paths. - - - If the File, Component, or Directory tables are modified, this mapping - may be outdated until you call . - - - - - Gets or sets the compression level used by - and . - - - If the Directory table is modified, this mapping will be outdated - until you close and reopen the install package. - - - - - Accessor for getting and setting properties of the InstallPackage database. - - - - - Accessor for getting and setting properties of the database. - - - - - Gets or sets a property in the database. When getting a property - that does not exist in the database, an empty string is returned. - To remove a property from the database, set it to an empty string. - - - This has the same results as direct SQL queries on the Property table; it's only - meant to be a more convenient way of access. - - - - - Represents the installation path of a file or directory from an installer product database. - - - - - Creates a new InstallPath, specifying a filename. - - The name of the file or directory. Not a full path. - - - - Creates a new InstallPath, parsing out either the short or long filename. - - The name of the file or directory, in short|long syntax for a filename - or targetshort|targetlong:sourceshort|sourcelong syntax for a directory. - true to parse the short part of the combined filename; false to parse the long part - - - - Gets the full source path. - - - - - - Gets the path of the parent directory. - - - - - Gets the set of child paths if this InstallPath object represents a a directory. - - - - - Gets or sets the source name of the InstallPath. - - - - - Gets or sets the target name of the install path. - - - - - Gets the full source path. - - - - - Gets the full target path. - - - - - Represents a collection of InstallPaths that are the child paths of the same parent directory. - - - - - Adds a new child path to the collection. - - The InstallPath to add. - - - - Removes a child path to the collection. - - The InstallPath to remove. - - - - Gets the index of a child path in the collection. - - The InstallPath to search for. - The index of the item, or -1 if not found. - - - - Inserts a child path into the collection. - - The insertion index. - The InstallPath to insert. - - - - Tests if the collection contains a child path. - - The InstallPath to search for. - true if the item is found; false otherwise - - - - Copies the collection into an array. - - The array to copy into. - The starting index in the destination array. - - - - Removes an item from the collection. - - The index of the item to remove. - - - - Removes all items from the collection. - - - - - Gets an enumerator over all items in the collection. - - An enumerator for the collection. - - - - Gets or sets the element at the specified index. - - - - - Gets the number of items in the collection. - - - - - Represents a mapping of install paths for all directories, components, or files in - an installation database. - - - - - Builds a mapping from File keys to installation paths. - - Installation database. - Component mapping returned by . - true to use short file names; false to use long names - An InstallPathMap with the described mapping. - - - - Builds a mapping from Component keys to installation paths. - - Installation database. - Directory mapping returned by - . - An InstallPathMap with the described mapping. - - - - Builds a mapping from Directory keys to installation paths. - - Installation database. - true to use short directory names; false to use long names - An InstallPathMap with the described mapping. - - - - Builds a mapping of Directory keys to directory paths, specifying root directories - for the source and target paths. - - Database containing the Directory table. - true to use short directory names; false to use long names - The root directory path of all source paths, or null to leave them relative. - The root directory path of all source paths, or null to leave them relative. - An InstallPathMap with the described mapping. - - - - Creates a new empty InstallPathMap. - - - - - Sets an install path for a direcotry, component, or file key. - - Depending on the type of InstallPathMap, this is the primary key from the - either the Directory, Component, or File table. - The install path of the key item. - - Changing an install path does not modify the Database used to generate this InstallPathMap. - - - - - Removes an install path from the map. - - Depending on the type of InstallPathMap, this is the primary key from the - either the Directory, Component, or File table. - true if the item was removed, false if it did not exist - - Changing an install path does not modify the Database used to generate this InstallPathMap. - - - - - Tests whether a direcotry, component, or file key exists in the map. - - Depending on the type of InstallPathMap, this is the primary key from the - either the Directory, Component, or File table. - true if the key is found; false otherwise - - - - Attempts to get a value from the dictionary. - - The key to lookup. - Receives the value, or null if they key was not found. - True if the value was found, else false. - - - - Removes all entries from the dictionary. - - - - - Gets an enumerator over all entries in the dictionary. - - An enumerator for the dictionary. - - - - Gets a mapping from keys to source paths. - - - - - Gets a mapping from keys to target paths. - - - - - Gets or sets an install path for a direcotry, component, or file key. - - Depending on the type of InstallPathMap, this is the primary key from the - either the Directory, Component, or File table. - - Changing an install path does not modify the Database used to generate this InstallPathMap. - - - - - Gets the collection of keys in the InstallPathMap. Depending on the type of InstallPathMap, - they are all directory, component, or file key strings. - - - - - Gets the collection of InstallPath values in the InstallPathMap. - - - - - Gets the number of entries in the dictionary. - - - - - Provides access to convenient properties and operations on a patch package (.MSP). - - - - - Creates a new patch package object; opening the patch database in read-only mode. - - Path to the patch package (.MSP) - The PatchPackage object only opens the patch database in read-only mode, because - transforms (sub-storages) cannot be read if the database is open in read-write mode. - - - - Sends a message to the event-handler. - - Message string, containing 0 or more format items - Items to be formatted - - - - Gets the list of patch codes that are replaced by this patch package. - - Array of replaced patch codes (GUIDs) - - The list of replaced patch codes is stored in the RevisionNumber field of the patch summary information. - - - - - Gets the list of product codes of products targeted by this patch package. - - Array of product codes (GUIDs) - - The list of target product codes is stored in the Template field of the patch summary information. - - - - - Gets the names of the transforms included in the patch package. - - Array of transform names - - The returned list does not include the "patch special transforms" that are prefixed with "#" -

    The list of transform names is stored in the LastSavedBy field of the patch summary information.

    -
    -
    - - - Gets the names of the transforms included in the patch package. - - Specifies whether to include the - "patch special transforms" that are prefixed with "#" - Array of transform names - - The list of transform names is stored in the LastSavedBy field of the patch summary information. - - - - - Gets information about the transforms included in the patch package. - - Array containing information about each transform - - The returned info does not include the "patch special transforms" that are prefixed with "#" - - - - - Gets information about the transforms included in the patch package. - - Specifies whether to include the - "patch special transforms" that are prefixed with "#" - Array containing information about each transform - - - - Gets information about a transforms included in the patch package. - - Name of the transform to extract; this may optionally be a - special transform prefixed by "#" - Information about the transform - - - - Analyzes the transforms included in the patch package to find the ones that - are applicable to an install package. - - The install package to validate the transforms against - Array of valid transform names - - The returned list does not include the "patch special transforms" that - are prefixed with "#" If a transform is valid, then its corresponding - special transform is assumed to be valid as well. - - - - - Extracts a transform (.MST) from a patch package. - - Name of the transform to extract; this may optionally be a - special transform prefixed by "#" - Location where the transform will be extracted - - - - Handle this event to receive status messages when operations are performed on the patch package. - - - patchPackage.Message += new InstallPackageMessageHandler(Console.WriteLine); - - - - - Gets the patch code (GUID) of the patch package. - - - The patch code is stored in the RevisionNumber field of the patch summary information. - - - - - Contains properties of a transform package (.MST). - - - - - Reads transform information from a transform package. - - Path to a transform package (.MST file). - - - - Reads transform information from the summary information of a transform package. - - Filename of the transform (optional). - Handle to the summary information of a transform package (.MST file). - - - - Returns the name of the transform. - - - - - Gets the filename of the transform. - - - - - Gets the target product code of the transform. - - - - - Gets the target product version of the transform. - - - - - Gets the upgrade product code of the transform. - - - - - Gets the upgrade product version of the transform. - - - - - Gets the upgrade code of the transform. - - - - - Gets the target platform of the transform. - - - - - Gets the target language of the transform, or 0 if the transform is language-neutral. - - - - - Gets the validation flags specified when the transform was generated. - - -
    -
    + + + + Microsoft.Deployment.WindowsInstaller.Package + + + + + Handles status messages generated when operations are performed on an + or . + + + installPackage.Message += new InstallPackageMessageHandler(Console.WriteLine); + + + + + Provides access to powerful build, maintenance, and analysis operations on an + installation package (.MSI or .MSM). + + + + + Creates a new InstallPackage object. The file source directory and working + directory are the same as the location as the package file. + + Path to the install package to be created or opened + Open mode for the database + + + + Creates a new InstallPackage object, specifying an alternate file source + directory and/or working directory. + + Path to the install package to be created or opened + Open mode for the database + Location to obtain source files and cabinets when extracting + or updating files in the working directory. This is often the location of an original + copy of the package that is not meant to be modified. If this parameter is null, it + defaults to the directory of . + Location where files will be extracted to/updated from. Also + the location where a temporary folder is created during some operations. If this + parameter is null, it defaults to the directory of . + If the source location is different than the working directory, then + no files will be modified at the source location. + + + + + Sends a message to the event-handler. + + Message string, containing 0 or more format items + Items to be formatted + + + + Gets the list of file keys that have the specified long file name. + + File name to search for (case-insensitive) + Array of file keys, or a 0-length array if none are found + + + + Gets the list of file keys whose long file names match a specified + regular-expression search pattern. + + Regular expression search pattern + Array of file keys, or a 0-length array if none are found + + + + Extracts all files to the . The files are extracted + to the relative directory matching their . + + If any files have the uncompressed attribute, they will be copied + from the . + + + + Extracts a specified list of files to the . The files + are extracted to the relative directory matching their . + + List of file key strings to extract + If any files have the uncompressed attribute, they will be copied + from the . + + + + Updates the install package with new files from the . The + files must be in the relative directory matching their . + This method re-compresses and packages the files if necessary, and also updates the + following data: File.FileSize, File.Version, File.Language, MsiFileHash.HashPart* + + + The cabinet compression level used during re-cabbing can be configured with the + property. + + + + + Updates the install package with new files from the . The + files must be in the relative directory matching their . + This method re-compresses and packages the files if necessary, and also updates the + following data: File.FileSize, File.Version, File.Language, MsiFileHash.HashPart?. + + List of file key strings to update + + This method does not change the media structure of the package, so it may require extracting + and re-compressing a large cabinet just to update one file. +

    The cabinet compression level used during re-cabbing can be configured with the + property.

    +
    +
    + + + Consolidates a package by combining and re-compressing all files into a single + internal or external cabinet. + + + If an installation package was built from many merge modules, this + method can somewhat decrease package size, complexity, and installation time. +

    This method will also convert a package with all or mostly uncompressed + files into a package where all files are compressed.

    +

    If the package contains any not-yet-applied binary file patches (for + example, a package generated by a call to ) then + this method will apply the patches before compressing the updated files.

    +

    This method edits the database summary information and the File, Media + and Patch tables as necessary to maintain a valid installation package.

    +

    The cabinet compression level used during re-cabbing can be configured with the + property.

    +
    +
    + + + Rebuilds the cached directory structure information accessed by the + and properties. This + should be done after modifying the File, Component, or Directory + tables, or else the cached information may no longer be accurate. + + + + + Applies a patch package to the database, resulting in an installation package that + has the patch built-in. + + The patch package to be applied + Optional name of the specific transform to apply. + This parameter is usually left null, which causes the patch to be searched for + a transform that is valid to apply to this database. + + If the patch contains any binary file patches, they will not immediately be applied + to the target files, though they will at installation time. +

    After calling this method you can use to apply + the file patches immediately and also discard any outdated files from the package.

    +
    +
    + + + Handle this event to receive status messages when operations are performed + on the install package. + + + installPackage.Message += new InstallPackageMessageHandler(Console.WriteLine); + + + + + Gets or sets the location to obtain source files and cabinets when + extracting or updating files in the working directory. This is often + the location of an original copy of the package that is not meant + to be modified. + + + + + Gets or sets the location where files will be extracted to/updated from. Also + the location where a temporary folder is created during some operations. + + + + + Gets a mapping from Directory keys to source/target paths. + + + If the Directory table is modified, this mapping + will be outdated until you call . + + + + + Gets a mapping from File keys to source/target paths. + + + If the File, Component, or Directory tables are modified, this mapping + may be outdated until you call . + + + + + Gets or sets the compression level used by + and . + + + If the Directory table is modified, this mapping will be outdated + until you close and reopen the install package. + + + + + Accessor for getting and setting properties of the InstallPackage database. + + + + + Accessor for getting and setting properties of the database. + + + + + Gets or sets a property in the database. When getting a property + that does not exist in the database, an empty string is returned. + To remove a property from the database, set it to an empty string. + + + This has the same results as direct SQL queries on the Property table; it's only + meant to be a more convenient way of access. + + + + + Represents the installation path of a file or directory from an installer product database. + + + + + Creates a new InstallPath, specifying a filename. + + The name of the file or directory. Not a full path. + + + + Creates a new InstallPath, parsing out either the short or long filename. + + The name of the file or directory, in short|long syntax for a filename + or targetshort|targetlong:sourceshort|sourcelong syntax for a directory. + true to parse the short part of the combined filename; false to parse the long part + + + + Gets the full source path. + + + + + + Gets the path of the parent directory. + + + + + Gets the set of child paths if this InstallPath object represents a a directory. + + + + + Gets or sets the source name of the InstallPath. + + + + + Gets or sets the target name of the install path. + + + + + Gets the full source path. + + + + + Gets the full target path. + + + + + Represents a collection of InstallPaths that are the child paths of the same parent directory. + + + + + Adds a new child path to the collection. + + The InstallPath to add. + + + + Removes a child path to the collection. + + The InstallPath to remove. + + + + Gets the index of a child path in the collection. + + The InstallPath to search for. + The index of the item, or -1 if not found. + + + + Inserts a child path into the collection. + + The insertion index. + The InstallPath to insert. + + + + Tests if the collection contains a child path. + + The InstallPath to search for. + true if the item is found; false otherwise + + + + Copies the collection into an array. + + The array to copy into. + The starting index in the destination array. + + + + Removes an item from the collection. + + The index of the item to remove. + + + + Removes all items from the collection. + + + + + Gets an enumerator over all items in the collection. + + An enumerator for the collection. + + + + Gets or sets the element at the specified index. + + + + + Gets the number of items in the collection. + + + + + Represents a mapping of install paths for all directories, components, or files in + an installation database. + + + + + Builds a mapping from File keys to installation paths. + + Installation database. + Component mapping returned by . + true to use short file names; false to use long names + An InstallPathMap with the described mapping. + + + + Builds a mapping from Component keys to installation paths. + + Installation database. + Directory mapping returned by + . + An InstallPathMap with the described mapping. + + + + Builds a mapping from Directory keys to installation paths. + + Installation database. + true to use short directory names; false to use long names + An InstallPathMap with the described mapping. + + + + Builds a mapping of Directory keys to directory paths, specifying root directories + for the source and target paths. + + Database containing the Directory table. + true to use short directory names; false to use long names + The root directory path of all source paths, or null to leave them relative. + The root directory path of all source paths, or null to leave them relative. + An InstallPathMap with the described mapping. + + + + Creates a new empty InstallPathMap. + + + + + Sets an install path for a direcotry, component, or file key. + + Depending on the type of InstallPathMap, this is the primary key from the + either the Directory, Component, or File table. + The install path of the key item. + + Changing an install path does not modify the Database used to generate this InstallPathMap. + + + + + Removes an install path from the map. + + Depending on the type of InstallPathMap, this is the primary key from the + either the Directory, Component, or File table. + true if the item was removed, false if it did not exist + + Changing an install path does not modify the Database used to generate this InstallPathMap. + + + + + Tests whether a direcotry, component, or file key exists in the map. + + Depending on the type of InstallPathMap, this is the primary key from the + either the Directory, Component, or File table. + true if the key is found; false otherwise + + + + Attempts to get a value from the dictionary. + + The key to lookup. + Receives the value, or null if they key was not found. + True if the value was found, else false. + + + + Removes all entries from the dictionary. + + + + + Gets an enumerator over all entries in the dictionary. + + An enumerator for the dictionary. + + + + Gets a mapping from keys to source paths. + + + + + Gets a mapping from keys to target paths. + + + + + Gets or sets an install path for a direcotry, component, or file key. + + Depending on the type of InstallPathMap, this is the primary key from the + either the Directory, Component, or File table. + + Changing an install path does not modify the Database used to generate this InstallPathMap. + + + + + Gets the collection of keys in the InstallPathMap. Depending on the type of InstallPathMap, + they are all directory, component, or file key strings. + + + + + Gets the collection of InstallPath values in the InstallPathMap. + + + + + Gets the number of entries in the dictionary. + + + + + Provides access to convenient properties and operations on a patch package (.MSP). + + + + + Creates a new patch package object; opening the patch database in read-only mode. + + Path to the patch package (.MSP) + The PatchPackage object only opens the patch database in read-only mode, because + transforms (sub-storages) cannot be read if the database is open in read-write mode. + + + + Sends a message to the event-handler. + + Message string, containing 0 or more format items + Items to be formatted + + + + Gets the list of patch codes that are replaced by this patch package. + + Array of replaced patch codes (GUIDs) + + The list of replaced patch codes is stored in the RevisionNumber field of the patch summary information. + + + + + Gets the list of product codes of products targeted by this patch package. + + Array of product codes (GUIDs) + + The list of target product codes is stored in the Template field of the patch summary information. + + + + + Gets the names of the transforms included in the patch package. + + Array of transform names + + The returned list does not include the "patch special transforms" that are prefixed with "#" +

    The list of transform names is stored in the LastSavedBy field of the patch summary information.

    +
    +
    + + + Gets the names of the transforms included in the patch package. + + Specifies whether to include the + "patch special transforms" that are prefixed with "#" + Array of transform names + + The list of transform names is stored in the LastSavedBy field of the patch summary information. + + + + + Gets information about the transforms included in the patch package. + + Array containing information about each transform + + The returned info does not include the "patch special transforms" that are prefixed with "#" + + + + + Gets information about the transforms included in the patch package. + + Specifies whether to include the + "patch special transforms" that are prefixed with "#" + Array containing information about each transform + + + + Gets information about a transforms included in the patch package. + + Name of the transform to extract; this may optionally be a + special transform prefixed by "#" + Information about the transform + + + + Analyzes the transforms included in the patch package to find the ones that + are applicable to an install package. + + The install package to validate the transforms against + Array of valid transform names + + The returned list does not include the "patch special transforms" that + are prefixed with "#" If a transform is valid, then its corresponding + special transform is assumed to be valid as well. + + + + + Extracts a transform (.MST) from a patch package. + + Name of the transform to extract; this may optionally be a + special transform prefixed by "#" + Location where the transform will be extracted + + + + Handle this event to receive status messages when operations are performed on the patch package. + + + patchPackage.Message += new InstallPackageMessageHandler(Console.WriteLine); + + + + + Gets the patch code (GUID) of the patch package. + + + The patch code is stored in the RevisionNumber field of the patch summary information. + + + + + Contains properties of a transform package (.MST). + + + + + Reads transform information from a transform package. + + Path to a transform package (.MST file). + + + + Reads transform information from the summary information of a transform package. + + Filename of the transform (optional). + Handle to the summary information of a transform package (.MST file). + + + + Returns the name of the transform. + + + + + Gets the filename of the transform. + + + + + Gets the target product code of the transform. + + + + + Gets the target product version of the transform. + + + + + Gets the upgrade product code of the transform. + + + + + Gets the upgrade product version of the transform. + + + + + Gets the upgrade code of the transform. + + + + + Gets the target platform of the transform. + + + + + Gets the target language of the transform, or 0 if the transform is language-neutral. + + + + + Gets the validation flags specified when the transform was generated. + + +
    +
    diff --git a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.xml b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.xml index 9b6d52c6c2..c7ed5b6eb0 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.xml +++ b/msi/build/A2Staging/wix35-binaries/sdk/Microsoft.Deployment.WindowsInstaller.xml @@ -1,7334 +1,7334 @@ - - - - Microsoft.Deployment.WindowsInstaller - - - - - Collection of column information related to a or - . - - - - - Creates a new ColumnCollection based on a specified list of columns. - - columns to be added to the new collection - - - - Creates a new ColumnCollection that is associated with a database table. - - view that contains the columns - - - - Not supported because the collection is read-only. - - information about the column being added - the collection is read-only - - - - Not supported because the collection is read-only. - - the collection is read-only - - - - Checks if a column with a given name exists in the collection. - - case-sensitive name of the column to look for - true if the column exists in the collection, false otherwise - - - - Checks if a column with a given name exists in the collection. - - column to look for, with case-sensitive name - true if the column exists in the collection, false otherwise - - - - Gets the index of a column within the collection. - - case-sensitive name of the column to look for - 0-based index of the column, or -1 if not found - - - - Copies the columns from this collection into an array. - - destination array to be filed - offset into the destination array where copying begins - - - - Not supported because the collection is read-only. - - column to remove - true if the column was removed, false if it was not found - the collection is read-only - - - - Gets an enumerator over the columns in the collection. - - An enumerator of ColumnInfo objects. - - - - Gets an enumerator over the columns in the collection. - - An enumerator of ColumnInfo objects. - - - - Creates ColumnInfo objects for the associated view. - - dynamically-generated list of columns - - - - Gets a list of column names or column-definition-strings for the - associated view. - - the view to that defines the columns - true to return types (column definition strings), - false to return names - list of column names or types - - - - Gets the number of columns in the collection. - - number of columns in the collection - - - - Gets a boolean value indicating whether the collection is read-only. - A ColumnCollection is read-only if it is associated with a - or a read-only . - - read-only status of the collection - - - - Gets information about a specific column in the collection. - - 1-based index into the column collection - is less - than 1 or greater than the number of columns in the collection - - - - Gets information about a specific column in the collection. - - case-sensitive name of a column collection - does - not exist in the collection - - - - Gets a string suitable for printing all the values of a record containing these columns. - - - - - Available values for the Attributes column of the Component table. - - - - - Local only - Component cannot be run from source. - -

    - Set this value for all components belonging to a feature to prevent the feature from being run-from-network or - run-from-source. Note that if a feature has no components, the feature always shows run-from-source and - run-from-my-computer as valid options. -

    -
    - - - Component can only be run from source. - -

    - Set this bit for all components belonging to a feature to prevent the feature from being run-from-my-computer. - Note that if a feature has no components, the feature always shows run-from-source and run-from-my-computer - as valid options. -

    -
    - - - Component can run locally or from source. - - - - - If this bit is set, the value in the KeyPath column is used as a key into the Registry table. - -

    - If the Value field of the corresponding record in the Registry table is null, the Name field in that record - must not contain "+", "-", or "*". For more information, see the description of the Name field in Registry - table. -

    Setting this bit is recommended for registry entries written to the HKCU hive. This ensures the installer - writes the necessary HKCU registry entries when there are multiple users on the same machine.

    -

    -
    - - - If this bit is set, the installer increments the reference count in the shared DLL registry of the component's - key file. If this bit is not set, the installer increments the reference count only if the reference count - already exists. - - - - - If this bit is set, the installer does not remove the component during an uninstall. The installer registers - an extra system client for the component in the Windows Installer registry settings. - - - - - If this bit is set, the value in the KeyPath column is a key into the ODBCDataSource table. - - - - - If this bit is set, the installer reevaluates the value of the statement in the Condition column upon a reinstall. - If the value was previously False and has changed to true, the installer installs the component. If the value - was previously true and has changed to false, the installer removes the component even if the component has - other products as clients. - - - - - If this bit is set, the installer does not install or reinstall the component if a key path file or a key path - registry entry for the component already exists. The application does register itself as a client of the component. - -

    - Use this flag only for components that are being registered by the Registry table. Do not use this flag for - components registered by the AppId, Class, Extension, ProgId, MIME, and Verb tables. -

    -
    - - - Set this bit to mark this as a 64-bit component. This attribute facilitates the installation of packages that - include both 32-bit and 64-bit components. If this bit is not set, the component is registered as a 32-bit component. - -

    - If this is a 64-bit component replacing a 32-bit component, set this bit and assign a new GUID in the - ComponentId column. -

    -
    - - - Set this bit to disable registry reflection on all existing and new registry keys affected by this component. - -

    - If this bit is set, the Windows Installer calls the RegDisableReflectionKey on each key being accessed by the component. - This bit is available with Windows Installer version 4.0 and is ignored on 32-bit systems. -

    -
    - - - [MSI 4.5] Set this bit for a component in a patch package to prevent leaving orphan components on the computer. - -

    - If a subsequent patch is installed, marked with the SupersedeEarlier flag in its MsiPatchSequence - table to supersede the first patch, Windows Installer 4.5 can unregister and uninstall components marked with the - UninstallOnSupersedence value. If the component is not marked with this bit, installation of a superseding patch can leave - behind an unused component on the computer. -

    -
    - - - [MSI 4.5] If a component is marked with this attribute value in at least one package installed on the system, - the installer treats the component as marked in all packages. If a package that shares the marked component - is uninstalled, Windows Installer 4.5 can continue to share the highest version of the component on the system, - even if that highest version was installed by the package that is being uninstalled. - - - - - Defines flags for the Attributes column of the Control table. - - - - If this bit is set, the control is visible on the dialog box. - - - specifies if the given control is enabled or disabled. Most controls appear gray when disabled. - - - If this bit is set, the control is displayed with a sunken, three dimensional look. - - - The Indirect control attribute specifies whether the value displayed or changed by this control is referenced indirectly. - - - If this bit is set on a control, the associated property specified in the Property column of the Control table is an integer. - - - If this bit is set the text in the control is displayed in a right-to-left reading order. - - - If this style bit is set, text in the control is aligned to the right. - - - If this bit is set, the scroll bar is located on the left side of the control, otherwise it is on the right. - - - This is a combination of the RightToLeftReadingOrder, RightAligned, and LeftScroll attributes. - - - If this bit is set on a text control, the control is displayed transparently with the background showing through the control where there are no characters. - - - If this bit is set on a text control, the occurrence of the character "&" in a text string is displayed as itself. - - - If this bit is set the text in the control is displayed on a single line. - - - If this bit is set for a text control, the control will automatically attempt to format the displayed text as a number representing a count of bytes. - - - If this bit is set, fonts are created using the user's default UI code page. Otherwise it is created using the database code page. - - - If this bit is set on an Edit control, the installer creates a multiple line edit control with a vertical scroll bar. - - - This attribute creates an edit control for entering passwords. The control displays each character as an asterisk (*) as they are typed into the control. - - - If this bit is set on a ProgressBar control, the bar is drawn as a series of small rectangles in Microsoft Windows 95-style. Otherwise it is drawn as a single continuous rectangle. - - - If this bit is set, the control shows removable volumes. - - - If this bit is set, the control shows fixed internal hard drives. - - - If this bit is set, the control shows remote volumes. - - - If this bit is set, the control shows CD-ROM volumes. - - - If this bit is set, the control shows RAM disk volumes. - - - If this bit is set, the control shows floppy volumes. - - - Specifies whether or not the rollback backup files are included in the costs displayed by the VolumeCostList control. - - - If this bit is set, the items listed in the control are displayed in a specified order. Otherwise, items are displayed in alphabetical order. - - - If this bit is set on a combo box, the edit field is replaced by a static text field. This prevents a user from entering a new value and requires the user to choose only one of the predefined values. - - - If this bit is set on a check box or a radio button group, the button is drawn with the appearance of a push button, but its logic stays the same. - - - If this bit is set, the text in the control is replaced by a bitmap image. The Text column in the Control table is a foreign key into the Binary table. - - - If this bit is set, text is replaced by an icon image and the Text column in the Control table is a foreign key into the Binary table. - - - If this bit is set, the picture is cropped or centered in the control without changing its shape or size. - - - Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded. - - - Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded. - - - Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded. - - - If this bit is set, and the installation is not yet running with elevated privileges, the control is created with a UAC icon. - - - If this bit is set, the RadioButtonGroup has text and a border displayed around it. - - - - Defines flags for the Type column of the CustomAction table. - - - - Unspecified custom action type. - - - Target = entry point name - - - Target = command line args - - - Target = text string to be formatted and set into property - - - Target = entry point name, null if none to call - - - Target = entry point name, null if none to call - - - Target = property list for nested engine initialization - - - Source = File.File, file part of installation - - - Source = Directory.Directory, folder containing existing file - - - Source = Property.Property, full path to executable - - - Ignore action return status, continue running - - - Run asynchronously - - - Skip if UI sequence already run - - - Skip if UI sequence already run in same process - - - Run on client only if UI already run on client - - - Queue for execution within script - - - In conjunction with InScript: queue in Rollback script - - - In conjunction with InScript: run Commit ops from script on success - - - No impersonation, run in system context - - - Impersonate for per-machine installs on TS machines - - - Script requires 64bit process - - - Don't record the contents of the Target field in the log file - - - The custom action runs only when a patch is being uninstalled - - - - Defines flags for the Attributes column of the Dialog table. - - - - If this bit is set, the dialog is originally created as visible, otherwise it is hidden. - - - If this bit is set, the dialog box is modal, other dialogs of the same application cannot be put on top of it, and the dialog keeps the control while it is running. - - - If this bit is set, the dialog box can be minimized. This bit is ignored for modal dialog boxes, which cannot be minimized. - - - If this style bit is set, the dialog box will stop all other applications and no other applications can take the focus. - - - If this bit is set, the other dialogs stay alive when this dialog box is created. - - - If this bit is set, the dialog box periodically calls the installer. If the property changes, it notifies the controls on the dialog. - - - If this bit is set, the pictures on the dialog box are created with the custom palette (one per dialog received from the first control created). - - - If this style bit is set the text in the dialog box is displayed in right-to-left-reading order. - - - If this style bit is set, the text is aligned on the right side of the dialog box. - - - If this style bit is set, the scroll bar is located on the left side of the dialog box. - - - This is a combination of the RightToLeftReadingOrder, RightAligned, and the LeftScroll dialog style bits. - - - If this bit is set, the dialog box is an error dialog. - - - - Available values for the Attributes column of the Feature table. - - - - - Favor local - Components of this feature that are not marked for installation from source are installed locally. - -

    - A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource, - is installed locally. Components marked in the Component - table are always run from the source CD/server. The bits FavorLocal and FavorSource work with features not - listed by the ADVERTISE property. -

    -
    - - - Components of this feature not marked for local installation are installed to run from the source - CD-ROM or server. - -

    - A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource, - is installed to run locally. Components marked (local-only) in the - Component table are always installed locally. The bits FavorLocal and FavorSource work with features - not listed by the ADVERTISE property. -

    -
    - - - Set this attribute and the state of the feature is the same as the state of the feature's parent. - You cannot use this option if the feature is located at the root of a feature tree. - -

    - Omit this attribute and the feature state is determined according to DisallowAdvertise and - FavorLocal and FavorSource. -

    To guarantee that the child feature's state always follows the state of its parent, even when the - child and parent are initially set to absent in the SelectionTree control, you must include both - FollowParent and UIDisallowAbsent in the attributes of the child feature.

    -

    Note that if you set FollowParent without setting UIDisallowAbsent, the installer cannot force - the child feature out of the absent state. In this case, the child feature matches the parent's - installation state only if the child is set to something other than absent.

    -

    Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.

    -

    -
    - - - Set this attribute and the feature state is Advertise. - -

    - If the feature is listed by the ADDDEFAULT property this bit is ignored and the feature state is determined - according to FavorLocal and FavorSource. -

    Omit this attribute and the feature state is determined according to DisallowAdvertise and FavorLocal - and FavorSource.

    -

    -
    - - - Set this attribute to prevent the feature from being advertised. - -

    - Note that this bit works only with features that are listed by the ADVERTISE property. -

    Set this attribute and if the listed feature is not a parent or child, the feature is installed according to - FavorLocal and FavorSource.

    -

    Set this attribute for the parent of a listed feature and the parent is installed.

    -

    Set this attribute for the child of a listed feature and the state of the child is Absent.

    -

    Omit this attribute and if the listed feature is not a parent or child, the feature state is Advertise.

    -

    Omit this attribute and if the listed feature is a parent or child, the state of both features is Advertise.

    -

    -
    - - - Set this attribute and the user interface does not display an option to change the feature state - to Absent. Setting this attribute forces the feature to the installation state, whether or not the - feature is visible in the UI. - -

    - Omit this attribute and the user interface displays an option to change the feature state to Absent. -

    Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.

    -

    Setting this attribute not only affects the UI, but also forces the feature to the install state whether - the feature is visible in the UI or not.

    -

    -
    - - - Set this attribute and advertising is disabled for the feature if the operating system shell does not - support Windows Installer descriptors. - - - - - Available values for the Attributes column of the File table. - - - - No attributes. - - - Read-only. - - - Hidden. - - - System. - - - The file is vital for the proper operation of the component to which it belongs. - - - The file contains a valid checksum. A checksum is required to repair a file that has become corrupted. - - - This bit must only be added by a patch and if the file is being added by the patch. - - - - The file's source type is uncompressed. If set, ignore the WordCount summary information property. If neither - Noncompressed nor Compressed are set, the compression state of the file is specified by the WordCount summary - information property. Do not set both Noncompressed and Compressed. - - - - - The file's source type is compressed. If set, ignore the WordCount summary information property. If neither - Noncompressed or Compressed are set, the compression state of the file is specified by the WordCount summary - information property. Do not set both Noncompressed and Compressed. - - - - - Defines values for the Action column of the IniFile and RemoveIniFile tables. - - - - Creates or updates a .ini entry. - - - Creates a .ini entry only if the entry does not already exist. - - - Deletes .ini entry. - - - Creates a new entry or appends a new comma-separated value to an existing entry. - - - Deletes a tag from a .ini entry. - - - - Defines values for the Type column of the CompLocator, IniLocator, and RegLocator tables. - - - - Key path is a directory. - - - Key path is a file name. - - - Key path is a registry value. - - - Set this bit to have the installer search the 64-bit portion of the registry. - - - - Defines values for the Root column of the Registry, RemoveRegistry, and RegLocator tables. - - - - HKEY_CURRENT_USER for a per-user installation, - or HKEY_LOCAL_MACHINE for a per-machine installation. - - - HKEY_CLASSES_ROOT - - - HKEY_CURRENT_USER - - - HKEY_LOCAL_MACHINE - - - HKEY_USERS - - - - Defines values for the InstallMode column of the RemoveFile table. - - - - Never remove. - - - Remove when the associated component is being installed (install state = local or source). - - - Remove when the associated component is being removed (install state = absent). - - - - Defines values for the ServiceType, StartType, and ErrorControl columns of the ServiceInstall table. - - - - No flags. - - - A Win32 service that runs its own process. - - - A Win32 service that shares a process. - - - A Win32 service that interacts with the desktop. - This value cannot be used alone and must be added to either - or . - - - Service starts during startup of the system. - - - Service starts when the service control manager calls the StartService function. - - - Specifies a service that can no longer be started. - - - Logs the error, displays a message box and continues the startup operation. - - - Logs the error if it is possible and the system is restarted with the last configuration - known to be good. If the last-known-good configuration is being started, the startup operation fails. - - - When combined with other error flags, specifies that the overall install should fail if - the service cannot be installed into the system. - - - - Defines values for the Event column of the ServiceControl table. - - - - No control events. - - - During an install, starts the service during the StartServices action. - - - During an install, stops the service during the StopServices action. - - - During an install, deletes the service during the DeleteServices action. - - - During an uninstall, starts the service during the StartServices action. - - - During an uninstall, stops the service during the StopServices action. - - - During an uninstall, deletes the service during the DeleteServices action. - - - - Defines values for the StyleBits column of the TextStyle table. - - - - Bold - - - Italic - - - Underline - - - Strike out - - - - Defines values for the Attributes column of the Upgrade table. - - - - Migrates feature states by enabling the logic in the MigrateFeatureStates action. - - - Detects products and applications but does not remove. - - - Continues installation upon failure to remove a product or application. - - - Detects the range of versions including the value in VersionMin. - - - Dectects the range of versions including the value in VersionMax. - - - Detects all languages, excluding the languages listed in the Language column. - - - - Defines a single column of a table in an installer database. - - Once created, a ColumnInfo object is immutable. - - - - Creates a new ColumnInfo object from a column definition. - - name of the column - column definition string - - - - - Creates a new ColumnInfo object from a list of parameters. - - name of the column - type of the column; must be one of the following: - Int16, Int32, String, or Stream - the maximum number of characters for String columns; - ignored for other column types - true if the column is required to have a non-null value - - - - Creates a new ColumnInfo object from a list of parameters. - - name of the column - type of the column; must be one of the following: - Int16, Int32, String, or Stream - the maximum number of characters for String columns; - ignored for other column types - true if the column is required to have a non-null value - true to if the column is only in-memory and - not persisted with the database - for String columns, indicates the column - is localizable; ignored for other column types - - - - Gets the name of the column. - - Name of the column. - - - - Gets the name of the column. - - name of the column - - - - Gets the type of the column as a System.Type. This is one of the following: Int16, Int32, String, or Stream - - type of the column - - - - Gets the type of the column as an integer that can be cast to a System.Data.DbType. This is one of the following: Int16, Int32, String, or Binary - - equivalent DbType of the column as an integer - - - - Gets the size of the column. - - The size of integer columns this is either 2 or 4. For string columns this is the maximum - recommended length of the string, or 0 for unlimited length. For stream columns, 0 is returned. - - - - Gets a value indicating whether the column must be non-null when inserting a record. - - required status of the column - - - - Gets a value indicating whether the column is temporary. Temporary columns are not persisted - when the database is saved to disk. - - temporary status of the column - - - - Gets a value indicating whether the column is a string column that is localizable. - - localizable status of the column - - - - Gets an SQL fragment that can be used to create this column within a CREATE TABLE statement. - - SQL fragment to be used for creating the column -

    - Examples: - - LONG - SHORT TEMPORARY - CHAR(0) LOCALIZABLE - CHAR(72) NOT NULL LOCALIZABLE - OBJECT - -

    -
    - - - Gets a short string defining the type and size of the column. - - - The definition string consists - of a single letter representing the data type followed by the width of the column (in characters - when applicable, bytes otherwise). A width of zero designates an unbounded width (for example, - long text fields and streams). An uppercase letter indicates that null values are allowed in - the column. - -

    - - s? - String, variable length (?=1-255) - s0 - String, variable length - i2 - Short integer - i4 - Long integer - v0 - Binary Stream - g? - Temporary string (?=0-255) - j? - Temporary integer (?=0,1,2,4) - l? - Localizable string, variable length (?=1-255) - l0 - Localizable string, variable length - -

    -
    - - - Accessor for information about components within the context of an installation session. - - - - - Checks if the collection contains a component. - - name of the component - true if the component is in the collection, else false - - - - Copies the features into an array. - - array that receives the features - offset into the array - - - - Enumerates the components in the collection. - - an enumerator over all features in the collection - - - - Gets information about a component within the context of an installation session. - - name of the component - component object - - - - Gets the number of components defined for the product. - - - - - Provides access to information about a component within the context of an installation session. - - - - - Gets disk space per drive required to install a component. - - Requested component state - A list of InstallCost structures, specifying the cost for each drive for the component -

    - Win32 MSI API: - MsiEnumComponentCosts -

    -
    - - - Gets the name of the component (primary key in the Component table). - - - - - Gets the current install state of the designated Component. - - the Session handle is invalid - an unknown Component was requested -

    - Win32 MSI API: - MsiGetComponentState -

    -
    - - - Gets or sets the action state of the designated Component. - - the Session handle is invalid - an unknown Component was requested - the user exited the installation -

    - Win32 MSI APIs: - MsiGetComponentState, - MsiSetComponentState -

    -
    - - - Represents an instance of a registered component. - - - - - Subclasses of this abstract class represent an instance - of a registered feature or component. - - - - - Gets the product that this item is a part of. - - - - - Gets the current installation state of the item. - - - - - Creates a new ComponentInstallation, automatically detecting the - product that the component is a part of. - - component GUID -

    - Win32 MSI API: - MsiGetProductCode -

    -
    - - - Creates a new ComponentInstallation for a component installed by a - specific product. - - component GUID - ProductCode GUID - - - - Gets the set of installed components for all products. - - The installer configuration data is corrupt -

    - Win32 MSI API: - MsiEnumComponents -

    -
    - - - Gets the component code (GUID) of the component. - - - - - Gets all client products of a specified component. - - enumeration over all client products of the component - The installer configuration data is corrupt -

    - Because clients are not ordered, any new component has an arbitrary index. - This means that the property may return clients in any order. -

    - Win32 MSI API: - MsiEnumClients -

    -
    - - - Gets the installed state of a component. - - the installed state of the component, or InstallState.Unknown - if this component is not part of a product -

    - Win32 MSI API: - MsiGetComponentPath -

    -
    - - - Gets the full path to an installed component. If the key path for the component is a - registry key then the registry key is returned. - - The file or registry keypath to the component, or null if the component is not available. - An unknown product or component was specified - The installer configuration data is corrupt -

    - If the component is a registry key, the registry roots are represented numerically. - For example, a registry path of "HKEY_CURRENT_USER\SOFTWARE\Microsoft" would be returned - as "01:\SOFTWARE\Microsoft". The registry roots returned are defined as follows: - HKEY_CLASSES_ROOT=00, HKEY_CURRENT_USER=01, HKEY_LOCAL_MACHINE=02, HKEY_USERS=03, - HKEY_PERFORMANCE_DATA=04 -

    - Win32 MSI APIs: - MsiGetComponentPath, - MsiLocateComponent -

    -
    - - - Gets the set of registered qualifiers for the component. - - Enumeration of the qulifiers for the component. - The installer configuration data is corrupt -

    - Because qualifiers are not ordered, any new qualifier has an arbitrary index, - meaning the function can return qualifiers in any order. -

    - Win32 MSI API: - MsiEnumComponentQualifiers -

    -
    - - - Holds data about a component qualifier. - -

    - Win32 MSI API: - MsiEnumComponentQualifiers -

    -
    - - - Gets the qualifier code. - - - - - Gets the qualifier data. - - - - - Marks a method as a custom action entry point. - -

    - A custom action method must be defined as public and static, - take a single object as a parameter, - and return an enumeration value. -

    -
    - - - Name of the custom action entrypoint, or null if the same as the method name. - - - - - Marks a method as a custom action entry point. - - - - - Marks a method as a custom action entry point. - - Name of the function to be exported, - defaults to the name of this method - - - - Gets or sets the name of the custom action entrypoint. A null - value defaults to the name of the method. - - name of the custom action entrypoint, or null if none was specified - - - - Contains a collection of key-value pairs suitable for passing between - immediate and deferred/rollback/commit custom actions. - - - Call the method to get a string - suitable for storing in a property and reconstructing the custom action data later. - - - - - - - "CustomActionData" literal property name. - - - - - Creates a new empty custom action data object. - - - - - Reconstructs a custom action data object from data that was previously - persisted in a string. - - Previous output from . - - - - Adds a key and value to the data collection. - - Case-sensitive data key. - Data value (may be null). - the key does not consist solely of letters, - numbers, and the period, underscore, and space characters. - - - - Adds a value to the data collection, using XML serialization to persist the object as a string. - - Case-sensitive data key. - Data value (may be null). - the key does not consist solely of letters, - numbers, and the period, underscore, and space characters. - The value type does not support XML serialization. - The value could not be serialized. - - - - Gets a value from the data collection, using XML serialization to load the object from a string. - - Case-sensitive data key. - The value could not be deserialized. - - - - Determines whether the data contains an item with the specified key. - - Case-sensitive data key. - true if the data contains an item with the key; otherwise, false - - - - Removes the item with the specified key from the data. - - Case-sensitive data key. - true if the item was successfully removed from the data; - false if an item with the specified key was not found - - - - Gets the value with the specified key. - - Case-sensitive data key. - Value associated with the specified key, or - null if an item with the specified key was not found - true if the data contains an item with the specified key; otherwise, false. - - - - Adds an item with key and value to the data collection. - - Case-sensitive data key, with a data value that may be null. - the key does not consist solely of letters, - numbers, and the period, underscore, and space characters. - - - - Removes all items from the data. - - - - - Determines whether the data contains a specified item. - - The data item to locate. - true if the data contains the item; otherwise, false - - - - Copies the data to an array, starting at a particular array index. - - Destination array. - Index in the array at which copying begins. - - - - Removes an item from the data. - - The item to remove. - true if the item was successfully removed from the data; - false if the item was not found - - - - Returns an enumerator that iterates through the collection. - - An enumerator that can be used to iterate through the collection. - - - - Returns an enumerator that iterates through the collection. - - An enumerator that can be used to iterate through the collection. - - - - Gets a string representation of the data suitable for persisting in a property. - - Data string in the form "Key1=Value1;Key2=Value2" - - - - Ensures that a key contains valid characters. - - key to be validated - the key does not consist solely of letters, - numbers, and the period, underscore, and space characters. - - - - Serializes a value into an XML string. - - Type of the value. - Value to be serialized. - Serialized value data as a string. - - - - Deserializes a value from an XML string. - - Expected type of the value. - Serialized value data. - Deserialized value object. - - - - Escapes a value string by doubling any data-separator (semicolon) characters. - - - Escaped value string - - - - Unescapes a value string by undoubling any doubled data-separator (semicolon) characters. - - - Unescaped value string - - - - Loads key-value pairs from a string into the data collection. - - key-value pair list of the form returned by - - - - Gets a collection object containing all the keys of the data. - - - - - Gets a collection containing all the values of the data. - - - - - Gets or sets a data value with a specified key. - - Case-sensitive data key. - the key does not consist solely of letters, - numbers, and the period, underscore, and space characters. - - - - Gets the number of items in the data. - - - - - Gets a value indicating whether the data is read-only. - - - - - Managed-code portion of the custom action proxy. - - - - - Invokes a managed custom action method. - - Integer handle to the installer session. - Name of the custom action entrypoint. This must - either map to an entrypoint definition in the customActions - config section, or be an explicit entrypoint of the form: - "AssemblyName!Namespace.Class.Method" - Pointer to a delegate used to - make remote API calls, if this custom action is running out-of-proc. - The value returned by the custom action method, - or ERROR_INSTALL_FAILURE if the custom action could not be invoked. - - - - Checks the "MMsiBreak" environment variable for any matching custom action names. - - List of names to search for in the environment - variable string. - True if a match was found, else false. - - - - Locates and parses an entrypoint mapping in CustomAction.config. - - Installer session handle, just used for logging. - Custom action entrypoint name: the key value - in an item in the customActions section of the config file. - Returned display name of the assembly from - the entrypoint mapping. - Returned class name of the entrypoint mapping. - Returned method name of the entrypoint mapping. - True if the entrypoint was found, false if not or if some error - occurred. - - - - Uses reflection to load the assembly and class and find the method. - - Installer session handle, just used for logging. - Display name of the assembly containing the - custom action method. - Fully-qualified name of the class containing the - custom action method. - Name of the custom action method. - The method, or null if not found. - - - - Checks if a method has the right return and paramater types - for a custom action, and that it is marked by a CustomActionAttribute. - - Method to be checked. - True if the method is a valid custom action, else false. - - - - Accesses a Windows Installer database. - -

    - The method must be called before the Database is closed to write out all - persistent changes. If the Commit method is not called, the installer performs an implicit - rollback upon object destruction. -

    - The client can use the following procedure for data access: - Obtain a Database object using one of the Database constructors. - Initiate a query using a SQL string by calling the - method of the Database. - Set query parameters in a and execute the database - query by calling the method of the . This - produces a result that can be fetched or updated. - Call the method of the View repeatedly to return - Records. - Update database rows of a Record object obtained by the Fetch method using - one of the methods of the View. - Release the query and any unfetched records by calling the - method of the View. - Persist any database updates by calling the Commit method of the Database. - - -

    -
    - - - Base class for Windows Installer handle types (Database, View, Record, SummaryInfo). - -

    - These classes implement the interface, because they - hold unmanaged resources (MSI handles) that should be properly disposed - when no longer needed. -

    -
    - - - Constructs a handle object from a native integer handle. - - Native integer handle. - true to close the handle when this object is disposed or finalized - - - - Closes the handle. After closing a handle, further method calls may throw an . - -

    - The finalizer of this class will NOT close the handle if it is still open, - because finalization can run on a separate thread from the application, - resulting in potential problems if handles are closed from that thread. - It is best that the handle be closed manually as soon as it is no longer needed, - as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiCloseHandle -

    - -
    - - - Closes the handle. After closing a handle, further method calls may throw an . - -

    - The finalizer of this class will NOT close the handle if it is still open, - because finalization can run on a separate thread from the application, - resulting in potential problems if handles are closed from that thread. - It is best that the handle be closed manually as soon as it is no longer needed, - as leaving lots of unused handles open can degrade performance. -

    - This method is merely an alias for the method. -

    - Win32 MSI API: - MsiCloseHandle -

    -
    - - - Tests whether this handle object is equal to another handle object. Two handle objects are equal - if their types are the same and their native integer handles are the same. - - The handle object to compare with the current handle object. - true if the specified handle object is equal to the current handle object; otherwise false - - - - Gets a hash value for the handle object. - - A hash code for the handle object. -

    - The hash code is derived from the native integer handle. -

    -
    - - - Closes the handle. After closing a handle, further method calls may throw an . - - If true, the method has been called directly or indirectly by a user's code, - so managed and unmanaged resources will be disposed. If false, the method has been called by the - runtime from inside the finalizer, and only unmanaged resources will be disposed. - - - - Gets the native integer handle. - - - - - Checks if the handle is closed. When closed, method calls on the handle object may throw an . - - - - - Gets an object that can be used internally for safe syncronization. - - - - - Opens an existing database in read-only mode. - - Path to the database file. - the database could not be created/opened -

    - Because this constructor initiates database access, it cannot be used with a - running installation. -

    - The Database object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiOpenDatabase -

    -
    - - - Opens an existing database with another database as output. - - Path to the database to be read. - Open mode for the database - Database object representing the created or opened database - the database could not be created/opened -

    - When a database is opened as the output of another database, the summary information stream - of the output database is actually a read-only mirror of the original database and thus cannot - be changed. Additionally, it is not persisted with the database. To create or modify the - summary information for the output database it must be closed and re-opened. -

    - The Database object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - The database is opened in mode, and will be - automatically commited when it is closed. -

    - Win32 MSI API: - MsiOpenDatabase -

    -
    - - - Opens an existing database or creates a new one. - - Path to the database file. If an empty string - is supplied, a temporary database is created that is not persisted. - Open mode for the database - the database could not be created/opened -

    - Because this constructor initiates database access, it cannot be used with a - running installation. -

    - The database object should be d after use. - The finalizer will close the handle if it is still open, however due to the nondeterministic - nature of finalization it is best that the handle be closed manually as soon as it is no - longer needed, as leaving lots of unused handles open can degrade performance. -

    - A database opened in or - mode will be automatically commited when it is - closed. However a database opened in or - mode must have the method - called before it is closed, otherwise no changes will be persisted. -

    - Win32 MSI API: - MsiOpenDatabase -

    -
    - - - Creates a new database from an MSI handle. - - Native MSI database handle. - True if the handle should be closed - when the database object is disposed - Path of the database file, if known - Mode the handle was originally opened in - - - - Creates a new Database object from an integer database handle. - -

    - This method is only provided for interop purposes. A Database object - should normally be obtained from or - a public Database constructor. -

    - Integer database handle - true to close the handle when this object is disposed -
    - - - Schedules a file or directory for deletion after the database handle is closed. - - File or directory path to be deleted. All files and subdirectories - under a directory are deleted. -

    - Once an item is scheduled, it cannot be unscheduled. -

    - The items cannot be deleted if the Database object is auto-disposed by the - garbage collector; the handle must be explicitly closed. -

    - Files which are read-only or otherwise locked cannot be deleted, - but they will not cause an exception to be thrown. -

    -
    - - - Merges another database with this database. - - The database to be merged into this database - Optional name of table to contain the names of the tables containing - merge conflicts, the number of conflicting rows within the table, and a reference to the table - with the merge conflict. - merge failed due to a schema difference or data conflict - the Database handle is invalid -

    - Merge does not copy over embedded cabinet files or embedded transforms from the - reference database into the target database. Embedded data streams that are listed in the - Binary table or Icon table are copied from the reference database to the target database. - Storage embedded in the reference database are not copied to the target database. -

    - The Merge method merges the data of two databases. These databases must have the same - codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists - if the data in any row in the first database differs from the data in the corresponding row - of the second database. Corresponding rows are in the same table of both databases and have - the same primary key in both databases. The tables of non-conflicting databases must have - the same number of primary keys, same number of columns, same column types, same column names, - and the same data in rows with identical primary keys. Temporary columns however don't matter - in the column count and corresponding tables can have a different number of temporary columns - without creating conflict as long as the persistent columns match. -

    - If the number, type, or name of columns in corresponding tables are different, the - schema of the two databases are incompatible and the installer will stop processing tables - and the merge fails. The installer checks that the two databases have the same schema before - checking for row merge conflicts. If the schemas are incompatible, the databases have be - modified. -

    - If the data in particular rows differ, this is a row merge conflict, the merge fails - and creates a new table with the specified name. The first column of this table is the name - of the table having the conflict. The second column gives the number of rows in the table - having the conflict. -

    - Win32 MSI API: - MsiDatabaseMerge -

    -
    - - - Merges another database with this database. - - The database to be merged into this database - merge failed due to a schema difference or data conflict - the Database handle is invalid -

    - MsiDatabaseMerge does not copy over embedded cabinet files or embedded transforms from - the reference database into the target database. Embedded data streams that are listed in - the Binary table or Icon table are copied from the reference database to the target database. - Storage embedded in the reference database are not copied to the target database. -

    - The Merge method merges the data of two databases. These databases must have the same - codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists - if the data in any row in the first database differs from the data in the corresponding row - of the second database. Corresponding rows are in the same table of both databases and have - the same primary key in both databases. The tables of non-conflicting databases must have - the same number of primary keys, same number of columns, same column types, same column names, - and the same data in rows with identical primary keys. Temporary columns however don't matter - in the column count and corresponding tables can have a different number of temporary columns - without creating conflict as long as the persistent columns match. -

    - If the number, type, or name of columns in corresponding tables are different, the - schema of the two databases are incompatible and the installer will stop processing tables - and the merge fails. The installer checks that the two databases have the same schema before - checking for row merge conflicts. If the schemas are incompatible, the databases have be - modified. -

    - Win32 MSI API: - MsiDatabaseMerge -

    -
    - - - Checks whether a table exists and is persistent in the database. - - The table to the checked - true if the table exists and is persistent in the database; false otherwise - the table is unknown - the Database handle is invalid -

    - To check whether a table exists regardless of persistence, - use . -

    - Win32 MSI API: - MsiDatabaseIsTablePersistent -

    -
    - - - Checks whether a table contains a persistent column with a given name. - - The table to the checked - The name of the column to be checked - true if the column exists in the table; false if the column is temporary or does not exist. - the View could not be executed - the Database handle is invalid -

    - To check whether a column exists regardless of persistence, - use . -

    -
    - - - Gets the count of all rows in the table. - - Name of the table whose rows are to be counted - The count of all rows in the table - the View could not be executed - the Database handle is invalid - - - - Gets the count of all rows in the table that satisfy a given condition. - - Name of the table whose rows are to be counted - Conditional expression, such as could be placed on the end of a SQL WHERE clause - The count of all rows in the table satisfying the condition - the SQL WHERE syntax is invalid - the View could not be executed - the Database handle is invalid - - - - Finalizes the persistent form of the database. All persistent data is written - to the writeable database, and no temporary columns or rows are written. - - the Database handle is invalid -

    - For a database open in mode, this method has no effect. -

    - For a database open in or - mode, it is not necessary to call this method because the database will be automatically committed - when it is closed. However this method may be called at any time to persist the current state of tables - loaded into memory. -

    - For a database open in or - mode, no changes will be persisted until this method is called. If the database object is closed without - calling this method, the database file remains unmodified. -

    - Win32 MSI API: - MsiDatabaseCommit -

    -
    - - - Copies the structure and data from a specified table to a text archive file. - - Name of the table to be exported - Path to the file to be created - the file path is invalid - the Database handle is invalid -

    - Win32 MSI API: - MsiDatabaseExport -

    -
    - - - Imports a database table from a text archive file, dropping any existing table. - - Path to the file to be imported. - The table name is specified within the file. - the file path is invalid - the Database handle is invalid -

    - Win32 MSI API: - MsiDatabaseImport -

    -
    - - - Exports all database tables, streams, and summary information to archive files. - - Path to the directory where archive files will be created - the directory path is invalid - the Database handle is invalid -

    - The directory will be created if it does not already exist. -

    - Win32 MSI API: - MsiDatabaseExport -

    -
    - - - Imports all database tables, streams, and summary information from archive files. - - Path to the directory from which archive files will be imported - the directory path is invalid - the Database handle is invalid -

    - Win32 MSI API: - MsiDatabaseImport -

    -
    - - - Creates a new record object with the requested number of fields. - - Required number of fields, which may be 0. - The maximum number of fields in a record is limited to 65535. - A new record object that can be used with the database. -

    - This method is equivalent to directly calling the - constructor in all cases outside of a custom action context. When in a - custom action session, this method allows creation of a record that can - work with a database other than the session database. -

    - The Record object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiCreateRecord -

    -
    - - - Returns the file path of this database, or the handle value if a file path was not specified. - - - - - Closes the database handle. After closing a handle, further method calls may throw . - - If true, the method has been called directly or - indirectly by a user's code, so managed and unmanaged resources will be - disposed. If false, only unmanaged resources will be disposed. - - - - Gets a View object representing the query specified by a SQL string. - - SQL query string, which may contain format items - Zero or more objects to format - A View object representing the query specified by a SQL string - the SQL syntax is invalid - the Database handle is invalid -

    - The parameter is formatted using . -

    - The View object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiDatabaseOpenView -

    -
    - - - Executes the query specified by a SQL string. The query may not be a SELECT statement. - - SQL query string, which may contain format items - Zero or more objects to format - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - The parameter is formatted using - . -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute -

    -
    - - - Executes the query specified by a SQL string. The query may not be a SELECT statement. - - SQL query string - Optional Record object containing the values that replace - the parameter tokens (?) in the SQL query. - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute -

    -
    - - - Executes the specified SQL SELECT query and returns all results. - - SQL query string, which may contain format items - Zero or more objects to format - All results combined into an array - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - The parameter is formatted using - . -

    - Multiple rows columns will be collapsed into a single one-dimensional list. -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Executes the specified SQL SELECT query and returns all results. - - SQL SELECT query string - Optional Record object containing the values that replace - the parameter tokens (?) in the SQL query. - All results combined into an array - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - Multiple rows columns will be collapsed into a single one-dimensional list. -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Executes the specified SQL SELECT query and returns all results as integers. - - SQL query string, which may contain format items - Zero or more objects to format - All results combined into an array - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - The parameter is formatted using - . -

    - Multiple rows columns will be collapsed into a single one-dimensional list. -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Executes the specified SQL SELECT query and returns all results as integers. - - SQL SELECT query string - Optional Record object containing the values that replace - the parameter tokens (?) in the SQL query. - All results combined into an array - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - Multiple rows columns will be collapsed into a single one-dimensional list. -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Executes the specified SQL SELECT query and returns all results as strings. - - SQL query string, which may contain format items - Zero or more objects to format - All results combined into an array - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - The parameter is formatted using - . -

    - Multiple rows columns will be collapsed into a single on-dimensional list. -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Executes the specified SQL SELECT query and returns all results as strings. - - SQL SELECT query string - Optional Record object containing the values that replace - the parameter tokens (?) in the SQL query. - All results combined into an array - the SQL syntax is invalid - the View could not be executed - the Database handle is invalid -

    - Multiple rows columns will be collapsed into a single on-dimensional list. -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Executes the specified SQL SELECT query and returns a single result. - - SQL query string, which may contain format items - Zero or more objects to format - First field of the first result - the SQL syntax is invalid - the View could not be executed - or the query returned 0 results - the Database handle is invalid -

    - The parameter is formatted using - . -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Executes the specified SQL SELECT query and returns a single result. - - SQL SELECT query string - Optional Record object containing the values that replace - the parameter tokens (?) in the SQL query. - First field of the first result - the SQL syntax is invalid - the View could not be executed - or the query returned 0 results - the Database handle is invalid -

    - Win32 MSI APIs: - MsiDatabaseOpenView, - MsiViewExecute, - MsiViewFetch -

    -
    - - - Creates a transform that, when applied to the object database, results in the reference database. - - Database that does not include the changes - Name of the generated transform file, or null to only - check whether or not the two database are identical - true if a transform is generated, or false if a transform is not generated - because there are no differences between the two databases. - the transform could not be generated - a Database handle is invalid -

    - A transform can add non-primary key columns to the end of a table. A transform cannot - be created that adds primary key columns to a table. A transform cannot be created that - changes the order, names, or definitions of columns. -

    - If the transform is to be applied during an installation you must use the - method to populate the - summary information stream. -

    - Win32 MSI API: - MsiDatabaseGenerateTransform -

    -
    - - - Creates and populates the summary information stream of an existing transform file, and - fills in the properties with the base and reference ProductCode and ProductVersion. - - Database that does not include the changes - Name of the generated transform file - Error conditions that should be suppressed - when the transform is applied - Defines which properties should be validated - to verify that this transform can be applied to a database. - the transform summary info could not be - generated - a Database handle is invalid -

    - Win32 MSI API: - MsiCreateTransformSummaryInfo -

    -
    - - - Apply a transform to the database, recording the changes in the "_TransformView" table. - - Path to the transform file - the transform could not be applied - the Database handle is invalid -

    - Win32 MSI API: - MsiDatabaseApplyTransform -

    -
    - - - Apply a transform to the database, suppressing any error conditions - specified by the transform's summary information. - - Path to the transform file - the transform could not be applied - the Database handle is invalid -

    - Win32 MSI API: - MsiDatabaseApplyTransform -

    -
    - - - Apply a transform to the database, specifying error conditions to suppress. - - Path to the transform file - Error conditions that are to be suppressed - the transform could not be applied - the Database handle is invalid -

    - Win32 MSI API: - MsiDatabaseApplyTransform -

    -
    - - - Checks whether a transform is valid for this Database, according to its validation data and flags. - - Path to the transform file - true if the transform can be validly applied to this Database; false otherwise - the transform could not be applied - the Database handle is invalid - - - - Checks whether a transform is valid for this Database, according to its SummaryInfo data. - - SummaryInfo data of a transform file - true if the transform can be validly applied to this Database; false otherwise - error processing summary info - the Database or SummaryInfo handle is invalid - - - - Gets the file path the Database was originally opened from, or null if not known. - - - - - Gets the open mode for the database. - - - - - Gets a boolean value indicating whether this database was opened in read-only mode. - -

    - Win32 MSI API: - MsiGetDatabaseState -

    -
    - - - Gets the collection of tables in the Database. - - - - - Gets or sets the code page of the Database. - - error exporting/importing the codepage data - the Database handle is invalid -

    - Getting or setting the code page is a slow operation because it involves an export or import - of the codepage data to/from a temporary file. -

    -
    - - - Gets the SummaryInfo object for this database that can be used to examine and modify properties - to the summary information stream. - - the Database handle is invalid -

    - The object returned from this property does not need to be explicitly persisted or closed. - Any modifications will be automatically saved when the database is committed. -

    - Win32 MSI API: - MsiGetSummaryInformation -

    -
    - - - Managed-code portion of the embedded UI proxy. - - - - - Initializes managed embedded UI by loading the UI class and invoking its Initialize method. - - Integer handle to the installer session. - Name of the class that implements the embedded UI. This must - be of the form: "AssemblyName!Namespace.Class" - On entry, contains the current UI level for the installation. After this - method returns, the installer resets the UI level to the returned value of this parameter. - 0 if the embedded UI was successfully loaded and initialized, - ERROR_INSTALL_USEREXIT if the user canceled the installation during initialization, - or ERROR_INSTALL_FAILURE if the embedded UI could not be initialized. - - Due to interop limitations, the successful resulting UILevel is actually returned - as the high-word of the return value instead of via a ref parameter. - - - - - Passes a progress message to the UI class. - - Installer message type and message box options. - Handle to a record containing message data. - Return value returned by the UI class. - - - - Passes a shutdown message to the UI class. - - - - - Instantiates a UI class from a given assembly and class name. - - Installer session, for logging. - Name of the class that implements the embedded UI. This must - be of the form: "AssemblyName!Namespace.Class" - Interface on the UI class for handling UI messages. - - - - Specifies a return status value for custom actions. - - - - Action completed successfully. - - - Skip remaining actions, not an error. - - - User terminated prematurely. - - - Unrecoverable error or unhandled exception occurred. - - - Action not executed. - - - - Specifies the open mode for a . - - - - Open a database read-only, no persistent changes. - - - Open a database read/write in transaction mode. - - - Open a database direct read/write without transaction. - - - Create a new database, transact mode read/write. - - - Create a new database, direct mode read/write. - - - - Log modes available for - and . - - - - Disable logging. - - - Log out of memory or fatal exit information. - - - Log error messages. - - - Log warning messages. - - - Log user requests. - - - Log status messages that are not displayed. - - - Log request to determine a valid source location. - - - Log insufficient disk space error. - - - Log the start of installation actions. - - - Log the data record for installation actions. - - - Log parameters for user-interface initialization. - - - Log the property values at termination. - - - - Sends large amounts of information to log file not generally useful to users. - May be used for support. - - - - - Log extra debugging information. - - - - - Log only on error. - - - - - Log progress bar information. This message includes information on units so far and total number - of units. See for an explanation of the message format. This message - is only sent to an external user interface and is not logged. - - - - - If this is not a quiet installation, then the basic UI has been initialized. If this is a full - UI installation, the Full UI is not yet initialized. This message is only sent to an external - user interface and is not logged. - - - - - If a full UI is being used, the full UI has ended. If this is not a quiet installation, the basic - UI has not yet ended. This message is only sent to an external user interface and is not logged. - - - - - Sent prior to display of the Full UI dialog. This message is only sent to an external user - interface and is not logged. - - - - - List of files in use that need to be replaced. - - - - - [MSI 4.0] List of apps that the user can request Restart Manager to shut down and restart. - - - - - Type of message to be processed by , - , or . - - - - Premature termination, possibly fatal OOM. - - - Formatted error message. - - - Formatted warning message. - - - User request message. - - - Informative message for log. - - - List of files in use that need to be replaced. - - - Request to determine a valid source location. - - - Insufficient disk space message. - - - Start of action: action name & description. - - - Formatted data associated with individual action item. - - - Progress gauge info: units so far, total. - - - Product info for dialog: language Id, dialog caption. - - - Sent prior to UI initialization, no string data. - - - Sent after UI termination, no string data. - - - Sent prior to display or authored dialog or wizard. - - - [MSI 4.0] List of apps that the user can request Restart Manager to shut down and restart. - - - [MSI 4.5] Sent prior to install of a product. - - - [MSI 4.5] Sent after install of a product. - - - - Specifies the install mode for or . - - - - Provide the component only if the feature's installation state is . - - - Only check that the component is registered, without verifying that the key file of the component exists. - - - Provide the component only if the feature exists. - - - Provide the component and perform any installation necessary to provide the component. - - - - Specifies the run mode for . - - - - The administrative mode is installing, or the product is installing. - - - The advertisements are installing or the product is installing or updating. - - - An existing installation is being modified or there is a new installation. - - - Rollback is enabled. - - - The log file is active. It was enabled prior to the installation session. - - - Execute operations are spooling or they are in the determination phase. - - - A reboot is necessary after a successful installation (settable). - - - A reboot is necessary to continue the installation (settable). - - - Files from cabinets and Media table files are installing. - - - The source LongFileNames is suppressed through the PID_MSISOURCE summary property. - - - The target LongFileNames is suppressed through the SHORTFILENAMES property. - - - The operating system is Windows 95, Windows 98, or Windows ME. - - - The operating system supports demand installation. - - - A custom action called from install script execution. - - - A custom action called from rollback execution script. - - - A custom action called from commit execution script. - - - - Installed state of a Component or Feature. - - - - The component is disabled. - - - The installation configuration data is corrupt. - - - The installation is suspended or in progress. - - - Component is set to run from source, but source is unavailable. - - - The buffer overflow is returned. - - - An invalid parameter was passed to the function. - - - An unrecognized product or feature name was passed to the function. - - - The component is broken. - - - The feature is advertised. - - - The component is being removed. In action state and not settable. - - - The component is not installed, or action state is absent but clients remain. - - - The component is installed on the local drive. - - - The component will run from the source, CD, or network. - - - The component will be installed in the default location: local or source. - - - - Specifies the type of installation for . - - - - Searches system for products to patch. - - - Indicates a administrative installation. - - - Indicates a particular instance. - - - - Level of the installation user interface, specified with - . - - - - Does not change UI level. - - - Uses Default UI level. - - - Silent installation. - - - Simple progress and error handling. - - - Authored UI, wizard dialogs suppressed. - - - Authored UI with wizards, progress, and errors. - - - - When combined with the value, the installer does not display - the cancel button in the progress dialog. - - - - - When combined with the value, the installer displays progress - dialog boxes but does not display any modal dialog boxes or error dialog boxes. - - - - - When combined with another value, the installer displays a modal dialog - box at the end of a successful installation or if there has been an error. - No dialog box is displayed if the user cancels. - - - - - Forces display of the source resolution dialog even if the UI is otherwise silent. - - - - - Specifies a return status value for message handlers. These values are returned by - , , and . - - - - An error was found in the message handler. - - - No action was taken. - - - IDOK - - - IDCANCEL - - - IDABORT - - - IDRETRY - - - IDIGNORE - - - IDYES - - - IDNO - - - - Specifies constants defining which buttons to display for a message. This can be cast to - the MessageBoxButtons enum in System.Windows.Forms and System.Windows. - - - - - The message contains an OK button. - - - - - The message contains OK and Cancel buttons. - - - - - The message contains Abort, Retry, and Ignore buttons. - - - - - The message contains Yes, No, and Cancel buttons. - - - - - The message contains Yes and No buttons. - - - - - The message contains Retry and Cancel buttons. - - - - - Specifies constants defining which information to display. This can be cast to - the MessageBoxIcon enum in System.Windows.Forms and System.Windows. - - - - - The message contain no symbols. - - - - - The message contains a symbol consisting of white X in a circle with a red background. - - - - - The message contains a symbol consisting of a white X in a circle with a red background. - - - - - The message contains a symbol consisting of white X in a circle with a red background. - - - - - The message contains a symbol consisting of a question mark in a circle. - - - - - The message contains a symbol consisting of an exclamation point in a triangle with a yellow background. - - - - - The message contains a symbol consisting of an exclamation point in a triangle with a yellow background. - - - - - The message contains a symbol consisting of a lowercase letter i in a circle. - - - - - The message contains a symbol consisting of a lowercase letter i in a circle. - - - - - Specifies constants defining the default button on a message. This can be cast to - the MessageBoxDefaultButton enum in System.Windows.Forms and System.Windows. - - - - - The first button on the message is the default button. - - - - - The second button on the message is the default button. - - - - - The third button on the message is the default button. - - - - - Specifies the different patch states for . - - - - Invalid value. - - - Patches applied to a product. - - - Patches that are superseded by other patches. - - - Patches that are obsolesced by other patches. - - - Patches that are registered to a product but not applied. - - - All valid patch states. - - - - Specifies the reinstall mode for or . - - - - Reinstall only if file is missing. - - - Reinstall if file is missing, or older version. - - - Reinstall if file is missing, or equal or older version. - - - Reinstall if file is missing, or not exact version. - - - Checksum executables, reinstall if missing or corrupt. - - - Reinstall all files, regardless of version. - - - Insure required machine reg entries. - - - Insure required user reg entries. - - - Validate shortcuts items. - - - Use re-cache source install package. - - - - Attributes for methods. - - - - No attributes. - - - Request that the Windows Installer not shutdown the embedded UI until the transaction is complete. - - - Request that the Windows Installer transfer the embedded UI from the original installation. - - - - Transform error conditions available for or - . - - - - No error conditions. - - - Adding a row that already exists. - - - Deleting a row that doesn't exist. - - - Adding a table that already exists. - - - Deleting a table that doesn't exist. - - - Updating a row that doesn't exist. - - - Transform and database code pages do not match and neither code page is neutral. - - - Create the temporary _TransformView table when applying the transform. - - - - Transform validation flags available for . - - - - Validate no properties. - - - Default language must match base database. - - - Product must match base database. - - - Check major version only. - - - Check major and minor versions only. - - - Check major, minor, and update versions. - - - Installed version < base version. - - - Installed version <= base version. - - - Installed version = base version. - - - Installed version >= base version. - - - Installed version > base version. - - - UpgradeCode must match base database. - - - - Specifies the installation context for s, - es, and - - - - - Not installed. - - - User managed install context. - - - User non-managed context. - - - Per-machine context. - - - All contexts, or all valid values. - - - All user-managed contexts. - - - - Defines the type of error encountered by the , , - or methods of the class. - - - - No error. - - - The new record duplicates primary keys of the existing record in a table. - - - There are no null values allowed, or the column is about to be deleted but is referenced by another row. - - - The corresponding record in a foreign table was not found. - - - The data is greater than the maximum value allowed. - - - The data is less than the minimum value allowed. - - - The data is not a member of the values permitted in the set. - - - An invalid version string was supplied. - - - The case was invalid. The case must be all uppercase or all lowercase. - - - An invalid GUID was supplied. - - - An invalid wildcard file name was supplied, or the use of wildcards was invalid. - - - An invalid identifier was supplied. - - - Invalid language IDs were supplied. - - - An invalid file name was supplied. - - - An invalid path was supplied. - - - An invalid conditional statement was supplied. - - - An invalid format string was supplied. - - - An invalid template string was supplied. - - - An invalid string was supplied in the DefaultDir column of the Directory table. - - - An invalid registry path string was supplied. - - - An invalid string was supplied in the CustomSource column of the CustomAction table. - - - An invalid property string was supplied. - - - The _Validation table is missing a reference to a column. - - - The category column of the _Validation table for the column is invalid. - - - The table in the Keytable column of the _Validation table was not found or loaded. - - - The value in the MaxValue column of the _Validation table is less than the value in the MinValue column. - - - An invalid cabinet name was supplied. - - - An invalid shortcut target name was supplied. - - - The string is too long for the length specified by the column definition. - - - An invalid localization attribute was supplied. (Primary keys cannot be localized.) - - - - Specifies the modify mode for . - - - - - Refreshes the information in the supplied record without changing the position - in the result set and without affecting subsequent fetch operations. - - - - Refreshes the data in a Record. - - - Inserts a Record into the view. - - - Updates the View with new data from the Record. - - - Updates or inserts a Record into the View. - - - Updates or deletes and inserts a Record into the View. - - - Inserts or validates a record. - - - Deletes a Record from the View. - - - Inserts a Record into the View. The inserted data is not persistent. - - - Validates a record. - - - Validates a new record. - - - Validates fields of a fetched or new record. Can validate one or more fields of an incomplete record. - - - Validates a record that will be deleted later. - - - - Base class for Windows Installer exceptions. - - - - - Creates a new InstallerException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new InstallerException with a specified error message. - - The message that describes the error. - - - - Creates a new InstallerException. - - - - - Initializes a new instance of the InstallerException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Sets the SerializationInfo with information about the exception. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Gets extended information about the error, or null if no further information - is available. - - A Record object. Field 1 of the Record contains the installer - message code. Other fields contain data specific to the particular error. -

    - If the record is passed to , it is formatted - by looking up the string in the current database. If there is no installation - session, the formatted error message may be obtained by a query on the Error table using - the error code, followed by a call to . - Alternatively, the standard MSI message can by retrieved by calling the - method. -

    - The following methods and properties may report extended error data: - - (constructor) - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - . - (constructor) - . - . - . - . - . - . - . - . - . - -

    - The Record object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiGetLastErrorRecord -

    -
    - - - Gets the system error code that resulted in this exception, or 0 if not applicable. - - - - - Gets a message that describes the exception. This message may contain detailed - formatted error data if it was available. - - - - - User Canceled the installation. - - - - - Creates a new InstallCanceledException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new InstallCanceledException with a specified error message. - - The message that describes the error. - - - - Creates a new InstallCanceledException. - - - - - Initializes a new instance of the InstallCanceledException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - A bad SQL query string was passed to or . - - - - - Creates a new BadQuerySyntaxException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new BadQuerySyntaxException with a specified error message. - - The message that describes the error. - - - - Creates a new BadQuerySyntaxException. - - - - - Initializes a new instance of the BadQuerySyntaxException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - A method was called on an invalid installer handle. The handle may have been already closed. - - - - - Creates a new InvalidHandleException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new InvalidHandleException with a specified error message. - - The message that describes the error. - - - - Creates a new InvalidHandleException. - - - - - Initializes a new instance of the InvalidHandleException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - A failure occurred when executing . The exception may contain - details about the merge conflict. - - - - - Creates a new MergeException with a specified error message and a reference to the - inner exception that is the cause of this exception. - - The message that describes the error. - The exception that is the cause of the current exception. If the - innerException parameter is not a null reference (Nothing in Visual Basic), the current exception - is raised in a catch block that handles the inner exception. - - - - Creates a new MergeException with a specified error message. - - The message that describes the error. - - - - Creates a new MergeException. - - - - - Initializes a new instance of the MergeException class with serialized data. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Sets the SerializationInfo with information about the exception. - - The SerializationInfo that holds the serialized object data about the exception being thrown. - The StreamingContext that contains contextual information about the source or destination. - - - - Gets the number of merge conflicts in each table, corresponding to the tables returned by - . - - - - - Gets the list of tables containing merge conflicts. - - - - - Gets a message that describes the merge conflits. - - - - - Defines a callback function that the installer calls for progress notification and error messages. - - - - - [MSI 3.1] Defines a callback function that the installer calls for record-based progress notification and error messages. - - - - - Provides static methods for installing and configuring products and patches. - - - - - Enables an external user-interface handler. This external UI handler is called before the - normal internal user-interface handler. The external UI handler has the option to suppress - the internal UI by returning a non-zero value to indicate that it has handled the messages. - - A callback delegate that handles the UI messages - Specifies which messages to handle using the external message handler. - If the external handler returns a non-zero result, then that message will not be sent to the UI, - instead the message will be logged if logging has been enabled. - The previously set external handler, or null if there was no previously set handler -

    - To restore the previous UI handler, a second call is made to SetExternalUI using the - ExternalUIHandler returned by the first call to SetExternalUI and specifying - as the message filter. -

    - The external user interface handler does not have full control over the external user - interface unless is called with the uiLevel parameter set to - . If SetInternalUI is not called, the internal user - interface level defaults to . As a result, any message not - handled by the external user interface handler is handled by Windows Installer. The initial - "Preparing to install..." dialog always appears even if the external user interface - handler handles all messages. -

    - SetExternalUI should only be called from a bootstrapping application. You cannot call - it from a custom action -

    - Win32 MSI API: - MsiSetExternalUI -

    -
    - - - [MSI 3.1] Enables a record-based external user-interface handler. This external UI handler is called - before the normal internal user-interface handler. The external UI handler has the option to suppress - the internal UI by returning a non-zero value to indicate that it has handled the messages. - - A callback delegate that handles the UI messages - Specifies which messages to handle using the external message handler. - If the external handler returns a non-zero result, then that message will not be sent to the UI, - instead the message will be logged if logging has been enabled. - The previously set external handler, or null if there was no previously set handler -

    - To restore the previous UI handler, a second call is made to SetExternalUI using the - ExternalUIHandler returned by the first call to SetExternalUI and specifying - as the message filter. -

    - The external user interface handler does not have full control over the external user - interface unless is called with the uiLevel parameter set to - . If SetInternalUI is not called, the internal user - interface level defaults to . As a result, any message not - handled by the external user interface handler is handled by Windows Installer. The initial - "Preparing to install..." dialog always appears even if the external user interface - handler handles all messages. -

    - SetExternalUI should only be called from a bootstrapping application. You cannot call - it from a custom action -

    - Win32 MSI API: - MsiSetExternalUIRecord -

    -
    - - - Enables the installer's internal user interface. Then this user interface is used - for all subsequent calls to user-interface-generating installer functions in this process. - - Specifies the level of complexity of the user interface - Handle to a window, which becomes the owner of any user interface created. - A pointer to the previous owner of the user interface is returned. - The previous user interface level -

    - Win32 MSI API: - MsiSetInternalUI -

    -
    - - - Enables the installer's internal user interface. Then this user interface is used - for all subsequent calls to user-interface-generating installer functions in this process. - The owner of the user interface does not change. - - Specifies the level of complexity of the user interface - The previous user interface level -

    - Win32 MSI API: - MsiSetInternalUI -

    -
    - - - Enables logging of the selected message type for all subsequent install sessions in - the current process space. - - One or more mode flags specifying the type of messages to log - Full path to the log file. A null path disables logging, - in which case the logModes paraneter is ignored. - an invalid log mode was specified - This method takes effect on any new installation processes. Calling this - method from within a custom action will not start logging for that installation. - - - - Enables logging of the selected message type for all subsequent install sessions in - the current process space. - - One or more mode flags specifying the type of messages to log - Full path to the log file. A null path disables logging, - in which case the logModes paraneter is ignored. - If true, the log lines will be appended to any existing file content. - If false, the log file will be truncated if it exists. The default is false. - If true, the log will be flushed after every line. - If false, the log will be flushed every 20 lines. The default is true. - an invalid log mode was specified -

    - This method takes effect on any new installation processes. Calling this - method from within a custom action will not start logging for that installation. -

    - Win32 MSI API: - MsiEnableLog -

    -
    - - - increments the usage count for a particular feature and returns the installation state for - that feature. This method should be used to indicate an application's intent to use a feature. - - The product code of the product. - The feature to be used. - Must have the value . - The installed state of the feature. -

    - The UseFeature method should only be used on features known to be published. The application - should determine the status of the feature by calling either the FeatureState method or - Features method. -

    - Win32 MSI APIs: - MsiUseFeature, - MsiUseFeatureEx -

    -
    - - - Opens an installer package for use with functions that access the product database and install engine, - returning an Session object. - - Path to the package - Specifies whether or not the create a Session object that ignores the - computer state and that is incapable of changing the current computer state. A value of false yields - the normal behavior. A value of true creates a "safe" Session object that cannot change of the current - machine state. - A Session object allowing access to the product database and install engine - The product could not be opened - The installer configuration data is corrupt -

    - Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a - custom action because the active installation is the only session allowed. -

    - A "safe" Session object ignores the current computer state when opening the package and prevents - changes to the current computer state. -

    - The Session object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI APIs: - MsiOpenPackage, - MsiOpenPackageEx -

    -
    - - - Opens an installer package for use with functions that access the product database and install engine, - returning an Session object. - - Database used to create the session - Specifies whether or not the create a Session object that ignores the - computer state and that is incapable of changing the current computer state. A value of false yields - the normal behavior. A value of true creates a "safe" Session object that cannot change of the current - machine state. - A Session object allowing access to the product database and install engine - The product could not be opened - The installer configuration data is corrupt -

    - Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a - custom action because the active installation is the only session allowed. -

    - A "safe" Session object ignores the current computer state when opening the package and prevents - changes to the current computer state. -

    - The Session object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI APIs: - MsiOpenPackage, - MsiOpenPackageEx -

    -
    - - - Opens an installer package for an installed product using the product code. - - Product code of the installed product - A Session object allowing access to the product database and install engine, - or null if the specified product is not installed. - An unknown product was requested - The product could not be opened - The installer configuration data is corrupt -

    - Note that only one Session object can be opened by a single process. OpenProduct cannot be - used in a custom action because the active installation is the only session allowed. -

    - The Session object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiOpenProduct -

    -
    - - - Gets the full component path, performing any necessary installation. This method prompts for source if - necessary and increments the usage count for the feature. - - Product code for the product that contains the feature with the necessary component - Feature ID of the feature with the necessary component - Component code of the necessary component - Installation mode; this can also include bits from - Path to the component -

    - Win32 MSI API: - MsiProvideComponent -

    -
    - - - Gets the full component path for a qualified component that is published by a product and - performs any necessary installation. This method prompts for source if necessary and increments - the usage count for the feature. - - Specifies the component ID for the requested component. This may not be the - GUID for the component itself but rather a server that provides the correct functionality, as in the - ComponentId column of the PublishComponent table. - Specifies a qualifier into a list of advertising components (from PublishComponent Table). - Installation mode; this can also include bits from - Optional; specifies the product to match that has published the qualified component. - Path to the component -

    - Win32 MSI APIs: - MsiProvideQualifiedComponent - MsiProvideQualifiedComponentEx -

    -
    - - - Gets the full path to a Windows Installer component containing an assembly. This method prompts for a source and - increments the usage count for the feature. - - Assembly name - Set to null for global assemblies. For private assemblies, set to the full path of the - application configuration file (.cfg file) or executable file (.exe) of the application to which the assembly - has been made private. - Installation mode; this can also include bits from - True if this is a Win32 assembly, false if it is a .NET assembly - Path to the assembly -

    - Win32 MSI API: - MsiProvideAssembly -

    -
    - - - Installs files that are unexpectedly missing. - - Product code for the product that owns the component to be installed - Component to be installed - Specifies the way the component should be installed. - the user exited the installation -

    - Win32 MSI API: - MsiInstallMissingComponent -

    -
    - - - Installs files that are unexpectedly missing. - - Product code for the product that owns the file to be installed - File to be installed - the user exited the installation -

    - Win32 MSI API: - MsiInstallMissingFile -

    -
    - - - Reinstalls a feature. - - Product code for the product containing the feature to be reinstalled - Feature to be reinstalled - Reinstall modes - the user exited the installation -

    - Win32 MSI API: - MsiReinstallFeature -

    -
    - - - Reinstalls a product. - - Product code for the product to be reinstalled - Reinstall modes - the user exited the installation -

    - Win32 MSI API: - MsiReinstallProduct -

    -
    - - - Opens an installer package and initializes an install session. - - path to the patch package - command line property settings - There was an error installing the product -

    - To completely remove a product, set REMOVE=ALL in . -

    - This method displays the user interface with the current settings and - log mode. You can change user interface settings with the - and functions. You can set the log mode with the - function. -

    - The and properties should be - tested after calling this method. -

    - Win32 MSI API: - MsiInstallProduct -

    -
    - - - Installs or uninstalls a product. - - Product code of the product to be configured. - Specifies the default installation configuration of the - product. The parameter is ignored and all features - are installed if the parameter is set to any other - value than . This parameter must be either 0 - (install using authored feature levels), 65535 (install all features), or a value - between 0 and 65535 to install a subset of available features. - Specifies the installation state for the product. - Specifies the command line property settings. This should - be a list of the format Property=Setting Property=Setting. - There was an error configuring the product -

    - This method displays the user interface with the current settings and - log mode. You can change user interface settings with the - and functions. You can set the log mode with the - function. -

    - The and properties should be - tested after calling this method. -

    - Win32 MSI APIs: - MsiConfigureProduct, - MsiConfigureProductEx -

    -
    - - - Configures the installed state for a product feature. - - Product code of the product to be configured. - Specifies the feature ID for the feature to be configured. - Specifies the installation state for the feature. - There was an error configuring the feature -

    - The and properties should be - tested after calling this method. -

    - Win32 MSI API: - MsiConfigureFeature -

    -
    - - - For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes - an installation and sets the PATCH property to the path of the patch package. - - path to the patch package - optional command line property settings - There was an error applying the patch -

    - The and properties should be - tested after calling this method. -

    - Win32 MSI API: - MsiApplyPatch -

    -
    - - - For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes - an installation and sets the PATCH property to the path of the patch package. - - path to the patch package - path to the product to be patched, if installType - is set to - type of installation to patch - optional command line property settings - There was an error applying the patch -

    - The and properties should be - tested after calling this method. -

    - Win32 MSI API: - MsiApplyPatch -

    -
    - - - Removes one or more patches from a single product. To remove a patch from - multiple products, RemovePatches must be called for each product. - - List of patches to remove. Each patch can be specified by the GUID - of the patch or the full path to the patch package. - The ProductCode (GUID) of the product from which the patches - are removed. This parameter cannot be null. - optional command line property settings - There was an error removing the patches -

    - The and properties should be - tested after calling this method. -

    - Win32 MSI API: - MsiRemovePatches -

    -
    - - - Determines which patches apply to a specified product MSI and in what sequence. - - Full path to an MSI file that is the target product - for the set of patches. - An array of strings specifying the patches to be checked. Each item - may be the path to an MSP file, the path an XML file, or just an XML blob. - Callback to be invoked for each inapplicable patch, reporting the - reason the patch is not applicable. This value may be left null if that information is not - desired. - An array of selected patch strings from , indicating - the set of applicable patches. The items are re-ordered to be in the best sequence. -

    - If an item in is a file path but does not end in .MSP or .XML, - it is assumed to be an MSP file. -

    - As this overload uses InstallContext.None, it does not consider the current state of - the system. -

    - Win32 MSI API: - MsiDetermineApplicablePatches -

    -
    - - - Determines which patches apply to a specified product and in what sequence. If - the product is installed, this method accounts for patches that have already been applied to - the product and accounts for obsolete and superceded patches. - - The product that is the target for the set of patches. This may be - either a ProductCode (GUID) of a product that is currently installed, or the path to a an - MSI file. - An array of strings specifying the patches to be checked. Each item - may be the path to an MSP file, the path an XML file, or just an XML blob. - Callback to be invoked for each inapplicable patch, reporting the - reason the patch is not applicable. This value may be left null if that information is not - desired. - Specifies a security identifier (SID) of a user. This parameter restricts - the context of enumeration for this user account. This parameter cannot be the special SID - strings s-1-1-0 (everyone) or s-1-5-18 (local system). If is set to - or , then - must be null. For the current user context, - can be null and can be set to - or . - Restricts the enumeration to per-user-unmanaged, per-user-managed, - or per-machine context, or (if referring to an MSI) to no system context at all. This - parameter can be , , - , or . - An array of selected patch strings from , indicating - the set of applicable patches. The items are re-ordered to be in the best sequence. -

    - If an item in is a file path but does not end in .MSP or .XML, - it is assumed to be an MSP file. -

    - Passing an InstallContext of None only analyzes the MSI file; it does not consider the - current state of the system. You cannot use InstallContext.None with a ProductCode GUID. -

    - Win32 MSI APIs: - MsiDetermineApplicablePatches - MsiDeterminePatchSequence -

    -
    - - - Applies one or more patches to products that are eligible to receive the patch. - For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes - an installation and sets the PATCH property to the path of the patch package. - - The set of patch packages to be applied. - Each item is the full path to an MSP file. - Provides the ProductCode of the product being patched. If this parameter - is null, the patches are applied to all products that are eligible to receive these patches. - optional command line property settings -

    - Win32 MSI API: - MsiApplyMultiplePatches -

    -
    - - - Extracts information from a patch that can be used to determine whether the patch - applies on a target system. The method returns an XML string that can be provided to - - instead of the full patch file. - - Full path to the patch being queried. - XML string containing patch data. -

    - Win32 MSI API: - MsiExtractPatchXMLData -

    -
    - - - [MSI 3.1] Migrates a user's application configuration data to a new SID. - - Previous user SID that data is to be migrated from - New user SID that data is to be migrated to -

    - Win32 MSI API: - MsiNotifySidChange -

    -
    - - - Advertises a product to the local computer. - - Path to the package of the product being advertised - True if the product is user-assigned; false if it is machine-assigned. - Semi-colon delimited list of transforms to be applied. This parameter may be null. - The language to use if the source supports multiple languages - the specified package file does not exist - -

    - Win32 MSI APIs: - MsiAdvertiseProduct, - MsiAdvertiseProductEx -

    -
    - - - Generates an advertise script. The method enables the installer to write to a - script the registry and shortcut information used to assign or publish a product. - - Path to the package of the product being advertised - path to script file to be created with the advertise information - Semi-colon delimited list of transforms to be applied. This parameter may be null. - The language to use if the source supports multiple languages - the specified package file does not exist - -

    - Win32 MSI APIs: - MsiAdvertiseProduct, - MsiAdvertiseProductEx -

    -
    - - - Generates an advertise script. The method enables the installer to write to a - script the registry and shortcut information used to assign or publish a product. - - Path to the package of the product being advertised - path to script file to be created with the advertise information - Semi-colon delimited list of transforms to be applied. This parameter may be null. - The language to use if the source supports multiple languages - Targeted processor architecture. - True to install multiple instances through product code changing transform. - Advertises a new instance of the product. Requires that the parameter - includes the instance transform that changes the product code. - -

    - Win32 MSI APIs: - MsiAdvertiseProduct, - MsiAdvertiseProductEx -

    -
    - - - Copies an advertise script file to the local computer. - - Path to a script file generated by - - Flags controlling advertisement - True if specified items are to be removed instead of being created -

    - The process calling this function must be running under the LocalSystem account. To advertise an - application for per-user installation to a targeted user, the thread that calls this function must - impersonate the targeted user. If the thread calling this function is not impersonating a targeted - user, the application is advertised to all users for installation with elevated privileges. -

    -
    - - - Processes an advertise script file into the specified locations. - - Path to a script file generated by - - An optional path to a folder in which advertised icon files and transform - files are located. If this parameter is null, no icon or transform files are written. - True if shortcuts should be created - True if specified items are to be removed instead of created -

    - The process calling this function must be running under the LocalSystem account. To advertise an - application for per-user installation to a targeted user, the thread that calls this function must - impersonate the targeted user. If the thread calling this function is not impersonating a targeted - user, the application is advertised to all users for installation with elevated privileges. -

    - Win32 MSI API: - MsiProcessAdvertiseScript -

    -
    - - - Gets product information for an installer script file. - - Path to a script file generated by - - ProductInstallation stub with advertise-related properties filled in. - An invalid product property was requested -

    - Only the following properties will be filled in in the returned object:

      -
    • -
    • -
    • -
    • -
    • -
    Other properties will be null. -

    - Win32 MSI API: - MsiGetProductInfoFromScript -

    -
    - - - Gets a Windows Installer error message in the system default language. - - The error number. - The message string, or null if the error message is not found. -

    - The returned string may have tokens such as [2] and [3] that are meant to be substituted - with context-specific values. -

    - Error numbers greater than 2000 refer to MSI "internal" errors, and are always - returned in English. -

    -
    - - - Gets a Windows Installer error message in a specified language. - - The error number. - The locale for the message. - The message string, or null if the error message or locale is not found. -

    - The returned string may have tokens such as [2] and [3] that are meant to be substituted - with context-specific values. -

    - Error numbers greater than 2000 refer to MSI "internal" errors, and are always - returned in English. -

    -
    - - - Gets a formatted Windows Installer error message in the system default language. - - Error record containing the error number in the first field, and - error-specific parameters in the other fields. - The message string, or null if the error message is not found. -

    - Error numbers greater than 2000 refer to MSI "internal" errors, and are always - returned in English. -

    -
    - - - Gets a formatted Windows Installer error message in a specified language. - - Error record containing the error number in the first field, and - error-specific parameters in the other fields. - The locale for the message. - The message string, or null if the error message or locale is not found. -

    - Error numbers greater than 2000 refer to MSI "internal" errors, and are always - returned in English. -

    -
    - - - Gets the version string of the path specified using the format that the installer - expects to find it in in the database. - - Path to the file - Version string in the "#.#.#.#" format, or an empty string if the file - does not contain version information - the file does not exist or could not be read -

    - Win32 MSI API: - MsiGetFileVersion -

    -
    - - - Gets the language string of the path specified using the format that the installer - expects to find them in in the database. - - Path to the file - Language string in the form of a decimal language ID, or an empty string if the file - does not contain a language ID - the file does not exist or could not be read -

    - Win32 MSI API: - MsiGetFileVersion -

    -
    - - - Gets a 128-bit hash of the specified file. - - Path to the file - Integer array of length 4 which receives the - four 32-bit parts of the hash value. - the file does not exist or - could not be read -

    - Win32 MSI API: - MsiGetFileHash -

    -
    - - - Examines a shortcut and returns its product, feature name, and component if available. - - Full path to a shortcut - ShortcutTarget structure containing target product code, feature, and component code -

    - Win32 MSI API: - MsiGetShortcutTarget -

    -
    - - - Verifies that the given file is an installation package. - - Path to the package - True if the file is an installation package; false otherwise. - the specified package file does not exist - the package file could not be opened -

    - Win32 MSI API: - MsiVerifyPackage -

    -
    - - - [MSI 4.0] Gets the list of files that can be updated by one or more patches. - - ProductCode (GUID) of the product which is - the target of the patches - list of file paths of one or more patches to be - analyzed - List of absolute paths of files that can be updated when the - patches are applied on this system. -

    - Win32 MSI API: - MsiGetPatchFileList -

    -
    - - - Indicates whether a system reboot is required after running an installation or configuration operation. - - - - - Indicates whether a system reboot has been initiated after running an installation or configuration operation. - - - - - Gets the current version of the installer. - - - - - Accessor for information about features within the context of an installation session. - - - - - Checks if the collection contains a feature. - - name of the feature - true if the feature is in the collection, else false - - - - Copies the features into an array. - - array that receives the features - offset into the array - - - - Enumerates the features in the collection. - - an enumerator over all features in the collection - - - - Gets information about a feature within the context of an installation session. - - name of the feature - feature object - - - - Gets the number of features defined for the product. - - - - - Provides access to information about a feature within the context of an installation session. - - - - - Calculates the disk space required by the feature and its selected children and parent features. - - If true, the parent features are included in the cost. - If true, the child features are included in the cost. - Specifies the installation state. - The disk space requirement in bytes. -

    - Win32 MSI API: - MsiGetFeatureCost -

    -
    - - - Gets the name of the feature (primary key in the Feature table). - - - - - Gets the current install state of the feature. - - the Session handle is invalid - an unknown feature was requested -

    - Win32 MSI API: - MsiGetFeatureState -

    -
    - - - Gets or sets the action state of the feature. - - the Session handle is invalid - an unknown feature was requested -

    - When changing the feature action, the action state of all the Components linked to the changed - Feature records are also updated appropriately, based on the new feature Select state. - All Features can be configured at once by specifying the keyword ALL instead of a specific feature name. -

    - Win32 MSI APIs: - MsiGetFeatureState, - MsiSetFeatureState -

    -
    - - - Gets a list of valid installation states for the feature. - - the Session handle is invalid - an unknown feature was requested -

    - Win32 MSI API: - MsiGetFeatureValidStates -

    -
    - - - Gets or sets the attributes of the feature. - - the Session handle is invalid - an unknown feature was requested -

    - Win32 MSI APIs: - MsiGetFeatureInfo, - MsiSetFeatureAttributes -

    - Since the lpAttributes paramter of - MsiGetFeatureInfo - does not contain an equivalent flag for , this flag will - not be retrieved. -

    - Since the dwAttributes parameter of - MsiSetFeatureAttributes - does not contain an equivalent flag for , the presence - of this flag will be ignored. -

    -
    - - - Gets the title of the feature. - - the Session handle is invalid - an unknown feature was requested -

    - Win32 MSI API: - MsiGetFeatureInfo -

    -
    - - - Gets the description of the feature. - - the Session handle is invalid - an unknown feature was requested -

    - Win32 MSI API: - MsiGetFeatureInfo -

    -
    - - - Represents an instance of a feature of an installed product. - - - - - Creates a new FeatureInstallation instance for a feature of a product. - - feature name - ProductCode GUID - - - - Gets the name of the feature. - - - - - Gets the installed state of the feature. - -

    - Win32 MSI API: - MsiQueryFeatureState -

    -
    - - - Gets the parent of the feature, or null if the feature has no parent (it is a root feature). - - - Invocation of this property may be slightly costly for products with many features, - because it involves an enumeration of all the features in the product. - - - - - Gets the usage metrics for the feature. - -

    - If no usage metrics are recorded, the value is 0. -

    - Win32 MSI API: - MsiGetFeatureUsage -

    -
    - - - Holds data about the usage of a feature. - - - - - Gets count of the number of times the feature has been used. - - - - - Gets the date the feature was last used. - - - - - [MSI 4.5] Interface for an embedded external user interface for an installation. - - - Classes which implement this interface must have a public constructor that takes no parameters. - - - - - Initializes the embedded UI. - - Handle to the installer which can be used to get and set properties. - The handle is only valid for the duration of this method call. - Path to the directory that contains all the files from the MsiEmbeddedUI table. - On entry, contains the current UI level for the installation. After this - method returns, the installer resets the UI level to the returned value of this parameter. - True if the embedded UI was successfully initialized; false if the installation - should continue without the embedded UI. - The installation was canceled by the user. - The embedded UI failed to initialize and - causes the installation to fail. -

    - Win32 MSI API: - InitializeEmbeddedUI -

    -
    - - - Processes information and progress messages sent to the user interface. - - Message type. - Record that contains message data. - Message buttons. - Message box icon. - Message box default button. - Result of processing the message. -

    - Win32 MSI API: - EmbeddedUIHandler -

    -
    - - - Shuts down the embedded UI at the end of the installation. - - - If the installation was canceled during initialization, this method will not be called. - If the installation was canceled or failed at any later point, this method will be called at the end. -

    - Win32 MSI API: - ShutdownEmbeddedUI -

    -
    - - - Subclasses of this abstract class represent a unique instance of a - registered product or patch installation. - - - - - Gets the user security identifier (SID) under which this product or patch - installation is available. - - - - - Gets the user context of this product or patch installation. - - - - - Gets the source list of this product or patch installation. - - - - - Gets a value indicating whether this product or patch is installed on the current system. - - - - - Gets a property about the product or patch installation. - - Name of the property being retrieved. - - - - - Represents a per-drive disk space cost for an installation. - - - - - Creates a new InstallCost object. - - name of the drive this cost data applies to - installation cost on this drive, as a number of bytes - temporary disk space required on this drive, as a number of bytes - - - - The name of the drive this cost data applies to. - - - - - The installation cost on this drive, as a number of bytes. - - - - - The temporary disk space required on this drive, as a number of bytes. - -

    - This temporary space requirement is space needed only for the duration - of the installation, over the final footprint on disk. -

    -
    - - - Receives an exception from - - indicating the reason a particular patch is not applicable to a product. - - MSP file path, XML file path, or XML blob that was passed to - - exception indicating the reason the patch is not applicable -

    - If is an or subclass, then - its and - properties will indicate a more specific reason the patch was not applicable. -

    - The could also be a FileNotFoundException if the - patch string was a file path. -

    -
    - - - [MSI 4.5] Handle to a multi-session install transaction. - -

    - Win32 MSI APIs: - MsiBeginTransaction - MsiJoinTransaction - MsiEndTransaction -

    -
    - - - [MSI 4.5] Begins transaction processing of a multi-package installation. - - Name of the multi-package installation. - Select optional behavior when beginning the transaction. - The transaction could not be initialized. -

    - Win32 MSI API: - MsiBeginTransaction -

    -
    - - - Internal constructor. - - - The second parameter is an array in order to receive multiple values from the initialization method. - - - - - Creates a new Transaction object from an integer handle. - - Integer transaction handle - true to close the handle when this object is disposed - - - - Makes the current process the owner of the multi-package installation transaction. - - Select optional behavior when joining the transaction. - The transaction handle is not valid. - The transaction could not be joined. -

    - Win32 MSI API: - MsiJoinTransaction -

    -
    - - - Ends the install transaction and commits all changes to the system belonging to the transaction. - - The transaction could not be committed. -

    - Runs any Commit Custom Actions and commits to the system any changes to Win32 or common language - runtime assemblies. Deletes the rollback script, and after using this option, the transaction's - changes can no longer be undone with a Rollback Installation. -

    - This method can only be called by the current owner of the transaction. -

    - Win32 MSI API: - MsiEndTransaction -

    -
    - - - Ends the install transaction and undoes changes to the system belonging to the transaction. - - The transaction could not be rolled back. -

    - This method can only be called by the current owner of the transaction. -

    - Win32 MSI API: - MsiEndTransaction -

    -
    - - - Gets the name of the transaction. - - - - - Notifies listeners when the process that owns the transaction changed. - - - - - Represents a media disk source of a product or a patch. - - - - - Creates a new media disk. - - - - - - - - Gets or sets the disk id of the media disk. - - - - - Gets or sets the volume label of the media disk. - - - - - Gets or sets the disk prompt of the media disk. - - - - - The Patch object represents a unique instance of a patch that has been - registered or applied. - - - - - Enumerates patch installations based on certain criteria. - - PatchCode (GUID) of the patch to be enumerated. Only - instances of patches within the scope of the context specified by the - and parameters will be - enumerated. This parameter may be set to null to enumerate all patches in the specified - context. - ProductCode (GUID) product whose patches are to be - enumerated. If non-null, patch enumeration is restricted to instances of this product - within the specified context. If null, the patches for all products under the specified - context are enumerated. - Specifies a security identifier (SID) that restricts the context - of enumeration. A SID value other than s-1-1-0 is considered a user SID and restricts - enumeration to the current user or any user in the system. The special SID string - s-1-1-0 (Everyone) specifies enumeration across all users in the system. This parameter - can be set to null to restrict the enumeration scope to the current user. When - is set to the machine context only, - must be null. - Specifies the user context. - The of patches to return. -

    - Win32 MSI APIs: - MsiEnumPatchesEx -

    -
    - - - Creates a new object for accessing information about a patch installation on the current system. - - Patch code (GUID) of the patch. - ProductCode (GUID) the patch has been applied to. - This parameter may be null for patches that are registered only and not yet - applied to any product. -

    - All available user contexts will be queried. -

    -
    - - - Creates a new object for accessing information about a patch installation on the current system. - - Registered patch code (GUID) of the patch. - ProductCode (GUID) the patch has been applied to. - This parameter may be null for patches that are registered only and not yet - applied to any product. - The specific user, when working in a user context. This - parameter may be null to indicate the current user. The parameter must be null - when working in a machine context. - The user context. The calling process must have administrative - privileges to get information for a product installed for a user other than the - current user. -

    - If the is null, the Patch object may - only be used to read and update the patch's SourceList information. -

    -
    - - - Enumerates all patch installations on the system. - - Enumeration of patch objects. -

    - Win32 MSI API: - MsiEnumPatches -

    -
    - - - Gets the patch code (GUID) of the patch. - - - - - Gets the ProductCode (GUID) of the product. - - - - - Gets a value indicating whether this patch is currently installed. - - - - - Gets a value indicating whether this patch is marked as obsolte. - - - - - Gets a value indicating whether this patch is present but has been - superseded by a more recent installed patch. - - - - - Gets the installation state of this instance of the patch. - - An unknown patch was requested - The installer configuration data is corrupt - - - - Gets the cached patch file that the product uses. - - - - - Gets the set of patch transforms that the last patch - installation applied to the product. - -

    - This value may not be available for per-user, non-managed applications - if the user is not logged on. -

    -
    - - - Gets the date and time when the patch is applied to the product. - - - - - True patch is marked as possible to uninstall from the product. - -

    - Even if this property is true, the installer can still block the - uninstallation if this patch is required by another patch that - cannot be uninstalled. -

    -
    - - - Get the registered display name for the patch. - - - - - Gets the registered support information URL for the patch. - - - - - Gets information about a specific patch installation. - - The property being retrieved; see remarks for valid properties. - The property value, or an empty string if the property is not set for the patch. - An unknown patch or property was requested - The installer configuration data is corrupt -

    - Win32 MSI APIs: - MsiGetPatchInfo, - MsiGetPatchInfoEx -

    -
    - - - Represents a unique instance of a product that - is either advertised, installed or unknown. - - - - - Gets the set of all products with a specified upgrade code. This method lists the - currently installed and advertised products that have the specified UpgradeCode - property in their Property table. - - Upgrade code of related products - Enumeration of product codes -

    - Win32 MSI API: - MsiEnumRelatedProducts -

    -
    - - - Enumerates product installations based on certain criteria. - - ProductCode (GUID) of the product instances to be enumerated. Only - instances of products within the scope of the context specified by the - and parameters will be - enumerated. This parameter may be set to null to enumerate all products in the specified - context. - Specifies a security identifier (SID) that restricts the context - of enumeration. A SID value other than s-1-1-0 is considered a user SID and restricts - enumeration to the current user or any user in the system. The special SID string - s-1-1-0 (Everyone) specifies enumeration across all users in the system. This parameter - can be set to null to restrict the enumeration scope to the current user. When - is set to the machine context only, - must be null. - Specifies the user context. - An enumeration of product objects for enumerated product instances. -

    - Win32 MSI API: - MsiEnumProductsEx -

    -
    - - - Creates a new object for accessing information about a product installation on the current system. - - ProductCode (GUID) of the product. -

    - All available user contexts will be queried. -

    -
    - - - Creates a new object for accessing information about a product installation on the current system. - - ProductCode (GUID) of the product. - The specific user, when working in a user context. This - parameter may be null to indicate the current user. The parameter must be null - when working in a machine context. - The user context. The calling process must have administrative - privileges to get information for a product installed for a user other than the - current user. - - - - Gets the installed state for a product feature. - - The feature being queried; identifier from the - Feature table - Installation state of the feature for the product instance: either - , , - or . -

    - Win32 MSI APIs: - MsiQueryFeatureState, - MsiQueryFeatureStateEx -

    -
    - - - Gets the installed state for a product component. - - The component being queried; GUID of the component - as found in the ComponentId column of the Component table. - Installation state of the component for the product instance: either - or . -

    - Win32 MSI API: - MsiQueryComponentState -

    -
    - - - Obtains and stores the user information and product ID from an installation wizard. - -

    - This method is typically called by an application during the first run of the application. The application - first gets the or . - If those properties are missing, the application calls CollectUserInfo. - CollectUserInfo opens the product's installation package and invokes a wizard sequence that collects - user information. Upon completion of the sequence, user information is registered. Since this API requires - an authored user interface, the user interface level should be set to full by calling - as . -

    - The CollectUserInfo method invokes a FirstRun dialog from the product installation database. -

    - Win32 MSI API: - MsiCollectUserInfo -

    -
    - - - Some products might write some invalid/nonstandard version strings to the registry. - This method tries to get the best data it can. - - Version string retrieved from the registry. - Version object, or null if the version string is completely invalid. - - - - Enumerates all product installations on the system. - - An enumeration of product objects. -

    - Win32 MSI API: - MsiEnumProducts, -

    -
    - - - Gets the set of published features for the product. - - Enumeration of published features for the product. - The installer configuration data is corrupt -

    - Because features are not ordered, any new feature has an arbitrary index, meaning - this property can return features in any order. -

    - Win32 MSI API: - MsiEnumFeatures -

    -
    - - - Gets the ProductCode (GUID) of the product. - - - - - Gets a value indicating whether this product is installed on the current system. - - - - - Gets a value indicating whether this product is advertised on the current system. - - - - - Checks whether the product is installed with elevated privileges. An application is called - a "managed application" if elevated (system) privileges are used to install the application. - - True if the product is elevated; false otherwise -

    - Note that this property does not take into account policies such as AlwaysInstallElevated, - but verifies that the local system owns the product's registry data. -

    -
    - - - Gets the source list of this product installation. - - - - - The support link. - - - - - The support telephone. - - - - - Date and time the product was installed. - - - - - The installed product name. - - - - - The installation location. - - - - - The installation source. - - - - - The local cached package. - - - - - The publisher. - - - - - URL about information. - - - - - The URL update information. - - - - - The product version. - - - - - The product identifier. - -

    - For more information, see - ProductID -

    -
    - - - The company that is registered to use the product. - - - - - The owner who is registered to use the product. - - - - - Transforms. - - - - - Product language. - - - - - Human readable product name. - - - - - True if the product is advertised per-machine; - false if it is per-user or not advertised. - - - - - Identifier of the package that a product is installed from. - - - - - Version of the advertised product. - - - - - Primary icon for the package. - - - - - Name of the installation package for the advertised product. - - - - - True if the advertised product can be serviced by - non-administrators without elevation. - - - - - Gets information about an installation of a product. - - Name of the property being retrieved. - An unknown product or property was requested - The installer configuration data is corrupt -

    - Win32 MSI APIs: - MsiGetProductInfo, - MsiGetProductInfoEx -

    -
    - - - The Record object is a container for holding and transferring a variable number of values. - Fields within the record are numerically indexed and can contain strings, integers, streams, - and null values. Record fields are indexed starting with 1. Field 0 is a special format field. - -

    - Most methods on the Record class have overloads that allow using either a number - or a name to designate a field. However note that field names only exist when the - Record is directly returned from a query on a database. For other records, attempting - to access a field by name will result in an InvalidOperationException. -

    -
    - - - Creates a new record object with the requested number of fields. - - Required number of fields, which may be 0. - The maximum number of fields in a record is limited to 65535. -

    - The Record object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiCreateRecord -

    -
    - - - Creates a new record object, providing values for an arbitrary number of fields. - - The values of the record fields. The parameters should be of type Int16, Int32 or String -

    - The Record object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiCreateRecord -

    -
    - - - Creates a new Record object from an integer record handle. - -

    - This method is only provided for interop purposes. A Record object - should normally be obtained by calling - other methods. -

    The handle will be closed when this object is disposed or finalized.

    -

    - Integer record handle - true to close the handle when this object is disposed or finalized -
    - - - Sets all fields in a record to null. - -

    - Win32 MSI API: - MsiRecordClearData -

    -
    - - - Reports whether a record field is null. - - Specifies the field to check. - True if the field is null, false otherwise. - The field is less than 0 or greater than the - number of fields in the Record. -

    - Win32 MSI API: - MsiRecordIsNull -

    -
    - - - Reports whether a record field is null. - - Specifies the field to check. - True if the field is null, false otherwise. - The field name does not match any - of the named fields in the Record. - - - - Gets the length of a record field. The count does not include the terminating null. - - The field is less than 0 or greater than the - number of fields in the Record. -

    - The returned data size is 0 if the field is null, non-existent, - or an internal object pointer. The method also returns 0 if the handle is not a valid - Record handle. -

    - If the data is in integer format, the property returns 2 or 4. -

    - If the data is in string format, the property returns the character count - (not including the NULL terminator). -

    - If the data is in stream format, the property returns the byte count. -

    - Win32 MSI API: - MsiRecordDataSize -

    -
    - - - Gets the length of a record field. The count does not include the terminating null. - - Specifies the field to check. - The field name does not match any - of the named fields in the Record. -

    The returned data size is 0 if the field is null, non-existent, - or an internal object pointer. The method also returns 0 if the handle is not a valid - Record handle. -

    - If the data is in integer format, the property returns 2 or 4. -

    - If the data is in string format, the property returns the character count - (not including the NULL terminator). -

    - If the data is in stream format, the property returns the byte count. -

    -
    - - - Gets a field value as an integer. - - Specifies the field to retrieve. - Integer value of the field, or 0 if the field is null. - The field is less than 0 or greater than the - number of fields in the Record. -

    - Win32 MSI API: - MsiRecordGetInteger -

    - -
    - - - Gets a field value as an integer. - - Specifies the field to retrieve. - Integer value of the field, or 0 if the field is null. - The field name does not match any - of the named fields in the Record. - - - - - Gets a field value as an integer. - - Specifies the field to retrieve. - Integer value of the field, or null if the field is null. - The field is less than 0 or greater than the - number of fields in the Record. -

    - Win32 MSI API: - MsiRecordGetInteger -

    - -
    - - - Gets a field value as an integer. - - Specifies the field to retrieve. - Integer value of the field, or null if the field is null. - The field name does not match any - of the named fields in the Record. - - - - - Sets the value of a field to an integer. - - Specifies the field to set. - new value of the field - The field is less than 0 or greater than the - number of fields in the Record. -

    - Win32 MSI API: - MsiRecordSetInteger -

    - -
    - - - Sets the value of a field to an integer. - - Specifies the field to set. - new value of the field - The field name does not match any - of the named fields in the Record. - - - - - Sets the value of a field to a nullable integer. - - Specifies the field to set. - new value of the field - The field is less than 0 or greater than the - number of fields in the Record. -

    - Win32 MSI API: - MsiRecordSetInteger -

    - -
    - - - Sets the value of a field to a nullable integer. - - Specifies the field to set. - new value of the field - The field name does not match any - of the named fields in the Record. - - - - - Gets a field value as a string. - - Specifies the field to retrieve. - String value of the field, or an empty string if the field is null. - The field is less than 0 or greater than the - number of fields in the Record. -

    - Win32 MSI API: - MsiRecordGetString -

    -
    - - - Gets a field value as a string. - - Specifies the field to retrieve. - String value of the field, or an empty string if the field is null. - The field name does not match any - of the named fields in the Record. - - - - Sets the value of a field to a string. - - Specifies the field to set. - new value of the field - The field is less than 0 or greater than the - number of fields in the Record. -

    - Win32 MSI API: - MsiRecordSetString -

    -
    - - - Sets the value of a field to a string. - - Specifies the field to set. - new value of the field - The field name does not match any - of the named fields in the Record. - - - - Reads a record stream field into a file. - - Specifies the field of the Record to get. - Specifies the path to the file to contain the stream. - The field is less than 0 or greater than the - number of fields in the Record. - Attempt to extract a storage from a database open - in read-write mode, or from a database without an associated file path -

    - This method is capable of directly extracting substorages. To do so, first select both the - `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. - However, substorages may only be extracted from a database that is open in read-only mode. -

    - Win32 MSI API: - MsiRecordReadStream -

    -
    - - - Reads a record stream field into a file. - - Specifies the field of the Record to get. - Specifies the path to the file to contain the stream. - The field name does not match any - of the named fields in the Record. - Attempt to extract a storage from a database open - in read-write mode, or from a database without an associated file path -

    - This method is capable of directly extracting substorages. To do so, first select both the - `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. - However, substorages may only be extracted from a database that is open in read-only mode. -

    -
    - - - Gets a record stream field. - - Specifies the field of the Record to get. - A Stream that reads the field data. - The field is less than 0 or greater than the - number of fields in the Record. -

    - This method is not capable of reading substorages. To extract a substorage, - use . -

    - Win32 MSI API: - MsiRecordReadStream -

    -
    - - - Gets a record stream field. - - Specifies the field of the Record to get. - A Stream that reads the field data. - The field name does not match any - of the named fields in the Record. -

    - This method is not capable of reading substorages. To extract a substorage, - use . -

    -
    - - - Sets a record stream field from a file. Stream data cannot be inserted into temporary fields. - - Specifies the field of the Record to set. - Specifies the path to the file containing the stream. - The field is less than 0 or greater than the - number of fields in the Record. -

    - The contents of the specified file are read into a stream object. The stream persists if - the Record is inserted into the Database and the Database is committed. -

    - To reset the stream to its beginning you must pass in null for filePath. - Do not pass an empty string, "", to reset the stream. -

    - Setting a stream with this method is more efficient than setting a field to a - FileStream object. -

    - Win32 MSI API: - MsiRecordsetStream -

    -
    - - - Sets a record stream field from a file. Stream data cannot be inserted into temporary fields. - - Specifies the field name of the Record to set. - Specifies the path to the file containing the stream. - The field name does not match any - of the named fields in the Record. -

    - The contents of the specified file are read into a stream object. The stream persists if - the Record is inserted into the Database and the Database is committed. - To reset the stream to its beginning you must pass in null for filePath. - Do not pass an empty string, "", to reset the stream. -

    - Setting a stream with this method is more efficient than setting a field to a - FileStream object. -

    -
    - - - Sets a record stream field from a Stream object. Stream data cannot be inserted into temporary fields. - - Specifies the field of the Record to set. - Specifies the stream data. - The field is less than 0 or greater than the - number of fields in the Record. -

    - The stream persists if the Record is inserted into the Database and the Database is committed. -

    - Win32 MSI API: - MsiRecordsetStream -

    -
    - - - Sets a record stream field from a Stream object. Stream data cannot be inserted into temporary fields. - - Specifies the field name of the Record to set. - Specifies the stream data. - The field name does not match any - of the named fields in the Record. -

    - The stream persists if the Record is inserted into the Database and the Database is committed. -

    -
    - - - Gets a formatted string representation of the Record. - - A formatted string representation of the Record. -

    - If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. -

    - Win32 MSI API: - MsiFormatRecord -

    - - -
    - - - Gets a formatted string representation of the Record, optionally using a Session to format properties. - - an optional Session instance that will be used to lookup any - properties in the Record's format string - A formatted string representation of the Record. -

    - If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. -

    - Win32 MSI API: - MsiFormatRecord -

    - - -
    - - - Gets a formatted string representation of the Record. - - String to be used to format the data in the Record, - instead of the Record's format string. - A formatted string representation of the Record. -

    - Win32 MSI API: - MsiFormatRecord -

    -
    - - - Gets a formatted string representation of the Record, optionally using a Session to format properties. - - String to be used to format the data in the Record, - instead of the Record's format string. - an optional Session instance that will be used to lookup any - properties in the Record's format string - A formatted string representation of the Record. -

    - Win32 MSI API: - MsiFormatRecord -

    - - -
    - - - IsFormatStringInvalid is set from several View methods that invalidate the FormatString - and used to determine behavior during Record.ToString(). - - - - - Gets the number of fields in a record. - -

    - Win32 MSI API: - MsiRecordGetFieldCount -

    -
    - - - Gets or sets field 0 of the Record, which is the format string. - - - - - Gets or sets a record field value. - - Specifies the name of the field of the Record to get or set. - The name does not match any known field of the Record. -

    - When getting a field, the type of the object returned depends on the type of the Record field. - The object will be one of: Int16, Int32, String, Stream, or null. -

    - When setting a field, the type of the object provided will be converted to match the View - query that returned the record, or if Record was not returned from a view then the type of - the object provided will determine the type of the Record field. The object should be one of: - Int16, Int32, String, Stream, or null. -

    -
    - - - Gets or sets a record field value. - - Specifies the field of the Record to get or set. - The field is less than 0 or greater than the - number of fields in the Record. -

    - Record fields are indexed starting with 1. Field 0 is a special format field. -

    - When getting a field, the type of the object returned depends on the type of the Record field. - The object will be one of: Int16, Int32, String, Stream, or null. If the Record was returned - from a View, the type will match that of the field from the View query. Otherwise, the type - will match the type of the last value set for the field. -

    - When setting a field, the type of the object provided will be converted to match the View - query that returned the Record, or if Record was not returned from a View then the type of - the object provided will determine the type of the Record field. The object should be one of: - Int16, Int32, String, Stream, or null. -

    - The type-specific getters and setters are slightly more efficient than this property, since - they don't have to do the extra work to infer the value's type every time. -

    - Win32 MSI APIs: - MsiRecordGetInteger, - MsiRecordGetString, - MsiRecordSetInteger, - MsiRecordSetString -

    -
    - - - Assigns ID numbers to the MSI APIs that are remotable. - -

    - This enumeration MUST stay in sync with the - unmanaged equivalent in RemoteMsiSession.h! -

    -
    - - - Defines the signature of the native function - in SfxCA.dll that implements the remoting call. - - - - - Redirects native API calls to either the normal NativeMethods class - or to out-of-proc calls via the remoting channel. - - - - - Checks if the current process is using remoting to access the - MSI session and database APIs. - - - - - Sets a delegate that is used to make remote API calls. - -

    - The implementation of this delegate is provided by the - custom action host DLL. -

    -
    - - - The Session object controls the installation process. It opens the - install database, which contains the installation tables and data. - -

    - This object is associated with a standard set of action functions, - each performing particular operations on data from one or more tables. Additional - custom actions may be added for particular product installations. The basic engine - function is a sequencer that fetches sequential records from a designated sequence - table, evaluates any specified condition expression, and executes the designated - action. Actions not recognized by the engine are deferred to the UI handler object - for processing, usually dialog box sequences. -

    - Note that only one Session object can be opened by a single process. -

    -
    - - - Creates a new Session object from an integer session handle. - - Integer session handle - true to close the handle when this object is disposed or finalized -

    - This method is only provided for interop purposes. A Session object - should normally be obtained by calling - or . -

    -
    - - - Performs any enabled logging operations and defers execution to the UI handler - object associated with the engine. - - Type of message to be processed - Contains message-specific fields - A message-dependent return value - the Session or Record handle is invalid - an invalid message kind is specified - the user exited the installation - the message-handler failed for an unknown reason -

    - Logging may be selectively enabled for the various message types. - See the method. -

    - If record field 0 contains a formatting string, it is used to format the data in - the other fields. Else if the message is an error, warning, or user message, an attempt - is made to find a message template in the Error table for the current database using the - error number found in field 1 of the record for message types and return values. -

    - The parameter may also include message-box flags from - the following enumerations: System.Windows.Forms.MessageBoxButtons, - System.Windows.Forms.MessageBoxDefaultButton, System.Windows.Forms.MessageBoxIcon. These - flags can be combined with the InstallMessage with a bitwise OR. -

    - Note, this method never returns Cancel or Error values. Instead, appropriate - exceptions are thrown in those cases. -

    - Win32 MSI API: - MsiProcessMessage -

    -
    - - - Writes a message to the log, if logging is enabled. - - The line to be written to the log -

    - Win32 MSI API: - MsiProcessMessage -

    -
    - - - Writes a formatted message to the log, if logging is enabled. - - The line to be written to the log, containing 0 or more format specifiers - An array containing 0 or more objects to be formatted -

    - Win32 MSI API: - MsiProcessMessage -

    -
    - - - Evaluates a logical expression containing symbols and values. - - conditional expression - The result of the condition evaluation - the Session handle is invalid - the condition is null or empty - the conditional expression is invalid -

    - Win32 MSI API: - MsiEvaluateCondition -

    -
    - - - Evaluates a logical expression containing symbols and values, specifying a default - value to be returned in case the condition is empty. - - conditional expression - value to return if the condition is empty - The result of the condition evaluation - the Session handle is invalid - the conditional expression is invalid -

    - Win32 MSI API: - MsiEvaluateCondition -

    -
    - - - Formats a string containing installer properties. - - A format string containing property tokens - A formatted string containing property data - the Record handle is invalid -

    - Win32 MSI API: - MsiFormatRecord -

    -
    - - - Returns a formatted string from record data. - - Record object containing a template and data to be formatted. - The template string must be set in field 0 followed by any referenced data parameters. - A formatted string containing the record data - the Record handle is invalid -

    - Win32 MSI API: - MsiFormatRecord -

    -
    - - - Returns a formatted string from record data using a specified format. - - Record object containing a template and data to be formatted - Format string to be used instead of field 0 of the Record - A formatted string containing the record data - the Record handle is invalid -

    - Win32 MSI API: - MsiFormatRecord -

    -
    - - - Retrieves product properties (not session properties) from the product database. - - Value of the property, or an empty string if the property is not set. -

    - Note this is not the correct method for getting ordinary session properties. For that, - see the indexer on the Session class. -

    - Win32 MSI API: - MsiGetProductProperty -

    -
    - - - Checks to see if sufficient disk space is present for the current installation. - - True if there is sufficient disk space; false otherwise. -

    - Win32 MSI API: - MsiVerifyDiskSpace -

    -
    - - - Gets the total disk space per drive required for the installation. - - A list of InstallCost structures, specifying the cost for each drive -

    - Win32 MSI API: - MsiEnumComponentCosts -

    -
    - - - Gets the designated mode flag for the current install session. - - The type of mode to be checked. - The value of the designated mode flag. - the Session handle is invalid - an invalid mode flag was specified -

    - Note that only the following run modes are available to read from - a deferred custom action: - - - - -

    - Win32 MSI API: - MsiGetMode -

    -
    - - - Sets the designated mode flag for the current install session. - - The type of mode to be set. - The desired value of the mode. - the Session handle is invalid - an invalid mode flag was specified - the mode cannot not be set -

    - Win32 MSI API: - MsiSetMode -

    -
    - - - Gets the full path to the designated folder on the source media or server image. - - the folder was not found in the Directory table - the Session handle is invalid -

    - Win32 MSI API: - MsiGetSourcePath -

    -
    - - - Gets the full path to the designated folder on the installation target drive. - - the folder was not found in the Directory table - the Session handle is invalid -

    - Win32 MSI API: - MsiGetTargetPath -

    -
    - - - Sets the full path to the designated folder on the installation target drive. - - the folder was not found in the Directory table - the Session handle is invalid -

    - Setting the target path of a directory changes the path specification for the directory - in the in-memory Directory table. Also, the path specifications of all other path objects - in the table that are either subordinate or equivalent to the changed path are updated - to reflect the change. The properties for each affected path are also updated. -

    - If an error occurs in this function, all updated paths and properties revert to - their previous values. Therefore, it is safe to treat errors returned by this function - as non-fatal. -

    - Do not attempt to configure the target path if the components using those paths - are already installed for the current user or for a different user. Check the - ProductState property before setting the target path to determine if the product - containing this component is installed. -

    - Win32 MSI API: - MsiSetTargetPath -

    -
    - - - Sets the install level for the current installation to a specified value and - recalculates the Select and Installed states for all features in the Feature - table. Also sets the Action state of each component in the Component table based - on the new level. - - New install level - the Session handle is invalid -

    - The SetInstallLevel method sets the following: - The installation level for the current installation to a specified value - The Select and Installed states for all features in the Feature table - The Action state of each component in the Component table, based on the new level - - If 0 or a negative number is passed in the ilnstallLevel parameter, - the current installation level does not change, but all features are still - updated based on the current installation level. -

    - Win32 MSI API: - MsiSetInstallLevel -

    -
    - - - Executes a built-in action, custom action, or user-interface wizard action. - - Name of the action to execute. Case-sensitive. - the Session handle is invalid - the user exited the installation -

    - The DoAction method executes the action that corresponds to the name supplied. If the - name is not recognized by the installer as a built-in action or as a custom action in - the CustomAction table, the name is passed to the user-interface handler object, which - can invoke a function or a dialog box. If a null action name is supplied, the installer - uses the upper-case value of the ACTION property as the action to perform. If no property - value is defined, the default action is performed, defined as "INSTALL". -

    - Actions that update the system, such as the InstallFiles and WriteRegistryValues - actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction - is called from a custom action that is scheduled in the InstallExecuteSequence table - between the InstallInitialize and InstallFinalize actions. Actions that do not update the - system, such as AppSearch or CostInitialize, can be called. -

    - Win32 MSI API: - MsiDoAction -

    -
    - - - Executes a built-in action, custom action, or user-interface wizard action. - - Name of the action to execute. Case-sensitive. - Optional data to be passed to a deferred custom action. - the Session handle is invalid - the user exited the installation -

    - The DoAction method executes the action that corresponds to the name supplied. If the - name is not recognized by the installer as a built-in action or as a custom action in - the CustomAction table, the name is passed to the user-interface handler object, which - can invoke a function or a dialog box. If a null action name is supplied, the installer - uses the upper-case value of the ACTION property as the action to perform. If no property - value is defined, the default action is performed, defined as "INSTALL". -

    - Actions that update the system, such as the InstallFiles and WriteRegistryValues - actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction - is called from a custom action that is scheduled in the InstallExecuteSequence table - between the InstallInitialize and InstallFinalize actions. Actions that do not update the - system, such as AppSearch or CostInitialize, can be called. -

    - If the called action is a deferred, rollback, or commit custom action, then the supplied - will be available via the - property of that custom action's session. -

    - Win32 MSI API: - MsiDoAction -

    -
    - - - Executes an action sequence described in the specified table. - - Name of the table containing the action sequence. - the Session handle is invalid - the user exited the installation -

    - This method queries the specified table, ordering the actions by the numbers in the Sequence column. - For each row retrieved, an action is executed, provided that any supplied condition expression does - not evaluate to FALSE. -

    - An action sequence containing any actions that update the system, such as the InstallFiles and - WriteRegistryValues actions, cannot be run by calling DoActionSequence. The exception to this rule is if - DoActionSequence is called from a custom action that is scheduled in the InstallExecuteSequence table - between the InstallInitialize and InstallFinalize actions. Actions that do not update the system, such - as AppSearch or CostInitialize, can be called. -

    - Win32 MSI API: - MsiSequence -

    -
    - - - Implements formatting for data. - - Type of format object to get. - The the current instance, if is the same type - as the current instance; otherwise, null. - - - - Closes the session handle. Also closes the active database handle, if it is open. - After closing a handle, further method calls may throw an . - - If true, the method has been called directly - or indirectly by a user's code, so managed and unmanaged resources will - be disposed. If false, only unmanaged resources will be disposed. - - - - Throws an exception if the custom action is not able to access immedate session details. - - - - - Gets the Database for the install session. - - the Session handle is invalid - the Database cannot be accessed -

    - Normally there is no need to close this Database object. The same object can be - used throughout the lifetime of the Session, and it will be closed when the Session - is closed. -

    - Win32 MSI API: - MsiGetActiveDatabase -

    -
    - - - Gets the numeric language ID used by the current install session. - -

    - Win32 MSI API: - MsiGetLanguage -

    -
    - - - Gets or sets the string value of a named installer property, as maintained by the - Session object in the in-memory Property table, or, if it is prefixed with a percent - sign (%), the value of a system environment variable for the current process. - - the Session handle is invalid -

    - Win32 MSI APIs: - MsiGetProperty, - MsiSetProperty -

    -
    - - - Gets an accessor for components in the current session. - - - - - Gets an accessor for features in the current session. - - - - - Gets custom action data for the session that was supplied by the caller. - - - - - - Gets the (short) list of properties that are available from non-immediate custom actions. - - - - - Holds information about the target of a shortcut file. - - - - - Tests whether two shortcut targets have the same product code, feature, and/or component code. - - The first shortcut target to compare. - The second shortcut target to compare. - True if all parts of the targets are the same, else false. - - - - Tests whether two shortcut targets have the same product code, feature, and/or component code. - - The first shortcut target to compare. - The second shortcut target to compare. - True if any parts of the targets are different, else false. - - - - Tests whether two shortcut targets have the same product code, feature, and/or component code. - - The shortcut target to compare to the current object. - True if is a shortcut target and all parts of the targets are the same, else false. - - - - Generates a hash code using all parts of the shortcut target. - - An integer suitable for hashing the shortcut target. - - - - Gets the target product code of the shortcut, or null if not available. - - - - - Gets the name of the target feature of the shortcut, or null if not available. - - - - - Gets the target component code of the shortcut, or null if not available. - - - - - A list of sources for an installed product or patch. - - - - - Adds a network or URL source to the source list of the installed product. - - Path to the source to be added. This parameter is - expected to contain only the path without the filename. -

    - If this method is called with a new source, the installer adds the source - to the end of the source list. -

    - If this method is called with a source already existing in the source - list, it has no effect. -

    - Win32 MSI APIs: - MsiSourceListAddSource, - MsiSourceListAddSourceEx -

    - -
    - - - Adds or reorders a network or URL source for the product or patch. - - Path to the source to be added. This parameter is - expected to contain only the path without the filename. - Specifies the priority order in which the source - will be inserted -

    - If this method is called with a new source and - is set to 0, the installer adds the source to the end of the source list. -

    - If this method is called with a source already existing in the source - list and is set to 0, the installer retains the - source's existing index. -

    - If the method is called with an existing source in the source list - and is set to a non-zero value, the source is - removed from its current location in the list and inserted at the position - specified by Index, before any source that already exists at that position. -

    - If the method is called with a new source and Index is set to a - non-zero value, the source is inserted at the position specified by - , before any source that already exists at - that position. The index value for all sources in the list after the - index specified by Index are updated to ensure unique index values and - the pre-existing order is guaranteed to remain unchanged. -

    - If is greater than the number of sources - in the list, the source is placed at the end of the list with an index - value one larger than any existing source. -

    - Win32 MSI API: - MsiSourceListAddSourceEx -

    -
    - - - Clears sources of all types: network, url, and media. - -

    - Win32 MSI API: - MsiSourceListClearAll -

    -
    - - - Removes all network sources from the list. URL sources are not affected. - -

    - Win32 MSI API: - MsiSourceListClearAllEx -

    -
    - - - Removes all URL sources from the list. Network sources are not affected. - -

    - Win32 MSI API: - MsiSourceListClearAllEx -

    -
    - - - Checks if the specified source exists in the list. - - case-insensitive source to look for - true if the source exists in the list, false otherwise - - - - Copies the network and URL sources from this list into an array. - - destination array to be filed - offset into the destination array where copying begins - - - - Removes a network or URL source. - -

    - Win32 MSI API: - MsiSourceListClearSource -

    -
    - - - Enumerates the network and URL sources in the source list of the patch or product installation. - -

    - Win32 MSI API: - MsiSourceListEnumSources -

    -
    - - - Forces the installer to search the source list for a valid - source the next time a source is required. For example, when the - installer performs an installation or reinstallation, or when it - requires the path for a component that is set to run from source. - -

    - Win32 MSI APIs: - MsiSourceListForceResolution, - MsiSourceListForceResolutionEx -

    -
    - - - Gets the list of disks registered for the media source of - the patch or product installation. - - - - - Gets the number of network and URL sources in the list. - - - - - Gets a boolean value indicating whether the list is read-only. - A SourceList is never read-only. - - read-only status of the list - - - - Gets or sets the path relative to the root of the installation media. - - - - - Gets or sets the prompt template that is used when prompting the user - for installation media. - - - - - Gets or sets the most recently used source location for the product. - - - - - Gets or sets the name of the Windows Installer package or patch package - on the source. - - - - - Gets the type of the last-used source. - -

    -

      -
    • "n" = network location
    • -
    • "u" = URL location
    • -
    • "m" = media location
    • -
    • (empty string) = no last used source
    • -
    -

    -
    - - - Gets or sets source list information properties of a product or patch installation. - - The source list information property name. - An unknown product, patch, or property was requested -

    - Win32 MSI API: - MsiSourceListGetInfo -

    -
    - - - A list of source media for an installed product or patch. - - - - - Adds or updates a disk of the media source for the product or patch. - -

    - To change the disk prompt only, get the existing volume label from the - registry and provide it in this call along with the new disk prompt. - Passing a null or empty string for - registers an empty string as the volume label. -

    To change the volume label only, get the existing disk prompt - that is registered and provide it when calling SourceListAddMediaDisk - along with the new volume label. Passing null or an empty string - registers an empty string as the disk prompt.

    -

    - Win32 MSI API: - MsiSourceListAddMediaDisk -

    -
    - - - Removes all source media from the list. - -

    - Win32 MSI API: - MsiSourceListClearAllEx -

    -
    - - - Checks if the specified media disk id exists in the list. - - disk id of the media to look for - true if the media exists in the list, false otherwise - - - - Copies the source media info from this list into an array. - - destination array to be filed - offset into the destination array where copying begins - - - - Removes a specified disk from the set of registered disks. - - ID of the disk to remove -

    - Win32 MSI API: - MsiSourceListClearMediaDisk -

    -
    - - - Enumerates the source media in the source list of the patch or product installation. - -

    - Win32 MSI API: - MsiSourceListEnumMediaDisks -

    -
    - - - Gets the number of source media in the list. - - - - - Gets a boolean value indicating whether the list is read-only. - A SourceMediaList is never read-only. - - read-only status of the list - - - - Provides access to summary information of a Windows Installer database. - - - - - Gets a SummaryInfo object that can be used to examine, update, and add - properties to the summary information stream of a package or transform. - - Path to the package (database) or transform - True to reserve resources for writing summary information properties. - the package does not exist or could not be read - the package is an invalid format -

    - The SummaryInfo object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiGetSummaryInformation -

    -
    - - - Formats and writes the previously stored properties into the standard summary information stream. - - The stream cannot be successfully written. -

    - This method may only be called once after all the property values have been set. Properties may - still be read after the stream is written. -

    - Win32 MSI API: - MsiSummaryInfoPersist -

    -
    - - Gets or sets the Title summary information property. -

    - The Title summary information property briefly describes the type of installer package. Phrases - such as "Installation Database" or "Transform" or "Patch" may be used for this property. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the Subject summary information property. -

    - The Subject summary information property conveys to a file browser the product that can be installed using - the logic and data in this installer database. For example, the value of the summary property for - Microsoft Office 97 would be "Microsoft Office 97 Professional". This value is typically set from the - installer property ProductName. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the Author summary information property. -

    - The Author summary information property conveys to a file browser the manufacturer of the installation - database. This value is typically set from the installer property Manufacturer. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the Keywords summary information property. -

    - The Keywords summary information property is used by file browsers to hold keywords that permit the - database file to be found in a keyword search. The set of keywords typically includes "Installer" as - well as product-specific keywords, and may be localized. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the Comments summary information property. -

    - The Comments summary information property conveys the general purpose of the installer database. By convention, - the value for this summary property is set to the following: -

    - "This installer database contains the logic and data required to install <product name>." -

    - where <product name> is the name of the product being installed. In general the value for this summary - property only changes in the product name, nothing else. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the Template summary information property. -

    - The Template summary information propery indicates the platform and language versions supported by the database. -

    - The syntax of the Template Summary property information is: - [platform property][,platform property][,...];[language id][,language id][,...] -

    - For example, the following are all valid values for the Template Summary property: - - Intel;1033 - Intel64;1033 - ;1033 - ; - Intel ;1033,2046 - Intel64;1033,2046 - Intel;0 - -

    - If this is a 64-bit Windows Installer, enter Intel64 in the Template summary information property. Note that an - installation package cannot have both the Intel and Intel64 properties set. -

    - If the current platform does not match one of the platforms specified then the installer will not process the - package. Not specifying a platform implies that the package is platform-independent. -

    - Entering 0 in the language ID field of the Template summary information property, or leaving this field empty, - indicates that the package is language neutral. -

    - There are variations of this property depending on whether it is in a source installer database or a transform. -

    - Source Installer Database - Only one language can be specified in a source installer database. Merge Modules are - the only packages that may have multiple languages. For more information, see Multiple Language Merge Modules. -

    - Transform - In a transform file, only one language may be specified. The specified platform and language determine - whether a transform can be applied to a particular database. The platform property and the language property can - be left blank if no transform restriction relies on them to validate the transform. -

    - This summary property is REQUIRED. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the LastSavedBy summary information property. -

    - The installer sets the Last Saved By summary information property to the value of the LogonUser property during - an administrative installation. The installer never uses this property and a user never needs to modify it. - Developers of a database editing tool may use this property to track the last person to modify the database. - This property should be left set to null in a final shipping database. -

    - In a transform, this summary property contains the platform and language ID(s) that a database should have - after it has been transformed. The property specifies to what the Template should be set in the new database. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the RevisionNumber summary information property. -

    - The Revision Number summary information property contains the package code for the installer package. The - package code is a unique identifier of the installer package. -

    - The Revision Number summary information property of a patch package specifies the GUID patch code for - the patch. This is followed by a list of patch code GUIDs for obsolete patches that are removed when this - patch is applied. The patch codes are concatenated with no delimiters separating GUIDs in the list. -

    - The Revision Number summary information property of a transform package lists the product code GUIDs - and version of the new and original products and the upgrade code GUID. The list is separated with - semicolons as follows. -

    - Original-Product-Code Original-Product-Version ; New-Product Code New-Product-Version; Upgrade-Code -

    - This summary property is REQUIRED. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the CreatingApp summary information property. -

    - The CreatingApp summary information property conveys which application created the installer database. - In general the value for this summary property is the name of the software used to author this database. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the LastPrintTime summary information property. -

    - The LastPrintTime summary information property can be set to the date and time during an administrative - installation to record when the administrative image was created. For non-administrative installations - this property is the same as the CreateTime summary information property. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the CreateTime summary information property. -

    - The CreateTime summary information property conveys when the installer database was created. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the LastSaveTime summary information property. -

    - The LastSaveTime summary information property conveys when the last time the installer database was - modified. Each time a user changes an installation the value for this summary property is updated to - the current system time/date at the time the installer database was saved. Initially the value for - this summary property is set to null to indicate that no changes have yet been made. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the CodePage summary information property. -

    - The Codepage summary information property is the numeric value of the ANSI code page used for any - strings that are stored in the summary information. Note that this is not the same code page for - strings in the installation database. The Codepage summary information property is used to translate - the strings in the summary information into Unicode when calling the Unicode API functions. The - Codepage summary information property must be set before any string properties are set in the - summary information. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the PageCount summary information property. -

    - For an installation package, the PageCount summary information property contains the minimum - installer version required. For Windows Installer version 1.0, this property must be set to the - integer 100. For 64-bit Windows Installer Packages, this property must be set to the integer 200. -

    - For a transform package, the PageCount summary information property contains minimum installer - version required to process the transform. Set to the greater of the two PageCount summary information - property values belonging to the databases used to generate the transform. -

    - The PageCount summary information property is set to null in patch packages. -

    - This summary property is REQUIRED. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the WordCount summary information property. -

    - The WordCount summary information property indicates the type of source file image. If this property is - not present, it defaults to 0. Note that this property is stored in place of the standard Count property. -

    - This property is a bit field. New bits may be added in the future. At present the following bits are - available: - - Bit 0: 0 = long file names, 1 = short file names - Bit 1: 0 = source is uncompressed, 1 = source is compressed - Bit 2: 0 = source is original media, 1 = source is administrative installation - [MSI 4.0] Bit 3: 0 = elevated privileges can be required to install, 1 = elevated privileges are not required to install - -

    - These are combined to give the WordCount summary information property one of the following values - indicating a type of source file image: - - 0 - Original source using long file names. Matches tree in Directory table. - 1 - Original source using short file names. Matches tree in Directory table. - 2 - Compressed source files using long file names. Matches cabinets and files in the Media table. - 3 - Compressed source files using short file names. Matches cabinets and files in the Media table. - 4 - Administrative image using long file names. Matches tree in Directory table. - 5 - Administrative image using short file names. Matches tree in Directory table. - -

    - Note that if the package is marked as compressed (bit 1 is set), the installer only installs files - located at the root of the source. In this case, even files marked as uncompressed in the File table must - be located at the root to be installed. To specify a source image that has both a cabinet file (compressed - files) and uncompressed files that match the tree in the Directory table, mark the package as uncompressed - by leaving bit 1 unset (value=0) in the WordCount summary information property and set - (value=16384) in the Attributes column of the File table - for each file in the cabinet. -

    - For a patch package, the WordCount summary information property specifies the patch engine that was used - to create the patch files. The default value is 1 and indicates that MSPATCH was used to create the patch - A value of "2" means that the patch is using smaller, optimized, files available only with Windows Installer - version 1.2 or later. A patch with a WordCount of "2" fails immediately if used with a Windows Installer - version earlier than 1.2. A patch with a WordCount of "3" fails immediately if used with a Windows Installer - version earlier than 2.0. -

    - This summary property is REQUIRED. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the CharacterCount summary information property. -

    - The CharacterCount summary information property is only used in transforms. This part of the summary - information stream is divided into two 16-bit words. The upper word contains the transform validation - flags. The lower word contains the transform error condition flags. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - Gets or sets the Security summary information property. -

    - The Security summary information property conveys whether the package should be opened as read-only. The database - editing tool should not modify a read-only enforced database and should issue a warning at attempts to modify a - read-only recommended database. The following values of this property are applicable to Windows Installer files: - - 0 - no restriction - 2 - read only recommended - 4 - read only enforced - -

    - This property should be set to read-only recommended (2) for an installation database and to read-only - enforced (4) for a transform or patch. -

    - Win32 MSI APIs: - MsiSummaryInfoGetProperty, - MsiSummaryInfoSetProperty -

    -
    - - - Contains information about all the tables in a Windows Installer database. - - - - - Adds a new table to the database. - - information about the table to be added - a table with the same name already exists in the database - - - - Removes all tables (and all data) from the database. - - - - - Checks if the database contains a table with the given name. - - case-sensitive name of the table to search for - True if the table exists, false otherwise. - - - - Copies the table information from this collection into an array. - - destination array to be filed - offset into the destination array where copying begins - - - - Removes a table from the database. - - case-sensitive name of the table to be removed - true if the table was removed, false if the table did not exist - - - - Enumerates the tables in the database. - - - - - Gets the number of tables in the database. - - - - - Gets a boolean value indicating whether the collection is read-only. - A TableCollection is read-only when the database is read-only. - - read-only status of the collection - - - - Gets information about a given table. - - case-sensitive name of the table - information about the requested table, or null if the table does not exist in the database - - - - Defines a table in an installation database. - - - - - Creates a table definition. - - Name of the table. - Columns in the table. - The primary keys of the table. - - - - Gets a string representation of the table. - - The name of the table. - - - - Gets the name of the table. - - - - - Gets information about the columns in this table. - -

    - This property queries the database every time it is called, - to ensure the returned values are up-to-date. For best performance, - hold onto the returned collection if using it more than once. -

    -
    - - - Gets the names of the columns that are primary keys of the table. - - - - - Gets an SQL CREATE string that can be used to create the table. - - - - - Gets an SQL INSERT string that can be used insert a new record into the table. - -

    - The values are expressed as question-mark tokens, to be supplied by the record. -

    -
    - - - Gets an SQL SELECT string that can be used to select all columns of the table. - -

    - The columns are listed explicitly in the SELECT string, as opposed to using "SELECT *". -

    -
    - - - Contains specific information about an error encountered by the , - , or methods of the - class. - - - - - Gets the type of validation error encountered. - - - - - Gets the column containing the error, or null if the error applies to the whole row. - - - - - A View represents a result set obtained when processing a query using the - method of a - . Before any data can be transferred, - the query must be executed using the method, passing to - it all replaceable parameters designated within the SQL query string. - - - - - Executes a SQL View query and supplies any required parameters. The query uses the - question mark token to represent parameters as described in SQL Syntax. The values of - these parameters are passed in as the corresponding fields of a parameter record. - - Optional Record that supplies the parameters. This - Record contains values to replace the parameter tokens in the SQL query. - the View could not be executed - the View handle is invalid -

    - Win32 MSI API: - MsiViewExecute -

    -
    - - - Executes a SQL View query. - - the View could not be executed - the View handle is invalid -

    - Win32 MSI API: - MsiViewExecute -

    -
    - - - Fetches the next sequential record from the view, or null if there are no more records. - - the View is not in an active state - the View handle is invalid -

    - The Record object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. -

    - Win32 MSI API: - MsiViewFetch -

    -
    - - - Updates a fetched Record. - - specifies the modify mode - the Record to modify - the modification failed, - or a validation was requested and the data did not pass - the View handle is invalid -

    - You can update or delete a record immediately after inserting, or seeking provided you - have NOT modified the 0th field of the inserted or sought record. -

    - To execute any SQL statement, a View must be created. However, a View that does not - create a result set, such as CREATE TABLE, or INSERT INTO, cannot be used with any of - the Modify methods to update tables though the view. -

    - You cannot fetch a record containing binary data from one database and then use - that record to insert the data into another database. To move binary data from one database - to another, you should export the data to a file and then import it into the new database - using a query and the . This ensures that each database has - its own copy of the binary data. -

    - Note that custom actions can only add, modify, or remove temporary rows, columns, - or tables from a database. Custom actions cannot modify persistent data in a database, - such as data that is a part of the database stored on disk. -

    - Win32 MSI API: - MsiViewModify -

    - - - - - - - - - - - - - -
    - - - Refreshes the data in a Record. - - the Record to be refreshed - the refresh failed - the View handle is invalid -

    - The Record must have been obtained by calling . Fails with - a deleted Record. Works only with read-write Records. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Inserts a Record into the view. - - the Record to be inserted - the insertion failed - the View handle is invalid -

    - Fails if a row with the same primary keys exists. Fails with a read-only database. - This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Updates the View with new data from the Record. - - the new data - the update failed - the View handle is invalid -

    - Only non-primary keys can be updated. The Record must have been obtained by calling - . Fails with a deleted Record. Works only with read-write Records. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Updates or inserts a Record into the View. - - the Record to be assigned - the assignment failed - the View handle is invalid -

    - Updates record if the primary keys match an existing row and inserts if they do not match. - Fails with a read-only database. This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Updates or deletes and inserts a Record into the View. - - the Record to be replaced - the replacement failed - the View handle is invalid -

    - The Record must have been obtained by calling . Updates record if the - primary keys are unchanged. Deletes old row and inserts new if primary keys have changed. - Fails with a read-only database. This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Deletes a Record from the View. - - the Record to be deleted - the deletion failed - the View handle is invalid -

    - The Record must have been obtained by calling . Fails if the row has been - deleted. Works only with read-write records. This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Inserts a Record into the View. The inserted data is not persistent. - - the Record to be inserted - the insertion failed - the View handle is invalid -

    - Fails if a row with the same primary key exists. Works only with read-write records. - This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Refreshes the information in the supplied record without changing the position - in the result set and without affecting subsequent fetch operations. - - the Record to be filled with the result of the seek - the seek failed - the View handle is invalid -

    - After seeking, the Record may then be used for subsequent Update, Delete, and Refresh - operations. All primary key columns of the table must be in the query and the Record must - have at least as many fields as the query. Seek cannot be used with multi-table queries. - This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Inserts or validates a record. - - the Record to be merged - true if the record was inserted or validated, false if there is an existing - record with the same primary keys that is not identical - the merge failed (for a reason other than invalid data) - the View handle is invalid -

    - Works only with read-write records. This method cannot be used with a - View containing joins. -

    - See for more remarks. -

    - Win32 MSI API: - MsiViewModify -

    -
    - - - Validates a record, returning information about any errors. - - the Record to be validated - null if the record was validated; if there is an existing record with - the same primary keys that has conflicting data then error information is returned - the validation failed (for a reason other than invalid data) - the View handle is invalid -

    - The Record must have been obtained by calling . - Works with read-write and read-only records. This method cannot be used - with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI APIs: - MsiViewModify, - MsiViewGetError -

    -
    - - - Validates a new record, returning information about any errors. - - the Record to be validated - null if the record was validated; if there is an existing - record with the same primary keys then error information is returned - the validation failed (for a reason other than invalid data) - the View handle is invalid -

    - Checks for duplicate keys. The Record must have been obtained by - calling . Works with read-write and read-only records. - This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI APIs: - MsiViewModify, - MsiViewGetError -

    -
    - - - Validates fields of a fetched or new record, returning information about any errors. - Can validate one or more fields of an incomplete record. - - the Record to be validated - null if the record was validated; if there is an existing record with - the same primary keys that has conflicting data then error information is returned - the validation failed (for a reason other than invalid data) - the View handle is invalid -

    - Works with read-write and read-only records. This method cannot be used with - a View containing joins. -

    - See for more remarks. -

    - Win32 MSI APIs: - MsiViewModify, - MsiViewGetError -

    -
    - - - Validates a record that will be deleted later, returning information about any errors. - - the Record to be validated - null if the record is safe to delete; if another row refers to - the primary keys of this row then error information is returned - the validation failed (for a reason other than invalid data) - the View handle is invalid -

    - Validation does not check for the existence of the primary keys of this row in properties - or strings. Does not check if a column is a foreign key to multiple tables. Works with - read-write and read-only records. This method cannot be used with a View containing joins. -

    - See for more remarks. -

    - Win32 MSI APIs: - MsiViewModify, - MsiViewGetError -

    -
    - - - Enumerates over the Records retrieved by the View. - - An enumerator of Record objects. - The View was not d before attempting the enumeration. -

    - Each Record object should be d after use. - It is best that the handle be closed manually as soon as it is no longer - needed, as leaving lots of unused handles open can degrade performance. - However, note that it is not necessary to complete the enumeration just - for the purpose of closing handles, because Records are fetched lazily - on each step of the enumeration. -

    - Win32 MSI API: - MsiViewFetch -

    -
    - - - Gets the Database on which this View was opened. - - - - - Gets the SQL query string used to open this View. - - - - - Gets the set of tables that were included in the SQL query for this View. - - - - - Gets the set of columns that were included in the query for this View, - or null if this view is not a SELECT query. - - the View is not in an active state - the View handle is invalid -

    - Win32 MSI API: - MsiViewGetColumnInfo -

    -
    -
    -
    + + + + Microsoft.Deployment.WindowsInstaller + + + + + Collection of column information related to a or + . + + + + + Creates a new ColumnCollection based on a specified list of columns. + + columns to be added to the new collection + + + + Creates a new ColumnCollection that is associated with a database table. + + view that contains the columns + + + + Not supported because the collection is read-only. + + information about the column being added + the collection is read-only + + + + Not supported because the collection is read-only. + + the collection is read-only + + + + Checks if a column with a given name exists in the collection. + + case-sensitive name of the column to look for + true if the column exists in the collection, false otherwise + + + + Checks if a column with a given name exists in the collection. + + column to look for, with case-sensitive name + true if the column exists in the collection, false otherwise + + + + Gets the index of a column within the collection. + + case-sensitive name of the column to look for + 0-based index of the column, or -1 if not found + + + + Copies the columns from this collection into an array. + + destination array to be filed + offset into the destination array where copying begins + + + + Not supported because the collection is read-only. + + column to remove + true if the column was removed, false if it was not found + the collection is read-only + + + + Gets an enumerator over the columns in the collection. + + An enumerator of ColumnInfo objects. + + + + Gets an enumerator over the columns in the collection. + + An enumerator of ColumnInfo objects. + + + + Creates ColumnInfo objects for the associated view. + + dynamically-generated list of columns + + + + Gets a list of column names or column-definition-strings for the + associated view. + + the view to that defines the columns + true to return types (column definition strings), + false to return names + list of column names or types + + + + Gets the number of columns in the collection. + + number of columns in the collection + + + + Gets a boolean value indicating whether the collection is read-only. + A ColumnCollection is read-only if it is associated with a + or a read-only . + + read-only status of the collection + + + + Gets information about a specific column in the collection. + + 1-based index into the column collection + is less + than 1 or greater than the number of columns in the collection + + + + Gets information about a specific column in the collection. + + case-sensitive name of a column collection + does + not exist in the collection + + + + Gets a string suitable for printing all the values of a record containing these columns. + + + + + Available values for the Attributes column of the Component table. + + + + + Local only - Component cannot be run from source. + +

    + Set this value for all components belonging to a feature to prevent the feature from being run-from-network or + run-from-source. Note that if a feature has no components, the feature always shows run-from-source and + run-from-my-computer as valid options. +

    +
    + + + Component can only be run from source. + +

    + Set this bit for all components belonging to a feature to prevent the feature from being run-from-my-computer. + Note that if a feature has no components, the feature always shows run-from-source and run-from-my-computer + as valid options. +

    +
    + + + Component can run locally or from source. + + + + + If this bit is set, the value in the KeyPath column is used as a key into the Registry table. + +

    + If the Value field of the corresponding record in the Registry table is null, the Name field in that record + must not contain "+", "-", or "*". For more information, see the description of the Name field in Registry + table. +

    Setting this bit is recommended for registry entries written to the HKCU hive. This ensures the installer + writes the necessary HKCU registry entries when there are multiple users on the same machine.

    +

    +
    + + + If this bit is set, the installer increments the reference count in the shared DLL registry of the component's + key file. If this bit is not set, the installer increments the reference count only if the reference count + already exists. + + + + + If this bit is set, the installer does not remove the component during an uninstall. The installer registers + an extra system client for the component in the Windows Installer registry settings. + + + + + If this bit is set, the value in the KeyPath column is a key into the ODBCDataSource table. + + + + + If this bit is set, the installer reevaluates the value of the statement in the Condition column upon a reinstall. + If the value was previously False and has changed to true, the installer installs the component. If the value + was previously true and has changed to false, the installer removes the component even if the component has + other products as clients. + + + + + If this bit is set, the installer does not install or reinstall the component if a key path file or a key path + registry entry for the component already exists. The application does register itself as a client of the component. + +

    + Use this flag only for components that are being registered by the Registry table. Do not use this flag for + components registered by the AppId, Class, Extension, ProgId, MIME, and Verb tables. +

    +
    + + + Set this bit to mark this as a 64-bit component. This attribute facilitates the installation of packages that + include both 32-bit and 64-bit components. If this bit is not set, the component is registered as a 32-bit component. + +

    + If this is a 64-bit component replacing a 32-bit component, set this bit and assign a new GUID in the + ComponentId column. +

    +
    + + + Set this bit to disable registry reflection on all existing and new registry keys affected by this component. + +

    + If this bit is set, the Windows Installer calls the RegDisableReflectionKey on each key being accessed by the component. + This bit is available with Windows Installer version 4.0 and is ignored on 32-bit systems. +

    +
    + + + [MSI 4.5] Set this bit for a component in a patch package to prevent leaving orphan components on the computer. + +

    + If a subsequent patch is installed, marked with the SupersedeEarlier flag in its MsiPatchSequence + table to supersede the first patch, Windows Installer 4.5 can unregister and uninstall components marked with the + UninstallOnSupersedence value. If the component is not marked with this bit, installation of a superseding patch can leave + behind an unused component on the computer. +

    +
    + + + [MSI 4.5] If a component is marked with this attribute value in at least one package installed on the system, + the installer treats the component as marked in all packages. If a package that shares the marked component + is uninstalled, Windows Installer 4.5 can continue to share the highest version of the component on the system, + even if that highest version was installed by the package that is being uninstalled. + + + + + Defines flags for the Attributes column of the Control table. + + + + If this bit is set, the control is visible on the dialog box. + + + specifies if the given control is enabled or disabled. Most controls appear gray when disabled. + + + If this bit is set, the control is displayed with a sunken, three dimensional look. + + + The Indirect control attribute specifies whether the value displayed or changed by this control is referenced indirectly. + + + If this bit is set on a control, the associated property specified in the Property column of the Control table is an integer. + + + If this bit is set the text in the control is displayed in a right-to-left reading order. + + + If this style bit is set, text in the control is aligned to the right. + + + If this bit is set, the scroll bar is located on the left side of the control, otherwise it is on the right. + + + This is a combination of the RightToLeftReadingOrder, RightAligned, and LeftScroll attributes. + + + If this bit is set on a text control, the control is displayed transparently with the background showing through the control where there are no characters. + + + If this bit is set on a text control, the occurrence of the character "&" in a text string is displayed as itself. + + + If this bit is set the text in the control is displayed on a single line. + + + If this bit is set for a text control, the control will automatically attempt to format the displayed text as a number representing a count of bytes. + + + If this bit is set, fonts are created using the user's default UI code page. Otherwise it is created using the database code page. + + + If this bit is set on an Edit control, the installer creates a multiple line edit control with a vertical scroll bar. + + + This attribute creates an edit control for entering passwords. The control displays each character as an asterisk (*) as they are typed into the control. + + + If this bit is set on a ProgressBar control, the bar is drawn as a series of small rectangles in Microsoft Windows 95-style. Otherwise it is drawn as a single continuous rectangle. + + + If this bit is set, the control shows removable volumes. + + + If this bit is set, the control shows fixed internal hard drives. + + + If this bit is set, the control shows remote volumes. + + + If this bit is set, the control shows CD-ROM volumes. + + + If this bit is set, the control shows RAM disk volumes. + + + If this bit is set, the control shows floppy volumes. + + + Specifies whether or not the rollback backup files are included in the costs displayed by the VolumeCostList control. + + + If this bit is set, the items listed in the control are displayed in a specified order. Otherwise, items are displayed in alphabetical order. + + + If this bit is set on a combo box, the edit field is replaced by a static text field. This prevents a user from entering a new value and requires the user to choose only one of the predefined values. + + + If this bit is set on a check box or a radio button group, the button is drawn with the appearance of a push button, but its logic stays the same. + + + If this bit is set, the text in the control is replaced by a bitmap image. The Text column in the Control table is a foreign key into the Binary table. + + + If this bit is set, text is replaced by an icon image and the Text column in the Control table is a foreign key into the Binary table. + + + If this bit is set, the picture is cropped or centered in the control without changing its shape or size. + + + Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded. + + + Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded. + + + Specifies which size of the icon image to load. If none of the bits are set, the first image is loaded. + + + If this bit is set, and the installation is not yet running with elevated privileges, the control is created with a UAC icon. + + + If this bit is set, the RadioButtonGroup has text and a border displayed around it. + + + + Defines flags for the Type column of the CustomAction table. + + + + Unspecified custom action type. + + + Target = entry point name + + + Target = command line args + + + Target = text string to be formatted and set into property + + + Target = entry point name, null if none to call + + + Target = entry point name, null if none to call + + + Target = property list for nested engine initialization + + + Source = File.File, file part of installation + + + Source = Directory.Directory, folder containing existing file + + + Source = Property.Property, full path to executable + + + Ignore action return status, continue running + + + Run asynchronously + + + Skip if UI sequence already run + + + Skip if UI sequence already run in same process + + + Run on client only if UI already run on client + + + Queue for execution within script + + + In conjunction with InScript: queue in Rollback script + + + In conjunction with InScript: run Commit ops from script on success + + + No impersonation, run in system context + + + Impersonate for per-machine installs on TS machines + + + Script requires 64bit process + + + Don't record the contents of the Target field in the log file + + + The custom action runs only when a patch is being uninstalled + + + + Defines flags for the Attributes column of the Dialog table. + + + + If this bit is set, the dialog is originally created as visible, otherwise it is hidden. + + + If this bit is set, the dialog box is modal, other dialogs of the same application cannot be put on top of it, and the dialog keeps the control while it is running. + + + If this bit is set, the dialog box can be minimized. This bit is ignored for modal dialog boxes, which cannot be minimized. + + + If this style bit is set, the dialog box will stop all other applications and no other applications can take the focus. + + + If this bit is set, the other dialogs stay alive when this dialog box is created. + + + If this bit is set, the dialog box periodically calls the installer. If the property changes, it notifies the controls on the dialog. + + + If this bit is set, the pictures on the dialog box are created with the custom palette (one per dialog received from the first control created). + + + If this style bit is set the text in the dialog box is displayed in right-to-left-reading order. + + + If this style bit is set, the text is aligned on the right side of the dialog box. + + + If this style bit is set, the scroll bar is located on the left side of the dialog box. + + + This is a combination of the RightToLeftReadingOrder, RightAligned, and the LeftScroll dialog style bits. + + + If this bit is set, the dialog box is an error dialog. + + + + Available values for the Attributes column of the Feature table. + + + + + Favor local - Components of this feature that are not marked for installation from source are installed locally. + +

    + A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource, + is installed locally. Components marked in the Component + table are always run from the source CD/server. The bits FavorLocal and FavorSource work with features not + listed by the ADVERTISE property. +

    +
    + + + Components of this feature not marked for local installation are installed to run from the source + CD-ROM or server. + +

    + A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource, + is installed to run locally. Components marked (local-only) in the + Component table are always installed locally. The bits FavorLocal and FavorSource work with features + not listed by the ADVERTISE property. +

    +
    + + + Set this attribute and the state of the feature is the same as the state of the feature's parent. + You cannot use this option if the feature is located at the root of a feature tree. + +

    + Omit this attribute and the feature state is determined according to DisallowAdvertise and + FavorLocal and FavorSource. +

    To guarantee that the child feature's state always follows the state of its parent, even when the + child and parent are initially set to absent in the SelectionTree control, you must include both + FollowParent and UIDisallowAbsent in the attributes of the child feature.

    +

    Note that if you set FollowParent without setting UIDisallowAbsent, the installer cannot force + the child feature out of the absent state. In this case, the child feature matches the parent's + installation state only if the child is set to something other than absent.

    +

    Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.

    +

    +
    + + + Set this attribute and the feature state is Advertise. + +

    + If the feature is listed by the ADDDEFAULT property this bit is ignored and the feature state is determined + according to FavorLocal and FavorSource. +

    Omit this attribute and the feature state is determined according to DisallowAdvertise and FavorLocal + and FavorSource.

    +

    +
    + + + Set this attribute to prevent the feature from being advertised. + +

    + Note that this bit works only with features that are listed by the ADVERTISE property. +

    Set this attribute and if the listed feature is not a parent or child, the feature is installed according to + FavorLocal and FavorSource.

    +

    Set this attribute for the parent of a listed feature and the parent is installed.

    +

    Set this attribute for the child of a listed feature and the state of the child is Absent.

    +

    Omit this attribute and if the listed feature is not a parent or child, the feature state is Advertise.

    +

    Omit this attribute and if the listed feature is a parent or child, the state of both features is Advertise.

    +

    +
    + + + Set this attribute and the user interface does not display an option to change the feature state + to Absent. Setting this attribute forces the feature to the installation state, whether or not the + feature is visible in the UI. + +

    + Omit this attribute and the user interface displays an option to change the feature state to Absent. +

    Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.

    +

    Setting this attribute not only affects the UI, but also forces the feature to the install state whether + the feature is visible in the UI or not.

    +

    +
    + + + Set this attribute and advertising is disabled for the feature if the operating system shell does not + support Windows Installer descriptors. + + + + + Available values for the Attributes column of the File table. + + + + No attributes. + + + Read-only. + + + Hidden. + + + System. + + + The file is vital for the proper operation of the component to which it belongs. + + + The file contains a valid checksum. A checksum is required to repair a file that has become corrupted. + + + This bit must only be added by a patch and if the file is being added by the patch. + + + + The file's source type is uncompressed. If set, ignore the WordCount summary information property. If neither + Noncompressed nor Compressed are set, the compression state of the file is specified by the WordCount summary + information property. Do not set both Noncompressed and Compressed. + + + + + The file's source type is compressed. If set, ignore the WordCount summary information property. If neither + Noncompressed or Compressed are set, the compression state of the file is specified by the WordCount summary + information property. Do not set both Noncompressed and Compressed. + + + + + Defines values for the Action column of the IniFile and RemoveIniFile tables. + + + + Creates or updates a .ini entry. + + + Creates a .ini entry only if the entry does not already exist. + + + Deletes .ini entry. + + + Creates a new entry or appends a new comma-separated value to an existing entry. + + + Deletes a tag from a .ini entry. + + + + Defines values for the Type column of the CompLocator, IniLocator, and RegLocator tables. + + + + Key path is a directory. + + + Key path is a file name. + + + Key path is a registry value. + + + Set this bit to have the installer search the 64-bit portion of the registry. + + + + Defines values for the Root column of the Registry, RemoveRegistry, and RegLocator tables. + + + + HKEY_CURRENT_USER for a per-user installation, + or HKEY_LOCAL_MACHINE for a per-machine installation. + + + HKEY_CLASSES_ROOT + + + HKEY_CURRENT_USER + + + HKEY_LOCAL_MACHINE + + + HKEY_USERS + + + + Defines values for the InstallMode column of the RemoveFile table. + + + + Never remove. + + + Remove when the associated component is being installed (install state = local or source). + + + Remove when the associated component is being removed (install state = absent). + + + + Defines values for the ServiceType, StartType, and ErrorControl columns of the ServiceInstall table. + + + + No flags. + + + A Win32 service that runs its own process. + + + A Win32 service that shares a process. + + + A Win32 service that interacts with the desktop. + This value cannot be used alone and must be added to either + or . + + + Service starts during startup of the system. + + + Service starts when the service control manager calls the StartService function. + + + Specifies a service that can no longer be started. + + + Logs the error, displays a message box and continues the startup operation. + + + Logs the error if it is possible and the system is restarted with the last configuration + known to be good. If the last-known-good configuration is being started, the startup operation fails. + + + When combined with other error flags, specifies that the overall install should fail if + the service cannot be installed into the system. + + + + Defines values for the Event column of the ServiceControl table. + + + + No control events. + + + During an install, starts the service during the StartServices action. + + + During an install, stops the service during the StopServices action. + + + During an install, deletes the service during the DeleteServices action. + + + During an uninstall, starts the service during the StartServices action. + + + During an uninstall, stops the service during the StopServices action. + + + During an uninstall, deletes the service during the DeleteServices action. + + + + Defines values for the StyleBits column of the TextStyle table. + + + + Bold + + + Italic + + + Underline + + + Strike out + + + + Defines values for the Attributes column of the Upgrade table. + + + + Migrates feature states by enabling the logic in the MigrateFeatureStates action. + + + Detects products and applications but does not remove. + + + Continues installation upon failure to remove a product or application. + + + Detects the range of versions including the value in VersionMin. + + + Dectects the range of versions including the value in VersionMax. + + + Detects all languages, excluding the languages listed in the Language column. + + + + Defines a single column of a table in an installer database. + + Once created, a ColumnInfo object is immutable. + + + + Creates a new ColumnInfo object from a column definition. + + name of the column + column definition string + + + + + Creates a new ColumnInfo object from a list of parameters. + + name of the column + type of the column; must be one of the following: + Int16, Int32, String, or Stream + the maximum number of characters for String columns; + ignored for other column types + true if the column is required to have a non-null value + + + + Creates a new ColumnInfo object from a list of parameters. + + name of the column + type of the column; must be one of the following: + Int16, Int32, String, or Stream + the maximum number of characters for String columns; + ignored for other column types + true if the column is required to have a non-null value + true to if the column is only in-memory and + not persisted with the database + for String columns, indicates the column + is localizable; ignored for other column types + + + + Gets the name of the column. + + Name of the column. + + + + Gets the name of the column. + + name of the column + + + + Gets the type of the column as a System.Type. This is one of the following: Int16, Int32, String, or Stream + + type of the column + + + + Gets the type of the column as an integer that can be cast to a System.Data.DbType. This is one of the following: Int16, Int32, String, or Binary + + equivalent DbType of the column as an integer + + + + Gets the size of the column. + + The size of integer columns this is either 2 or 4. For string columns this is the maximum + recommended length of the string, or 0 for unlimited length. For stream columns, 0 is returned. + + + + Gets a value indicating whether the column must be non-null when inserting a record. + + required status of the column + + + + Gets a value indicating whether the column is temporary. Temporary columns are not persisted + when the database is saved to disk. + + temporary status of the column + + + + Gets a value indicating whether the column is a string column that is localizable. + + localizable status of the column + + + + Gets an SQL fragment that can be used to create this column within a CREATE TABLE statement. + + SQL fragment to be used for creating the column +

    + Examples: + + LONG + SHORT TEMPORARY + CHAR(0) LOCALIZABLE + CHAR(72) NOT NULL LOCALIZABLE + OBJECT + +

    +
    + + + Gets a short string defining the type and size of the column. + + + The definition string consists + of a single letter representing the data type followed by the width of the column (in characters + when applicable, bytes otherwise). A width of zero designates an unbounded width (for example, + long text fields and streams). An uppercase letter indicates that null values are allowed in + the column. + +

    + + s? - String, variable length (?=1-255) + s0 - String, variable length + i2 - Short integer + i4 - Long integer + v0 - Binary Stream + g? - Temporary string (?=0-255) + j? - Temporary integer (?=0,1,2,4) + l? - Localizable string, variable length (?=1-255) + l0 - Localizable string, variable length + +

    +
    + + + Accessor for information about components within the context of an installation session. + + + + + Checks if the collection contains a component. + + name of the component + true if the component is in the collection, else false + + + + Copies the features into an array. + + array that receives the features + offset into the array + + + + Enumerates the components in the collection. + + an enumerator over all features in the collection + + + + Gets information about a component within the context of an installation session. + + name of the component + component object + + + + Gets the number of components defined for the product. + + + + + Provides access to information about a component within the context of an installation session. + + + + + Gets disk space per drive required to install a component. + + Requested component state + A list of InstallCost structures, specifying the cost for each drive for the component +

    + Win32 MSI API: + MsiEnumComponentCosts +

    +
    + + + Gets the name of the component (primary key in the Component table). + + + + + Gets the current install state of the designated Component. + + the Session handle is invalid + an unknown Component was requested +

    + Win32 MSI API: + MsiGetComponentState +

    +
    + + + Gets or sets the action state of the designated Component. + + the Session handle is invalid + an unknown Component was requested + the user exited the installation +

    + Win32 MSI APIs: + MsiGetComponentState, + MsiSetComponentState +

    +
    + + + Represents an instance of a registered component. + + + + + Subclasses of this abstract class represent an instance + of a registered feature or component. + + + + + Gets the product that this item is a part of. + + + + + Gets the current installation state of the item. + + + + + Creates a new ComponentInstallation, automatically detecting the + product that the component is a part of. + + component GUID +

    + Win32 MSI API: + MsiGetProductCode +

    +
    + + + Creates a new ComponentInstallation for a component installed by a + specific product. + + component GUID + ProductCode GUID + + + + Gets the set of installed components for all products. + + The installer configuration data is corrupt +

    + Win32 MSI API: + MsiEnumComponents +

    +
    + + + Gets the component code (GUID) of the component. + + + + + Gets all client products of a specified component. + + enumeration over all client products of the component + The installer configuration data is corrupt +

    + Because clients are not ordered, any new component has an arbitrary index. + This means that the property may return clients in any order. +

    + Win32 MSI API: + MsiEnumClients +

    +
    + + + Gets the installed state of a component. + + the installed state of the component, or InstallState.Unknown + if this component is not part of a product +

    + Win32 MSI API: + MsiGetComponentPath +

    +
    + + + Gets the full path to an installed component. If the key path for the component is a + registry key then the registry key is returned. + + The file or registry keypath to the component, or null if the component is not available. + An unknown product or component was specified + The installer configuration data is corrupt +

    + If the component is a registry key, the registry roots are represented numerically. + For example, a registry path of "HKEY_CURRENT_USER\SOFTWARE\Microsoft" would be returned + as "01:\SOFTWARE\Microsoft". The registry roots returned are defined as follows: + HKEY_CLASSES_ROOT=00, HKEY_CURRENT_USER=01, HKEY_LOCAL_MACHINE=02, HKEY_USERS=03, + HKEY_PERFORMANCE_DATA=04 +

    + Win32 MSI APIs: + MsiGetComponentPath, + MsiLocateComponent +

    +
    + + + Gets the set of registered qualifiers for the component. + + Enumeration of the qulifiers for the component. + The installer configuration data is corrupt +

    + Because qualifiers are not ordered, any new qualifier has an arbitrary index, + meaning the function can return qualifiers in any order. +

    + Win32 MSI API: + MsiEnumComponentQualifiers +

    +
    + + + Holds data about a component qualifier. + +

    + Win32 MSI API: + MsiEnumComponentQualifiers +

    +
    + + + Gets the qualifier code. + + + + + Gets the qualifier data. + + + + + Marks a method as a custom action entry point. + +

    + A custom action method must be defined as public and static, + take a single object as a parameter, + and return an enumeration value. +

    +
    + + + Name of the custom action entrypoint, or null if the same as the method name. + + + + + Marks a method as a custom action entry point. + + + + + Marks a method as a custom action entry point. + + Name of the function to be exported, + defaults to the name of this method + + + + Gets or sets the name of the custom action entrypoint. A null + value defaults to the name of the method. + + name of the custom action entrypoint, or null if none was specified + + + + Contains a collection of key-value pairs suitable for passing between + immediate and deferred/rollback/commit custom actions. + + + Call the method to get a string + suitable for storing in a property and reconstructing the custom action data later. + + + + + + + "CustomActionData" literal property name. + + + + + Creates a new empty custom action data object. + + + + + Reconstructs a custom action data object from data that was previously + persisted in a string. + + Previous output from . + + + + Adds a key and value to the data collection. + + Case-sensitive data key. + Data value (may be null). + the key does not consist solely of letters, + numbers, and the period, underscore, and space characters. + + + + Adds a value to the data collection, using XML serialization to persist the object as a string. + + Case-sensitive data key. + Data value (may be null). + the key does not consist solely of letters, + numbers, and the period, underscore, and space characters. + The value type does not support XML serialization. + The value could not be serialized. + + + + Gets a value from the data collection, using XML serialization to load the object from a string. + + Case-sensitive data key. + The value could not be deserialized. + + + + Determines whether the data contains an item with the specified key. + + Case-sensitive data key. + true if the data contains an item with the key; otherwise, false + + + + Removes the item with the specified key from the data. + + Case-sensitive data key. + true if the item was successfully removed from the data; + false if an item with the specified key was not found + + + + Gets the value with the specified key. + + Case-sensitive data key. + Value associated with the specified key, or + null if an item with the specified key was not found + true if the data contains an item with the specified key; otherwise, false. + + + + Adds an item with key and value to the data collection. + + Case-sensitive data key, with a data value that may be null. + the key does not consist solely of letters, + numbers, and the period, underscore, and space characters. + + + + Removes all items from the data. + + + + + Determines whether the data contains a specified item. + + The data item to locate. + true if the data contains the item; otherwise, false + + + + Copies the data to an array, starting at a particular array index. + + Destination array. + Index in the array at which copying begins. + + + + Removes an item from the data. + + The item to remove. + true if the item was successfully removed from the data; + false if the item was not found + + + + Returns an enumerator that iterates through the collection. + + An enumerator that can be used to iterate through the collection. + + + + Returns an enumerator that iterates through the collection. + + An enumerator that can be used to iterate through the collection. + + + + Gets a string representation of the data suitable for persisting in a property. + + Data string in the form "Key1=Value1;Key2=Value2" + + + + Ensures that a key contains valid characters. + + key to be validated + the key does not consist solely of letters, + numbers, and the period, underscore, and space characters. + + + + Serializes a value into an XML string. + + Type of the value. + Value to be serialized. + Serialized value data as a string. + + + + Deserializes a value from an XML string. + + Expected type of the value. + Serialized value data. + Deserialized value object. + + + + Escapes a value string by doubling any data-separator (semicolon) characters. + + + Escaped value string + + + + Unescapes a value string by undoubling any doubled data-separator (semicolon) characters. + + + Unescaped value string + + + + Loads key-value pairs from a string into the data collection. + + key-value pair list of the form returned by + + + + Gets a collection object containing all the keys of the data. + + + + + Gets a collection containing all the values of the data. + + + + + Gets or sets a data value with a specified key. + + Case-sensitive data key. + the key does not consist solely of letters, + numbers, and the period, underscore, and space characters. + + + + Gets the number of items in the data. + + + + + Gets a value indicating whether the data is read-only. + + + + + Managed-code portion of the custom action proxy. + + + + + Invokes a managed custom action method. + + Integer handle to the installer session. + Name of the custom action entrypoint. This must + either map to an entrypoint definition in the customActions + config section, or be an explicit entrypoint of the form: + "AssemblyName!Namespace.Class.Method" + Pointer to a delegate used to + make remote API calls, if this custom action is running out-of-proc. + The value returned by the custom action method, + or ERROR_INSTALL_FAILURE if the custom action could not be invoked. + + + + Checks the "MMsiBreak" environment variable for any matching custom action names. + + List of names to search for in the environment + variable string. + True if a match was found, else false. + + + + Locates and parses an entrypoint mapping in CustomAction.config. + + Installer session handle, just used for logging. + Custom action entrypoint name: the key value + in an item in the customActions section of the config file. + Returned display name of the assembly from + the entrypoint mapping. + Returned class name of the entrypoint mapping. + Returned method name of the entrypoint mapping. + True if the entrypoint was found, false if not or if some error + occurred. + + + + Uses reflection to load the assembly and class and find the method. + + Installer session handle, just used for logging. + Display name of the assembly containing the + custom action method. + Fully-qualified name of the class containing the + custom action method. + Name of the custom action method. + The method, or null if not found. + + + + Checks if a method has the right return and paramater types + for a custom action, and that it is marked by a CustomActionAttribute. + + Method to be checked. + True if the method is a valid custom action, else false. + + + + Accesses a Windows Installer database. + +

    + The method must be called before the Database is closed to write out all + persistent changes. If the Commit method is not called, the installer performs an implicit + rollback upon object destruction. +

    + The client can use the following procedure for data access: + Obtain a Database object using one of the Database constructors. + Initiate a query using a SQL string by calling the + method of the Database. + Set query parameters in a and execute the database + query by calling the method of the . This + produces a result that can be fetched or updated. + Call the method of the View repeatedly to return + Records. + Update database rows of a Record object obtained by the Fetch method using + one of the methods of the View. + Release the query and any unfetched records by calling the + method of the View. + Persist any database updates by calling the Commit method of the Database. + + +

    +
    + + + Base class for Windows Installer handle types (Database, View, Record, SummaryInfo). + +

    + These classes implement the interface, because they + hold unmanaged resources (MSI handles) that should be properly disposed + when no longer needed. +

    +
    + + + Constructs a handle object from a native integer handle. + + Native integer handle. + true to close the handle when this object is disposed or finalized + + + + Closes the handle. After closing a handle, further method calls may throw an . + +

    + The finalizer of this class will NOT close the handle if it is still open, + because finalization can run on a separate thread from the application, + resulting in potential problems if handles are closed from that thread. + It is best that the handle be closed manually as soon as it is no longer needed, + as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiCloseHandle +

    + +
    + + + Closes the handle. After closing a handle, further method calls may throw an . + +

    + The finalizer of this class will NOT close the handle if it is still open, + because finalization can run on a separate thread from the application, + resulting in potential problems if handles are closed from that thread. + It is best that the handle be closed manually as soon as it is no longer needed, + as leaving lots of unused handles open can degrade performance. +

    + This method is merely an alias for the method. +

    + Win32 MSI API: + MsiCloseHandle +

    +
    + + + Tests whether this handle object is equal to another handle object. Two handle objects are equal + if their types are the same and their native integer handles are the same. + + The handle object to compare with the current handle object. + true if the specified handle object is equal to the current handle object; otherwise false + + + + Gets a hash value for the handle object. + + A hash code for the handle object. +

    + The hash code is derived from the native integer handle. +

    +
    + + + Closes the handle. After closing a handle, further method calls may throw an . + + If true, the method has been called directly or indirectly by a user's code, + so managed and unmanaged resources will be disposed. If false, the method has been called by the + runtime from inside the finalizer, and only unmanaged resources will be disposed. + + + + Gets the native integer handle. + + + + + Checks if the handle is closed. When closed, method calls on the handle object may throw an . + + + + + Gets an object that can be used internally for safe syncronization. + + + + + Opens an existing database in read-only mode. + + Path to the database file. + the database could not be created/opened +

    + Because this constructor initiates database access, it cannot be used with a + running installation. +

    + The Database object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiOpenDatabase +

    +
    + + + Opens an existing database with another database as output. + + Path to the database to be read. + Open mode for the database + Database object representing the created or opened database + the database could not be created/opened +

    + When a database is opened as the output of another database, the summary information stream + of the output database is actually a read-only mirror of the original database and thus cannot + be changed. Additionally, it is not persisted with the database. To create or modify the + summary information for the output database it must be closed and re-opened. +

    + The Database object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + The database is opened in mode, and will be + automatically commited when it is closed. +

    + Win32 MSI API: + MsiOpenDatabase +

    +
    + + + Opens an existing database or creates a new one. + + Path to the database file. If an empty string + is supplied, a temporary database is created that is not persisted. + Open mode for the database + the database could not be created/opened +

    + Because this constructor initiates database access, it cannot be used with a + running installation. +

    + The database object should be d after use. + The finalizer will close the handle if it is still open, however due to the nondeterministic + nature of finalization it is best that the handle be closed manually as soon as it is no + longer needed, as leaving lots of unused handles open can degrade performance. +

    + A database opened in or + mode will be automatically commited when it is + closed. However a database opened in or + mode must have the method + called before it is closed, otherwise no changes will be persisted. +

    + Win32 MSI API: + MsiOpenDatabase +

    +
    + + + Creates a new database from an MSI handle. + + Native MSI database handle. + True if the handle should be closed + when the database object is disposed + Path of the database file, if known + Mode the handle was originally opened in + + + + Creates a new Database object from an integer database handle. + +

    + This method is only provided for interop purposes. A Database object + should normally be obtained from or + a public Database constructor. +

    + Integer database handle + true to close the handle when this object is disposed +
    + + + Schedules a file or directory for deletion after the database handle is closed. + + File or directory path to be deleted. All files and subdirectories + under a directory are deleted. +

    + Once an item is scheduled, it cannot be unscheduled. +

    + The items cannot be deleted if the Database object is auto-disposed by the + garbage collector; the handle must be explicitly closed. +

    + Files which are read-only or otherwise locked cannot be deleted, + but they will not cause an exception to be thrown. +

    +
    + + + Merges another database with this database. + + The database to be merged into this database + Optional name of table to contain the names of the tables containing + merge conflicts, the number of conflicting rows within the table, and a reference to the table + with the merge conflict. + merge failed due to a schema difference or data conflict + the Database handle is invalid +

    + Merge does not copy over embedded cabinet files or embedded transforms from the + reference database into the target database. Embedded data streams that are listed in the + Binary table or Icon table are copied from the reference database to the target database. + Storage embedded in the reference database are not copied to the target database. +

    + The Merge method merges the data of two databases. These databases must have the same + codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists + if the data in any row in the first database differs from the data in the corresponding row + of the second database. Corresponding rows are in the same table of both databases and have + the same primary key in both databases. The tables of non-conflicting databases must have + the same number of primary keys, same number of columns, same column types, same column names, + and the same data in rows with identical primary keys. Temporary columns however don't matter + in the column count and corresponding tables can have a different number of temporary columns + without creating conflict as long as the persistent columns match. +

    + If the number, type, or name of columns in corresponding tables are different, the + schema of the two databases are incompatible and the installer will stop processing tables + and the merge fails. The installer checks that the two databases have the same schema before + checking for row merge conflicts. If the schemas are incompatible, the databases have be + modified. +

    + If the data in particular rows differ, this is a row merge conflict, the merge fails + and creates a new table with the specified name. The first column of this table is the name + of the table having the conflict. The second column gives the number of rows in the table + having the conflict. +

    + Win32 MSI API: + MsiDatabaseMerge +

    +
    + + + Merges another database with this database. + + The database to be merged into this database + merge failed due to a schema difference or data conflict + the Database handle is invalid +

    + MsiDatabaseMerge does not copy over embedded cabinet files or embedded transforms from + the reference database into the target database. Embedded data streams that are listed in + the Binary table or Icon table are copied from the reference database to the target database. + Storage embedded in the reference database are not copied to the target database. +

    + The Merge method merges the data of two databases. These databases must have the same + codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists + if the data in any row in the first database differs from the data in the corresponding row + of the second database. Corresponding rows are in the same table of both databases and have + the same primary key in both databases. The tables of non-conflicting databases must have + the same number of primary keys, same number of columns, same column types, same column names, + and the same data in rows with identical primary keys. Temporary columns however don't matter + in the column count and corresponding tables can have a different number of temporary columns + without creating conflict as long as the persistent columns match. +

    + If the number, type, or name of columns in corresponding tables are different, the + schema of the two databases are incompatible and the installer will stop processing tables + and the merge fails. The installer checks that the two databases have the same schema before + checking for row merge conflicts. If the schemas are incompatible, the databases have be + modified. +

    + Win32 MSI API: + MsiDatabaseMerge +

    +
    + + + Checks whether a table exists and is persistent in the database. + + The table to the checked + true if the table exists and is persistent in the database; false otherwise + the table is unknown + the Database handle is invalid +

    + To check whether a table exists regardless of persistence, + use . +

    + Win32 MSI API: + MsiDatabaseIsTablePersistent +

    +
    + + + Checks whether a table contains a persistent column with a given name. + + The table to the checked + The name of the column to be checked + true if the column exists in the table; false if the column is temporary or does not exist. + the View could not be executed + the Database handle is invalid +

    + To check whether a column exists regardless of persistence, + use . +

    +
    + + + Gets the count of all rows in the table. + + Name of the table whose rows are to be counted + The count of all rows in the table + the View could not be executed + the Database handle is invalid + + + + Gets the count of all rows in the table that satisfy a given condition. + + Name of the table whose rows are to be counted + Conditional expression, such as could be placed on the end of a SQL WHERE clause + The count of all rows in the table satisfying the condition + the SQL WHERE syntax is invalid + the View could not be executed + the Database handle is invalid + + + + Finalizes the persistent form of the database. All persistent data is written + to the writeable database, and no temporary columns or rows are written. + + the Database handle is invalid +

    + For a database open in mode, this method has no effect. +

    + For a database open in or + mode, it is not necessary to call this method because the database will be automatically committed + when it is closed. However this method may be called at any time to persist the current state of tables + loaded into memory. +

    + For a database open in or + mode, no changes will be persisted until this method is called. If the database object is closed without + calling this method, the database file remains unmodified. +

    + Win32 MSI API: + MsiDatabaseCommit +

    +
    + + + Copies the structure and data from a specified table to a text archive file. + + Name of the table to be exported + Path to the file to be created + the file path is invalid + the Database handle is invalid +

    + Win32 MSI API: + MsiDatabaseExport +

    +
    + + + Imports a database table from a text archive file, dropping any existing table. + + Path to the file to be imported. + The table name is specified within the file. + the file path is invalid + the Database handle is invalid +

    + Win32 MSI API: + MsiDatabaseImport +

    +
    + + + Exports all database tables, streams, and summary information to archive files. + + Path to the directory where archive files will be created + the directory path is invalid + the Database handle is invalid +

    + The directory will be created if it does not already exist. +

    + Win32 MSI API: + MsiDatabaseExport +

    +
    + + + Imports all database tables, streams, and summary information from archive files. + + Path to the directory from which archive files will be imported + the directory path is invalid + the Database handle is invalid +

    + Win32 MSI API: + MsiDatabaseImport +

    +
    + + + Creates a new record object with the requested number of fields. + + Required number of fields, which may be 0. + The maximum number of fields in a record is limited to 65535. + A new record object that can be used with the database. +

    + This method is equivalent to directly calling the + constructor in all cases outside of a custom action context. When in a + custom action session, this method allows creation of a record that can + work with a database other than the session database. +

    + The Record object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiCreateRecord +

    +
    + + + Returns the file path of this database, or the handle value if a file path was not specified. + + + + + Closes the database handle. After closing a handle, further method calls may throw . + + If true, the method has been called directly or + indirectly by a user's code, so managed and unmanaged resources will be + disposed. If false, only unmanaged resources will be disposed. + + + + Gets a View object representing the query specified by a SQL string. + + SQL query string, which may contain format items + Zero or more objects to format + A View object representing the query specified by a SQL string + the SQL syntax is invalid + the Database handle is invalid +

    + The parameter is formatted using . +

    + The View object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiDatabaseOpenView +

    +
    + + + Executes the query specified by a SQL string. The query may not be a SELECT statement. + + SQL query string, which may contain format items + Zero or more objects to format + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + The parameter is formatted using + . +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute +

    +
    + + + Executes the query specified by a SQL string. The query may not be a SELECT statement. + + SQL query string + Optional Record object containing the values that replace + the parameter tokens (?) in the SQL query. + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute +

    +
    + + + Executes the specified SQL SELECT query and returns all results. + + SQL query string, which may contain format items + Zero or more objects to format + All results combined into an array + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + The parameter is formatted using + . +

    + Multiple rows columns will be collapsed into a single one-dimensional list. +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Executes the specified SQL SELECT query and returns all results. + + SQL SELECT query string + Optional Record object containing the values that replace + the parameter tokens (?) in the SQL query. + All results combined into an array + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + Multiple rows columns will be collapsed into a single one-dimensional list. +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Executes the specified SQL SELECT query and returns all results as integers. + + SQL query string, which may contain format items + Zero or more objects to format + All results combined into an array + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + The parameter is formatted using + . +

    + Multiple rows columns will be collapsed into a single one-dimensional list. +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Executes the specified SQL SELECT query and returns all results as integers. + + SQL SELECT query string + Optional Record object containing the values that replace + the parameter tokens (?) in the SQL query. + All results combined into an array + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + Multiple rows columns will be collapsed into a single one-dimensional list. +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Executes the specified SQL SELECT query and returns all results as strings. + + SQL query string, which may contain format items + Zero or more objects to format + All results combined into an array + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + The parameter is formatted using + . +

    + Multiple rows columns will be collapsed into a single on-dimensional list. +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Executes the specified SQL SELECT query and returns all results as strings. + + SQL SELECT query string + Optional Record object containing the values that replace + the parameter tokens (?) in the SQL query. + All results combined into an array + the SQL syntax is invalid + the View could not be executed + the Database handle is invalid +

    + Multiple rows columns will be collapsed into a single on-dimensional list. +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Executes the specified SQL SELECT query and returns a single result. + + SQL query string, which may contain format items + Zero or more objects to format + First field of the first result + the SQL syntax is invalid + the View could not be executed + or the query returned 0 results + the Database handle is invalid +

    + The parameter is formatted using + . +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Executes the specified SQL SELECT query and returns a single result. + + SQL SELECT query string + Optional Record object containing the values that replace + the parameter tokens (?) in the SQL query. + First field of the first result + the SQL syntax is invalid + the View could not be executed + or the query returned 0 results + the Database handle is invalid +

    + Win32 MSI APIs: + MsiDatabaseOpenView, + MsiViewExecute, + MsiViewFetch +

    +
    + + + Creates a transform that, when applied to the object database, results in the reference database. + + Database that does not include the changes + Name of the generated transform file, or null to only + check whether or not the two database are identical + true if a transform is generated, or false if a transform is not generated + because there are no differences between the two databases. + the transform could not be generated + a Database handle is invalid +

    + A transform can add non-primary key columns to the end of a table. A transform cannot + be created that adds primary key columns to a table. A transform cannot be created that + changes the order, names, or definitions of columns. +

    + If the transform is to be applied during an installation you must use the + method to populate the + summary information stream. +

    + Win32 MSI API: + MsiDatabaseGenerateTransform +

    +
    + + + Creates and populates the summary information stream of an existing transform file, and + fills in the properties with the base and reference ProductCode and ProductVersion. + + Database that does not include the changes + Name of the generated transform file + Error conditions that should be suppressed + when the transform is applied + Defines which properties should be validated + to verify that this transform can be applied to a database. + the transform summary info could not be + generated + a Database handle is invalid +

    + Win32 MSI API: + MsiCreateTransformSummaryInfo +

    +
    + + + Apply a transform to the database, recording the changes in the "_TransformView" table. + + Path to the transform file + the transform could not be applied + the Database handle is invalid +

    + Win32 MSI API: + MsiDatabaseApplyTransform +

    +
    + + + Apply a transform to the database, suppressing any error conditions + specified by the transform's summary information. + + Path to the transform file + the transform could not be applied + the Database handle is invalid +

    + Win32 MSI API: + MsiDatabaseApplyTransform +

    +
    + + + Apply a transform to the database, specifying error conditions to suppress. + + Path to the transform file + Error conditions that are to be suppressed + the transform could not be applied + the Database handle is invalid +

    + Win32 MSI API: + MsiDatabaseApplyTransform +

    +
    + + + Checks whether a transform is valid for this Database, according to its validation data and flags. + + Path to the transform file + true if the transform can be validly applied to this Database; false otherwise + the transform could not be applied + the Database handle is invalid + + + + Checks whether a transform is valid for this Database, according to its SummaryInfo data. + + SummaryInfo data of a transform file + true if the transform can be validly applied to this Database; false otherwise + error processing summary info + the Database or SummaryInfo handle is invalid + + + + Gets the file path the Database was originally opened from, or null if not known. + + + + + Gets the open mode for the database. + + + + + Gets a boolean value indicating whether this database was opened in read-only mode. + +

    + Win32 MSI API: + MsiGetDatabaseState +

    +
    + + + Gets the collection of tables in the Database. + + + + + Gets or sets the code page of the Database. + + error exporting/importing the codepage data + the Database handle is invalid +

    + Getting or setting the code page is a slow operation because it involves an export or import + of the codepage data to/from a temporary file. +

    +
    + + + Gets the SummaryInfo object for this database that can be used to examine and modify properties + to the summary information stream. + + the Database handle is invalid +

    + The object returned from this property does not need to be explicitly persisted or closed. + Any modifications will be automatically saved when the database is committed. +

    + Win32 MSI API: + MsiGetSummaryInformation +

    +
    + + + Managed-code portion of the embedded UI proxy. + + + + + Initializes managed embedded UI by loading the UI class and invoking its Initialize method. + + Integer handle to the installer session. + Name of the class that implements the embedded UI. This must + be of the form: "AssemblyName!Namespace.Class" + On entry, contains the current UI level for the installation. After this + method returns, the installer resets the UI level to the returned value of this parameter. + 0 if the embedded UI was successfully loaded and initialized, + ERROR_INSTALL_USEREXIT if the user canceled the installation during initialization, + or ERROR_INSTALL_FAILURE if the embedded UI could not be initialized. + + Due to interop limitations, the successful resulting UILevel is actually returned + as the high-word of the return value instead of via a ref parameter. + + + + + Passes a progress message to the UI class. + + Installer message type and message box options. + Handle to a record containing message data. + Return value returned by the UI class. + + + + Passes a shutdown message to the UI class. + + + + + Instantiates a UI class from a given assembly and class name. + + Installer session, for logging. + Name of the class that implements the embedded UI. This must + be of the form: "AssemblyName!Namespace.Class" + Interface on the UI class for handling UI messages. + + + + Specifies a return status value for custom actions. + + + + Action completed successfully. + + + Skip remaining actions, not an error. + + + User terminated prematurely. + + + Unrecoverable error or unhandled exception occurred. + + + Action not executed. + + + + Specifies the open mode for a . + + + + Open a database read-only, no persistent changes. + + + Open a database read/write in transaction mode. + + + Open a database direct read/write without transaction. + + + Create a new database, transact mode read/write. + + + Create a new database, direct mode read/write. + + + + Log modes available for + and . + + + + Disable logging. + + + Log out of memory or fatal exit information. + + + Log error messages. + + + Log warning messages. + + + Log user requests. + + + Log status messages that are not displayed. + + + Log request to determine a valid source location. + + + Log insufficient disk space error. + + + Log the start of installation actions. + + + Log the data record for installation actions. + + + Log parameters for user-interface initialization. + + + Log the property values at termination. + + + + Sends large amounts of information to log file not generally useful to users. + May be used for support. + + + + + Log extra debugging information. + + + + + Log only on error. + + + + + Log progress bar information. This message includes information on units so far and total number + of units. See for an explanation of the message format. This message + is only sent to an external user interface and is not logged. + + + + + If this is not a quiet installation, then the basic UI has been initialized. If this is a full + UI installation, the Full UI is not yet initialized. This message is only sent to an external + user interface and is not logged. + + + + + If a full UI is being used, the full UI has ended. If this is not a quiet installation, the basic + UI has not yet ended. This message is only sent to an external user interface and is not logged. + + + + + Sent prior to display of the Full UI dialog. This message is only sent to an external user + interface and is not logged. + + + + + List of files in use that need to be replaced. + + + + + [MSI 4.0] List of apps that the user can request Restart Manager to shut down and restart. + + + + + Type of message to be processed by , + , or . + + + + Premature termination, possibly fatal OOM. + + + Formatted error message. + + + Formatted warning message. + + + User request message. + + + Informative message for log. + + + List of files in use that need to be replaced. + + + Request to determine a valid source location. + + + Insufficient disk space message. + + + Start of action: action name & description. + + + Formatted data associated with individual action item. + + + Progress gauge info: units so far, total. + + + Product info for dialog: language Id, dialog caption. + + + Sent prior to UI initialization, no string data. + + + Sent after UI termination, no string data. + + + Sent prior to display or authored dialog or wizard. + + + [MSI 4.0] List of apps that the user can request Restart Manager to shut down and restart. + + + [MSI 4.5] Sent prior to install of a product. + + + [MSI 4.5] Sent after install of a product. + + + + Specifies the install mode for or . + + + + Provide the component only if the feature's installation state is . + + + Only check that the component is registered, without verifying that the key file of the component exists. + + + Provide the component only if the feature exists. + + + Provide the component and perform any installation necessary to provide the component. + + + + Specifies the run mode for . + + + + The administrative mode is installing, or the product is installing. + + + The advertisements are installing or the product is installing or updating. + + + An existing installation is being modified or there is a new installation. + + + Rollback is enabled. + + + The log file is active. It was enabled prior to the installation session. + + + Execute operations are spooling or they are in the determination phase. + + + A reboot is necessary after a successful installation (settable). + + + A reboot is necessary to continue the installation (settable). + + + Files from cabinets and Media table files are installing. + + + The source LongFileNames is suppressed through the PID_MSISOURCE summary property. + + + The target LongFileNames is suppressed through the SHORTFILENAMES property. + + + The operating system is Windows 95, Windows 98, or Windows ME. + + + The operating system supports demand installation. + + + A custom action called from install script execution. + + + A custom action called from rollback execution script. + + + A custom action called from commit execution script. + + + + Installed state of a Component or Feature. + + + + The component is disabled. + + + The installation configuration data is corrupt. + + + The installation is suspended or in progress. + + + Component is set to run from source, but source is unavailable. + + + The buffer overflow is returned. + + + An invalid parameter was passed to the function. + + + An unrecognized product or feature name was passed to the function. + + + The component is broken. + + + The feature is advertised. + + + The component is being removed. In action state and not settable. + + + The component is not installed, or action state is absent but clients remain. + + + The component is installed on the local drive. + + + The component will run from the source, CD, or network. + + + The component will be installed in the default location: local or source. + + + + Specifies the type of installation for . + + + + Searches system for products to patch. + + + Indicates a administrative installation. + + + Indicates a particular instance. + + + + Level of the installation user interface, specified with + . + + + + Does not change UI level. + + + Uses Default UI level. + + + Silent installation. + + + Simple progress and error handling. + + + Authored UI, wizard dialogs suppressed. + + + Authored UI with wizards, progress, and errors. + + + + When combined with the value, the installer does not display + the cancel button in the progress dialog. + + + + + When combined with the value, the installer displays progress + dialog boxes but does not display any modal dialog boxes or error dialog boxes. + + + + + When combined with another value, the installer displays a modal dialog + box at the end of a successful installation or if there has been an error. + No dialog box is displayed if the user cancels. + + + + + Forces display of the source resolution dialog even if the UI is otherwise silent. + + + + + Specifies a return status value for message handlers. These values are returned by + , , and . + + + + An error was found in the message handler. + + + No action was taken. + + + IDOK + + + IDCANCEL + + + IDABORT + + + IDRETRY + + + IDIGNORE + + + IDYES + + + IDNO + + + + Specifies constants defining which buttons to display for a message. This can be cast to + the MessageBoxButtons enum in System.Windows.Forms and System.Windows. + + + + + The message contains an OK button. + + + + + The message contains OK and Cancel buttons. + + + + + The message contains Abort, Retry, and Ignore buttons. + + + + + The message contains Yes, No, and Cancel buttons. + + + + + The message contains Yes and No buttons. + + + + + The message contains Retry and Cancel buttons. + + + + + Specifies constants defining which information to display. This can be cast to + the MessageBoxIcon enum in System.Windows.Forms and System.Windows. + + + + + The message contain no symbols. + + + + + The message contains a symbol consisting of white X in a circle with a red background. + + + + + The message contains a symbol consisting of a white X in a circle with a red background. + + + + + The message contains a symbol consisting of white X in a circle with a red background. + + + + + The message contains a symbol consisting of a question mark in a circle. + + + + + The message contains a symbol consisting of an exclamation point in a triangle with a yellow background. + + + + + The message contains a symbol consisting of an exclamation point in a triangle with a yellow background. + + + + + The message contains a symbol consisting of a lowercase letter i in a circle. + + + + + The message contains a symbol consisting of a lowercase letter i in a circle. + + + + + Specifies constants defining the default button on a message. This can be cast to + the MessageBoxDefaultButton enum in System.Windows.Forms and System.Windows. + + + + + The first button on the message is the default button. + + + + + The second button on the message is the default button. + + + + + The third button on the message is the default button. + + + + + Specifies the different patch states for . + + + + Invalid value. + + + Patches applied to a product. + + + Patches that are superseded by other patches. + + + Patches that are obsolesced by other patches. + + + Patches that are registered to a product but not applied. + + + All valid patch states. + + + + Specifies the reinstall mode for or . + + + + Reinstall only if file is missing. + + + Reinstall if file is missing, or older version. + + + Reinstall if file is missing, or equal or older version. + + + Reinstall if file is missing, or not exact version. + + + Checksum executables, reinstall if missing or corrupt. + + + Reinstall all files, regardless of version. + + + Insure required machine reg entries. + + + Insure required user reg entries. + + + Validate shortcuts items. + + + Use re-cache source install package. + + + + Attributes for methods. + + + + No attributes. + + + Request that the Windows Installer not shutdown the embedded UI until the transaction is complete. + + + Request that the Windows Installer transfer the embedded UI from the original installation. + + + + Transform error conditions available for or + . + + + + No error conditions. + + + Adding a row that already exists. + + + Deleting a row that doesn't exist. + + + Adding a table that already exists. + + + Deleting a table that doesn't exist. + + + Updating a row that doesn't exist. + + + Transform and database code pages do not match and neither code page is neutral. + + + Create the temporary _TransformView table when applying the transform. + + + + Transform validation flags available for . + + + + Validate no properties. + + + Default language must match base database. + + + Product must match base database. + + + Check major version only. + + + Check major and minor versions only. + + + Check major, minor, and update versions. + + + Installed version < base version. + + + Installed version <= base version. + + + Installed version = base version. + + + Installed version >= base version. + + + Installed version > base version. + + + UpgradeCode must match base database. + + + + Specifies the installation context for s, + es, and + + + + + Not installed. + + + User managed install context. + + + User non-managed context. + + + Per-machine context. + + + All contexts, or all valid values. + + + All user-managed contexts. + + + + Defines the type of error encountered by the , , + or methods of the class. + + + + No error. + + + The new record duplicates primary keys of the existing record in a table. + + + There are no null values allowed, or the column is about to be deleted but is referenced by another row. + + + The corresponding record in a foreign table was not found. + + + The data is greater than the maximum value allowed. + + + The data is less than the minimum value allowed. + + + The data is not a member of the values permitted in the set. + + + An invalid version string was supplied. + + + The case was invalid. The case must be all uppercase or all lowercase. + + + An invalid GUID was supplied. + + + An invalid wildcard file name was supplied, or the use of wildcards was invalid. + + + An invalid identifier was supplied. + + + Invalid language IDs were supplied. + + + An invalid file name was supplied. + + + An invalid path was supplied. + + + An invalid conditional statement was supplied. + + + An invalid format string was supplied. + + + An invalid template string was supplied. + + + An invalid string was supplied in the DefaultDir column of the Directory table. + + + An invalid registry path string was supplied. + + + An invalid string was supplied in the CustomSource column of the CustomAction table. + + + An invalid property string was supplied. + + + The _Validation table is missing a reference to a column. + + + The category column of the _Validation table for the column is invalid. + + + The table in the Keytable column of the _Validation table was not found or loaded. + + + The value in the MaxValue column of the _Validation table is less than the value in the MinValue column. + + + An invalid cabinet name was supplied. + + + An invalid shortcut target name was supplied. + + + The string is too long for the length specified by the column definition. + + + An invalid localization attribute was supplied. (Primary keys cannot be localized.) + + + + Specifies the modify mode for . + + + + + Refreshes the information in the supplied record without changing the position + in the result set and without affecting subsequent fetch operations. + + + + Refreshes the data in a Record. + + + Inserts a Record into the view. + + + Updates the View with new data from the Record. + + + Updates or inserts a Record into the View. + + + Updates or deletes and inserts a Record into the View. + + + Inserts or validates a record. + + + Deletes a Record from the View. + + + Inserts a Record into the View. The inserted data is not persistent. + + + Validates a record. + + + Validates a new record. + + + Validates fields of a fetched or new record. Can validate one or more fields of an incomplete record. + + + Validates a record that will be deleted later. + + + + Base class for Windows Installer exceptions. + + + + + Creates a new InstallerException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new InstallerException with a specified error message. + + The message that describes the error. + + + + Creates a new InstallerException. + + + + + Initializes a new instance of the InstallerException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Sets the SerializationInfo with information about the exception. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Gets extended information about the error, or null if no further information + is available. + + A Record object. Field 1 of the Record contains the installer + message code. Other fields contain data specific to the particular error. +

    + If the record is passed to , it is formatted + by looking up the string in the current database. If there is no installation + session, the formatted error message may be obtained by a query on the Error table using + the error code, followed by a call to . + Alternatively, the standard MSI message can by retrieved by calling the + method. +

    + The following methods and properties may report extended error data: + + (constructor) + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + (constructor) + . + . + . + . + . + . + . + . + . + +

    + The Record object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiGetLastErrorRecord +

    +
    + + + Gets the system error code that resulted in this exception, or 0 if not applicable. + + + + + Gets a message that describes the exception. This message may contain detailed + formatted error data if it was available. + + + + + User Canceled the installation. + + + + + Creates a new InstallCanceledException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new InstallCanceledException with a specified error message. + + The message that describes the error. + + + + Creates a new InstallCanceledException. + + + + + Initializes a new instance of the InstallCanceledException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + A bad SQL query string was passed to or . + + + + + Creates a new BadQuerySyntaxException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new BadQuerySyntaxException with a specified error message. + + The message that describes the error. + + + + Creates a new BadQuerySyntaxException. + + + + + Initializes a new instance of the BadQuerySyntaxException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + A method was called on an invalid installer handle. The handle may have been already closed. + + + + + Creates a new InvalidHandleException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new InvalidHandleException with a specified error message. + + The message that describes the error. + + + + Creates a new InvalidHandleException. + + + + + Initializes a new instance of the InvalidHandleException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + A failure occurred when executing . The exception may contain + details about the merge conflict. + + + + + Creates a new MergeException with a specified error message and a reference to the + inner exception that is the cause of this exception. + + The message that describes the error. + The exception that is the cause of the current exception. If the + innerException parameter is not a null reference (Nothing in Visual Basic), the current exception + is raised in a catch block that handles the inner exception. + + + + Creates a new MergeException with a specified error message. + + The message that describes the error. + + + + Creates a new MergeException. + + + + + Initializes a new instance of the MergeException class with serialized data. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Sets the SerializationInfo with information about the exception. + + The SerializationInfo that holds the serialized object data about the exception being thrown. + The StreamingContext that contains contextual information about the source or destination. + + + + Gets the number of merge conflicts in each table, corresponding to the tables returned by + . + + + + + Gets the list of tables containing merge conflicts. + + + + + Gets a message that describes the merge conflits. + + + + + Defines a callback function that the installer calls for progress notification and error messages. + + + + + [MSI 3.1] Defines a callback function that the installer calls for record-based progress notification and error messages. + + + + + Provides static methods for installing and configuring products and patches. + + + + + Enables an external user-interface handler. This external UI handler is called before the + normal internal user-interface handler. The external UI handler has the option to suppress + the internal UI by returning a non-zero value to indicate that it has handled the messages. + + A callback delegate that handles the UI messages + Specifies which messages to handle using the external message handler. + If the external handler returns a non-zero result, then that message will not be sent to the UI, + instead the message will be logged if logging has been enabled. + The previously set external handler, or null if there was no previously set handler +

    + To restore the previous UI handler, a second call is made to SetExternalUI using the + ExternalUIHandler returned by the first call to SetExternalUI and specifying + as the message filter. +

    + The external user interface handler does not have full control over the external user + interface unless is called with the uiLevel parameter set to + . If SetInternalUI is not called, the internal user + interface level defaults to . As a result, any message not + handled by the external user interface handler is handled by Windows Installer. The initial + "Preparing to install..." dialog always appears even if the external user interface + handler handles all messages. +

    + SetExternalUI should only be called from a bootstrapping application. You cannot call + it from a custom action +

    + Win32 MSI API: + MsiSetExternalUI +

    +
    + + + [MSI 3.1] Enables a record-based external user-interface handler. This external UI handler is called + before the normal internal user-interface handler. The external UI handler has the option to suppress + the internal UI by returning a non-zero value to indicate that it has handled the messages. + + A callback delegate that handles the UI messages + Specifies which messages to handle using the external message handler. + If the external handler returns a non-zero result, then that message will not be sent to the UI, + instead the message will be logged if logging has been enabled. + The previously set external handler, or null if there was no previously set handler +

    + To restore the previous UI handler, a second call is made to SetExternalUI using the + ExternalUIHandler returned by the first call to SetExternalUI and specifying + as the message filter. +

    + The external user interface handler does not have full control over the external user + interface unless is called with the uiLevel parameter set to + . If SetInternalUI is not called, the internal user + interface level defaults to . As a result, any message not + handled by the external user interface handler is handled by Windows Installer. The initial + "Preparing to install..." dialog always appears even if the external user interface + handler handles all messages. +

    + SetExternalUI should only be called from a bootstrapping application. You cannot call + it from a custom action +

    + Win32 MSI API: + MsiSetExternalUIRecord +

    +
    + + + Enables the installer's internal user interface. Then this user interface is used + for all subsequent calls to user-interface-generating installer functions in this process. + + Specifies the level of complexity of the user interface + Handle to a window, which becomes the owner of any user interface created. + A pointer to the previous owner of the user interface is returned. + The previous user interface level +

    + Win32 MSI API: + MsiSetInternalUI +

    +
    + + + Enables the installer's internal user interface. Then this user interface is used + for all subsequent calls to user-interface-generating installer functions in this process. + The owner of the user interface does not change. + + Specifies the level of complexity of the user interface + The previous user interface level +

    + Win32 MSI API: + MsiSetInternalUI +

    +
    + + + Enables logging of the selected message type for all subsequent install sessions in + the current process space. + + One or more mode flags specifying the type of messages to log + Full path to the log file. A null path disables logging, + in which case the logModes paraneter is ignored. + an invalid log mode was specified + This method takes effect on any new installation processes. Calling this + method from within a custom action will not start logging for that installation. + + + + Enables logging of the selected message type for all subsequent install sessions in + the current process space. + + One or more mode flags specifying the type of messages to log + Full path to the log file. A null path disables logging, + in which case the logModes paraneter is ignored. + If true, the log lines will be appended to any existing file content. + If false, the log file will be truncated if it exists. The default is false. + If true, the log will be flushed after every line. + If false, the log will be flushed every 20 lines. The default is true. + an invalid log mode was specified +

    + This method takes effect on any new installation processes. Calling this + method from within a custom action will not start logging for that installation. +

    + Win32 MSI API: + MsiEnableLog +

    +
    + + + increments the usage count for a particular feature and returns the installation state for + that feature. This method should be used to indicate an application's intent to use a feature. + + The product code of the product. + The feature to be used. + Must have the value . + The installed state of the feature. +

    + The UseFeature method should only be used on features known to be published. The application + should determine the status of the feature by calling either the FeatureState method or + Features method. +

    + Win32 MSI APIs: + MsiUseFeature, + MsiUseFeatureEx +

    +
    + + + Opens an installer package for use with functions that access the product database and install engine, + returning an Session object. + + Path to the package + Specifies whether or not the create a Session object that ignores the + computer state and that is incapable of changing the current computer state. A value of false yields + the normal behavior. A value of true creates a "safe" Session object that cannot change of the current + machine state. + A Session object allowing access to the product database and install engine + The product could not be opened + The installer configuration data is corrupt +

    + Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a + custom action because the active installation is the only session allowed. +

    + A "safe" Session object ignores the current computer state when opening the package and prevents + changes to the current computer state. +

    + The Session object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI APIs: + MsiOpenPackage, + MsiOpenPackageEx +

    +
    + + + Opens an installer package for use with functions that access the product database and install engine, + returning an Session object. + + Database used to create the session + Specifies whether or not the create a Session object that ignores the + computer state and that is incapable of changing the current computer state. A value of false yields + the normal behavior. A value of true creates a "safe" Session object that cannot change of the current + machine state. + A Session object allowing access to the product database and install engine + The product could not be opened + The installer configuration data is corrupt +

    + Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a + custom action because the active installation is the only session allowed. +

    + A "safe" Session object ignores the current computer state when opening the package and prevents + changes to the current computer state. +

    + The Session object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI APIs: + MsiOpenPackage, + MsiOpenPackageEx +

    +
    + + + Opens an installer package for an installed product using the product code. + + Product code of the installed product + A Session object allowing access to the product database and install engine, + or null if the specified product is not installed. + An unknown product was requested + The product could not be opened + The installer configuration data is corrupt +

    + Note that only one Session object can be opened by a single process. OpenProduct cannot be + used in a custom action because the active installation is the only session allowed. +

    + The Session object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiOpenProduct +

    +
    + + + Gets the full component path, performing any necessary installation. This method prompts for source if + necessary and increments the usage count for the feature. + + Product code for the product that contains the feature with the necessary component + Feature ID of the feature with the necessary component + Component code of the necessary component + Installation mode; this can also include bits from + Path to the component +

    + Win32 MSI API: + MsiProvideComponent +

    +
    + + + Gets the full component path for a qualified component that is published by a product and + performs any necessary installation. This method prompts for source if necessary and increments + the usage count for the feature. + + Specifies the component ID for the requested component. This may not be the + GUID for the component itself but rather a server that provides the correct functionality, as in the + ComponentId column of the PublishComponent table. + Specifies a qualifier into a list of advertising components (from PublishComponent Table). + Installation mode; this can also include bits from + Optional; specifies the product to match that has published the qualified component. + Path to the component +

    + Win32 MSI APIs: + MsiProvideQualifiedComponent + MsiProvideQualifiedComponentEx +

    +
    + + + Gets the full path to a Windows Installer component containing an assembly. This method prompts for a source and + increments the usage count for the feature. + + Assembly name + Set to null for global assemblies. For private assemblies, set to the full path of the + application configuration file (.cfg file) or executable file (.exe) of the application to which the assembly + has been made private. + Installation mode; this can also include bits from + True if this is a Win32 assembly, false if it is a .NET assembly + Path to the assembly +

    + Win32 MSI API: + MsiProvideAssembly +

    +
    + + + Installs files that are unexpectedly missing. + + Product code for the product that owns the component to be installed + Component to be installed + Specifies the way the component should be installed. + the user exited the installation +

    + Win32 MSI API: + MsiInstallMissingComponent +

    +
    + + + Installs files that are unexpectedly missing. + + Product code for the product that owns the file to be installed + File to be installed + the user exited the installation +

    + Win32 MSI API: + MsiInstallMissingFile +

    +
    + + + Reinstalls a feature. + + Product code for the product containing the feature to be reinstalled + Feature to be reinstalled + Reinstall modes + the user exited the installation +

    + Win32 MSI API: + MsiReinstallFeature +

    +
    + + + Reinstalls a product. + + Product code for the product to be reinstalled + Reinstall modes + the user exited the installation +

    + Win32 MSI API: + MsiReinstallProduct +

    +
    + + + Opens an installer package and initializes an install session. + + path to the patch package + command line property settings + There was an error installing the product +

    + To completely remove a product, set REMOVE=ALL in . +

    + This method displays the user interface with the current settings and + log mode. You can change user interface settings with the + and functions. You can set the log mode with the + function. +

    + The and properties should be + tested after calling this method. +

    + Win32 MSI API: + MsiInstallProduct +

    +
    + + + Installs or uninstalls a product. + + Product code of the product to be configured. + Specifies the default installation configuration of the + product. The parameter is ignored and all features + are installed if the parameter is set to any other + value than . This parameter must be either 0 + (install using authored feature levels), 65535 (install all features), or a value + between 0 and 65535 to install a subset of available features. + Specifies the installation state for the product. + Specifies the command line property settings. This should + be a list of the format Property=Setting Property=Setting. + There was an error configuring the product +

    + This method displays the user interface with the current settings and + log mode. You can change user interface settings with the + and functions. You can set the log mode with the + function. +

    + The and properties should be + tested after calling this method. +

    + Win32 MSI APIs: + MsiConfigureProduct, + MsiConfigureProductEx +

    +
    + + + Configures the installed state for a product feature. + + Product code of the product to be configured. + Specifies the feature ID for the feature to be configured. + Specifies the installation state for the feature. + There was an error configuring the feature +

    + The and properties should be + tested after calling this method. +

    + Win32 MSI API: + MsiConfigureFeature +

    +
    + + + For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes + an installation and sets the PATCH property to the path of the patch package. + + path to the patch package + optional command line property settings + There was an error applying the patch +

    + The and properties should be + tested after calling this method. +

    + Win32 MSI API: + MsiApplyPatch +

    +
    + + + For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes + an installation and sets the PATCH property to the path of the patch package. + + path to the patch package + path to the product to be patched, if installType + is set to + type of installation to patch + optional command line property settings + There was an error applying the patch +

    + The and properties should be + tested after calling this method. +

    + Win32 MSI API: + MsiApplyPatch +

    +
    + + + Removes one or more patches from a single product. To remove a patch from + multiple products, RemovePatches must be called for each product. + + List of patches to remove. Each patch can be specified by the GUID + of the patch or the full path to the patch package. + The ProductCode (GUID) of the product from which the patches + are removed. This parameter cannot be null. + optional command line property settings + There was an error removing the patches +

    + The and properties should be + tested after calling this method. +

    + Win32 MSI API: + MsiRemovePatches +

    +
    + + + Determines which patches apply to a specified product MSI and in what sequence. + + Full path to an MSI file that is the target product + for the set of patches. + An array of strings specifying the patches to be checked. Each item + may be the path to an MSP file, the path an XML file, or just an XML blob. + Callback to be invoked for each inapplicable patch, reporting the + reason the patch is not applicable. This value may be left null if that information is not + desired. + An array of selected patch strings from , indicating + the set of applicable patches. The items are re-ordered to be in the best sequence. +

    + If an item in is a file path but does not end in .MSP or .XML, + it is assumed to be an MSP file. +

    + As this overload uses InstallContext.None, it does not consider the current state of + the system. +

    + Win32 MSI API: + MsiDetermineApplicablePatches +

    +
    + + + Determines which patches apply to a specified product and in what sequence. If + the product is installed, this method accounts for patches that have already been applied to + the product and accounts for obsolete and superceded patches. + + The product that is the target for the set of patches. This may be + either a ProductCode (GUID) of a product that is currently installed, or the path to a an + MSI file. + An array of strings specifying the patches to be checked. Each item + may be the path to an MSP file, the path an XML file, or just an XML blob. + Callback to be invoked for each inapplicable patch, reporting the + reason the patch is not applicable. This value may be left null if that information is not + desired. + Specifies a security identifier (SID) of a user. This parameter restricts + the context of enumeration for this user account. This parameter cannot be the special SID + strings s-1-1-0 (everyone) or s-1-5-18 (local system). If is set to + or , then + must be null. For the current user context, + can be null and can be set to + or . + Restricts the enumeration to per-user-unmanaged, per-user-managed, + or per-machine context, or (if referring to an MSI) to no system context at all. This + parameter can be , , + , or . + An array of selected patch strings from , indicating + the set of applicable patches. The items are re-ordered to be in the best sequence. +

    + If an item in is a file path but does not end in .MSP or .XML, + it is assumed to be an MSP file. +

    + Passing an InstallContext of None only analyzes the MSI file; it does not consider the + current state of the system. You cannot use InstallContext.None with a ProductCode GUID. +

    + Win32 MSI APIs: + MsiDetermineApplicablePatches + MsiDeterminePatchSequence +

    +
    + + + Applies one or more patches to products that are eligible to receive the patch. + For each product listed by the patch package as eligible to receive the patch, ApplyPatch invokes + an installation and sets the PATCH property to the path of the patch package. + + The set of patch packages to be applied. + Each item is the full path to an MSP file. + Provides the ProductCode of the product being patched. If this parameter + is null, the patches are applied to all products that are eligible to receive these patches. + optional command line property settings +

    + Win32 MSI API: + MsiApplyMultiplePatches +

    +
    + + + Extracts information from a patch that can be used to determine whether the patch + applies on a target system. The method returns an XML string that can be provided to + + instead of the full patch file. + + Full path to the patch being queried. + XML string containing patch data. +

    + Win32 MSI API: + MsiExtractPatchXMLData +

    +
    + + + [MSI 3.1] Migrates a user's application configuration data to a new SID. + + Previous user SID that data is to be migrated from + New user SID that data is to be migrated to +

    + Win32 MSI API: + MsiNotifySidChange +

    +
    + + + Advertises a product to the local computer. + + Path to the package of the product being advertised + True if the product is user-assigned; false if it is machine-assigned. + Semi-colon delimited list of transforms to be applied. This parameter may be null. + The language to use if the source supports multiple languages + the specified package file does not exist + +

    + Win32 MSI APIs: + MsiAdvertiseProduct, + MsiAdvertiseProductEx +

    +
    + + + Generates an advertise script. The method enables the installer to write to a + script the registry and shortcut information used to assign or publish a product. + + Path to the package of the product being advertised + path to script file to be created with the advertise information + Semi-colon delimited list of transforms to be applied. This parameter may be null. + The language to use if the source supports multiple languages + the specified package file does not exist + +

    + Win32 MSI APIs: + MsiAdvertiseProduct, + MsiAdvertiseProductEx +

    +
    + + + Generates an advertise script. The method enables the installer to write to a + script the registry and shortcut information used to assign or publish a product. + + Path to the package of the product being advertised + path to script file to be created with the advertise information + Semi-colon delimited list of transforms to be applied. This parameter may be null. + The language to use if the source supports multiple languages + Targeted processor architecture. + True to install multiple instances through product code changing transform. + Advertises a new instance of the product. Requires that the parameter + includes the instance transform that changes the product code. + +

    + Win32 MSI APIs: + MsiAdvertiseProduct, + MsiAdvertiseProductEx +

    +
    + + + Copies an advertise script file to the local computer. + + Path to a script file generated by + + Flags controlling advertisement + True if specified items are to be removed instead of being created +

    + The process calling this function must be running under the LocalSystem account. To advertise an + application for per-user installation to a targeted user, the thread that calls this function must + impersonate the targeted user. If the thread calling this function is not impersonating a targeted + user, the application is advertised to all users for installation with elevated privileges. +

    +
    + + + Processes an advertise script file into the specified locations. + + Path to a script file generated by + + An optional path to a folder in which advertised icon files and transform + files are located. If this parameter is null, no icon or transform files are written. + True if shortcuts should be created + True if specified items are to be removed instead of created +

    + The process calling this function must be running under the LocalSystem account. To advertise an + application for per-user installation to a targeted user, the thread that calls this function must + impersonate the targeted user. If the thread calling this function is not impersonating a targeted + user, the application is advertised to all users for installation with elevated privileges. +

    + Win32 MSI API: + MsiProcessAdvertiseScript +

    +
    + + + Gets product information for an installer script file. + + Path to a script file generated by + + ProductInstallation stub with advertise-related properties filled in. + An invalid product property was requested +

    + Only the following properties will be filled in in the returned object:

      +
    • +
    • +
    • +
    • +
    • +
    Other properties will be null. +

    + Win32 MSI API: + MsiGetProductInfoFromScript +

    +
    + + + Gets a Windows Installer error message in the system default language. + + The error number. + The message string, or null if the error message is not found. +

    + The returned string may have tokens such as [2] and [3] that are meant to be substituted + with context-specific values. +

    + Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +

    +
    + + + Gets a Windows Installer error message in a specified language. + + The error number. + The locale for the message. + The message string, or null if the error message or locale is not found. +

    + The returned string may have tokens such as [2] and [3] that are meant to be substituted + with context-specific values. +

    + Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +

    +
    + + + Gets a formatted Windows Installer error message in the system default language. + + Error record containing the error number in the first field, and + error-specific parameters in the other fields. + The message string, or null if the error message is not found. +

    + Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +

    +
    + + + Gets a formatted Windows Installer error message in a specified language. + + Error record containing the error number in the first field, and + error-specific parameters in the other fields. + The locale for the message. + The message string, or null if the error message or locale is not found. +

    + Error numbers greater than 2000 refer to MSI "internal" errors, and are always + returned in English. +

    +
    + + + Gets the version string of the path specified using the format that the installer + expects to find it in in the database. + + Path to the file + Version string in the "#.#.#.#" format, or an empty string if the file + does not contain version information + the file does not exist or could not be read +

    + Win32 MSI API: + MsiGetFileVersion +

    +
    + + + Gets the language string of the path specified using the format that the installer + expects to find them in in the database. + + Path to the file + Language string in the form of a decimal language ID, or an empty string if the file + does not contain a language ID + the file does not exist or could not be read +

    + Win32 MSI API: + MsiGetFileVersion +

    +
    + + + Gets a 128-bit hash of the specified file. + + Path to the file + Integer array of length 4 which receives the + four 32-bit parts of the hash value. + the file does not exist or + could not be read +

    + Win32 MSI API: + MsiGetFileHash +

    +
    + + + Examines a shortcut and returns its product, feature name, and component if available. + + Full path to a shortcut + ShortcutTarget structure containing target product code, feature, and component code +

    + Win32 MSI API: + MsiGetShortcutTarget +

    +
    + + + Verifies that the given file is an installation package. + + Path to the package + True if the file is an installation package; false otherwise. + the specified package file does not exist + the package file could not be opened +

    + Win32 MSI API: + MsiVerifyPackage +

    +
    + + + [MSI 4.0] Gets the list of files that can be updated by one or more patches. + + ProductCode (GUID) of the product which is + the target of the patches + list of file paths of one or more patches to be + analyzed + List of absolute paths of files that can be updated when the + patches are applied on this system. +

    + Win32 MSI API: + MsiGetPatchFileList +

    +
    + + + Indicates whether a system reboot is required after running an installation or configuration operation. + + + + + Indicates whether a system reboot has been initiated after running an installation or configuration operation. + + + + + Gets the current version of the installer. + + + + + Accessor for information about features within the context of an installation session. + + + + + Checks if the collection contains a feature. + + name of the feature + true if the feature is in the collection, else false + + + + Copies the features into an array. + + array that receives the features + offset into the array + + + + Enumerates the features in the collection. + + an enumerator over all features in the collection + + + + Gets information about a feature within the context of an installation session. + + name of the feature + feature object + + + + Gets the number of features defined for the product. + + + + + Provides access to information about a feature within the context of an installation session. + + + + + Calculates the disk space required by the feature and its selected children and parent features. + + If true, the parent features are included in the cost. + If true, the child features are included in the cost. + Specifies the installation state. + The disk space requirement in bytes. +

    + Win32 MSI API: + MsiGetFeatureCost +

    +
    + + + Gets the name of the feature (primary key in the Feature table). + + + + + Gets the current install state of the feature. + + the Session handle is invalid + an unknown feature was requested +

    + Win32 MSI API: + MsiGetFeatureState +

    +
    + + + Gets or sets the action state of the feature. + + the Session handle is invalid + an unknown feature was requested +

    + When changing the feature action, the action state of all the Components linked to the changed + Feature records are also updated appropriately, based on the new feature Select state. + All Features can be configured at once by specifying the keyword ALL instead of a specific feature name. +

    + Win32 MSI APIs: + MsiGetFeatureState, + MsiSetFeatureState +

    +
    + + + Gets a list of valid installation states for the feature. + + the Session handle is invalid + an unknown feature was requested +

    + Win32 MSI API: + MsiGetFeatureValidStates +

    +
    + + + Gets or sets the attributes of the feature. + + the Session handle is invalid + an unknown feature was requested +

    + Win32 MSI APIs: + MsiGetFeatureInfo, + MsiSetFeatureAttributes +

    + Since the lpAttributes paramter of + MsiGetFeatureInfo + does not contain an equivalent flag for , this flag will + not be retrieved. +

    + Since the dwAttributes parameter of + MsiSetFeatureAttributes + does not contain an equivalent flag for , the presence + of this flag will be ignored. +

    +
    + + + Gets the title of the feature. + + the Session handle is invalid + an unknown feature was requested +

    + Win32 MSI API: + MsiGetFeatureInfo +

    +
    + + + Gets the description of the feature. + + the Session handle is invalid + an unknown feature was requested +

    + Win32 MSI API: + MsiGetFeatureInfo +

    +
    + + + Represents an instance of a feature of an installed product. + + + + + Creates a new FeatureInstallation instance for a feature of a product. + + feature name + ProductCode GUID + + + + Gets the name of the feature. + + + + + Gets the installed state of the feature. + +

    + Win32 MSI API: + MsiQueryFeatureState +

    +
    + + + Gets the parent of the feature, or null if the feature has no parent (it is a root feature). + + + Invocation of this property may be slightly costly for products with many features, + because it involves an enumeration of all the features in the product. + + + + + Gets the usage metrics for the feature. + +

    + If no usage metrics are recorded, the value is 0. +

    + Win32 MSI API: + MsiGetFeatureUsage +

    +
    + + + Holds data about the usage of a feature. + + + + + Gets count of the number of times the feature has been used. + + + + + Gets the date the feature was last used. + + + + + [MSI 4.5] Interface for an embedded external user interface for an installation. + + + Classes which implement this interface must have a public constructor that takes no parameters. + + + + + Initializes the embedded UI. + + Handle to the installer which can be used to get and set properties. + The handle is only valid for the duration of this method call. + Path to the directory that contains all the files from the MsiEmbeddedUI table. + On entry, contains the current UI level for the installation. After this + method returns, the installer resets the UI level to the returned value of this parameter. + True if the embedded UI was successfully initialized; false if the installation + should continue without the embedded UI. + The installation was canceled by the user. + The embedded UI failed to initialize and + causes the installation to fail. +

    + Win32 MSI API: + InitializeEmbeddedUI +

    +
    + + + Processes information and progress messages sent to the user interface. + + Message type. + Record that contains message data. + Message buttons. + Message box icon. + Message box default button. + Result of processing the message. +

    + Win32 MSI API: + EmbeddedUIHandler +

    +
    + + + Shuts down the embedded UI at the end of the installation. + + + If the installation was canceled during initialization, this method will not be called. + If the installation was canceled or failed at any later point, this method will be called at the end. +

    + Win32 MSI API: + ShutdownEmbeddedUI +

    +
    + + + Subclasses of this abstract class represent a unique instance of a + registered product or patch installation. + + + + + Gets the user security identifier (SID) under which this product or patch + installation is available. + + + + + Gets the user context of this product or patch installation. + + + + + Gets the source list of this product or patch installation. + + + + + Gets a value indicating whether this product or patch is installed on the current system. + + + + + Gets a property about the product or patch installation. + + Name of the property being retrieved. + + + + + Represents a per-drive disk space cost for an installation. + + + + + Creates a new InstallCost object. + + name of the drive this cost data applies to + installation cost on this drive, as a number of bytes + temporary disk space required on this drive, as a number of bytes + + + + The name of the drive this cost data applies to. + + + + + The installation cost on this drive, as a number of bytes. + + + + + The temporary disk space required on this drive, as a number of bytes. + +

    + This temporary space requirement is space needed only for the duration + of the installation, over the final footprint on disk. +

    +
    + + + Receives an exception from + + indicating the reason a particular patch is not applicable to a product. + + MSP file path, XML file path, or XML blob that was passed to + + exception indicating the reason the patch is not applicable +

    + If is an or subclass, then + its and + properties will indicate a more specific reason the patch was not applicable. +

    + The could also be a FileNotFoundException if the + patch string was a file path. +

    +
    + + + [MSI 4.5] Handle to a multi-session install transaction. + +

    + Win32 MSI APIs: + MsiBeginTransaction + MsiJoinTransaction + MsiEndTransaction +

    +
    + + + [MSI 4.5] Begins transaction processing of a multi-package installation. + + Name of the multi-package installation. + Select optional behavior when beginning the transaction. + The transaction could not be initialized. +

    + Win32 MSI API: + MsiBeginTransaction +

    +
    + + + Internal constructor. + + + The second parameter is an array in order to receive multiple values from the initialization method. + + + + + Creates a new Transaction object from an integer handle. + + Integer transaction handle + true to close the handle when this object is disposed + + + + Makes the current process the owner of the multi-package installation transaction. + + Select optional behavior when joining the transaction. + The transaction handle is not valid. + The transaction could not be joined. +

    + Win32 MSI API: + MsiJoinTransaction +

    +
    + + + Ends the install transaction and commits all changes to the system belonging to the transaction. + + The transaction could not be committed. +

    + Runs any Commit Custom Actions and commits to the system any changes to Win32 or common language + runtime assemblies. Deletes the rollback script, and after using this option, the transaction's + changes can no longer be undone with a Rollback Installation. +

    + This method can only be called by the current owner of the transaction. +

    + Win32 MSI API: + MsiEndTransaction +

    +
    + + + Ends the install transaction and undoes changes to the system belonging to the transaction. + + The transaction could not be rolled back. +

    + This method can only be called by the current owner of the transaction. +

    + Win32 MSI API: + MsiEndTransaction +

    +
    + + + Gets the name of the transaction. + + + + + Notifies listeners when the process that owns the transaction changed. + + + + + Represents a media disk source of a product or a patch. + + + + + Creates a new media disk. + + + + + + + + Gets or sets the disk id of the media disk. + + + + + Gets or sets the volume label of the media disk. + + + + + Gets or sets the disk prompt of the media disk. + + + + + The Patch object represents a unique instance of a patch that has been + registered or applied. + + + + + Enumerates patch installations based on certain criteria. + + PatchCode (GUID) of the patch to be enumerated. Only + instances of patches within the scope of the context specified by the + and parameters will be + enumerated. This parameter may be set to null to enumerate all patches in the specified + context. + ProductCode (GUID) product whose patches are to be + enumerated. If non-null, patch enumeration is restricted to instances of this product + within the specified context. If null, the patches for all products under the specified + context are enumerated. + Specifies a security identifier (SID) that restricts the context + of enumeration. A SID value other than s-1-1-0 is considered a user SID and restricts + enumeration to the current user or any user in the system. The special SID string + s-1-1-0 (Everyone) specifies enumeration across all users in the system. This parameter + can be set to null to restrict the enumeration scope to the current user. When + is set to the machine context only, + must be null. + Specifies the user context. + The of patches to return. +

    + Win32 MSI APIs: + MsiEnumPatchesEx +

    +
    + + + Creates a new object for accessing information about a patch installation on the current system. + + Patch code (GUID) of the patch. + ProductCode (GUID) the patch has been applied to. + This parameter may be null for patches that are registered only and not yet + applied to any product. +

    + All available user contexts will be queried. +

    +
    + + + Creates a new object for accessing information about a patch installation on the current system. + + Registered patch code (GUID) of the patch. + ProductCode (GUID) the patch has been applied to. + This parameter may be null for patches that are registered only and not yet + applied to any product. + The specific user, when working in a user context. This + parameter may be null to indicate the current user. The parameter must be null + when working in a machine context. + The user context. The calling process must have administrative + privileges to get information for a product installed for a user other than the + current user. +

    + If the is null, the Patch object may + only be used to read and update the patch's SourceList information. +

    +
    + + + Enumerates all patch installations on the system. + + Enumeration of patch objects. +

    + Win32 MSI API: + MsiEnumPatches +

    +
    + + + Gets the patch code (GUID) of the patch. + + + + + Gets the ProductCode (GUID) of the product. + + + + + Gets a value indicating whether this patch is currently installed. + + + + + Gets a value indicating whether this patch is marked as obsolte. + + + + + Gets a value indicating whether this patch is present but has been + superseded by a more recent installed patch. + + + + + Gets the installation state of this instance of the patch. + + An unknown patch was requested + The installer configuration data is corrupt + + + + Gets the cached patch file that the product uses. + + + + + Gets the set of patch transforms that the last patch + installation applied to the product. + +

    + This value may not be available for per-user, non-managed applications + if the user is not logged on. +

    +
    + + + Gets the date and time when the patch is applied to the product. + + + + + True patch is marked as possible to uninstall from the product. + +

    + Even if this property is true, the installer can still block the + uninstallation if this patch is required by another patch that + cannot be uninstalled. +

    +
    + + + Get the registered display name for the patch. + + + + + Gets the registered support information URL for the patch. + + + + + Gets information about a specific patch installation. + + The property being retrieved; see remarks for valid properties. + The property value, or an empty string if the property is not set for the patch. + An unknown patch or property was requested + The installer configuration data is corrupt +

    + Win32 MSI APIs: + MsiGetPatchInfo, + MsiGetPatchInfoEx +

    +
    + + + Represents a unique instance of a product that + is either advertised, installed or unknown. + + + + + Gets the set of all products with a specified upgrade code. This method lists the + currently installed and advertised products that have the specified UpgradeCode + property in their Property table. + + Upgrade code of related products + Enumeration of product codes +

    + Win32 MSI API: + MsiEnumRelatedProducts +

    +
    + + + Enumerates product installations based on certain criteria. + + ProductCode (GUID) of the product instances to be enumerated. Only + instances of products within the scope of the context specified by the + and parameters will be + enumerated. This parameter may be set to null to enumerate all products in the specified + context. + Specifies a security identifier (SID) that restricts the context + of enumeration. A SID value other than s-1-1-0 is considered a user SID and restricts + enumeration to the current user or any user in the system. The special SID string + s-1-1-0 (Everyone) specifies enumeration across all users in the system. This parameter + can be set to null to restrict the enumeration scope to the current user. When + is set to the machine context only, + must be null. + Specifies the user context. + An enumeration of product objects for enumerated product instances. +

    + Win32 MSI API: + MsiEnumProductsEx +

    +
    + + + Creates a new object for accessing information about a product installation on the current system. + + ProductCode (GUID) of the product. +

    + All available user contexts will be queried. +

    +
    + + + Creates a new object for accessing information about a product installation on the current system. + + ProductCode (GUID) of the product. + The specific user, when working in a user context. This + parameter may be null to indicate the current user. The parameter must be null + when working in a machine context. + The user context. The calling process must have administrative + privileges to get information for a product installed for a user other than the + current user. + + + + Gets the installed state for a product feature. + + The feature being queried; identifier from the + Feature table + Installation state of the feature for the product instance: either + , , + or . +

    + Win32 MSI APIs: + MsiQueryFeatureState, + MsiQueryFeatureStateEx +

    +
    + + + Gets the installed state for a product component. + + The component being queried; GUID of the component + as found in the ComponentId column of the Component table. + Installation state of the component for the product instance: either + or . +

    + Win32 MSI API: + MsiQueryComponentState +

    +
    + + + Obtains and stores the user information and product ID from an installation wizard. + +

    + This method is typically called by an application during the first run of the application. The application + first gets the or . + If those properties are missing, the application calls CollectUserInfo. + CollectUserInfo opens the product's installation package and invokes a wizard sequence that collects + user information. Upon completion of the sequence, user information is registered. Since this API requires + an authored user interface, the user interface level should be set to full by calling + as . +

    + The CollectUserInfo method invokes a FirstRun dialog from the product installation database. +

    + Win32 MSI API: + MsiCollectUserInfo +

    +
    + + + Some products might write some invalid/nonstandard version strings to the registry. + This method tries to get the best data it can. + + Version string retrieved from the registry. + Version object, or null if the version string is completely invalid. + + + + Enumerates all product installations on the system. + + An enumeration of product objects. +

    + Win32 MSI API: + MsiEnumProducts, +

    +
    + + + Gets the set of published features for the product. + + Enumeration of published features for the product. + The installer configuration data is corrupt +

    + Because features are not ordered, any new feature has an arbitrary index, meaning + this property can return features in any order. +

    + Win32 MSI API: + MsiEnumFeatures +

    +
    + + + Gets the ProductCode (GUID) of the product. + + + + + Gets a value indicating whether this product is installed on the current system. + + + + + Gets a value indicating whether this product is advertised on the current system. + + + + + Checks whether the product is installed with elevated privileges. An application is called + a "managed application" if elevated (system) privileges are used to install the application. + + True if the product is elevated; false otherwise +

    + Note that this property does not take into account policies such as AlwaysInstallElevated, + but verifies that the local system owns the product's registry data. +

    +
    + + + Gets the source list of this product installation. + + + + + The support link. + + + + + The support telephone. + + + + + Date and time the product was installed. + + + + + The installed product name. + + + + + The installation location. + + + + + The installation source. + + + + + The local cached package. + + + + + The publisher. + + + + + URL about information. + + + + + The URL update information. + + + + + The product version. + + + + + The product identifier. + +

    + For more information, see + ProductID +

    +
    + + + The company that is registered to use the product. + + + + + The owner who is registered to use the product. + + + + + Transforms. + + + + + Product language. + + + + + Human readable product name. + + + + + True if the product is advertised per-machine; + false if it is per-user or not advertised. + + + + + Identifier of the package that a product is installed from. + + + + + Version of the advertised product. + + + + + Primary icon for the package. + + + + + Name of the installation package for the advertised product. + + + + + True if the advertised product can be serviced by + non-administrators without elevation. + + + + + Gets information about an installation of a product. + + Name of the property being retrieved. + An unknown product or property was requested + The installer configuration data is corrupt +

    + Win32 MSI APIs: + MsiGetProductInfo, + MsiGetProductInfoEx +

    +
    + + + The Record object is a container for holding and transferring a variable number of values. + Fields within the record are numerically indexed and can contain strings, integers, streams, + and null values. Record fields are indexed starting with 1. Field 0 is a special format field. + +

    + Most methods on the Record class have overloads that allow using either a number + or a name to designate a field. However note that field names only exist when the + Record is directly returned from a query on a database. For other records, attempting + to access a field by name will result in an InvalidOperationException. +

    +
    + + + Creates a new record object with the requested number of fields. + + Required number of fields, which may be 0. + The maximum number of fields in a record is limited to 65535. +

    + The Record object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiCreateRecord +

    +
    + + + Creates a new record object, providing values for an arbitrary number of fields. + + The values of the record fields. The parameters should be of type Int16, Int32 or String +

    + The Record object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiCreateRecord +

    +
    + + + Creates a new Record object from an integer record handle. + +

    + This method is only provided for interop purposes. A Record object + should normally be obtained by calling + other methods. +

    The handle will be closed when this object is disposed or finalized.

    +

    + Integer record handle + true to close the handle when this object is disposed or finalized +
    + + + Sets all fields in a record to null. + +

    + Win32 MSI API: + MsiRecordClearData +

    +
    + + + Reports whether a record field is null. + + Specifies the field to check. + True if the field is null, false otherwise. + The field is less than 0 or greater than the + number of fields in the Record. +

    + Win32 MSI API: + MsiRecordIsNull +

    +
    + + + Reports whether a record field is null. + + Specifies the field to check. + True if the field is null, false otherwise. + The field name does not match any + of the named fields in the Record. + + + + Gets the length of a record field. The count does not include the terminating null. + + The field is less than 0 or greater than the + number of fields in the Record. +

    + The returned data size is 0 if the field is null, non-existent, + or an internal object pointer. The method also returns 0 if the handle is not a valid + Record handle. +

    + If the data is in integer format, the property returns 2 or 4. +

    + If the data is in string format, the property returns the character count + (not including the NULL terminator). +

    + If the data is in stream format, the property returns the byte count. +

    + Win32 MSI API: + MsiRecordDataSize +

    +
    + + + Gets the length of a record field. The count does not include the terminating null. + + Specifies the field to check. + The field name does not match any + of the named fields in the Record. +

    The returned data size is 0 if the field is null, non-existent, + or an internal object pointer. The method also returns 0 if the handle is not a valid + Record handle. +

    + If the data is in integer format, the property returns 2 or 4. +

    + If the data is in string format, the property returns the character count + (not including the NULL terminator). +

    + If the data is in stream format, the property returns the byte count. +

    +
    + + + Gets a field value as an integer. + + Specifies the field to retrieve. + Integer value of the field, or 0 if the field is null. + The field is less than 0 or greater than the + number of fields in the Record. +

    + Win32 MSI API: + MsiRecordGetInteger +

    + +
    + + + Gets a field value as an integer. + + Specifies the field to retrieve. + Integer value of the field, or 0 if the field is null. + The field name does not match any + of the named fields in the Record. + + + + + Gets a field value as an integer. + + Specifies the field to retrieve. + Integer value of the field, or null if the field is null. + The field is less than 0 or greater than the + number of fields in the Record. +

    + Win32 MSI API: + MsiRecordGetInteger +

    + +
    + + + Gets a field value as an integer. + + Specifies the field to retrieve. + Integer value of the field, or null if the field is null. + The field name does not match any + of the named fields in the Record. + + + + + Sets the value of a field to an integer. + + Specifies the field to set. + new value of the field + The field is less than 0 or greater than the + number of fields in the Record. +

    + Win32 MSI API: + MsiRecordSetInteger +

    + +
    + + + Sets the value of a field to an integer. + + Specifies the field to set. + new value of the field + The field name does not match any + of the named fields in the Record. + + + + + Sets the value of a field to a nullable integer. + + Specifies the field to set. + new value of the field + The field is less than 0 or greater than the + number of fields in the Record. +

    + Win32 MSI API: + MsiRecordSetInteger +

    + +
    + + + Sets the value of a field to a nullable integer. + + Specifies the field to set. + new value of the field + The field name does not match any + of the named fields in the Record. + + + + + Gets a field value as a string. + + Specifies the field to retrieve. + String value of the field, or an empty string if the field is null. + The field is less than 0 or greater than the + number of fields in the Record. +

    + Win32 MSI API: + MsiRecordGetString +

    +
    + + + Gets a field value as a string. + + Specifies the field to retrieve. + String value of the field, or an empty string if the field is null. + The field name does not match any + of the named fields in the Record. + + + + Sets the value of a field to a string. + + Specifies the field to set. + new value of the field + The field is less than 0 or greater than the + number of fields in the Record. +

    + Win32 MSI API: + MsiRecordSetString +

    +
    + + + Sets the value of a field to a string. + + Specifies the field to set. + new value of the field + The field name does not match any + of the named fields in the Record. + + + + Reads a record stream field into a file. + + Specifies the field of the Record to get. + Specifies the path to the file to contain the stream. + The field is less than 0 or greater than the + number of fields in the Record. + Attempt to extract a storage from a database open + in read-write mode, or from a database without an associated file path +

    + This method is capable of directly extracting substorages. To do so, first select both the + `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. + However, substorages may only be extracted from a database that is open in read-only mode. +

    + Win32 MSI API: + MsiRecordReadStream +

    +
    + + + Reads a record stream field into a file. + + Specifies the field of the Record to get. + Specifies the path to the file to contain the stream. + The field name does not match any + of the named fields in the Record. + Attempt to extract a storage from a database open + in read-write mode, or from a database without an associated file path +

    + This method is capable of directly extracting substorages. To do so, first select both the + `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. + However, substorages may only be extracted from a database that is open in read-only mode. +

    +
    + + + Gets a record stream field. + + Specifies the field of the Record to get. + A Stream that reads the field data. + The field is less than 0 or greater than the + number of fields in the Record. +

    + This method is not capable of reading substorages. To extract a substorage, + use . +

    + Win32 MSI API: + MsiRecordReadStream +

    +
    + + + Gets a record stream field. + + Specifies the field of the Record to get. + A Stream that reads the field data. + The field name does not match any + of the named fields in the Record. +

    + This method is not capable of reading substorages. To extract a substorage, + use . +

    +
    + + + Sets a record stream field from a file. Stream data cannot be inserted into temporary fields. + + Specifies the field of the Record to set. + Specifies the path to the file containing the stream. + The field is less than 0 or greater than the + number of fields in the Record. +

    + The contents of the specified file are read into a stream object. The stream persists if + the Record is inserted into the Database and the Database is committed. +

    + To reset the stream to its beginning you must pass in null for filePath. + Do not pass an empty string, "", to reset the stream. +

    + Setting a stream with this method is more efficient than setting a field to a + FileStream object. +

    + Win32 MSI API: + MsiRecordsetStream +

    +
    + + + Sets a record stream field from a file. Stream data cannot be inserted into temporary fields. + + Specifies the field name of the Record to set. + Specifies the path to the file containing the stream. + The field name does not match any + of the named fields in the Record. +

    + The contents of the specified file are read into a stream object. The stream persists if + the Record is inserted into the Database and the Database is committed. + To reset the stream to its beginning you must pass in null for filePath. + Do not pass an empty string, "", to reset the stream. +

    + Setting a stream with this method is more efficient than setting a field to a + FileStream object. +

    +
    + + + Sets a record stream field from a Stream object. Stream data cannot be inserted into temporary fields. + + Specifies the field of the Record to set. + Specifies the stream data. + The field is less than 0 or greater than the + number of fields in the Record. +

    + The stream persists if the Record is inserted into the Database and the Database is committed. +

    + Win32 MSI API: + MsiRecordsetStream +

    +
    + + + Sets a record stream field from a Stream object. Stream data cannot be inserted into temporary fields. + + Specifies the field name of the Record to set. + Specifies the stream data. + The field name does not match any + of the named fields in the Record. +

    + The stream persists if the Record is inserted into the Database and the Database is committed. +

    +
    + + + Gets a formatted string representation of the Record. + + A formatted string representation of the Record. +

    + If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. +

    + Win32 MSI API: + MsiFormatRecord +

    + + +
    + + + Gets a formatted string representation of the Record, optionally using a Session to format properties. + + an optional Session instance that will be used to lookup any + properties in the Record's format string + A formatted string representation of the Record. +

    + If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. +

    + Win32 MSI API: + MsiFormatRecord +

    + + +
    + + + Gets a formatted string representation of the Record. + + String to be used to format the data in the Record, + instead of the Record's format string. + A formatted string representation of the Record. +

    + Win32 MSI API: + MsiFormatRecord +

    +
    + + + Gets a formatted string representation of the Record, optionally using a Session to format properties. + + String to be used to format the data in the Record, + instead of the Record's format string. + an optional Session instance that will be used to lookup any + properties in the Record's format string + A formatted string representation of the Record. +

    + Win32 MSI API: + MsiFormatRecord +

    + + +
    + + + IsFormatStringInvalid is set from several View methods that invalidate the FormatString + and used to determine behavior during Record.ToString(). + + + + + Gets the number of fields in a record. + +

    + Win32 MSI API: + MsiRecordGetFieldCount +

    +
    + + + Gets or sets field 0 of the Record, which is the format string. + + + + + Gets or sets a record field value. + + Specifies the name of the field of the Record to get or set. + The name does not match any known field of the Record. +

    + When getting a field, the type of the object returned depends on the type of the Record field. + The object will be one of: Int16, Int32, String, Stream, or null. +

    + When setting a field, the type of the object provided will be converted to match the View + query that returned the record, or if Record was not returned from a view then the type of + the object provided will determine the type of the Record field. The object should be one of: + Int16, Int32, String, Stream, or null. +

    +
    + + + Gets or sets a record field value. + + Specifies the field of the Record to get or set. + The field is less than 0 or greater than the + number of fields in the Record. +

    + Record fields are indexed starting with 1. Field 0 is a special format field. +

    + When getting a field, the type of the object returned depends on the type of the Record field. + The object will be one of: Int16, Int32, String, Stream, or null. If the Record was returned + from a View, the type will match that of the field from the View query. Otherwise, the type + will match the type of the last value set for the field. +

    + When setting a field, the type of the object provided will be converted to match the View + query that returned the Record, or if Record was not returned from a View then the type of + the object provided will determine the type of the Record field. The object should be one of: + Int16, Int32, String, Stream, or null. +

    + The type-specific getters and setters are slightly more efficient than this property, since + they don't have to do the extra work to infer the value's type every time. +

    + Win32 MSI APIs: + MsiRecordGetInteger, + MsiRecordGetString, + MsiRecordSetInteger, + MsiRecordSetString +

    +
    + + + Assigns ID numbers to the MSI APIs that are remotable. + +

    + This enumeration MUST stay in sync with the + unmanaged equivalent in RemoteMsiSession.h! +

    +
    + + + Defines the signature of the native function + in SfxCA.dll that implements the remoting call. + + + + + Redirects native API calls to either the normal NativeMethods class + or to out-of-proc calls via the remoting channel. + + + + + Checks if the current process is using remoting to access the + MSI session and database APIs. + + + + + Sets a delegate that is used to make remote API calls. + +

    + The implementation of this delegate is provided by the + custom action host DLL. +

    +
    + + + The Session object controls the installation process. It opens the + install database, which contains the installation tables and data. + +

    + This object is associated with a standard set of action functions, + each performing particular operations on data from one or more tables. Additional + custom actions may be added for particular product installations. The basic engine + function is a sequencer that fetches sequential records from a designated sequence + table, evaluates any specified condition expression, and executes the designated + action. Actions not recognized by the engine are deferred to the UI handler object + for processing, usually dialog box sequences. +

    + Note that only one Session object can be opened by a single process. +

    +
    + + + Creates a new Session object from an integer session handle. + + Integer session handle + true to close the handle when this object is disposed or finalized +

    + This method is only provided for interop purposes. A Session object + should normally be obtained by calling + or . +

    +
    + + + Performs any enabled logging operations and defers execution to the UI handler + object associated with the engine. + + Type of message to be processed + Contains message-specific fields + A message-dependent return value + the Session or Record handle is invalid + an invalid message kind is specified + the user exited the installation + the message-handler failed for an unknown reason +

    + Logging may be selectively enabled for the various message types. + See the method. +

    + If record field 0 contains a formatting string, it is used to format the data in + the other fields. Else if the message is an error, warning, or user message, an attempt + is made to find a message template in the Error table for the current database using the + error number found in field 1 of the record for message types and return values. +

    + The parameter may also include message-box flags from + the following enumerations: System.Windows.Forms.MessageBoxButtons, + System.Windows.Forms.MessageBoxDefaultButton, System.Windows.Forms.MessageBoxIcon. These + flags can be combined with the InstallMessage with a bitwise OR. +

    + Note, this method never returns Cancel or Error values. Instead, appropriate + exceptions are thrown in those cases. +

    + Win32 MSI API: + MsiProcessMessage +

    +
    + + + Writes a message to the log, if logging is enabled. + + The line to be written to the log +

    + Win32 MSI API: + MsiProcessMessage +

    +
    + + + Writes a formatted message to the log, if logging is enabled. + + The line to be written to the log, containing 0 or more format specifiers + An array containing 0 or more objects to be formatted +

    + Win32 MSI API: + MsiProcessMessage +

    +
    + + + Evaluates a logical expression containing symbols and values. + + conditional expression + The result of the condition evaluation + the Session handle is invalid + the condition is null or empty + the conditional expression is invalid +

    + Win32 MSI API: + MsiEvaluateCondition +

    +
    + + + Evaluates a logical expression containing symbols and values, specifying a default + value to be returned in case the condition is empty. + + conditional expression + value to return if the condition is empty + The result of the condition evaluation + the Session handle is invalid + the conditional expression is invalid +

    + Win32 MSI API: + MsiEvaluateCondition +

    +
    + + + Formats a string containing installer properties. + + A format string containing property tokens + A formatted string containing property data + the Record handle is invalid +

    + Win32 MSI API: + MsiFormatRecord +

    +
    + + + Returns a formatted string from record data. + + Record object containing a template and data to be formatted. + The template string must be set in field 0 followed by any referenced data parameters. + A formatted string containing the record data + the Record handle is invalid +

    + Win32 MSI API: + MsiFormatRecord +

    +
    + + + Returns a formatted string from record data using a specified format. + + Record object containing a template and data to be formatted + Format string to be used instead of field 0 of the Record + A formatted string containing the record data + the Record handle is invalid +

    + Win32 MSI API: + MsiFormatRecord +

    +
    + + + Retrieves product properties (not session properties) from the product database. + + Value of the property, or an empty string if the property is not set. +

    + Note this is not the correct method for getting ordinary session properties. For that, + see the indexer on the Session class. +

    + Win32 MSI API: + MsiGetProductProperty +

    +
    + + + Checks to see if sufficient disk space is present for the current installation. + + True if there is sufficient disk space; false otherwise. +

    + Win32 MSI API: + MsiVerifyDiskSpace +

    +
    + + + Gets the total disk space per drive required for the installation. + + A list of InstallCost structures, specifying the cost for each drive +

    + Win32 MSI API: + MsiEnumComponentCosts +

    +
    + + + Gets the designated mode flag for the current install session. + + The type of mode to be checked. + The value of the designated mode flag. + the Session handle is invalid + an invalid mode flag was specified +

    + Note that only the following run modes are available to read from + a deferred custom action: + + + + +

    + Win32 MSI API: + MsiGetMode +

    +
    + + + Sets the designated mode flag for the current install session. + + The type of mode to be set. + The desired value of the mode. + the Session handle is invalid + an invalid mode flag was specified + the mode cannot not be set +

    + Win32 MSI API: + MsiSetMode +

    +
    + + + Gets the full path to the designated folder on the source media or server image. + + the folder was not found in the Directory table + the Session handle is invalid +

    + Win32 MSI API: + MsiGetSourcePath +

    +
    + + + Gets the full path to the designated folder on the installation target drive. + + the folder was not found in the Directory table + the Session handle is invalid +

    + Win32 MSI API: + MsiGetTargetPath +

    +
    + + + Sets the full path to the designated folder on the installation target drive. + + the folder was not found in the Directory table + the Session handle is invalid +

    + Setting the target path of a directory changes the path specification for the directory + in the in-memory Directory table. Also, the path specifications of all other path objects + in the table that are either subordinate or equivalent to the changed path are updated + to reflect the change. The properties for each affected path are also updated. +

    + If an error occurs in this function, all updated paths and properties revert to + their previous values. Therefore, it is safe to treat errors returned by this function + as non-fatal. +

    + Do not attempt to configure the target path if the components using those paths + are already installed for the current user or for a different user. Check the + ProductState property before setting the target path to determine if the product + containing this component is installed. +

    + Win32 MSI API: + MsiSetTargetPath +

    +
    + + + Sets the install level for the current installation to a specified value and + recalculates the Select and Installed states for all features in the Feature + table. Also sets the Action state of each component in the Component table based + on the new level. + + New install level + the Session handle is invalid +

    + The SetInstallLevel method sets the following: + The installation level for the current installation to a specified value + The Select and Installed states for all features in the Feature table + The Action state of each component in the Component table, based on the new level + + If 0 or a negative number is passed in the ilnstallLevel parameter, + the current installation level does not change, but all features are still + updated based on the current installation level. +

    + Win32 MSI API: + MsiSetInstallLevel +

    +
    + + + Executes a built-in action, custom action, or user-interface wizard action. + + Name of the action to execute. Case-sensitive. + the Session handle is invalid + the user exited the installation +

    + The DoAction method executes the action that corresponds to the name supplied. If the + name is not recognized by the installer as a built-in action or as a custom action in + the CustomAction table, the name is passed to the user-interface handler object, which + can invoke a function or a dialog box. If a null action name is supplied, the installer + uses the upper-case value of the ACTION property as the action to perform. If no property + value is defined, the default action is performed, defined as "INSTALL". +

    + Actions that update the system, such as the InstallFiles and WriteRegistryValues + actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction + is called from a custom action that is scheduled in the InstallExecuteSequence table + between the InstallInitialize and InstallFinalize actions. Actions that do not update the + system, such as AppSearch or CostInitialize, can be called. +

    + Win32 MSI API: + MsiDoAction +

    +
    + + + Executes a built-in action, custom action, or user-interface wizard action. + + Name of the action to execute. Case-sensitive. + Optional data to be passed to a deferred custom action. + the Session handle is invalid + the user exited the installation +

    + The DoAction method executes the action that corresponds to the name supplied. If the + name is not recognized by the installer as a built-in action or as a custom action in + the CustomAction table, the name is passed to the user-interface handler object, which + can invoke a function or a dialog box. If a null action name is supplied, the installer + uses the upper-case value of the ACTION property as the action to perform. If no property + value is defined, the default action is performed, defined as "INSTALL". +

    + Actions that update the system, such as the InstallFiles and WriteRegistryValues + actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction + is called from a custom action that is scheduled in the InstallExecuteSequence table + between the InstallInitialize and InstallFinalize actions. Actions that do not update the + system, such as AppSearch or CostInitialize, can be called. +

    + If the called action is a deferred, rollback, or commit custom action, then the supplied + will be available via the + property of that custom action's session. +

    + Win32 MSI API: + MsiDoAction +

    +
    + + + Executes an action sequence described in the specified table. + + Name of the table containing the action sequence. + the Session handle is invalid + the user exited the installation +

    + This method queries the specified table, ordering the actions by the numbers in the Sequence column. + For each row retrieved, an action is executed, provided that any supplied condition expression does + not evaluate to FALSE. +

    + An action sequence containing any actions that update the system, such as the InstallFiles and + WriteRegistryValues actions, cannot be run by calling DoActionSequence. The exception to this rule is if + DoActionSequence is called from a custom action that is scheduled in the InstallExecuteSequence table + between the InstallInitialize and InstallFinalize actions. Actions that do not update the system, such + as AppSearch or CostInitialize, can be called. +

    + Win32 MSI API: + MsiSequence +

    +
    + + + Implements formatting for data. + + Type of format object to get. + The the current instance, if is the same type + as the current instance; otherwise, null. + + + + Closes the session handle. Also closes the active database handle, if it is open. + After closing a handle, further method calls may throw an . + + If true, the method has been called directly + or indirectly by a user's code, so managed and unmanaged resources will + be disposed. If false, only unmanaged resources will be disposed. + + + + Throws an exception if the custom action is not able to access immedate session details. + + + + + Gets the Database for the install session. + + the Session handle is invalid + the Database cannot be accessed +

    + Normally there is no need to close this Database object. The same object can be + used throughout the lifetime of the Session, and it will be closed when the Session + is closed. +

    + Win32 MSI API: + MsiGetActiveDatabase +

    +
    + + + Gets the numeric language ID used by the current install session. + +

    + Win32 MSI API: + MsiGetLanguage +

    +
    + + + Gets or sets the string value of a named installer property, as maintained by the + Session object in the in-memory Property table, or, if it is prefixed with a percent + sign (%), the value of a system environment variable for the current process. + + the Session handle is invalid +

    + Win32 MSI APIs: + MsiGetProperty, + MsiSetProperty +

    +
    + + + Gets an accessor for components in the current session. + + + + + Gets an accessor for features in the current session. + + + + + Gets custom action data for the session that was supplied by the caller. + + + + + + Gets the (short) list of properties that are available from non-immediate custom actions. + + + + + Holds information about the target of a shortcut file. + + + + + Tests whether two shortcut targets have the same product code, feature, and/or component code. + + The first shortcut target to compare. + The second shortcut target to compare. + True if all parts of the targets are the same, else false. + + + + Tests whether two shortcut targets have the same product code, feature, and/or component code. + + The first shortcut target to compare. + The second shortcut target to compare. + True if any parts of the targets are different, else false. + + + + Tests whether two shortcut targets have the same product code, feature, and/or component code. + + The shortcut target to compare to the current object. + True if is a shortcut target and all parts of the targets are the same, else false. + + + + Generates a hash code using all parts of the shortcut target. + + An integer suitable for hashing the shortcut target. + + + + Gets the target product code of the shortcut, or null if not available. + + + + + Gets the name of the target feature of the shortcut, or null if not available. + + + + + Gets the target component code of the shortcut, or null if not available. + + + + + A list of sources for an installed product or patch. + + + + + Adds a network or URL source to the source list of the installed product. + + Path to the source to be added. This parameter is + expected to contain only the path without the filename. +

    + If this method is called with a new source, the installer adds the source + to the end of the source list. +

    + If this method is called with a source already existing in the source + list, it has no effect. +

    + Win32 MSI APIs: + MsiSourceListAddSource, + MsiSourceListAddSourceEx +

    + +
    + + + Adds or reorders a network or URL source for the product or patch. + + Path to the source to be added. This parameter is + expected to contain only the path without the filename. + Specifies the priority order in which the source + will be inserted +

    + If this method is called with a new source and + is set to 0, the installer adds the source to the end of the source list. +

    + If this method is called with a source already existing in the source + list and is set to 0, the installer retains the + source's existing index. +

    + If the method is called with an existing source in the source list + and is set to a non-zero value, the source is + removed from its current location in the list and inserted at the position + specified by Index, before any source that already exists at that position. +

    + If the method is called with a new source and Index is set to a + non-zero value, the source is inserted at the position specified by + , before any source that already exists at + that position. The index value for all sources in the list after the + index specified by Index are updated to ensure unique index values and + the pre-existing order is guaranteed to remain unchanged. +

    + If is greater than the number of sources + in the list, the source is placed at the end of the list with an index + value one larger than any existing source. +

    + Win32 MSI API: + MsiSourceListAddSourceEx +

    +
    + + + Clears sources of all types: network, url, and media. + +

    + Win32 MSI API: + MsiSourceListClearAll +

    +
    + + + Removes all network sources from the list. URL sources are not affected. + +

    + Win32 MSI API: + MsiSourceListClearAllEx +

    +
    + + + Removes all URL sources from the list. Network sources are not affected. + +

    + Win32 MSI API: + MsiSourceListClearAllEx +

    +
    + + + Checks if the specified source exists in the list. + + case-insensitive source to look for + true if the source exists in the list, false otherwise + + + + Copies the network and URL sources from this list into an array. + + destination array to be filed + offset into the destination array where copying begins + + + + Removes a network or URL source. + +

    + Win32 MSI API: + MsiSourceListClearSource +

    +
    + + + Enumerates the network and URL sources in the source list of the patch or product installation. + +

    + Win32 MSI API: + MsiSourceListEnumSources +

    +
    + + + Forces the installer to search the source list for a valid + source the next time a source is required. For example, when the + installer performs an installation or reinstallation, or when it + requires the path for a component that is set to run from source. + +

    + Win32 MSI APIs: + MsiSourceListForceResolution, + MsiSourceListForceResolutionEx +

    +
    + + + Gets the list of disks registered for the media source of + the patch or product installation. + + + + + Gets the number of network and URL sources in the list. + + + + + Gets a boolean value indicating whether the list is read-only. + A SourceList is never read-only. + + read-only status of the list + + + + Gets or sets the path relative to the root of the installation media. + + + + + Gets or sets the prompt template that is used when prompting the user + for installation media. + + + + + Gets or sets the most recently used source location for the product. + + + + + Gets or sets the name of the Windows Installer package or patch package + on the source. + + + + + Gets the type of the last-used source. + +

    +

      +
    • "n" = network location
    • +
    • "u" = URL location
    • +
    • "m" = media location
    • +
    • (empty string) = no last used source
    • +
    +

    +
    + + + Gets or sets source list information properties of a product or patch installation. + + The source list information property name. + An unknown product, patch, or property was requested +

    + Win32 MSI API: + MsiSourceListGetInfo +

    +
    + + + A list of source media for an installed product or patch. + + + + + Adds or updates a disk of the media source for the product or patch. + +

    + To change the disk prompt only, get the existing volume label from the + registry and provide it in this call along with the new disk prompt. + Passing a null or empty string for + registers an empty string as the volume label. +

    To change the volume label only, get the existing disk prompt + that is registered and provide it when calling SourceListAddMediaDisk + along with the new volume label. Passing null or an empty string + registers an empty string as the disk prompt.

    +

    + Win32 MSI API: + MsiSourceListAddMediaDisk +

    +
    + + + Removes all source media from the list. + +

    + Win32 MSI API: + MsiSourceListClearAllEx +

    +
    + + + Checks if the specified media disk id exists in the list. + + disk id of the media to look for + true if the media exists in the list, false otherwise + + + + Copies the source media info from this list into an array. + + destination array to be filed + offset into the destination array where copying begins + + + + Removes a specified disk from the set of registered disks. + + ID of the disk to remove +

    + Win32 MSI API: + MsiSourceListClearMediaDisk +

    +
    + + + Enumerates the source media in the source list of the patch or product installation. + +

    + Win32 MSI API: + MsiSourceListEnumMediaDisks +

    +
    + + + Gets the number of source media in the list. + + + + + Gets a boolean value indicating whether the list is read-only. + A SourceMediaList is never read-only. + + read-only status of the list + + + + Provides access to summary information of a Windows Installer database. + + + + + Gets a SummaryInfo object that can be used to examine, update, and add + properties to the summary information stream of a package or transform. + + Path to the package (database) or transform + True to reserve resources for writing summary information properties. + the package does not exist or could not be read + the package is an invalid format +

    + The SummaryInfo object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiGetSummaryInformation +

    +
    + + + Formats and writes the previously stored properties into the standard summary information stream. + + The stream cannot be successfully written. +

    + This method may only be called once after all the property values have been set. Properties may + still be read after the stream is written. +

    + Win32 MSI API: + MsiSummaryInfoPersist +

    +
    + + Gets or sets the Title summary information property. +

    + The Title summary information property briefly describes the type of installer package. Phrases + such as "Installation Database" or "Transform" or "Patch" may be used for this property. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the Subject summary information property. +

    + The Subject summary information property conveys to a file browser the product that can be installed using + the logic and data in this installer database. For example, the value of the summary property for + Microsoft Office 97 would be "Microsoft Office 97 Professional". This value is typically set from the + installer property ProductName. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the Author summary information property. +

    + The Author summary information property conveys to a file browser the manufacturer of the installation + database. This value is typically set from the installer property Manufacturer. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the Keywords summary information property. +

    + The Keywords summary information property is used by file browsers to hold keywords that permit the + database file to be found in a keyword search. The set of keywords typically includes "Installer" as + well as product-specific keywords, and may be localized. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the Comments summary information property. +

    + The Comments summary information property conveys the general purpose of the installer database. By convention, + the value for this summary property is set to the following: +

    + "This installer database contains the logic and data required to install <product name>." +

    + where <product name> is the name of the product being installed. In general the value for this summary + property only changes in the product name, nothing else. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the Template summary information property. +

    + The Template summary information propery indicates the platform and language versions supported by the database. +

    + The syntax of the Template Summary property information is: + [platform property][,platform property][,...];[language id][,language id][,...] +

    + For example, the following are all valid values for the Template Summary property: + + Intel;1033 + Intel64;1033 + ;1033 + ; + Intel ;1033,2046 + Intel64;1033,2046 + Intel;0 + +

    + If this is a 64-bit Windows Installer, enter Intel64 in the Template summary information property. Note that an + installation package cannot have both the Intel and Intel64 properties set. +

    + If the current platform does not match one of the platforms specified then the installer will not process the + package. Not specifying a platform implies that the package is platform-independent. +

    + Entering 0 in the language ID field of the Template summary information property, or leaving this field empty, + indicates that the package is language neutral. +

    + There are variations of this property depending on whether it is in a source installer database or a transform. +

    + Source Installer Database - Only one language can be specified in a source installer database. Merge Modules are + the only packages that may have multiple languages. For more information, see Multiple Language Merge Modules. +

    + Transform - In a transform file, only one language may be specified. The specified platform and language determine + whether a transform can be applied to a particular database. The platform property and the language property can + be left blank if no transform restriction relies on them to validate the transform. +

    + This summary property is REQUIRED. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the LastSavedBy summary information property. +

    + The installer sets the Last Saved By summary information property to the value of the LogonUser property during + an administrative installation. The installer never uses this property and a user never needs to modify it. + Developers of a database editing tool may use this property to track the last person to modify the database. + This property should be left set to null in a final shipping database. +

    + In a transform, this summary property contains the platform and language ID(s) that a database should have + after it has been transformed. The property specifies to what the Template should be set in the new database. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the RevisionNumber summary information property. +

    + The Revision Number summary information property contains the package code for the installer package. The + package code is a unique identifier of the installer package. +

    + The Revision Number summary information property of a patch package specifies the GUID patch code for + the patch. This is followed by a list of patch code GUIDs for obsolete patches that are removed when this + patch is applied. The patch codes are concatenated with no delimiters separating GUIDs in the list. +

    + The Revision Number summary information property of a transform package lists the product code GUIDs + and version of the new and original products and the upgrade code GUID. The list is separated with + semicolons as follows. +

    + Original-Product-Code Original-Product-Version ; New-Product Code New-Product-Version; Upgrade-Code +

    + This summary property is REQUIRED. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the CreatingApp summary information property. +

    + The CreatingApp summary information property conveys which application created the installer database. + In general the value for this summary property is the name of the software used to author this database. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the LastPrintTime summary information property. +

    + The LastPrintTime summary information property can be set to the date and time during an administrative + installation to record when the administrative image was created. For non-administrative installations + this property is the same as the CreateTime summary information property. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the CreateTime summary information property. +

    + The CreateTime summary information property conveys when the installer database was created. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the LastSaveTime summary information property. +

    + The LastSaveTime summary information property conveys when the last time the installer database was + modified. Each time a user changes an installation the value for this summary property is updated to + the current system time/date at the time the installer database was saved. Initially the value for + this summary property is set to null to indicate that no changes have yet been made. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the CodePage summary information property. +

    + The Codepage summary information property is the numeric value of the ANSI code page used for any + strings that are stored in the summary information. Note that this is not the same code page for + strings in the installation database. The Codepage summary information property is used to translate + the strings in the summary information into Unicode when calling the Unicode API functions. The + Codepage summary information property must be set before any string properties are set in the + summary information. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the PageCount summary information property. +

    + For an installation package, the PageCount summary information property contains the minimum + installer version required. For Windows Installer version 1.0, this property must be set to the + integer 100. For 64-bit Windows Installer Packages, this property must be set to the integer 200. +

    + For a transform package, the PageCount summary information property contains minimum installer + version required to process the transform. Set to the greater of the two PageCount summary information + property values belonging to the databases used to generate the transform. +

    + The PageCount summary information property is set to null in patch packages. +

    + This summary property is REQUIRED. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the WordCount summary information property. +

    + The WordCount summary information property indicates the type of source file image. If this property is + not present, it defaults to 0. Note that this property is stored in place of the standard Count property. +

    + This property is a bit field. New bits may be added in the future. At present the following bits are + available: + + Bit 0: 0 = long file names, 1 = short file names + Bit 1: 0 = source is uncompressed, 1 = source is compressed + Bit 2: 0 = source is original media, 1 = source is administrative installation + [MSI 4.0] Bit 3: 0 = elevated privileges can be required to install, 1 = elevated privileges are not required to install + +

    + These are combined to give the WordCount summary information property one of the following values + indicating a type of source file image: + + 0 - Original source using long file names. Matches tree in Directory table. + 1 - Original source using short file names. Matches tree in Directory table. + 2 - Compressed source files using long file names. Matches cabinets and files in the Media table. + 3 - Compressed source files using short file names. Matches cabinets and files in the Media table. + 4 - Administrative image using long file names. Matches tree in Directory table. + 5 - Administrative image using short file names. Matches tree in Directory table. + +

    + Note that if the package is marked as compressed (bit 1 is set), the installer only installs files + located at the root of the source. In this case, even files marked as uncompressed in the File table must + be located at the root to be installed. To specify a source image that has both a cabinet file (compressed + files) and uncompressed files that match the tree in the Directory table, mark the package as uncompressed + by leaving bit 1 unset (value=0) in the WordCount summary information property and set + (value=16384) in the Attributes column of the File table + for each file in the cabinet. +

    + For a patch package, the WordCount summary information property specifies the patch engine that was used + to create the patch files. The default value is 1 and indicates that MSPATCH was used to create the patch + A value of "2" means that the patch is using smaller, optimized, files available only with Windows Installer + version 1.2 or later. A patch with a WordCount of "2" fails immediately if used with a Windows Installer + version earlier than 1.2. A patch with a WordCount of "3" fails immediately if used with a Windows Installer + version earlier than 2.0. +

    + This summary property is REQUIRED. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the CharacterCount summary information property. +

    + The CharacterCount summary information property is only used in transforms. This part of the summary + information stream is divided into two 16-bit words. The upper word contains the transform validation + flags. The lower word contains the transform error condition flags. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + Gets or sets the Security summary information property. +

    + The Security summary information property conveys whether the package should be opened as read-only. The database + editing tool should not modify a read-only enforced database and should issue a warning at attempts to modify a + read-only recommended database. The following values of this property are applicable to Windows Installer files: + + 0 - no restriction + 2 - read only recommended + 4 - read only enforced + +

    + This property should be set to read-only recommended (2) for an installation database and to read-only + enforced (4) for a transform or patch. +

    + Win32 MSI APIs: + MsiSummaryInfoGetProperty, + MsiSummaryInfoSetProperty +

    +
    + + + Contains information about all the tables in a Windows Installer database. + + + + + Adds a new table to the database. + + information about the table to be added + a table with the same name already exists in the database + + + + Removes all tables (and all data) from the database. + + + + + Checks if the database contains a table with the given name. + + case-sensitive name of the table to search for + True if the table exists, false otherwise. + + + + Copies the table information from this collection into an array. + + destination array to be filed + offset into the destination array where copying begins + + + + Removes a table from the database. + + case-sensitive name of the table to be removed + true if the table was removed, false if the table did not exist + + + + Enumerates the tables in the database. + + + + + Gets the number of tables in the database. + + + + + Gets a boolean value indicating whether the collection is read-only. + A TableCollection is read-only when the database is read-only. + + read-only status of the collection + + + + Gets information about a given table. + + case-sensitive name of the table + information about the requested table, or null if the table does not exist in the database + + + + Defines a table in an installation database. + + + + + Creates a table definition. + + Name of the table. + Columns in the table. + The primary keys of the table. + + + + Gets a string representation of the table. + + The name of the table. + + + + Gets the name of the table. + + + + + Gets information about the columns in this table. + +

    + This property queries the database every time it is called, + to ensure the returned values are up-to-date. For best performance, + hold onto the returned collection if using it more than once. +

    +
    + + + Gets the names of the columns that are primary keys of the table. + + + + + Gets an SQL CREATE string that can be used to create the table. + + + + + Gets an SQL INSERT string that can be used insert a new record into the table. + +

    + The values are expressed as question-mark tokens, to be supplied by the record. +

    +
    + + + Gets an SQL SELECT string that can be used to select all columns of the table. + +

    + The columns are listed explicitly in the SELECT string, as opposed to using "SELECT *". +

    +
    + + + Contains specific information about an error encountered by the , + , or methods of the + class. + + + + + Gets the type of validation error encountered. + + + + + Gets the column containing the error, or null if the error applies to the whole row. + + + + + A View represents a result set obtained when processing a query using the + method of a + . Before any data can be transferred, + the query must be executed using the method, passing to + it all replaceable parameters designated within the SQL query string. + + + + + Executes a SQL View query and supplies any required parameters. The query uses the + question mark token to represent parameters as described in SQL Syntax. The values of + these parameters are passed in as the corresponding fields of a parameter record. + + Optional Record that supplies the parameters. This + Record contains values to replace the parameter tokens in the SQL query. + the View could not be executed + the View handle is invalid +

    + Win32 MSI API: + MsiViewExecute +

    +
    + + + Executes a SQL View query. + + the View could not be executed + the View handle is invalid +

    + Win32 MSI API: + MsiViewExecute +

    +
    + + + Fetches the next sequential record from the view, or null if there are no more records. + + the View is not in an active state + the View handle is invalid +

    + The Record object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. +

    + Win32 MSI API: + MsiViewFetch +

    +
    + + + Updates a fetched Record. + + specifies the modify mode + the Record to modify + the modification failed, + or a validation was requested and the data did not pass + the View handle is invalid +

    + You can update or delete a record immediately after inserting, or seeking provided you + have NOT modified the 0th field of the inserted or sought record. +

    + To execute any SQL statement, a View must be created. However, a View that does not + create a result set, such as CREATE TABLE, or INSERT INTO, cannot be used with any of + the Modify methods to update tables though the view. +

    + You cannot fetch a record containing binary data from one database and then use + that record to insert the data into another database. To move binary data from one database + to another, you should export the data to a file and then import it into the new database + using a query and the . This ensures that each database has + its own copy of the binary data. +

    + Note that custom actions can only add, modify, or remove temporary rows, columns, + or tables from a database. Custom actions cannot modify persistent data in a database, + such as data that is a part of the database stored on disk. +

    + Win32 MSI API: + MsiViewModify +

    + + + + + + + + + + + + + +
    + + + Refreshes the data in a Record. + + the Record to be refreshed + the refresh failed + the View handle is invalid +

    + The Record must have been obtained by calling . Fails with + a deleted Record. Works only with read-write Records. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Inserts a Record into the view. + + the Record to be inserted + the insertion failed + the View handle is invalid +

    + Fails if a row with the same primary keys exists. Fails with a read-only database. + This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Updates the View with new data from the Record. + + the new data + the update failed + the View handle is invalid +

    + Only non-primary keys can be updated. The Record must have been obtained by calling + . Fails with a deleted Record. Works only with read-write Records. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Updates or inserts a Record into the View. + + the Record to be assigned + the assignment failed + the View handle is invalid +

    + Updates record if the primary keys match an existing row and inserts if they do not match. + Fails with a read-only database. This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Updates or deletes and inserts a Record into the View. + + the Record to be replaced + the replacement failed + the View handle is invalid +

    + The Record must have been obtained by calling . Updates record if the + primary keys are unchanged. Deletes old row and inserts new if primary keys have changed. + Fails with a read-only database. This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Deletes a Record from the View. + + the Record to be deleted + the deletion failed + the View handle is invalid +

    + The Record must have been obtained by calling . Fails if the row has been + deleted. Works only with read-write records. This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Inserts a Record into the View. The inserted data is not persistent. + + the Record to be inserted + the insertion failed + the View handle is invalid +

    + Fails if a row with the same primary key exists. Works only with read-write records. + This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Refreshes the information in the supplied record without changing the position + in the result set and without affecting subsequent fetch operations. + + the Record to be filled with the result of the seek + the seek failed + the View handle is invalid +

    + After seeking, the Record may then be used for subsequent Update, Delete, and Refresh + operations. All primary key columns of the table must be in the query and the Record must + have at least as many fields as the query. Seek cannot be used with multi-table queries. + This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Inserts or validates a record. + + the Record to be merged + true if the record was inserted or validated, false if there is an existing + record with the same primary keys that is not identical + the merge failed (for a reason other than invalid data) + the View handle is invalid +

    + Works only with read-write records. This method cannot be used with a + View containing joins. +

    + See for more remarks. +

    + Win32 MSI API: + MsiViewModify +

    +
    + + + Validates a record, returning information about any errors. + + the Record to be validated + null if the record was validated; if there is an existing record with + the same primary keys that has conflicting data then error information is returned + the validation failed (for a reason other than invalid data) + the View handle is invalid +

    + The Record must have been obtained by calling . + Works with read-write and read-only records. This method cannot be used + with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +

    +
    + + + Validates a new record, returning information about any errors. + + the Record to be validated + null if the record was validated; if there is an existing + record with the same primary keys then error information is returned + the validation failed (for a reason other than invalid data) + the View handle is invalid +

    + Checks for duplicate keys. The Record must have been obtained by + calling . Works with read-write and read-only records. + This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +

    +
    + + + Validates fields of a fetched or new record, returning information about any errors. + Can validate one or more fields of an incomplete record. + + the Record to be validated + null if the record was validated; if there is an existing record with + the same primary keys that has conflicting data then error information is returned + the validation failed (for a reason other than invalid data) + the View handle is invalid +

    + Works with read-write and read-only records. This method cannot be used with + a View containing joins. +

    + See for more remarks. +

    + Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +

    +
    + + + Validates a record that will be deleted later, returning information about any errors. + + the Record to be validated + null if the record is safe to delete; if another row refers to + the primary keys of this row then error information is returned + the validation failed (for a reason other than invalid data) + the View handle is invalid +

    + Validation does not check for the existence of the primary keys of this row in properties + or strings. Does not check if a column is a foreign key to multiple tables. Works with + read-write and read-only records. This method cannot be used with a View containing joins. +

    + See for more remarks. +

    + Win32 MSI APIs: + MsiViewModify, + MsiViewGetError +

    +
    + + + Enumerates over the Records retrieved by the View. + + An enumerator of Record objects. + The View was not d before attempting the enumeration. +

    + Each Record object should be d after use. + It is best that the handle be closed manually as soon as it is no longer + needed, as leaving lots of unused handles open can degrade performance. + However, note that it is not necessary to complete the enumeration just + for the purpose of closing handles, because Records are fetched lazily + on each step of the enumeration. +

    + Win32 MSI API: + MsiViewFetch +

    +
    + + + Gets the Database on which this View was opened. + + + + + Gets the SQL query string used to open this View. + + + + + Gets the set of tables that were included in the SQL query for this View. + + + + + Gets the set of columns that were included in the query for this View, + or null if this view is not a SELECT query. + + the View is not in an active state + the View handle is invalid +

    + Win32 MSI API: + MsiViewGetColumnInfo +

    +
    +
    +
    diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/aclutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/aclutil.h index 8eef0c65e8..c19e3aba1a 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/aclutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/aclutil.h @@ -1,144 +1,144 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Access Control List helper functions. -// -//------------------------------------------------------------------------------------------------- - -#include -#include - -#define ReleaseSid(x) if (x) { AclFreeSid(x); } -#define ReleaseNullSid(x) if (x) { AclFreeSid(x); x = NULL; } - -#ifdef __cplusplus -extern "C" { -#endif - -// structs -struct ACL_ACCESS -{ - BOOL fDenyAccess; - DWORD dwAccessMask; - - // TODO: consider using a union - LPCWSTR pwzAccountName; // NOTE: the last three items in this structure are ignored if this is not NULL - - SID_IDENTIFIER_AUTHORITY sia; // used if pwzAccountName is NULL - BYTE nSubAuthorityCount; - DWORD nSubAuthority[8]; -}; - -struct ACL_ACE -{ - DWORD dwFlags; - DWORD dwMask; - PSID psid; -}; - - -// functions -HRESULT DAPI AclCheckAccess( - __in HANDLE hToken, - __in ACL_ACCESS* paa - ); -HRESULT DAPI AclCheckAdministratorAccess( - __in HANDLE hToken - ); -HRESULT DAPI AclCheckLocalSystemAccess( - __in HANDLE hToken - ); - -HRESULT DAPI AclGetWellKnownSid( - __in WELL_KNOWN_SID_TYPE wkst, - __deref_out PSID* ppsid - ); -HRESULT DAPI AclGetAccountSid( - __in_opt LPCWSTR wzSystem, - __in_z LPCWSTR wzAccount, - __deref_out PSID* ppsid - ); -HRESULT DAPI AclGetAccountSidString( - __in_z LPCWSTR wzSystem, - __in_z LPCWSTR wzAccount, - __deref_out_z LPWSTR* ppwzSid - ); - -HRESULT DAPI AclCreateDacl( - __in_ecount(cDeny) ACL_ACE rgaaDeny[], - __in DWORD cDeny, - __in_ecount(cAllow) ACL_ACE rgaaAllow[], - __in DWORD cAllow, - __deref_out ACL** ppAcl - ); -HRESULT DAPI AclAddToDacl( - __in ACL* pAcl, - __in_ecount_opt(cDeny) const ACL_ACE rgaaDeny[], - __in DWORD cDeny, - __in_ecount_opt(cAllow) const ACL_ACE rgaaAllow[], - __in DWORD cAllow, - __deref_out ACL** ppAclNew - ); -HRESULT DAPI AclMergeDacls( - __in const ACL* pAcl1, - __in const ACL* pAcl2, - __deref_out ACL** ppAclNew - ); -HRESULT DAPI AclCreateDaclOld( - __in_ecount(cAclAccesses) ACL_ACCESS* paa, - __in DWORD cAclAccesses, - __deref_out ACL** ppAcl - ); -HRESULT DAPI AclCreateSecurityDescriptor( - __in_ecount(cAclAccesses) ACL_ACCESS* paa, - __in DWORD cAclAccesses, - __deref_out SECURITY_DESCRIPTOR** ppsd - ); -HRESULT DAPI AclCreateSecurityDescriptorFromDacl( - __in ACL* pACL, - __deref_out SECURITY_DESCRIPTOR** ppsd - ); -HRESULT __cdecl AclCreateSecurityDescriptorFromString( - __deref_out SECURITY_DESCRIPTOR** ppsd, - __in_z __format_string LPCWSTR wzSddlFormat, - ... - ); -HRESULT DAPI AclDuplicateSecurityDescriptor( - __in SECURITY_DESCRIPTOR* psd, - __deref_out SECURITY_DESCRIPTOR** ppsd - ); -HRESULT DAPI AclGetSecurityDescriptor( - __in_z LPCWSTR wzObject, - __in SE_OBJECT_TYPE sot, - __deref_out SECURITY_DESCRIPTOR** ppsd - ); - -HRESULT DAPI AclFreeSid( - __in PSID psid - ); -HRESULT DAPI AclFreeDacl( - __in ACL* pACL - ); -HRESULT DAPI AclFreeSecurityDescriptor( - __in SECURITY_DESCRIPTOR* psd - ); - -HRESULT DAPI AclAddAdminToSecurityDescriptor( - __in SECURITY_DESCRIPTOR* pSecurity, - __deref_out SECURITY_DESCRIPTOR** ppSecurityNew - ); -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Access Control List helper functions. +// +//------------------------------------------------------------------------------------------------- + +#include +#include + +#define ReleaseSid(x) if (x) { AclFreeSid(x); } +#define ReleaseNullSid(x) if (x) { AclFreeSid(x); x = NULL; } + +#ifdef __cplusplus +extern "C" { +#endif + +// structs +struct ACL_ACCESS +{ + BOOL fDenyAccess; + DWORD dwAccessMask; + + // TODO: consider using a union + LPCWSTR pwzAccountName; // NOTE: the last three items in this structure are ignored if this is not NULL + + SID_IDENTIFIER_AUTHORITY sia; // used if pwzAccountName is NULL + BYTE nSubAuthorityCount; + DWORD nSubAuthority[8]; +}; + +struct ACL_ACE +{ + DWORD dwFlags; + DWORD dwMask; + PSID psid; +}; + + +// functions +HRESULT DAPI AclCheckAccess( + __in HANDLE hToken, + __in ACL_ACCESS* paa + ); +HRESULT DAPI AclCheckAdministratorAccess( + __in HANDLE hToken + ); +HRESULT DAPI AclCheckLocalSystemAccess( + __in HANDLE hToken + ); + +HRESULT DAPI AclGetWellKnownSid( + __in WELL_KNOWN_SID_TYPE wkst, + __deref_out PSID* ppsid + ); +HRESULT DAPI AclGetAccountSid( + __in_opt LPCWSTR wzSystem, + __in_z LPCWSTR wzAccount, + __deref_out PSID* ppsid + ); +HRESULT DAPI AclGetAccountSidString( + __in_z LPCWSTR wzSystem, + __in_z LPCWSTR wzAccount, + __deref_out_z LPWSTR* ppwzSid + ); + +HRESULT DAPI AclCreateDacl( + __in_ecount(cDeny) ACL_ACE rgaaDeny[], + __in DWORD cDeny, + __in_ecount(cAllow) ACL_ACE rgaaAllow[], + __in DWORD cAllow, + __deref_out ACL** ppAcl + ); +HRESULT DAPI AclAddToDacl( + __in ACL* pAcl, + __in_ecount_opt(cDeny) const ACL_ACE rgaaDeny[], + __in DWORD cDeny, + __in_ecount_opt(cAllow) const ACL_ACE rgaaAllow[], + __in DWORD cAllow, + __deref_out ACL** ppAclNew + ); +HRESULT DAPI AclMergeDacls( + __in const ACL* pAcl1, + __in const ACL* pAcl2, + __deref_out ACL** ppAclNew + ); +HRESULT DAPI AclCreateDaclOld( + __in_ecount(cAclAccesses) ACL_ACCESS* paa, + __in DWORD cAclAccesses, + __deref_out ACL** ppAcl + ); +HRESULT DAPI AclCreateSecurityDescriptor( + __in_ecount(cAclAccesses) ACL_ACCESS* paa, + __in DWORD cAclAccesses, + __deref_out SECURITY_DESCRIPTOR** ppsd + ); +HRESULT DAPI AclCreateSecurityDescriptorFromDacl( + __in ACL* pACL, + __deref_out SECURITY_DESCRIPTOR** ppsd + ); +HRESULT __cdecl AclCreateSecurityDescriptorFromString( + __deref_out SECURITY_DESCRIPTOR** ppsd, + __in_z __format_string LPCWSTR wzSddlFormat, + ... + ); +HRESULT DAPI AclDuplicateSecurityDescriptor( + __in SECURITY_DESCRIPTOR* psd, + __deref_out SECURITY_DESCRIPTOR** ppsd + ); +HRESULT DAPI AclGetSecurityDescriptor( + __in_z LPCWSTR wzObject, + __in SE_OBJECT_TYPE sot, + __deref_out SECURITY_DESCRIPTOR** ppsd + ); + +HRESULT DAPI AclFreeSid( + __in PSID psid + ); +HRESULT DAPI AclFreeDacl( + __in ACL* pACL + ); +HRESULT DAPI AclFreeSecurityDescriptor( + __in SECURITY_DESCRIPTOR* psd + ); + +HRESULT DAPI AclAddAdminToSecurityDescriptor( + __in SECURITY_DESCRIPTOR* pSecurity, + __deref_out SECURITY_DESCRIPTOR** ppSecurityNew + ); +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/apuputil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/apuputil.h index fc8ea3f55b..0bc870f362 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/apuputil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/apuputil.h @@ -1,97 +1,97 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for Application Update helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseApupChain(p) if (p) { ApupFreeChain(p); p = NULL; } -#define ReleaseNullApupChain(p) if (p) { ApupFreeChain(p); p = NULL; } - - -const LPCWSTR APPLICATION_SYNDICATION_NAMESPACE = L"http://appsyndication.org/2006/appsyn"; - -enum APUP_HASH_ALGORITHM -{ - APUP_HASH_ALGORITHM_UNKNOWN, - APUP_HASH_ALGORITHM_MD5, - APUP_HASH_ALGORITHM_SHA1, - APUP_HASH_ALGORITHM_SHA256, -}; - - -struct APPLICATION_UPDATE_ENCLOSURE -{ - LPWSTR wzUrl; - LPWSTR wzLocalName; - DWORD64 dw64Size; - - BYTE* rgbDigest; - DWORD cbDigest; - APUP_HASH_ALGORITHM digestAlgorithm; - - BOOL fInstaller; -}; - - -struct APPLICATION_UPDATE_ENTRY -{ - LPWSTR wzApplicationId; - LPWSTR wzApplicationType; - - DWORD64 dw64Version; - LPWSTR wzUpgradeId; - DWORD64 dw64UpgradeVersion; - BOOL fUpgradeExclusive; - - DWORD64 dw64TotalSize; - - DWORD cEnclosures; - APPLICATION_UPDATE_ENCLOSURE* rgEnclosures; -}; - - -struct APPLICATION_UPDATE_CHAIN -{ - LPWSTR wzDefaultApplicationId; - LPWSTR wzDefaultApplicationType; - - DWORD cEntries; - APPLICATION_UPDATE_ENTRY* rgEntries; -}; - - -HRESULT DAPI ApupAllocChainFromAtom( - __in ATOM_FEED* pFeed, - __out APPLICATION_UPDATE_CHAIN** ppChain - ); - -HRESULT DAPI ApupFilterChain( - __in APPLICATION_UPDATE_CHAIN* pChain, - __in DWORD64 dw64Version, - __out APPLICATION_UPDATE_CHAIN** ppFilteredChain - ); - -void DAPI ApupFreeChain( - __in APPLICATION_UPDATE_CHAIN* pChain - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for Application Update helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseApupChain(p) if (p) { ApupFreeChain(p); p = NULL; } +#define ReleaseNullApupChain(p) if (p) { ApupFreeChain(p); p = NULL; } + + +const LPCWSTR APPLICATION_SYNDICATION_NAMESPACE = L"http://appsyndication.org/2006/appsyn"; + +enum APUP_HASH_ALGORITHM +{ + APUP_HASH_ALGORITHM_UNKNOWN, + APUP_HASH_ALGORITHM_MD5, + APUP_HASH_ALGORITHM_SHA1, + APUP_HASH_ALGORITHM_SHA256, +}; + + +struct APPLICATION_UPDATE_ENCLOSURE +{ + LPWSTR wzUrl; + LPWSTR wzLocalName; + DWORD64 dw64Size; + + BYTE* rgbDigest; + DWORD cbDigest; + APUP_HASH_ALGORITHM digestAlgorithm; + + BOOL fInstaller; +}; + + +struct APPLICATION_UPDATE_ENTRY +{ + LPWSTR wzApplicationId; + LPWSTR wzApplicationType; + + DWORD64 dw64Version; + LPWSTR wzUpgradeId; + DWORD64 dw64UpgradeVersion; + BOOL fUpgradeExclusive; + + DWORD64 dw64TotalSize; + + DWORD cEnclosures; + APPLICATION_UPDATE_ENCLOSURE* rgEnclosures; +}; + + +struct APPLICATION_UPDATE_CHAIN +{ + LPWSTR wzDefaultApplicationId; + LPWSTR wzDefaultApplicationType; + + DWORD cEntries; + APPLICATION_UPDATE_ENTRY* rgEntries; +}; + + +HRESULT DAPI ApupAllocChainFromAtom( + __in ATOM_FEED* pFeed, + __out APPLICATION_UPDATE_CHAIN** ppChain + ); + +HRESULT DAPI ApupFilterChain( + __in APPLICATION_UPDATE_CHAIN* pChain, + __in DWORD64 dw64Version, + __out APPLICATION_UPDATE_CHAIN** ppFilteredChain + ); + +void DAPI ApupFreeChain( + __in APPLICATION_UPDATE_CHAIN* pChain + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/atomutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/atomutil.h index bc66c0b1ed..e194a8fc31 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/atomutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/atomutil.h @@ -1,163 +1,163 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// ATOM helper funtions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseAtomFeed(p) if (p) { AtomFreeFeed(p); } -#define ReleaseNullAtomFeed(p) if (p) { AtomFreeFeed(p); p = NULL; } - - -struct ATOM_UNKNOWN_ATTRIBUTE -{ - LPWSTR wzNamespace; - LPWSTR wzAttribute; - LPWSTR wzValue; - - ATOM_UNKNOWN_ATTRIBUTE* pNext; -}; - -struct ATOM_UNKNOWN_ELEMENT -{ - LPWSTR wzNamespace; - LPWSTR wzElement; - LPWSTR wzValue; - - ATOM_UNKNOWN_ATTRIBUTE* pAttributes; - ATOM_UNKNOWN_ELEMENT* pNext; -}; - -struct ATOM_LINK -{ - LPWSTR wzRel; - LPWSTR wzTitle; - LPWSTR wzType; - LPWSTR wzUrl; - LPWSTR wzValue; - DWORD64 dw64Length; - - ATOM_UNKNOWN_ATTRIBUTE* pUnknownAttributes; - ATOM_UNKNOWN_ELEMENT* pUnknownElements; -}; - -struct ATOM_CONTENT -{ - LPWSTR wzType; - LPWSTR wzUrl; - LPWSTR wzValue; - - ATOM_UNKNOWN_ELEMENT* pUnknownElements; -}; - -struct ATOM_AUTHOR -{ - LPWSTR wzName; - LPWSTR wzEmail; - LPWSTR wzUrl; -}; - -struct ATOM_CATEGORY -{ - LPWSTR wzLabel; - LPWSTR wzScheme; - LPWSTR wzTerm; - - ATOM_UNKNOWN_ELEMENT* pUnknownElements; -}; - -struct ATOM_ENTRY -{ - LPWSTR wzId; - LPWSTR wzSummary; - LPWSTR wzTitle; - FILETIME ftPublished; - FILETIME ftUpdated; - - ATOM_CONTENT* pContent; - - DWORD cAuthors; - ATOM_AUTHOR* rgAuthors; - - DWORD cCategories; - ATOM_CATEGORY* rgCategories; - - DWORD cLinks; - ATOM_LINK* rgLinks; - - IXMLDOMNode* pixn; - ATOM_UNKNOWN_ELEMENT* pUnknownElements; -}; - -struct ATOM_FEED -{ - LPWSTR wzGenerator; - LPWSTR wzIcon; - LPWSTR wzId; - LPWSTR wzLogo; - LPWSTR wzSubtitle; - LPWSTR wzTitle; - FILETIME ftUpdated; - - DWORD cAuthors; - ATOM_AUTHOR* rgAuthors; - - DWORD cCategories; - ATOM_CATEGORY* rgCategories; - - DWORD cEntries; - ATOM_ENTRY* rgEntries; - - DWORD cLinks; - ATOM_LINK* rgLinks; - - IXMLDOMNode* pixn; - ATOM_UNKNOWN_ELEMENT* pUnknownElements; -}; - -HRESULT DAPI AtomInitialize( - ); - -void DAPI AtomUninitialize( - ); - -HRESULT DAPI AtomParseFromString( - __in_z LPCWSTR wzAtomString, - __out ATOM_FEED **ppFeed - ); - -HRESULT DAPI AtomParseFromFile( - __in_z LPCWSTR wzAtomFile, - __out ATOM_FEED **ppFeed - ); - -HRESULT DAPI AtomParseFromDocument( - __in IXMLDOMDocument* pixdDocument, - __out ATOM_FEED **ppFeed - ); - -void DAPI AtomFreeFeed( - __in_xcount(pFeed->cItems) ATOM_FEED *pFEED - ); - -#ifdef __cplusplus -} -#endif +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// ATOM helper funtions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseAtomFeed(p) if (p) { AtomFreeFeed(p); } +#define ReleaseNullAtomFeed(p) if (p) { AtomFreeFeed(p); p = NULL; } + + +struct ATOM_UNKNOWN_ATTRIBUTE +{ + LPWSTR wzNamespace; + LPWSTR wzAttribute; + LPWSTR wzValue; + + ATOM_UNKNOWN_ATTRIBUTE* pNext; +}; + +struct ATOM_UNKNOWN_ELEMENT +{ + LPWSTR wzNamespace; + LPWSTR wzElement; + LPWSTR wzValue; + + ATOM_UNKNOWN_ATTRIBUTE* pAttributes; + ATOM_UNKNOWN_ELEMENT* pNext; +}; + +struct ATOM_LINK +{ + LPWSTR wzRel; + LPWSTR wzTitle; + LPWSTR wzType; + LPWSTR wzUrl; + LPWSTR wzValue; + DWORD64 dw64Length; + + ATOM_UNKNOWN_ATTRIBUTE* pUnknownAttributes; + ATOM_UNKNOWN_ELEMENT* pUnknownElements; +}; + +struct ATOM_CONTENT +{ + LPWSTR wzType; + LPWSTR wzUrl; + LPWSTR wzValue; + + ATOM_UNKNOWN_ELEMENT* pUnknownElements; +}; + +struct ATOM_AUTHOR +{ + LPWSTR wzName; + LPWSTR wzEmail; + LPWSTR wzUrl; +}; + +struct ATOM_CATEGORY +{ + LPWSTR wzLabel; + LPWSTR wzScheme; + LPWSTR wzTerm; + + ATOM_UNKNOWN_ELEMENT* pUnknownElements; +}; + +struct ATOM_ENTRY +{ + LPWSTR wzId; + LPWSTR wzSummary; + LPWSTR wzTitle; + FILETIME ftPublished; + FILETIME ftUpdated; + + ATOM_CONTENT* pContent; + + DWORD cAuthors; + ATOM_AUTHOR* rgAuthors; + + DWORD cCategories; + ATOM_CATEGORY* rgCategories; + + DWORD cLinks; + ATOM_LINK* rgLinks; + + IXMLDOMNode* pixn; + ATOM_UNKNOWN_ELEMENT* pUnknownElements; +}; + +struct ATOM_FEED +{ + LPWSTR wzGenerator; + LPWSTR wzIcon; + LPWSTR wzId; + LPWSTR wzLogo; + LPWSTR wzSubtitle; + LPWSTR wzTitle; + FILETIME ftUpdated; + + DWORD cAuthors; + ATOM_AUTHOR* rgAuthors; + + DWORD cCategories; + ATOM_CATEGORY* rgCategories; + + DWORD cEntries; + ATOM_ENTRY* rgEntries; + + DWORD cLinks; + ATOM_LINK* rgLinks; + + IXMLDOMNode* pixn; + ATOM_UNKNOWN_ELEMENT* pUnknownElements; +}; + +HRESULT DAPI AtomInitialize( + ); + +void DAPI AtomUninitialize( + ); + +HRESULT DAPI AtomParseFromString( + __in_z LPCWSTR wzAtomString, + __out ATOM_FEED **ppFeed + ); + +HRESULT DAPI AtomParseFromFile( + __in_z LPCWSTR wzAtomFile, + __out ATOM_FEED **ppFeed + ); + +HRESULT DAPI AtomParseFromDocument( + __in IXMLDOMDocument* pixdDocument, + __out ATOM_FEED **ppFeed + ); + +void DAPI AtomFreeFeed( + __in_xcount(pFeed->cItems) ATOM_FEED *pFEED + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/buffutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/buffutil.h index 5d72849601..a6d910923b 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/buffutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/buffutil.h @@ -1,86 +1,86 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Binary serialization helper functions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - - -// macro definitions - -#define ReleaseBuffer ReleaseMem -#define ReleaseNullBuffer ReleaseNullMem -#define BuffFree MemFree - - -// function declarations - -HRESULT BuffReadNumber( - __in_bcount(cbBuffer) const BYTE* pbBuffer, - __in SIZE_T cbBuffer, - __inout SIZE_T* piBuffer, - __out DWORD* pdw - ); -HRESULT BuffReadNumber64( - __in_bcount(cbBuffer) const BYTE* pbBuffer, - __in SIZE_T cbBuffer, - __inout SIZE_T* piBuffer, - __out DWORD64* pdw64 - ); -HRESULT BuffReadString( - __in_bcount(cbBuffer) const BYTE* pbBuffer, - __in SIZE_T cbBuffer, - __inout SIZE_T* piBuffer, - __deref_out_z LPWSTR* pscz - ); -HRESULT BuffReadStream( - __in_bcount(cbBuffer) const BYTE* pbBuffer, - __in SIZE_T cbBuffer, - __inout SIZE_T* piBuffer, - __deref_out_bcount(*pcbStream) BYTE** ppbStream, - __out SIZE_T* pcbStream - ); - -HRESULT BuffWriteNumber( - __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, - __inout SIZE_T* piBuffer, - __in DWORD dw - ); -HRESULT BuffWriteNumber64( - __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, - __inout SIZE_T* piBuffer, - __in DWORD64 dw64 - ); -HRESULT BuffWriteString( - __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, - __inout SIZE_T* piBuffer, - __in_z LPCWSTR scz - ); -HRESULT BuffWriteStream( - __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, - __inout SIZE_T* piBuffer, - __in_bcount(cbStream) const BYTE* pbStream, - __in SIZE_T cbStream - ); - -#ifdef __cplusplus -} -#endif +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Binary serialization helper functions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + + +// macro definitions + +#define ReleaseBuffer ReleaseMem +#define ReleaseNullBuffer ReleaseNullMem +#define BuffFree MemFree + + +// function declarations + +HRESULT BuffReadNumber( + __in_bcount(cbBuffer) const BYTE* pbBuffer, + __in SIZE_T cbBuffer, + __inout SIZE_T* piBuffer, + __out DWORD* pdw + ); +HRESULT BuffReadNumber64( + __in_bcount(cbBuffer) const BYTE* pbBuffer, + __in SIZE_T cbBuffer, + __inout SIZE_T* piBuffer, + __out DWORD64* pdw64 + ); +HRESULT BuffReadString( + __in_bcount(cbBuffer) const BYTE* pbBuffer, + __in SIZE_T cbBuffer, + __inout SIZE_T* piBuffer, + __deref_out_z LPWSTR* pscz + ); +HRESULT BuffReadStream( + __in_bcount(cbBuffer) const BYTE* pbBuffer, + __in SIZE_T cbBuffer, + __inout SIZE_T* piBuffer, + __deref_out_bcount(*pcbStream) BYTE** ppbStream, + __out SIZE_T* pcbStream + ); + +HRESULT BuffWriteNumber( + __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, + __inout SIZE_T* piBuffer, + __in DWORD dw + ); +HRESULT BuffWriteNumber64( + __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, + __inout SIZE_T* piBuffer, + __in DWORD64 dw64 + ); +HRESULT BuffWriteString( + __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, + __inout SIZE_T* piBuffer, + __in_z LPCWSTR scz + ); +HRESULT BuffWriteStream( + __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, + __inout SIZE_T* piBuffer, + __in_bcount(cbStream) const BYTE* pbStream, + __in SIZE_T cbStream + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/cabcutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/cabcutil.h index 789e49c9e8..e6a9d74348 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/cabcutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/cabcutil.h @@ -1,68 +1,68 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for cabinet creation helper functions. -// -//------------------------------------------------------------------------------------------------- - -#include -#include -#include - -#define CAB_MAX_SIZE 0x7FFFFFFF // (see KB: Q174866) - -#ifdef __cplusplus -extern "C" { -#endif - -// time vs. space trade-off -enum COMPRESSION_TYPE -{ - COMPRESSION_TYPE_NONE, // fastest - COMPRESSION_TYPE_LOW, - COMPRESSION_TYPE_MEDIUM, - COMPRESSION_TYPE_HIGH, // smallest - COMPRESSION_TYPE_MSZIP -}; - -// functions -HRESULT DAPI CabCBegin( - __in_z LPCWSTR wzCab, - __in_z LPCWSTR wzCabDir, - __in DWORD dwMaxFiles, - __in DWORD dwMaxSize, - __in DWORD dwMaxThresh, - __in COMPRESSION_TYPE ct, - __out HANDLE *phContext - ); -HRESULT DAPI CabCNextCab( - __in HANDLE hContext - ); -HRESULT DAPI CabCAddFile( - __in_z LPCWSTR wzFile, - __in_z_opt LPCWSTR wzToken, - __in_opt PMSIFILEHASHINFO pmfHash, - __in HANDLE hContext - ); -HRESULT DAPI CabCFinish( - __in HANDLE hContext - ); -void DAPI CabCCancel( - __in HANDLE hContext - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for cabinet creation helper functions. +// +//------------------------------------------------------------------------------------------------- + +#include +#include +#include + +#define CAB_MAX_SIZE 0x7FFFFFFF // (see KB: Q174866) + +#ifdef __cplusplus +extern "C" { +#endif + +// time vs. space trade-off +enum COMPRESSION_TYPE +{ + COMPRESSION_TYPE_NONE, // fastest + COMPRESSION_TYPE_LOW, + COMPRESSION_TYPE_MEDIUM, + COMPRESSION_TYPE_HIGH, // smallest + COMPRESSION_TYPE_MSZIP +}; + +// functions +HRESULT DAPI CabCBegin( + __in_z LPCWSTR wzCab, + __in_z LPCWSTR wzCabDir, + __in DWORD dwMaxFiles, + __in DWORD dwMaxSize, + __in DWORD dwMaxThresh, + __in COMPRESSION_TYPE ct, + __out HANDLE *phContext + ); +HRESULT DAPI CabCNextCab( + __in HANDLE hContext + ); +HRESULT DAPI CabCAddFile( + __in_z LPCWSTR wzFile, + __in_z_opt LPCWSTR wzToken, + __in_opt PMSIFILEHASHINFO pmfHash, + __in HANDLE hContext + ); +HRESULT DAPI CabCFinish( + __in HANDLE hContext + ); +void DAPI CabCCancel( + __in HANDLE hContext + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/cabutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/cabutil.h index 6e9cd501f9..0ae23d507c 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/cabutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/cabutil.h @@ -1,71 +1,71 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for cabinet decompression helper functions -// -//------------------------------------------------------------------------------------------------- - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// structs - - -// callback function prototypes -typedef HRESULT (*CAB_CALLBACK_OPEN_FILE)(LPCWSTR wzFile, INT_PTR* ppFile); -typedef HRESULT (*CAB_CALLBACK_READ_FILE)(INT_PTR pFile, LPVOID pvData, DWORD cbData, DWORD* pcbRead); -typedef HRESULT (*CAB_CALLBACK_WRITE_FILE)(INT_PTR pFile, LPVOID pvData, DWORD cbData, DWORD* pcbRead); -typedef LONG (*CAB_CALLBACK_SEEK_FILE)(INT_PTR pFile, DWORD dwMove, DWORD dwMoveMethod); -typedef HRESULT (*CAB_CALLBACK_CLOSE_FILE)(INT_PTR pFile); - -typedef HRESULT (*CAB_CALLBACK_BEGIN_FILE)(LPCWSTR wzFileId, FILETIME* pftFileTime, DWORD cbFileSize, LPVOID pvContext, INT_PTR* ppFile); -typedef HRESULT (*CAB_CALLBACK_END_FILE)(LPCWSTR wzFileId, LPVOID pvContext, INT_PTR pFile); -typedef HRESULT (*CAB_CALLBACK_PROGRESS)(BOOL fBeginFile, LPCWSTR wzFileId, LPVOID pvContext); - -// function type with calling convention of __stdcall that .NET 1.1 understands only -// .NET 2.0 will not need this -typedef INT_PTR (FAR __stdcall *STDCALL_PFNFDINOTIFY)(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin); - - -// functions -HRESULT DAPI CabInitialize( - __in BOOL fDelayLoad - ); -void DAPI CabUninitialize( - ); - -HRESULT DAPI CabExtract( - __in_z LPCWSTR wzCabinet, - __in_z LPCWSTR wzExtractFile, - __in_z LPCWSTR wzExtractDir, - __in_opt CAB_CALLBACK_PROGRESS pfnProgress, - __in_opt LPVOID pvContext, - __in DWORD64 dw64EmbeddedOffset - ); - -HRESULT DAPI CabEnumerate( - __in_z LPCWSTR wzCabinet, - __in_z LPCWSTR wzEnumerateFile, - __in STDCALL_PFNFDINOTIFY pfnNotify, - __in DWORD64 dw64EmbeddedOffset - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for cabinet decompression helper functions +// +//------------------------------------------------------------------------------------------------- + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// structs + + +// callback function prototypes +typedef HRESULT (*CAB_CALLBACK_OPEN_FILE)(LPCWSTR wzFile, INT_PTR* ppFile); +typedef HRESULT (*CAB_CALLBACK_READ_FILE)(INT_PTR pFile, LPVOID pvData, DWORD cbData, DWORD* pcbRead); +typedef HRESULT (*CAB_CALLBACK_WRITE_FILE)(INT_PTR pFile, LPVOID pvData, DWORD cbData, DWORD* pcbRead); +typedef LONG (*CAB_CALLBACK_SEEK_FILE)(INT_PTR pFile, DWORD dwMove, DWORD dwMoveMethod); +typedef HRESULT (*CAB_CALLBACK_CLOSE_FILE)(INT_PTR pFile); + +typedef HRESULT (*CAB_CALLBACK_BEGIN_FILE)(LPCWSTR wzFileId, FILETIME* pftFileTime, DWORD cbFileSize, LPVOID pvContext, INT_PTR* ppFile); +typedef HRESULT (*CAB_CALLBACK_END_FILE)(LPCWSTR wzFileId, LPVOID pvContext, INT_PTR pFile); +typedef HRESULT (*CAB_CALLBACK_PROGRESS)(BOOL fBeginFile, LPCWSTR wzFileId, LPVOID pvContext); + +// function type with calling convention of __stdcall that .NET 1.1 understands only +// .NET 2.0 will not need this +typedef INT_PTR (FAR __stdcall *STDCALL_PFNFDINOTIFY)(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin); + + +// functions +HRESULT DAPI CabInitialize( + __in BOOL fDelayLoad + ); +void DAPI CabUninitialize( + ); + +HRESULT DAPI CabExtract( + __in_z LPCWSTR wzCabinet, + __in_z LPCWSTR wzExtractFile, + __in_z LPCWSTR wzExtractDir, + __in_opt CAB_CALLBACK_PROGRESS pfnProgress, + __in_opt LPVOID pvContext, + __in DWORD64 dw64EmbeddedOffset + ); + +HRESULT DAPI CabEnumerate( + __in_z LPCWSTR wzCabinet, + __in_z LPCWSTR wzEnumerateFile, + __in STDCALL_PFNFDINOTIFY pfnNotify, + __in DWORD64 dw64EmbeddedOffset + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/certutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/certutil.h index c77ea84983..dc0717934a 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/certutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/certutil.h @@ -1,71 +1,71 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Certificate helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI CertReadProperty( - __in PCCERT_CONTEXT pCertContext, - __in DWORD dwProperty, - __deref_out_bound LPVOID pvValue - ); - -HRESULT DAPI GetCryptProvFromCert( - __in_opt HWND hwnd, - __in PCCERT_CONTEXT pCert, - __out HCRYPTPROV *phCryptProv, - __out DWORD *pdwKeySpec, - __in BOOL *pfDidCryptAcquire, - __deref_opt_out LPWSTR *ppwszTmpContainer, - __deref_opt_out LPWSTR *ppwszProviderName, - __out DWORD *pdwProviderType - ); - -HRESULT DAPI FreeCryptProvFromCert( - __in BOOL fAcquired, - __in HCRYPTPROV hProv, - __in_opt LPWSTR pwszCapiProvider, - __in DWORD dwProviderType, - __in_opt LPWSTR pwszTmpContainer - ); - -HRESULT DAPI GetProvSecurityDesc( - __in HCRYPTPROV hProv, - __deref_out SECURITY_DESCRIPTOR** pSecurity - ); - -HRESULT DAPI SetProvSecurityDesc( - __in HCRYPTPROV hProv, - __in SECURITY_DESCRIPTOR* pSecurity - ); - -BOOL DAPI CertHasPrivateKey( - __in PCCERT_CONTEXT pCertContext, - __out_opt DWORD* pdwKeySpec - ); - -HRESULT DAPI CertInstallSingleCertificate( - __in HCERTSTORE hStore, - __in PCCERT_CONTEXT pCertContext, - __in LPCWSTR wzName - ); -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Certificate helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI CertReadProperty( + __in PCCERT_CONTEXT pCertContext, + __in DWORD dwProperty, + __deref_out_bound LPVOID pvValue + ); + +HRESULT DAPI GetCryptProvFromCert( + __in_opt HWND hwnd, + __in PCCERT_CONTEXT pCert, + __out HCRYPTPROV *phCryptProv, + __out DWORD *pdwKeySpec, + __in BOOL *pfDidCryptAcquire, + __deref_opt_out LPWSTR *ppwszTmpContainer, + __deref_opt_out LPWSTR *ppwszProviderName, + __out DWORD *pdwProviderType + ); + +HRESULT DAPI FreeCryptProvFromCert( + __in BOOL fAcquired, + __in HCRYPTPROV hProv, + __in_opt LPWSTR pwszCapiProvider, + __in DWORD dwProviderType, + __in_opt LPWSTR pwszTmpContainer + ); + +HRESULT DAPI GetProvSecurityDesc( + __in HCRYPTPROV hProv, + __deref_out SECURITY_DESCRIPTOR** pSecurity + ); + +HRESULT DAPI SetProvSecurityDesc( + __in HCRYPTPROV hProv, + __in SECURITY_DESCRIPTOR* pSecurity + ); + +BOOL DAPI CertHasPrivateKey( + __in PCCERT_CONTEXT pCertContext, + __out_opt DWORD* pdwKeySpec + ); + +HRESULT DAPI CertInstallSingleCertificate( + __in HCERTSTORE hStore, + __in PCCERT_CONTEXT pCertContext, + __in LPCWSTR wzName + ); +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/conutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/conutil.h index 497cf4fe9a..791a545e07 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/conutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/conutil.h @@ -1,115 +1,115 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Console helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define ConsoleExitOnFailure(x, c, f) if (FAILED(x)) { ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; } -#define ConsoleExitOnFailure1(x, c, f, s) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; } -#define ConsoleExitOnFailure2(x, c, f, s, t) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; } -#define ConsoleExitOnFailure3(x, c, f, s, t, u) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; } - -#define ConsoleExitOnLastError(x, c, f) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; } } -#define ConsoleExitOnLastError1(x, c, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; } } -#define ConsoleExitOnLastError2(x, c, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; } } -#define ConsoleExitOnLastError3(x, c, f, s, t, u) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; } } - -#define ConsoleExitOnNull(p, x, e, c, f) if (NULL == p) { x = e; ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; } -#define ConsoleExitOnNull1(p, x, e, c, f, s) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; } -#define ConsoleExitOnNull2(p, x, e, c, f, s, t) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; } -#define ConsoleExitOnNull3(p, x, e, c, f, s, t, u) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, t, u); ExitTrace2(x, f, s, t, u); goto LExit; } - - -// the following macros need to go away -#define ConsoleTrace(l, f) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f); Trace(l, f); } -#define ConsoleTrace1(l, f, s) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s); Trace1(l, f, s); } -#define ConsoleTrace2(l, f, s, t) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s, t); Trace2(l, f, s, t); } -#define ConsoleTrace3(l, f, s, t, u) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s, t, u); Trace3(l, f, s, t, u); } - -#define ConsoleWarning(f) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f); Trace(REPORT_STANDARD, f); } -#define ConsoleWarning1(f, s) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s); Trace1(REPORT_STANDARD, f, s); } -#define ConsoleWarning2(f, s, t) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s, t); Trace2(REPORT_STANDARD, f, s, t); } -#define ConsoleWarning3(f, s, t, u) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s, t, u); Trace3(REPORT_STANDARD, f, s, t, u); } - -#define ConsoleError(x, f) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f); TraceError(x, f); } -#define ConsoleError1(x, f, s) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s); TraceError1(x, f, s); } -#define ConsoleError2(x, f, s, t) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s, t); TraceError2(x, f, s, t); } -#define ConsoleError3(x, f, s, t, u) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s, t, u); TraceError3(x, f, s, t, u); } - - -// enums -enum CONSOLE_COLOR { CONSOLE_COLOR_NORMAL, CONSOLE_COLOR_RED, CONSOLE_COLOR_YELLOW, CONSOLE_COLOR_GREEN }; - -// structs - -// functions -HRESULT DAPI ConsoleInitialize(); -void DAPI ConsoleUninitialize(); - -void DAPI ConsoleGreen(); -void DAPI ConsoleRed(); -void DAPI ConsoleYellow(); -void DAPI ConsoleNormal(); - -HRESULT DAPI ConsoleWrite( - CONSOLE_COLOR cc, - __in_z __format_string LPCSTR szFormat, - ... - ); -HRESULT DAPI ConsoleWriteLine( - CONSOLE_COLOR cc, - __in_z __format_string LPCSTR szFormat, - ... - ); -HRESULT DAPI ConsoleWriteError( - HRESULT hrError, - CONSOLE_COLOR cc, - __in_z __format_string LPCSTR szFormat, - ... - ); - -HRESULT DAPI ConsoleReadW( - __deref_out_z LPWSTR* ppwzBuffer - ); - -HRESULT DAPI ConsoleReadStringA( - __deref_out_ecount_part(cchCharBuffer,*pcchNumCharReturn) LPSTR* szCharBuffer, - CONST DWORD cchCharBuffer, - __out DWORD* pcchNumCharReturn - ); -HRESULT DAPI ConsoleReadStringW( - __deref_out_ecount_part(cchCharBuffer,*pcchNumCharReturn) LPWSTR* szCharBuffer, - CONST DWORD cchCharBuffer, - __out DWORD* pcchNumCharReturn - ); - -HRESULT DAPI ConsoleReadNonBlockingW( - __deref_out_ecount_opt(*pcchSize) LPWSTR* ppwzBuffer, - __out DWORD* pcchSize, - BOOL fReadLine - ); - -HRESULT ConsoleSetReadHidden(void); -HRESULT ConsoleSetReadNormal(void); - -#ifdef __cplusplus -} -#endif - +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Console helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define ConsoleExitOnFailure(x, c, f) if (FAILED(x)) { ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; } +#define ConsoleExitOnFailure1(x, c, f, s) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; } +#define ConsoleExitOnFailure2(x, c, f, s, t) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; } +#define ConsoleExitOnFailure3(x, c, f, s, t, u) if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; } + +#define ConsoleExitOnLastError(x, c, f) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; } } +#define ConsoleExitOnLastError1(x, c, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; } } +#define ConsoleExitOnLastError2(x, c, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; } } +#define ConsoleExitOnLastError3(x, c, f, s, t, u) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ConsoleWriteError(x, c, f, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; } } + +#define ConsoleExitOnNull(p, x, e, c, f) if (NULL == p) { x = e; ConsoleWriteError(x, c, f); ExitTrace(x, f); goto LExit; } +#define ConsoleExitOnNull1(p, x, e, c, f, s) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, NULL); ExitTrace1(x, f, s); goto LExit; } +#define ConsoleExitOnNull2(p, x, e, c, f, s, t) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, t); ExitTrace2(x, f, s, t); goto LExit; } +#define ConsoleExitOnNull3(p, x, e, c, f, s, t, u) if (NULL == p) { x = e; ConsoleWriteError(x, c, f, s, t, u); ExitTrace2(x, f, s, t, u); goto LExit; } + + +// the following macros need to go away +#define ConsoleTrace(l, f) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f); Trace(l, f); } +#define ConsoleTrace1(l, f, s) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s); Trace1(l, f, s); } +#define ConsoleTrace2(l, f, s, t) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s, t); Trace2(l, f, s, t); } +#define ConsoleTrace3(l, f, s, t, u) { ConsoleWriteLine(CONSOLE_COLOR_NORMAL, f, s, t, u); Trace3(l, f, s, t, u); } + +#define ConsoleWarning(f) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f); Trace(REPORT_STANDARD, f); } +#define ConsoleWarning1(f, s) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s); Trace1(REPORT_STANDARD, f, s); } +#define ConsoleWarning2(f, s, t) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s, t); Trace2(REPORT_STANDARD, f, s, t); } +#define ConsoleWarning3(f, s, t, u) { ConsoleWriteLine(CONSOLE_COLOR_YELLOW, f, s, t, u); Trace3(REPORT_STANDARD, f, s, t, u); } + +#define ConsoleError(x, f) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f); TraceError(x, f); } +#define ConsoleError1(x, f, s) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s); TraceError1(x, f, s); } +#define ConsoleError2(x, f, s, t) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s, t); TraceError2(x, f, s, t); } +#define ConsoleError3(x, f, s, t, u) { ConsoleWriteError(x, CONSOLE_COLOR_RED, f, s, t, u); TraceError3(x, f, s, t, u); } + + +// enums +enum CONSOLE_COLOR { CONSOLE_COLOR_NORMAL, CONSOLE_COLOR_RED, CONSOLE_COLOR_YELLOW, CONSOLE_COLOR_GREEN }; + +// structs + +// functions +HRESULT DAPI ConsoleInitialize(); +void DAPI ConsoleUninitialize(); + +void DAPI ConsoleGreen(); +void DAPI ConsoleRed(); +void DAPI ConsoleYellow(); +void DAPI ConsoleNormal(); + +HRESULT DAPI ConsoleWrite( + CONSOLE_COLOR cc, + __in_z __format_string LPCSTR szFormat, + ... + ); +HRESULT DAPI ConsoleWriteLine( + CONSOLE_COLOR cc, + __in_z __format_string LPCSTR szFormat, + ... + ); +HRESULT DAPI ConsoleWriteError( + HRESULT hrError, + CONSOLE_COLOR cc, + __in_z __format_string LPCSTR szFormat, + ... + ); + +HRESULT DAPI ConsoleReadW( + __deref_out_z LPWSTR* ppwzBuffer + ); + +HRESULT DAPI ConsoleReadStringA( + __deref_out_ecount_part(cchCharBuffer,*pcchNumCharReturn) LPSTR* szCharBuffer, + CONST DWORD cchCharBuffer, + __out DWORD* pcchNumCharReturn + ); +HRESULT DAPI ConsoleReadStringW( + __deref_out_ecount_part(cchCharBuffer,*pcchNumCharReturn) LPWSTR* szCharBuffer, + CONST DWORD cchCharBuffer, + __out DWORD* pcchNumCharReturn + ); + +HRESULT DAPI ConsoleReadNonBlockingW( + __deref_out_ecount_opt(*pcchSize) LPWSTR* ppwzBuffer, + __out DWORD* pcchSize, + BOOL fReadLine + ); + +HRESULT ConsoleSetReadHidden(void); +HRESULT ConsoleSetReadNormal(void); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/cryputil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/cryputil.h index f233f0983e..2009269964 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/cryputil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/cryputil.h @@ -1,49 +1,49 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Cryptography helper functions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - - -// function declarations - -HRESULT CrypHashFile( - __in_z LPCWSTR wzFilePath, - __in DWORD dwProvType, - __in ALG_ID algid, - __out_bcount(cbHash) BYTE* pbHash, - __in DWORD cbHash, - __out_opt DWORD64* pqwBytesHashed - ); - -HRESULT CrypHashFileHandle( - __in HANDLE hFile, - __in DWORD dwProvType, - __in ALG_ID algid, - __out_bcount(cbHash) BYTE* pbHash, - __in DWORD cbHash, - __out_opt DWORD64* pqwBytesHashed - ); - -#ifdef __cplusplus -} -#endif +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Cryptography helper functions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + + +// function declarations + +HRESULT CrypHashFile( + __in_z LPCWSTR wzFilePath, + __in DWORD dwProvType, + __in ALG_ID algid, + __out_bcount(cbHash) BYTE* pbHash, + __in DWORD cbHash, + __out_opt DWORD64* pqwBytesHashed + ); + +HRESULT CrypHashFileHandle( + __in HANDLE hFile, + __in DWORD dwProvType, + __in ALG_ID algid, + __out_bcount(cbHash) BYTE* pbHash, + __in DWORD cbHash, + __out_opt DWORD64* pqwBytesHashed + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/dictutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/dictutil.h index 954921f229..ed54bb17ee 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/dictutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/dictutil.h @@ -1,47 +1,47 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for string dict helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void* STRINGDICT_HANDLE; - -HRESULT DAPI DictCreate( - __out void **ppvHandle, - __in DWORD dwNumExpectedItems, - __in size_t cByteOffset - ); -HRESULT DAPI DictAdd( - __in void *pvHandle, - __in_z LPCWSTR szString, - __in void *pvValue - ); -HRESULT DAPI DictGet( - __in void *pvHandle, - __in_z LPCWSTR szString, - __out void **ppvValue - ); -void DAPI DictDestroy( - __in void *pvHandle - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for string dict helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* STRINGDICT_HANDLE; + +HRESULT DAPI DictCreate( + __out void **ppvHandle, + __in DWORD dwNumExpectedItems, + __in size_t cByteOffset + ); +HRESULT DAPI DictAdd( + __in void *pvHandle, + __in_z LPCWSTR szString, + __in void *pvValue + ); +HRESULT DAPI DictGet( + __in void *pvHandle, + __in_z LPCWSTR szString, + __out void **ppvValue + ); +void DAPI DictDestroy( + __in void *pvHandle + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/dirutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/dirutil.h index 341b23a2f8..4dc8ee7341 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/dirutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/dirutil.h @@ -1,58 +1,58 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Directory helper funtions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -BOOL DAPI DirExists( - __in_z LPCWSTR wzPath, - __out_opt DWORD *pdwAttributes - ); - -HRESULT DAPI DirCreateTempPath( - __in_z LPCWSTR wzPrefix, - __out_ecount_z(cchPath) LPWSTR wzPath, - __in DWORD cchPath - ); - -HRESULT DAPI DirEnsureExists( - __in_z LPCWSTR wzPath, - __in_opt LPSECURITY_ATTRIBUTES psa - ); - -HRESULT DAPI DirEnsureDelete( - __in_z LPCWSTR wzPath, - __in BOOL fDeleteFiles, - __in BOOL fRecurse - ); - -HRESULT DAPI DirGetCurrent( - __deref_out_z LPWSTR* psczCurrentDirectory - ); - -HRESULT DAPI DirSetCurrent( - __in_z LPCWSTR wzDirectory - ); - -#ifdef __cplusplus -} -#endif - +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Directory helper funtions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +BOOL DAPI DirExists( + __in_z LPCWSTR wzPath, + __out_opt DWORD *pdwAttributes + ); + +HRESULT DAPI DirCreateTempPath( + __in_z LPCWSTR wzPrefix, + __out_ecount_z(cchPath) LPWSTR wzPath, + __in DWORD cchPath + ); + +HRESULT DAPI DirEnsureExists( + __in_z LPCWSTR wzPath, + __in_opt LPSECURITY_ATTRIBUTES psa + ); + +HRESULT DAPI DirEnsureDelete( + __in_z LPCWSTR wzPath, + __in BOOL fDeleteFiles, + __in BOOL fRecurse + ); + +HRESULT DAPI DirGetCurrent( + __deref_out_z LPWSTR* psczCurrentDirectory + ); + +HRESULT DAPI DirSetCurrent( + __in_z LPCWSTR wzDirectory + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/dutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/dutil.h index 71073d86bf..cc1b4dbddb 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/dutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/dutil.h @@ -1,212 +1,212 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for utility layer that provides standard support for asserts, exit macros -// -//------------------------------------------------------------------------------------------------- - -#define DAPI __stdcall -#define DAPIV __cdecl // used only for functions taking variable length arguments - -#define DAPI_(type) EXTERN_C type DAPI -#define DAPIV_(type) EXTERN_C type DAPIV - - -// enums -enum REPORT_LEVEL -{ - REPORT_NONE, // turns off report (only valid for XXXSetLevel()) - REPORT_STANDARD, // written if reporting is on - REPORT_VERBOSE, // written only if verbose reporting is on - REPORT_DEBUG, // reporting useful when debugging code - REPORT_ERROR, // always gets reported, but can never be specified -}; - -// asserts and traces -typedef BOOL (DAPI *DUTIL_ASSERTDISPLAYFUNCTION)(__in_z LPCSTR sz); - -extern "C" void DAPI Dutil_SetAssertModule(__in HMODULE hAssertModule); -extern "C" void DAPI Dutil_SetAssertDisplayFunction(__in DUTIL_ASSERTDISPLAYFUNCTION pfn); -extern "C" void DAPI Dutil_Assert(__in_z LPCSTR szFile, __in int iLine); -extern "C" void DAPI Dutil_AssertSz(__in_z LPCSTR szFile, __in int iLine, __in_z LPCSTR szMsg); - -extern "C" void DAPI Dutil_TraceSetLevel(__in REPORT_LEVEL ll, __in BOOL fTraceFilenames); -extern "C" REPORT_LEVEL DAPI Dutil_TraceGetLevel(); -extern "C" void __cdecl Dutil_Trace(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in_z __format_string LPCSTR szMessage, ...); -extern "C" void __cdecl Dutil_TraceError(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in HRESULT hr, __in_z __format_string LPCSTR szMessage, ...); -extern "C" void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT hrError); - -#ifdef DEBUG - -#define AssertSetModule(m) (void)Dutil_SetAssertModule(m) -#define AssertSetDisplayFunction(pfn) (void)Dutil_SetAssertDisplayFunction(pfn) -#define Assert(f) ((f) ? (void)0 : (void)Dutil_Assert(__FILE__, __LINE__)) -#define AssertSz(f, sz) ((f) ? (void)0 : (void)Dutil_AssertSz(__FILE__, __LINE__, sz)) - -#define TraceSetLevel(l, f) (void)Dutil_TraceSetLevel(l, f) -#define TraceGetLevel() (REPORT_LEVEL)Dutil_TraceGetLevel() -#define Trace(l, f) (void)Dutil_Trace(__FILE__, __LINE__, l, f, NULL) -#define Trace1(l, f, s) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s) -#define Trace2(l, f, s, t) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s, t) -#define Trace3(l, f, s, t, u) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s, t, u) - -#define TraceError(x, f) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, NULL) -#define TraceError1(x, f, s) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s) -#define TraceError2(x, f, s, t) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s, t) -#define TraceError3(x, f, s, t, u) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s, t, u) - -#define TraceErrorDebug(x, f) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, NULL) -#define TraceErrorDebug1(x, f, s) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s) -#define TraceErrorDebug2(x, f, s, t) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s, t) -#define TraceErrorDebug3(x, f, s, t, u) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s, t, u) - -#else // !DEBUG - -#define AssertSetModule(m) -#define AssertSetDisplayFunction(pfn) -#define Assert(f) -#define AssertSz(f, sz) - -#define TraceSetLevel(l, f) -#define Trace(l, f) -#define Trace1(l, f, s) -#define Trace2(l, f, s, t) -#define Trace3(l, f, s, t, u) - -#define TraceError(x, f) -#define TraceError1(x, f, s) -#define TraceError2(x, f, s, t) -#define TraceError3(x, f, s, t, u) - -#define TraceErrorDebug(x, f) -#define TraceErrorDebug1(x, f, s) -#define TraceErrorDebug2(x, f, s, t) -#define TraceErrorDebug3(x, f, s, t, u) - -#endif // DEBUG - - -// ExitTrace can be overriden -#ifndef ExitTrace -#define ExitTrace TraceError -#endif -#ifndef ExitTrace1 -#define ExitTrace1 TraceError1 -#endif -#ifndef ExitTrace2 -#define ExitTrace2 TraceError2 -#endif -#ifndef ExitTrace3 -#define ExitTrace3 TraceError3 -#endif - -// Exit macros -#define ExitFunction() { goto LExit; } -#define ExitFunction1(x) { x; goto LExit; } - -#define ExitOnLastError(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } } -#define ExitOnLastError1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } } -#define ExitOnLastError2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } } - -#define ExitOnLastErrorDebugTrace(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s); goto LExit; } } -#define ExitOnLastErrorDebugTrace1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug1(x, f, s); goto LExit; } } -#define ExitOnLastErrorDebugTrace2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug2(x, f, s, t); goto LExit; } } - -#define ExitWithLastError(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } -#define ExitWithLastError1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } -#define ExitWithLastError2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } -#define ExitWithLastError3(x, f, s, t, u) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace3(x, f, s, t, u); goto LExit; } - -#define ExitOnFailure(x, s) if (FAILED(x)) { ExitTrace(x, s); goto LExit; } -#define ExitOnFailure1(x, f, s) if (FAILED(x)) { ExitTrace1(x, f, s); goto LExit; } -#define ExitOnFailure2(x, f, s, t) if (FAILED(x)) { ExitTrace2(x, f, s, t); goto LExit; } -#define ExitOnFailure3(x, f, s, t, u) if (FAILED(x)) { ExitTrace3(x, f, s, t, u); goto LExit; } - -#define ExitOnRootFailure(x, s) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } -#define ExitOnRootFailure1(x, f, s) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } -#define ExitOnRootFailure2(x, f, s, t) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } -#define ExitOnRootFailure3(x, f, s, t, u) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace3(x, f, s, t, u); goto LExit; } - -#define ExitOnFailureDebugTrace(x, s) if (FAILED(x)) { TraceErrorDebug(x, s); goto LExit; } -#define ExitOnFailureDebugTrace1(x, f, s) if (FAILED(x)) { TraceErrorDebug1(x, f, s); goto LExit; } -#define ExitOnFailureDebugTrace2(x, f, s, t) if (FAILED(x)) { TraceErrorDebug2(x, f, s, t); goto LExit; } -#define ExitOnFailureDebugTrace3(x, f, s, t, u) if (FAILED(x)) { TraceErrorDebug3(x, f, s, t, u); goto LExit; } - -#define ExitOnNull(p, x, e, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } -#define ExitOnNull1(p, x, e, f, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } -#define ExitOnNull2(p, x, e, f, s, t) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } - -#define ExitOnNullWithLastError(p, x, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } -#define ExitOnNullWithLastError1(p, x, f, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } - -#define ExitOnNullDebugTrace(p, x, e, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s); goto LExit; } -#define ExitOnNullDebugTrace1(p, x, e, f, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug1(x, f, s); goto LExit; } - -#define ExitOnInvalidHandleWithLastError(p, x, s) if (INVALID_HANDLE_VALUE == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } -#define ExitOnInvalidHandleWithLastError1(p, x, f, s) if (INVALID_HANDLE_VALUE == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } - -#define ExitOnWin32Error(e, x, s) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } -#define ExitOnWin32Error1(e, x, f, s) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } - -// release macros -#define ReleaseObject(x) if (x) { x->Release(); } -#define ReleaseObjectArray(prg, cel) if (prg) { for (DWORD Dutil_ReleaseObjectArrayIndex = 0; Dutil_ReleaseObjectArrayIndex < cel; ++Dutil_ReleaseObjectArrayIndex) { ReleaseObject(prg[Dutil_ReleaseObjectArrayIndex]); } ReleaseMem(prg); } -#define ReleaseVariant(x) { ::VariantClear(&x); } -#define ReleaseNullObject(x) if (x) { (x)->Release(); x = NULL; } -#define ReleaseCertificate(x) if (x) { ::CertFreeCertificateContext(x); x=NULL; } -#define ReleaseHandle(x) if (x) { ::CloseHandle(x); x = NULL; } - - -// useful defines and macros -#define Unused(x) ((void)x) - -#ifndef countof -#if 1 -#define countof(ary) (sizeof(ary) / sizeof(ary[0])) -#else -#ifndef __cplusplus -#define countof(ary) (sizeof(ary) / sizeof(ary[0])) -#else -template static char countofVerify(void const *, T) throw() { return 0; } -template static void countofVerify(T *const, T *const *) throw() {}; -#define countof(arr) (sizeof(countofVerify(arr,&(arr))) * sizeof(arr)/sizeof(*(arr))) -#endif -#endif -#endif - -#define roundup(x, n) roundup_typed(x, n, DWORD) -#define roundup_typed(x, n, t) (((t)(x) + ((t)(n) - 1)) & ~((t)(n) - 1)) - -#define HRESULT_FROM_RPC(x) ((HRESULT) ((x) | FACILITY_RPC)) - -#ifndef MAXSIZE_T -#define MAXSIZE_T ((SIZE_T)~((SIZE_T)0)) -#endif - -typedef const BYTE* LPCBYTE; - -#define E_FILENOTFOUND HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) -#define E_INVALIDSTATE HRESULT_FROM_WIN32(ERROR_INVALID_STATE) -#define E_MOREDATA HRESULT_FROM_WIN32(ERROR_MORE_DATA) -#define E_NOMOREITEMS HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS) -#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND) -#define E_MODNOTFOUND HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND) - -#define AddRefAndRelease(x) { x->AddRef(); x->Release(); } - -#define MAKEQWORDVERSION(mj, mi, b, r) (((DWORD64)MAKELONG(r, b)) | (((DWORD64)MAKELONG(mi, mj)) << 32)) - -// other functions -extern "C" HRESULT DAPI LoadSystemLibrary(__in_z LPCWSTR wzModuleName, __out HMODULE *phModule); +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for utility layer that provides standard support for asserts, exit macros +// +//------------------------------------------------------------------------------------------------- + +#define DAPI __stdcall +#define DAPIV __cdecl // used only for functions taking variable length arguments + +#define DAPI_(type) EXTERN_C type DAPI +#define DAPIV_(type) EXTERN_C type DAPIV + + +// enums +enum REPORT_LEVEL +{ + REPORT_NONE, // turns off report (only valid for XXXSetLevel()) + REPORT_STANDARD, // written if reporting is on + REPORT_VERBOSE, // written only if verbose reporting is on + REPORT_DEBUG, // reporting useful when debugging code + REPORT_ERROR, // always gets reported, but can never be specified +}; + +// asserts and traces +typedef BOOL (DAPI *DUTIL_ASSERTDISPLAYFUNCTION)(__in_z LPCSTR sz); + +extern "C" void DAPI Dutil_SetAssertModule(__in HMODULE hAssertModule); +extern "C" void DAPI Dutil_SetAssertDisplayFunction(__in DUTIL_ASSERTDISPLAYFUNCTION pfn); +extern "C" void DAPI Dutil_Assert(__in_z LPCSTR szFile, __in int iLine); +extern "C" void DAPI Dutil_AssertSz(__in_z LPCSTR szFile, __in int iLine, __in_z LPCSTR szMsg); + +extern "C" void DAPI Dutil_TraceSetLevel(__in REPORT_LEVEL ll, __in BOOL fTraceFilenames); +extern "C" REPORT_LEVEL DAPI Dutil_TraceGetLevel(); +extern "C" void __cdecl Dutil_Trace(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in_z __format_string LPCSTR szMessage, ...); +extern "C" void __cdecl Dutil_TraceError(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in HRESULT hr, __in_z __format_string LPCSTR szMessage, ...); +extern "C" void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT hrError); + +#ifdef DEBUG + +#define AssertSetModule(m) (void)Dutil_SetAssertModule(m) +#define AssertSetDisplayFunction(pfn) (void)Dutil_SetAssertDisplayFunction(pfn) +#define Assert(f) ((f) ? (void)0 : (void)Dutil_Assert(__FILE__, __LINE__)) +#define AssertSz(f, sz) ((f) ? (void)0 : (void)Dutil_AssertSz(__FILE__, __LINE__, sz)) + +#define TraceSetLevel(l, f) (void)Dutil_TraceSetLevel(l, f) +#define TraceGetLevel() (REPORT_LEVEL)Dutil_TraceGetLevel() +#define Trace(l, f) (void)Dutil_Trace(__FILE__, __LINE__, l, f, NULL) +#define Trace1(l, f, s) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s) +#define Trace2(l, f, s, t) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s, t) +#define Trace3(l, f, s, t, u) (void)Dutil_Trace(__FILE__, __LINE__, l, f, s, t, u) + +#define TraceError(x, f) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, NULL) +#define TraceError1(x, f, s) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s) +#define TraceError2(x, f, s, t) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s, t) +#define TraceError3(x, f, s, t, u) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_ERROR, x, f, s, t, u) + +#define TraceErrorDebug(x, f) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, NULL) +#define TraceErrorDebug1(x, f, s) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s) +#define TraceErrorDebug2(x, f, s, t) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s, t) +#define TraceErrorDebug3(x, f, s, t, u) (void)Dutil_TraceError(__FILE__, __LINE__, REPORT_DEBUG, x, f, s, t, u) + +#else // !DEBUG + +#define AssertSetModule(m) +#define AssertSetDisplayFunction(pfn) +#define Assert(f) +#define AssertSz(f, sz) + +#define TraceSetLevel(l, f) +#define Trace(l, f) +#define Trace1(l, f, s) +#define Trace2(l, f, s, t) +#define Trace3(l, f, s, t, u) + +#define TraceError(x, f) +#define TraceError1(x, f, s) +#define TraceError2(x, f, s, t) +#define TraceError3(x, f, s, t, u) + +#define TraceErrorDebug(x, f) +#define TraceErrorDebug1(x, f, s) +#define TraceErrorDebug2(x, f, s, t) +#define TraceErrorDebug3(x, f, s, t, u) + +#endif // DEBUG + + +// ExitTrace can be overriden +#ifndef ExitTrace +#define ExitTrace TraceError +#endif +#ifndef ExitTrace1 +#define ExitTrace1 TraceError1 +#endif +#ifndef ExitTrace2 +#define ExitTrace2 TraceError2 +#endif +#ifndef ExitTrace3 +#define ExitTrace3 TraceError3 +#endif + +// Exit macros +#define ExitFunction() { goto LExit; } +#define ExitFunction1(x) { x; goto LExit; } + +#define ExitOnLastError(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } } +#define ExitOnLastError1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } } +#define ExitOnLastError2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } } + +#define ExitOnLastErrorDebugTrace(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s); goto LExit; } } +#define ExitOnLastErrorDebugTrace1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug1(x, f, s); goto LExit; } } +#define ExitOnLastErrorDebugTrace2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug2(x, f, s, t); goto LExit; } } + +#define ExitWithLastError(x, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } +#define ExitWithLastError1(x, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } +#define ExitWithLastError2(x, f, s, t) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } +#define ExitWithLastError3(x, f, s, t, u) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace3(x, f, s, t, u); goto LExit; } + +#define ExitOnFailure(x, s) if (FAILED(x)) { ExitTrace(x, s); goto LExit; } +#define ExitOnFailure1(x, f, s) if (FAILED(x)) { ExitTrace1(x, f, s); goto LExit; } +#define ExitOnFailure2(x, f, s, t) if (FAILED(x)) { ExitTrace2(x, f, s, t); goto LExit; } +#define ExitOnFailure3(x, f, s, t, u) if (FAILED(x)) { ExitTrace3(x, f, s, t, u); goto LExit; } + +#define ExitOnRootFailure(x, s) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } +#define ExitOnRootFailure1(x, f, s) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } +#define ExitOnRootFailure2(x, f, s, t) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } +#define ExitOnRootFailure3(x, f, s, t, u) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace3(x, f, s, t, u); goto LExit; } + +#define ExitOnFailureDebugTrace(x, s) if (FAILED(x)) { TraceErrorDebug(x, s); goto LExit; } +#define ExitOnFailureDebugTrace1(x, f, s) if (FAILED(x)) { TraceErrorDebug1(x, f, s); goto LExit; } +#define ExitOnFailureDebugTrace2(x, f, s, t) if (FAILED(x)) { TraceErrorDebug2(x, f, s, t); goto LExit; } +#define ExitOnFailureDebugTrace3(x, f, s, t, u) if (FAILED(x)) { TraceErrorDebug3(x, f, s, t, u); goto LExit; } + +#define ExitOnNull(p, x, e, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } +#define ExitOnNull1(p, x, e, f, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } +#define ExitOnNull2(p, x, e, f, s, t) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } + +#define ExitOnNullWithLastError(p, x, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } +#define ExitOnNullWithLastError1(p, x, f, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } + +#define ExitOnNullDebugTrace(p, x, e, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s); goto LExit; } +#define ExitOnNullDebugTrace1(p, x, e, f, s) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug1(x, f, s); goto LExit; } + +#define ExitOnInvalidHandleWithLastError(p, x, s) if (INVALID_HANDLE_VALUE == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } +#define ExitOnInvalidHandleWithLastError1(p, x, f, s) if (INVALID_HANDLE_VALUE == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } + +#define ExitOnWin32Error(e, x, s) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } +#define ExitOnWin32Error1(e, x, f, s) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } + +// release macros +#define ReleaseObject(x) if (x) { x->Release(); } +#define ReleaseObjectArray(prg, cel) if (prg) { for (DWORD Dutil_ReleaseObjectArrayIndex = 0; Dutil_ReleaseObjectArrayIndex < cel; ++Dutil_ReleaseObjectArrayIndex) { ReleaseObject(prg[Dutil_ReleaseObjectArrayIndex]); } ReleaseMem(prg); } +#define ReleaseVariant(x) { ::VariantClear(&x); } +#define ReleaseNullObject(x) if (x) { (x)->Release(); x = NULL; } +#define ReleaseCertificate(x) if (x) { ::CertFreeCertificateContext(x); x=NULL; } +#define ReleaseHandle(x) if (x) { ::CloseHandle(x); x = NULL; } + + +// useful defines and macros +#define Unused(x) ((void)x) + +#ifndef countof +#if 1 +#define countof(ary) (sizeof(ary) / sizeof(ary[0])) +#else +#ifndef __cplusplus +#define countof(ary) (sizeof(ary) / sizeof(ary[0])) +#else +template static char countofVerify(void const *, T) throw() { return 0; } +template static void countofVerify(T *const, T *const *) throw() {}; +#define countof(arr) (sizeof(countofVerify(arr,&(arr))) * sizeof(arr)/sizeof(*(arr))) +#endif +#endif +#endif + +#define roundup(x, n) roundup_typed(x, n, DWORD) +#define roundup_typed(x, n, t) (((t)(x) + ((t)(n) - 1)) & ~((t)(n) - 1)) + +#define HRESULT_FROM_RPC(x) ((HRESULT) ((x) | FACILITY_RPC)) + +#ifndef MAXSIZE_T +#define MAXSIZE_T ((SIZE_T)~((SIZE_T)0)) +#endif + +typedef const BYTE* LPCBYTE; + +#define E_FILENOTFOUND HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) +#define E_INVALIDSTATE HRESULT_FROM_WIN32(ERROR_INVALID_STATE) +#define E_MOREDATA HRESULT_FROM_WIN32(ERROR_MORE_DATA) +#define E_NOMOREITEMS HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS) +#define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND) +#define E_MODNOTFOUND HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND) + +#define AddRefAndRelease(x) { x->AddRef(); x->Release(); } + +#define MAKEQWORDVERSION(mj, mi, b, r) (((DWORD64)MAKELONG(r, b)) | (((DWORD64)MAKELONG(mi, mj)) << 32)) + +// other functions +extern "C" HRESULT DAPI LoadSystemLibrary(__in_z LPCWSTR wzModuleName, __out HMODULE *phModule); diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/eseutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/eseutil.h index 975a5372a2..27ec027fc5 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/eseutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/eseutil.h @@ -1,212 +1,212 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for Extensible Storage Engine (Jetblue) helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -struct COLUMN_SCHEMA -{ - JET_COLUMNID jcColumn; - LPCWSTR pszName; - JET_COLTYP jcColumnType; - BOOL fKey; // If this column is part of the key of the table - BOOL fFixed; - BOOL fNullable; - BOOL fAutoIncrement; -}; - -struct TABLE_SCHEMA -{ - JET_TABLEID jtTable; - LPCWSTR pszName; - DWORD dwColumns; - COLUMN_SCHEMA *pcsColumns; -}; - -struct DATABASE_SCHEMA -{ - DWORD dwTables; - TABLE_SCHEMA *ptsTables; -}; - -typedef void* ESE_QUERY_HANDLE; - -HRESULT DAPI EseBeginSession( - __out JET_INSTANCE *pjiInstance, - __out JET_SESID *pjsSession, - __in_z LPCWSTR pszInstance, - __in_z LPCWSTR pszPath - ); -HRESULT DAPI EseEndSession( - __in JET_INSTANCE jiInstance, - __in JET_SESID jsSession - ); -HRESULT DAPI EseEnsureDatabase( - __in JET_SESID jsSession, - __in_z LPCWSTR pszFile, - __in DATABASE_SCHEMA *pdsSchema, - __out JET_DBID* pjdbDb, - __in BOOL fExclusive, - __in BOOL fReadonly - ); -HRESULT DAPI EseCloseDatabase( - __in JET_SESID jsSession, - __in JET_DBID jdbDb - ); -HRESULT DAPI EseCreateTable( - __in JET_SESID jsSession, - __in JET_DBID jdbDb, - __in_z LPCWSTR pszTable, - __out JET_TABLEID *pjtTable - ); -HRESULT DAPI EseOpenTable( - __in JET_SESID jsSession, - __in JET_DBID jdbDb, - __in_z LPCWSTR pszTable, - __out JET_TABLEID *pjtTable - ); -HRESULT DAPI EseCloseTable( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable - ); -HRESULT DAPI EseEnsureColumn( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in_z LPCWSTR pszColumnName, - __in JET_COLTYP jcColumnType, - __in ULONG ulColumnSize, - __in BOOL fFixed, - __in BOOL fNullable, - __out_opt JET_COLUMNID *pjcColumn - ); -HRESULT DAPI EseGetColumn( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in_z LPCWSTR pszColumnName, - __out JET_COLUMNID *pjcColumn - ); -HRESULT DAPI EseMoveCursor( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in LONG lRow - ); -HRESULT DAPI EseDeleteRow( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable - ); -HRESULT DAPI EseBeginTransaction( - __in JET_SESID jsSession - ); -HRESULT DAPI EseCommitTransaction( - __in JET_SESID jsSession - ); -HRESULT DAPI EsePrepareUpdate( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in ULONG ulPrep - ); -HRESULT DAPI EseFinishUpdate( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable - ); -HRESULT DAPI EseSetColumnDword( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn, - __in DWORD dwValue - ); -// Sets a column value without the need to call begintransaction, prepareupdate, finishupdate, or committransaction (all of these are called in sequence for you) -HRESULT DAPI EseSetColumnDwordFull( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn, - __in DWORD dwValue - ); -HRESULT DAPI EseSetColumnString( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn, - __in_z LPCWSTR pszValue - ); -// Sets a column value without the need to call begintransaction, prepareupdate, finishupdate, or committransaction (all of these are called in sequence for you) -HRESULT DAPI EseSetColumnStringFull( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn, - __in_z LPCWSTR pszValue - ); -HRESULT DAPI EseSetColumnEmpty( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn - ); -HRESULT DAPI EseSetColumnEmptyFull( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn - ); -HRESULT DAPI EseGetColumnDword( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn, - __out DWORD *pdwValue - ); -HRESULT DAPI EseGetColumnString( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in JET_COLUMNID jcColumn, - __out LPWSTR *ppszValue - ); - -// Call this once for each key column in the table -HRESULT DAPI EseBeginQuery( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in BOOL fExact, - __out ESE_QUERY_HANDLE *peqhHandle - ); -HRESULT DAPI EseSetQueryColumnDword( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in ESE_QUERY_HANDLE eqhHandle, - __in DWORD dwData, - __in BOOL fFinal // If this is true, all other key columns in the query will be set to "*" - ); -HRESULT DAPI EseSetQueryColumnString( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in ESE_QUERY_HANDLE eqhHandle, - __in_z LPCWSTR pszString, - __in BOOL fFinal // If this is true, all other key columns in the query will be set to "*" - ); -// This frees the query handle without actually running the query -void DAPI EseFreeQuery( - __in ESE_QUERY_HANDLE eqhHandle - ); -// Once all columns have been set up, call this and read the result -HRESULT DAPI EseRunQuery( - __in JET_SESID jsSession, - __in JET_TABLEID jtTable, - __in ESE_QUERY_HANDLE eqhHandle - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for Extensible Storage Engine (Jetblue) helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +struct COLUMN_SCHEMA +{ + JET_COLUMNID jcColumn; + LPCWSTR pszName; + JET_COLTYP jcColumnType; + BOOL fKey; // If this column is part of the key of the table + BOOL fFixed; + BOOL fNullable; + BOOL fAutoIncrement; +}; + +struct TABLE_SCHEMA +{ + JET_TABLEID jtTable; + LPCWSTR pszName; + DWORD dwColumns; + COLUMN_SCHEMA *pcsColumns; +}; + +struct DATABASE_SCHEMA +{ + DWORD dwTables; + TABLE_SCHEMA *ptsTables; +}; + +typedef void* ESE_QUERY_HANDLE; + +HRESULT DAPI EseBeginSession( + __out JET_INSTANCE *pjiInstance, + __out JET_SESID *pjsSession, + __in_z LPCWSTR pszInstance, + __in_z LPCWSTR pszPath + ); +HRESULT DAPI EseEndSession( + __in JET_INSTANCE jiInstance, + __in JET_SESID jsSession + ); +HRESULT DAPI EseEnsureDatabase( + __in JET_SESID jsSession, + __in_z LPCWSTR pszFile, + __in DATABASE_SCHEMA *pdsSchema, + __out JET_DBID* pjdbDb, + __in BOOL fExclusive, + __in BOOL fReadonly + ); +HRESULT DAPI EseCloseDatabase( + __in JET_SESID jsSession, + __in JET_DBID jdbDb + ); +HRESULT DAPI EseCreateTable( + __in JET_SESID jsSession, + __in JET_DBID jdbDb, + __in_z LPCWSTR pszTable, + __out JET_TABLEID *pjtTable + ); +HRESULT DAPI EseOpenTable( + __in JET_SESID jsSession, + __in JET_DBID jdbDb, + __in_z LPCWSTR pszTable, + __out JET_TABLEID *pjtTable + ); +HRESULT DAPI EseCloseTable( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable + ); +HRESULT DAPI EseEnsureColumn( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in_z LPCWSTR pszColumnName, + __in JET_COLTYP jcColumnType, + __in ULONG ulColumnSize, + __in BOOL fFixed, + __in BOOL fNullable, + __out_opt JET_COLUMNID *pjcColumn + ); +HRESULT DAPI EseGetColumn( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in_z LPCWSTR pszColumnName, + __out JET_COLUMNID *pjcColumn + ); +HRESULT DAPI EseMoveCursor( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in LONG lRow + ); +HRESULT DAPI EseDeleteRow( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable + ); +HRESULT DAPI EseBeginTransaction( + __in JET_SESID jsSession + ); +HRESULT DAPI EseCommitTransaction( + __in JET_SESID jsSession + ); +HRESULT DAPI EsePrepareUpdate( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in ULONG ulPrep + ); +HRESULT DAPI EseFinishUpdate( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable + ); +HRESULT DAPI EseSetColumnDword( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn, + __in DWORD dwValue + ); +// Sets a column value without the need to call begintransaction, prepareupdate, finishupdate, or committransaction (all of these are called in sequence for you) +HRESULT DAPI EseSetColumnDwordFull( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn, + __in DWORD dwValue + ); +HRESULT DAPI EseSetColumnString( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn, + __in_z LPCWSTR pszValue + ); +// Sets a column value without the need to call begintransaction, prepareupdate, finishupdate, or committransaction (all of these are called in sequence for you) +HRESULT DAPI EseSetColumnStringFull( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn, + __in_z LPCWSTR pszValue + ); +HRESULT DAPI EseSetColumnEmpty( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn + ); +HRESULT DAPI EseSetColumnEmptyFull( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn + ); +HRESULT DAPI EseGetColumnDword( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn, + __out DWORD *pdwValue + ); +HRESULT DAPI EseGetColumnString( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in JET_COLUMNID jcColumn, + __out LPWSTR *ppszValue + ); + +// Call this once for each key column in the table +HRESULT DAPI EseBeginQuery( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in BOOL fExact, + __out ESE_QUERY_HANDLE *peqhHandle + ); +HRESULT DAPI EseSetQueryColumnDword( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in ESE_QUERY_HANDLE eqhHandle, + __in DWORD dwData, + __in BOOL fFinal // If this is true, all other key columns in the query will be set to "*" + ); +HRESULT DAPI EseSetQueryColumnString( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in ESE_QUERY_HANDLE eqhHandle, + __in_z LPCWSTR pszString, + __in BOOL fFinal // If this is true, all other key columns in the query will be set to "*" + ); +// This frees the query handle without actually running the query +void DAPI EseFreeQuery( + __in ESE_QUERY_HANDLE eqhHandle + ); +// Once all columns have been set up, call this and read the result +HRESULT DAPI EseRunQuery( + __in JET_SESID jsSession, + __in JET_TABLEID jtTable, + __in ESE_QUERY_HANDLE eqhHandle + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/fileutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/fileutil.h index bc41a2158a..327a3586ff 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/fileutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/fileutil.h @@ -1,176 +1,176 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for file helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseFile(h) if (INVALID_HANDLE_VALUE != h) { ::CloseHandle(h); h = INVALID_HANDLE_VALUE; } -#define ReleaseFileHandle(h) if (INVALID_HANDLE_VALUE != h) { ::CloseHandle(h); h = INVALID_HANDLE_VALUE; } -#define ReleaseFileFindHandle(h) if (INVALID_HANDLE_VALUE != h) { ::FindClose(h); h = INVALID_HANDLE_VALUE; } - -enum FILE_ARCHITECTURE -{ - FILE_ARCHITECTURE_UNKNOWN, - FILE_ARCHITECTURE_X86, - FILE_ARCHITECTURE_X64, - FILE_ARCHITECTURE_IA64, -}; - - -LPWSTR DAPI FileFromPath( - __in_z LPCWSTR wzPath - ); -HRESULT DAPI FileResolvePath( - __in_z LPCWSTR wzRelativePath, - __out LPWSTR *ppwzFullPath - ); -HRESULT DAPI FileStripExtension( - __in_z LPCWSTR wzFileName, - __out LPWSTR *ppwzFileNameNoExtension - ); -HRESULT DAPI FileChangeExtension( - __in_z LPCWSTR wzFileName, - __in_z LPCWSTR wzNewExtension, - __out LPWSTR *ppwzFileNameNewExtension - ); -HRESULT DAPI FileAddSuffixToBaseName( - __in_z LPCWSTR wzFileName, - __in_z LPCWSTR wzSuffix, - __out_z LPWSTR* psczNewFileName - ); -HRESULT DAPI FileVersionFromString( - __in_z LPCWSTR wzVersion, - __out DWORD *pdwVerMajor, - __out DWORD* pdwVerMinor - ); -HRESULT DAPI FileVersionFromStringEx( - __in_z LPCWSTR wzVersion, - __in DWORD cchVersion, - __out DWORD64* pqwVersion - ); -HRESULT DAPI FileSetPointer( - __in HANDLE hFile, - __in DWORD64 dw64Move, - __out_opt DWORD64* pdw64NewPosition, - __in DWORD dwMoveMethod - ); -HRESULT DAPI FileSize( - __in_z LPCWSTR pwzFileName, - __out LONGLONG* pllSize - ); -HRESULT DAPI FileSizeByHandle( - __in HANDLE hFile, - __out LONGLONG* pllSize - ); -BOOL DAPI FileExistsEx( - __in_z LPCWSTR wzPath, - __out_opt DWORD *pdwAttributes - ); -HRESULT DAPI FileRead( - __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest, - __out DWORD* pcbDest, - __in_z LPCWSTR wzSrcPath - ); -HRESULT DAPI FileReadUntil( - __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest, - __out_range(<=, cbMaxRead) DWORD* pcbDest, - __in_z LPCWSTR wzSrcPath, - __in DWORD cbMaxRead - ); -HRESULT DAPI FileReadPartial( - __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest, - __out_range(<=, cbMaxRead) DWORD* pcbDest, - __in_z LPCWSTR wzSrcPath, - __in BOOL fSeek, - __in DWORD cbStartPosition, - __in DWORD cbMaxRead, - __in BOOL fPartialOK - ); -HRESULT DAPI FileWrite( - __in_z LPCWSTR pwzFileName, - __in DWORD dwFlagsAndAttributes, - __in_bcount(cbData) LPCBYTE pbData, - __in DWORD cbData, - __out_opt HANDLE* pHandle - ); -HRESULT DAPI FileWriteHandle( - __in HANDLE hFile, - __in_bcount(cbData) LPCBYTE pbData, - __in DWORD cbData - ); -HRESULT DAPI FileEnsureCopy( - __in_z LPCWSTR wzSource, - __in_z LPCWSTR wzTarget, - __in BOOL fOverwrite - ); -HRESULT DAPI FileEnsureMove( - __in_z LPCWSTR wzSource, - __in_z LPCWSTR wzTarget, - __in BOOL fOverwrite, - __in BOOL fAllowCopy - ); -HRESULT DAPI FileCreateTemp( - __in_z LPCWSTR wzPrefix, - __in_z LPCWSTR wzExtension, - __deref_opt_out_z LPWSTR* ppwzTempFile, - __out_opt HANDLE* phTempFile - ); -HRESULT DAPI FileCreateTempW( - __in_z LPCWSTR wzPrefix, - __in_z LPCWSTR wzExtension, - __deref_opt_out_z LPWSTR* ppwzTempFile, - __out_opt HANDLE* phTempFile - ); -HRESULT DAPI FileVersion( - __in_z LPCWSTR wzFilename, - __out DWORD *pdwVerMajor, - __out DWORD* pdwVerMinor - ); -HRESULT DAPI FileIsSame( - __in_z LPCWSTR wzFile1, - __in_z LPCWSTR wzFile2, - __out LPBOOL lpfSameFile - ); -HRESULT DAPI FileEnsureDelete( - __in_z LPCWSTR wzFile - ); -HRESULT DAPI FileGetTime( - __in_z LPCWSTR wzFile, - __out_opt LPFILETIME lpCreationTime, - __out_opt LPFILETIME lpLastAccessTime, - __out_opt LPFILETIME lpLastWriteTime - ); -HRESULT DAPI FileSetTime( - __in_z LPCWSTR wzFile, - __in_opt const FILETIME *lpCreationTime, - __in_opt const FILETIME *lpLastAccessTime, - __in_opt const FILETIME *lpLastWriteTime - ); -HRESULT DAPI FileResetTime( - __in_z LPCWSTR wzFile - ); -HRESULT FileExecutableArchitecture( - __in_z LPCWSTR wzFile, - __out FILE_ARCHITECTURE *pArchitecture - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for file helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseFile(h) if (INVALID_HANDLE_VALUE != h) { ::CloseHandle(h); h = INVALID_HANDLE_VALUE; } +#define ReleaseFileHandle(h) if (INVALID_HANDLE_VALUE != h) { ::CloseHandle(h); h = INVALID_HANDLE_VALUE; } +#define ReleaseFileFindHandle(h) if (INVALID_HANDLE_VALUE != h) { ::FindClose(h); h = INVALID_HANDLE_VALUE; } + +enum FILE_ARCHITECTURE +{ + FILE_ARCHITECTURE_UNKNOWN, + FILE_ARCHITECTURE_X86, + FILE_ARCHITECTURE_X64, + FILE_ARCHITECTURE_IA64, +}; + + +LPWSTR DAPI FileFromPath( + __in_z LPCWSTR wzPath + ); +HRESULT DAPI FileResolvePath( + __in_z LPCWSTR wzRelativePath, + __out LPWSTR *ppwzFullPath + ); +HRESULT DAPI FileStripExtension( + __in_z LPCWSTR wzFileName, + __out LPWSTR *ppwzFileNameNoExtension + ); +HRESULT DAPI FileChangeExtension( + __in_z LPCWSTR wzFileName, + __in_z LPCWSTR wzNewExtension, + __out LPWSTR *ppwzFileNameNewExtension + ); +HRESULT DAPI FileAddSuffixToBaseName( + __in_z LPCWSTR wzFileName, + __in_z LPCWSTR wzSuffix, + __out_z LPWSTR* psczNewFileName + ); +HRESULT DAPI FileVersionFromString( + __in_z LPCWSTR wzVersion, + __out DWORD *pdwVerMajor, + __out DWORD* pdwVerMinor + ); +HRESULT DAPI FileVersionFromStringEx( + __in_z LPCWSTR wzVersion, + __in DWORD cchVersion, + __out DWORD64* pqwVersion + ); +HRESULT DAPI FileSetPointer( + __in HANDLE hFile, + __in DWORD64 dw64Move, + __out_opt DWORD64* pdw64NewPosition, + __in DWORD dwMoveMethod + ); +HRESULT DAPI FileSize( + __in_z LPCWSTR pwzFileName, + __out LONGLONG* pllSize + ); +HRESULT DAPI FileSizeByHandle( + __in HANDLE hFile, + __out LONGLONG* pllSize + ); +BOOL DAPI FileExistsEx( + __in_z LPCWSTR wzPath, + __out_opt DWORD *pdwAttributes + ); +HRESULT DAPI FileRead( + __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest, + __out DWORD* pcbDest, + __in_z LPCWSTR wzSrcPath + ); +HRESULT DAPI FileReadUntil( + __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest, + __out_range(<=, cbMaxRead) DWORD* pcbDest, + __in_z LPCWSTR wzSrcPath, + __in DWORD cbMaxRead + ); +HRESULT DAPI FileReadPartial( + __deref_out_bcount_full(*pcbDest) LPBYTE* ppbDest, + __out_range(<=, cbMaxRead) DWORD* pcbDest, + __in_z LPCWSTR wzSrcPath, + __in BOOL fSeek, + __in DWORD cbStartPosition, + __in DWORD cbMaxRead, + __in BOOL fPartialOK + ); +HRESULT DAPI FileWrite( + __in_z LPCWSTR pwzFileName, + __in DWORD dwFlagsAndAttributes, + __in_bcount(cbData) LPCBYTE pbData, + __in DWORD cbData, + __out_opt HANDLE* pHandle + ); +HRESULT DAPI FileWriteHandle( + __in HANDLE hFile, + __in_bcount(cbData) LPCBYTE pbData, + __in DWORD cbData + ); +HRESULT DAPI FileEnsureCopy( + __in_z LPCWSTR wzSource, + __in_z LPCWSTR wzTarget, + __in BOOL fOverwrite + ); +HRESULT DAPI FileEnsureMove( + __in_z LPCWSTR wzSource, + __in_z LPCWSTR wzTarget, + __in BOOL fOverwrite, + __in BOOL fAllowCopy + ); +HRESULT DAPI FileCreateTemp( + __in_z LPCWSTR wzPrefix, + __in_z LPCWSTR wzExtension, + __deref_opt_out_z LPWSTR* ppwzTempFile, + __out_opt HANDLE* phTempFile + ); +HRESULT DAPI FileCreateTempW( + __in_z LPCWSTR wzPrefix, + __in_z LPCWSTR wzExtension, + __deref_opt_out_z LPWSTR* ppwzTempFile, + __out_opt HANDLE* phTempFile + ); +HRESULT DAPI FileVersion( + __in_z LPCWSTR wzFilename, + __out DWORD *pdwVerMajor, + __out DWORD* pdwVerMinor + ); +HRESULT DAPI FileIsSame( + __in_z LPCWSTR wzFile1, + __in_z LPCWSTR wzFile2, + __out LPBOOL lpfSameFile + ); +HRESULT DAPI FileEnsureDelete( + __in_z LPCWSTR wzFile + ); +HRESULT DAPI FileGetTime( + __in_z LPCWSTR wzFile, + __out_opt LPFILETIME lpCreationTime, + __out_opt LPFILETIME lpLastAccessTime, + __out_opt LPFILETIME lpLastWriteTime + ); +HRESULT DAPI FileSetTime( + __in_z LPCWSTR wzFile, + __in_opt const FILETIME *lpCreationTime, + __in_opt const FILETIME *lpLastAccessTime, + __in_opt const FILETIME *lpLastWriteTime + ); +HRESULT DAPI FileResetTime( + __in_z LPCWSTR wzFile + ); +HRESULT FileExecutableArchitecture( + __in_z LPCWSTR wzFile, + __out FILE_ARCHITECTURE *pArchitecture + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/gdiputil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/gdiputil.h index 6720c7384d..c7b622e566 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/gdiputil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/gdiputil.h @@ -1,46 +1,46 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// GDI+ helper functions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - -#define ExitOnGdipFailure(g, x, s) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } } -#define ExitOnGdipFailure1(g, x, f, s) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } } -#define ExitOnGdipFailure2(g, x, f, s, t) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } } - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI GdipBitmapFromResource( - __in_opt HINSTANCE hinst, - __in_z LPCSTR szId, - __out Gdiplus::Bitmap **ppBitmap - ); - -HRESULT DAPI GdipBitmapFromFile( - __in_z LPCWSTR wzFileName, - __out Gdiplus::Bitmap **ppBitmap - ); - -HRESULT DAPI GdipHresultFromStatus( - __in Gdiplus::Status gs - ); - -#ifdef __cplusplus -} -#endif +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// GDI+ helper functions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + +#define ExitOnGdipFailure(g, x, s) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s); goto LExit; } } +#define ExitOnGdipFailure1(g, x, f, s) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace1(x, f, s); goto LExit; } } +#define ExitOnGdipFailure2(g, x, f, s, t) { x = GdipHresultFromStatus(g); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace2(x, f, s, t); goto LExit; } } + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI GdipBitmapFromResource( + __in_opt HINSTANCE hinst, + __in_z LPCSTR szId, + __out Gdiplus::Bitmap **ppBitmap + ); + +HRESULT DAPI GdipBitmapFromFile( + __in_z LPCWSTR wzFileName, + __out Gdiplus::Bitmap **ppBitmap + ); + +HRESULT DAPI GdipHresultFromStatus( + __in Gdiplus::Status gs + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/inetutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/inetutil.h index 42eb692819..59836b5b30 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/inetutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/inetutil.h @@ -1,54 +1,54 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Internet utilites. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseInternet(h) if (h) { ::InternetCloseHandle(h); h = NULL; } -#define ReleaseNullInternet(h) if (h) { ::InternetCloseHandle(h); h = NULL; } - - -// functions -HRESULT DAPI InternetGetSizeByHandle( - __in HINTERNET hiFile, - __out LONGLONG* pllSize - ); - -HRESULT DAPI InternetGetCreateTimeByHandle( - __in HINTERNET hiFile, - __out LPFILETIME pft - ); - -HRESULT DAPI InternetQueryInfoString( - __in HINTERNET h, - __in DWORD dwInfo, - __deref_out_z LPWSTR* psczValue - ); - -HRESULT DAPI InternetQueryInfoNumber( - __in HINTERNET h, - __in DWORD dwInfo, - __out LONG* plInfo - ); - -#ifdef __cplusplus -} -#endif - +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Internet utilites. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseInternet(h) if (h) { ::InternetCloseHandle(h); h = NULL; } +#define ReleaseNullInternet(h) if (h) { ::InternetCloseHandle(h); h = NULL; } + + +// functions +HRESULT DAPI InternetGetSizeByHandle( + __in HINTERNET hiFile, + __out LONGLONG* pllSize + ); + +HRESULT DAPI InternetGetCreateTimeByHandle( + __in HINTERNET hiFile, + __out LPFILETIME pft + ); + +HRESULT DAPI InternetQueryInfoString( + __in HINTERNET h, + __in DWORD dwInfo, + __deref_out_z LPWSTR* psczValue + ); + +HRESULT DAPI InternetQueryInfoNumber( + __in HINTERNET h, + __in DWORD dwInfo, + __out LONG* plInfo + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/jsonutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/jsonutil.h index f204124fe5..2ce9c9fa35 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/jsonutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/jsonutil.h @@ -1,94 +1,94 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// JavaScript Object Notation (JSON) helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -enum JSON_WRITER_TOKEN -{ - JSON_WRITER_TOKEN_NONE, - JSON_WRITER_TOKEN_ARRAY_START, - JSON_WRITER_TOKEN_ARRAY_VALUE, - JSON_WRITER_TOKEN_ARRAY_END, - JSON_WRITER_TOKEN_OBJECT_START, - JSON_WRITER_TOKEN_OBJECT_KEY, - JSON_WRITER_TOKEN_OBJECT_VALUE, - JSON_WRITER_TOKEN_OBJECT_END, - JSON_WRITER_TOKEN_VALUE, -}; - -typedef struct _JSON_WRITER -{ - CRITICAL_SECTION cs; - LPWSTR sczJson; - - JSON_WRITER_TOKEN* rgTokenStack; - DWORD cTokens; - DWORD cMaxTokens; -} JSON_WRITER; - - -DAPI_(HRESULT) JsonInitializeWriter( - __in JSON_WRITER* pWriter - ); - -DAPI_(void) JsonUninitializeWriter( - __in JSON_WRITER* pWriter - ); - -DAPI_(HRESULT) JsonWriteBool( - __in JSON_WRITER* pWriter, - __in BOOL fValue - ); - -DAPI_(HRESULT) JsonWriteNumber( - __in JSON_WRITER* pWriter, - __in DWORD dwValue - ); - -DAPI_(HRESULT) JsonWriteString( - __in JSON_WRITER* pWriter, - __in_z_opt LPCWSTR wzValue - ); - -DAPI_(HRESULT) JsonWriteArrayStart( - __in JSON_WRITER* pWriter - ); - -DAPI_(HRESULT) JsonWriteArrayEnd( - __in JSON_WRITER* pWriter - ); - -DAPI_(HRESULT) JsonWriteObjectStart( - __in JSON_WRITER* pWriter - ); - -DAPI_(HRESULT) JsonWriteObjectKey( - __in JSON_WRITER* pWriter, - __in_z LPCWSTR wzKey - ); - -DAPI_(HRESULT) JsonWriteObjectEnd( - __in JSON_WRITER* pWriter - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// JavaScript Object Notation (JSON) helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +enum JSON_WRITER_TOKEN +{ + JSON_WRITER_TOKEN_NONE, + JSON_WRITER_TOKEN_ARRAY_START, + JSON_WRITER_TOKEN_ARRAY_VALUE, + JSON_WRITER_TOKEN_ARRAY_END, + JSON_WRITER_TOKEN_OBJECT_START, + JSON_WRITER_TOKEN_OBJECT_KEY, + JSON_WRITER_TOKEN_OBJECT_VALUE, + JSON_WRITER_TOKEN_OBJECT_END, + JSON_WRITER_TOKEN_VALUE, +}; + +typedef struct _JSON_WRITER +{ + CRITICAL_SECTION cs; + LPWSTR sczJson; + + JSON_WRITER_TOKEN* rgTokenStack; + DWORD cTokens; + DWORD cMaxTokens; +} JSON_WRITER; + + +DAPI_(HRESULT) JsonInitializeWriter( + __in JSON_WRITER* pWriter + ); + +DAPI_(void) JsonUninitializeWriter( + __in JSON_WRITER* pWriter + ); + +DAPI_(HRESULT) JsonWriteBool( + __in JSON_WRITER* pWriter, + __in BOOL fValue + ); + +DAPI_(HRESULT) JsonWriteNumber( + __in JSON_WRITER* pWriter, + __in DWORD dwValue + ); + +DAPI_(HRESULT) JsonWriteString( + __in JSON_WRITER* pWriter, + __in_z_opt LPCWSTR wzValue + ); + +DAPI_(HRESULT) JsonWriteArrayStart( + __in JSON_WRITER* pWriter + ); + +DAPI_(HRESULT) JsonWriteArrayEnd( + __in JSON_WRITER* pWriter + ); + +DAPI_(HRESULT) JsonWriteObjectStart( + __in JSON_WRITER* pWriter + ); + +DAPI_(HRESULT) JsonWriteObjectKey( + __in JSON_WRITER* pWriter, + __in_z LPCWSTR wzKey + ); + +DAPI_(HRESULT) JsonWriteObjectEnd( + __in JSON_WRITER* pWriter + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/locutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/locutil.h index 2a8875af23..d69f305a48 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/locutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/locutil.h @@ -1,53 +1,53 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for localization helper functions. -// -//------------------------------------------------------------------------------------------------- -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -struct LOC_STRING -{ - LPWSTR wzID; - LPWSTR wzText; - BOOL bOverridable; -}; - -struct LOC_STRINGSET -{ - DWORD cLocStrings; - LOC_STRING* rgLocStrings; -}; - -HRESULT DAPI LocLoadFromFile( - __in_z LPCWSTR wzWxlFile, - __out LOC_STRINGSET** ppLocStringSet - ); - -HRESULT DAPI LocLocalizeString( - __in const LOC_STRINGSET* pLocStringSet, - __inout LPWSTR* ppInput - ); - -void DAPI LocFree( - __in_opt LOC_STRINGSET* pLocStringSet - ); - -#ifdef __cplusplus -} -#endif +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for localization helper functions. +// +//------------------------------------------------------------------------------------------------- +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +struct LOC_STRING +{ + LPWSTR wzID; + LPWSTR wzText; + BOOL bOverridable; +}; + +struct LOC_STRINGSET +{ + DWORD cLocStrings; + LOC_STRING* rgLocStrings; +}; + +HRESULT DAPI LocLoadFromFile( + __in_z LPCWSTR wzWxlFile, + __out LOC_STRINGSET** ppLocStringSet + ); + +HRESULT DAPI LocLocalizeString( + __in const LOC_STRINGSET* pLocStringSet, + __inout LPWSTR* ppInput + ); + +void DAPI LocFree( + __in_opt LOC_STRINGSET* pLocStringSet + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/logutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/logutil.h index 27a4c75094..bf5f15cf42 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/logutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/logutil.h @@ -1,182 +1,182 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for string helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define LogExitOnFailure(x, i, f) if (FAILED(x)) { LogErrorId(x, i, NULL, NULL, NULL); ExitTrace(x, f); goto LExit; } -#define LogExitOnFailure1(x, i, f, s) if (FAILED(x)) { LogErrorId(x, i, s, NULL, NULL); ExitTrace1(x, f, s); goto LExit; } -#define LogExitOnFailure2(x, i, f, s, t) if (FAILED(x)) { LogErrorId(x, i, s, t, NULL); ExitTrace2(x, f, s, t); goto LExit; } -#define LogExitOnFailure3(x, i, f, s, t, u) if (FAILED(x)) { LogErrorId(x, i, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; } - -// enums - -// structs - -// functions -BOOL DAPI IsLogInitialized(); - -HRESULT DAPI LogInitialize( - __in HMODULE hModule, - __in_z LPCWSTR wzLog, - __in_z_opt LPCWSTR wzExt, - __in BOOL fAppend, - __in BOOL fHeader - ); - -HRESULT DAPI LogRename( - __in_z LPCWSTR wzNewPath - ); - -void DAPI LogUninitialize( - __in BOOL fFooter - ); - -BOOL DAPI LogIsOpen(); - -HRESULT DAPI LogSetSpecialParams( - __in_z LPCSTR wzSpecialBeginLine, - __in_z LPCSTR wzSpecialAfterTimeStamp, - __in_z LPCSTR wzSpecialEndLine - ); - -REPORT_LEVEL DAPI LogSetLevel( - __in REPORT_LEVEL rl, - __in BOOL fLogChange - ); - -REPORT_LEVEL DAPI LogGetLevel(); - -HRESULT DAPI LogGetPath( - __out_ecount_z(cchLogPath) LPWSTR pwzLogPath, - __in DWORD cchLogPath - ); - -HANDLE DAPI LogGetHandle(); - -HRESULT DAPIV LogString( - __in REPORT_LEVEL rl, - __in_z __format_string LPCSTR szFormat, - ... - ); - -HRESULT DAPI LogStringArgs( - __in REPORT_LEVEL rl, - __in_z __format_string LPCSTR szFormat, - __in va_list args - ); - -HRESULT DAPIV LogStringLine( - __in REPORT_LEVEL rl, - __in_z __format_string LPCSTR szFormat, - ... - ); - -HRESULT DAPI LogStringLineArgs( - __in REPORT_LEVEL rl, - __in_z __format_string LPCSTR szFormat, - __in va_list args - ); - -HRESULT DAPI LogIdModuleArgs( - __in REPORT_LEVEL rl, - __in DWORD dwLogId, - __in_opt HMODULE hModule, - __in va_list args - ); - -/* - * Wraps LogIdModuleArgs, so inline to save the function call - */ - -inline HRESULT LogId( - __in REPORT_LEVEL rl, - __in DWORD dwLogId, - ... - ) -{ - HRESULT hr = S_OK; - va_list args; - - va_start(args, dwLogId); - hr = LogIdModuleArgs(rl, dwLogId, NULL, args); - va_end(args); - - return hr; -} - - -/* - * Wraps LogIdModuleArgs, so inline to save the function call - */ - -inline HRESULT LogIdArgs( - __in REPORT_LEVEL rl, - __in DWORD dwLogId, - __in va_list args - ) -{ - return LogIdModuleArgs(rl, dwLogId, NULL, args); -} - -HRESULT DAPIV LogErrorString( - __in HRESULT hrError, - __in_z __format_string LPCSTR szFormat, - ... - ); - -HRESULT DAPI LogErrorStringArgs( - __in HRESULT hrError, - __in_z __format_string LPCSTR szFormat, - __in va_list args - ); - -HRESULT DAPI LogErrorIdModule( - __in HRESULT hrError, - __in DWORD dwLogId, - __in_opt HMODULE hModule, - __in_z_opt LPCWSTR wzString1, - __in_z_opt LPCWSTR wzString2, - __in_z_opt LPCWSTR wzString3 - ); - -inline HRESULT LogErrorId( - __in HRESULT hrError, - __in DWORD dwLogId, - __in_z_opt LPCWSTR wzString1, - __in_z_opt LPCWSTR wzString2, - __in_z_opt LPCWSTR wzString3 - ) -{ - return LogErrorIdModule(hrError, dwLogId, NULL, wzString1, wzString2, wzString3); -} - -HRESULT DAPI LogHeader(); - -HRESULT DAPI LogFooter(); - -// begin the switch of LogXXX to LogStringXXX -#define Log LogString -#define LogLine LogStringLine - -#ifdef __cplusplus -} -#endif - +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for string helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define LogExitOnFailure(x, i, f) if (FAILED(x)) { LogErrorId(x, i, NULL, NULL, NULL); ExitTrace(x, f); goto LExit; } +#define LogExitOnFailure1(x, i, f, s) if (FAILED(x)) { LogErrorId(x, i, s, NULL, NULL); ExitTrace1(x, f, s); goto LExit; } +#define LogExitOnFailure2(x, i, f, s, t) if (FAILED(x)) { LogErrorId(x, i, s, t, NULL); ExitTrace2(x, f, s, t); goto LExit; } +#define LogExitOnFailure3(x, i, f, s, t, u) if (FAILED(x)) { LogErrorId(x, i, s, t, u); ExitTrace3(x, f, s, t, u); goto LExit; } + +// enums + +// structs + +// functions +BOOL DAPI IsLogInitialized(); + +HRESULT DAPI LogInitialize( + __in HMODULE hModule, + __in_z LPCWSTR wzLog, + __in_z_opt LPCWSTR wzExt, + __in BOOL fAppend, + __in BOOL fHeader + ); + +HRESULT DAPI LogRename( + __in_z LPCWSTR wzNewPath + ); + +void DAPI LogUninitialize( + __in BOOL fFooter + ); + +BOOL DAPI LogIsOpen(); + +HRESULT DAPI LogSetSpecialParams( + __in_z LPCSTR wzSpecialBeginLine, + __in_z LPCSTR wzSpecialAfterTimeStamp, + __in_z LPCSTR wzSpecialEndLine + ); + +REPORT_LEVEL DAPI LogSetLevel( + __in REPORT_LEVEL rl, + __in BOOL fLogChange + ); + +REPORT_LEVEL DAPI LogGetLevel(); + +HRESULT DAPI LogGetPath( + __out_ecount_z(cchLogPath) LPWSTR pwzLogPath, + __in DWORD cchLogPath + ); + +HANDLE DAPI LogGetHandle(); + +HRESULT DAPIV LogString( + __in REPORT_LEVEL rl, + __in_z __format_string LPCSTR szFormat, + ... + ); + +HRESULT DAPI LogStringArgs( + __in REPORT_LEVEL rl, + __in_z __format_string LPCSTR szFormat, + __in va_list args + ); + +HRESULT DAPIV LogStringLine( + __in REPORT_LEVEL rl, + __in_z __format_string LPCSTR szFormat, + ... + ); + +HRESULT DAPI LogStringLineArgs( + __in REPORT_LEVEL rl, + __in_z __format_string LPCSTR szFormat, + __in va_list args + ); + +HRESULT DAPI LogIdModuleArgs( + __in REPORT_LEVEL rl, + __in DWORD dwLogId, + __in_opt HMODULE hModule, + __in va_list args + ); + +/* + * Wraps LogIdModuleArgs, so inline to save the function call + */ + +inline HRESULT LogId( + __in REPORT_LEVEL rl, + __in DWORD dwLogId, + ... + ) +{ + HRESULT hr = S_OK; + va_list args; + + va_start(args, dwLogId); + hr = LogIdModuleArgs(rl, dwLogId, NULL, args); + va_end(args); + + return hr; +} + + +/* + * Wraps LogIdModuleArgs, so inline to save the function call + */ + +inline HRESULT LogIdArgs( + __in REPORT_LEVEL rl, + __in DWORD dwLogId, + __in va_list args + ) +{ + return LogIdModuleArgs(rl, dwLogId, NULL, args); +} + +HRESULT DAPIV LogErrorString( + __in HRESULT hrError, + __in_z __format_string LPCSTR szFormat, + ... + ); + +HRESULT DAPI LogErrorStringArgs( + __in HRESULT hrError, + __in_z __format_string LPCSTR szFormat, + __in va_list args + ); + +HRESULT DAPI LogErrorIdModule( + __in HRESULT hrError, + __in DWORD dwLogId, + __in_opt HMODULE hModule, + __in_z_opt LPCWSTR wzString1, + __in_z_opt LPCWSTR wzString2, + __in_z_opt LPCWSTR wzString3 + ); + +inline HRESULT LogErrorId( + __in HRESULT hrError, + __in DWORD dwLogId, + __in_z_opt LPCWSTR wzString1, + __in_z_opt LPCWSTR wzString2, + __in_z_opt LPCWSTR wzString3 + ) +{ + return LogErrorIdModule(hrError, dwLogId, NULL, wzString1, wzString2, wzString3); +} + +HRESULT DAPI LogHeader(); + +HRESULT DAPI LogFooter(); + +// begin the switch of LogXXX to LogStringXXX +#define Log LogString +#define LogLine LogStringLine + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/memutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/memutil.h index a9110ec5e2..b41a07cf00 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/memutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/memutil.h @@ -1,65 +1,65 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for memory helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseMem(p) if (p) { MemFree(p); } -#define ReleaseNullMem(p) if (p) { MemFree(p); p = NULL; } - -#define MEM_ENSURE_ARRAY_SIZE(type, pointer, count, max, grow, hresult, errMsg) \ - if (max <= count) { \ - LPVOID pv = NULL; DWORD cNewMax = count + grow; \ - if (0 == max) pv = MemAlloc(sizeof(type) * cNewMax, TRUE); else pv = MemReAlloc(pointer, sizeof(type) * cNewMax, TRUE); \ - ExitOnNull(pv, hresult, E_OUTOFMEMORY, errMsg); \ - max = cNewMax; pointer = static_cast(pv); \ - } - -HRESULT DAPI MemInitialize(); -void DAPI MemUninitialize(); - -LPVOID DAPI MemAlloc( - __in SIZE_T cbSize, - __in BOOL fZero - ); -LPVOID DAPI MemReAlloc( - __in LPVOID pv, - __in SIZE_T cbSize, - __in BOOL fZero - ); - -HRESULT DAPI MemEnsureArraySize( - __inout_ecount(cArray) LPVOID* ppvArray, - __in DWORD cArray, - __in SIZE_T cbArrayType, - __in DWORD dwGrowthCount - ); - -HRESULT DAPI MemFree( - __in LPVOID pv - ); -SIZE_T DAPI MemSize( - __in LPCVOID pv - ); - -#ifdef __cplusplus -} -#endif - +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for memory helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseMem(p) if (p) { MemFree(p); } +#define ReleaseNullMem(p) if (p) { MemFree(p); p = NULL; } + +#define MEM_ENSURE_ARRAY_SIZE(type, pointer, count, max, grow, hresult, errMsg) \ + if (max <= count) { \ + LPVOID pv = NULL; DWORD cNewMax = count + grow; \ + if (0 == max) pv = MemAlloc(sizeof(type) * cNewMax, TRUE); else pv = MemReAlloc(pointer, sizeof(type) * cNewMax, TRUE); \ + ExitOnNull(pv, hresult, E_OUTOFMEMORY, errMsg); \ + max = cNewMax; pointer = static_cast(pv); \ + } + +HRESULT DAPI MemInitialize(); +void DAPI MemUninitialize(); + +LPVOID DAPI MemAlloc( + __in SIZE_T cbSize, + __in BOOL fZero + ); +LPVOID DAPI MemReAlloc( + __in LPVOID pv, + __in SIZE_T cbSize, + __in BOOL fZero + ); + +HRESULT DAPI MemEnsureArraySize( + __inout_ecount(cArray) LPVOID* ppvArray, + __in DWORD cArray, + __in SIZE_T cbArrayType, + __in DWORD dwGrowthCount + ); + +HRESULT DAPI MemFree( + __in LPVOID pv + ); +SIZE_T DAPI MemSize( + __in LPCVOID pv + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/metautil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/metautil.h index e8046ce7dc..e594760c35 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/metautil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/metautil.h @@ -1,67 +1,67 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// IIS Metabase helper functions. -// -//------------------------------------------------------------------------------------------------- - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// structs - -// prototypes -HRESULT DAPI MetaFindWebBase( - __in IMSAdminBaseW* piMetabase, - __in_z LPCWSTR wzIP, - __in int iPort, - __in_z LPCWSTR wzHeader, - __in BOOL fSecure, - __out_ecount(cchWebBase) LPWSTR wzWebBase, - __in DWORD cchWebBase - ); -HRESULT DAPI MetaFindFreeWebBase( - __in IMSAdminBaseW* piMetabase, - __out_ecount(cchWebBase) LPWSTR wzWebBase, - __in DWORD cchWebBase - ); - -HRESULT DAPI MetaOpenKey( - __in IMSAdminBaseW* piMetabase, - __in METADATA_HANDLE mhKey, - __in_z LPCWSTR wzKey, - __in DWORD dwAccess, - __in DWORD cRetries, - __out METADATA_HANDLE* pmh - ); -HRESULT DAPI MetaGetValue( - __in IMSAdminBaseW* piMetabase, - __in METADATA_HANDLE mhKey, - __in_z LPCWSTR wzKey, - __inout METADATA_RECORD* pmr - ); -void DAPI MetaFreeValue( - __in METADATA_RECORD* pmr - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// IIS Metabase helper functions. +// +//------------------------------------------------------------------------------------------------- + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// structs + +// prototypes +HRESULT DAPI MetaFindWebBase( + __in IMSAdminBaseW* piMetabase, + __in_z LPCWSTR wzIP, + __in int iPort, + __in_z LPCWSTR wzHeader, + __in BOOL fSecure, + __out_ecount(cchWebBase) LPWSTR wzWebBase, + __in DWORD cchWebBase + ); +HRESULT DAPI MetaFindFreeWebBase( + __in IMSAdminBaseW* piMetabase, + __out_ecount(cchWebBase) LPWSTR wzWebBase, + __in DWORD cchWebBase + ); + +HRESULT DAPI MetaOpenKey( + __in IMSAdminBaseW* piMetabase, + __in METADATA_HANDLE mhKey, + __in_z LPCWSTR wzKey, + __in DWORD dwAccess, + __in DWORD cRetries, + __out METADATA_HANDLE* pmh + ); +HRESULT DAPI MetaGetValue( + __in IMSAdminBaseW* piMetabase, + __in METADATA_HANDLE mhKey, + __in_z LPCWSTR wzKey, + __inout METADATA_RECORD* pmr + ); +void DAPI MetaFreeValue( + __in METADATA_RECORD* pmr + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/osutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/osutil.h index 81a62f7dec..785e4abce4 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/osutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/osutil.h @@ -1,48 +1,48 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Operating system helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -enum OS_VERSION -{ - OS_VERSION_UNKNOWN, - OS_VERSION_WINNT, - OS_VERSION_WIN2000, - OS_VERSION_WINXP, - OS_VERSION_WIN2003, - OS_VERSION_VISTA, - OS_VERSION_WIN2008, - OS_VERSION_WIN7, - OS_VERSION_WIN2008_R2, - OS_VERSION_FUTURE -}; - -void DAPI OsGetVersion( - __out OS_VERSION* pVersion, - __out DWORD* pdwServicePack - ); -HRESULT OsIsRunningPrivileged( - __out BOOL* pfPrivileged - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Operating system helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +enum OS_VERSION +{ + OS_VERSION_UNKNOWN, + OS_VERSION_WINNT, + OS_VERSION_WIN2000, + OS_VERSION_WINXP, + OS_VERSION_WIN2003, + OS_VERSION_VISTA, + OS_VERSION_WIN2008, + OS_VERSION_WIN7, + OS_VERSION_WIN2008_R2, + OS_VERSION_FUTURE +}; + +void DAPI OsGetVersion( + __out OS_VERSION* pVersion, + __out DWORD* pdwServicePack + ); +HRESULT OsIsRunningPrivileged( + __out BOOL* pfPrivileged + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/pathutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/pathutil.h index eceb4785e2..f886c997f0 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/pathutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/pathutil.h @@ -1,90 +1,90 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for path helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -enum PATH_EXPAND -{ - PATH_EXPAND_ENVIRONMENT = 0x0001, - PATH_EXPAND_FULLPATH = 0x0002, -}; - -LPWSTR DAPI PathFile( - __in_z LPCWSTR wzPath - ); -HRESULT DAPI PathGetDirectory( - __in_z LPCWSTR wzPath, - __out LPWSTR *psczDirectory - ); -HRESULT DAPI PathExpand( - __out LPWSTR *psczFullPath, - __in_z LPCWSTR wzRelativePath, - __in DWORD dwResolveFlags - ); -HRESULT DAPI PathPrefix( - __inout LPWSTR *psczFullPath - ); -HRESULT DAPI PathBackslashTerminate( - __inout LPWSTR* psczPath - ); -HRESULT DAPI PathFixedBackslashTerminate( - __inout_ecount_z(cchPath) LPWSTR wzPath, - __in DWORD_PTR cchPath - ); -HRESULT DAPI PathForCurrentProcess( - __inout LPWSTR *psczFullPath, - __in_opt HMODULE hModule - ); -HRESULT DAPI PathRelativeToModule( - __inout LPWSTR *psczFullPath, - __in_opt LPCWSTR wzFileName, - __in_opt HMODULE hModule - ); -HRESULT DAPI PathCreateTempFile( - __in_opt LPCWSTR wzDirectory, - __in_opt __format_string LPCWSTR wzFileNameTemplate, - __in DWORD dwUniqueCount, - __in DWORD dwFileAttributes, - __out_opt LPWSTR* psczTempFile, - __out_opt HANDLE* phTempFile - ); -HRESULT DAPI PathCreateTempDirectory( - __in_opt LPCWSTR wzDirectory, - __in __format_string LPCWSTR wzDirectoryNameTemplate, - __in DWORD dwUniqueCount, - __out LPWSTR* psczTempDirectory - ); -HRESULT DAPI PathGetKnownFolder( - __in int csidl, - __out LPWSTR* psczKnownFolder - ); -BOOL DAPI PathIsAbsolute( - __in_z LPCWSTR wzPath - ); -HRESULT DAPI PathConcat( - __in_opt LPCWSTR wzPath1, - __in_opt LPCWSTR wzPath2, - __deref_out_z LPWSTR* psczCombined - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for path helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +enum PATH_EXPAND +{ + PATH_EXPAND_ENVIRONMENT = 0x0001, + PATH_EXPAND_FULLPATH = 0x0002, +}; + +LPWSTR DAPI PathFile( + __in_z LPCWSTR wzPath + ); +HRESULT DAPI PathGetDirectory( + __in_z LPCWSTR wzPath, + __out LPWSTR *psczDirectory + ); +HRESULT DAPI PathExpand( + __out LPWSTR *psczFullPath, + __in_z LPCWSTR wzRelativePath, + __in DWORD dwResolveFlags + ); +HRESULT DAPI PathPrefix( + __inout LPWSTR *psczFullPath + ); +HRESULT DAPI PathBackslashTerminate( + __inout LPWSTR* psczPath + ); +HRESULT DAPI PathFixedBackslashTerminate( + __inout_ecount_z(cchPath) LPWSTR wzPath, + __in DWORD_PTR cchPath + ); +HRESULT DAPI PathForCurrentProcess( + __inout LPWSTR *psczFullPath, + __in_opt HMODULE hModule + ); +HRESULT DAPI PathRelativeToModule( + __inout LPWSTR *psczFullPath, + __in_opt LPCWSTR wzFileName, + __in_opt HMODULE hModule + ); +HRESULT DAPI PathCreateTempFile( + __in_opt LPCWSTR wzDirectory, + __in_opt __format_string LPCWSTR wzFileNameTemplate, + __in DWORD dwUniqueCount, + __in DWORD dwFileAttributes, + __out_opt LPWSTR* psczTempFile, + __out_opt HANDLE* phTempFile + ); +HRESULT DAPI PathCreateTempDirectory( + __in_opt LPCWSTR wzDirectory, + __in __format_string LPCWSTR wzDirectoryNameTemplate, + __in DWORD dwUniqueCount, + __out LPWSTR* psczTempDirectory + ); +HRESULT DAPI PathGetKnownFolder( + __in int csidl, + __out LPWSTR* psczKnownFolder + ); +BOOL DAPI PathIsAbsolute( + __in_z LPCWSTR wzPath + ); +HRESULT DAPI PathConcat( + __in_opt LPCWSTR wzPath1, + __in_opt LPCWSTR wzPath2, + __deref_out_z LPWSTR* psczCombined + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/perfutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/perfutil.h index 3a3f0723dc..9c7c87a1c6 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/perfutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/perfutil.h @@ -1,39 +1,39 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Performance helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -// structs - - -// functions -void DAPI PerfInitialize( - ); -void DAPI PerfClickTime( - __out_opt LARGE_INTEGER* pliElapsed - ); -double DAPI PerfConvertToSeconds( - __in const LARGE_INTEGER* pli - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Performance helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +// structs + + +// functions +void DAPI PerfInitialize( + ); +void DAPI PerfClickTime( + __out_opt LARGE_INTEGER* pliElapsed + ); +double DAPI PerfConvertToSeconds( + __in const LARGE_INTEGER* pli + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/procutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/procutil.h index 3d5d3bda9d..007dd3ec44 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/procutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/procutil.h @@ -1,54 +1,54 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for proces helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI ProcExecute( - __in_z LPWSTR wzCommand, - __out HANDLE *phProcess, - __out_opt HANDLE *phChildStdIn, - __out_opt HANDLE *phChildStdOutErr - ); -HRESULT DAPI ProcWaitForCompletion( - __in HANDLE hProcess, - __in DWORD dwTimeout, - __out DWORD *pReturnCode - ); -HRESULT DAPI ProcWaitForIds( - __in_ecount(cProcessIds) const DWORD* pdwProcessIds, - __in DWORD cProcessIds, - __in DWORD dwMilliseconds - ); -HRESULT DAPI ProcCloseIds( - __in_ecount(cProcessIds) const DWORD* pdwProcessIds, - __in DWORD cProcessIds - ); - -// following code in proc2utl.cpp due to dependency on PSAPI.DLL. -HRESULT DAPI ProcFindAllIdsFromExeName( - __in_z LPCWSTR wzExeName, - __out DWORD** ppdwProcessIds, - __out DWORD* pcProcessIds - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for proces helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI ProcExecute( + __in_z LPWSTR wzCommand, + __out HANDLE *phProcess, + __out_opt HANDLE *phChildStdIn, + __out_opt HANDLE *phChildStdOutErr + ); +HRESULT DAPI ProcWaitForCompletion( + __in HANDLE hProcess, + __in DWORD dwTimeout, + __out DWORD *pReturnCode + ); +HRESULT DAPI ProcWaitForIds( + __in_ecount(cProcessIds) const DWORD* pdwProcessIds, + __in DWORD cProcessIds, + __in DWORD dwMilliseconds + ); +HRESULT DAPI ProcCloseIds( + __in_ecount(cProcessIds) const DWORD* pdwProcessIds, + __in DWORD cProcessIds + ); + +// following code in proc2utl.cpp due to dependency on PSAPI.DLL. +HRESULT DAPI ProcFindAllIdsFromExeName( + __in_z LPCWSTR wzExeName, + __out DWORD** ppdwProcessIds, + __out DWORD* pcProcessIds + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/regutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/regutil.h index f9f1276ce7..65f8b1f202 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/regutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/regutil.h @@ -1,32 +1,32 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Registry helper functions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseRegKey(h) if (h) { ::RegCloseKey(h); h = NULL; } - - -#ifdef __cplusplus -} -#endif - +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Registry helper functions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseRegKey(h) if (h) { ::RegCloseKey(h); h = NULL; } + + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/resrutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/resrutil.h index 79b1687b8c..1f1309975b 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/resrutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/resrutil.h @@ -1,60 +1,60 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Resource read helper functions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI ResGetStringLangId( - __in_opt LPCWSTR wzPath, - __in UINT uID, - __out WORD *pwLangId - ); - -HRESULT DAPI ResReadString( - __in HINSTANCE hinst, - __in UINT uID, - __deref_out_z LPWSTR* ppwzString - ); - -HRESULT DAPI ResReadStringAnsi( - __in HINSTANCE hinst, - __in UINT uID, - __deref_out_z LPSTR* ppszString - ); - -HRESULT DAPI ResReadData( - __in_opt HINSTANCE hinst, - __in_z LPCSTR szDataName, - __deref_out_bcount(*pcb) PVOID *ppv, - __out DWORD *pcb - ); - -HRESULT DAPI ResExportDataToFile( - __in_z LPCSTR szDataName, - __in_z LPCWSTR wzTargetFile, - __in DWORD dwCreationDisposition - ); - -#ifdef __cplusplus -} -#endif - +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Resource read helper functions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI ResGetStringLangId( + __in_opt LPCWSTR wzPath, + __in UINT uID, + __out WORD *pwLangId + ); + +HRESULT DAPI ResReadString( + __in HINSTANCE hinst, + __in UINT uID, + __deref_out_z LPWSTR* ppwzString + ); + +HRESULT DAPI ResReadStringAnsi( + __in HINSTANCE hinst, + __in UINT uID, + __deref_out_z LPSTR* ppszString + ); + +HRESULT DAPI ResReadData( + __in_opt HINSTANCE hinst, + __in_z LPCSTR szDataName, + __deref_out_bcount(*pcb) PVOID *ppv, + __out DWORD *pcb + ); + +HRESULT DAPI ResExportDataToFile( + __in_z LPCSTR szDataName, + __in_z LPCWSTR wzTargetFile, + __in DWORD dwCreationDisposition + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/reswutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/reswutil.h index d7a026771c..746c949fe6 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/reswutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/reswutil.h @@ -1,48 +1,48 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Resource writer helper functions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI ResWriteString( - __in_z LPCWSTR wzResourceFile, - __in DWORD dwDataId, - __in_z LPCWSTR wzData, - __in WORD wLangId - ); - -HRESULT DAPI ResWriteData( - __in_z LPCWSTR wzResourceFile, - __in_z LPCSTR szDataName, - __in PVOID pData, - __in DWORD cbData - ); - -HRESULT DAPI ResImportDataFromFile( - __in_z LPCWSTR wzTargetFile, - __in_z LPCWSTR wzSourceFile, - __in_z LPCSTR szDataName - ); - -#ifdef __cplusplus -} -#endif +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Resource writer helper functions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI ResWriteString( + __in_z LPCWSTR wzResourceFile, + __in DWORD dwDataId, + __in_z LPCWSTR wzData, + __in WORD wLangId + ); + +HRESULT DAPI ResWriteData( + __in_z LPCWSTR wzResourceFile, + __in_z LPCSTR szDataName, + __in PVOID pData, + __in DWORD cbData + ); + +HRESULT DAPI ResImportDataFromFile( + __in_z LPCWSTR wzTargetFile, + __in_z LPCWSTR wzSourceFile, + __in_z LPCSTR szDataName + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/rexutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/rexutil.h index a1a7d9d569..503a3c95b1 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/rexutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/rexutil.h @@ -1,69 +1,69 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Resource Cabinet Extract Utilities -// -//------------------------------------------------------------------------------------------------- - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// defines -#define FILETABLESIZE 40 - -// structs -struct MEM_FILE -{ - LPCBYTE vpStart; - UINT uiCurrent; - UINT uiLength; -}; - -enum FAKE_FILE_TYPE { NORMAL_FILE, MEMORY_FILE }; - -typedef HRESULT (*REX_CALLBACK_PROGRESS)(BOOL fBeginFile, LPCWSTR wzFileId, LPVOID pvContext); -typedef VOID (*REX_CALLBACK_WRITE)(UINT cb); - - -struct FAKE_FILE // used __in internal file table -{ - BOOL fUsed; - FAKE_FILE_TYPE fftType; - MEM_FILE mfFile; // State for memory file - HANDLE hFile; // Handle for disk file -}; - -// functions -HRESULT RexInitialize(); -void RexUninitialize(); - -HRESULT RexExtract( - __in_z LPCSTR szResource, - __in_z LPCWSTR wzExtractId, - __in_z LPCWSTR wzExtractDir, - __in_z LPCWSTR wzExtractName, - __in REX_CALLBACK_PROGRESS pfnProgress, - __in REX_CALLBACK_WRITE pfnWrite, - __in LPVOID pvContext - ); - -#ifdef __cplusplus -} -#endif - +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Resource Cabinet Extract Utilities +// +//------------------------------------------------------------------------------------------------- + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// defines +#define FILETABLESIZE 40 + +// structs +struct MEM_FILE +{ + LPCBYTE vpStart; + UINT uiCurrent; + UINT uiLength; +}; + +enum FAKE_FILE_TYPE { NORMAL_FILE, MEMORY_FILE }; + +typedef HRESULT (*REX_CALLBACK_PROGRESS)(BOOL fBeginFile, LPCWSTR wzFileId, LPVOID pvContext); +typedef VOID (*REX_CALLBACK_WRITE)(UINT cb); + + +struct FAKE_FILE // used __in internal file table +{ + BOOL fUsed; + FAKE_FILE_TYPE fftType; + MEM_FILE mfFile; // State for memory file + HANDLE hFile; // Handle for disk file +}; + +// functions +HRESULT RexInitialize(); +void RexUninitialize(); + +HRESULT RexExtract( + __in_z LPCSTR szResource, + __in_z LPCWSTR wzExtractId, + __in_z LPCWSTR wzExtractDir, + __in_z LPCWSTR wzExtractName, + __in REX_CALLBACK_PROGRESS pfnProgress, + __in REX_CALLBACK_WRITE pfnWrite, + __in LPVOID pvContext + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/rssutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/rssutil.h index febdb2db84..e9ee4fe57a 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/rssutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/rssutil.h @@ -1,106 +1,106 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// RSS helper funtions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseRssChannel(p) if (p) { RssFreeChannel(p); } -#define ReleaseNullRssChannel(p) if (p) { RssFreeChannel(p); p = NULL; } - - -struct RSS_UNKNOWN_ATTRIBUTE -{ - LPWSTR wzNamespace; - LPWSTR wzAttribute; - LPWSTR wzValue; - - RSS_UNKNOWN_ATTRIBUTE* pNext; -}; - -struct RSS_UNKNOWN_ELEMENT -{ - LPWSTR wzNamespace; - LPWSTR wzElement; - LPWSTR wzValue; - - RSS_UNKNOWN_ATTRIBUTE* pAttributes; - RSS_UNKNOWN_ELEMENT* pNext; -}; - -struct RSS_ITEM -{ - LPWSTR wzTitle; - LPWSTR wzLink; - LPWSTR wzDescription; - - LPWSTR wzGuid; - FILETIME ftPublished; - - LPWSTR wzEnclosureUrl; - DWORD dwEnclosureSize; - LPWSTR wzEnclosureType; - - RSS_UNKNOWN_ELEMENT* pUnknownElements; -}; - -struct RSS_CHANNEL -{ - LPWSTR wzTitle; - LPWSTR wzLink; - LPWSTR wzDescription; - DWORD dwTimeToLive; - - RSS_UNKNOWN_ELEMENT* pUnknownElements; - - DWORD cItems; - RSS_ITEM rgItems[1]; -}; - -HRESULT DAPI RssInitialize( - ); - -void DAPI RssUninitialize( - ); - -HRESULT DAPI RssParseFromString( - __in_z LPCWSTR wzRssString, - __out RSS_CHANNEL **ppChannel - ); - -HRESULT DAPI RssParseFromFile( - __in_z LPCWSTR wzRssFile, - __out RSS_CHANNEL **ppChannel - ); - -// Adding this until we have the updated specstrings.h -#ifndef __in_xcount -#define __in_xcount(size) -#endif - -void DAPI RssFreeChannel( - __in_xcount(pChannel->cItems) RSS_CHANNEL *pChannel - ); - -#ifdef __cplusplus -} -#endif - +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// RSS helper funtions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseRssChannel(p) if (p) { RssFreeChannel(p); } +#define ReleaseNullRssChannel(p) if (p) { RssFreeChannel(p); p = NULL; } + + +struct RSS_UNKNOWN_ATTRIBUTE +{ + LPWSTR wzNamespace; + LPWSTR wzAttribute; + LPWSTR wzValue; + + RSS_UNKNOWN_ATTRIBUTE* pNext; +}; + +struct RSS_UNKNOWN_ELEMENT +{ + LPWSTR wzNamespace; + LPWSTR wzElement; + LPWSTR wzValue; + + RSS_UNKNOWN_ATTRIBUTE* pAttributes; + RSS_UNKNOWN_ELEMENT* pNext; +}; + +struct RSS_ITEM +{ + LPWSTR wzTitle; + LPWSTR wzLink; + LPWSTR wzDescription; + + LPWSTR wzGuid; + FILETIME ftPublished; + + LPWSTR wzEnclosureUrl; + DWORD dwEnclosureSize; + LPWSTR wzEnclosureType; + + RSS_UNKNOWN_ELEMENT* pUnknownElements; +}; + +struct RSS_CHANNEL +{ + LPWSTR wzTitle; + LPWSTR wzLink; + LPWSTR wzDescription; + DWORD dwTimeToLive; + + RSS_UNKNOWN_ELEMENT* pUnknownElements; + + DWORD cItems; + RSS_ITEM rgItems[1]; +}; + +HRESULT DAPI RssInitialize( + ); + +void DAPI RssUninitialize( + ); + +HRESULT DAPI RssParseFromString( + __in_z LPCWSTR wzRssString, + __out RSS_CHANNEL **ppChannel + ); + +HRESULT DAPI RssParseFromFile( + __in_z LPCWSTR wzRssFile, + __out RSS_CHANNEL **ppChannel + ); + +// Adding this until we have the updated specstrings.h +#ifndef __in_xcount +#define __in_xcount(size) +#endif + +void DAPI RssFreeChannel( + __in_xcount(pChannel->cItems) RSS_CHANNEL *pChannel + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/shelutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/shelutil.h index 4f771f62fb..2b24c7388f 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/shelutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/shelutil.h @@ -1,58 +1,58 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for proces helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifndef REFKNOWNFOLDERID -#define REFKNOWNFOLDERID REFGUID -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI ShelExec( - __in_z LPCWSTR wzTargetPath, - __in_opt LPCWSTR wzParameters, - __in_opt LPCWSTR wzVerb, - __in_opt LPCWSTR wzWorkingDirectory, - __in int nShowCmd, - __out_opt HINSTANCE* phInstance - ); - -HRESULT DAPI ShelExecEx( - __in_z LPCWSTR wzTargetPath, - __in_z_opt LPCWSTR wzParameters, - __in_z_opt LPCWSTR wzVerb, - __in_z_opt LPCWSTR wzWorkingDirectory, - __in int nShowCmd, - __out_opt HINSTANCE* phInstance - ); - -HRESULT DAPI ShelGetFolder( - __out_z LPWSTR* psczFolderPath, - __in int csidlFolder - ); - -HRESULT DAPI ShelGetKnownFolder( - __out_z LPWSTR* psczFolderPath, - __in REFKNOWNFOLDERID rfidFolder - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for proces helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifndef REFKNOWNFOLDERID +#define REFKNOWNFOLDERID REFGUID +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI ShelExec( + __in_z LPCWSTR wzTargetPath, + __in_opt LPCWSTR wzParameters, + __in_opt LPCWSTR wzVerb, + __in_opt LPCWSTR wzWorkingDirectory, + __in int nShowCmd, + __out_opt HINSTANCE* phInstance + ); + +HRESULT DAPI ShelExecEx( + __in_z LPCWSTR wzTargetPath, + __in_z_opt LPCWSTR wzParameters, + __in_z_opt LPCWSTR wzVerb, + __in_z_opt LPCWSTR wzWorkingDirectory, + __in int nShowCmd, + __out_opt HINSTANCE* phInstance + ); + +HRESULT DAPI ShelGetFolder( + __out_z LPWSTR* psczFolderPath, + __in int csidlFolder + ); + +HRESULT DAPI ShelGetKnownFolder( + __out_z LPWSTR* psczFolderPath, + __in REFKNOWNFOLDERID rfidFolder + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/sqlutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/sqlutil.h index da550b6b84..bfb04e14c6 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/sqlutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/sqlutil.h @@ -1,151 +1,151 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// SQL helper functions. -// -//------------------------------------------------------------------------------------------------- - -#include -#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -// Adding this until the SQL annotations are published to specstrings.h -#ifndef __sql_command -#define __sql_command -#endif - -// structs -struct SQL_FILESPEC -{ - WCHAR wzName[MAX_PATH]; - WCHAR wzFilename[MAX_PATH]; - WCHAR wzSize[MAX_PATH]; - WCHAR wzMaxSize[MAX_PATH]; - WCHAR wzGrow[MAX_PATH]; -}; - - -// functions -HRESULT DAPI SqlConnectDatabase( - __in_z LPCWSTR wzServer, - __in_z LPCWSTR wzInstance, - __in_z LPCWSTR wzDatabase, - __in BOOL fIntegratedAuth, - __in_z LPCWSTR wzUser, - __in_z LPCWSTR wzPassword, - __out IDBCreateSession** ppidbSession - ); -HRESULT DAPI SqlStartTransaction( - __in IDBCreateSession* pidbSession, - __out IDBCreateCommand** ppidbCommand, - __out ITransaction** ppit - ); -HRESULT DAPI SqlEndTransaction( - __in ITransaction* pit, - __in BOOL fCommit - ); -HRESULT DAPI SqlDatabaseExists( - __in_z LPCWSTR wzServer, - __in_z LPCWSTR wzInstance, - __in_z LPCWSTR wzDatabase, - __in BOOL fIntegratedAuth, - __in_z LPCWSTR wzUser, - __in_z LPCWSTR wzPassword, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlSessionDatabaseExists( - __in IDBCreateSession* pidbSession, - __in_z LPCWSTR wzDatabase, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlDatabaseEnsureExists( - __in_z LPCWSTR wzServer, - __in_z LPCWSTR wzInstance, - __in_z LPCWSTR wzDatabase, - __in BOOL fIntegratedAuth, - __in_z LPCWSTR wzUser, - __in_z LPCWSTR wzPassword, - __in_opt const SQL_FILESPEC* psfDatabase, - __in_opt const SQL_FILESPEC* psfLog, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlSessionDatabaseEnsureExists( - __in IDBCreateSession* pidbSession, - __in_z LPCWSTR wzDatabase, - __in_opt const SQL_FILESPEC* psfDatabase, - __in_opt const SQL_FILESPEC* psfLog, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlCreateDatabase( - __in_z LPCWSTR wzServer, - __in_z LPCWSTR wzInstance, - __in_z LPCWSTR wzDatabase, - __in BOOL fIntegratedAuth, - __in_z LPCWSTR wzUser, - __in_z LPCWSTR wzPassword, - __in_opt const SQL_FILESPEC* psfDatabase, - __in_opt const SQL_FILESPEC* psfLog, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlSessionCreateDatabase( - __in IDBCreateSession* pidbSession, - __in_z LPCWSTR wzDatabase, - __in_opt const SQL_FILESPEC* psfDatabase, - __in_opt const SQL_FILESPEC* psfLog, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlDropDatabase( - __in_z LPCWSTR wzServer, - __in_z LPCWSTR wzInstance, - __in_z LPCWSTR wzDatabase, - __in BOOL fIntegratedAuth, - __in_z LPCWSTR wzUser, - __in_z LPCWSTR wzPassword, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlSessionDropDatabase( - __in IDBCreateSession* pidbSession, - __in_z LPCWSTR wzDatabase, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlSessionExecuteQuery( - __in IDBCreateSession* pidbSession, - __in __sql_command LPCWSTR wzSql, - __out_opt IRowset** ppirs, - __out_opt DBROWCOUNT* pcRows, - __out_opt BSTR* pbstrErrorDescription - ); -HRESULT DAPI SqlCommandExecuteQuery( - __in IDBCreateCommand* pidbCommand, - __in __sql_command LPCWSTR wzSql, - __out IRowset** ppirs, - __out DBROWCOUNT* pcRows - ); -HRESULT DAPI SqlGetErrorInfo( - __in IUnknown* pObjectWithError, - __in REFIID IID_InterfaceWithError, - __in DWORD dwLocaleId, - __out_opt BSTR* pbstrErrorSource, - __out_opt BSTR* pbstrErrorDescription - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// SQL helper functions. +// +//------------------------------------------------------------------------------------------------- + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +// Adding this until the SQL annotations are published to specstrings.h +#ifndef __sql_command +#define __sql_command +#endif + +// structs +struct SQL_FILESPEC +{ + WCHAR wzName[MAX_PATH]; + WCHAR wzFilename[MAX_PATH]; + WCHAR wzSize[MAX_PATH]; + WCHAR wzMaxSize[MAX_PATH]; + WCHAR wzGrow[MAX_PATH]; +}; + + +// functions +HRESULT DAPI SqlConnectDatabase( + __in_z LPCWSTR wzServer, + __in_z LPCWSTR wzInstance, + __in_z LPCWSTR wzDatabase, + __in BOOL fIntegratedAuth, + __in_z LPCWSTR wzUser, + __in_z LPCWSTR wzPassword, + __out IDBCreateSession** ppidbSession + ); +HRESULT DAPI SqlStartTransaction( + __in IDBCreateSession* pidbSession, + __out IDBCreateCommand** ppidbCommand, + __out ITransaction** ppit + ); +HRESULT DAPI SqlEndTransaction( + __in ITransaction* pit, + __in BOOL fCommit + ); +HRESULT DAPI SqlDatabaseExists( + __in_z LPCWSTR wzServer, + __in_z LPCWSTR wzInstance, + __in_z LPCWSTR wzDatabase, + __in BOOL fIntegratedAuth, + __in_z LPCWSTR wzUser, + __in_z LPCWSTR wzPassword, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlSessionDatabaseExists( + __in IDBCreateSession* pidbSession, + __in_z LPCWSTR wzDatabase, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlDatabaseEnsureExists( + __in_z LPCWSTR wzServer, + __in_z LPCWSTR wzInstance, + __in_z LPCWSTR wzDatabase, + __in BOOL fIntegratedAuth, + __in_z LPCWSTR wzUser, + __in_z LPCWSTR wzPassword, + __in_opt const SQL_FILESPEC* psfDatabase, + __in_opt const SQL_FILESPEC* psfLog, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlSessionDatabaseEnsureExists( + __in IDBCreateSession* pidbSession, + __in_z LPCWSTR wzDatabase, + __in_opt const SQL_FILESPEC* psfDatabase, + __in_opt const SQL_FILESPEC* psfLog, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlCreateDatabase( + __in_z LPCWSTR wzServer, + __in_z LPCWSTR wzInstance, + __in_z LPCWSTR wzDatabase, + __in BOOL fIntegratedAuth, + __in_z LPCWSTR wzUser, + __in_z LPCWSTR wzPassword, + __in_opt const SQL_FILESPEC* psfDatabase, + __in_opt const SQL_FILESPEC* psfLog, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlSessionCreateDatabase( + __in IDBCreateSession* pidbSession, + __in_z LPCWSTR wzDatabase, + __in_opt const SQL_FILESPEC* psfDatabase, + __in_opt const SQL_FILESPEC* psfLog, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlDropDatabase( + __in_z LPCWSTR wzServer, + __in_z LPCWSTR wzInstance, + __in_z LPCWSTR wzDatabase, + __in BOOL fIntegratedAuth, + __in_z LPCWSTR wzUser, + __in_z LPCWSTR wzPassword, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlSessionDropDatabase( + __in IDBCreateSession* pidbSession, + __in_z LPCWSTR wzDatabase, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlSessionExecuteQuery( + __in IDBCreateSession* pidbSession, + __in __sql_command LPCWSTR wzSql, + __out_opt IRowset** ppirs, + __out_opt DBROWCOUNT* pcRows, + __out_opt BSTR* pbstrErrorDescription + ); +HRESULT DAPI SqlCommandExecuteQuery( + __in IDBCreateCommand* pidbCommand, + __in __sql_command LPCWSTR wzSql, + __out IRowset** ppirs, + __out DBROWCOUNT* pcRows + ); +HRESULT DAPI SqlGetErrorInfo( + __in IUnknown* pObjectWithError, + __in REFIID IID_InterfaceWithError, + __in DWORD dwLocaleId, + __out_opt BSTR* pbstrErrorSource, + __out_opt BSTR* pbstrErrorDescription + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/strutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/strutil.h index fb6f14eeab..07b0f58e30 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/strutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/strutil.h @@ -1,256 +1,256 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for string helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define ReleaseStr(pwz) if (pwz) { StrFree(pwz); } -#define ReleaseNullStr(pwz) if (pwz) { StrFree(pwz); pwz = NULL; } -#define ReleaseBSTR(bstr) if (bstr) { ::SysFreeString(bstr); } -#define ReleaseNullBSTR(bstr) if (bstr) { ::SysFreeString(bstr); bstr = NULL; } -#define ReleaseNullStrArray(rg, c) { if (rg) { StrArrayFree(rg, c); c = 0; rg = NULL; } } - -#define DeclareConstBSTR(bstr_const, wz) const WCHAR bstr_const[] = { 0x00, 0x00, sizeof(wz)-sizeof(WCHAR), 0x00, wz } -#define UseConstBSTR(bstr_const) const_cast(bstr_const + 4) - -HRESULT DAPI StrAlloc( - __deref_out_ecount_part(cch, 0) LPWSTR* ppwz, - __in DWORD_PTR cch - ); -HRESULT DAPI StrTrimCapacity( - __deref_out LPWSTR* ppwz - ); -HRESULT DAPI StrAnsiAlloc( - __deref_out_ecount_part(cch, 0) LPSTR* ppz, - __in DWORD_PTR cch - ); -HRESULT DAPI StrAnsiTrimCapacity( - __deref_out LPSTR* ppz - ); -HRESULT DAPI StrAllocString( - __deref_out_ecount_z(cchSource+1) LPWSTR* ppwz, - __in_z LPCWSTR wzSource, - __in DWORD_PTR cchSource - ); -HRESULT DAPI StrAnsiAllocString( - __deref_out_ecount_z(cchSource+1) LPSTR* ppsz, - __in_z LPCWSTR wzSource, - __in DWORD_PTR cchSource, - __in UINT uiCodepage - ); -HRESULT DAPI StrAllocStringAnsi( - __deref_out_ecount_z(cchSource+1) LPWSTR* ppwz, - __in_z LPCSTR szSource, - __in DWORD_PTR cchSource, - __in UINT uiCodepage - ); -HRESULT DAPI StrAllocPrefix( - __deref_out_z LPWSTR* ppwz, - __in_z LPCWSTR wzPrefix, - __in DWORD_PTR cchPrefix - ); -HRESULT DAPI StrAllocConcat( - __deref_out_z LPWSTR* ppwz, - __in_z LPCWSTR wzSource, - __in DWORD_PTR cchSource - ); -HRESULT DAPI StrAnsiAllocConcat( - __deref_out_z LPSTR* ppz, - __in_z LPCSTR pzSource, - __in DWORD_PTR cchSource - ); -HRESULT __cdecl StrAllocFormatted( - __deref_out_z LPWSTR* ppwz, - __in __format_string LPCWSTR wzFormat, - ... - ); -HRESULT __cdecl StrAnsiAllocFormatted( - __deref_out_z LPSTR* ppsz, - __in __format_string LPCSTR szFormat, - ... - ); -HRESULT DAPI StrAllocFormattedArgs( - __deref_out_z LPWSTR* ppwz, - __in __format_string LPCWSTR wzFormat, - __in va_list args - ); -HRESULT DAPI StrAnsiAllocFormattedArgs( - __deref_out_z LPSTR* ppsz, - __in __format_string LPCSTR szFormat, - __in va_list args - ); -HRESULT DAPI StrAllocFromError( - __inout LPWSTR *ppwzMessage, - __in HRESULT hrError, - __in_opt HMODULE hModule, - ... - ); - -HRESULT DAPI StrMaxLength( - __in LPCVOID p, - __out DWORD_PTR* pcch - ); -HRESULT DAPI StrSize( - __in LPCVOID p, - __out DWORD_PTR* pcb - ); - -HRESULT DAPI StrFree( - __in LPVOID p - ); - -HRESULT DAPI StrCurrentTime( - __deref_out_z LPWSTR* ppwz, - __in BOOL fGMT - ); -HRESULT DAPI StrCurrentDateTime( - __deref_out_z LPWSTR* ppwz, - __in BOOL fGMT - ); - -HRESULT DAPI StrReplaceStringAll( - __inout LPWSTR* ppwzOriginal, - __in_z LPCWSTR wzOldSubString, - __in_z LPCWSTR wzNewSubString - ); -HRESULT DAPI StrReplaceString( - __inout LPWSTR* ppwzOriginal, - __inout DWORD* pdwStartIndex, - __in_z LPCWSTR wzOldSubString, - __in_z LPCWSTR wzNewSubString - ); - -HRESULT DAPI StrHexEncode( - __in_ecount(cbSource) const BYTE* pbSource, - __in DWORD_PTR cbSource, - __out_ecount(cchDest) LPWSTR wzDest, - __in DWORD_PTR cchDest - ); -HRESULT DAPI StrHexDecode( - __in_z LPCWSTR wzSource, - __out_bcount(cbDest) BYTE* pbDest, - __in DWORD_PTR cbDest - ); - -HRESULT DAPI StrAllocBase85Encode( - __in_bcount(cbSource) const BYTE* pbSource, - __in DWORD_PTR cbSource, - __deref_out_z LPWSTR* pwzDest - ); -HRESULT DAPI StrAllocBase85Decode( - __in_z LPCWSTR wzSource, - __deref_out_bcount(*pcbDest) BYTE** hbDest, - __out DWORD_PTR* pcbDest - ); - -HRESULT DAPI MultiSzLen( - __in_z LPCWSTR pwzMultiSz, - __out DWORD_PTR* pcch - ); -HRESULT DAPI MultiSzPrepend( - __deref_inout_z LPWSTR* ppwzMultiSz, - __inout_opt DWORD_PTR *pcchMultiSz, - __in_z LPCWSTR pwzInsert - ); -HRESULT DAPI MultiSzFindSubstring( - __in_z LPCWSTR pwzMultiSz, - __in_z LPCWSTR pwzSubstring, - __out_opt DWORD_PTR* pdwIndex, - __deref_opt_out_z LPCWSTR* ppwzFoundIn - ); -HRESULT DAPI MultiSzFindString( - __in_z LPCWSTR pwzMultiSz, - __in_z LPCWSTR pwzString, - __out_opt DWORD_PTR* pdwIndex, - __deref_opt_out_z LPCWSTR* ppwzFound - ); -HRESULT DAPI MultiSzRemoveString( - __deref_inout_z LPWSTR* ppwzMultiSz, - __in DWORD_PTR dwIndex - ); -HRESULT DAPI MultiSzInsertString( - __deref_inout_z LPWSTR* ppwzMultiSz, - __inout_opt DWORD_PTR *pcchMultiSz, - __in DWORD_PTR dwIndex, - __in_z LPCWSTR pwzInsert - ); -HRESULT DAPI MultiSzReplaceString( - __deref_inout_z LPWSTR* ppwzMultiSz, - __in DWORD_PTR dwIndex, - __in_z LPCWSTR pwzString - ); - -LPCWSTR wcsistr( - __in_z LPCWSTR wzString, - __in_z LPCWSTR wzCharSet - ); - -HRESULT DAPI StrStringToInt16( - __in_z LPCWSTR wzIn, - __in DWORD cchIn, - __out SHORT* psOut - ); -HRESULT DAPI StrStringToUInt16( - __in_z LPCWSTR wzIn, - __in DWORD cchIn, - __out USHORT* pusOut - ); -HRESULT DAPI StrStringToInt32( - __in_z LPCWSTR wzIn, - __in DWORD cchIn, - __out INT* piOut - ); -HRESULT DAPI StrStringToUInt32( - __in_z LPCWSTR wzIn, - __in DWORD cchIn, - __out UINT* puiOut - ); -HRESULT DAPI StrStringToInt64( - __in_z LPCWSTR wzIn, - __in DWORD cchIn, - __out LONGLONG* pllOut - ); -HRESULT DAPI StrStringToUInt64( - __in_z LPCWSTR wzIn, - __in DWORD cchIn, - __out ULONGLONG* pullOut - ); -void DAPI StrStringToUpper( - __inout_z LPWSTR wzIn - ); -void DAPI StrStringToLower( - __inout_z LPWSTR wzIn - ); - -HRESULT DAPI StrArrayAllocString( - __deref_inout_ecount(*pcStrArray) LPWSTR **prgsczStrArray, - __inout LPUINT pcStrArray, - __in_z LPCWSTR wzSource, - __in DWORD_PTR cchSource - ); - -HRESULT DAPI StrArrayFree( - __in_ecount(cStrArray) LPWSTR *rgsczStrArray, - __in UINT cStrArray - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for string helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define ReleaseStr(pwz) if (pwz) { StrFree(pwz); } +#define ReleaseNullStr(pwz) if (pwz) { StrFree(pwz); pwz = NULL; } +#define ReleaseBSTR(bstr) if (bstr) { ::SysFreeString(bstr); } +#define ReleaseNullBSTR(bstr) if (bstr) { ::SysFreeString(bstr); bstr = NULL; } +#define ReleaseNullStrArray(rg, c) { if (rg) { StrArrayFree(rg, c); c = 0; rg = NULL; } } + +#define DeclareConstBSTR(bstr_const, wz) const WCHAR bstr_const[] = { 0x00, 0x00, sizeof(wz)-sizeof(WCHAR), 0x00, wz } +#define UseConstBSTR(bstr_const) const_cast(bstr_const + 4) + +HRESULT DAPI StrAlloc( + __deref_out_ecount_part(cch, 0) LPWSTR* ppwz, + __in DWORD_PTR cch + ); +HRESULT DAPI StrTrimCapacity( + __deref_out LPWSTR* ppwz + ); +HRESULT DAPI StrAnsiAlloc( + __deref_out_ecount_part(cch, 0) LPSTR* ppz, + __in DWORD_PTR cch + ); +HRESULT DAPI StrAnsiTrimCapacity( + __deref_out LPSTR* ppz + ); +HRESULT DAPI StrAllocString( + __deref_out_ecount_z(cchSource+1) LPWSTR* ppwz, + __in_z LPCWSTR wzSource, + __in DWORD_PTR cchSource + ); +HRESULT DAPI StrAnsiAllocString( + __deref_out_ecount_z(cchSource+1) LPSTR* ppsz, + __in_z LPCWSTR wzSource, + __in DWORD_PTR cchSource, + __in UINT uiCodepage + ); +HRESULT DAPI StrAllocStringAnsi( + __deref_out_ecount_z(cchSource+1) LPWSTR* ppwz, + __in_z LPCSTR szSource, + __in DWORD_PTR cchSource, + __in UINT uiCodepage + ); +HRESULT DAPI StrAllocPrefix( + __deref_out_z LPWSTR* ppwz, + __in_z LPCWSTR wzPrefix, + __in DWORD_PTR cchPrefix + ); +HRESULT DAPI StrAllocConcat( + __deref_out_z LPWSTR* ppwz, + __in_z LPCWSTR wzSource, + __in DWORD_PTR cchSource + ); +HRESULT DAPI StrAnsiAllocConcat( + __deref_out_z LPSTR* ppz, + __in_z LPCSTR pzSource, + __in DWORD_PTR cchSource + ); +HRESULT __cdecl StrAllocFormatted( + __deref_out_z LPWSTR* ppwz, + __in __format_string LPCWSTR wzFormat, + ... + ); +HRESULT __cdecl StrAnsiAllocFormatted( + __deref_out_z LPSTR* ppsz, + __in __format_string LPCSTR szFormat, + ... + ); +HRESULT DAPI StrAllocFormattedArgs( + __deref_out_z LPWSTR* ppwz, + __in __format_string LPCWSTR wzFormat, + __in va_list args + ); +HRESULT DAPI StrAnsiAllocFormattedArgs( + __deref_out_z LPSTR* ppsz, + __in __format_string LPCSTR szFormat, + __in va_list args + ); +HRESULT DAPI StrAllocFromError( + __inout LPWSTR *ppwzMessage, + __in HRESULT hrError, + __in_opt HMODULE hModule, + ... + ); + +HRESULT DAPI StrMaxLength( + __in LPCVOID p, + __out DWORD_PTR* pcch + ); +HRESULT DAPI StrSize( + __in LPCVOID p, + __out DWORD_PTR* pcb + ); + +HRESULT DAPI StrFree( + __in LPVOID p + ); + +HRESULT DAPI StrCurrentTime( + __deref_out_z LPWSTR* ppwz, + __in BOOL fGMT + ); +HRESULT DAPI StrCurrentDateTime( + __deref_out_z LPWSTR* ppwz, + __in BOOL fGMT + ); + +HRESULT DAPI StrReplaceStringAll( + __inout LPWSTR* ppwzOriginal, + __in_z LPCWSTR wzOldSubString, + __in_z LPCWSTR wzNewSubString + ); +HRESULT DAPI StrReplaceString( + __inout LPWSTR* ppwzOriginal, + __inout DWORD* pdwStartIndex, + __in_z LPCWSTR wzOldSubString, + __in_z LPCWSTR wzNewSubString + ); + +HRESULT DAPI StrHexEncode( + __in_ecount(cbSource) const BYTE* pbSource, + __in DWORD_PTR cbSource, + __out_ecount(cchDest) LPWSTR wzDest, + __in DWORD_PTR cchDest + ); +HRESULT DAPI StrHexDecode( + __in_z LPCWSTR wzSource, + __out_bcount(cbDest) BYTE* pbDest, + __in DWORD_PTR cbDest + ); + +HRESULT DAPI StrAllocBase85Encode( + __in_bcount(cbSource) const BYTE* pbSource, + __in DWORD_PTR cbSource, + __deref_out_z LPWSTR* pwzDest + ); +HRESULT DAPI StrAllocBase85Decode( + __in_z LPCWSTR wzSource, + __deref_out_bcount(*pcbDest) BYTE** hbDest, + __out DWORD_PTR* pcbDest + ); + +HRESULT DAPI MultiSzLen( + __in_z LPCWSTR pwzMultiSz, + __out DWORD_PTR* pcch + ); +HRESULT DAPI MultiSzPrepend( + __deref_inout_z LPWSTR* ppwzMultiSz, + __inout_opt DWORD_PTR *pcchMultiSz, + __in_z LPCWSTR pwzInsert + ); +HRESULT DAPI MultiSzFindSubstring( + __in_z LPCWSTR pwzMultiSz, + __in_z LPCWSTR pwzSubstring, + __out_opt DWORD_PTR* pdwIndex, + __deref_opt_out_z LPCWSTR* ppwzFoundIn + ); +HRESULT DAPI MultiSzFindString( + __in_z LPCWSTR pwzMultiSz, + __in_z LPCWSTR pwzString, + __out_opt DWORD_PTR* pdwIndex, + __deref_opt_out_z LPCWSTR* ppwzFound + ); +HRESULT DAPI MultiSzRemoveString( + __deref_inout_z LPWSTR* ppwzMultiSz, + __in DWORD_PTR dwIndex + ); +HRESULT DAPI MultiSzInsertString( + __deref_inout_z LPWSTR* ppwzMultiSz, + __inout_opt DWORD_PTR *pcchMultiSz, + __in DWORD_PTR dwIndex, + __in_z LPCWSTR pwzInsert + ); +HRESULT DAPI MultiSzReplaceString( + __deref_inout_z LPWSTR* ppwzMultiSz, + __in DWORD_PTR dwIndex, + __in_z LPCWSTR pwzString + ); + +LPCWSTR wcsistr( + __in_z LPCWSTR wzString, + __in_z LPCWSTR wzCharSet + ); + +HRESULT DAPI StrStringToInt16( + __in_z LPCWSTR wzIn, + __in DWORD cchIn, + __out SHORT* psOut + ); +HRESULT DAPI StrStringToUInt16( + __in_z LPCWSTR wzIn, + __in DWORD cchIn, + __out USHORT* pusOut + ); +HRESULT DAPI StrStringToInt32( + __in_z LPCWSTR wzIn, + __in DWORD cchIn, + __out INT* piOut + ); +HRESULT DAPI StrStringToUInt32( + __in_z LPCWSTR wzIn, + __in DWORD cchIn, + __out UINT* puiOut + ); +HRESULT DAPI StrStringToInt64( + __in_z LPCWSTR wzIn, + __in DWORD cchIn, + __out LONGLONG* pllOut + ); +HRESULT DAPI StrStringToUInt64( + __in_z LPCWSTR wzIn, + __in DWORD cchIn, + __out ULONGLONG* pullOut + ); +void DAPI StrStringToUpper( + __inout_z LPWSTR wzIn + ); +void DAPI StrStringToLower( + __inout_z LPWSTR wzIn + ); + +HRESULT DAPI StrArrayAllocString( + __deref_inout_ecount(*pcStrArray) LPWSTR **prgsczStrArray, + __inout LPUINT pcStrArray, + __in_z LPCWSTR wzSource, + __in DWORD_PTR cchSource + ); + +HRESULT DAPI StrArrayFree( + __in_ecount(cStrArray) LPWSTR *rgsczStrArray, + __in UINT cStrArray + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/thmutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/thmutil.h index f9760f4eeb..6f1b310418 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/thmutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/thmutil.h @@ -1,191 +1,191 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Theme helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -enum THEME_CONTROL_DATA -{ - THEME_CONTROL_DATA_HOVER = 1, -}; - -enum THEME_CONTROL_TYPE -{ - THEME_CONTROL_TYPE_UNKNOWN, - THEME_CONTROL_TYPE_BUTTON, - THEME_CONTROL_TYPE_CHECKBOX, - THEME_CONTROL_TYPE_EDITBOX, - THEME_CONTROL_TYPE_HYPERLINK, - THEME_CONTROL_TYPE_IMAGE, - THEME_CONTROL_TYPE_PROGRESSBAR, - THEME_CONTROL_TYPE_RICHEDIT, - THEME_CONTROL_TYPE_STATIC, - THEME_CONTROL_TYPE_TEXT, -}; - -struct THEME_CONTROL -{ - THEME_CONTROL_TYPE type; - - LPWSTR wzText; - int nX; - int nY; - int nHeight; - int nWidth; - int nSourceX; - int nSourceY; - - DWORD dwStyle; - DWORD dwFontId; - DWORD dwFontHoverId; - DWORD dwFontSelectedId; - HWND hWnd; -}; - - -struct THEME_FONT -{ - HFONT hFont; - COLORREF crForeground; - HBRUSH hForeground; - COLORREF crBackground; - HBRUSH hBackground; -}; - - -struct THEME -{ - DWORD dwStyle; - DWORD dwFontId; - HANDLE hIcon; - LPWSTR wzCaption; - int nHeight; - int nWidth; - int nSourceX; - int nSourceY; - - HBITMAP hImage; - - DWORD cFonts; - THEME_FONT* rgFonts; - - DWORD cControls; - THEME_CONTROL* rgControls; - - // state variables that should be ignored - HWND hwndHover; // currently -}; - - -HRESULT DAPI ThemeInitialize( - __in HMODULE hModule - ); - -void DAPI ThemeUninitialize(); - -HRESULT DAPI ThemeLoadFromFile( - __in_z LPCWSTR wzThemeFile, - __out THEME** ppTheme - ); - -HRESULT DAPI ThemeLoadFromResource( - __in_opt HMODULE hModule, - __in_z LPCSTR szResource, - __out THEME** ppTheme - ); - -void DAPI ThemeFree( - __in THEME* pTheme - ); - -HRESULT DAPI ThemeLoadControls( - __in THEME* pTheme, - __in HWND hwndParent - ); - -HRESULT DAPI ThemeDrawBackground( - __in THEME* pTheme, - __in PAINTSTRUCT* pps - ); - -HRESULT DAPI ThemeDrawControl( - __in THEME* pTheme, - __in DRAWITEMSTRUCT* pdis - ); - -void DAPI ThemeHoverControl( - __in THEME* pTheme, - __in HWND hwndParent, - __in HWND hwndControl - ); - -BOOL DAPI ThemeIsControlChecked( - __in THEME* pTheme, - __in DWORD dwControl - ); - -BOOL DAPI ThemeSetControlColor( - __in THEME* pTheme, - __in HDC hdc, - __in HWND hWnd, - __out HBRUSH* phBackgroundBrush - ); - -HRESULT DAPI ThemeSetProgressControl( - __in THEME* pTheme, - __in DWORD dwControl, - __in DWORD dwProgressPercentage - ); - -HRESULT DAPI ThemeSetProgressControlColor( - __in THEME* pTheme, - __in DWORD dwControl, - __in DWORD dwColorIndex - ); - -HRESULT DAPI ThemeSetTextControl( - __in THEME* pTheme, - __in DWORD dwControl, - __in_z LPCWSTR wzText - ); - -HRESULT DAPI ThemeGetTextControl( - __in const THEME* pTheme, - __in DWORD dwControl, - __out LPWSTR* psczText - ); - -HRESULT DAPI ThemeLoadRichEditFromFile( - __in THEME* pTheme, - __in DWORD dwControl, - __in_z LPCWSTR wzFileName, - __in HMODULE hModule - ); - -HRESULT DAPI ThemeLoadLocFromFile( - __in THEME* pTheme, - __in_z LPCWSTR wzFileName, - __in HMODULE hModule - ); - -#ifdef __cplusplus -} -#endif - +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Theme helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +enum THEME_CONTROL_DATA +{ + THEME_CONTROL_DATA_HOVER = 1, +}; + +enum THEME_CONTROL_TYPE +{ + THEME_CONTROL_TYPE_UNKNOWN, + THEME_CONTROL_TYPE_BUTTON, + THEME_CONTROL_TYPE_CHECKBOX, + THEME_CONTROL_TYPE_EDITBOX, + THEME_CONTROL_TYPE_HYPERLINK, + THEME_CONTROL_TYPE_IMAGE, + THEME_CONTROL_TYPE_PROGRESSBAR, + THEME_CONTROL_TYPE_RICHEDIT, + THEME_CONTROL_TYPE_STATIC, + THEME_CONTROL_TYPE_TEXT, +}; + +struct THEME_CONTROL +{ + THEME_CONTROL_TYPE type; + + LPWSTR wzText; + int nX; + int nY; + int nHeight; + int nWidth; + int nSourceX; + int nSourceY; + + DWORD dwStyle; + DWORD dwFontId; + DWORD dwFontHoverId; + DWORD dwFontSelectedId; + HWND hWnd; +}; + + +struct THEME_FONT +{ + HFONT hFont; + COLORREF crForeground; + HBRUSH hForeground; + COLORREF crBackground; + HBRUSH hBackground; +}; + + +struct THEME +{ + DWORD dwStyle; + DWORD dwFontId; + HANDLE hIcon; + LPWSTR wzCaption; + int nHeight; + int nWidth; + int nSourceX; + int nSourceY; + + HBITMAP hImage; + + DWORD cFonts; + THEME_FONT* rgFonts; + + DWORD cControls; + THEME_CONTROL* rgControls; + + // state variables that should be ignored + HWND hwndHover; // currently +}; + + +HRESULT DAPI ThemeInitialize( + __in HMODULE hModule + ); + +void DAPI ThemeUninitialize(); + +HRESULT DAPI ThemeLoadFromFile( + __in_z LPCWSTR wzThemeFile, + __out THEME** ppTheme + ); + +HRESULT DAPI ThemeLoadFromResource( + __in_opt HMODULE hModule, + __in_z LPCSTR szResource, + __out THEME** ppTheme + ); + +void DAPI ThemeFree( + __in THEME* pTheme + ); + +HRESULT DAPI ThemeLoadControls( + __in THEME* pTheme, + __in HWND hwndParent + ); + +HRESULT DAPI ThemeDrawBackground( + __in THEME* pTheme, + __in PAINTSTRUCT* pps + ); + +HRESULT DAPI ThemeDrawControl( + __in THEME* pTheme, + __in DRAWITEMSTRUCT* pdis + ); + +void DAPI ThemeHoverControl( + __in THEME* pTheme, + __in HWND hwndParent, + __in HWND hwndControl + ); + +BOOL DAPI ThemeIsControlChecked( + __in THEME* pTheme, + __in DWORD dwControl + ); + +BOOL DAPI ThemeSetControlColor( + __in THEME* pTheme, + __in HDC hdc, + __in HWND hWnd, + __out HBRUSH* phBackgroundBrush + ); + +HRESULT DAPI ThemeSetProgressControl( + __in THEME* pTheme, + __in DWORD dwControl, + __in DWORD dwProgressPercentage + ); + +HRESULT DAPI ThemeSetProgressControlColor( + __in THEME* pTheme, + __in DWORD dwControl, + __in DWORD dwColorIndex + ); + +HRESULT DAPI ThemeSetTextControl( + __in THEME* pTheme, + __in DWORD dwControl, + __in_z LPCWSTR wzText + ); + +HRESULT DAPI ThemeGetTextControl( + __in const THEME* pTheme, + __in DWORD dwControl, + __out LPWSTR* psczText + ); + +HRESULT DAPI ThemeLoadRichEditFromFile( + __in THEME* pTheme, + __in DWORD dwControl, + __in_z LPCWSTR wzFileName, + __in HMODULE hModule + ); + +HRESULT DAPI ThemeLoadLocFromFile( + __in THEME* pTheme, + __in_z LPCWSTR wzFileName, + __in HMODULE hModule + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/timeutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/timeutil.h index 54ecc633fb..cc92d17ad3 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/timeutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/timeutil.h @@ -1,33 +1,33 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Time helper functions. -// -//------------------------------------------------------------------------------------------------- - - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI TimeFromString( - __in_z LPCWSTR wzTime, - __out FILETIME* pFileTime - ); - -#ifdef __cplusplus -} -#endif - +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Time helper functions. +// +//------------------------------------------------------------------------------------------------- + + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI TimeFromString( + __in_z LPCWSTR wzTime, + __out FILETIME* pFileTime + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/uriutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/uriutil.h index e7de565244..86ab80cc17 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/uriutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/uriutil.h @@ -1,93 +1,93 @@ -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// URI helper funtions. -// -//------------------------------------------------------------------------------------------------- - -#pragma once - - -#ifdef __cplusplus -extern "C" { -#endif - -enum URI_PROTOCOL -{ - URI_PROTOCOL_UNKNOWN, - URI_PROTOCOL_FILE, - URI_PROTOCOL_FTP, - URI_PROTOCOL_HTTP, - URI_PROTOCOL_LOCAL, - URI_PROTOCOL_UNC -}; - - -HRESULT DAPI UriCanonicalize( - __inout_z LPWSTR* psczUri - ); - -HRESULT DAPI UriCrack( - __in_z LPCWSTR wzUri, - __out_opt INTERNET_SCHEME* pScheme, - __deref_opt_out_z LPWSTR* psczHostName, - __out_opt INTERNET_PORT* pPort, - __deref_opt_out_z LPWSTR* psczUser, - __deref_opt_out_z LPWSTR* psczPassword, - __deref_opt_out_z LPWSTR* psczPath, - __deref_opt_out_z LPWSTR* psczQueryString - ); - -HRESULT DAPI UriCreate( - __inout_z LPWSTR* psczUri, - __in INTERNET_SCHEME scheme, - __in_z_opt LPWSTR wzHostName, - __in INTERNET_PORT port, - __in_z_opt LPWSTR wzUser, - __in_z_opt LPWSTR wzPassword, - __in_z_opt LPWSTR wzPath, - __in_z_opt LPWSTR wzQueryString - ); - -HRESULT DAPI UriCanonicalize( - __inout_z LPWSTR* psczUri - ); - -HRESULT DAPI UriFile( - __deref_out_z LPWSTR* psczFile, - __in_z LPCWSTR wzUri - ); - -HRESULT DAPI UriProtocol( - __in_z LPCWSTR wzUri, - __out URI_PROTOCOL* pProtocol - ); - -HRESULT DAPI UriRoot( - __in_z LPCWSTR wzUri, - __out LPWSTR* ppwzRoot, - __out_opt URI_PROTOCOL* pProtocol - ); - -HRESULT DAPI UriResolve( - __in_z LPCWSTR wzUri, - __in_opt LPCWSTR wzBaseUri, - __out LPWSTR* ppwzResolvedUri, - __out_opt const URI_PROTOCOL* pResolvedProtocol - ); - -#ifdef __cplusplus -} -#endif - +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// URI helper funtions. +// +//------------------------------------------------------------------------------------------------- + +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +enum URI_PROTOCOL +{ + URI_PROTOCOL_UNKNOWN, + URI_PROTOCOL_FILE, + URI_PROTOCOL_FTP, + URI_PROTOCOL_HTTP, + URI_PROTOCOL_LOCAL, + URI_PROTOCOL_UNC +}; + + +HRESULT DAPI UriCanonicalize( + __inout_z LPWSTR* psczUri + ); + +HRESULT DAPI UriCrack( + __in_z LPCWSTR wzUri, + __out_opt INTERNET_SCHEME* pScheme, + __deref_opt_out_z LPWSTR* psczHostName, + __out_opt INTERNET_PORT* pPort, + __deref_opt_out_z LPWSTR* psczUser, + __deref_opt_out_z LPWSTR* psczPassword, + __deref_opt_out_z LPWSTR* psczPath, + __deref_opt_out_z LPWSTR* psczQueryString + ); + +HRESULT DAPI UriCreate( + __inout_z LPWSTR* psczUri, + __in INTERNET_SCHEME scheme, + __in_z_opt LPWSTR wzHostName, + __in INTERNET_PORT port, + __in_z_opt LPWSTR wzUser, + __in_z_opt LPWSTR wzPassword, + __in_z_opt LPWSTR wzPath, + __in_z_opt LPWSTR wzQueryString + ); + +HRESULT DAPI UriCanonicalize( + __inout_z LPWSTR* psczUri + ); + +HRESULT DAPI UriFile( + __deref_out_z LPWSTR* psczFile, + __in_z LPCWSTR wzUri + ); + +HRESULT DAPI UriProtocol( + __in_z LPCWSTR wzUri, + __out URI_PROTOCOL* pProtocol + ); + +HRESULT DAPI UriRoot( + __in_z LPCWSTR wzUri, + __out LPWSTR* ppwzRoot, + __out_opt URI_PROTOCOL* pProtocol + ); + +HRESULT DAPI UriResolve( + __in_z LPCWSTR wzUri, + __in_opt LPCWSTR wzBaseUri, + __out LPWSTR* ppwzResolvedUri, + __out_opt const URI_PROTOCOL* pResolvedProtocol + ); + +#ifdef __cplusplus +} +#endif + diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/userutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/userutil.h index 61e8b533fe..05d2936b1f 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/userutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/userutil.h @@ -1,47 +1,47 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// User helper funtions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI UserBuildDomainUserName( - __out_ecount_z(cchDest) LPWSTR wzDest, - __in int cchDest, - __in_z LPCWSTR pwzName, - __in_z LPCWSTR pwzDomain - ); - -HRESULT DAPI UserCheckIsMember( - __in_z LPCWSTR pwzName, - __in_z LPCWSTR pwzDomain, - __in_z LPCWSTR pwzGroupName, - __in_z LPCWSTR pwzGroupDomain, - __out LPBOOL lpfMember - ); - -HRESULT DAPI UserCreateADsPath( - __in_z LPCWSTR wzObjectDomain, - __in_z LPCWSTR wzObjectName, - __out BSTR *pbstrAdsPath - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// User helper funtions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI UserBuildDomainUserName( + __out_ecount_z(cchDest) LPWSTR wzDest, + __in int cchDest, + __in_z LPCWSTR pwzName, + __in_z LPCWSTR pwzDomain + ); + +HRESULT DAPI UserCheckIsMember( + __in_z LPCWSTR pwzName, + __in_z LPCWSTR pwzDomain, + __in_z LPCWSTR pwzGroupName, + __in_z LPCWSTR pwzGroupDomain, + __out LPBOOL lpfMember + ); + +HRESULT DAPI UserCreateADsPath( + __in_z LPCWSTR wzObjectDomain, + __in_z LPCWSTR wzObjectName, + __out BSTR *pbstrAdsPath + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/wcautil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/wcautil.h index 960ead0d8a..95e8cef52e 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/wcautil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/wcautil.h @@ -1,379 +1,379 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Windows Installer XML CustomAction utility library. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define WIXAPI __stdcall -#define ExitTrace WcaLogError -#define ExitTrace1 WcaLogError -#define ExitTrace2 WcaLogError -#define ExitTrace3 WcaLogError - -#include "dutil.h" - -#define MessageExitOnLastError(x, e, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0); goto LExit; } } -#define MessageExitOnLastError1(x, e, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s); goto LExit; } } - -#define MessageExitOnFailure(x, e, s) if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 0); goto LExit; } -#define MessageExitOnFailure1(x, e, f, s) if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 1, s); goto LExit; } -#define MessageExitOnFailure2(x, e, f, s, t) if (FAILED(x)) { ExitTrace2(x, f, s, t); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 2, s, t); goto LExit; } -#define MessageExitOnFailure3(x, e, f, s, t, u) if (FAILED(x)) { ExitTrace2(x, f, s, t, u); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 3, s, t, u); goto LExit; } - -#define MessageExitOnNullWithLastError(p, x, e, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0); goto LExit; } -#define MessageExitOnNullWithLastError1(p, x, e, f, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s); goto LExit; } -#define MessageExitOnNullWithLastError2(p, x, e, f, s, t) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s, t); WcaErrorMessage(e, x, MB_OK, 2, s, t); goto LExit; } - -// Generic action enum. -enum WCA_ACTION -{ - WCA_ACTION_NONE, - WCA_ACTION_INSTALL, - WCA_ACTION_UNINSTALL, -}; - -enum WCA_CASCRIPT -{ - WCA_CASCRIPT_SCHEDULED, - WCA_CASCRIPT_ROLLBACK, -}; - -enum WCA_CASCRIPT_CLOSE -{ - WCA_CASCRIPT_CLOSE_PRESERVE, - WCA_CASCRIPT_CLOSE_DELETE, -}; - -enum WCA_TODO -{ - WCA_TODO_UNKNOWN, - WCA_TODO_INSTALL, - WCA_TODO_UNINSTALL, - WCA_TODO_REINSTALL, -}; - -typedef struct WCA_CASCRIPT_STRUCT -{ - LPWSTR pwzScriptPath; - HANDLE hScriptFile; -} *WCA_CASCRIPT_HANDLE; - -void WIXAPI WcaGlobalInitialize( - __in HINSTANCE hInst - ); -void WIXAPI WcaGlobalFinalize(); - -HRESULT WIXAPI WcaInitialize( - __in MSIHANDLE hInstall, - __in_z PCSTR szCustomActionLogName - ); -UINT WIXAPI WcaFinalize( - __in UINT iReturnValue - ); -BOOL WIXAPI WcaIsInitialized(); - -MSIHANDLE WIXAPI WcaGetInstallHandle(); -MSIHANDLE WIXAPI WcaGetDatabaseHandle(); - -const char* WIXAPI WcaGetLogName(); - -void WIXAPI WcaSetReturnValue( - __in UINT iReturnValue - ); -BOOL WIXAPI WcaCancelDetected(); - -const int LOG_BUFFER = 2048; -enum LOGLEVEL -{ - LOGMSG_TRACEONLY, // Never written to the log file (except in DEBUG builds) - LOGMSG_VERBOSE, // Written to log when LOGVERBOSE - LOGMSG_STANDARD // Written to log whenever informational logging is enabled -}; - -void __cdecl WcaLog( - __in LOGLEVEL llv, - __in_z __format_string PCSTR fmt, ... - ); -BOOL WIXAPI WcaDisplayAssert( - __in LPCSTR sz - ); -void __cdecl WcaLogError( - __in HRESULT hr, - __in LPCSTR szMessage, - ... - ); - -UINT WIXAPI WcaProcessMessage( - __in INSTALLMESSAGE eMessageType, - __in MSIHANDLE hRecord - ); -UINT __cdecl WcaErrorMessage( - __in int iError, - __in HRESULT hrError, - __in UINT uiType, - __in DWORD cArgs, - ... - ); -HRESULT WIXAPI WcaProgressMessage( - __in UINT uiCost, - __in BOOL fExtendProgressBar - ); - -BOOL WIXAPI WcaIsInstalling( - __in INSTALLSTATE isInstalled, - __in INSTALLSTATE isAction - ); -BOOL WIXAPI WcaIsReInstalling( - __in INSTALLSTATE isInstalled, - __in INSTALLSTATE isAction - ); -BOOL WIXAPI WcaIsUninstalling( - __in INSTALLSTATE isInstalled, - __in INSTALLSTATE isAction - ); - -HRESULT WIXAPI WcaSetComponentState( - __in_z LPCWSTR wzComponent, - __in INSTALLSTATE isState - ); - -HRESULT WIXAPI WcaTableExists( - __in_z LPCWSTR wzTable - ); - -HRESULT WIXAPI WcaOpenView( - __in_z LPCWSTR wzSql, - __out MSIHANDLE* phView - ); -HRESULT WIXAPI WcaExecuteView( - __in MSIHANDLE hView, - __in MSIHANDLE hRec - ); -HRESULT WIXAPI WcaOpenExecuteView( - __in_z LPCWSTR wzSql, - __out MSIHANDLE* phView - ); -HRESULT WIXAPI WcaFetchRecord( - __in MSIHANDLE hView, - __out MSIHANDLE* phRec - ); -HRESULT WIXAPI WcaFetchSingleRecord( - __in MSIHANDLE hView, - __out MSIHANDLE* phRec - ); - -HRESULT WIXAPI WcaGetProperty( - __in_z LPCWSTR wzProperty, - __inout LPWSTR* ppwzData - ); -HRESULT WIXAPI WcaGetFormattedProperty( - __in_z LPCWSTR wzProperty, - __out LPWSTR* ppwzData - ); -HRESULT WIXAPI WcaGetFormattedString( - __in_z LPCWSTR wzString, - __out LPWSTR* ppwzData - ); -HRESULT WIXAPI WcaGetIntProperty( - __in_z LPCWSTR wzProperty, - __inout int* piData - ); -HRESULT WIXAPI WcaGetTargetPath( - __in_z LPCWSTR wzFolder, - __out LPWSTR* ppwzData - ); -HRESULT WIXAPI WcaSetProperty( - __in_z LPCWSTR wzPropertyName, - __in_z LPCWSTR wzPropertyValue - ); -HRESULT WIXAPI WcaSetIntProperty( - __in_z LPCWSTR wzPropertyName, - __in int nPropertyValue - ); -BOOL WIXAPI WcaIsPropertySet( - __in LPCSTR szProperty - ); - -HRESULT WIXAPI WcaGetRecordInteger( - __in MSIHANDLE hRec, - __in UINT uiField, - __inout int* piData - ); -HRESULT WIXAPI WcaGetRecordString( - __in MSIHANDLE hRec, - __in UINT uiField, - __inout LPWSTR* ppwzData - ); -HRESULT WIXAPI WcaGetRecordFormattedInteger( - __in MSIHANDLE hRec, - __in UINT uiField, - __out int* piData - ); -HRESULT WIXAPI WcaGetRecordFormattedString( - __in MSIHANDLE hRec, - __in UINT uiField, - __inout LPWSTR* ppwzData - ); - -HRESULT WIXAPI WcaAllocStream( - __deref_out_bcount_part(cbData, 0) BYTE** ppbData, - __in DWORD cbData - ); -HRESULT WIXAPI WcaFreeStream( - __in BYTE* pbData - ); - -HRESULT WIXAPI WcaGetRecordStream( - __in MSIHANDLE hRecBinary, - __in UINT uiField, - __deref_out_bcount_full(*pcbData) BYTE** ppbData, - __out DWORD* pcbData - ); -HRESULT WIXAPI WcaSetRecordString( - __in MSIHANDLE hRec, - __in UINT uiField, - __in_z LPCWSTR wzData - ); -HRESULT WIXAPI WcaSetRecordInteger( - __in MSIHANDLE hRec, - __in UINT uiField, - __in int iValue - ); - -HRESULT WIXAPI WcaDoDeferredAction( - __in_z LPCWSTR wzAction, - __in_z LPCWSTR wzCustomActionData, - __in UINT uiCost - ); -DWORD WIXAPI WcaCountOfCustomActionDataRecords( - __in_z LPCWSTR wzData - ); - -void WIXAPI RevertCustomActionData( - __in LPWSTR wzRevertTo, - __in LPCWSTR wzRevertFrom - ); - -HRESULT WIXAPI WcaReadStringFromCaData( - __deref_in LPWSTR* ppwzCustomActionData, - __deref_out_z LPWSTR* ppwzString - ); -HRESULT WIXAPI WcaReadIntegerFromCaData( - __deref_in LPWSTR* ppwzCustomActionData, - __out int* piResult - ); -HRESULT WIXAPI WcaReadStreamFromCaData( - __deref_in LPWSTR* ppwzCustomActionData, - __deref_out_bcount(*pcbData) BYTE** ppbData, - __out DWORD_PTR* pcbData - ); -HRESULT WIXAPI WcaWriteStringToCaData( - __in_z LPCWSTR wzString, - __deref_inout_z LPWSTR* ppwzCustomActionData - ); -HRESULT WIXAPI WcaWriteIntegerToCaData( - __in int i, - __deref_inout_z LPWSTR* ppwzCustomActionData - ); -HRESULT WIXAPI WcaWriteStreamToCaData( - __in_bcount(cbData) const BYTE* pbData, - __in DWORD cbData, - __deref_inout_z LPWSTR* ppwzCustomActionData - ); - -HRESULT __cdecl WcaAddTempRecord( - __inout MSIHANDLE* phTableView, - __inout MSIHANDLE* phColumns, - __in_z LPCWSTR wzTable, - __out_opt MSIDBERROR* pdbError, - __in UINT uiUniquifyColumn, - __in UINT cColumns, - ... - ); - -HRESULT WIXAPI WcaDumpTable( - __in_z LPCWSTR wzTable - ); - -HRESULT WIXAPI WcaDeferredActionRequiresReboot(); -BOOL WIXAPI WcaDidDeferredActionRequireReboot(); - -HRESULT WIXAPI WcaCaScriptCreateKey( - __out LPWSTR* ppwzScriptKey - ); - -HRESULT WIXAPI WcaCaScriptCreate( - __in WCA_ACTION action, - __in WCA_CASCRIPT script, - __in BOOL fImpersonated, - __in_z LPCWSTR wzScriptKey, - __in BOOL fAppend, - __out WCA_CASCRIPT_HANDLE* phScript - ); - -HRESULT WIXAPI WcaCaScriptOpen( - __in WCA_ACTION action, - __in WCA_CASCRIPT script, - __in BOOL fImpersonated, - __in_z LPCWSTR wzScriptKey, - __out WCA_CASCRIPT_HANDLE* phScript - ); - -void WIXAPI WcaCaScriptClose( - __in_opt WCA_CASCRIPT_HANDLE hScript, - __in WCA_CASCRIPT_CLOSE closeOperation - ); - -HRESULT WIXAPI WcaCaScriptReadAsCustomActionData( - __in WCA_CASCRIPT_HANDLE hScript, - __out LPWSTR* ppwzCustomActionData - ); - -HRESULT WIXAPI WcaCaScriptWriteString( - __in WCA_CASCRIPT_HANDLE hScript, - __in_z LPCWSTR wzValue - ); - -HRESULT WIXAPI WcaCaScriptWriteNumber( - __in WCA_CASCRIPT_HANDLE hScript, - __in DWORD dwValue - ); - -void WIXAPI WcaCaScriptFlush( - __in WCA_CASCRIPT_HANDLE hScript - ); - -void WIXAPI WcaCaScriptCleanup( - __in_z LPCWSTR wzProductCode, - __in BOOL fImpersonated - ); - -HRESULT WIXAPI QuietExec( - __inout_z LPWSTR wzCommand, - __in DWORD dwTimeout - ); - -WCA_TODO WIXAPI WcaGetComponentToDo( - __in_z LPCWSTR wzComponentId - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Windows Installer XML CustomAction utility library. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define WIXAPI __stdcall +#define ExitTrace WcaLogError +#define ExitTrace1 WcaLogError +#define ExitTrace2 WcaLogError +#define ExitTrace3 WcaLogError + +#include "dutil.h" + +#define MessageExitOnLastError(x, e, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0); goto LExit; } } +#define MessageExitOnLastError1(x, e, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s); goto LExit; } } + +#define MessageExitOnFailure(x, e, s) if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 0); goto LExit; } +#define MessageExitOnFailure1(x, e, f, s) if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 1, s); goto LExit; } +#define MessageExitOnFailure2(x, e, f, s, t) if (FAILED(x)) { ExitTrace2(x, f, s, t); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 2, s, t); goto LExit; } +#define MessageExitOnFailure3(x, e, f, s, t, u) if (FAILED(x)) { ExitTrace2(x, f, s, t, u); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 3, s, t, u); goto LExit; } + +#define MessageExitOnNullWithLastError(p, x, e, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0); goto LExit; } +#define MessageExitOnNullWithLastError1(p, x, e, f, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s); goto LExit; } +#define MessageExitOnNullWithLastError2(p, x, e, f, s, t) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s, t); WcaErrorMessage(e, x, MB_OK, 2, s, t); goto LExit; } + +// Generic action enum. +enum WCA_ACTION +{ + WCA_ACTION_NONE, + WCA_ACTION_INSTALL, + WCA_ACTION_UNINSTALL, +}; + +enum WCA_CASCRIPT +{ + WCA_CASCRIPT_SCHEDULED, + WCA_CASCRIPT_ROLLBACK, +}; + +enum WCA_CASCRIPT_CLOSE +{ + WCA_CASCRIPT_CLOSE_PRESERVE, + WCA_CASCRIPT_CLOSE_DELETE, +}; + +enum WCA_TODO +{ + WCA_TODO_UNKNOWN, + WCA_TODO_INSTALL, + WCA_TODO_UNINSTALL, + WCA_TODO_REINSTALL, +}; + +typedef struct WCA_CASCRIPT_STRUCT +{ + LPWSTR pwzScriptPath; + HANDLE hScriptFile; +} *WCA_CASCRIPT_HANDLE; + +void WIXAPI WcaGlobalInitialize( + __in HINSTANCE hInst + ); +void WIXAPI WcaGlobalFinalize(); + +HRESULT WIXAPI WcaInitialize( + __in MSIHANDLE hInstall, + __in_z PCSTR szCustomActionLogName + ); +UINT WIXAPI WcaFinalize( + __in UINT iReturnValue + ); +BOOL WIXAPI WcaIsInitialized(); + +MSIHANDLE WIXAPI WcaGetInstallHandle(); +MSIHANDLE WIXAPI WcaGetDatabaseHandle(); + +const char* WIXAPI WcaGetLogName(); + +void WIXAPI WcaSetReturnValue( + __in UINT iReturnValue + ); +BOOL WIXAPI WcaCancelDetected(); + +const int LOG_BUFFER = 2048; +enum LOGLEVEL +{ + LOGMSG_TRACEONLY, // Never written to the log file (except in DEBUG builds) + LOGMSG_VERBOSE, // Written to log when LOGVERBOSE + LOGMSG_STANDARD // Written to log whenever informational logging is enabled +}; + +void __cdecl WcaLog( + __in LOGLEVEL llv, + __in_z __format_string PCSTR fmt, ... + ); +BOOL WIXAPI WcaDisplayAssert( + __in LPCSTR sz + ); +void __cdecl WcaLogError( + __in HRESULT hr, + __in LPCSTR szMessage, + ... + ); + +UINT WIXAPI WcaProcessMessage( + __in INSTALLMESSAGE eMessageType, + __in MSIHANDLE hRecord + ); +UINT __cdecl WcaErrorMessage( + __in int iError, + __in HRESULT hrError, + __in UINT uiType, + __in DWORD cArgs, + ... + ); +HRESULT WIXAPI WcaProgressMessage( + __in UINT uiCost, + __in BOOL fExtendProgressBar + ); + +BOOL WIXAPI WcaIsInstalling( + __in INSTALLSTATE isInstalled, + __in INSTALLSTATE isAction + ); +BOOL WIXAPI WcaIsReInstalling( + __in INSTALLSTATE isInstalled, + __in INSTALLSTATE isAction + ); +BOOL WIXAPI WcaIsUninstalling( + __in INSTALLSTATE isInstalled, + __in INSTALLSTATE isAction + ); + +HRESULT WIXAPI WcaSetComponentState( + __in_z LPCWSTR wzComponent, + __in INSTALLSTATE isState + ); + +HRESULT WIXAPI WcaTableExists( + __in_z LPCWSTR wzTable + ); + +HRESULT WIXAPI WcaOpenView( + __in_z LPCWSTR wzSql, + __out MSIHANDLE* phView + ); +HRESULT WIXAPI WcaExecuteView( + __in MSIHANDLE hView, + __in MSIHANDLE hRec + ); +HRESULT WIXAPI WcaOpenExecuteView( + __in_z LPCWSTR wzSql, + __out MSIHANDLE* phView + ); +HRESULT WIXAPI WcaFetchRecord( + __in MSIHANDLE hView, + __out MSIHANDLE* phRec + ); +HRESULT WIXAPI WcaFetchSingleRecord( + __in MSIHANDLE hView, + __out MSIHANDLE* phRec + ); + +HRESULT WIXAPI WcaGetProperty( + __in_z LPCWSTR wzProperty, + __inout LPWSTR* ppwzData + ); +HRESULT WIXAPI WcaGetFormattedProperty( + __in_z LPCWSTR wzProperty, + __out LPWSTR* ppwzData + ); +HRESULT WIXAPI WcaGetFormattedString( + __in_z LPCWSTR wzString, + __out LPWSTR* ppwzData + ); +HRESULT WIXAPI WcaGetIntProperty( + __in_z LPCWSTR wzProperty, + __inout int* piData + ); +HRESULT WIXAPI WcaGetTargetPath( + __in_z LPCWSTR wzFolder, + __out LPWSTR* ppwzData + ); +HRESULT WIXAPI WcaSetProperty( + __in_z LPCWSTR wzPropertyName, + __in_z LPCWSTR wzPropertyValue + ); +HRESULT WIXAPI WcaSetIntProperty( + __in_z LPCWSTR wzPropertyName, + __in int nPropertyValue + ); +BOOL WIXAPI WcaIsPropertySet( + __in LPCSTR szProperty + ); + +HRESULT WIXAPI WcaGetRecordInteger( + __in MSIHANDLE hRec, + __in UINT uiField, + __inout int* piData + ); +HRESULT WIXAPI WcaGetRecordString( + __in MSIHANDLE hRec, + __in UINT uiField, + __inout LPWSTR* ppwzData + ); +HRESULT WIXAPI WcaGetRecordFormattedInteger( + __in MSIHANDLE hRec, + __in UINT uiField, + __out int* piData + ); +HRESULT WIXAPI WcaGetRecordFormattedString( + __in MSIHANDLE hRec, + __in UINT uiField, + __inout LPWSTR* ppwzData + ); + +HRESULT WIXAPI WcaAllocStream( + __deref_out_bcount_part(cbData, 0) BYTE** ppbData, + __in DWORD cbData + ); +HRESULT WIXAPI WcaFreeStream( + __in BYTE* pbData + ); + +HRESULT WIXAPI WcaGetRecordStream( + __in MSIHANDLE hRecBinary, + __in UINT uiField, + __deref_out_bcount_full(*pcbData) BYTE** ppbData, + __out DWORD* pcbData + ); +HRESULT WIXAPI WcaSetRecordString( + __in MSIHANDLE hRec, + __in UINT uiField, + __in_z LPCWSTR wzData + ); +HRESULT WIXAPI WcaSetRecordInteger( + __in MSIHANDLE hRec, + __in UINT uiField, + __in int iValue + ); + +HRESULT WIXAPI WcaDoDeferredAction( + __in_z LPCWSTR wzAction, + __in_z LPCWSTR wzCustomActionData, + __in UINT uiCost + ); +DWORD WIXAPI WcaCountOfCustomActionDataRecords( + __in_z LPCWSTR wzData + ); + +void WIXAPI RevertCustomActionData( + __in LPWSTR wzRevertTo, + __in LPCWSTR wzRevertFrom + ); + +HRESULT WIXAPI WcaReadStringFromCaData( + __deref_in LPWSTR* ppwzCustomActionData, + __deref_out_z LPWSTR* ppwzString + ); +HRESULT WIXAPI WcaReadIntegerFromCaData( + __deref_in LPWSTR* ppwzCustomActionData, + __out int* piResult + ); +HRESULT WIXAPI WcaReadStreamFromCaData( + __deref_in LPWSTR* ppwzCustomActionData, + __deref_out_bcount(*pcbData) BYTE** ppbData, + __out DWORD_PTR* pcbData + ); +HRESULT WIXAPI WcaWriteStringToCaData( + __in_z LPCWSTR wzString, + __deref_inout_z LPWSTR* ppwzCustomActionData + ); +HRESULT WIXAPI WcaWriteIntegerToCaData( + __in int i, + __deref_inout_z LPWSTR* ppwzCustomActionData + ); +HRESULT WIXAPI WcaWriteStreamToCaData( + __in_bcount(cbData) const BYTE* pbData, + __in DWORD cbData, + __deref_inout_z LPWSTR* ppwzCustomActionData + ); + +HRESULT __cdecl WcaAddTempRecord( + __inout MSIHANDLE* phTableView, + __inout MSIHANDLE* phColumns, + __in_z LPCWSTR wzTable, + __out_opt MSIDBERROR* pdbError, + __in UINT uiUniquifyColumn, + __in UINT cColumns, + ... + ); + +HRESULT WIXAPI WcaDumpTable( + __in_z LPCWSTR wzTable + ); + +HRESULT WIXAPI WcaDeferredActionRequiresReboot(); +BOOL WIXAPI WcaDidDeferredActionRequireReboot(); + +HRESULT WIXAPI WcaCaScriptCreateKey( + __out LPWSTR* ppwzScriptKey + ); + +HRESULT WIXAPI WcaCaScriptCreate( + __in WCA_ACTION action, + __in WCA_CASCRIPT script, + __in BOOL fImpersonated, + __in_z LPCWSTR wzScriptKey, + __in BOOL fAppend, + __out WCA_CASCRIPT_HANDLE* phScript + ); + +HRESULT WIXAPI WcaCaScriptOpen( + __in WCA_ACTION action, + __in WCA_CASCRIPT script, + __in BOOL fImpersonated, + __in_z LPCWSTR wzScriptKey, + __out WCA_CASCRIPT_HANDLE* phScript + ); + +void WIXAPI WcaCaScriptClose( + __in_opt WCA_CASCRIPT_HANDLE hScript, + __in WCA_CASCRIPT_CLOSE closeOperation + ); + +HRESULT WIXAPI WcaCaScriptReadAsCustomActionData( + __in WCA_CASCRIPT_HANDLE hScript, + __out LPWSTR* ppwzCustomActionData + ); + +HRESULT WIXAPI WcaCaScriptWriteString( + __in WCA_CASCRIPT_HANDLE hScript, + __in_z LPCWSTR wzValue + ); + +HRESULT WIXAPI WcaCaScriptWriteNumber( + __in WCA_CASCRIPT_HANDLE hScript, + __in DWORD dwValue + ); + +void WIXAPI WcaCaScriptFlush( + __in WCA_CASCRIPT_HANDLE hScript + ); + +void WIXAPI WcaCaScriptCleanup( + __in_z LPCWSTR wzProductCode, + __in BOOL fImpersonated + ); + +HRESULT WIXAPI QuietExec( + __inout_z LPWSTR wzCommand, + __in DWORD dwTimeout + ); + +WCA_TODO WIXAPI WcaGetComponentToDo( + __in_z LPCWSTR wzComponentId + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawow64.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawow64.h index 6ad5c6d759..9cfc60a711 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawow64.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawow64.h @@ -1,35 +1,35 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Windows Installer XML CustomAction utility library for Wow64 API-related functionality. -// -//------------------------------------------------------------------------------------------------- - -#include "wcautil.h" - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT WIXAPI WcaInitializeWow64(); -BOOL WIXAPI WcaIsWow64Process(); -BOOL WIXAPI WcaIsWow64Initialized(); -HRESULT WIXAPI WcaDisableWow64FSRedirection(); -HRESULT WIXAPI WcaRevertWow64FSRedirection(); -HRESULT WIXAPI WcaFinalizeWow64(); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Windows Installer XML CustomAction utility library for Wow64 API-related functionality. +// +//------------------------------------------------------------------------------------------------- + +#include "wcautil.h" + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT WIXAPI WcaInitializeWow64(); +BOOL WIXAPI WcaIsWow64Process(); +BOOL WIXAPI WcaIsWow64Initialized(); +HRESULT WIXAPI WcaDisableWow64FSRedirection(); +HRESULT WIXAPI WcaRevertWow64FSRedirection(); +HRESULT WIXAPI WcaFinalizeWow64(); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawrapquery.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawrapquery.h index 747aee2ee6..b74f7d441e 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawrapquery.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/wcawrapquery.h @@ -1,146 +1,146 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Windows Installer XML CustomAction utility library wrappers meant to wrap an MSI view as -// opened by an immediate custom action and transmit it to a deferred custom action -// -//------------------------------------------------------------------------------------------------- - -#include "wcautil.h" - -// Enumerations -enum eWrapQueryAction -{ - wqaTableBegin = 1, - wqaTableFinish, - wqaRowBegin, - wqaRowFinish -}; - -enum eColumnDataType -{ - cdtString = 1, - cdtInt, - cdtStream, - cdtUnknown -}; - -enum eFormatMaskColumn -{ - efmcColumn1 = 1, - efmcColumn2 = 1 << 1, - efmcColumn3 = 1 << 2, - efmcColumn4 = 1 << 3, - efmcColumn5 = 1 << 4, - efmcColumn6 = 1 << 5, - efmcColumn7 = 1 << 6, - efmcColumn8 = 1 << 7, - efmcColumn9 = 1 << 8, - efmcColumn10 = 1 << 9, - efmcColumn11 = 1 << 10, - efmcColumn12 = 1 << 11, - efmcColumn13 = 1 << 12, - efmcColumn14 = 1 << 13, - efmcColumn15 = 1 << 14, - efmcColumn16 = 1 << 15, - efmcColumn17 = 1 << 16, - efmcColumn18 = 1 << 17, - efmcColumn19 = 1 << 18, - efmcColumn20 = 1 << 19, - efmcColumn21 = 1 << 20, - efmcColumn22 = 1 << 21, - efmcColumn23 = 1 << 22, - efmcColumn24 = 1 << 23, - efmcColumn25 = 1 << 24, - efmcColumn26 = 1 << 25, - efmcColumn27 = 1 << 26, - efmcColumn28 = 1 << 27, - efmcColumn29 = 1 << 28, - efmcColumn30 = 1 << 29, - efmcColumn31 = 1 << 30, - efmcColumn32 = 1 << 31, -}; - -// Keeps track of the query instance for the reading CA (deferred CA) -typedef struct WCA_WRAPQUERY_STRUCT -{ - // These are used to size our dynamic arrays below - DWORD dwColumns, dwRows, dwNextIndex; - - // Dynamic arrays of column schema information - eColumnDataType *pcdtColumnType; - LPWSTR *ppwzColumnNames; - - // Dynamic array of raw record data - MSIHANDLE *phRecords; -} *WCA_WRAPQUERY_HANDLE; - -// Wrap a query -// Setting the pfFormatMask enables control over which fields will be formatted, and which will be left unchanged -// Setting dwComponentColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two additional columns to the right side of the table -// - ISInstalled and ISAction - which map to the ComponentState of the component (the component is found in the column specified) -// Note that if a component is NULL, the component state columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately -// Setting dwDirectoryColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two more additional columns to the right side of the table -// - SourcePath and TargetPath - which map to the Directory's Source and Target Path (the directory is found in the column specified) -// Note that if a directory is NULL, the directory source/target path columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately -HRESULT WIXAPI WcaWrapQuery( - __in_z LPCWSTR pwzQuery, - __inout LPWSTR * ppwzCustomActionData, - __in_opt DWORD dwFormatMask, - __in_opt DWORD dwComponentColumn, - __in_opt DWORD dwDirectoryColumn - ); -// This wraps an empty table query into the custom action data - this is a way to indicate to the deferred custom action that a necessary table doesn't exist, or its query returned no results -HRESULT WIXAPI WcaWrapEmptyQuery( - __inout LPWSTR * ppwzCustomActionData - ); - -// Open a new unwrap query operation, with data from the ppwzCustomActionData string -HRESULT WIXAPI WcaBeginUnwrapQuery( - __out WCA_WRAPQUERY_HANDLE * phWrapQuery, - __inout LPWSTR * ppwzCustomActionData - ); - -// Get the number of records in a query being unwrapped -DWORD WIXAPI WcaGetQueryRecords( - __in const WCA_WRAPQUERY_HANDLE hWrapQuery - ); - -// This function resets a query back to its first row, so that the next fetch returns the first record -void WIXAPI WcaFetchWrappedReset( - __in WCA_WRAPQUERY_HANDLE hWrapQuery - ); -// Fetch the next record in this query -// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item. -// so, don't use this function with PMSIHANDLE objects! -HRESULT WIXAPI WcaFetchWrappedRecord( - __in WCA_WRAPQUERY_HANDLE hWrapQuery, - __out MSIHANDLE* phRec - ); - -// Fetch the next record in the query where the string value in column dwComparisonColumn equals the value pwzExpectedValue -// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item. -// so, don't use this function with PMSIHANDLE objects! -HRESULT WIXAPI WcaFetchWrappedRecordWhereString( - __in WCA_WRAPQUERY_HANDLE hWrapQuery, - __in DWORD dwComparisonColumn, - __in_z LPCWSTR pwzExpectedValue, - __out MSIHANDLE* phRec - ); - -// Release a query ID (frees memory, and frees the ID for a new query) -void WIXAPI WcaFinishUnwrapQuery( - __in_opt WCA_WRAPQUERY_HANDLE hWrapQuery - ); +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Windows Installer XML CustomAction utility library wrappers meant to wrap an MSI view as +// opened by an immediate custom action and transmit it to a deferred custom action +// +//------------------------------------------------------------------------------------------------- + +#include "wcautil.h" + +// Enumerations +enum eWrapQueryAction +{ + wqaTableBegin = 1, + wqaTableFinish, + wqaRowBegin, + wqaRowFinish +}; + +enum eColumnDataType +{ + cdtString = 1, + cdtInt, + cdtStream, + cdtUnknown +}; + +enum eFormatMaskColumn +{ + efmcColumn1 = 1, + efmcColumn2 = 1 << 1, + efmcColumn3 = 1 << 2, + efmcColumn4 = 1 << 3, + efmcColumn5 = 1 << 4, + efmcColumn6 = 1 << 5, + efmcColumn7 = 1 << 6, + efmcColumn8 = 1 << 7, + efmcColumn9 = 1 << 8, + efmcColumn10 = 1 << 9, + efmcColumn11 = 1 << 10, + efmcColumn12 = 1 << 11, + efmcColumn13 = 1 << 12, + efmcColumn14 = 1 << 13, + efmcColumn15 = 1 << 14, + efmcColumn16 = 1 << 15, + efmcColumn17 = 1 << 16, + efmcColumn18 = 1 << 17, + efmcColumn19 = 1 << 18, + efmcColumn20 = 1 << 19, + efmcColumn21 = 1 << 20, + efmcColumn22 = 1 << 21, + efmcColumn23 = 1 << 22, + efmcColumn24 = 1 << 23, + efmcColumn25 = 1 << 24, + efmcColumn26 = 1 << 25, + efmcColumn27 = 1 << 26, + efmcColumn28 = 1 << 27, + efmcColumn29 = 1 << 28, + efmcColumn30 = 1 << 29, + efmcColumn31 = 1 << 30, + efmcColumn32 = 1 << 31, +}; + +// Keeps track of the query instance for the reading CA (deferred CA) +typedef struct WCA_WRAPQUERY_STRUCT +{ + // These are used to size our dynamic arrays below + DWORD dwColumns, dwRows, dwNextIndex; + + // Dynamic arrays of column schema information + eColumnDataType *pcdtColumnType; + LPWSTR *ppwzColumnNames; + + // Dynamic array of raw record data + MSIHANDLE *phRecords; +} *WCA_WRAPQUERY_HANDLE; + +// Wrap a query +// Setting the pfFormatMask enables control over which fields will be formatted, and which will be left unchanged +// Setting dwComponentColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two additional columns to the right side of the table +// - ISInstalled and ISAction - which map to the ComponentState of the component (the component is found in the column specified) +// Note that if a component is NULL, the component state columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately +// Setting dwDirectoryColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two more additional columns to the right side of the table +// - SourcePath and TargetPath - which map to the Directory's Source and Target Path (the directory is found in the column specified) +// Note that if a directory is NULL, the directory source/target path columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately +HRESULT WIXAPI WcaWrapQuery( + __in_z LPCWSTR pwzQuery, + __inout LPWSTR * ppwzCustomActionData, + __in_opt DWORD dwFormatMask, + __in_opt DWORD dwComponentColumn, + __in_opt DWORD dwDirectoryColumn + ); +// This wraps an empty table query into the custom action data - this is a way to indicate to the deferred custom action that a necessary table doesn't exist, or its query returned no results +HRESULT WIXAPI WcaWrapEmptyQuery( + __inout LPWSTR * ppwzCustomActionData + ); + +// Open a new unwrap query operation, with data from the ppwzCustomActionData string +HRESULT WIXAPI WcaBeginUnwrapQuery( + __out WCA_WRAPQUERY_HANDLE * phWrapQuery, + __inout LPWSTR * ppwzCustomActionData + ); + +// Get the number of records in a query being unwrapped +DWORD WIXAPI WcaGetQueryRecords( + __in const WCA_WRAPQUERY_HANDLE hWrapQuery + ); + +// This function resets a query back to its first row, so that the next fetch returns the first record +void WIXAPI WcaFetchWrappedReset( + __in WCA_WRAPQUERY_HANDLE hWrapQuery + ); +// Fetch the next record in this query +// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item. +// so, don't use this function with PMSIHANDLE objects! +HRESULT WIXAPI WcaFetchWrappedRecord( + __in WCA_WRAPQUERY_HANDLE hWrapQuery, + __out MSIHANDLE* phRec + ); + +// Fetch the next record in the query where the string value in column dwComparisonColumn equals the value pwzExpectedValue +// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item. +// so, don't use this function with PMSIHANDLE objects! +HRESULT WIXAPI WcaFetchWrappedRecordWhereString( + __in WCA_WRAPQUERY_HANDLE hWrapQuery, + __in DWORD dwComparisonColumn, + __in_z LPCWSTR pwzExpectedValue, + __out MSIHANDLE* phRec + ); + +// Release a query ID (frees memory, and frees the ID for a new query) +void WIXAPI WcaFinishUnwrapQuery( + __in_opt WCA_WRAPQUERY_HANDLE hWrapQuery + ); diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/wiutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/wiutil.h index e29ce5a8ba..0325a0143c 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/wiutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/wiutil.h @@ -1,50 +1,50 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// Header for Windows Installer helper functions. -// -//------------------------------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define MAX_DARWIN_KEY 73 -#define MAX_DARWIN_COLUMN 255 - -#define ReleaseMsi(h) if (h) { ::MsiCloseHandle(h); } -#define ReleaseNullMsi(h) if (h) { ::MsiCloseHandle(h); h = NULL; } - -HRESULT DAPI WiuGetComponentPath( - __in_z LPCWSTR wzProductCode, - __in_z LPCWSTR wzComponentId, - __out LPWSTR* ppwzPath - ); - -HRESULT DAPI WiuGetProductInfo( - __in_z LPCWSTR wzProductCode, - __in_z LPCWSTR wzProperty, - __out LPWSTR* ppwzValue - ); - -HRESULT DAPI WiuGetProductProperty( - __in MSIHANDLE hProduct, - __in_z LPCWSTR wzProperty, - __out LPWSTR* ppwzValue - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// Header for Windows Installer helper functions. +// +//------------------------------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_DARWIN_KEY 73 +#define MAX_DARWIN_COLUMN 255 + +#define ReleaseMsi(h) if (h) { ::MsiCloseHandle(h); } +#define ReleaseNullMsi(h) if (h) { ::MsiCloseHandle(h); h = NULL; } + +HRESULT DAPI WiuGetComponentPath( + __in_z LPCWSTR wzProductCode, + __in_z LPCWSTR wzComponentId, + __out LPWSTR* ppwzPath + ); + +HRESULT DAPI WiuGetProductInfo( + __in_z LPCWSTR wzProductCode, + __in_z LPCWSTR wzProperty, + __out LPWSTR* ppwzValue + ); + +HRESULT DAPI WiuGetProductProperty( + __in MSIHANDLE hProduct, + __in_z LPCWSTR wzProperty, + __out LPWSTR* ppwzValue + ); + +#ifdef __cplusplus +} +#endif diff --git a/msi/build/A2Staging/wix35-binaries/sdk/inc/xmlutil.h b/msi/build/A2Staging/wix35-binaries/sdk/inc/xmlutil.h index ce59975fd5..dca3451b33 100644 --- a/msi/build/A2Staging/wix35-binaries/sdk/inc/xmlutil.h +++ b/msi/build/A2Staging/wix35-binaries/sdk/inc/xmlutil.h @@ -1,183 +1,183 @@ -#pragma once -//------------------------------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. -// -// You must not remove this notice, or any other, from this software. -// -// -// -// XML helper funtions. -// -//------------------------------------------------------------------------------------------------- - -// constant XML CLSIDs and IIDs -extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument = {0x2933BF90, 0x7B36, 0x11d2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}}; -extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument20 = {0xF6D90F11, 0x9C73, 0x11D3, {0xB3, 0x2E, 0x00, 0xC0, 0x4F, 0x99, 0x0B, 0xB4}}; -extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument26 = {0xf5078f1b, 0xc551, 0x11d3, {0x89, 0xb9, 0x00, 0x00, 0xf8, 0x1f, 0xe2, 0x21}}; -extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument30 = {0xf5078f32, 0xc551, 0x11d3, {0x89, 0xb9, 0x00, 0x00, 0xf8, 0x1f, 0xe2, 0x21}}; -extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument40 = {0x88d969c0, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; -extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument50 = {0x88d969e5, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; -extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument60 = {0x88d96a05, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; -extern __declspec(selectany) const CLSID XmlUtil_CLSID_XMLSchemaCache = {0x88d969c2, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; - -extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMDocument = {0x2933BF81, 0x7B36, 0x11D2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}}; -extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMDocument2 = {0x2933BF95, 0x7B36, 0x11D2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}}; -extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMSchemaCollection = {0x373984C8, 0xB845, 0x449B, {0x91, 0xE7, 0x45, 0xAC, 0x83, 0x03, 0x6A, 0xDE}}; - -enum XML_LOAD_ATTRIBUTE -{ - XML_LOAD_PRESERVE_WHITESPACE = 1, -}; - - -#ifdef __cplusplus -extern "C" { -#endif - -HRESULT DAPI XmlInitialize(); -void DAPI XmlUninitialize(); - -HRESULT DAPI XmlCreateElement( - __in IXMLDOMDocument *pixdDocument, - __in_z LPCWSTR wzElementName, - __out IXMLDOMElement **ppixnElement - ); -HRESULT DAPI XmlCreateDocument( - __in_opt LPCWSTR pwzElementName, - __out IXMLDOMDocument** ppixdDocument, - __out_opt IXMLDOMElement** ppixeRootElement = NULL - ); -HRESULT DAPI XmlLoadDocument( - __in_z LPCWSTR wzDocument, - __out IXMLDOMDocument** ppixdDocument - ); -HRESULT DAPI XmlLoadDocumentEx( - __in_z LPCWSTR wzDocument, - __in DWORD dwAttributes, - __out IXMLDOMDocument** ppixdDocument - ); -HRESULT DAPI XmlLoadDocumentFromFile( - __in_z LPCWSTR wzPath, - __out IXMLDOMDocument** ppixdDocument - ); -HRESULT DAPI XmlLoadDocumentFromBuffer( - __in_bcount(cbSource) const BYTE* pbSource, - __in DWORD cbSource, - __out IXMLDOMDocument** ppixdDocument - ); -HRESULT DAPI XmlLoadDocumentFromFileEx( - __in_z LPCWSTR wzPath, - __in DWORD dwAttributes, - __out IXMLDOMDocument** ppixdDocument - ); -HRESULT DAPI XmlSelectSingleNode( - __in IXMLDOMNode* pixnParent, - __in_z LPCWSTR wzXPath, - __out IXMLDOMNode **ppixnChild - ); -HRESULT DAPI XmlSetAttribute( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR pwzAttribute, - __in_z LPCWSTR pwzAttributeValue - ); -HRESULT DAPI XmlCreateTextNode( - __in IXMLDOMDocument *pixdDocument, - __in_z LPCWSTR wzText, - __out IXMLDOMText **ppixnTextNode - ); -HRESULT DAPI XmlGetText( - __in IXMLDOMNode* pixnNode, - __deref_out_z BSTR* pbstrText - ); -HRESULT DAPI XmlGetAttribute( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR pwzAttribute, - __deref_out_z BSTR* pbstrAttributeValue - ); -HRESULT DAPI XmlGetAttributeEx( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR wzAttribute, - __deref_out_z LPWSTR* psczAttributeValue - ); -HRESULT DAPI XmlGetYesNoAttribute( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR wzAttribute, - __out BOOL* pfYes - ); -HRESULT DAPI XmlGetAttributeNumber( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR pwzAttribute, - __out DWORD* pdwValue - ); -HRESULT DAPI XmlGetAttributeNumberBase( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR pwzAttribute, - __in int nBase, - __out DWORD* pdwValue - ); -HRESULT DAPI XmlGetAttributeLargeNumber( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR pwzAttribute, - __out DWORD64* pdw64Value - ); -HRESULT DAPI XmlGetNamedItem( - __in IXMLDOMNamedNodeMap *pixnmAttributes, - __in_opt LPCWSTR wzName, - __out IXMLDOMNode **ppixnNamedItem - ); -HRESULT DAPI XmlSetText( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR pwzText - ); -HRESULT DAPI XmlSetTextNumber( - __in IXMLDOMNode *pixnNode, - __in DWORD dwValue - ); -HRESULT DAPI XmlCreateChild( - __in IXMLDOMNode* pixnParent, - __in_z LPCWSTR pwzElementType, - __out IXMLDOMNode** ppixnChild - ); -HRESULT DAPI XmlRemoveAttribute( - __in IXMLDOMNode* pixnNode, - __in_z LPCWSTR pwzAttribute - ); -HRESULT DAPI XmlSelectNodes( - __in IXMLDOMNode* pixnParent, - __in_z LPCWSTR wzXPath, - __out IXMLDOMNodeList **ppixnChild - ); -HRESULT DAPI XmlNextAttribute( - __in IXMLDOMNamedNodeMap* pixnnm, - __out IXMLDOMNode** pixnAttribute, - __deref_opt_out_z_opt BSTR* pbstrAttribute - ); -HRESULT DAPI XmlNextElement( - __in IXMLDOMNodeList* pixnl, - __out IXMLDOMNode** pixnElement, - __deref_opt_out_z_opt BSTR* pbstrElement - ); -HRESULT DAPI XmlRemoveChildren( - __in IXMLDOMNode* pixnSource, - __in_z LPCWSTR pwzXPath - ); -HRESULT DAPI XmlSaveDocument( - __in IXMLDOMDocument* pixdDocument, - __inout LPCWSTR wzPath - ); -HRESULT DAPI XmlSaveDocumentToBuffer( - __in IXMLDOMDocument* pixdDocument, - __deref_out_bcount(*pcbDest) BYTE** ppbDest, - __out DWORD* pcbDest - ); - -#ifdef __cplusplus -} -#endif +#pragma once +//------------------------------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. +// +// You must not remove this notice, or any other, from this software. +// +// +// +// XML helper funtions. +// +//------------------------------------------------------------------------------------------------- + +// constant XML CLSIDs and IIDs +extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument = {0x2933BF90, 0x7B36, 0x11d2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}}; +extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument20 = {0xF6D90F11, 0x9C73, 0x11D3, {0xB3, 0x2E, 0x00, 0xC0, 0x4F, 0x99, 0x0B, 0xB4}}; +extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument26 = {0xf5078f1b, 0xc551, 0x11d3, {0x89, 0xb9, 0x00, 0x00, 0xf8, 0x1f, 0xe2, 0x21}}; +extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument30 = {0xf5078f32, 0xc551, 0x11d3, {0x89, 0xb9, 0x00, 0x00, 0xf8, 0x1f, 0xe2, 0x21}}; +extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument40 = {0x88d969c0, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; +extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument50 = {0x88d969e5, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; +extern __declspec(selectany) const CLSID XmlUtil_CLSID_DOMDocument60 = {0x88d96a05, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; +extern __declspec(selectany) const CLSID XmlUtil_CLSID_XMLSchemaCache = {0x88d969c2, 0xf192, 0x11d4, {0xa6, 0x5f, 0x00, 0x40, 0x96, 0x32, 0x51, 0xe5}}; + +extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMDocument = {0x2933BF81, 0x7B36, 0x11D2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}}; +extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMDocument2 = {0x2933BF95, 0x7B36, 0x11D2, {0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60}}; +extern __declspec(selectany) const IID XmlUtil_IID_IXMLDOMSchemaCollection = {0x373984C8, 0xB845, 0x449B, {0x91, 0xE7, 0x45, 0xAC, 0x83, 0x03, 0x6A, 0xDE}}; + +enum XML_LOAD_ATTRIBUTE +{ + XML_LOAD_PRESERVE_WHITESPACE = 1, +}; + + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT DAPI XmlInitialize(); +void DAPI XmlUninitialize(); + +HRESULT DAPI XmlCreateElement( + __in IXMLDOMDocument *pixdDocument, + __in_z LPCWSTR wzElementName, + __out IXMLDOMElement **ppixnElement + ); +HRESULT DAPI XmlCreateDocument( + __in_opt LPCWSTR pwzElementName, + __out IXMLDOMDocument** ppixdDocument, + __out_opt IXMLDOMElement** ppixeRootElement = NULL + ); +HRESULT DAPI XmlLoadDocument( + __in_z LPCWSTR wzDocument, + __out IXMLDOMDocument** ppixdDocument + ); +HRESULT DAPI XmlLoadDocumentEx( + __in_z LPCWSTR wzDocument, + __in DWORD dwAttributes, + __out IXMLDOMDocument** ppixdDocument + ); +HRESULT DAPI XmlLoadDocumentFromFile( + __in_z LPCWSTR wzPath, + __out IXMLDOMDocument** ppixdDocument + ); +HRESULT DAPI XmlLoadDocumentFromBuffer( + __in_bcount(cbSource) const BYTE* pbSource, + __in DWORD cbSource, + __out IXMLDOMDocument** ppixdDocument + ); +HRESULT DAPI XmlLoadDocumentFromFileEx( + __in_z LPCWSTR wzPath, + __in DWORD dwAttributes, + __out IXMLDOMDocument** ppixdDocument + ); +HRESULT DAPI XmlSelectSingleNode( + __in IXMLDOMNode* pixnParent, + __in_z LPCWSTR wzXPath, + __out IXMLDOMNode **ppixnChild + ); +HRESULT DAPI XmlSetAttribute( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR pwzAttribute, + __in_z LPCWSTR pwzAttributeValue + ); +HRESULT DAPI XmlCreateTextNode( + __in IXMLDOMDocument *pixdDocument, + __in_z LPCWSTR wzText, + __out IXMLDOMText **ppixnTextNode + ); +HRESULT DAPI XmlGetText( + __in IXMLDOMNode* pixnNode, + __deref_out_z BSTR* pbstrText + ); +HRESULT DAPI XmlGetAttribute( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR pwzAttribute, + __deref_out_z BSTR* pbstrAttributeValue + ); +HRESULT DAPI XmlGetAttributeEx( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR wzAttribute, + __deref_out_z LPWSTR* psczAttributeValue + ); +HRESULT DAPI XmlGetYesNoAttribute( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR wzAttribute, + __out BOOL* pfYes + ); +HRESULT DAPI XmlGetAttributeNumber( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR pwzAttribute, + __out DWORD* pdwValue + ); +HRESULT DAPI XmlGetAttributeNumberBase( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR pwzAttribute, + __in int nBase, + __out DWORD* pdwValue + ); +HRESULT DAPI XmlGetAttributeLargeNumber( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR pwzAttribute, + __out DWORD64* pdw64Value + ); +HRESULT DAPI XmlGetNamedItem( + __in IXMLDOMNamedNodeMap *pixnmAttributes, + __in_opt LPCWSTR wzName, + __out IXMLDOMNode **ppixnNamedItem + ); +HRESULT DAPI XmlSetText( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR pwzText + ); +HRESULT DAPI XmlSetTextNumber( + __in IXMLDOMNode *pixnNode, + __in DWORD dwValue + ); +HRESULT DAPI XmlCreateChild( + __in IXMLDOMNode* pixnParent, + __in_z LPCWSTR pwzElementType, + __out IXMLDOMNode** ppixnChild + ); +HRESULT DAPI XmlRemoveAttribute( + __in IXMLDOMNode* pixnNode, + __in_z LPCWSTR pwzAttribute + ); +HRESULT DAPI XmlSelectNodes( + __in IXMLDOMNode* pixnParent, + __in_z LPCWSTR wzXPath, + __out IXMLDOMNodeList **ppixnChild + ); +HRESULT DAPI XmlNextAttribute( + __in IXMLDOMNamedNodeMap* pixnnm, + __out IXMLDOMNode** pixnAttribute, + __deref_opt_out_z_opt BSTR* pbstrAttribute + ); +HRESULT DAPI XmlNextElement( + __in IXMLDOMNodeList* pixnl, + __out IXMLDOMNode** pixnElement, + __deref_opt_out_z_opt BSTR* pbstrElement + ); +HRESULT DAPI XmlRemoveChildren( + __in IXMLDOMNode* pixnSource, + __in_z LPCWSTR pwzXPath + ); +HRESULT DAPI XmlSaveDocument( + __in IXMLDOMDocument* pixdDocument, + __inout LPCWSTR wzPath + ); +HRESULT DAPI XmlSaveDocumentToBuffer( + __in IXMLDOMDocument* pixdDocument, + __deref_out_bcount(*pcbDest) BYTE** ppbDest, + __out DWORD* pcbDest + ); + +#ifdef __cplusplus +} +#endif diff --git a/nativeLib/build.native/build.native.ecl b/nativeLib/build.native/build.native.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/build.ohd/build.ohd.ecl b/nativeLib/build.ohd/build.ohd.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/com.raytheon.uf.nativelib.cimport/com.raytheon.uf.nativelib.cimport.ecl b/nativeLib/com.raytheon.uf.nativelib.cimport/com.raytheon.uf.nativelib.cimport.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/com.raytheon.uf.nativelib.feature/com.raytheon.uf.nativelib.feature.ecl b/nativeLib/com.raytheon.uf.nativelib.feature/com.raytheon.uf.nativelib.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/dist.native/dist.native.ecl b/nativeLib/dist.native/dist.native.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id b/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id index a9c10210ce..ab1e8b3642 100644 --- a/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id +++ b/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id @@ -1 +1 @@ -853369bfa5ae7458b8f31dc33c6a817a6e257e36 \ No newline at end of file +43a91b8b2ef2c9fc8df4133865f8e9048d01fcf5 \ No newline at end of file diff --git a/nativeLib/docs.native/docs.native.ecl b/nativeLib/docs.native/docs.native.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/docs.ohd/docs.ohd.ecl b/nativeLib/docs.ohd/docs.ohd.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/edexBridge/edexBridge.ecl b/nativeLib/edexBridge/edexBridge.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/edex_com/edex_com.ecl b/nativeLib/edex_com/edex_com.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/edex_com/src/PointDataServerRequest.cpp b/nativeLib/edex_com/src/PointDataServerRequest.cpp old mode 100644 new mode 100755 diff --git a/nativeLib/edex_com/src/PointDataServerRequest.h b/nativeLib/edex_com/src/PointDataServerRequest.h old mode 100644 new mode 100755 diff --git a/nativeLib/edex_notify/edex_notify.ecl b/nativeLib/edex_notify/edex_notify.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/edex_pdc/edex_pdc.ecl b/nativeLib/edex_pdc/edex_pdc.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/gridslice/gridslice.ecl b/nativeLib/gridslice/gridslice.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/gridslice/src/gridslice.c b/nativeLib/gridslice/src/gridslice.c index 9f53c5a0cb..6d8fcd81fe 100644 --- a/nativeLib/gridslice/src/gridslice.c +++ b/nativeLib/gridslice/src/gridslice.c @@ -1,365 +1,365 @@ -/***************************************************************************************** - * COPYRIGHT (c), 2009, 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. - ******************************************************************************************/ - -/* - * Python module that utilizes the AWIPSI sliceConvert functions to offer - * slicing capability to numpy arrays. - * - *
    - *
    - * SOFTWARE HISTORY
    - *
    - * Date         Ticket#     Engineer    Description
    - * ------------ ----------  ----------- --------------------------
    - * 11/17/09     3580        brockwoo    Initial Creation
    - *
    - * 
    - * - * @author brockwoo - * @version 1 - */ - -#include -#include -#include -#include "numpy/arrayobject.h" -#include "sliceConvert.h" - -static PyObject *GridSliceError; - -static int dimensions(PyObject * array) { - int returnValue = 0; - int aDim = PyArray_NDIM(array); - if (aDim == 3) { - returnValue |= 4; // 2d arrays - } else if (aDim == 2) { - npy_int * aDimList = PyArray_DIMS(array); - if (aDimList[0] == 1) { - returnValue |= 1; //linear array - } - } else { - returnValue |= 8; // Unsupported - } - return returnValue; -} - -static PyObject * defineNumpySlice(PyObject *self, PyObject* args) -/* float ** vc3d, float ** param3d, int mnx, - int nx, int ny, int nz, float param, int sense, float * vc2d) */{ - PyObject * vc; - PyObject * param; - //int mx = 0; - int nx = 0; - int ny = 0; - int nz = 0; - float targetLevel; - int sense; - int vu, pu, uniformity; - float * vc2d; - float ** vc3d; - int * vc3dDim; - float ** param3d; - int * param3dDim; - int levelCount; - int vnz, pnz, vny , pny , vnx , pnx; - int dimSize[2]; - npy_int * vdimList; - npy_int * pdimList; - - if (!PyArg_ParseTuple(args, "OOfi", &vc, ¶m, &targetLevel, &sense)) { - return NULL; - } - - vu = dimensions(vc); - pu = dimensions(param); - uniformity = (vu | pu); - - if ((uniformity >> 3) == 1) { - PyErr_SetString(GridSliceError, - "One of the numpy arrays passed cannot be used for slicing."); - return NULL; - } - - vdimList = PyArray_DIMS(vc); - pdimList = PyArray_DIMS(param); - vc2d = 0; - if (uniformity == 4) { // two cubes - if (vdimList[0] != pdimList[0] || vdimList[1] != pdimList[1] - || vdimList[2] != pdimList[2]) { - PyErr_SetString(GridSliceError, - "Dimensions are different between cubes. Calculation cannot be done."); - return NULL; - } - nz = vdimList[0]; - ny = vdimList[1]; - nx = vdimList[2]; - vc3d = (float**) malloc(nz * sizeof(float*)); - param3d = (float**) malloc(nz * sizeof(float*)); - vc2d = (float*) malloc(nx * ny * sizeof(float)); - levelCount = 0; - for (levelCount = 0; levelCount < nz; levelCount++) { - vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); - param3d[levelCount] = (float *) PyArray_GETPTR1(param, levelCount); - } - - defineSlice(vc3d, param3d, nx, nx, ny, nz, targetLevel, sense, vc2d); - free(vc3d); - free(param3d); - } else if (uniformity < 4 || uniformity == 5) { // one cube and one constant or two constants - vnz = (vu == 4) ? vdimList[0] : vdimList[1]; - pnz = (pu == 4) ? pdimList[0] : pdimList[1]; - vny = (vu == 4) ? vdimList[1] : 0; - pny = (pu == 4) ? pdimList[1] : 0; - vnx = (vu == 4) ? vdimList[2] : 0; - pnx = (pu == 4) ? pdimList[2] : 0; - if (vnz != pnz) { - PyErr_SetString(GridSliceError, - "Dimensions are different between the arrays. Calculation cannot be done."); - return NULL; - } - nz = vnz; - ny = vny >= pny ? vny : pny; - nx = vnx >= pnx ? vnx : pnx; - vc3d = (float**) malloc(nz * sizeof(float*)); - param3d = (float**) malloc(nz * sizeof(float*)); - vc2d = (float*) malloc(nx * ny * sizeof(float)); - vc3dDim = (int*) malloc(nz * sizeof(int)); - param3dDim = (int*) malloc(nz * sizeof(int)); - - levelCount = 0; - for (levelCount = 0; levelCount < nz; levelCount++) { - if (vu == 4) { - vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); - vc3dDim[levelCount] = 2; - } else { - vc3d[levelCount] = (float *) PyArray_GETPTR2(vc, 0, levelCount); - vc3dDim[levelCount] = 0; - } - if (pu == 4) { - param3d[levelCount] - = (float *) PyArray_GETPTR1(param, levelCount); - param3dDim[levelCount] = 2; - } else { - param3d[levelCount] - = (float *) PyArray_GETPTR2(param, 0, levelCount); - param3dDim[levelCount] = 0; - } - - } - defineSliceD(vc3d, vc3dDim, param3d, param3dDim, nx, nx, ny, nz, - targetLevel, sense, vc2d); - free(vc3d); - free(param3d); - free(vc3dDim); - free(param3dDim); - } - - if (vc2d) { - PyObject * pyVc2d; - dimSize[0] = ny; - dimSize[1] = nx; - pyVc2d = PyArray_SimpleNew(2, dimSize, NPY_FLOAT); - memcpy(((PyArrayObject *) pyVc2d)->data, vc2d, nx * ny * sizeof(float)); - free(vc2d); - return pyVc2d; - } else { - PyErr_SetString( - GridSliceError, - "The result grid returned was empty. Please check your initial data and try again."); - return NULL; - } -} - -static PyObject * createNumpySlice(PyObject *self, PyObject* args) -/*float ** vc3d, float * vc2d, - float ** slice3d, int mnx, int nx, int ny, int nz, int sense, - float * slice)*/{ - - PyObject * vc; - PyObject * s3d; - //int mx = 0; - int nx = 0; - int ny = 0; - int nz = 0; - PyObject * targetLevel; - int sense; - int hyb = DOINTERP; - int vu; - int su; - int uniformity; - int vnz; - float * slice = 0; - float ** vc3d ; - float ** slice3d; - int * vc3dDim ; - int levelCount; - float * vc2d ; - int dimSize[2]; - npy_int * vdimList; - npy_int * sdimList; - - if (!PyArg_ParseTuple(args, "OOOi|i", &vc, &s3d, &targetLevel, &sense, &hyb)) { - return NULL; - } - - vu = dimensions(vc); - su = dimensions(s3d); - uniformity = (vu | su); - - vdimList = PyArray_DIMS(vc); - sdimList = PyArray_DIMS(s3d); - - if (uniformity == 4) { - if (vdimList[0] != sdimList[0] || vdimList[1] != sdimList[1] - || vdimList[2] != sdimList[2]) { - PyErr_SetString(GridSliceError, - "Dimensions are different between cubes. Calculation cannot be done."); - return NULL; - } - nz = vdimList[0]; - ny = vdimList[1]; - nx = vdimList[2]; - vc3d = (float**) malloc(nz * sizeof(float*)); - slice3d = (float**) malloc(nz * sizeof(float*)); - slice = (float*) malloc(nx * ny * sizeof(float)); - levelCount = 0; - vc2d = (float *) PyArray_GETPTR1(targetLevel, 0); - for (levelCount = 0; levelCount < nz; levelCount++) { - vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); - slice3d[levelCount] = (float *) PyArray_GETPTR1(s3d, levelCount); - } - if (hyb == DOINTERP) { - createSlice(vc3d, vc2d, slice3d, nx, nx, ny, nz, sense, slice); - } else { - sampleSlice(vc3d, vc2d, slice3d, nx, nx, ny, nz, sense, hyb, slice); - } - - free(vc3d); - free(slice3d); - } else if (vu < 4 && su == 4) { // one cube and one constant or two constants - vnz = (vu == 4) ? vdimList[0] : vdimList[1]; - if (vnz != sdimList[0]) { - PyErr_SetString(GridSliceError, - "Dimensions are different between the arrays. Calculation cannot be done."); - return NULL; - } - nz = sdimList[0]; - ny = sdimList[1]; - nx = sdimList[2]; - vc3d = (float**) malloc(nz * sizeof(float*)); - slice3d = (float**) malloc(nz * sizeof(float*)); - vc3dDim = (int*) malloc(nz * sizeof(int)); - slice = (float*) malloc(nx * ny * sizeof(float)); - levelCount = 0; - for (levelCount = 0; levelCount < nz; levelCount++) { - if (vu == 4) { - vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); - vc3dDim[levelCount] = 2; - } else { - vc3d[levelCount] = (float *) PyArray_GETPTR2(vc, 0, levelCount); - vc3dDim[levelCount] = 0; - } - slice3d[levelCount] = (float *) PyArray_GETPTR1(s3d, levelCount); - } - vc2d = (float *) PyArray_GETPTR1(targetLevel, 0); - if (hyb == DOINTERP) { - createSliceD(vc3d, vc3dDim, vc2d, 2, slice3d, nx, nx, ny, nz, sense, slice); - } else { - sampleSliceD(vc3d, vc3dDim, vc2d, 2, slice3d, nx, nx, ny, nz, sense, hyb, slice); - } - free(vc3d); - free(slice3d); - free(vc3dDim); - } - - if (slice) { - PyObject * pyVc2d; - dimSize[0] = ny; - dimSize[1] = nx; - pyVc2d = PyArray_SimpleNew(2, dimSize, NPY_FLOAT); - memcpy(((PyArrayObject *) pyVc2d)->data, slice, nx * ny * sizeof(float)); - free(slice); - return pyVc2d; - } else { - PyErr_SetString( - GridSliceError, - "The result grid returned was empty. Please check your initial data and try again."); - return NULL; - } - - return NULL; -} - -static PyObject * createNumpySliceD(PyObject *self, PyObject* args) -/*float ** vc3d, int * dim3, float * vc2d, - int dim2, float ** slice3d, int mnx, int nx, int ny, int nz, int sense, - float * slice)*/{ - return NULL; -} - -static PyObject * sampleNumpySlice(PyObject *self, PyObject* args) -/*float ** vc3d, float * vc2d, - float ** slice3d, int mnx, int nx, int ny, int nz, int sense, int hyb, - float * slice)*/{ - return NULL; -} - -static PyObject * sampleNumpySliceD(PyObject *self, PyObject* args) -/*float ** vc3d, int * dim3, float * vc2d, - int dim2, float ** slice3d, int mnx, int nx, int ny, int nz, int sense, - int hyb, float * slice)*/{ - return NULL; -} - -static PyObject * defineNumpySlices(PyObject *self, PyObject* args) -/*float * vc3d, int senseA, float * param3d, - int senseB, int nx, int ny, int nz, float * paramC, int nc, float * vcC)*/{ - return NULL; -} - -static PyObject * createNumpySlices(PyObject *self, PyObject* args) -/*float * vc3d, float * param3d, int sense, - int nx, int ny, int nz, float * vcC, int nc, float * paramC)*/{ - return NULL; -} - -static PyMethodDef gridslice_methods[] = { { "defineNumpySlice", - defineNumpySlice, METH_VARARGS, "Description to be decided." }, { - "createNumpySlice", createNumpySlice, METH_VARARGS, - "Description to be decided." }, { "createNumpySliceD", - createNumpySliceD, METH_VARARGS, "Description to be decided." }, { - "sampleNumpySlice", sampleNumpySlice, METH_VARARGS, - "Description to be decided." }, { "sampleNumpySliceD", - sampleNumpySliceD, METH_VARARGS, "Description to be decided." }, { - "defineNumpySlices", defineNumpySlices, METH_VARARGS, - "Description to be decided." }, { "createNumpySlices", - createNumpySlices, METH_VARARGS, "Description to be decided." }, { - NULL, NULL, 0, NULL } /* sentinel */ -}; - -void initgridslice(void) { - PyObject *m; - import_array(); - PyImport_AddModule("gridslice"); - m = Py_InitModule("gridslice", gridslice_methods); - GridSliceError = PyErr_NewException("gridslice.error", NULL, NULL); - Py_INCREF(GridSliceError); - PyModule_AddObject(m, "error", GridSliceError); -} +/***************************************************************************************** + * COPYRIGHT (c), 2009, 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. + ******************************************************************************************/ + +/* + * Python module that utilizes the AWIPSI sliceConvert functions to offer + * slicing capability to numpy arrays. + * + *
    + *
    + * SOFTWARE HISTORY
    + *
    + * Date         Ticket#     Engineer    Description
    + * ------------ ----------  ----------- --------------------------
    + * 11/17/09     3580        brockwoo    Initial Creation
    + *
    + * 
    + * + * @author brockwoo + * @version 1 + */ + +#include +#include +#include +#include "numpy/arrayobject.h" +#include "sliceConvert.h" + +static PyObject *GridSliceError; + +static int dimensions(PyObject * array) { + int returnValue = 0; + int aDim = PyArray_NDIM(array); + if (aDim == 3) { + returnValue |= 4; // 2d arrays + } else if (aDim == 2) { + npy_int * aDimList = PyArray_DIMS(array); + if (aDimList[0] == 1) { + returnValue |= 1; //linear array + } + } else { + returnValue |= 8; // Unsupported + } + return returnValue; +} + +static PyObject * defineNumpySlice(PyObject *self, PyObject* args) +/* float ** vc3d, float ** param3d, int mnx, + int nx, int ny, int nz, float param, int sense, float * vc2d) */{ + PyObject * vc; + PyObject * param; + //int mx = 0; + int nx = 0; + int ny = 0; + int nz = 0; + float targetLevel; + int sense; + int vu, pu, uniformity; + float * vc2d; + float ** vc3d; + int * vc3dDim; + float ** param3d; + int * param3dDim; + int levelCount; + int vnz, pnz, vny , pny , vnx , pnx; + int dimSize[2]; + npy_int * vdimList; + npy_int * pdimList; + + if (!PyArg_ParseTuple(args, "OOfi", &vc, ¶m, &targetLevel, &sense)) { + return NULL; + } + + vu = dimensions(vc); + pu = dimensions(param); + uniformity = (vu | pu); + + if ((uniformity >> 3) == 1) { + PyErr_SetString(GridSliceError, + "One of the numpy arrays passed cannot be used for slicing."); + return NULL; + } + + vdimList = PyArray_DIMS(vc); + pdimList = PyArray_DIMS(param); + vc2d = 0; + if (uniformity == 4) { // two cubes + if (vdimList[0] != pdimList[0] || vdimList[1] != pdimList[1] + || vdimList[2] != pdimList[2]) { + PyErr_SetString(GridSliceError, + "Dimensions are different between cubes. Calculation cannot be done."); + return NULL; + } + nz = vdimList[0]; + ny = vdimList[1]; + nx = vdimList[2]; + vc3d = (float**) malloc(nz * sizeof(float*)); + param3d = (float**) malloc(nz * sizeof(float*)); + vc2d = (float*) malloc(nx * ny * sizeof(float)); + levelCount = 0; + for (levelCount = 0; levelCount < nz; levelCount++) { + vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); + param3d[levelCount] = (float *) PyArray_GETPTR1(param, levelCount); + } + + defineSlice(vc3d, param3d, nx, nx, ny, nz, targetLevel, sense, vc2d); + free(vc3d); + free(param3d); + } else if (uniformity < 4 || uniformity == 5) { // one cube and one constant or two constants + vnz = (vu == 4) ? vdimList[0] : vdimList[1]; + pnz = (pu == 4) ? pdimList[0] : pdimList[1]; + vny = (vu == 4) ? vdimList[1] : 0; + pny = (pu == 4) ? pdimList[1] : 0; + vnx = (vu == 4) ? vdimList[2] : 0; + pnx = (pu == 4) ? pdimList[2] : 0; + if (vnz != pnz) { + PyErr_SetString(GridSliceError, + "Dimensions are different between the arrays. Calculation cannot be done."); + return NULL; + } + nz = vnz; + ny = vny >= pny ? vny : pny; + nx = vnx >= pnx ? vnx : pnx; + vc3d = (float**) malloc(nz * sizeof(float*)); + param3d = (float**) malloc(nz * sizeof(float*)); + vc2d = (float*) malloc(nx * ny * sizeof(float)); + vc3dDim = (int*) malloc(nz * sizeof(int)); + param3dDim = (int*) malloc(nz * sizeof(int)); + + levelCount = 0; + for (levelCount = 0; levelCount < nz; levelCount++) { + if (vu == 4) { + vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); + vc3dDim[levelCount] = 2; + } else { + vc3d[levelCount] = (float *) PyArray_GETPTR2(vc, 0, levelCount); + vc3dDim[levelCount] = 0; + } + if (pu == 4) { + param3d[levelCount] + = (float *) PyArray_GETPTR1(param, levelCount); + param3dDim[levelCount] = 2; + } else { + param3d[levelCount] + = (float *) PyArray_GETPTR2(param, 0, levelCount); + param3dDim[levelCount] = 0; + } + + } + defineSliceD(vc3d, vc3dDim, param3d, param3dDim, nx, nx, ny, nz, + targetLevel, sense, vc2d); + free(vc3d); + free(param3d); + free(vc3dDim); + free(param3dDim); + } + + if (vc2d) { + PyObject * pyVc2d; + dimSize[0] = ny; + dimSize[1] = nx; + pyVc2d = PyArray_SimpleNew(2, dimSize, NPY_FLOAT); + memcpy(((PyArrayObject *) pyVc2d)->data, vc2d, nx * ny * sizeof(float)); + free(vc2d); + return pyVc2d; + } else { + PyErr_SetString( + GridSliceError, + "The result grid returned was empty. Please check your initial data and try again."); + return NULL; + } +} + +static PyObject * createNumpySlice(PyObject *self, PyObject* args) +/*float ** vc3d, float * vc2d, + float ** slice3d, int mnx, int nx, int ny, int nz, int sense, + float * slice)*/{ + + PyObject * vc; + PyObject * s3d; + //int mx = 0; + int nx = 0; + int ny = 0; + int nz = 0; + PyObject * targetLevel; + int sense; + int hyb = DOINTERP; + int vu; + int su; + int uniformity; + int vnz; + float * slice = 0; + float ** vc3d ; + float ** slice3d; + int * vc3dDim ; + int levelCount; + float * vc2d ; + int dimSize[2]; + npy_int * vdimList; + npy_int * sdimList; + + if (!PyArg_ParseTuple(args, "OOOi|i", &vc, &s3d, &targetLevel, &sense, &hyb)) { + return NULL; + } + + vu = dimensions(vc); + su = dimensions(s3d); + uniformity = (vu | su); + + vdimList = PyArray_DIMS(vc); + sdimList = PyArray_DIMS(s3d); + + if (uniformity == 4) { + if (vdimList[0] != sdimList[0] || vdimList[1] != sdimList[1] + || vdimList[2] != sdimList[2]) { + PyErr_SetString(GridSliceError, + "Dimensions are different between cubes. Calculation cannot be done."); + return NULL; + } + nz = vdimList[0]; + ny = vdimList[1]; + nx = vdimList[2]; + vc3d = (float**) malloc(nz * sizeof(float*)); + slice3d = (float**) malloc(nz * sizeof(float*)); + slice = (float*) malloc(nx * ny * sizeof(float)); + levelCount = 0; + vc2d = (float *) PyArray_GETPTR1(targetLevel, 0); + for (levelCount = 0; levelCount < nz; levelCount++) { + vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); + slice3d[levelCount] = (float *) PyArray_GETPTR1(s3d, levelCount); + } + if (hyb == DOINTERP) { + createSlice(vc3d, vc2d, slice3d, nx, nx, ny, nz, sense, slice); + } else { + sampleSlice(vc3d, vc2d, slice3d, nx, nx, ny, nz, sense, hyb, slice); + } + + free(vc3d); + free(slice3d); + } else if (vu < 4 && su == 4) { // one cube and one constant or two constants + vnz = (vu == 4) ? vdimList[0] : vdimList[1]; + if (vnz != sdimList[0]) { + PyErr_SetString(GridSliceError, + "Dimensions are different between the arrays. Calculation cannot be done."); + return NULL; + } + nz = sdimList[0]; + ny = sdimList[1]; + nx = sdimList[2]; + vc3d = (float**) malloc(nz * sizeof(float*)); + slice3d = (float**) malloc(nz * sizeof(float*)); + vc3dDim = (int*) malloc(nz * sizeof(int)); + slice = (float*) malloc(nx * ny * sizeof(float)); + levelCount = 0; + for (levelCount = 0; levelCount < nz; levelCount++) { + if (vu == 4) { + vc3d[levelCount] = (float *) PyArray_GETPTR1(vc, levelCount); + vc3dDim[levelCount] = 2; + } else { + vc3d[levelCount] = (float *) PyArray_GETPTR2(vc, 0, levelCount); + vc3dDim[levelCount] = 0; + } + slice3d[levelCount] = (float *) PyArray_GETPTR1(s3d, levelCount); + } + vc2d = (float *) PyArray_GETPTR1(targetLevel, 0); + if (hyb == DOINTERP) { + createSliceD(vc3d, vc3dDim, vc2d, 2, slice3d, nx, nx, ny, nz, sense, slice); + } else { + sampleSliceD(vc3d, vc3dDim, vc2d, 2, slice3d, nx, nx, ny, nz, sense, hyb, slice); + } + free(vc3d); + free(slice3d); + free(vc3dDim); + } + + if (slice) { + PyObject * pyVc2d; + dimSize[0] = ny; + dimSize[1] = nx; + pyVc2d = PyArray_SimpleNew(2, dimSize, NPY_FLOAT); + memcpy(((PyArrayObject *) pyVc2d)->data, slice, nx * ny * sizeof(float)); + free(slice); + return pyVc2d; + } else { + PyErr_SetString( + GridSliceError, + "The result grid returned was empty. Please check your initial data and try again."); + return NULL; + } + + return NULL; +} + +static PyObject * createNumpySliceD(PyObject *self, PyObject* args) +/*float ** vc3d, int * dim3, float * vc2d, + int dim2, float ** slice3d, int mnx, int nx, int ny, int nz, int sense, + float * slice)*/{ + return NULL; +} + +static PyObject * sampleNumpySlice(PyObject *self, PyObject* args) +/*float ** vc3d, float * vc2d, + float ** slice3d, int mnx, int nx, int ny, int nz, int sense, int hyb, + float * slice)*/{ + return NULL; +} + +static PyObject * sampleNumpySliceD(PyObject *self, PyObject* args) +/*float ** vc3d, int * dim3, float * vc2d, + int dim2, float ** slice3d, int mnx, int nx, int ny, int nz, int sense, + int hyb, float * slice)*/{ + return NULL; +} + +static PyObject * defineNumpySlices(PyObject *self, PyObject* args) +/*float * vc3d, int senseA, float * param3d, + int senseB, int nx, int ny, int nz, float * paramC, int nc, float * vcC)*/{ + return NULL; +} + +static PyObject * createNumpySlices(PyObject *self, PyObject* args) +/*float * vc3d, float * param3d, int sense, + int nx, int ny, int nz, float * vcC, int nc, float * paramC)*/{ + return NULL; +} + +static PyMethodDef gridslice_methods[] = { { "defineNumpySlice", + defineNumpySlice, METH_VARARGS, "Description to be decided." }, { + "createNumpySlice", createNumpySlice, METH_VARARGS, + "Description to be decided." }, { "createNumpySliceD", + createNumpySliceD, METH_VARARGS, "Description to be decided." }, { + "sampleNumpySlice", sampleNumpySlice, METH_VARARGS, + "Description to be decided." }, { "sampleNumpySliceD", + sampleNumpySliceD, METH_VARARGS, "Description to be decided." }, { + "defineNumpySlices", defineNumpySlices, METH_VARARGS, + "Description to be decided." }, { "createNumpySlices", + createNumpySlices, METH_VARARGS, "Description to be decided." }, { + NULL, NULL, 0, NULL } /* sentinel */ +}; + +void initgridslice(void) { + PyObject *m; + import_array(); + PyImport_AddModule("gridslice"); + m = Py_InitModule("gridslice", gridslice_methods); + GridSliceError = PyErr_NewException("gridslice.error", NULL, NULL); + Py_INCREF(GridSliceError); + PyModule_AddObject(m, "error", GridSliceError); +} diff --git a/nativeLib/gridslice/src/windows/project/gridslice.bat b/nativeLib/gridslice/src/windows/project/gridslice.bat index 4c3b036085..bcdef9dc18 100644 --- a/nativeLib/gridslice/src/windows/project/gridslice.bat +++ b/nativeLib/gridslice/src/windows/project/gridslice.bat @@ -1,89 +1,89 @@ -@echo OFF -REM This script will compile a Windows version of the gridslice library. -REM In order to compile the gridslice library, you will need to have -REM Microsoft Visual C++ 2008 installed and the AWIPS II Runtime Environment. -REM -REM This script should work on both a 32-bit and a 64-bit Windows 7 -REM installation. - - -SET CONTAINING_DIR=%~dp0 - -SET REG_EXE= -REM Determine what our architecture is. -IF "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( - GOTO OS_64_BIT -) ELSE ( - IF "%PROCESSOR_ARCHITECTURE%" == "x86" ( - GOTO OS_32_BIT - ) ELSE ( - echo "ERROR: Unrecognized Architecture." - PAUSE && EXIT 1 - ) -) - -:OS_32_BIT - SET REG_EXE=C:\Windows\System32\reg.exe - GOTO ARCH_KNOWN -:OS_64_BIT - SET REG_EXE=C:\Windows\SysWOW64\reg.exe - GOTO ARCH_KNOWN -:ARCH_KNOWN - -SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" - -%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 -IF ERRORLEVEL 1 ( - echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. - PAUSE && EXIT 1 -) - -REM Determine where AWIPS II Python has been installed. -FOR /F "tokens=2* delims= " %%A IN ( - '%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory' -) DO ( - SET PythonInstallDirectory=%%B -) - -cd "%CONTAINING_DIR%" - -REM Compile gridslice -cl.exe /LD "%CONTAINING_DIR%..\..\sliceConvert.c" ^ - "%CONTAINING_DIR%..\..\gridslice.c" ^ - -I"%PythonInstallDirectory%\Lib\site-packages\numpy\core\include" ^ - -I"%PythonInstallDirectory%\include" ^ - "%PythonInstallDirectory%\libs\python27.lib" ^ - /link/out:gridslice.pyd /EXPORT:initgridslice -if ERRORLEVEL 1 ( - echo ERROR: The gridslice compile has failed. - PAUSE && EXIT 1 -) - -REM Move the build artifacts to the build directory. -IF NOT EXIST "%CONTAINING_DIR%..\build" ( - MKDIR "%CONTAINING_DIR%..\build" -) -MOVE /Y "%CONTAINING_DIR%gridslice.pyd" ^ - "%CONTAINING_DIR%..\build" - -REM Cleanup the remaining non-essential build artifacts. -IF EXIST "%CONTAINING_DIR%gridslice.obj" ( - echo Y | DEL "%CONTAINING_DIR%gridslice.obj" -) -IF EXIST "%CONTAINING_DIR%gridslice.sln.cache" ( - echo Y | DEL "%CONTAINING_DIR%gridslice.sln.cache" -) -IF EXIST "%CONTAINING_DIR%sliceConvert.obj" ( - echo Y | DEL "%CONTAINING_DIR%sliceConvert.obj" -) -IF EXIST "%CONTAINING_DIR%sliceConvert.lib" ( - echo Y | DEL "%CONTAINING_DIR%sliceConvert.lib" -) -IF EXIST "%CONTAINING_DIR%sliceConvert.exp" ( - echo Y | DEL "%CONTAINING_DIR%sliceConvert.exp" -) - -echo. -echo. -echo The gridslice compile was successful. -PAUSE +@echo OFF +REM This script will compile a Windows version of the gridslice library. +REM In order to compile the gridslice library, you will need to have +REM Microsoft Visual C++ 2008 installed and the AWIPS II Runtime Environment. +REM +REM This script should work on both a 32-bit and a 64-bit Windows 7 +REM installation. + + +SET CONTAINING_DIR=%~dp0 + +SET REG_EXE= +REM Determine what our architecture is. +IF "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( + GOTO OS_64_BIT +) ELSE ( + IF "%PROCESSOR_ARCHITECTURE%" == "x86" ( + GOTO OS_32_BIT + ) ELSE ( + echo "ERROR: Unrecognized Architecture." + PAUSE && EXIT 1 + ) +) + +:OS_32_BIT + SET REG_EXE=C:\Windows\System32\reg.exe + GOTO ARCH_KNOWN +:OS_64_BIT + SET REG_EXE=C:\Windows\SysWOW64\reg.exe + GOTO ARCH_KNOWN +:ARCH_KNOWN + +SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" + +%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 +IF ERRORLEVEL 1 ( + echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. + PAUSE && EXIT 1 +) + +REM Determine where AWIPS II Python has been installed. +FOR /F "tokens=2* delims= " %%A IN ( + '%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory' +) DO ( + SET PythonInstallDirectory=%%B +) + +cd "%CONTAINING_DIR%" + +REM Compile gridslice +cl.exe /LD "%CONTAINING_DIR%..\..\sliceConvert.c" ^ + "%CONTAINING_DIR%..\..\gridslice.c" ^ + -I"%PythonInstallDirectory%\Lib\site-packages\numpy\core\include" ^ + -I"%PythonInstallDirectory%\include" ^ + "%PythonInstallDirectory%\libs\python27.lib" ^ + /link/out:gridslice.pyd /EXPORT:initgridslice +if ERRORLEVEL 1 ( + echo ERROR: The gridslice compile has failed. + PAUSE && EXIT 1 +) + +REM Move the build artifacts to the build directory. +IF NOT EXIST "%CONTAINING_DIR%..\build" ( + MKDIR "%CONTAINING_DIR%..\build" +) +MOVE /Y "%CONTAINING_DIR%gridslice.pyd" ^ + "%CONTAINING_DIR%..\build" + +REM Cleanup the remaining non-essential build artifacts. +IF EXIST "%CONTAINING_DIR%gridslice.obj" ( + echo Y | DEL "%CONTAINING_DIR%gridslice.obj" +) +IF EXIST "%CONTAINING_DIR%gridslice.sln.cache" ( + echo Y | DEL "%CONTAINING_DIR%gridslice.sln.cache" +) +IF EXIST "%CONTAINING_DIR%sliceConvert.obj" ( + echo Y | DEL "%CONTAINING_DIR%sliceConvert.obj" +) +IF EXIST "%CONTAINING_DIR%sliceConvert.lib" ( + echo Y | DEL "%CONTAINING_DIR%sliceConvert.lib" +) +IF EXIST "%CONTAINING_DIR%sliceConvert.exp" ( + echo Y | DEL "%CONTAINING_DIR%sliceConvert.exp" +) + +echo. +echo. +echo The gridslice compile was successful. +PAUSE diff --git a/nativeLib/ncep_grib2module/ncep_grib2module.ecl b/nativeLib/ncep_grib2module/ncep_grib2module.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.bias_trans/ohd.bias_trans.ecl b/nativeLib/ohd.bias_trans/ohd.bias_trans.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.common/ohd.common.ecl b/nativeLib/ohd.common/ohd.common.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.damcrest/ohd.damcrest.ecl b/nativeLib/ohd.damcrest/ohd.damcrest.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.damcrestdb/ohd.damcrestdb.ecl b/nativeLib/ohd.damcrestdb/ohd.damcrestdb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.db/ohd.db.ecl b/nativeLib/ohd.db/ohd.db.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.dimensions_file_uploader/ohd.dimensions_file_uploader.ecl b/nativeLib/ohd.dimensions_file_uploader/ohd.dimensions_file_uploader.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.fcstservice/ohd.fcstservice.ecl b/nativeLib/ohd.fcstservice/ohd.fcstservice.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.ihfsdb/ohd.ihfsdb.ecl b/nativeLib/ohd.ihfsdb/ohd.ihfsdb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.lib/ohd.lib.ecl b/nativeLib/ohd.lib/ohd.lib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.map/ohd.map.ecl b/nativeLib/ohd.map/ohd.map.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.misc_dialogs/ohd.misc_dialogs.ecl b/nativeLib/ohd.misc_dialogs/ohd.misc_dialogs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.mpe/ohd.mpe.ecl b/nativeLib/ohd.mpe/ohd.mpe.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.pdc_pp/ohd.pdc_pp.ecl b/nativeLib/ohd.pdc_pp/ohd.pdc_pp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.prism/ohd.prism.ecl b/nativeLib/ohd.prism/ohd.prism.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.rax_apps/ohd.rax_apps.ecl b/nativeLib/ohd.rax_apps/ohd.rax_apps.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.raxdb/ohd.raxdb.ecl b/nativeLib/ohd.raxdb/ohd.raxdb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.rivermonitor/ohd.rivermonitor.ecl b/nativeLib/ohd.rivermonitor/ohd.rivermonitor.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.sshp/ohd.sshp.ecl b/nativeLib/ohd.sshp/ohd.sshp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.swttable/ohd.swttable.ecl b/nativeLib/ohd.swttable/ohd.swttable.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.sys_monitor/ohd.sys_monitor.ecl b/nativeLib/ohd.sys_monitor/ohd.sys_monitor.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.tsl/ohd.tsl.ecl b/nativeLib/ohd.tsl/ohd.tsl.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/ohd.var/ohd.var.ecl b/nativeLib/ohd.var/ohd.var.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/org.apache.qpid/org.apache.qpid.ecl b/nativeLib/org.apache.qpid/org.apache.qpid.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/org.apache.thrift/org.apache.thrift.ecl b/nativeLib/org.apache.thrift/org.apache.thrift.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.cots.ant-contrib/rary.cots.ant-contrib.ecl b/nativeLib/rary.cots.ant-contrib/rary.cots.ant-contrib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.cots.gfortran/rary.cots.gfortran.ecl b/nativeLib/rary.cots.gfortran/rary.cots.gfortran.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.cots.jasper/rary.cots.jasper.ecl b/nativeLib/rary.cots.jasper/rary.cots.jasper.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.cots.java/rary.cots.java.ecl b/nativeLib/rary.cots.java/rary.cots.java.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyembed.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyembed.c old mode 100755 new mode 100644 diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjclass.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjclass.c old mode 100755 new mode 100644 diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethod.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethod.c old mode 100755 new mode 100644 diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethodwrapper.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethodwrapper.c old mode 100755 new mode 100644 diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c old mode 100755 new mode 100644 index d0fc938eb1..69bc8fba9e --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c @@ -1,969 +1,969 @@ -/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ -/* - jep - Java Embedded Python - - Copyright (c) 2004 - 2008 Mike Johnson. - - This file is licenced under the the zlib/libpng License. - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any - damages arising from the use of this software. - - Permission is granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -#ifdef WIN32 -# include "winconfig.h" -#endif - -#include /* added by bkowal */ - -#if HAVE_CONFIG_H -# include -#endif - -#if HAVE_UNISTD_H -# include -# include -#endif - -// shut up the compiler -#ifdef _POSIX_C_SOURCE -# undef _POSIX_C_SOURCE -#endif -#include - -// shut up the compiler -#ifdef _POSIX_C_SOURCE -# undef _POSIX_C_SOURCE -#endif -#ifdef _FILE_OFFSET_BITS -# undef _FILE_OFFSET_BITS -#endif -#include "Python.h" - -#include "pyembed.h" -#include "pyjobject.h" -#include "pyjmethod.h" -#include "pyjfield.h" -#include "pyjclass.h" -#include "util.h" - -// added by njensen -#include "numpy/arrayobject.h" -#include "pyjmethodwrapper.h" - -staticforward PyTypeObject PyJobject_Type; - -static int pyjobject_init(JNIEnv *env, PyJobject_Object*); -static int pyjobject_setattr(PyJobject_Object*, char*, PyObject*); -static void pyjobject_addmethod(PyJobject_Object*, PyObject*); -static void pyjobject_addfield(PyJobject_Object*, PyObject*); -static void pyjobject_dealloc(PyJobject_Object*); - -static jmethodID objectGetClass = 0; -static jmethodID classGetMethods = 0; -static jmethodID classGetFields = 0; - -static jmethodID xMethod = 0; -static jmethodID yMethod = 0; -static jmethodID getMethod = 0; - -// added by njensen -static jclass floatarrayclass = NULL; -static jclass bytearrayclass = NULL; -static jclass intarrayclass = NULL; -static jclass stringclass = NULL; - -// added by njensen -static jmethodID classGetName = 0; -static PyObject* classnamePyJMethodsDict = NULL; - -// called internally to make new PyJobject_Object instances -PyObject* pyjobject_new(JNIEnv *env, jobject obj) { - PyJobject_Object *pyjob; - - if(PyType_Ready(&PyJobject_Type) < 0) - return NULL; - if(!obj) { - PyErr_Format(PyExc_RuntimeError, "Invalid object."); - return NULL; - } - - pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type); - pyjob->object = (*env)->NewGlobalRef(env, obj); - pyjob->clazz = (*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, obj)); - pyjob->pyjclass = NULL; - pyjob->attr = PyList_New(0); - pyjob->methods = PyList_New(0); - pyjob->fields = PyList_New(0); - pyjob->finishAttr = 0; - - if(pyjobject_init(env, pyjob)) - return (PyObject *) pyjob; - return NULL; -} - - -PyObject* pyjobject_new_class(JNIEnv *env, jclass clazz) { - PyJobject_Object *pyjob; - - if(!clazz) { - PyErr_Format(PyExc_RuntimeError, "Invalid class object."); - return NULL; - } - - pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type); - pyjob->object = NULL; - pyjob->clazz = (*env)->NewGlobalRef(env, clazz); - pyjob->attr = PyList_New(0); - pyjob->methods = PyList_New(0); - pyjob->fields = PyList_New(0); - pyjob->finishAttr = 0; - - pyjob->pyjclass = pyjclass_new(env, (PyObject *) pyjob); - - if(pyjobject_init(env, pyjob)) - return (PyObject *) pyjob; - return NULL; -} - - -static int pyjobject_init(JNIEnv *env, PyJobject_Object *pyjob) { - jobjectArray methodArray = NULL; - jobjectArray fieldArray = NULL; - int i, len = 0; - jobject langClass = NULL; - - // added by njensen - jstring jClassName = NULL; - const char * charJClassName; - PyObject * pyJClassName = NULL; - PyObject * pyAttrName = NULL; - PyObject * cachedMethodList = NULL; - jclass lock = NULL; - - - (*env)->PushLocalFrame(env, 20); - // ------------------------------ call Class.getMethods() - - - // well, first call getClass() - if(objectGetClass == 0) { - objectGetClass = (*env)->GetMethodID(env, - pyjob->clazz, - "getClass", - "()Ljava/lang/Class;"); - if(process_java_exception(env) || !objectGetClass) - goto EXIT_ERROR; - } - - langClass = (*env)->CallObjectMethod(env, pyjob->clazz, objectGetClass); - if(process_java_exception(env) || !langClass) - goto EXIT_ERROR; - - // then, get methodid for getMethods() - if(classGetMethods == 0) { - classGetMethods = (*env)->GetMethodID(env, - langClass, - "getMethods", - "()[Ljava/lang/reflect/Method;"); - if(process_java_exception(env) || !classGetMethods) - goto EXIT_ERROR; - } - - // added by njensen - if(classGetName == 0) - { - classGetName = (*env)->GetMethodID(env, - langClass, - "getName", - "()Ljava/lang/String;"); - } - jClassName = (*env)->CallObjectMethod(env, pyjob->clazz, classGetName); - charJClassName = jstring2char(env, jClassName); - pyJClassName = PyString_FromString(charJClassName); - release_utf_char(env, jClassName, charJClassName); - pyAttrName = PyString_FromString("jclassname"); - if(PyObject_SetAttr((PyObject *) pyjob, - pyAttrName, - pyJClassName) != 0) - { - PyErr_Format(PyExc_RuntimeError, "Couldn't add jclassname as attribute."); - } - PyList_Append(pyjob->fields, pyAttrName); - Py_DECREF(pyAttrName); - (*env)->DeleteLocalRef(env, jClassName); - pyjob->jclassname = pyJClassName; - // end of jclassname code - - // begin synchronized - lock = (*env)->FindClass(env, "java/lang/String"); - if((*env)->MonitorEnter(env, lock) != JNI_OK) - { - PyErr_Format(PyExc_RuntimeError, "Couldn't get synchronization lock on class method creation."); - } - if(classnamePyJMethodsDict == NULL) - { - classnamePyJMethodsDict = PyDict_New(); - } - - cachedMethodList = PyDict_GetItem(classnamePyJMethodsDict, pyJClassName); - if(cachedMethodList == NULL) - { - PyObject* pyjMethodList = NULL; - pyjMethodList = PyList_New(0); - - // njensen: I changed the architecture to speed it up so it caches - // pyjmethods for each Java Class object, then applies that method - // to the object in question. The cache is built here, then - // pyjobject_getattr associates the object with the method, and - // pyjmethod_call ensures it is passed along. - - - // - GetMethodID fails when you pass the clazz object, it expects - // a java.lang.Class jobject. - // - if you CallObjectMethod with the langClass jclass object, - // it'll return an array of methods, but they're methods of the - // java.lang.reflect.Method class -- not ->object. - // - // so what i did here was find the methodid using langClass, - // but then i call the method using clazz. methodIds for java - // classes are shared.... - - methodArray = (jobjectArray) (*env)->CallObjectMethod(env, - pyjob->clazz, - classGetMethods); - if(process_java_exception(env) || !methodArray) - goto EXIT_ERROR; - - // for each method, create a new pyjmethod object - // and add to the internal methods list. - len = (*env)->GetArrayLength(env, methodArray); - for(i = 0; i < len; i++) { - PyJmethod_Object *pymethod = NULL; - jobject rmethod = NULL; - - rmethod = (*env)->GetObjectArrayElement(env, - methodArray, - i); - - // make new PyJmethod_Object, linked to pyjob - if(pyjob->object) - pymethod = pyjmethod_new(env, rmethod, pyjob); - else - pymethod = pyjmethod_new_static(env, rmethod, pyjob); - - if(!pymethod) - continue; - - if(pymethod->pyMethodName && PyString_Check(pymethod->pyMethodName)) { - if(PyList_Append(pyjMethodList, (PyObject*) pymethod) != 0) - printf("WARNING: couldn't add method"); - } - - Py_DECREF(pymethod); - (*env)->DeleteLocalRef(env, rmethod); - } - PyDict_SetItem(classnamePyJMethodsDict, pyJClassName, pyjMethodList); - cachedMethodList = pyjMethodList; - (*env)->DeleteLocalRef(env, methodArray); - } // end of looping over available methods - if((*env)->MonitorExit(env, lock) != JNI_OK) - { - PyErr_Format(PyExc_RuntimeError, "Couldn't release synchronization lock on class method creation."); - } - // end of synchronization - - len = PyList_Size(cachedMethodList); - for(i = 0; i < len; i++) - { - PyJmethod_Object* pymethod = (PyJmethod_Object*) PyList_GetItem(cachedMethodList, i); - if(PyObject_SetAttr((PyObject *) pyjob, pymethod->pyMethodName, (PyObject*) pymethod) != 0) - { - PyErr_Format(PyExc_RuntimeError, "Couldn't add method as attribute."); - } - else - { - pyjobject_addmethod(pyjob, pymethod->pyMethodName); - } - } - // end of cached method optimizations - - - // ------------------------------ process fields - - if(classGetFields == 0) { - classGetFields = (*env)->GetMethodID(env, - langClass, - "getFields", - "()[Ljava/lang/reflect/Field;"); - if(process_java_exception(env) || !classGetFields) - goto EXIT_ERROR; - } - - fieldArray = (jobjectArray) (*env)->CallObjectMethod(env, - pyjob->clazz, - classGetFields); - if(process_java_exception(env) || !fieldArray) - goto EXIT_ERROR; - - - // for each field, create a pyjfield object and - // add to the internal members list. - len = (*env)->GetArrayLength(env, fieldArray); - for(i = 0; i < len; i++) { - jobject rfield = NULL; - PyJfield_Object *pyjfield = NULL; - - rfield = (*env)->GetObjectArrayElement(env, - fieldArray, - i); - - pyjfield = pyjfield_new(env, rfield, pyjob); - - if(!pyjfield) - continue; - - if(pyjfield->pyFieldName && PyString_Check(pyjfield->pyFieldName)) { - if(PyObject_SetAttr((PyObject *) pyjob, - pyjfield->pyFieldName, - (PyObject *) pyjfield) != 0) { - printf("WARNING: couldn't add field.\n"); - } - else - pyjobject_addfield(pyjob, pyjfield->pyFieldName); - } - - Py_DECREF(pyjfield); - (*env)->DeleteLocalRef(env, rfield); - } - (*env)->DeleteLocalRef(env, fieldArray); - - // we've finished the object. - pyjob->finishAttr = 1; - (*env)->PopLocalFrame(env, NULL); - return 1; - - -EXIT_ERROR: - (*env)->PopLocalFrame(env, NULL); - - if(PyErr_Occurred()) { // java exceptions translated by this time - if(pyjob) - pyjobject_dealloc(pyjob); - } - - return 0; -} - - -static void pyjobject_dealloc(PyJobject_Object *self) { -#if USE_DEALLOC - JNIEnv *env = pyembed_get_env(); - if(env) { - if(self->object) - (*env)->DeleteGlobalRef(env, self->object); - if(self->clazz) - (*env)->DeleteGlobalRef(env, self->clazz); - - Py_DECREF(self->attr); - Py_DECREF(self->methods); - Py_DECREF(self->fields); - Py_DECREF(self->jclassname); // added by njensen - if(self->pyjclass) - Py_DECREF(self->pyjclass); - } - - PyObject_Del(self); -#endif -} - - -static PyObject* pyjobject_call(PyJobject_Object *self, - PyObject *args, - PyObject *keywords) { - - if(!self->pyjclass) { - PyErr_Format(PyExc_RuntimeError, "Not a class."); - return NULL; - } - - return pyjclass_call(self->pyjclass, args, keywords); -} - - -int pyjobject_check(PyObject *obj) { - if(PyObject_TypeCheck(obj, &PyJobject_Type)) - return 1; - return 0; -} - - -// add a method name to obj->methods list -static void pyjobject_addmethod(PyJobject_Object *obj, PyObject *name) { - if(!PyString_Check(name)) - return; - if(!PyList_Check(obj->methods)) - return; - - PyList_Append(obj->methods, name); -} - - -static void pyjobject_addfield(PyJobject_Object *obj, PyObject *name) { - if(!PyString_Check(name)) - return; - if(!PyList_Check(obj->fields)) - return; - - PyList_Append(obj->fields, name); -} - - -// find and call a method on this object that matches the python args. -// typically called by way of pyjmethod when python invokes __call__. -// -// steals reference to self, methodname and args. -PyObject* find_method(JNIEnv *env, - PyJobject_Object *self, - PyObject *methodName, - int methodCount, - PyObject *attr, - PyObject *args) { - // all possible method candidates - PyJmethod_Object **cand = NULL; - int pos, i, listSize, argsSize; - - pos = i = listSize = argsSize = 0; - - // not really likely if we were called from pyjmethod, but hey... - if(methodCount < 1) { - PyErr_Format(PyExc_RuntimeError, "I have no methods."); - return NULL; - } - - if(!attr || !PyList_CheckExact(attr)) { - PyErr_Format(PyExc_RuntimeError, "Invalid attr list."); - return NULL; - } - - cand = (PyJmethod_Object **) - PyMem_Malloc(sizeof(PyJmethod_Object*) * methodCount); - - // just for safety - for(i = 0; i < methodCount; i++) - cand[i] = NULL; - - listSize = PyList_GET_SIZE(attr); - for(i = 0; i < listSize; i++) { - PyObject *tuple = PyList_GetItem(attr, i); /* borrowed */ - - if(PyErr_Occurred()) - break; - - if(!tuple || tuple == Py_None || !PyTuple_CheckExact(tuple)) - continue; - - if(PyTuple_Size(tuple) == 2) { - PyObject *key = PyTuple_GetItem(tuple, 0); /* borrowed */ - - if(PyErr_Occurred()) - break; - - if(!key || !PyString_Check(key)) - continue; - - if(PyObject_Compare(key, methodName) == 0) { - PyObject *method = PyTuple_GetItem(tuple, 1); /* borrowed */ - if(pyjmethod_check(method)) - cand[pos++] = (PyJmethod_Object *) method; - } - } - } - - if(PyErr_Occurred()) - goto EXIT_ERROR; - - // makes more sense to work with... - pos--; - - if(pos < 0) { - // didn't find a method by that name.... - // that shouldn't happen unless the search above is broken. - PyErr_Format(PyExc_NameError, "No such method."); - goto EXIT_ERROR; - } - if(pos == 0) { - // we're done, call that one - PyObject *ret = pyjmethod_call_internal(cand[0], self, args); - PyMem_Free(cand); - return ret; - } - - // first, find out if there's only one method that - // has the correct number of args - argsSize = PyTuple_Size(args); - { - PyJmethod_Object *matching = NULL; - int count = 0; - - for(i = 0; i <= pos && cand[i]; i++) { - // make sure method is fully initialized - if(!cand[i]->parameters) { - if(!pyjmethod_init(env, cand[i])) { - // init failed, that's not good. - cand[i] = NULL; - PyErr_Warn(PyExc_Warning, "pyjmethod init failed."); - continue; - } - } - - if(cand[i]->lenParameters == argsSize) { - matching = cand[i]; - count++; - } - else - cand[i] = NULL; // eliminate non-matching - } - - if(matching && count == 1) { - PyMem_Free(cand); - return pyjmethod_call_internal(matching, self, args); - } - } // local scope - - for(i = 0; i <= pos; i++) { - int parmpos = 0; - - // already eliminated? - if(!cand[i]) - continue; - - // check if argument types match - (*env)->PushLocalFrame(env, 20); - for(parmpos = 0; parmpos < cand[i]->lenParameters; parmpos++) { - PyObject *param = PyTuple_GetItem(args, parmpos); - int paramTypeId = -1; - jclass pclazz; - jclass paramType = - (jclass) (*env)->GetObjectArrayElement(env, - cand[i]->parameters, - parmpos); - - if(process_java_exception(env) || !paramType) - break; - - pclazz = (*env)->GetObjectClass(env, paramType); - if(process_java_exception(env) || !pclazz) - break; - - paramTypeId = get_jtype(env, paramType, pclazz); - - if(pyarg_matches_jtype(env, param, paramType, paramTypeId)) { - if(PyErr_Occurred()) - break; - continue; - } - - // args don't match - break; - } - (*env)->PopLocalFrame(env, NULL); - - // this method matches? - if(parmpos == cand[i]->lenParameters) { - PyObject *ret = pyjmethod_call_internal(cand[i], self, args); - PyMem_Free(cand); - return ret; - } - } - - -EXIT_ERROR: - PyMem_Free(cand); - if(!PyErr_Occurred()) - PyErr_Format(PyExc_NameError, - "Matching overloaded method not found."); - return NULL; -} - - -// find and call a method on this object that matches the python args. -// typically called from pyjmethod when python invokes __call__. -// -// steals reference to self, methodname and args. -PyObject* pyjobject_find_method(PyJobject_Object *self, - PyObject *methodName, - PyObject *args) { - // util method does this for us - return find_method(pyembed_get_env(), - self, - methodName, - PyList_Size(self->methods), - self->attr, - args); -} - - -// call toString() on jobject. returns null on error. -// excpected to return new reference. -static PyObject* pyjobject_str(PyJobject_Object *self) { - PyObject *pyres = NULL; - JNIEnv *env; - - env = pyembed_get_env(); - pyres = jobject_topystring(env, self->object, self->clazz); - - if(process_java_exception(env)) - return NULL; - - // python doesn't like Py_None here... - if(pyres == NULL) - return Py_BuildValue("s", ""); - - return pyres; -} - - -// get attribute 'name' for object. -// uses obj->attr list of tuples for storage. -// returns new reference. -static PyObject* pyjobject_getattr(PyJobject_Object *obj, - char *name) { - PyObject *ret, *pyname, *methods, *members, *numpy; - int listSize, i, found; - - ret = pyname = methods = members = NULL; - listSize = i = found = 0; - - if(!name) { - Py_INCREF(Py_None); - return Py_None; - } - pyname = PyString_FromString(name); - methods = PyString_FromString("__methods__"); - members = PyString_FromString("__members__"); - - // numpy added by njensen - numpy = PyString_FromString("__numpy__"); - if(PyObject_Compare(pyname, numpy) == 0) { - Py_DECREF(pyname); - Py_DECREF(methods); - Py_DECREF(members); - Py_DECREF(numpy); - - return pyjobject_numpy(obj); - } - Py_DECREF(numpy); - - if(PyObject_Compare(pyname, methods) == 0) { - Py_DECREF(pyname); - Py_DECREF(methods); - Py_DECREF(members); - - Py_INCREF(obj->methods); - return obj->methods; - } - Py_DECREF(methods); - - if(PyObject_Compare(pyname, members) == 0) { - Py_DECREF(pyname); - Py_DECREF(members); - - Py_INCREF(obj->fields); - return obj->fields; - } - Py_DECREF(members); - - if(!PyList_Check(obj->attr)) { - Py_DECREF(pyname); - PyErr_Format(PyExc_RuntimeError, "Invalid attr list."); - return NULL; - } - - // util function fetches from attr list for us. - if(obj->attr == NULL) - { - printf("attribute list is null!\n"); - printf("name is %s\n", name); - } - ret = tuplelist_getitem(obj->attr, pyname); /* new reference */ - - Py_DECREF(pyname); - - // method optimizations by njensen - if(pyjmethod_check(ret)) - { - PyJmethodWrapper_Object* wrapper = pyjmethodwrapper_new(obj, (PyJmethod_Object*) ret); - Py_DECREF(ret); - Py_INCREF(wrapper); - ret = (PyObject *) wrapper; - } - - if(PyErr_Occurred() || ret == Py_None) { - PyErr_Format(PyExc_NameError, "Method not found %s", name); - return NULL; - } - - if(pyjfield_check(ret)) { - PyObject *t = pyjfield_get((PyJfield_Object *) ret); - Py_DECREF(ret); - return t; - } - - return ret; -} - - -// added by njensen -static PyObject* pyjobject_numpy(PyJobject_Object *obj) { - int i=0; - /* updated by bkowal */ - npy_intp *dims = NULL; - jfloat *dataFloat = NULL; - jbyte *dataByte = NULL; - jint *dataInt = NULL; - const char *message = NULL; - jobjectArray objarray = NULL; - PyObject *resultList = NULL; - jint xsize = 0; - jint ysize = 0; - jsize listSize =0; - - JNIEnv *env = pyembed_get_env(); - jclass numpyable = (*env)->FindClass(env, "jep/INumpyable"); - if((*env)->IsInstanceOf(env, obj->object, numpyable)) - { - xMethod = (*env)->GetMethodID(env, numpyable, "getNumpyX", "()I"); - xsize = (jint) (*env)->CallIntMethod(env, obj->object, xMethod); - - yMethod = (*env)->GetMethodID(env, numpyable, "getNumpyY", "()I"); - ysize = (jint) (*env)->CallIntMethod(env, obj->object, yMethod); - - dims = malloc(2 * sizeof(npy_intp)); - dims[0] = ysize; - dims[1] = xsize; - - getMethod = (*env)->GetMethodID(env, numpyable, "getNumPy", "()[Ljava/lang/Object;"); - objarray = (jobjectArray) (*env)->CallObjectMethod(env, obj->object, getMethod); - if(objarray == NULL) - { - Py_INCREF(Py_None); - return Py_None; - } - - listSize = (*env)->GetArrayLength(env, objarray); - - initNumpy(); - - resultList = PyList_New(listSize); - - floatarrayclass = (*env)->FindClass(env, "[F"); - bytearrayclass = (*env)->FindClass(env, "[B"); - intarrayclass = (*env)->FindClass(env, "[I"); - stringclass = (*env)->FindClass(env, "java/lang/String"); - - for(i=0; i < listSize; i=i+1) - { - PyObject *pyjob; - jobject jo = (*env)->GetObjectArrayElement(env, objarray, i); - if((*env)->IsInstanceOf(env, jo, floatarrayclass)) - { - pyjob = PyArray_SimpleNew(2, dims, NPY_FLOAT32); - dataFloat = (*env)->GetFloatArrayElements(env, jo, 0); - memcpy(((PyArrayObject *)pyjob)->data, - dataFloat, ysize * xsize * sizeof(float)); - (*env)->ReleaseFloatArrayElements(env, jo, dataFloat, 0); - } - else if((*env)->IsInstanceOf(env, jo, bytearrayclass)) - { - pyjob = PyArray_SimpleNew(2, dims, NPY_BYTE); - dataByte = (*env)->GetByteArrayElements(env, jo, 0); - memcpy(((PyArrayObject *)pyjob)->data, - dataByte, ysize * xsize * 1); - (*env)->ReleaseByteArrayElements(env, jo, dataByte, 0); - } - else if((*env)->IsInstanceOf(env, jo, intarrayclass)) - { - pyjob = PyArray_SimpleNew(2, dims, NPY_INT32); - dataInt = (*env)->GetIntArrayElements(env, jo, 0); - memcpy(((PyArrayObject *)pyjob)->data, - dataInt, ysize * xsize * sizeof(int)); - (*env)->ReleaseIntArrayElements(env, jo, dataInt, 0); - } - else if((*env)->IsInstanceOf(env, jo, stringclass)) - { - message = jstring2char(env, jo); - pyjob = PyString_FromString(message); - release_utf_char(env, jo, message); - } - else - { - pyjob = Py_None; - } - PyList_SetItem(resultList, i, pyjob); - (*env)->DeleteLocalRef(env, jo); - } - free(dims); - (*env)->DeleteLocalRef(env, objarray); - return resultList; - } - else - { - Py_INCREF(Py_None); - return Py_None; - } -} - -// added by njensen -static void initNumpy(void) -{ - if (!numpyInit) - { - import_array(); - numpyInit = 1; - } -} - -// set attribute v for object. -// uses obj->attr dictionary for storage. -static int pyjobject_setattr(PyJobject_Object *obj, - char *name, - PyObject *v) { - PyObject *pyname, *tuple; - - if(!name) { - PyErr_Format(PyExc_RuntimeError, "Invalid name: NULL."); - return -1; - } - - if(!PyList_Check(obj->attr)) { - PyErr_Format(PyExc_RuntimeError, "Invalid attr list."); - return -1; - } - - Py_INCREF(v); - - if(obj->finishAttr) { - PyObject *cur, *pyname; - int ret; - - // finished setting internal objects. - // don't allow python to add new, but do - // allow python script to change values on pyjfields - - pyname = PyString_FromString(name); - cur = tuplelist_getitem(obj->attr, pyname); /* new reference */ - Py_DECREF(pyname); - - if(PyErr_Occurred()) - return -1; - - if(cur == Py_None) { - PyErr_SetString(PyExc_RuntimeError, "No such field."); - return -1; - } - - if(!pyjfield_check(cur)) { - PyErr_SetString(PyExc_TypeError, "Not a pyjfield object."); - return -1; - } - - if(!PyList_Check(obj->attr)) { - Py_DECREF(pyname); - PyErr_SetString(PyExc_RuntimeError, "Invalid attr list."); - return -1; - } - - // now, just ask pyjfield to handle. - ret = pyjfield_set((PyJfield_Object *) cur, v); /* borrows ref */ - - Py_DECREF(cur); - Py_DECREF(v); - return ret; - } - - pyname = PyString_FromString((const char *) name); - tuple = PyTuple_New(2); - - Py_INCREF(pyname); - PyTuple_SetItem(tuple, 0, pyname); /* steals ref */ - PyTuple_SetItem(tuple, 1, v); /* steals ref */ - - // the docs don't mention this, but the source INCREFs tuple - // ... - // after much printf'ing. uhm. must decref it somewhere. - // ... - // doh. the docs suck. - - // Py_INCREF(tuple); - - PyList_Append(obj->attr, tuple); - - Py_DECREF(tuple); - Py_DECREF(pyname); - return 0; // success -} - - -static PyMethodDef pyjobject_methods[] = { - {NULL, NULL, 0, NULL} -}; - - -static PyTypeObject PyJobject_Type = { - PyObject_HEAD_INIT(0) - 0, /* ob_size */ - "PyJobject", /* tp_name */ - sizeof(PyJobject_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor) pyjobject_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc) pyjobject_getattr, /* tp_getattr */ - (setattrfunc) pyjobject_setattr, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - (ternaryfunc) pyjobject_call, /* tp_call */ - (reprfunc) pyjobject_str, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - "jobject", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - pyjobject_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - NULL, /* tp_new */ -}; +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ +/* + jep - Java Embedded Python + + Copyright (c) 2004 - 2008 Mike Johnson. + + This file is licenced under the the zlib/libpng License. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any + damages arising from the use of this software. + + Permission is granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifdef WIN32 +# include "winconfig.h" +#endif + +#include /* added by bkowal */ + +#if HAVE_CONFIG_H +# include +#endif + +#if HAVE_UNISTD_H +# include +# include +#endif + +// shut up the compiler +#ifdef _POSIX_C_SOURCE +# undef _POSIX_C_SOURCE +#endif +#include + +// shut up the compiler +#ifdef _POSIX_C_SOURCE +# undef _POSIX_C_SOURCE +#endif +#ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +#endif +#include "Python.h" + +#include "pyembed.h" +#include "pyjobject.h" +#include "pyjmethod.h" +#include "pyjfield.h" +#include "pyjclass.h" +#include "util.h" + +// added by njensen +#include "numpy/arrayobject.h" +#include "pyjmethodwrapper.h" + +staticforward PyTypeObject PyJobject_Type; + +static int pyjobject_init(JNIEnv *env, PyJobject_Object*); +static int pyjobject_setattr(PyJobject_Object*, char*, PyObject*); +static void pyjobject_addmethod(PyJobject_Object*, PyObject*); +static void pyjobject_addfield(PyJobject_Object*, PyObject*); +static void pyjobject_dealloc(PyJobject_Object*); + +static jmethodID objectGetClass = 0; +static jmethodID classGetMethods = 0; +static jmethodID classGetFields = 0; + +static jmethodID xMethod = 0; +static jmethodID yMethod = 0; +static jmethodID getMethod = 0; + +// added by njensen +static jclass floatarrayclass = NULL; +static jclass bytearrayclass = NULL; +static jclass intarrayclass = NULL; +static jclass stringclass = NULL; + +// added by njensen +static jmethodID classGetName = 0; +static PyObject* classnamePyJMethodsDict = NULL; + +// called internally to make new PyJobject_Object instances +PyObject* pyjobject_new(JNIEnv *env, jobject obj) { + PyJobject_Object *pyjob; + + if(PyType_Ready(&PyJobject_Type) < 0) + return NULL; + if(!obj) { + PyErr_Format(PyExc_RuntimeError, "Invalid object."); + return NULL; + } + + pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type); + pyjob->object = (*env)->NewGlobalRef(env, obj); + pyjob->clazz = (*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, obj)); + pyjob->pyjclass = NULL; + pyjob->attr = PyList_New(0); + pyjob->methods = PyList_New(0); + pyjob->fields = PyList_New(0); + pyjob->finishAttr = 0; + + if(pyjobject_init(env, pyjob)) + return (PyObject *) pyjob; + return NULL; +} + + +PyObject* pyjobject_new_class(JNIEnv *env, jclass clazz) { + PyJobject_Object *pyjob; + + if(!clazz) { + PyErr_Format(PyExc_RuntimeError, "Invalid class object."); + return NULL; + } + + pyjob = PyObject_NEW(PyJobject_Object, &PyJobject_Type); + pyjob->object = NULL; + pyjob->clazz = (*env)->NewGlobalRef(env, clazz); + pyjob->attr = PyList_New(0); + pyjob->methods = PyList_New(0); + pyjob->fields = PyList_New(0); + pyjob->finishAttr = 0; + + pyjob->pyjclass = pyjclass_new(env, (PyObject *) pyjob); + + if(pyjobject_init(env, pyjob)) + return (PyObject *) pyjob; + return NULL; +} + + +static int pyjobject_init(JNIEnv *env, PyJobject_Object *pyjob) { + jobjectArray methodArray = NULL; + jobjectArray fieldArray = NULL; + int i, len = 0; + jobject langClass = NULL; + + // added by njensen + jstring jClassName = NULL; + const char * charJClassName; + PyObject * pyJClassName = NULL; + PyObject * pyAttrName = NULL; + PyObject * cachedMethodList = NULL; + jclass lock = NULL; + + + (*env)->PushLocalFrame(env, 20); + // ------------------------------ call Class.getMethods() + + + // well, first call getClass() + if(objectGetClass == 0) { + objectGetClass = (*env)->GetMethodID(env, + pyjob->clazz, + "getClass", + "()Ljava/lang/Class;"); + if(process_java_exception(env) || !objectGetClass) + goto EXIT_ERROR; + } + + langClass = (*env)->CallObjectMethod(env, pyjob->clazz, objectGetClass); + if(process_java_exception(env) || !langClass) + goto EXIT_ERROR; + + // then, get methodid for getMethods() + if(classGetMethods == 0) { + classGetMethods = (*env)->GetMethodID(env, + langClass, + "getMethods", + "()[Ljava/lang/reflect/Method;"); + if(process_java_exception(env) || !classGetMethods) + goto EXIT_ERROR; + } + + // added by njensen + if(classGetName == 0) + { + classGetName = (*env)->GetMethodID(env, + langClass, + "getName", + "()Ljava/lang/String;"); + } + jClassName = (*env)->CallObjectMethod(env, pyjob->clazz, classGetName); + charJClassName = jstring2char(env, jClassName); + pyJClassName = PyString_FromString(charJClassName); + release_utf_char(env, jClassName, charJClassName); + pyAttrName = PyString_FromString("jclassname"); + if(PyObject_SetAttr((PyObject *) pyjob, + pyAttrName, + pyJClassName) != 0) + { + PyErr_Format(PyExc_RuntimeError, "Couldn't add jclassname as attribute."); + } + PyList_Append(pyjob->fields, pyAttrName); + Py_DECREF(pyAttrName); + (*env)->DeleteLocalRef(env, jClassName); + pyjob->jclassname = pyJClassName; + // end of jclassname code + + // begin synchronized + lock = (*env)->FindClass(env, "java/lang/String"); + if((*env)->MonitorEnter(env, lock) != JNI_OK) + { + PyErr_Format(PyExc_RuntimeError, "Couldn't get synchronization lock on class method creation."); + } + if(classnamePyJMethodsDict == NULL) + { + classnamePyJMethodsDict = PyDict_New(); + } + + cachedMethodList = PyDict_GetItem(classnamePyJMethodsDict, pyJClassName); + if(cachedMethodList == NULL) + { + PyObject* pyjMethodList = NULL; + pyjMethodList = PyList_New(0); + + // njensen: I changed the architecture to speed it up so it caches + // pyjmethods for each Java Class object, then applies that method + // to the object in question. The cache is built here, then + // pyjobject_getattr associates the object with the method, and + // pyjmethod_call ensures it is passed along. + + + // - GetMethodID fails when you pass the clazz object, it expects + // a java.lang.Class jobject. + // - if you CallObjectMethod with the langClass jclass object, + // it'll return an array of methods, but they're methods of the + // java.lang.reflect.Method class -- not ->object. + // + // so what i did here was find the methodid using langClass, + // but then i call the method using clazz. methodIds for java + // classes are shared.... + + methodArray = (jobjectArray) (*env)->CallObjectMethod(env, + pyjob->clazz, + classGetMethods); + if(process_java_exception(env) || !methodArray) + goto EXIT_ERROR; + + // for each method, create a new pyjmethod object + // and add to the internal methods list. + len = (*env)->GetArrayLength(env, methodArray); + for(i = 0; i < len; i++) { + PyJmethod_Object *pymethod = NULL; + jobject rmethod = NULL; + + rmethod = (*env)->GetObjectArrayElement(env, + methodArray, + i); + + // make new PyJmethod_Object, linked to pyjob + if(pyjob->object) + pymethod = pyjmethod_new(env, rmethod, pyjob); + else + pymethod = pyjmethod_new_static(env, rmethod, pyjob); + + if(!pymethod) + continue; + + if(pymethod->pyMethodName && PyString_Check(pymethod->pyMethodName)) { + if(PyList_Append(pyjMethodList, (PyObject*) pymethod) != 0) + printf("WARNING: couldn't add method"); + } + + Py_DECREF(pymethod); + (*env)->DeleteLocalRef(env, rmethod); + } + PyDict_SetItem(classnamePyJMethodsDict, pyJClassName, pyjMethodList); + cachedMethodList = pyjMethodList; + (*env)->DeleteLocalRef(env, methodArray); + } // end of looping over available methods + if((*env)->MonitorExit(env, lock) != JNI_OK) + { + PyErr_Format(PyExc_RuntimeError, "Couldn't release synchronization lock on class method creation."); + } + // end of synchronization + + len = PyList_Size(cachedMethodList); + for(i = 0; i < len; i++) + { + PyJmethod_Object* pymethod = (PyJmethod_Object*) PyList_GetItem(cachedMethodList, i); + if(PyObject_SetAttr((PyObject *) pyjob, pymethod->pyMethodName, (PyObject*) pymethod) != 0) + { + PyErr_Format(PyExc_RuntimeError, "Couldn't add method as attribute."); + } + else + { + pyjobject_addmethod(pyjob, pymethod->pyMethodName); + } + } + // end of cached method optimizations + + + // ------------------------------ process fields + + if(classGetFields == 0) { + classGetFields = (*env)->GetMethodID(env, + langClass, + "getFields", + "()[Ljava/lang/reflect/Field;"); + if(process_java_exception(env) || !classGetFields) + goto EXIT_ERROR; + } + + fieldArray = (jobjectArray) (*env)->CallObjectMethod(env, + pyjob->clazz, + classGetFields); + if(process_java_exception(env) || !fieldArray) + goto EXIT_ERROR; + + + // for each field, create a pyjfield object and + // add to the internal members list. + len = (*env)->GetArrayLength(env, fieldArray); + for(i = 0; i < len; i++) { + jobject rfield = NULL; + PyJfield_Object *pyjfield = NULL; + + rfield = (*env)->GetObjectArrayElement(env, + fieldArray, + i); + + pyjfield = pyjfield_new(env, rfield, pyjob); + + if(!pyjfield) + continue; + + if(pyjfield->pyFieldName && PyString_Check(pyjfield->pyFieldName)) { + if(PyObject_SetAttr((PyObject *) pyjob, + pyjfield->pyFieldName, + (PyObject *) pyjfield) != 0) { + printf("WARNING: couldn't add field.\n"); + } + else + pyjobject_addfield(pyjob, pyjfield->pyFieldName); + } + + Py_DECREF(pyjfield); + (*env)->DeleteLocalRef(env, rfield); + } + (*env)->DeleteLocalRef(env, fieldArray); + + // we've finished the object. + pyjob->finishAttr = 1; + (*env)->PopLocalFrame(env, NULL); + return 1; + + +EXIT_ERROR: + (*env)->PopLocalFrame(env, NULL); + + if(PyErr_Occurred()) { // java exceptions translated by this time + if(pyjob) + pyjobject_dealloc(pyjob); + } + + return 0; +} + + +static void pyjobject_dealloc(PyJobject_Object *self) { +#if USE_DEALLOC + JNIEnv *env = pyembed_get_env(); + if(env) { + if(self->object) + (*env)->DeleteGlobalRef(env, self->object); + if(self->clazz) + (*env)->DeleteGlobalRef(env, self->clazz); + + Py_DECREF(self->attr); + Py_DECREF(self->methods); + Py_DECREF(self->fields); + Py_DECREF(self->jclassname); // added by njensen + if(self->pyjclass) + Py_DECREF(self->pyjclass); + } + + PyObject_Del(self); +#endif +} + + +static PyObject* pyjobject_call(PyJobject_Object *self, + PyObject *args, + PyObject *keywords) { + + if(!self->pyjclass) { + PyErr_Format(PyExc_RuntimeError, "Not a class."); + return NULL; + } + + return pyjclass_call(self->pyjclass, args, keywords); +} + + +int pyjobject_check(PyObject *obj) { + if(PyObject_TypeCheck(obj, &PyJobject_Type)) + return 1; + return 0; +} + + +// add a method name to obj->methods list +static void pyjobject_addmethod(PyJobject_Object *obj, PyObject *name) { + if(!PyString_Check(name)) + return; + if(!PyList_Check(obj->methods)) + return; + + PyList_Append(obj->methods, name); +} + + +static void pyjobject_addfield(PyJobject_Object *obj, PyObject *name) { + if(!PyString_Check(name)) + return; + if(!PyList_Check(obj->fields)) + return; + + PyList_Append(obj->fields, name); +} + + +// find and call a method on this object that matches the python args. +// typically called by way of pyjmethod when python invokes __call__. +// +// steals reference to self, methodname and args. +PyObject* find_method(JNIEnv *env, + PyJobject_Object *self, + PyObject *methodName, + int methodCount, + PyObject *attr, + PyObject *args) { + // all possible method candidates + PyJmethod_Object **cand = NULL; + int pos, i, listSize, argsSize; + + pos = i = listSize = argsSize = 0; + + // not really likely if we were called from pyjmethod, but hey... + if(methodCount < 1) { + PyErr_Format(PyExc_RuntimeError, "I have no methods."); + return NULL; + } + + if(!attr || !PyList_CheckExact(attr)) { + PyErr_Format(PyExc_RuntimeError, "Invalid attr list."); + return NULL; + } + + cand = (PyJmethod_Object **) + PyMem_Malloc(sizeof(PyJmethod_Object*) * methodCount); + + // just for safety + for(i = 0; i < methodCount; i++) + cand[i] = NULL; + + listSize = PyList_GET_SIZE(attr); + for(i = 0; i < listSize; i++) { + PyObject *tuple = PyList_GetItem(attr, i); /* borrowed */ + + if(PyErr_Occurred()) + break; + + if(!tuple || tuple == Py_None || !PyTuple_CheckExact(tuple)) + continue; + + if(PyTuple_Size(tuple) == 2) { + PyObject *key = PyTuple_GetItem(tuple, 0); /* borrowed */ + + if(PyErr_Occurred()) + break; + + if(!key || !PyString_Check(key)) + continue; + + if(PyObject_Compare(key, methodName) == 0) { + PyObject *method = PyTuple_GetItem(tuple, 1); /* borrowed */ + if(pyjmethod_check(method)) + cand[pos++] = (PyJmethod_Object *) method; + } + } + } + + if(PyErr_Occurred()) + goto EXIT_ERROR; + + // makes more sense to work with... + pos--; + + if(pos < 0) { + // didn't find a method by that name.... + // that shouldn't happen unless the search above is broken. + PyErr_Format(PyExc_NameError, "No such method."); + goto EXIT_ERROR; + } + if(pos == 0) { + // we're done, call that one + PyObject *ret = pyjmethod_call_internal(cand[0], self, args); + PyMem_Free(cand); + return ret; + } + + // first, find out if there's only one method that + // has the correct number of args + argsSize = PyTuple_Size(args); + { + PyJmethod_Object *matching = NULL; + int count = 0; + + for(i = 0; i <= pos && cand[i]; i++) { + // make sure method is fully initialized + if(!cand[i]->parameters) { + if(!pyjmethod_init(env, cand[i])) { + // init failed, that's not good. + cand[i] = NULL; + PyErr_Warn(PyExc_Warning, "pyjmethod init failed."); + continue; + } + } + + if(cand[i]->lenParameters == argsSize) { + matching = cand[i]; + count++; + } + else + cand[i] = NULL; // eliminate non-matching + } + + if(matching && count == 1) { + PyMem_Free(cand); + return pyjmethod_call_internal(matching, self, args); + } + } // local scope + + for(i = 0; i <= pos; i++) { + int parmpos = 0; + + // already eliminated? + if(!cand[i]) + continue; + + // check if argument types match + (*env)->PushLocalFrame(env, 20); + for(parmpos = 0; parmpos < cand[i]->lenParameters; parmpos++) { + PyObject *param = PyTuple_GetItem(args, parmpos); + int paramTypeId = -1; + jclass pclazz; + jclass paramType = + (jclass) (*env)->GetObjectArrayElement(env, + cand[i]->parameters, + parmpos); + + if(process_java_exception(env) || !paramType) + break; + + pclazz = (*env)->GetObjectClass(env, paramType); + if(process_java_exception(env) || !pclazz) + break; + + paramTypeId = get_jtype(env, paramType, pclazz); + + if(pyarg_matches_jtype(env, param, paramType, paramTypeId)) { + if(PyErr_Occurred()) + break; + continue; + } + + // args don't match + break; + } + (*env)->PopLocalFrame(env, NULL); + + // this method matches? + if(parmpos == cand[i]->lenParameters) { + PyObject *ret = pyjmethod_call_internal(cand[i], self, args); + PyMem_Free(cand); + return ret; + } + } + + +EXIT_ERROR: + PyMem_Free(cand); + if(!PyErr_Occurred()) + PyErr_Format(PyExc_NameError, + "Matching overloaded method not found."); + return NULL; +} + + +// find and call a method on this object that matches the python args. +// typically called from pyjmethod when python invokes __call__. +// +// steals reference to self, methodname and args. +PyObject* pyjobject_find_method(PyJobject_Object *self, + PyObject *methodName, + PyObject *args) { + // util method does this for us + return find_method(pyembed_get_env(), + self, + methodName, + PyList_Size(self->methods), + self->attr, + args); +} + + +// call toString() on jobject. returns null on error. +// excpected to return new reference. +static PyObject* pyjobject_str(PyJobject_Object *self) { + PyObject *pyres = NULL; + JNIEnv *env; + + env = pyembed_get_env(); + pyres = jobject_topystring(env, self->object, self->clazz); + + if(process_java_exception(env)) + return NULL; + + // python doesn't like Py_None here... + if(pyres == NULL) + return Py_BuildValue("s", ""); + + return pyres; +} + + +// get attribute 'name' for object. +// uses obj->attr list of tuples for storage. +// returns new reference. +static PyObject* pyjobject_getattr(PyJobject_Object *obj, + char *name) { + PyObject *ret, *pyname, *methods, *members, *numpy; + int listSize, i, found; + + ret = pyname = methods = members = NULL; + listSize = i = found = 0; + + if(!name) { + Py_INCREF(Py_None); + return Py_None; + } + pyname = PyString_FromString(name); + methods = PyString_FromString("__methods__"); + members = PyString_FromString("__members__"); + + // numpy added by njensen + numpy = PyString_FromString("__numpy__"); + if(PyObject_Compare(pyname, numpy) == 0) { + Py_DECREF(pyname); + Py_DECREF(methods); + Py_DECREF(members); + Py_DECREF(numpy); + + return pyjobject_numpy(obj); + } + Py_DECREF(numpy); + + if(PyObject_Compare(pyname, methods) == 0) { + Py_DECREF(pyname); + Py_DECREF(methods); + Py_DECREF(members); + + Py_INCREF(obj->methods); + return obj->methods; + } + Py_DECREF(methods); + + if(PyObject_Compare(pyname, members) == 0) { + Py_DECREF(pyname); + Py_DECREF(members); + + Py_INCREF(obj->fields); + return obj->fields; + } + Py_DECREF(members); + + if(!PyList_Check(obj->attr)) { + Py_DECREF(pyname); + PyErr_Format(PyExc_RuntimeError, "Invalid attr list."); + return NULL; + } + + // util function fetches from attr list for us. + if(obj->attr == NULL) + { + printf("attribute list is null!\n"); + printf("name is %s\n", name); + } + ret = tuplelist_getitem(obj->attr, pyname); /* new reference */ + + Py_DECREF(pyname); + + // method optimizations by njensen + if(pyjmethod_check(ret)) + { + PyJmethodWrapper_Object* wrapper = pyjmethodwrapper_new(obj, (PyJmethod_Object*) ret); + Py_DECREF(ret); + Py_INCREF(wrapper); + ret = (PyObject *) wrapper; + } + + if(PyErr_Occurred() || ret == Py_None) { + PyErr_Format(PyExc_NameError, "Method not found %s", name); + return NULL; + } + + if(pyjfield_check(ret)) { + PyObject *t = pyjfield_get((PyJfield_Object *) ret); + Py_DECREF(ret); + return t; + } + + return ret; +} + + +// added by njensen +static PyObject* pyjobject_numpy(PyJobject_Object *obj) { + int i=0; + /* updated by bkowal */ + npy_intp *dims = NULL; + jfloat *dataFloat = NULL; + jbyte *dataByte = NULL; + jint *dataInt = NULL; + const char *message = NULL; + jobjectArray objarray = NULL; + PyObject *resultList = NULL; + jint xsize = 0; + jint ysize = 0; + jsize listSize =0; + + JNIEnv *env = pyembed_get_env(); + jclass numpyable = (*env)->FindClass(env, "jep/INumpyable"); + if((*env)->IsInstanceOf(env, obj->object, numpyable)) + { + xMethod = (*env)->GetMethodID(env, numpyable, "getNumpyX", "()I"); + xsize = (jint) (*env)->CallIntMethod(env, obj->object, xMethod); + + yMethod = (*env)->GetMethodID(env, numpyable, "getNumpyY", "()I"); + ysize = (jint) (*env)->CallIntMethod(env, obj->object, yMethod); + + dims = malloc(2 * sizeof(npy_intp)); + dims[0] = ysize; + dims[1] = xsize; + + getMethod = (*env)->GetMethodID(env, numpyable, "getNumPy", "()[Ljava/lang/Object;"); + objarray = (jobjectArray) (*env)->CallObjectMethod(env, obj->object, getMethod); + if(objarray == NULL) + { + Py_INCREF(Py_None); + return Py_None; + } + + listSize = (*env)->GetArrayLength(env, objarray); + + initNumpy(); + + resultList = PyList_New(listSize); + + floatarrayclass = (*env)->FindClass(env, "[F"); + bytearrayclass = (*env)->FindClass(env, "[B"); + intarrayclass = (*env)->FindClass(env, "[I"); + stringclass = (*env)->FindClass(env, "java/lang/String"); + + for(i=0; i < listSize; i=i+1) + { + PyObject *pyjob; + jobject jo = (*env)->GetObjectArrayElement(env, objarray, i); + if((*env)->IsInstanceOf(env, jo, floatarrayclass)) + { + pyjob = PyArray_SimpleNew(2, dims, NPY_FLOAT32); + dataFloat = (*env)->GetFloatArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, + dataFloat, ysize * xsize * sizeof(float)); + (*env)->ReleaseFloatArrayElements(env, jo, dataFloat, 0); + } + else if((*env)->IsInstanceOf(env, jo, bytearrayclass)) + { + pyjob = PyArray_SimpleNew(2, dims, NPY_BYTE); + dataByte = (*env)->GetByteArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, + dataByte, ysize * xsize * 1); + (*env)->ReleaseByteArrayElements(env, jo, dataByte, 0); + } + else if((*env)->IsInstanceOf(env, jo, intarrayclass)) + { + pyjob = PyArray_SimpleNew(2, dims, NPY_INT32); + dataInt = (*env)->GetIntArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, + dataInt, ysize * xsize * sizeof(int)); + (*env)->ReleaseIntArrayElements(env, jo, dataInt, 0); + } + else if((*env)->IsInstanceOf(env, jo, stringclass)) + { + message = jstring2char(env, jo); + pyjob = PyString_FromString(message); + release_utf_char(env, jo, message); + } + else + { + pyjob = Py_None; + } + PyList_SetItem(resultList, i, pyjob); + (*env)->DeleteLocalRef(env, jo); + } + free(dims); + (*env)->DeleteLocalRef(env, objarray); + return resultList; + } + else + { + Py_INCREF(Py_None); + return Py_None; + } +} + +// added by njensen +static void initNumpy(void) +{ + if (!numpyInit) + { + import_array(); + numpyInit = 1; + } +} + +// set attribute v for object. +// uses obj->attr dictionary for storage. +static int pyjobject_setattr(PyJobject_Object *obj, + char *name, + PyObject *v) { + PyObject *pyname, *tuple; + + if(!name) { + PyErr_Format(PyExc_RuntimeError, "Invalid name: NULL."); + return -1; + } + + if(!PyList_Check(obj->attr)) { + PyErr_Format(PyExc_RuntimeError, "Invalid attr list."); + return -1; + } + + Py_INCREF(v); + + if(obj->finishAttr) { + PyObject *cur, *pyname; + int ret; + + // finished setting internal objects. + // don't allow python to add new, but do + // allow python script to change values on pyjfields + + pyname = PyString_FromString(name); + cur = tuplelist_getitem(obj->attr, pyname); /* new reference */ + Py_DECREF(pyname); + + if(PyErr_Occurred()) + return -1; + + if(cur == Py_None) { + PyErr_SetString(PyExc_RuntimeError, "No such field."); + return -1; + } + + if(!pyjfield_check(cur)) { + PyErr_SetString(PyExc_TypeError, "Not a pyjfield object."); + return -1; + } + + if(!PyList_Check(obj->attr)) { + Py_DECREF(pyname); + PyErr_SetString(PyExc_RuntimeError, "Invalid attr list."); + return -1; + } + + // now, just ask pyjfield to handle. + ret = pyjfield_set((PyJfield_Object *) cur, v); /* borrows ref */ + + Py_DECREF(cur); + Py_DECREF(v); + return ret; + } + + pyname = PyString_FromString((const char *) name); + tuple = PyTuple_New(2); + + Py_INCREF(pyname); + PyTuple_SetItem(tuple, 0, pyname); /* steals ref */ + PyTuple_SetItem(tuple, 1, v); /* steals ref */ + + // the docs don't mention this, but the source INCREFs tuple + // ... + // after much printf'ing. uhm. must decref it somewhere. + // ... + // doh. the docs suck. + + // Py_INCREF(tuple); + + PyList_Append(obj->attr, tuple); + + Py_DECREF(tuple); + Py_DECREF(pyname); + return 0; // success +} + + +static PyMethodDef pyjobject_methods[] = { + {NULL, NULL, 0, NULL} +}; + + +static PyTypeObject PyJobject_Type = { + PyObject_HEAD_INIT(0) + 0, /* ob_size */ + "PyJobject", /* tp_name */ + sizeof(PyJobject_Object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) pyjobject_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc) pyjobject_getattr, /* tp_getattr */ + (setattrfunc) pyjobject_setattr, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + (ternaryfunc) pyjobject_call, /* tp_call */ + (reprfunc) pyjobject_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + "jobject", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + pyjobject_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + NULL, /* tp_new */ +}; diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.c old mode 100755 new mode 100644 diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/windows/jep.vcproj b/nativeLib/rary.cots.jepp/jepp-2.3/windows/jep.vcproj old mode 100755 new mode 100644 diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/windows/py27-java16/BuildLog.htm b/nativeLib/rary.cots.jepp/jepp-2.3/windows/py27-java16/BuildLog.htm index 524b0f3d8f..c2b5d97422 100644 Binary files a/nativeLib/rary.cots.jepp/jepp-2.3/windows/py27-java16/BuildLog.htm and b/nativeLib/rary.cots.jepp/jepp-2.3/windows/py27-java16/BuildLog.htm differ diff --git a/nativeLib/rary.cots.jepp/rary.cots.jepp.ecl b/nativeLib/rary.cots.jepp/rary.cots.jepp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.cots.jna/rary.cots.jna.ecl b/nativeLib/rary.cots.jna/rary.cots.jna.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.cots.postgresql/rary.cots.postgresql.ecl b/nativeLib/rary.cots.postgresql/rary.cots.postgresql.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.empty.motif/rary.empty.motif.ecl b/nativeLib/rary.empty.motif/rary.empty.motif.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.empty/rary.empty.ecl b/nativeLib/rary.empty/rary.empty.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.meteorological/.cproject b/nativeLib/rary.meteorological/.cproject index f6b3129b77..9d280da42d 100644 --- a/nativeLib/rary.meteorological/.cproject +++ b/nativeLib/rary.meteorological/.cproject @@ -2,502 +2,503 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nativeLib/rary.meteorological/.settings/org.eclipse.cdt.core.prefs b/nativeLib/rary.meteorological/.settings/org.eclipse.cdt.core.prefs index 62eb6fbd87..16f0337a29 100644 --- a/nativeLib/rary.meteorological/.settings/org.eclipse.cdt.core.prefs +++ b/nativeLib/rary.meteorological/.settings/org.eclipse.cdt.core.prefs @@ -1,3 +1,11 @@ -#Wed Dec 16 15:26:41 CST 2009 +#Wed Feb 01 17:07:12 CST 2012 eclipse.preferences.version=1 -environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642=\n\n\n\n\n +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642= +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/COMPILE_FILETYPE/delimiter=; +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/COMPILE_FILETYPE/operation=append +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/COMPILE_FILETYPE/value=../../tool.gluegen/etc +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/PATH/delimiter=; +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/PATH/operation=replace +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/PATH/value=../../tool.gluegen/bin\:${env_var\:PATH} +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/append=true +environment/project/cdt.managedbuild.config.gnu.so.debug.630675783.1284293642/appendContributed=true diff --git a/nativeLib/rary.meteorological/inc/meteoLib.h b/nativeLib/rary.meteorological/inc/meteoLib.h old mode 100755 new mode 100644 diff --git a/nativeLib/rary.meteorological/rary.meteorological.ecl b/nativeLib/rary.meteorological/rary.meteorological.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.meteorological/src/capeFunc.c b/nativeLib/rary.meteorological/src/capeFunc.c old mode 100755 new mode 100644 diff --git a/nativeLib/rary.meteorological/windows/project/Debug/BuildLog.htm b/nativeLib/rary.meteorological/windows/project/Debug/BuildLog.htm index efe5870e66..e05274e9fb 100644 Binary files a/nativeLib/rary.meteorological/windows/project/Debug/BuildLog.htm and b/nativeLib/rary.meteorological/windows/project/Debug/BuildLog.htm differ diff --git a/nativeLib/rary.meteorological/windows/project/meteolib.bat b/nativeLib/rary.meteorological/windows/project/meteolib.bat index e23f2831fc..7a46506574 100644 --- a/nativeLib/rary.meteorological/windows/project/meteolib.bat +++ b/nativeLib/rary.meteorological/windows/project/meteolib.bat @@ -1,46 +1,46 @@ -@echo OFF -REM This script will compile a Windows version of the meteolib library. -REM In order to compile the meteolib library, you will need to have -REM MinGW installed and the AWIPS II Runtime Environment. -REM -REM This script should work on both a 32-bit and a 64-bit Windows 7 -REM installation. - -SET CONTAINING_DIR=%~dp0 - -pushd . > NUL 2>&1 -cd %CONTAINING_DIR% -mingw32-make -f Makefile - -IF ERRORLEVEL 1 ( - echo ERROR: the meteolib compile has failed. - PAUSE && EXIT 1 -) -popd > NUL 2>&1 - -IF NOT EXIST "%CONTAINING_DIR%..\build" ( - MKDIR "%CONTAINING_DIR%..\build" -) - -REM Move the build artifacts to the build directory. -MOVE /Y "%CONTAINING_DIR%meteoLib.dll" ^ - "%CONTAINING_DIR%..\build" - -REM Cleanup the remaining non-essential build artifacts. -IF EXIST "%CONTAINING_DIR%\Meteolibrary_JNI.o" ( - echo Y | DEL "%CONTAINING_DIR%\Meteolibrary_JNI.o" -) -IF EXIST "%CONTAINING_DIR%\Meteolibrary_JNI.c" ( - echo Y | DEL "%CONTAINING_DIR%\Meteolibrary_JNI.c" -) -IF EXIST "%CONTAINING_DIR%\meteoLib.h" ( - echo Y | DEL "%CONTAINING_DIR%\meteoLib.h" -) -IF EXIST "%CONTAINING_DIR%\meteoLib_Java" ( - RMDIR /S /Q "%CONTAINING_DIR%\meteoLib_Java" -) - -echo. -echo. -echo The meteolib compile was successful. -PAUSE +@echo OFF +REM This script will compile a Windows version of the meteolib library. +REM In order to compile the meteolib library, you will need to have +REM MinGW installed and the AWIPS II Runtime Environment. +REM +REM This script should work on both a 32-bit and a 64-bit Windows 7 +REM installation. + +SET CONTAINING_DIR=%~dp0 + +pushd . > NUL 2>&1 +cd %CONTAINING_DIR% +mingw32-make -f Makefile + +IF ERRORLEVEL 1 ( + echo ERROR: the meteolib compile has failed. + PAUSE && EXIT 1 +) +popd > NUL 2>&1 + +IF NOT EXIST "%CONTAINING_DIR%..\build" ( + MKDIR "%CONTAINING_DIR%..\build" +) + +REM Move the build artifacts to the build directory. +MOVE /Y "%CONTAINING_DIR%meteoLib.dll" ^ + "%CONTAINING_DIR%..\build" + +REM Cleanup the remaining non-essential build artifacts. +IF EXIST "%CONTAINING_DIR%\Meteolibrary_JNI.o" ( + echo Y | DEL "%CONTAINING_DIR%\Meteolibrary_JNI.o" +) +IF EXIST "%CONTAINING_DIR%\Meteolibrary_JNI.c" ( + echo Y | DEL "%CONTAINING_DIR%\Meteolibrary_JNI.c" +) +IF EXIST "%CONTAINING_DIR%\meteoLib.h" ( + echo Y | DEL "%CONTAINING_DIR%\meteoLib.h" +) +IF EXIST "%CONTAINING_DIR%\meteoLib_Java" ( + RMDIR /S /Q "%CONTAINING_DIR%\meteoLib_Java" +) + +echo. +echo. +echo The meteolib compile was successful. +PAUSE diff --git a/nativeLib/rary.ohd.calb/rary.ohd.calb.ecl b/nativeLib/rary.ohd.calb/rary.ohd.calb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.ffg/rary.ohd.ffg.ecl b/nativeLib/rary.ohd.ffg/rary.ohd.ffg.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/DHRgather b/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/DHRgather old mode 100755 new mode 100644 diff --git a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe b/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe index 84cddc3e58..f69b4937b5 100644 --- a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe +++ b/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe @@ -6,5 +6,5 @@ RUN_FROM_DIR=`dirname $0` export PPROC_BIN=$(get_apps_defaults pproc_bin) -nohup ksh $PPROC_BIN/start_hpe >&1 > /dev/null & +nohup ksh $PPROC_BIN/start_hpe >/dev/null 2>&1 & exit 0 diff --git a/nativeLib/rary.ohd.filesystem/rary.ohd.filesystem.ecl b/nativeLib/rary.ohd.filesystem/rary.ohd.filesystem.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.ifp/rary.ohd.ifp.ecl b/nativeLib/rary.ohd.ifp/rary.ohd.ifp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.ofs.db/rary.ohd.ofs.db.ecl b/nativeLib/rary.ohd.ofs.db/rary.ohd.ofs.db.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.ofs.shared/rary.ohd.ofs.shared.ecl b/nativeLib/rary.ohd.ofs.shared/rary.ohd.ofs.shared.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.ofs.shefpars.driv/rary.ohd.ofs.shefpars.driv.ecl b/nativeLib/rary.ohd.ofs.shefpars.driv/rary.ohd.ofs.shefpars.driv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.ofs/rary.ohd.ofs.ecl b/nativeLib/rary.ohd.ofs/rary.ohd.ofs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.pproc.gribit/rary.ohd.pproc.gribit.ecl b/nativeLib/rary.ohd.pproc.gribit/rary.ohd.pproc.gribit.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.pproc.util/rary.ohd.pproc.util.ecl b/nativeLib/rary.ohd.pproc.util/rary.ohd.pproc.util.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.pproc/rary.ohd.pproc.ecl b/nativeLib/rary.ohd.pproc/rary.ohd.pproc.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.util/rary.ohd.util.ecl b/nativeLib/rary.ohd.util/rary.ohd.util.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.ohd.whfs/rary.ohd.whfs.ecl b/nativeLib/rary.ohd.whfs/rary.ohd.whfs.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.MonitorTestMode/rary.wfoapi.MonitorTestMode.ecl b/nativeLib/rary.wfoapi.MonitorTestMode/rary.wfoapi.MonitorTestMode.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.common/rary.wfoapi.common.ecl b/nativeLib/rary.wfoapi.common/rary.wfoapi.common.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.consoleUser/rary.wfoapi.consoleUser.ecl b/nativeLib/rary.wfoapi.consoleUser/rary.wfoapi.consoleUser.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.getTestMode/rary.wfoapi.getTestMode.ecl b/nativeLib/rary.wfoapi.getTestMode/rary.wfoapi.getTestMode.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.showBanner/rary.wfoapi.showBanner.ecl b/nativeLib/rary.wfoapi.showBanner/rary.wfoapi.showBanner.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.temp/rary.wfoapi.temp.ecl b/nativeLib/rary.wfoapi.temp/rary.wfoapi.temp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.test_WorkstationTestMode/rary.wfoapi.test_WorkstationTestMode.ecl b/nativeLib/rary.wfoapi.test_WorkstationTestMode/rary.wfoapi.test_WorkstationTestMode.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.tmb/rary.wfoapi.tmb.ecl b/nativeLib/rary.wfoapi.tmb/rary.wfoapi.tmb.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.tmbRemoteCheck/rary.wfoapi.tmbRemoteCheck.ecl b/nativeLib/rary.wfoapi.tmbRemoteCheck/rary.wfoapi.tmbRemoteCheck.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.tmb_exit/rary.wfoapi.tmb_exit.ecl b/nativeLib/rary.wfoapi.tmb_exit/rary.wfoapi.tmb_exit.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/rary.wfoapi.tmcp/rary.wfoapi.tmcp.ecl b/nativeLib/rary.wfoapi.tmcp/rary.wfoapi.tmcp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/runy.cots.flex/runy.cots.flex.ecl b/nativeLib/runy.cots.flex/runy.cots.flex.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/runy.runso/runy.runso.ecl b/nativeLib/runy.runso/runy.runso.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/tool.cdbgen/tool.cdbgen.ecl b/nativeLib/tool.cdbgen/tool.cdbgen.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nativeLib/tool.gluegen/tool.gluegen.ecl b/nativeLib/tool.gluegen/tool.gluegen.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/com.raytheon.uf.viz.ncep.core.feature/com.raytheon.uf.viz.ncep.core.feature.ecl b/ncep/com.raytheon.uf.viz.ncep.core.feature/com.raytheon.uf.viz.ncep.core.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/com.raytheon.uf.viz.ncep.nsharp.feature/com.raytheon.uf.viz.ncep.nsharp.feature.ecl b/ncep/com.raytheon.uf.viz.ncep.nsharp.feature/com.raytheon.uf.viz.ncep.nsharp.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/com.raytheon.uf.viz.ncep.perspective.feature/com.raytheon.uf.viz.ncep.perspective.feature.ecl b/ncep/com.raytheon.uf.viz.ncep.perspective.feature/com.raytheon.uf.viz.ncep.perspective.feature.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/edu.wisc.ssec.mcidas/edu.wisc.ssec.mcidas.ecl b/ncep/edu.wisc.ssec.mcidas/edu.wisc.ssec.mcidas.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/component-deploy.xml old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/gov.noaa.nws.ncep.common.dataplugin.airmet.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/gov.noaa.nws.ncep.common.dataplugin.airmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetLocation.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetLocation.java index 38a2e80669..4ae554ab72 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetLocation.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetLocation.java @@ -1,192 +1,192 @@ -/** - * AirmetLocation - * - * This java class defines the getters and setters for the - * airmet location table. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 05/2009 39 L. Lin Initial creation - * 07/2009 39 L. Lin Migration to TO11 - * 09/2009 39 L. Lin Add latitude/longitude to location table - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.airmet; - -import java.io.Serializable; - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; - -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - - -@Entity -@Table(name="airmet_location") -@DynamicSerialize -public class AirmetLocation implements Serializable, ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue - private Integer recordId = null; - - - // Collection of locations - @Column(length=480) - @DynamicSerializeElement - private String locationLine; - - // Each location of a airmet forecast area - @Column(length=48) - @DynamicSerializeElement - private String location; - - // Each latitude of an airmet forecast area - @Column - @DynamicSerializeElement - private double latitude; - - // Each longitude of an airmet forecast area - @Column - @DynamicSerializeElement - private double longitude; - - // Index for the order of a complete location set - @Column - @DynamicSerializeElement - private Integer index; - - /** - * No-Arg Convstructor. - */ - public AirmetLocation() { - this.locationLine=""; - this.location=""; - this.index=IDecoderConstantsN.INTEGER_MISSING; - } - - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - /** - * @return the parentID - * - public AirmetReport getParentID() { - return parentID; - }*/ - - /** - * @param parentID to set - * - public void setParentID(AirmetReport parentID) { - this.parentID = parentID; - }*/ - - /** - * @return the index - */ - public Integer getIndex() { - return index; - } - - /** - * @param index to set - */ - public void setIndex(Integer index) { - this.index = index; - } - - /** - * @return the locationLine - */ - public String getLocationLine() { - return locationLine; - } - - /** - * @param locationLine to set - */ - public void setLocationLine(String locationLine) { - this.locationLine = locationLine; - } - - /** - * @return the location - */ - public String getLocation() { - return location; - } - - /** - * @param location to set - */ - public void setLocation(String location) { - this.location = location; - } - - /** - * @return the latitude - */ - public double getLatitude() { - return latitude; - } - - /** - * @param latitude to set - */ - public void setLatitude(double latitude) { - this.latitude = latitude; - } - - /** - * @return the longitude - */ - public double getLongitude() { - return longitude; - } - - /** - * @param longitude to set - */ - public void setLongitude(double longitude) { - this.longitude = longitude; - } - - /** - * Get the record id. - * - * @return The recordId. If not set returns null. - */ - public Integer getRecordId() { - return recordId; - } - - /** - * Set the record id. - * @param record - */ - public void setRecordId(Integer recordId) { - this.recordId = recordId; - } - -} +/** + * AirmetLocation + * + * This java class defines the getters and setters for the + * airmet location table. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 05/2009 39 L. Lin Initial creation + * 07/2009 39 L. Lin Migration to TO11 + * 09/2009 39 L. Lin Add latitude/longitude to location table + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.airmet; + +import java.io.Serializable; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + + +@Entity +@Table(name="airmet_location") +@DynamicSerialize +public class AirmetLocation implements Serializable, ISerializableObject { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Integer recordId = null; + + + // Collection of locations + @Column(length=480) + @DynamicSerializeElement + private String locationLine; + + // Each location of a airmet forecast area + @Column(length=48) + @DynamicSerializeElement + private String location; + + // Each latitude of an airmet forecast area + @Column + @DynamicSerializeElement + private double latitude; + + // Each longitude of an airmet forecast area + @Column + @DynamicSerializeElement + private double longitude; + + // Index for the order of a complete location set + @Column + @DynamicSerializeElement + private Integer index; + + /** + * No-Arg Convstructor. + */ + public AirmetLocation() { + this.locationLine=""; + this.location=""; + this.index=IDecoderConstantsN.INTEGER_MISSING; + } + + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + /** + * @return the parentID + * + public AirmetReport getParentID() { + return parentID; + }*/ + + /** + * @param parentID to set + * + public void setParentID(AirmetReport parentID) { + this.parentID = parentID; + }*/ + + /** + * @return the index + */ + public Integer getIndex() { + return index; + } + + /** + * @param index to set + */ + public void setIndex(Integer index) { + this.index = index; + } + + /** + * @return the locationLine + */ + public String getLocationLine() { + return locationLine; + } + + /** + * @param locationLine to set + */ + public void setLocationLine(String locationLine) { + this.locationLine = locationLine; + } + + /** + * @return the location + */ + public String getLocation() { + return location; + } + + /** + * @param location to set + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * @return the latitude + */ + public double getLatitude() { + return latitude; + } + + /** + * @param latitude to set + */ + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + /** + * @return the longitude + */ + public double getLongitude() { + return longitude; + } + + /** + * @param longitude to set + */ + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + /** + * Get the record id. + * + * @return The recordId. If not set returns null. + */ + public Integer getRecordId() { + return recordId; + } + + /** + * Set the record id. + * @param record + */ + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetRecord.java index 543cccdc6c..68589209cf 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetRecord.java @@ -1,322 +1,322 @@ -/** - * AirmetRecord - * - * This java class performs the mapping to the database table for AIRMET - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 05/2009 L. Lin Initial creation - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 05/2009 39 L. Lin Initial coding - * 07/2009 39 L. Lin Migration to TO11 - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.airmet; - -import java.util.Calendar; -import java.util.HashSet; -import java.util.Set; -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; - -import javax.persistence.CascadeType; -import javax.persistence.Column; - -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; - -import org.hibernate.annotations.Index; - -import com.raytheon.uf.common.dataplugin.annotations.DataURI; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -@Entity -@Table(name = "airmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) -@DynamicSerialize - - -public class AirmetRecord extends PluginDataObject{ - - /** - * - */ - private static final long serialVersionUID = 1L; - - // reportType is AIRMET. - @Column(length=32) - @DynamicSerializeElement - private String reportType; - - // reportName will be SIERRA, TANGO, or ZULU - @Column(length=32) - @DataURI(position=1) - @DynamicSerializeElement - private String reportName; - - // WMO header - @Column(length=32) - @DataURI(position=2) - @DynamicSerializeElement - private String wmoHeader; - - // The issue office where the report from - @Column(length=32) - @DynamicSerializeElement - private String issueOffice; - - // Update number as: 1, 2, 3, ... - @Column - @DataURI(position=3) - @DynamicSerializeElement - private Integer updateNumber; - - // Issue time of the report - @Column - @DynamicSerializeElement - private Calendar issueTime; - - // The designator - @Column(length=8) - @DynamicSerializeElement - private String designatorBBB; - - // CorrectionFlag is a flag: 0 for normal, 1 for COR or CC, 2 for AMD, and 3 for TEST - /* - * CorrectionFlag is a flag: - * 0 for normal, 1 for COR or CC, 2 for AMD, 3 for TEST, and 4 for NIL report - */ - @Column - @DynamicSerializeElement - private Integer correctionFlag; - - // The entire report - @Column(length=15000) - @DynamicSerializeElement - private String bullMessage; - - - /** - * Airmet report - */ - @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "parentID", nullable = false) - @Index(name = "airmetReport_parentid_idex") - private Set airmetReport = new HashSet(); - - - /** - * Default Convstructor - */ - public AirmetRecord() { - this.issueOffice=""; - this.wmoHeader=""; - this.bullMessage=""; - this.designatorBBB=""; - this.updateNumber=0; - this.reportType=""; - this.reportName=null; - this.correctionFlag=0; - } - - /** - * Convstructs an airmet record from a dataURI - * - * @param uri The dataURI - */ - public AirmetRecord(String uri) { - super(uri); - } - - - @Override - public IDecoderGettable getDecoderGettable() { - // TODO Auto-generated method stub - return null; - } - - /** - * @return the issueOffice - */ - public String getIssueOffice(){ - return issueOffice; - } - - /** - * @param issueOffice to set - */ - public void setIssueOffice(String issueOffice){ - this.issueOffice=issueOffice; - } - - /** - * @return the wmoHeader - */ - public String getWmoHeader(){ - return wmoHeader; - } - - /** - * @param wnoHeader to set - */ - public void setWmoHeader(String wmoHeader){ - this.wmoHeader=wmoHeader; - } - - /** - * @return the issueTime - */ - public Calendar getIssueTime(){ - return issueTime; - } - - /** - * @param issueTime to set - */ - public void setIssueTime(Calendar issueTime){ - this.issueTime=issueTime; - } - - /** - * @return the reportType - */ - public String getReportType() { - return reportType; - } - - /** - * @param reportType to set - */ - public void setReportType(String reportType) { - this.reportType = reportType; - } - - /** - * @return the designatorBBB - */ - public String getDesignatorBBB() { - return designatorBBB; - } - - /** - * @param designatorBBB to set - */ - public void setDesignatorBBB(String designatorBBB) { - this.designatorBBB = designatorBBB; - } - - /** - * @return the correctionFlag - */ - public Integer getCorrectionFlag() { - return correctionFlag; - } - - /** - * @param correctionFlag to set - */ - public void setCorrectionFlag(Integer correctionFlag) { - this.correctionFlag = correctionFlag; - } - - /** - * @return the updateNumber - */ - public Integer getUpdateNumber() { - return updateNumber; - } - - /** - * @param updateNumber to set - */ - public void setUpdateNumber(Integer updateNumber) { - this.updateNumber = updateNumber; - } - - /** - * @return the bullMessage - */ - public String getBullMessage() { - return bullMessage; - } - - /** - * @param bullMessage to set - */ - public void setBullMessage(String bullMessage) { - this.bullMessage = bullMessage; - } - - /** - * @return the reportName - */ - public String getReportName() { - return reportName; - } - - /** - * @param reportName to set - */ - public void setReportName(String reportName) { - this.reportName = reportName; - } - - /** - * @return the set of AIRMET report - */ - public Set getAirmetReport() { - return airmetReport; - } - - /** - * @param airmet the report to set - */ - public void setAirmetReport(Set curReport) { - this.airmetReport = curReport; - } - - /** - * @param add AirmetReport to set - */ - public void addAirmetReport(AirmetReport curReport){ - airmetReport.add(curReport); - //curReport.setParentID(this); - } - - /** - * Override existing set method to modify any - * classes that use the dataURI as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) - { - - this.identifier = dataURI; - /* - if(this.getAirmetReport() != null && this.getAirmetReport().size() > 0) - { - for (Iterator iter = this.getAirmetReport().iterator(); iter.hasNext();) { - AirmetReport cs = iter.next(); - cs.setParentID(this); - } - }*/ - - } - -} +/** + * AirmetRecord + * + * This java class performs the mapping to the database table for AIRMET + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 05/2009 L. Lin Initial creation + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 05/2009 39 L. Lin Initial coding + * 07/2009 39 L. Lin Migration to TO11 + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.airmet; + +import java.util.Calendar; +import java.util.HashSet; +import java.util.Set; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.IDecoderGettable; + +import javax.persistence.CascadeType; +import javax.persistence.Column; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.Index; + +import com.raytheon.uf.common.dataplugin.annotations.DataURI; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +@Entity +@Table(name = "airmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@DynamicSerialize + + +public class AirmetRecord extends PluginDataObject{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + // reportType is AIRMET. + @Column(length=32) + @DynamicSerializeElement + private String reportType; + + // reportName will be SIERRA, TANGO, or ZULU + @Column(length=32) + @DataURI(position=1) + @DynamicSerializeElement + private String reportName; + + // WMO header + @Column(length=32) + @DataURI(position=2) + @DynamicSerializeElement + private String wmoHeader; + + // The issue office where the report from + @Column(length=32) + @DynamicSerializeElement + private String issueOffice; + + // Update number as: 1, 2, 3, ... + @Column + @DataURI(position=3) + @DynamicSerializeElement + private Integer updateNumber; + + // Issue time of the report + @Column + @DynamicSerializeElement + private Calendar issueTime; + + // The designator + @Column(length=8) + @DynamicSerializeElement + private String designatorBBB; + + // CorrectionFlag is a flag: 0 for normal, 1 for COR or CC, 2 for AMD, and 3 for TEST + /* + * CorrectionFlag is a flag: + * 0 for normal, 1 for COR or CC, 2 for AMD, 3 for TEST, and 4 for NIL report + */ + @Column + @DynamicSerializeElement + private Integer correctionFlag; + + // The entire report + @Column(length=15000) + @DynamicSerializeElement + private String bullMessage; + + + /** + * Airmet report + */ + @DynamicSerializeElement + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "parentID", nullable = false) + @Index(name = "airmetReport_parentid_idex") + private Set airmetReport = new HashSet(); + + + /** + * Default Convstructor + */ + public AirmetRecord() { + this.issueOffice=""; + this.wmoHeader=""; + this.bullMessage=""; + this.designatorBBB=""; + this.updateNumber=0; + this.reportType=""; + this.reportName=null; + this.correctionFlag=0; + } + + /** + * Convstructs an airmet record from a dataURI + * + * @param uri The dataURI + */ + public AirmetRecord(String uri) { + super(uri); + } + + + @Override + public IDecoderGettable getDecoderGettable() { + // TODO Auto-generated method stub + return null; + } + + /** + * @return the issueOffice + */ + public String getIssueOffice(){ + return issueOffice; + } + + /** + * @param issueOffice to set + */ + public void setIssueOffice(String issueOffice){ + this.issueOffice=issueOffice; + } + + /** + * @return the wmoHeader + */ + public String getWmoHeader(){ + return wmoHeader; + } + + /** + * @param wnoHeader to set + */ + public void setWmoHeader(String wmoHeader){ + this.wmoHeader=wmoHeader; + } + + /** + * @return the issueTime + */ + public Calendar getIssueTime(){ + return issueTime; + } + + /** + * @param issueTime to set + */ + public void setIssueTime(Calendar issueTime){ + this.issueTime=issueTime; + } + + /** + * @return the reportType + */ + public String getReportType() { + return reportType; + } + + /** + * @param reportType to set + */ + public void setReportType(String reportType) { + this.reportType = reportType; + } + + /** + * @return the designatorBBB + */ + public String getDesignatorBBB() { + return designatorBBB; + } + + /** + * @param designatorBBB to set + */ + public void setDesignatorBBB(String designatorBBB) { + this.designatorBBB = designatorBBB; + } + + /** + * @return the correctionFlag + */ + public Integer getCorrectionFlag() { + return correctionFlag; + } + + /** + * @param correctionFlag to set + */ + public void setCorrectionFlag(Integer correctionFlag) { + this.correctionFlag = correctionFlag; + } + + /** + * @return the updateNumber + */ + public Integer getUpdateNumber() { + return updateNumber; + } + + /** + * @param updateNumber to set + */ + public void setUpdateNumber(Integer updateNumber) { + this.updateNumber = updateNumber; + } + + /** + * @return the bullMessage + */ + public String getBullMessage() { + return bullMessage; + } + + /** + * @param bullMessage to set + */ + public void setBullMessage(String bullMessage) { + this.bullMessage = bullMessage; + } + + /** + * @return the reportName + */ + public String getReportName() { + return reportName; + } + + /** + * @param reportName to set + */ + public void setReportName(String reportName) { + this.reportName = reportName; + } + + /** + * @return the set of AIRMET report + */ + public Set getAirmetReport() { + return airmetReport; + } + + /** + * @param airmet the report to set + */ + public void setAirmetReport(Set curReport) { + this.airmetReport = curReport; + } + + /** + * @param add AirmetReport to set + */ + public void addAirmetReport(AirmetReport curReport){ + airmetReport.add(curReport); + //curReport.setParentID(this); + } + + /** + * Override existing set method to modify any + * classes that use the dataURI as a foreign key + */ + @Override + public void setIdentifier(Object dataURI) + { + + this.identifier = dataURI; + /* + if(this.getAirmetReport() != null && this.getAirmetReport().size() > 0) + { + for (Iterator iter = this.getAirmetReport().iterator(); iter.hasNext();) { + AirmetReport cs = iter.next(); + cs.setParentID(this); + } + }*/ + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetReport.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetReport.java index 723e4b8f76..d009582c88 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetReport.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/AirmetReport.java @@ -1,328 +1,328 @@ -/** - * AirmetReport - * - * This java class defines the getters and setters for the - * AIRMET report table. - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 05/2009 L. Lin Initial creation - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.airmet; - -import java.io.Serializable; - -import java.util.Calendar; -import java.util.HashSet; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; - -import org.hibernate.annotations.Index; - -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -@Entity -@Table(name="airmet_report") -@DynamicSerialize -public class AirmetReport implements Serializable, ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue - private Integer recordId = null; - - // The AIRMET record this object belongs to - //@ManyToOne - //@JoinColumn(name="parentID", nullable=false) - // private AirmetRecord parentID; - - /* - * hazard type as: Instrument Flight Rules(IR), Mountain Obscuration(MO), - * Turbulence(TB), Icing(IC), Sustained SFC Winds(SW), - * Low Level Wind Shear(LLWS), or CANCEL. If a report is outlook, then - * an "OUTLOOK: will be added. - */ - @Column(length=40) - @DynamicSerializeElement - private String hazardType; - - //The report indicator will be AIRMET or OUTLOOK. - @Column(length=16) - @DynamicSerializeElement - private String reportIndicator; - - // Sequence ID of an AIRMET report - @Column(length=16) - @DynamicSerializeElement - private String sequenceID; - - // Start time of the report - @Column - @DynamicSerializeElement - private Calendar startTime; - - // End time of the report - @Column - @DynamicSerializeElement - private Calendar endTime; - - // Flight level 1 - @Column(length=16) - @DynamicSerializeElement - private String flightLevel1; - - // Flight level 2 - @Column(length=16) - @DynamicSerializeElement - private String flightLevel2; - - // cancelFlag is a flag indicating a cancellation (0 or 1) - @Column - @DynamicSerializeElement - private Integer cancelFlag; - - // The information of a complete report - @Column(length=1440) - @DynamicSerializeElement - private String segment; - - - /** - * Airmet location - */ - @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "parentID", nullable = false) - @Index(name = "airmetLocation_parentid_idex") - private Set airmetLocation = new HashSet(); - - - /** - * No-Arg Convstructor - */ - public AirmetReport() { - this.flightLevel1 = null; - this.flightLevel2=null; - this.segment=null; - this.hazardType=null; - this.reportIndicator=null; - this.sequenceID=null; - this.cancelFlag=0; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - /** - * @return the sequenceID - */ - public String getSequenceID() { - return sequenceID; - - } - - /** - * @return the sequenceID - */ - public void setSequenceID(String sequenceID) { - this.sequenceID = sequenceID; - } - - /** - * @return the set of airmet location - */ - public Set getAirmetLocation() { - return airmetLocation; - } - - /** - * @param airmet the location to set - */ - public void setAirmetLocation(Set curLocation) { - this.airmetLocation = curLocation; - } - - /** - * @param add airmet location to set - */ - public void addAirmetLocation(AirmetLocation plocation){ - airmetLocation.add(plocation); - } - - /** - * @return the parentID - * - //public String getParentID() { - public AirmetRecord getParentID() { - - return parentID; - }*/ - - /** - * @param parentID the parentID to set - * - public void setParentID(AirmetRecord parentID) { - //this.parentID = parentID; - if(this.getAirmetLocation() != null && this.getAirmetLocation().size() > 0) - { - for (Iterator iter = this.getAirmetLocation().iterator(); iter.hasNext();) { - AirmetLocation cond = iter.next(); - cond.setParentID(this); - } - } - }*/ - - /** - * @return the report - */ - public String getSegment() { - return segment; - } - - /** - * @param segment to set - */ - public void setSegment(String segment) { - this.segment = segment; - } - - /** - * @return the startTime - */ - public Calendar getStartTime() { - return startTime; - } - - /** - * @param startTime to set - */ - public void setStartTime(Calendar startTime) { - this.startTime = startTime; - } - - /** - * @return the endTime - */ - public Calendar getEndTime() { - return endTime; - } - - /** - * @param endTIme to set - */ - public void setEndTime(Calendar endTime) { - this.endTime = endTime; - } - - /** - * @return the flightLevel1 - */ - public String getFlightLevel1() { - return flightLevel1; - } - - /** - * @param flightLevel1 to set - */ - public void setFlightLevel1(String flightLevel1) { - this.flightLevel1 = flightLevel1; - } - - /** - * @return the flightLevel2 - */ - public String getFlightLevel2() { - return flightLevel2; - } - - /** - * @param flightLevel2 to set - */ - public void setFlightLevel2(String flightLevel2) { - this.flightLevel2 = flightLevel2; - } - - /** - * Get the record id. - * - * @return The recordId. If not set returns null. - */ - public Integer getRecordId() { - return recordId; - } - - /** - * Set the record id. - * @param record - */ - public void setRecordId(Integer recordId) { - this.recordId = recordId; - } - - /** - * @return the cancelFlag - */ - public Integer getCancelFlag() { - return cancelFlag; - } - - /** - * @param cancelFlag to set - */ - public void setCancelFlag(Integer cancelFlag) { - this.cancelFlag = cancelFlag; - } - - /** - * @return the hazardType - */ - public String getHazardType() { - return hazardType; - } - - /** - * @param hazardType to set - */ - public void setHazardType(String hazardType) { - this.hazardType = hazardType; - } - - /** - * @return the reportIndicator - */ - public String getReportIndicator() { - return reportIndicator; - } - - /** - * @param reportIndicator to set - */ - public void setReportIndicator(String reportIndicator) { - this.reportIndicator = reportIndicator; - } - -} +/** + * AirmetReport + * + * This java class defines the getters and setters for the + * AIRMET report table. + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 05/2009 L. Lin Initial creation + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.airmet; + +import java.io.Serializable; + +import java.util.Calendar; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.Index; + +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +@Entity +@Table(name="airmet_report") +@DynamicSerialize +public class AirmetReport implements Serializable, ISerializableObject { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Integer recordId = null; + + // The AIRMET record this object belongs to + //@ManyToOne + //@JoinColumn(name="parentID", nullable=false) + // private AirmetRecord parentID; + + /* + * hazard type as: Instrument Flight Rules(IR), Mountain Obscuration(MO), + * Turbulence(TB), Icing(IC), Sustained SFC Winds(SW), + * Low Level Wind Shear(LLWS), or CANCEL. If a report is outlook, then + * an "OUTLOOK: will be added. + */ + @Column(length=40) + @DynamicSerializeElement + private String hazardType; + + //The report indicator will be AIRMET or OUTLOOK. + @Column(length=16) + @DynamicSerializeElement + private String reportIndicator; + + // Sequence ID of an AIRMET report + @Column(length=16) + @DynamicSerializeElement + private String sequenceID; + + // Start time of the report + @Column + @DynamicSerializeElement + private Calendar startTime; + + // End time of the report + @Column + @DynamicSerializeElement + private Calendar endTime; + + // Flight level 1 + @Column(length=16) + @DynamicSerializeElement + private String flightLevel1; + + // Flight level 2 + @Column(length=16) + @DynamicSerializeElement + private String flightLevel2; + + // cancelFlag is a flag indicating a cancellation (0 or 1) + @Column + @DynamicSerializeElement + private Integer cancelFlag; + + // The information of a complete report + @Column(length=1440) + @DynamicSerializeElement + private String segment; + + + /** + * Airmet location + */ + @DynamicSerializeElement + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "parentID", nullable = false) + @Index(name = "airmetLocation_parentid_idex") + private Set airmetLocation = new HashSet(); + + + /** + * No-Arg Convstructor + */ + public AirmetReport() { + this.flightLevel1 = null; + this.flightLevel2=null; + this.segment=null; + this.hazardType=null; + this.reportIndicator=null; + this.sequenceID=null; + this.cancelFlag=0; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + /** + * @return the sequenceID + */ + public String getSequenceID() { + return sequenceID; + + } + + /** + * @return the sequenceID + */ + public void setSequenceID(String sequenceID) { + this.sequenceID = sequenceID; + } + + /** + * @return the set of airmet location + */ + public Set getAirmetLocation() { + return airmetLocation; + } + + /** + * @param airmet the location to set + */ + public void setAirmetLocation(Set curLocation) { + this.airmetLocation = curLocation; + } + + /** + * @param add airmet location to set + */ + public void addAirmetLocation(AirmetLocation plocation){ + airmetLocation.add(plocation); + } + + /** + * @return the parentID + * + //public String getParentID() { + public AirmetRecord getParentID() { + + return parentID; + }*/ + + /** + * @param parentID the parentID to set + * + public void setParentID(AirmetRecord parentID) { + //this.parentID = parentID; + if(this.getAirmetLocation() != null && this.getAirmetLocation().size() > 0) + { + for (Iterator iter = this.getAirmetLocation().iterator(); iter.hasNext();) { + AirmetLocation cond = iter.next(); + cond.setParentID(this); + } + } + }*/ + + /** + * @return the report + */ + public String getSegment() { + return segment; + } + + /** + * @param segment to set + */ + public void setSegment(String segment) { + this.segment = segment; + } + + /** + * @return the startTime + */ + public Calendar getStartTime() { + return startTime; + } + + /** + * @param startTime to set + */ + public void setStartTime(Calendar startTime) { + this.startTime = startTime; + } + + /** + * @return the endTime + */ + public Calendar getEndTime() { + return endTime; + } + + /** + * @param endTIme to set + */ + public void setEndTime(Calendar endTime) { + this.endTime = endTime; + } + + /** + * @return the flightLevel1 + */ + public String getFlightLevel1() { + return flightLevel1; + } + + /** + * @param flightLevel1 to set + */ + public void setFlightLevel1(String flightLevel1) { + this.flightLevel1 = flightLevel1; + } + + /** + * @return the flightLevel2 + */ + public String getFlightLevel2() { + return flightLevel2; + } + + /** + * @param flightLevel2 to set + */ + public void setFlightLevel2(String flightLevel2) { + this.flightLevel2 = flightLevel2; + } + + /** + * Get the record id. + * + * @return The recordId. If not set returns null. + */ + public Integer getRecordId() { + return recordId; + } + + /** + * Set the record id. + * @param record + */ + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + + /** + * @return the cancelFlag + */ + public Integer getCancelFlag() { + return cancelFlag; + } + + /** + * @param cancelFlag to set + */ + public void setCancelFlag(Integer cancelFlag) { + this.cancelFlag = cancelFlag; + } + + /** + * @return the hazardType + */ + public String getHazardType() { + return hazardType; + } + + /** + * @param hazardType to set + */ + public void setHazardType(String hazardType) { + this.hazardType = hazardType; + } + + /** + * @return the reportIndicator + */ + public String getReportIndicator() { + return reportIndicator; + } + + /** + * @param reportIndicator to set + */ + public void setReportIndicator(String reportIndicator) { + this.reportIndicator = reportIndicator; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/dao/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/dao/package-info.java old mode 100644 new mode 100755 index a14f1d767a..9756d21d53 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/dao/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/dao/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains data access object for airmet data. -*/ -package gov.noaa.nws.ncep.common.dataplugin.airmet.dao; +/** +* Contains data access object for airmet data. +*/ +package gov.noaa.nws.ncep.common.dataplugin.airmet.dao; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/package-info.java old mode 100644 new mode 100755 index 8841b360da..0834c431c0 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.airmet/src/gov/noaa/nws/ncep/common/dataplugin/airmet/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains table record for decoder plug-ins -*/ -package gov.noaa.nws.ncep.common.dataplugin.airmet; +/** +* Contains table record for decoder plug-ins +*/ +package gov.noaa.nws.ncep.common.dataplugin.airmet; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.atcf/gov.noaa.nws.ncep.common.dataplugin.atcf.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.atcf/gov.noaa.nws.ncep.common.dataplugin.atcf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.atcf/src/gov/noaa/nws/ncep/common/dataplugin/atcf/dao/AtcfDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.atcf/src/gov/noaa/nws/ncep/common/dataplugin/atcf/dao/AtcfDao.java index b8a7dd66b9..a2dbda62eb 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.atcf/src/gov/noaa/nws/ncep/common/dataplugin/atcf/dao/AtcfDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.atcf/src/gov/noaa/nws/ncep/common/dataplugin/atcf/dao/AtcfDao.java @@ -12,64 +12,64 @@ * * @author fjyen * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.atcf.dao; - -import java.util.List; - -import gov.noaa.nws.ncep.common.dataplugin.atcf.AtcfRecord; + **/ +package gov.noaa.nws.ncep.common.dataplugin.atcf.dao; + +import java.util.List; + +import gov.noaa.nws.ncep.common.dataplugin.atcf.AtcfRecord; import gov.noaa.nws.ncep.edex.common.dao.NcepDefaultPluginDao; -import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.edex.database.DataAccessLayerException; - -public class AtcfDao extends NcepDefaultPluginDao { - - - /** - * Creates a new ReccoDao - * @throws PluginException - */ - public AtcfDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a atcf report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public AtcfRecord queryByDataURI(String dataURI) { - AtcfRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (AtcfRecord) obs.get(0); - } - return report; - } - - /** - * Queries for to determine if a given data uri exists on the ATCF table. - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.atcf where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; - } -} + +public class AtcfDao extends NcepDefaultPluginDao { + + + /** + * Creates a new ReccoDao + * @throws PluginException + */ + public AtcfDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a atcf report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public AtcfRecord queryByDataURI(String dataURI) { + AtcfRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (AtcfRecord) obs.get(0); + } + return report; + } + + /** + * Queries for to determine if a given data uri exists on the ATCF table. + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.atcf where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.aww/gov.noaa.nws.ncep.common.dataplugin.aww.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.aww/gov.noaa.nws.ncep.common.dataplugin.aww.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/component-deploy.xml old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/gov.noaa.nws.ncep.common.dataplugin.convsigmet.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/gov.noaa.nws.ncep.common.dataplugin.convsigmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetLocation.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetLocation.java index 4a900182ec..697d6ec734 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetLocation.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetLocation.java @@ -1,178 +1,178 @@ -/** - * ConvsigmetLocation - * - * This java class defines the getters and setters for the - * convective sigmet location table. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 06/2009 87/114 L. Lin Enlarge size of locationLine and location. - * 07/2009 87/114 L. Lin Migration to TO11 - * 09/2009 87/114 L. Lin Add latitude/longitude to location table - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ -package gov.noaa.nws.ncep.common.dataplugin.convsigmet; - -import java.io.Serializable; - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -@Entity -@Table(name="convsigmet_location") -@DynamicSerialize -public class ConvSigmetLocation implements Serializable, ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue - private Integer recordId = null; - - - // Collection of locations - @Column(length=480) - @DynamicSerializeElement - private String locationLine; - - // Each location of a convective sigmet forecast area - @Column(length=48) - @DynamicSerializeElement - private String location; - - // Each latitude of a convective sigmet forecast area - @Column - @DynamicSerializeElement - private double latitude; - - // Each longitude of a convective sigmet forecast area - @Column - @DynamicSerializeElement - private double longitude; - - // Index for the order of a complete location set - @Column - @DynamicSerializeElement - private Integer index; - - /** - * No-Arg Convstructor. - */ - public ConvSigmetLocation() { - this.locationLine=""; - this.location=""; - this.index=IDecoderConstantsN.INTEGER_MISSING; - } - - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - - /** - * @return the index - */ - public Integer getIndex() { - return index; - } - - /** - * @param index to set - */ - public void setIndex(Integer index) { - this.index = index; - } - - /** - * @return the locationLine - */ - public String getLocationLine() { - return locationLine; - } - - /** - * @param locationLine to set - */ - public void setLocationLine(String locationLine) { - this.locationLine = locationLine; - } - - /** - * @return the location - */ - public String getLocation() { - return location; - } - - /** - * @param location to set - */ - public void setLocation(String location) { - this.location = location; - } - - /** - * @return the latitude - */ - public double getLatitude() { - return latitude; - } - - /** - * @param latitude to set - */ - public void setLatitude(double latitude) { - this.latitude = latitude; - } - - /** - * @return the longitude - */ - public double getLongitude() { - return longitude; - } - - /** - * @param longitude to set - */ - public void setLongitude(double longitude) { - this.longitude = longitude; - } - - - /** - * Get the record id. - * - * @return The recordId. If not set returns null. - */ - public Integer getRecordId() { - return recordId; - } - - /** - * Set the record id. - * @param record - */ - public void setRecordId(Integer recordId) { - this.recordId = recordId; - } - -} +/** + * ConvsigmetLocation + * + * This java class defines the getters and setters for the + * convective sigmet location table. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2009 87/114 L. Lin Initial coding + * 06/2009 87/114 L. Lin Enlarge size of locationLine and location. + * 07/2009 87/114 L. Lin Migration to TO11 + * 09/2009 87/114 L. Lin Add latitude/longitude to location table + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ +package gov.noaa.nws.ncep.common.dataplugin.convsigmet; + +import java.io.Serializable; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +@Entity +@Table(name="convsigmet_location") +@DynamicSerialize +public class ConvSigmetLocation implements Serializable, ISerializableObject { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Integer recordId = null; + + + // Collection of locations + @Column(length=480) + @DynamicSerializeElement + private String locationLine; + + // Each location of a convective sigmet forecast area + @Column(length=48) + @DynamicSerializeElement + private String location; + + // Each latitude of a convective sigmet forecast area + @Column + @DynamicSerializeElement + private double latitude; + + // Each longitude of a convective sigmet forecast area + @Column + @DynamicSerializeElement + private double longitude; + + // Index for the order of a complete location set + @Column + @DynamicSerializeElement + private Integer index; + + /** + * No-Arg Convstructor. + */ + public ConvSigmetLocation() { + this.locationLine=""; + this.location=""; + this.index=IDecoderConstantsN.INTEGER_MISSING; + } + + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + + /** + * @return the index + */ + public Integer getIndex() { + return index; + } + + /** + * @param index to set + */ + public void setIndex(Integer index) { + this.index = index; + } + + /** + * @return the locationLine + */ + public String getLocationLine() { + return locationLine; + } + + /** + * @param locationLine to set + */ + public void setLocationLine(String locationLine) { + this.locationLine = locationLine; + } + + /** + * @return the location + */ + public String getLocation() { + return location; + } + + /** + * @param location to set + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * @return the latitude + */ + public double getLatitude() { + return latitude; + } + + /** + * @param latitude to set + */ + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + /** + * @return the longitude + */ + public double getLongitude() { + return longitude; + } + + /** + * @param longitude to set + */ + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + + /** + * Get the record id. + * + * @return The recordId. If not set returns null. + */ + public Integer getRecordId() { + return recordId; + } + + /** + * Set the record id. + * @param record + */ + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java index 2e720ca28a..cc2cd3b18e 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java @@ -1,287 +1,287 @@ -/** - * ConvsigmetRecord - * - * This java class performs the mapping to the database table for CONVSIGMET - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 07/2009 87/114 L. Lin Migration to TO11 - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.convsigmet; - -import java.util.Calendar; -import java.util.HashSet; -import java.util.Set; -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; - -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -import javax.persistence.CascadeType; -import javax.persistence.Column; - -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; - -import org.hibernate.annotations.Index; - -import com.raytheon.uf.common.dataplugin.annotations.DataURI; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -@Entity -@Table(name = "convsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) -@DynamicSerialize - - -public class ConvSigmetRecord extends PluginDataObject{ - - /** - * - */ - private static final long serialVersionUID = 1L; - - // reportType is "convective sigmet". - @Column(length=32) - @DataURI(position=1) - @DynamicSerializeElement - private String reportType; - - // WMO header - @Column(length=32) - @DataURI(position=2) - @DynamicSerializeElement - private String wmoHeader; - - // forecastRegion as: SIGW, SIGC, or SIGE - @Column(length=8) - @DataURI(position=3) - @DynamicSerializeElement - private String forecastRegion; - - // The issue office where the report from - @Column(length=32) - @DynamicSerializeElement - private String issueOffice; - - // Issue time of the report - @Column - @DynamicSerializeElement - private Calendar issueTime; - - // The designator - @Column(length=8) - @DynamicSerializeElement - private String designatorBBB; - - // CorrectionFlag is a flag indicating a cancellation (0 or 1) - @Column - @DynamicSerializeElement - private Integer correctionFlag; - - // The entire report - @Column(length=15000) - @DynamicSerializeElement - private String bullMessage; - - - /** - * Convsigmet section - */ - @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "parentID", nullable = false) - @Index(name = "convSigmetSection_parentid_idex") - private Set convSigmetSection = new HashSet(); - - - /** - * Default Convstructor - */ - public ConvSigmetRecord() { - this.issueOffice=""; - this.wmoHeader=""; - this.bullMessage=""; - this.designatorBBB=""; - this.forecastRegion=""; - this.reportType=""; - this.correctionFlag=IDecoderConstantsN.INTEGER_MISSING; - } - - /** - * Convstructs a consigmet record from a dataURI - * - * @param uri The dataURI - */ - public ConvSigmetRecord(String uri) { - super(uri); - } - - - @Override - public IDecoderGettable getDecoderGettable() { - // TODO Auto-generated method stub - return null; - } - - /** - * @return the issueOffice - */ - public String getIssueOffice(){ - return issueOffice; - } - - /** - * @param issueOffice to set - */ - public void setIssueOffice(String issueOffice){ - this.issueOffice=issueOffice; - } - - /** - * @return the wmoHeader - */ - public String getWmoHeader(){ - return wmoHeader; - } - - /** - * @param wnoHeader to set - */ - public void setWmoHeader(String wmoHeader){ - this.wmoHeader=wmoHeader; - } - - /** - * @return the issueTime - */ - public Calendar getIssueTime(){ - return issueTime; - } - - /** - * @param issueTime to set - */ - public void setIssueTime(Calendar issueTime){ - this.issueTime=issueTime; - } - - /** - * @return the reportType - */ - public String getReportType() { - return reportType; - } - - /** - * @param reportType to set - */ - public void setReportType(String reportType) { - this.reportType = reportType; - } - - /** - * @return the designatorBBB - */ - public String getDesignatorBBB() { - return designatorBBB; - } - - /** - * @param designatorBBB to set - */ - public void setDesignatorBBB(String designatorBBB) { - this.designatorBBB = designatorBBB; - } - - /** - * @return the correctionFlag - */ - public Integer getCorrectionFlag() { - return correctionFlag; - } - - /** - * @param correctionFlag to set - */ - public void setCorrectionFlag(Integer correctionFlag) { - this.correctionFlag = correctionFlag; - } - - /** - * @return the forecastRegion - */ - public String getForecastRegion() { - return forecastRegion; - } - - /** - * @param forecastRegion to set - */ - public void setForecastRegion(String forecastRegion) { - this.forecastRegion = forecastRegion; - } - - /** - * @return the bullMessage - */ - public String getBullMessage() { - return bullMessage; - } - - /** - * @param bullMessage to set - */ - public void setBullMessage(String bullMessage) { - this.bullMessage = bullMessage; - } - - - /** - * @return the set of convective Sigmet section - */ - public Set getConvSigmetSection() { - return convSigmetSection; - } - - /** - * @param convsigmet the section to set - */ - public void setConvSigmetSection(Set convSection) { - this.convSigmetSection = convSection; - } - - /** - * @param add convective Sigmet Section to set - */ - public void addConvSigmetSection(ConvSigmetSection psection){ - convSigmetSection.add(psection); - - } - - /** - * Override existing set method to modify any - * classes that use the dataURI as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) - { - - this.identifier = dataURI; - - } - -} +/** + * ConvsigmetRecord + * + * This java class performs the mapping to the database table for CONVSIGMET + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2009 87/114 L. Lin Initial coding + * 07/2009 87/114 L. Lin Migration to TO11 + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.convsigmet; + +import java.util.Calendar; +import java.util.HashSet; +import java.util.Set; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.IDecoderGettable; + +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +import javax.persistence.CascadeType; +import javax.persistence.Column; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.Index; + +import com.raytheon.uf.common.dataplugin.annotations.DataURI; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +@Entity +@Table(name = "convsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@DynamicSerialize + + +public class ConvSigmetRecord extends PluginDataObject{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + // reportType is "convective sigmet". + @Column(length=32) + @DataURI(position=1) + @DynamicSerializeElement + private String reportType; + + // WMO header + @Column(length=32) + @DataURI(position=2) + @DynamicSerializeElement + private String wmoHeader; + + // forecastRegion as: SIGW, SIGC, or SIGE + @Column(length=8) + @DataURI(position=3) + @DynamicSerializeElement + private String forecastRegion; + + // The issue office where the report from + @Column(length=32) + @DynamicSerializeElement + private String issueOffice; + + // Issue time of the report + @Column + @DynamicSerializeElement + private Calendar issueTime; + + // The designator + @Column(length=8) + @DynamicSerializeElement + private String designatorBBB; + + // CorrectionFlag is a flag indicating a cancellation (0 or 1) + @Column + @DynamicSerializeElement + private Integer correctionFlag; + + // The entire report + @Column(length=15000) + @DynamicSerializeElement + private String bullMessage; + + + /** + * Convsigmet section + */ + @DynamicSerializeElement + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "parentID", nullable = false) + @Index(name = "convSigmetSection_parentid_idex") + private Set convSigmetSection = new HashSet(); + + + /** + * Default Convstructor + */ + public ConvSigmetRecord() { + this.issueOffice=""; + this.wmoHeader=""; + this.bullMessage=""; + this.designatorBBB=""; + this.forecastRegion=""; + this.reportType=""; + this.correctionFlag=IDecoderConstantsN.INTEGER_MISSING; + } + + /** + * Convstructs a consigmet record from a dataURI + * + * @param uri The dataURI + */ + public ConvSigmetRecord(String uri) { + super(uri); + } + + + @Override + public IDecoderGettable getDecoderGettable() { + // TODO Auto-generated method stub + return null; + } + + /** + * @return the issueOffice + */ + public String getIssueOffice(){ + return issueOffice; + } + + /** + * @param issueOffice to set + */ + public void setIssueOffice(String issueOffice){ + this.issueOffice=issueOffice; + } + + /** + * @return the wmoHeader + */ + public String getWmoHeader(){ + return wmoHeader; + } + + /** + * @param wnoHeader to set + */ + public void setWmoHeader(String wmoHeader){ + this.wmoHeader=wmoHeader; + } + + /** + * @return the issueTime + */ + public Calendar getIssueTime(){ + return issueTime; + } + + /** + * @param issueTime to set + */ + public void setIssueTime(Calendar issueTime){ + this.issueTime=issueTime; + } + + /** + * @return the reportType + */ + public String getReportType() { + return reportType; + } + + /** + * @param reportType to set + */ + public void setReportType(String reportType) { + this.reportType = reportType; + } + + /** + * @return the designatorBBB + */ + public String getDesignatorBBB() { + return designatorBBB; + } + + /** + * @param designatorBBB to set + */ + public void setDesignatorBBB(String designatorBBB) { + this.designatorBBB = designatorBBB; + } + + /** + * @return the correctionFlag + */ + public Integer getCorrectionFlag() { + return correctionFlag; + } + + /** + * @param correctionFlag to set + */ + public void setCorrectionFlag(Integer correctionFlag) { + this.correctionFlag = correctionFlag; + } + + /** + * @return the forecastRegion + */ + public String getForecastRegion() { + return forecastRegion; + } + + /** + * @param forecastRegion to set + */ + public void setForecastRegion(String forecastRegion) { + this.forecastRegion = forecastRegion; + } + + /** + * @return the bullMessage + */ + public String getBullMessage() { + return bullMessage; + } + + /** + * @param bullMessage to set + */ + public void setBullMessage(String bullMessage) { + this.bullMessage = bullMessage; + } + + + /** + * @return the set of convective Sigmet section + */ + public Set getConvSigmetSection() { + return convSigmetSection; + } + + /** + * @param convsigmet the section to set + */ + public void setConvSigmetSection(Set convSection) { + this.convSigmetSection = convSection; + } + + /** + * @param add convective Sigmet Section to set + */ + public void addConvSigmetSection(ConvSigmetSection psection){ + convSigmetSection.add(psection); + + } + + /** + * Override existing set method to modify any + * classes that use the dataURI as a foreign key + */ + @Override + public void setIdentifier(Object dataURI) + { + + this.identifier = dataURI; + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetSection.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetSection.java index 0a508f87f2..ad56e04667 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetSection.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetSection.java @@ -1,343 +1,343 @@ -/** - * ConvsigmetSection - * - * This java class defines the getters and setters for the - * convective sigmet section table. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 07/2009 87/114 L. Lin Migration to TO11 - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.convsigmet; - -import java.io.Serializable; - -import java.util.Calendar; -import java.util.HashSet; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import org.hibernate.annotations.Index; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -@Entity -@Table(name="convsigmet_section") -@DynamicSerialize -public class ConvSigmetSection implements Serializable, ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue - private Integer recordId = null; - - - // Class type such as: LINE, AREA, ISOL, CS, and OUTLOOK - @Column(length=8) - @DynamicSerializeElement - private String classType; - - // Sequence ID of a convective sigmet report - @Column(length=16) - @DynamicSerializeElement - private String sequenceID; - - // Start time of the report - @Column - @DynamicSerializeElement - private Calendar startTime; - - // End time of the report - @Column - @DynamicSerializeElement - private Calendar endTime; - - /* - * Intensity is DMSHG (weakening), DSIPTG (ending) - * INTSFYG (strengthening), DVLPG (beginning/growing) - */ - @Column(length=32) - @DynamicSerializeElement - private String intensity; - - // To where flight level from tops - @Column - @DynamicSerializeElement - private int flightLevel; - - // TOPS TO or TOPS ABV for flight level - @Column(length=16) - @DynamicSerializeElement - private String cloudTop; - - // Direction of weather report heads to - @Column - @DynamicSerializeElement - private int direction; - - // wind speed in knots - @Column - @DynamicSerializeElement - private int speed; - - // Distance is the Distance or Area diameter of the area or line - @Column - @DynamicSerializeElement - private int distance; - - // The information of a complete section - @Column(length=720) - @DynamicSerializeElement - private String segment; - - - /** - * Convsigmet location - */ - @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "parentID", nullable = false) - @Index(name = "convSigmetLocation_parentid_idex") - private Set convSigmetLocation = new HashSet(); - - - /** - * No-Arg Convstructor - */ - public ConvSigmetSection() { - this.intensity = null; - this.cloudTop=null; - this.segment=null; - this.classType=null; - this.sequenceID=null; - - this.direction=IDecoderConstantsN.INTEGER_MISSING; - this.speed=IDecoderConstantsN.INTEGER_MISSING; - this.distance=IDecoderConstantsN.INTEGER_MISSING; - this.flightLevel=IDecoderConstantsN.INTEGER_MISSING; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - /** - * @return the sequenceID - */ - public String getSequenceID() { - return sequenceID; - - } - - /** - * @return the sequenceID - */ - public void setSequenceID(String sequenceID) { - this.sequenceID = sequenceID; - } - - /** - * @return the intensity - */ - public String getIntensity() { - return intensity; - } - - /** - * @param intensity to set - */ - public void setIntensity(String intensity) { - this.intensity = intensity; - } - - /** - * @return the direction - */ - public int getDirection() { - return direction; - } - - /** - * @param direction to set - */ - public void setDirection(int direction) { - this.direction = direction; - } - - /** - * @return the speed - */ - public int getSpeed() { - return speed; - } - - /** - * @param speed to set - */ - public void setSpeed(int speed) { - this.speed = speed; - } - - /** - * @return the distance - */ - public int getDistance() { - return distance; - } - - /** - * @param distance to set - */ - public void setDistance(int distance) { - this.distance = distance; - } - - /** - * @return the set of convective sigmet location - */ - public Set getConvSigmetLocation() { - return convSigmetLocation; - } - - /** - * @param convsigmet the location to set - */ - public void setConvSigmetLocation(Set convLocation) { - this.convSigmetLocation = convLocation; - } - - /** - * @param add conv Sigmet location to set - */ - public void addConvSigmetLocation(ConvSigmetLocation plocation){ - convSigmetLocation.add(plocation); - } - - - - /** - * @return the classType - */ - public String getClassType() { - return classType; - } - - /** - * @param classType to set - */ - public void setClassType(String classType) { - this.classType = classType; - } - - /** - * @return the section - */ - public String getSegment() { - return segment; - } - - /** - * @param segment to set - */ - public void setSegment(String segment) { - this.segment = segment; - } - - /** - * @return the startTime - */ - public Calendar getStartTime() { - return startTime; - } - - /** - * @param startTime to set - */ - public void setStartTime(Calendar startTime) { - this.startTime = startTime; - } - - /** - * @return the endTime - */ - public Calendar getEndTime() { - return endTime; - } - - /** - * @param endTIme to set - */ - public void setEndTime(Calendar endTime) { - this.endTime = endTime; - } - - /** - * @return the cloudTop - */ - public String getCloudTop() { - return cloudTop; - } - - /** - * @param cloudTop to set - */ - public void setCloudTop(String cloudTop) { - this.cloudTop = cloudTop; - } - - /** - * @return the flightLevel - */ - public int getFlightLevel() { - return flightLevel; - } - - /** - * @param flightLevel to set - */ - public void setFlightLevel(int flightLevel) { - this.flightLevel = flightLevel; - } - - /** - * Get the record id. - * - * @return The recordId. If not set returns null. - */ - public Integer getRecordId() { - return recordId; - } - - /** - * Set the record id. - * @param record - */ - public void setRecordId(Integer recordId) { - this.recordId = recordId; - } - -} +/** + * ConvsigmetSection + * + * This java class defines the getters and setters for the + * convective sigmet section table. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2009 87/114 L. Lin Initial coding + * 07/2009 87/114 L. Lin Migration to TO11 + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.convsigmet; + +import java.io.Serializable; + +import java.util.Calendar; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import org.hibernate.annotations.Index; +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +@Entity +@Table(name="convsigmet_section") +@DynamicSerialize +public class ConvSigmetSection implements Serializable, ISerializableObject { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Integer recordId = null; + + + // Class type such as: LINE, AREA, ISOL, CS, and OUTLOOK + @Column(length=8) + @DynamicSerializeElement + private String classType; + + // Sequence ID of a convective sigmet report + @Column(length=16) + @DynamicSerializeElement + private String sequenceID; + + // Start time of the report + @Column + @DynamicSerializeElement + private Calendar startTime; + + // End time of the report + @Column + @DynamicSerializeElement + private Calendar endTime; + + /* + * Intensity is DMSHG (weakening), DSIPTG (ending) + * INTSFYG (strengthening), DVLPG (beginning/growing) + */ + @Column(length=32) + @DynamicSerializeElement + private String intensity; + + // To where flight level from tops + @Column + @DynamicSerializeElement + private int flightLevel; + + // TOPS TO or TOPS ABV for flight level + @Column(length=16) + @DynamicSerializeElement + private String cloudTop; + + // Direction of weather report heads to + @Column + @DynamicSerializeElement + private int direction; + + // wind speed in knots + @Column + @DynamicSerializeElement + private int speed; + + // Distance is the Distance or Area diameter of the area or line + @Column + @DynamicSerializeElement + private int distance; + + // The information of a complete section + @Column(length=720) + @DynamicSerializeElement + private String segment; + + + /** + * Convsigmet location + */ + @DynamicSerializeElement + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "parentID", nullable = false) + @Index(name = "convSigmetLocation_parentid_idex") + private Set convSigmetLocation = new HashSet(); + + + /** + * No-Arg Convstructor + */ + public ConvSigmetSection() { + this.intensity = null; + this.cloudTop=null; + this.segment=null; + this.classType=null; + this.sequenceID=null; + + this.direction=IDecoderConstantsN.INTEGER_MISSING; + this.speed=IDecoderConstantsN.INTEGER_MISSING; + this.distance=IDecoderConstantsN.INTEGER_MISSING; + this.flightLevel=IDecoderConstantsN.INTEGER_MISSING; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + /** + * @return the sequenceID + */ + public String getSequenceID() { + return sequenceID; + + } + + /** + * @return the sequenceID + */ + public void setSequenceID(String sequenceID) { + this.sequenceID = sequenceID; + } + + /** + * @return the intensity + */ + public String getIntensity() { + return intensity; + } + + /** + * @param intensity to set + */ + public void setIntensity(String intensity) { + this.intensity = intensity; + } + + /** + * @return the direction + */ + public int getDirection() { + return direction; + } + + /** + * @param direction to set + */ + public void setDirection(int direction) { + this.direction = direction; + } + + /** + * @return the speed + */ + public int getSpeed() { + return speed; + } + + /** + * @param speed to set + */ + public void setSpeed(int speed) { + this.speed = speed; + } + + /** + * @return the distance + */ + public int getDistance() { + return distance; + } + + /** + * @param distance to set + */ + public void setDistance(int distance) { + this.distance = distance; + } + + /** + * @return the set of convective sigmet location + */ + public Set getConvSigmetLocation() { + return convSigmetLocation; + } + + /** + * @param convsigmet the location to set + */ + public void setConvSigmetLocation(Set convLocation) { + this.convSigmetLocation = convLocation; + } + + /** + * @param add conv Sigmet location to set + */ + public void addConvSigmetLocation(ConvSigmetLocation plocation){ + convSigmetLocation.add(plocation); + } + + + + /** + * @return the classType + */ + public String getClassType() { + return classType; + } + + /** + * @param classType to set + */ + public void setClassType(String classType) { + this.classType = classType; + } + + /** + * @return the section + */ + public String getSegment() { + return segment; + } + + /** + * @param segment to set + */ + public void setSegment(String segment) { + this.segment = segment; + } + + /** + * @return the startTime + */ + public Calendar getStartTime() { + return startTime; + } + + /** + * @param startTime to set + */ + public void setStartTime(Calendar startTime) { + this.startTime = startTime; + } + + /** + * @return the endTime + */ + public Calendar getEndTime() { + return endTime; + } + + /** + * @param endTIme to set + */ + public void setEndTime(Calendar endTime) { + this.endTime = endTime; + } + + /** + * @return the cloudTop + */ + public String getCloudTop() { + return cloudTop; + } + + /** + * @param cloudTop to set + */ + public void setCloudTop(String cloudTop) { + this.cloudTop = cloudTop; + } + + /** + * @return the flightLevel + */ + public int getFlightLevel() { + return flightLevel; + } + + /** + * @param flightLevel to set + */ + public void setFlightLevel(int flightLevel) { + this.flightLevel = flightLevel; + } + + /** + * Get the record id. + * + * @return The recordId. If not set returns null. + */ + public Integer getRecordId() { + return recordId; + } + + /** + * Set the record id. + * @param record + */ + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/package-info.java old mode 100644 new mode 100755 index a50a714f00..f6e6ae41a7 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains table record for decoder plug-ins -*/ -package gov.noaa.nws.ncep.common.dataplugin.convsigmet; +/** +* Contains table record for decoder plug-ins +*/ +package gov.noaa.nws.ncep.common.dataplugin.convsigmet; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/gov.noaa.nws.ncep.common.dataplugin.ffg.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/gov.noaa.nws.ncep.common.dataplugin.ffg.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/package-info.java index 87ecb1c61d..bed1d1531f 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains table record for decoder plug-ins -*/ -package gov.noaa.nws.ncep.common.dataplugin.ffg; +/** +* Contains table record for decoder plug-ins +*/ +package gov.noaa.nws.ncep.common.dataplugin.ffg; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/gov.noaa.nws.ncep.common.dataplugin.idft.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/gov.noaa.nws.ncep.common.dataplugin.idft.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/IdftRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/IdftRecord.java index dcfde1adc4..de56b96958 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/IdftRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/IdftRecord.java @@ -56,6 +56,7 @@ public class IdftRecord extends PluginDataObject{ /** Report type */ @Column(length=32) @XmlElement + @DataURI(position = 4) @DynamicSerializeElement private String reportType; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/dao/IdftDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/dao/IdftDao.java index 1f3ca5dd41..bb6d27b6f3 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/dao/IdftDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.idft/src/gov/noaa/nws/ncep/common/dataplugin/idft/dao/IdftDao.java @@ -12,64 +12,64 @@ * * @author fjyen * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.idft.dao; - -import java.util.List; - -import gov.noaa.nws.ncep.common.dataplugin.idft.IdftRecord; + **/ +package gov.noaa.nws.ncep.common.dataplugin.idft.dao; + +import java.util.List; + +import gov.noaa.nws.ncep.common.dataplugin.idft.IdftRecord; import gov.noaa.nws.ncep.edex.common.dao.NcepDefaultPluginDao; -import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.edex.database.DataAccessLayerException; - -public class IdftDao extends NcepDefaultPluginDao { - - - /** - * Creates a new ReccoDao - * @throws PluginException - */ - public IdftDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a idft report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public IdftRecord queryByDataURI(String dataURI) { - IdftRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (IdftRecord) obs.get(0); - } - return report; - } - - /** - * Queries for to determine if a given data uri exists on the IDFT table. - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.idft where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; - } -} + +public class IdftDao extends NcepDefaultPluginDao { + + + /** + * Creates a new ReccoDao + * @throws PluginException + */ + public IdftDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a idft report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public IdftRecord queryByDataURI(String dataURI) { + IdftRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (IdftRecord) obs.get(0); + } + return report; + } + + /** + * Queries for to determine if a given data uri exists on the IDFT table. + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.idft where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/component-deploy.xml old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/gov.noaa.nws.ncep.common.dataplugin.intlsigmet.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/gov.noaa.nws.ncep.common.dataplugin.intlsigmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetLocation.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetLocation.java index 8d41fb86ee..4e26497645 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetLocation.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetLocation.java @@ -1,179 +1,179 @@ -/** - * IntlsigmetLocation - * - * This java class defines the getters and setters for the - * international sigmet location table. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 05/2009 113 L. Lin Initial creation - * 07/2009 113 L. Lin Migration to TO11 - * 09/2009 113 L. Lin modify lat/lon float to latitude/longitude double - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.intlsigmet; - -import java.io.Serializable; - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -@Entity -@Table(name="intlsigmet_location") -@DynamicSerialize -public class IntlSigmetLocation implements Serializable, ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue - private Integer recordId = null; - - - // Collection of locations - @Column(length=480) - @DynamicSerializeElement - private String locationLine; - - // Each location of an international sigmet forecast area - @Column(length=48) - @DynamicSerializeElement - private String locationName; - - // Each latitude of an international sigmet forecast area - @Column - @DynamicSerializeElement - private double latitude; - - // Each longitude of an international sigmet forecast area - @Column - @DynamicSerializeElement - private double longitude; - - // Index for the order of a complete location set - @Column - @DynamicSerializeElement - private Integer index; - - /** - * No-Arg Convstructor. - */ - public IntlSigmetLocation() { - this.locationLine=null; - this.locationName=null; - this.latitude=IDecoderConstantsN.FLOAT_MISSING; - this.longitude=IDecoderConstantsN.FLOAT_MISSING; - this.index=IDecoderConstantsN.INTEGER_MISSING; - } - - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - - /** - * @return the index - */ - public Integer getIndex() { - return index; - } - - /** - * @param index to set - */ - public void setIndex(Integer index) { - this.index = index; - } - - /** - * @return the locationLine - */ - public String getLocationLine() { - return locationLine; - } - - /** - * @param locationLine to set - */ - public void setLocationLine(String locationLine) { - this.locationLine = locationLine; - } - - /** - * @return the location - */ - public String getLocationName() { - return locationName; - } - - /** - * @param location to set - */ - public void setLocationName(String location) { - this.locationName = location; - } - - /** - * Get the record id. - * - * @return The recordId. If not set returns null. - */ - public Integer getRecordId() { - return recordId; - } - - /** - * Set the record id. - * @param record - */ - public void setRecordId(Integer recordId) { - this.recordId = recordId; - } - - /** - * @return the latitude - */ - public double getLatitude() { - return latitude; - } - - /** - * @param latitude to set - */ - public void setLatitude(double latitude) { - this.latitude = latitude; - } - - /** - * @return the longitude - */ - public double getLongitude() { - return longitude; - } - - /** - * @param longitude to set - */ - public void setLongitude(double longitude) { - this.longitude = longitude; - } - -} +/** + * IntlsigmetLocation + * + * This java class defines the getters and setters for the + * international sigmet location table. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 05/2009 113 L. Lin Initial creation + * 07/2009 113 L. Lin Migration to TO11 + * 09/2009 113 L. Lin modify lat/lon float to latitude/longitude double + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.intlsigmet; + +import java.io.Serializable; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +@Entity +@Table(name="intlsigmet_location") +@DynamicSerialize +public class IntlSigmetLocation implements Serializable, ISerializableObject { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Integer recordId = null; + + + // Collection of locations + @Column(length=480) + @DynamicSerializeElement + private String locationLine; + + // Each location of an international sigmet forecast area + @Column(length=48) + @DynamicSerializeElement + private String locationName; + + // Each latitude of an international sigmet forecast area + @Column + @DynamicSerializeElement + private double latitude; + + // Each longitude of an international sigmet forecast area + @Column + @DynamicSerializeElement + private double longitude; + + // Index for the order of a complete location set + @Column + @DynamicSerializeElement + private Integer index; + + /** + * No-Arg Convstructor. + */ + public IntlSigmetLocation() { + this.locationLine=null; + this.locationName=null; + this.latitude=IDecoderConstantsN.FLOAT_MISSING; + this.longitude=IDecoderConstantsN.FLOAT_MISSING; + this.index=IDecoderConstantsN.INTEGER_MISSING; + } + + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + + /** + * @return the index + */ + public Integer getIndex() { + return index; + } + + /** + * @param index to set + */ + public void setIndex(Integer index) { + this.index = index; + } + + /** + * @return the locationLine + */ + public String getLocationLine() { + return locationLine; + } + + /** + * @param locationLine to set + */ + public void setLocationLine(String locationLine) { + this.locationLine = locationLine; + } + + /** + * @return the location + */ + public String getLocationName() { + return locationName; + } + + /** + * @param location to set + */ + public void setLocationName(String location) { + this.locationName = location; + } + + /** + * Get the record id. + * + * @return The recordId. If not set returns null. + */ + public Integer getRecordId() { + return recordId; + } + + /** + * Set the record id. + * @param record + */ + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + + /** + * @return the latitude + */ + public double getLatitude() { + return latitude; + } + + /** + * @param latitude to set + */ + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + /** + * @return the longitude + */ + public double getLongitude() { + return longitude; + } + + /** + * @param longitude to set + */ + public void setLongitude(double longitude) { + this.longitude = longitude; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java index 96ce811903..ef56c04545 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java @@ -1,558 +1,558 @@ -/** - * IntlsigmetRecord - * - * This java class performs the mapping to the database table for ITNLSIGMET - * - * HISTORY - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 113 L. Lin Initial coding - * 07/2009 113 L. Lin Migration to TO11 - * 05/2010 113 L. Lin Migration to TO11DR11 - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.intlsigmet; - -import java.util.Calendar; -import java.util.HashSet; -import java.util.Set; -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -import javax.persistence.CascadeType; -import javax.persistence.Column; - -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; - -import org.hibernate.annotations.Index; -import com.raytheon.uf.common.dataplugin.annotations.DataURI; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -@Entity -@Table(name = "intlsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) -@DynamicSerialize - - -public class IntlSigmetRecord extends PluginDataObject{ - - /** - * - */ - private static final long serialVersionUID = 1L; - - // reportType is "international sigmet". - @Column(length=32) - @DataURI(position=1) - @DynamicSerializeElement - private String reportType; - - // hazardType is weather phenomena. - @Column(length=48) - @DataURI(position=2) - @DynamicSerializeElement - private String hazardType; - - // WMO header - @Column(length=32) - @DynamicSerializeElement - private String wmoHeader; - - // The issue office where the report from - @Column(length=32) - @DynamicSerializeElement - private String issueOffice; - - // Issue time of the report - @Column - @DynamicSerializeElement - private Calendar issueTime; - - // Start time of the report - @Column - @DynamicSerializeElement - private Calendar startTime; - - // End time of the report - @Column - @DynamicSerializeElement - private Calendar endTime; - - // The message ID - @Column(length=16) - @DataURI(position=3) - @DynamicSerializeElement - private String messageID; - - // The sequence number - @Column(length=8) - @DataURI(position=4) - @DynamicSerializeElement - private String sequenceNumber; - - // The air traffic services unit - @Column(length=16) - @DynamicSerializeElement - private String atsu; - - // The location indicator of the meteorological watch office originator - @Column(length=16) - @DynamicSerializeElement - private String omwo; - - // Flight level 1 - @Column - @DynamicSerializeElement - private Integer flightlevel1; - - // Flight level 2 - @Column - @DynamicSerializeElement - private Integer flightlevel2; - - // Distance - @Column - @DynamicSerializeElement - private Integer distance; - - // Direction - @Column(length=16) - @DynamicSerializeElement - private String direction; - - // Speed - @Column - @DynamicSerializeElement - private Integer speed; - - /* - * the name of the storm, where applicable, or location of the - * volcano, where applicable, or the word, OTHER, for reports - * not from CONUS, Hawaii, Guam, Japan, UK, Tahiti, and Cuba - - */ - @Column(length=48) - @DynamicSerializeElement - private String nameLocation; - - /* - * remarks such as: correction, remarks, ...etc. - */ - @Column(length=32) - @DynamicSerializeElement - private String remarks; - - // The changes in intensity; using as "INTSF", "WKN", or "NC". - @Column(length=16) - @DynamicSerializeElement - private String intensity; - - // The polygon indicator as "WI", "WTN", "EITHER SIDE", or "E OF". - @Column(length=16) - @DynamicSerializeElement - private String polygonExtent; - - // The entire report - @Column(length=5000) - @DynamicSerializeElement - private String bullMessage; - - - /** - * Intlsigmet location - */ - @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "parentID", nullable = false) - @Index(name = "intlSigmetLocation_parentid_idex") - private Set intlSigmetLocation = new HashSet(); - - - /** - * Default Convstructor - */ - public IntlSigmetRecord() { - this.issueOffice=null; - this.wmoHeader=null; - this.bullMessage=null; - this.hazardType=null; - this.messageID=null; - this.reportType="INTLSIGMET"; - this.sequenceNumber=null; - this.atsu=null; - this.omwo=null; - this.nameLocation=null; - this.intensity=null; - this.remarks=null; - this.flightlevel1=IDecoderConstantsN.INTEGER_MISSING; - this.flightlevel2=IDecoderConstantsN.INTEGER_MISSING; - this.direction=null; - this.distance=IDecoderConstantsN.INTEGER_MISSING; - this.speed=IDecoderConstantsN.INTEGER_MISSING; - this.polygonExtent=null; - } - - /** - * Convstructs a consigmet record from a dataURI - * - * @param uri The dataURI - */ - public IntlSigmetRecord(String uri) { - super(uri); - } - - - @Override - public IDecoderGettable getDecoderGettable() { - // TODO Auto-generated method stub - return null; - } - - /** - * @return the issueOffice - */ - public String getIssueOffice(){ - return issueOffice; - } - - /** - * @param issueOffice to set - */ - public void setIssueOffice(String issueOffice){ - this.issueOffice=issueOffice; - } - - /** - * @return the wmoHeader - */ - public String getWmoHeader(){ - return wmoHeader; - } - - /** - * @param wnoHeader to set - */ - public void setWmoHeader(String wmoHeader){ - this.wmoHeader=wmoHeader; - } - - /** - * @return the issueTime - */ - public Calendar getIssueTime(){ - return issueTime; - } - - /** - * @param issueTime to set - */ - public void setIssueTime(Calendar issueTime){ - this.issueTime=issueTime; - } - - /** - * @return the reportType - */ - public String getReportType() { - return reportType; - } - - /** - * @param reportType to set - */ - public void setReportType(String reportType) { - this.reportType = reportType; - } - - /** - * @return the bullMessage - */ - public String getBullMessage() { - return bullMessage; - } - - /** - * @param bullMessage to set - */ - public void setBullMessage(String bullMessage) { - this.bullMessage = bullMessage; - } - - /** - * @return the set of hazard - */ - public String getHazardType() { - return hazardType; - } - - /** - * @param hazardType to set - */ - public void setHazardType(String hazardType) { - this.hazardType = hazardType; - } - - /** - * @return the startTime - */ - public Calendar getStartTime() { - return startTime; - } - - /** - * @param startTime to set - */ - public void setStartTime(Calendar startTime) { - this.startTime = startTime; - } - - /** - * @return the endTime - */ - public Calendar getEndTime() { - return endTime; - } - - /** - * @param endTime to set - */ - public void setEndTime(Calendar endTime) { - this.endTime = endTime; - } - - public String getMessageID() { - return messageID; - } - - /** - * @param messageID to set - */ - public void setMessageID(String messageID) { - this.messageID = messageID; - } - - /** - * @return the sequenceNumber - */ - public String getSequenceNumber() { - return sequenceNumber; - } - - /** - * @param sequenceNumber to set - */ - public void setSequenceNumber(String sequenceNumber) { - this.sequenceNumber = sequenceNumber; - } - - /** - * @return the atsu - */ - public String getAtsu() { - return atsu; - } - - /** - * @param atsu to set - */ - public void setAtsu(String atsu) { - this.atsu = atsu; - } - - /** - * @return the omwo - */ - public String getOmwo() { - return omwo; - } - - /** - * @param omwo to set - */ - public void setOmwo(String omwo) { - this.omwo = omwo; - } - - /** - * @return the flightLevel1 - */ - public Integer getFlightlevel1() { - return flightlevel1; - } - - /** - * @param flightLevel1 to set - */ - public void setFlightlevel1(Integer flightlevel1) { - this.flightlevel1 = flightlevel1; - } - - /** - * @return flightLevel2 - */ - public Integer getFlightlevel2() { - return flightlevel2; - } - - /** - * @param flightLevel2 to set - */ - public void setFlightlevel2(Integer flightlevel2) { - this.flightlevel2 = flightlevel2; - } - - /** - * @return distacne - */ - public Integer getDistance() { - return distance; - } - - /** - * @param distance to set - */ - public void setDistance(Integer distance) { - this.distance = distance; - } - - /** - * @return direction - */ - public String getDirection() { - return direction; - } - - /** - * @param direction to set - */ - public void setDirection(String direction) { - this.direction = direction; - } - - /** - * @return the speed - */ - public Integer getSpeed() { - return speed; - } - - /** - * @param speed to set - */ - public void setSpeed(Integer speed) { - this.speed = speed; - } - - /** - * @return the nameLocation - */ - public String getNameLocation() { - return nameLocation; - } - - /** - * @param nameLocation to set - */ - public void setNameLocation(String nameLocation) { - this.nameLocation = nameLocation; - } - - /** - * @return the remarks - */ - public String getRemarks() { - return remarks; - } - - /** - * @param remarks to set - */ - public void setRemarks(String remarks) { - this.remarks = remarks; - } - - /** - * @return the intensity - */ - public String getIntensity() { - return intensity; - } - - /** - * @param intensity to set - */ - public void setIntensity(String intensity) { - this.intensity = intensity; - } - - /** - * @return the polygonExtent - */ - public String getPolygonExtent() { - return polygonExtent; - } - - /** - * @param polygonExtent to set - */ - public void setPolygonExtent(String polygonExtent) { - this.polygonExtent = polygonExtent; - } - - /** - * @return the intlSigmetLocation - */ - public Set getIntlSigmetLocation() { - return intlSigmetLocation; - } - - /** - * @param intlSigmetLocation to set - */ - public void setIntlSigmetLocation(Set intlSigmetLocation) { - this.intlSigmetLocation = intlSigmetLocation; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - /** - * @param add international sigmet Location to set - */ - public void addIntlSigmetLocation(IntlSigmetLocation psection){ - intlSigmetLocation.add(psection); - - } - - /** - * Override existing set method to modify any - * classes that use the dataURI as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) - { - - this.identifier = dataURI; - - - - } - -} +/** + * IntlsigmetRecord + * + * This java class performs the mapping to the database table for ITNLSIGMET + * + * HISTORY + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 113 L. Lin Initial coding + * 07/2009 113 L. Lin Migration to TO11 + * 05/2010 113 L. Lin Migration to TO11DR11 + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.intlsigmet; + +import java.util.Calendar; +import java.util.HashSet; +import java.util.Set; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.IDecoderGettable; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +import javax.persistence.CascadeType; +import javax.persistence.Column; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.Index; +import com.raytheon.uf.common.dataplugin.annotations.DataURI; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +@Entity +@Table(name = "intlsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@DynamicSerialize + + +public class IntlSigmetRecord extends PluginDataObject{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + // reportType is "international sigmet". + @Column(length=32) + @DataURI(position=1) + @DynamicSerializeElement + private String reportType; + + // hazardType is weather phenomena. + @Column(length=48) + @DataURI(position=2) + @DynamicSerializeElement + private String hazardType; + + // WMO header + @Column(length=32) + @DynamicSerializeElement + private String wmoHeader; + + // The issue office where the report from + @Column(length=32) + @DynamicSerializeElement + private String issueOffice; + + // Issue time of the report + @Column + @DynamicSerializeElement + private Calendar issueTime; + + // Start time of the report + @Column + @DynamicSerializeElement + private Calendar startTime; + + // End time of the report + @Column + @DynamicSerializeElement + private Calendar endTime; + + // The message ID + @Column(length=16) + @DataURI(position=3) + @DynamicSerializeElement + private String messageID; + + // The sequence number + @Column(length=8) + @DataURI(position=4) + @DynamicSerializeElement + private String sequenceNumber; + + // The air traffic services unit + @Column(length=16) + @DynamicSerializeElement + private String atsu; + + // The location indicator of the meteorological watch office originator + @Column(length=16) + @DynamicSerializeElement + private String omwo; + + // Flight level 1 + @Column + @DynamicSerializeElement + private Integer flightlevel1; + + // Flight level 2 + @Column + @DynamicSerializeElement + private Integer flightlevel2; + + // Distance + @Column + @DynamicSerializeElement + private Integer distance; + + // Direction + @Column(length=16) + @DynamicSerializeElement + private String direction; + + // Speed + @Column + @DynamicSerializeElement + private Integer speed; + + /* + * the name of the storm, where applicable, or location of the + * volcano, where applicable, or the word, OTHER, for reports + * not from CONUS, Hawaii, Guam, Japan, UK, Tahiti, and Cuba + + */ + @Column(length=48) + @DynamicSerializeElement + private String nameLocation; + + /* + * remarks such as: correction, remarks, ...etc. + */ + @Column(length=32) + @DynamicSerializeElement + private String remarks; + + // The changes in intensity; using as "INTSF", "WKN", or "NC". + @Column(length=16) + @DynamicSerializeElement + private String intensity; + + // The polygon indicator as "WI", "WTN", "EITHER SIDE", or "E OF". + @Column(length=16) + @DynamicSerializeElement + private String polygonExtent; + + // The entire report + @Column(length=5000) + @DynamicSerializeElement + private String bullMessage; + + + /** + * Intlsigmet location + */ + @DynamicSerializeElement + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "parentID", nullable = false) + @Index(name = "intlSigmetLocation_parentid_idex") + private Set intlSigmetLocation = new HashSet(); + + + /** + * Default Convstructor + */ + public IntlSigmetRecord() { + this.issueOffice=null; + this.wmoHeader=null; + this.bullMessage=null; + this.hazardType=null; + this.messageID=null; + this.reportType="INTLSIGMET"; + this.sequenceNumber=null; + this.atsu=null; + this.omwo=null; + this.nameLocation=null; + this.intensity=null; + this.remarks=null; + this.flightlevel1=IDecoderConstantsN.INTEGER_MISSING; + this.flightlevel2=IDecoderConstantsN.INTEGER_MISSING; + this.direction=null; + this.distance=IDecoderConstantsN.INTEGER_MISSING; + this.speed=IDecoderConstantsN.INTEGER_MISSING; + this.polygonExtent=null; + } + + /** + * Convstructs a consigmet record from a dataURI + * + * @param uri The dataURI + */ + public IntlSigmetRecord(String uri) { + super(uri); + } + + + @Override + public IDecoderGettable getDecoderGettable() { + // TODO Auto-generated method stub + return null; + } + + /** + * @return the issueOffice + */ + public String getIssueOffice(){ + return issueOffice; + } + + /** + * @param issueOffice to set + */ + public void setIssueOffice(String issueOffice){ + this.issueOffice=issueOffice; + } + + /** + * @return the wmoHeader + */ + public String getWmoHeader(){ + return wmoHeader; + } + + /** + * @param wnoHeader to set + */ + public void setWmoHeader(String wmoHeader){ + this.wmoHeader=wmoHeader; + } + + /** + * @return the issueTime + */ + public Calendar getIssueTime(){ + return issueTime; + } + + /** + * @param issueTime to set + */ + public void setIssueTime(Calendar issueTime){ + this.issueTime=issueTime; + } + + /** + * @return the reportType + */ + public String getReportType() { + return reportType; + } + + /** + * @param reportType to set + */ + public void setReportType(String reportType) { + this.reportType = reportType; + } + + /** + * @return the bullMessage + */ + public String getBullMessage() { + return bullMessage; + } + + /** + * @param bullMessage to set + */ + public void setBullMessage(String bullMessage) { + this.bullMessage = bullMessage; + } + + /** + * @return the set of hazard + */ + public String getHazardType() { + return hazardType; + } + + /** + * @param hazardType to set + */ + public void setHazardType(String hazardType) { + this.hazardType = hazardType; + } + + /** + * @return the startTime + */ + public Calendar getStartTime() { + return startTime; + } + + /** + * @param startTime to set + */ + public void setStartTime(Calendar startTime) { + this.startTime = startTime; + } + + /** + * @return the endTime + */ + public Calendar getEndTime() { + return endTime; + } + + /** + * @param endTime to set + */ + public void setEndTime(Calendar endTime) { + this.endTime = endTime; + } + + public String getMessageID() { + return messageID; + } + + /** + * @param messageID to set + */ + public void setMessageID(String messageID) { + this.messageID = messageID; + } + + /** + * @return the sequenceNumber + */ + public String getSequenceNumber() { + return sequenceNumber; + } + + /** + * @param sequenceNumber to set + */ + public void setSequenceNumber(String sequenceNumber) { + this.sequenceNumber = sequenceNumber; + } + + /** + * @return the atsu + */ + public String getAtsu() { + return atsu; + } + + /** + * @param atsu to set + */ + public void setAtsu(String atsu) { + this.atsu = atsu; + } + + /** + * @return the omwo + */ + public String getOmwo() { + return omwo; + } + + /** + * @param omwo to set + */ + public void setOmwo(String omwo) { + this.omwo = omwo; + } + + /** + * @return the flightLevel1 + */ + public Integer getFlightlevel1() { + return flightlevel1; + } + + /** + * @param flightLevel1 to set + */ + public void setFlightlevel1(Integer flightlevel1) { + this.flightlevel1 = flightlevel1; + } + + /** + * @return flightLevel2 + */ + public Integer getFlightlevel2() { + return flightlevel2; + } + + /** + * @param flightLevel2 to set + */ + public void setFlightlevel2(Integer flightlevel2) { + this.flightlevel2 = flightlevel2; + } + + /** + * @return distacne + */ + public Integer getDistance() { + return distance; + } + + /** + * @param distance to set + */ + public void setDistance(Integer distance) { + this.distance = distance; + } + + /** + * @return direction + */ + public String getDirection() { + return direction; + } + + /** + * @param direction to set + */ + public void setDirection(String direction) { + this.direction = direction; + } + + /** + * @return the speed + */ + public Integer getSpeed() { + return speed; + } + + /** + * @param speed to set + */ + public void setSpeed(Integer speed) { + this.speed = speed; + } + + /** + * @return the nameLocation + */ + public String getNameLocation() { + return nameLocation; + } + + /** + * @param nameLocation to set + */ + public void setNameLocation(String nameLocation) { + this.nameLocation = nameLocation; + } + + /** + * @return the remarks + */ + public String getRemarks() { + return remarks; + } + + /** + * @param remarks to set + */ + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + /** + * @return the intensity + */ + public String getIntensity() { + return intensity; + } + + /** + * @param intensity to set + */ + public void setIntensity(String intensity) { + this.intensity = intensity; + } + + /** + * @return the polygonExtent + */ + public String getPolygonExtent() { + return polygonExtent; + } + + /** + * @param polygonExtent to set + */ + public void setPolygonExtent(String polygonExtent) { + this.polygonExtent = polygonExtent; + } + + /** + * @return the intlSigmetLocation + */ + public Set getIntlSigmetLocation() { + return intlSigmetLocation; + } + + /** + * @param intlSigmetLocation to set + */ + public void setIntlSigmetLocation(Set intlSigmetLocation) { + this.intlSigmetLocation = intlSigmetLocation; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + /** + * @param add international sigmet Location to set + */ + public void addIntlSigmetLocation(IntlSigmetLocation psection){ + intlSigmetLocation.add(psection); + + } + + /** + * Override existing set method to modify any + * classes that use the dataURI as a foreign key + */ + @Override + public void setIdentifier(Object dataURI) + { + + this.identifier = dataURI; + + + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/package-info.java old mode 100644 new mode 100755 index 2062041916..109d80eeaf --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains table record for decoder plug-ins -*/ -package gov.noaa.nws.ncep.common.dataplugin.intlsigmet; +/** +* Contains table record for decoder plug-ins +*/ +package gov.noaa.nws.ncep.common.dataplugin.intlsigmet; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/gov.noaa.nws.ncep.common.dataplugin.mcidas.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/gov.noaa.nws.ncep.common.dataplugin.mcidas.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/imageType.sql b/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/imageType.sql index 436a7b02e4..f1c0c39376 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/imageType.sql +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/imageType.sql @@ -134,4 +134,8 @@ INSERT INTO awips.mcidas_image_type VALUES (172, 'IR2', '2', '184'); INSERT INTO awips.mcidas_image_type VALUES (173, 'WV', '4', '184'); INSERT INTO awips.mcidas_image_type VALUES (174, 'IR', '8', '184'); INSERT INTO awips.mcidas_image_type VALUES (175, 'IR3', '128', '184'); -INSERT INTO awips.mcidas_image_type VALUES (176, 'IR4', '16', '184'); \ No newline at end of file +INSERT INTO awips.mcidas_image_type VALUES (176, 'IR4', '16', '184'); +INSERT INTO awips.mcidas_image_type VALUES (177, 'CAPE', '8', '185'); +INSERT INTO awips.mcidas_image_type VALUES (178, 'CINH', '16', '185'); +INSERT INTO awips.mcidas_image_type VALUES (179, 'LI', '32', '185'); +INSERT INTO awips.mcidas_image_type VALUES (180, 'TPW', '64', '185'); diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/satelliteName.sql b/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/satelliteName.sql index d58f95273c..d2d41a203c 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/satelliteName.sql +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.mcidas/res/scripts/satelliteName.sql @@ -27,3 +27,4 @@ INSERT INTO awips.mcidas_satellite_names VALUES (84,'MTS'); INSERT INTO awips.mcidas_satellite_names VALUES (85,'MTSAT2'); INSERT INTO awips.mcidas_satellite_names VALUES (180,'GOES13'); INSERT INTO awips.mcidas_satellite_names VALUES (184,'GOES15'); +INSERT INTO awips.mcidas_satellite_names VALUES (185,'DPD'); diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncairep/gov.noaa.nws.ncep.common.dataplugin.ncairep.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncairep/gov.noaa.nws.ncep.common.dataplugin.ncairep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncccfp/gov.noaa.nws.ncep.common.dataplugin.ncccfp.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncccfp/gov.noaa.nws.ncep.common.dataplugin.ncccfp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncccfp/src/gov/noaa/nws/ncep/common/dataplugin/ncccfp/dao/NcccfpDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncccfp/src/gov/noaa/nws/ncep/common/dataplugin/ncccfp/dao/NcccfpDao.java index d8f8117a29..d222125aea 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncccfp/src/gov/noaa/nws/ncep/common/dataplugin/ncccfp/dao/NcccfpDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncccfp/src/gov/noaa/nws/ncep/common/dataplugin/ncccfp/dao/NcccfpDao.java @@ -12,64 +12,64 @@ * * @author fjyen * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.ncccfp.dao; - -import java.util.List; - -import gov.noaa.nws.ncep.common.dataplugin.ncccfp.NcccfpRecord; + **/ +package gov.noaa.nws.ncep.common.dataplugin.ncccfp.dao; + +import java.util.List; + +import gov.noaa.nws.ncep.common.dataplugin.ncccfp.NcccfpRecord; import gov.noaa.nws.ncep.edex.common.dao.NcepDefaultPluginDao; -import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.edex.database.DataAccessLayerException; - -public class NcccfpDao extends NcepDefaultPluginDao { - - - /** - * Creates a new ReccoDao - * @throws PluginException - */ - public NcccfpDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a NCCCFP report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public NcccfpRecord queryByDataURI(String dataURI) { - NcccfpRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (NcccfpRecord) obs.get(0); - } - return report; - } - - /** - * Queries for to determine if a given data uri exists on the NCCCFP table. - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.ncccfp where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; - } -} + +public class NcccfpDao extends NcepDefaultPluginDao { + + + /** + * Creates a new ReccoDao + * @throws PluginException + */ + public NcccfpDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a NCCCFP report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public NcccfpRecord queryByDataURI(String dataURI) { + NcccfpRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (NcccfpRecord) obs.get(0); + } + return report; + } + + /** + * Queries for to determine if a given data uri exists on the NCCCFP table. + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.ncccfp where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/gov.noaa.nws.ncep.common.dataplugin.ncgrib.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/gov.noaa.nws.ncep.common.dataplugin.ncgrib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcGenProcess.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcGenProcess.java index b42e2bd75b..d84ed37d7e 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcGenProcess.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcGenProcess.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribModel.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribModel.java index fb6e6c0699..c984ae54bc 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribModel.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribModel.java @@ -63,7 +63,8 @@ import gov.noaa.nws.ncep.common.dataplugin.ncgrib.util.NcgridModel; * 1/31/11 M. Li Add eventName for dynamic model name * 9/08/11 X. Guo Check file size to create hash code * 11/17/11 X. Guo Fixed hash generator problem - * + * 3/2012 T. Lee Added grib file template + * * * * @author bphillip @@ -109,9 +110,13 @@ public class NcgribModel extends PersistableDataObject { @XmlAttribute @DynamicSerializeElement private int genprocess; + + @Column + @XmlAttribute + @DynamicSerializeElement + private String template; /** The backgenprocess number (currently gfs is 0) - * ??? */ @Column @XmlAttribute @@ -173,7 +178,7 @@ public class NcgribModel extends PersistableDataObject { @XmlAttribute @DynamicSerializeElement @DataURI(position = 4) - private Integer perturbationNumber; + private String perturbationNumber; /** The number of forecasts in the ensemble */ @Column @@ -235,6 +240,7 @@ public class NcgribModel extends PersistableDataObject { this.backGenprocess = copy.backGenprocess; this.centerid = copy.centerid; this.genprocess = copy.genprocess; + this.template = copy.template; this.gridid = copy.gridid; this.gridNumber = copy.gridNumber; this.id = copy.id; @@ -270,6 +276,8 @@ public class NcgribModel extends PersistableDataObject { .append("\n"); buffer.append(" Generating Process: ").append(genprocess).append( "\n"); + buffer.append(" Grib File Template: ").append(template).append( + "\n"); buffer.append(" Parameter Name: ").append(parameterName).append( "\n"); buffer.append("Parameter Abbreviation: ").append(parameterAbbreviation) @@ -484,6 +492,25 @@ public class NcgribModel extends PersistableDataObject { return genprocess; } + /** + * Sets the file template + * + * @param fileTemplate + * The fileTemplate + */ + public void setTemplate(String template) { + this.template = template; + } + + /** + * Gets the file template + * + * @return The fileTemplate + */ + public String getTemplate() { + return template; + } + /** * Sets the genproces * @@ -493,7 +520,7 @@ public class NcgribModel extends PersistableDataObject { public void setGenprocess(int genprocess) { this.genprocess = genprocess; } - + /** * Gets the parameter name * @@ -721,7 +748,7 @@ public class NcgribModel extends PersistableDataObject { * * @return The perturbation number */ - public Integer getPerturbationNumber() { + public String getPerturbationNumber() { return perturbationNumber; } @@ -731,7 +758,7 @@ public class NcgribModel extends PersistableDataObject { * @param perturbationNumber * The perturbation number */ - public void setPerturbationNumber(Integer perturbationNumber) { + public void setPerturbationNumber(String perturbationNumber) { this.perturbationNumber = perturbationNumber; } diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribPathProvider.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribPathProvider.java index 7a4ad26489..8eb35afdc1 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribPathProvider.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribPathProvider.java @@ -36,9 +36,10 @@ import com.raytheon.uf.common.dataplugin.persist.IPersistable; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 4/24/09 1994 bphillip Initial Creation - * 1/12/12 xguo Create new HDF5 file name - * yyyy-MM-dd-HH-fhrs-ensNumber.h5 + * 4/24/09 1994 bphillip Initial Creation + * 1/12/12 xguo Create new HDF5 file name + * yyyy-MM-dd-HH-fhrs-ensNumber.h5 + * 3/2012 T. Lee changed pN to String * * * @@ -109,13 +110,13 @@ public class NcgribPathProvider extends DefaultPathProvider { synchronized (gribHdf5FileNameFormat) { refTimeString = gribHdf5FileNameFormat.format(refTime); } - int pbNum = 0; + String pbNum = "0"; if ( pdo.getModelInfo().getPerturbationNumber() != null){ pbNum = pdo.getModelInfo().getPerturbationNumber(); } sb.append(refTimeString); sb.append(String.format("-%d", fhrs)); - sb.append(String.format("-%d", pbNum)); + sb.append(String.format("-%s", pbNum)); sb.append(".h5"); return sb.toString(); } diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribRecord.java index e6db6595d3..0aa4effef9 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/NcgribRecord.java @@ -61,6 +61,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * ------------ ---------- ----------- -------------------------- * 4/7/09 1994 bphillip Initial Creation * 10/13/10 276 llin Modified for NC GRIB. + * 03/07/12 606 ghull Added eventName to URI for NcInventory updating. * * * @@ -202,6 +203,7 @@ public class NcgribRecord extends PersistablePluginDataObject implements @Column @XmlAttribute @DynamicSerializeElement + @DataURI(position = 8) private String eventName; /** Type of Generating Process diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/GetNcCoverageRequest.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/GetNcCoverageRequest.java index c92c758c2b..5fd344c78d 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/GetNcCoverageRequest.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/GetNcCoverageRequest.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/NcgridDataRequestMessage.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/NcgridDataRequestMessage.java index 98d187dc85..795ffe74ac 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/NcgridDataRequestMessage.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/request/NcgridDataRequestMessage.java @@ -36,6 +36,7 @@ import com.raytheon.uf.common.time.DataTime; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jul 12, 2010 brockwoo Initial creation + * 3/2012 T. Lee Changed perturbation number to String * * * @@ -69,7 +70,7 @@ public class NcgridDataRequestMessage implements IServerRequest { private String parameterAbbreviation; @DynamicSerializeElement - private int pert = -999; + private String pert = ""; @DynamicSerializeElement private int version = -999; @@ -130,11 +131,11 @@ public class NcgridDataRequestMessage implements IServerRequest { this.parameterAbbreviation = parameterAbbreviation; } - public int getPert() { + public String getPert() { return pert; } - public void setPert(int pert) { + public void setPert(String pert) { this.pert = pert; } diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/LatLonNcgridCoverage.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/LatLonNcgridCoverage.java index e5d95b31c3..81ed51e95f 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/LatLonNcgridCoverage.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/LatLonNcgridCoverage.java @@ -20,6 +20,9 @@ package gov.noaa.nws.ncep.common.dataplugin.ncgrib.spatial.projections; +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.subgrid.SubNcgrid; + import javax.measure.converter.UnitConverter; import javax.measure.unit.SI; import javax.measure.unit.Unit; @@ -39,9 +42,6 @@ import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.opengis.referencing.operation.MathTransform; -import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; -import gov.noaa.nws.ncep.common.dataplugin.ncgrib.subgrid.SubNcgrid; - import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -74,7 +74,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority; @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class LatLonNcgridCoverage extends NcgridCoverage { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(LatLonNcgridCoverage.class); + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(LatLonNcgridCoverage.class); private static final long serialVersionUID = 8371251040172233074L; @@ -155,14 +156,13 @@ public class LatLonNcgridCoverage extends NcgridCoverage { @Override public void initialize() throws GribException { - double maxLon; + double maxLon; double minLat = MapUtil.correctLat(la1); double maxLat = MapUtil.correctLat(la2); double minLon = MapUtil.correctLon(lo1); - if ( lo2 >= 360.0) { - maxLon = lo2; - } - else { + if (lo2 >= 360.0) { + maxLon = lo2; + } else { maxLon = MapUtil.correctLon(lo2); } if (maxLon < minLon) { @@ -177,7 +177,10 @@ public class LatLonNcgridCoverage extends NcgridCoverage { } crsWKT = crs.toWKT(); try { - geometry = MapUtil.createGeometry(minLat, minLon, maxLat, maxLon); + double xOffset = dx * 0.5; + double yOffset = dy * 0.5; + geometry = MapUtil.createGeometry(minLat + yOffset, minLon + - xOffset, maxLat - yOffset, maxLon + xOffset); } catch (Exception e) { throw new GribException("Error creating geometry", e); } @@ -187,13 +190,13 @@ public class LatLonNcgridCoverage extends NcgridCoverage { @Override public void generateName() { - String nameModel_gridid = "" + (int)(la1*10.) + (int) ((lo1 + la2+lo2)*100.); - String nameAndDescription = "Unknown LatLon " + nx + " X " + ny + " " - + nameModel_gridid + " " - + getProjectionType() + " grid"; - //System.out.println(" nameModel_gridid=" + nameModel_gridid); + String nameModel_gridid = "" + (int) (la1 * 10.) + + (int) ((lo1 + la2 + lo2) * 100.); + String nameAndDescription = "Unknown LatLon " + nx + " X " + ny + " " + + nameModel_gridid + " " + getProjectionType() + " grid"; + // System.out.println(" nameModel_gridid=" + nameModel_gridid); this.setName(nameModel_gridid); - //this.setName(nameAndDescription); + // this.setName(nameAndDescription); this.setDescription(nameAndDescription); } @@ -283,8 +286,8 @@ public class LatLonNcgridCoverage extends NcgridCoverage { } rval.setId(rval.hashCode()); } else { - statusHandler.handle( - Priority.PROBLEM, + statusHandler + .handle(Priority.PROBLEM, "Error creating sub grid definition [" + subGrid.getModelName() + "], units are not compatible with meter [" diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/MercatorNcgridCoverage.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/MercatorNcgridCoverage.java index a0ee015c5a..3bf9a09379 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/MercatorNcgridCoverage.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/spatial/projections/MercatorNcgridCoverage.java @@ -20,6 +20,9 @@ package gov.noaa.nws.ncep.common.dataplugin.ncgrib.spatial.projections; +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.subgrid.SubNcgrid; + import javax.measure.converter.UnitConverter; import javax.measure.unit.SI; import javax.measure.unit.Unit; @@ -36,9 +39,6 @@ import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.opengis.referencing.operation.MathTransform; -import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; -import gov.noaa.nws.ncep.common.dataplugin.ncgrib.subgrid.SubNcgrid; - import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -70,7 +70,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority; @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class MercatorNcgridCoverage extends NcgridCoverage { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(MercatorNcgridCoverage.class); + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(MercatorNcgridCoverage.class); private static final long serialVersionUID = 3140441023975157052L; @@ -179,7 +180,18 @@ public class MercatorNcgridCoverage extends NcgridCoverage { crs = MapUtil.constructMercator(majorAxis, minorAxis, latin, meridian); crsWKT = crs.toWKT(); try { - geometry = MapUtil.createGeometry(la1, lo1, la2, lo2); + // geometry = MapUtil.createGeometry(la1, lo1, la2, lo2); + Unit spacingUnitObj = Unit.valueOf(spacingUnit); + if (spacingUnitObj.isCompatible(SI.METRE)) { + UnitConverter converter = spacingUnitObj + .getConverterTo(SI.METRE); + geometry = MapUtil.createGeometry(crs, la1, lo1, + converter.convert(dx), converter.convert(dy), nx, ny); + } else { + throw new GribException("Unable to convert " + spacingUnit + + " to meters while creating geometry!"); + } + } catch (Exception e) { throw new GribException("Error creating geometry", e); } @@ -192,9 +204,10 @@ public class MercatorNcgridCoverage extends NcgridCoverage { String nameAndDescription = "Unknown Mercator " + nx + " X " + ny + " " + Math.round(dx) + " " + spacingUnit + " " + getProjectionType() + " grid"; - String nameModel_gridid = "" + nx + ny + Integer.toString((int) (la1+la2+lo1+lo2)); + String nameModel_gridid = "" + nx + ny + + Integer.toString((int) (la1 + la2 + lo1 + lo2)); this.setName(nameModel_gridid); - //this.setName(nameAndDescription); + // this.setName(nameAndDescription); this.setDescription(nameAndDescription); } @@ -257,7 +270,8 @@ public class MercatorNcgridCoverage extends NcgridCoverage { } rval.setId(rval.hashCode()); } else { - statusHandler.handle(Priority.PROBLEM, + statusHandler.handle( + Priority.PROBLEM, "Error creating sub grid definition [" + subGrid.getModelName() + "], units are not compatible with meter [" diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/util/NcgridModel.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/util/NcgridModel.java index 29d5944068..0800f61aa2 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/util/NcgridModel.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncgrib/src/gov/noaa/nws/ncep/common/dataplugin/ncgrib/util/NcgridModel.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ @@ -28,6 +28,19 @@ import javax.xml.bind.annotation.XmlElementWrapper; import com.raytheon.uf.common.serialization.ISerializableObject; +/** + * NcgridModel + * + *
    + * SOFTWARE HISTORY
    + * Date         Ticket#    	Engineer    Description
    + * ------------ ---------- 	----------- --------------------------
    + * 3/12						T. Lee		Initialized template
    + * 
    + * + * @author njensen + * @version 1.0 + */ @XmlAccessorType(XmlAccessType.NONE) public class NcgridModel implements ISerializableObject { @@ -55,6 +68,9 @@ public class NcgridModel implements ISerializableObject { @XmlElement(name = "id") private ArrayList process; + @XmlElement + private String template = "NONE"; + @XmlElement private String alias; @@ -111,6 +127,14 @@ public class NcgridModel implements ISerializableObject { public void setSubCenter(String subcenter) { this.subcenter = subcenter; } + + public String getTemplate() { + return this.template; + } + + public void setTemplate(String template) { + this.template = template; + } public void setAlias(String alias) { this.alias = alias; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/gov.noaa.nws.ncep.common.dataplugin.ncpafm.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/gov.noaa.nws.ncep.common.dataplugin.ncpafm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java index e95f70a684..6132ec7ebf 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java @@ -64,6 +64,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * IPointData -- that is, presents a PointDataView * object suitable for HDF5 persistence. * 10 Oct 2011 126 G. Hull replace stnid,lat&lon with the SurfaceObsLocation. + * 03 Feb 2012 606 G. Hull added reportType to the URI for inventory updating + * * * * @author B. Hebbard, SIB @@ -83,6 +85,7 @@ public class NcPafmRecord extends PersistablePluginDataObject implements /** Report type */ @Column(length = 32) + @DataURI(position=6) @XmlElement @DynamicSerializeElement private String reportType; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/dao/NcPafmDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/dao/NcPafmDao.java index e5c753695e..bc9555cf91 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/dao/NcPafmDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/dao/NcPafmDao.java @@ -12,72 +12,72 @@ * * @author fjyen * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.ncpafm.dao; - -import java.util.List; + **/ +package gov.noaa.nws.ncep.common.dataplugin.ncpafm.dao; + +import java.util.List; import javax.xml.bind.JAXBException; - + import gov.noaa.nws.ncep.common.dataplugin.ncpafm.NcPafmRecord; import gov.noaa.nws.ncep.edex.common.dao.NcepDefaultPluginDao; -import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.pointdata.PointDataDescription; import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.pointdata.PointDataPluginDao; - -public class NcPafmDao extends PointDataPluginDao { + +public class NcPafmDao extends PointDataPluginDao { private PointDataDescription pdd; - - - /** - * Creates a new ReccoDao - * @throws PluginException - */ - public NcPafmDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a pafm report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public NcPafmRecord queryByDataURI(String dataURI) { - NcPafmRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (NcPafmRecord) obs.get(0); - } - return report; - } - - /** - * Queries for to determine if a given data uri exists on the PAFM table. - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.ncpafm where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; - } + + + /** + * Creates a new ReccoDao + * @throws PluginException + */ + public NcPafmDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a pafm report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public NcPafmRecord queryByDataURI(String dataURI) { + NcPafmRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (NcPafmRecord) obs.get(0); + } + return report; + } + + /** + * Queries for to determine if a given data uri exists on the PAFM table. + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.ncpafm where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; + } @Override public String[] getKeysRequiredForFileName() { //TODO: See if this is correct/complete @@ -115,4 +115,4 @@ public class NcPafmDao extends PointDataPluginDao { } return pdd; } -} +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpirep/gov.noaa.nws.ncep.common.dataplugin.ncpirep.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpirep/gov.noaa.nws.ncep.common.dataplugin.ncpirep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/gov.noaa.nws.ncep.common.dataplugin.ncscat.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/gov.noaa.nws.ncep.common.dataplugin.ncscat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/dao/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/dao/package-info.java index 82e6dddf92..b8855f6780 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/dao/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/dao/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains data access object for airmet data. -*/ -package gov.noaa.nws.ncep.common.dataplugin.ncscat.dao; +/** +* Contains data access object for airmet data. +*/ +package gov.noaa.nws.ncep.common.dataplugin.ncscat.dao; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscd/gov.noaa.nws.ncep.common.dataplugin.ncscd.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscd/gov.noaa.nws.ncep.common.dataplugin.ncscd.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/gov.noaa.nws.ncep.common.dataplugin.nctaf.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/gov.noaa.nws.ncep.common.dataplugin.nctaf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafSkyCover.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafSkyCover.java index 2fcf4c1a81..815f78936a 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafSkyCover.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafSkyCover.java @@ -25,9 +25,9 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * *
      * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#     Engineer    Description
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#     Engineer    Description
      * ------------ ----------  ----------- --------------------------
      * 09/09/2011   458			sgurung	    Initial Creation from Raytheon's taf plugin
      * 09/23/2011   458			sgurung	    Converted to HDF5
    @@ -65,7 +65,7 @@ public class NcTafSkyCover extends PersistableDataObject implements
         @XmlElement
         private Integer height;
     
    -    // For convective low level cloud - CB
    +    // For convective low level cloud - CB
         @DynamicSerializeElement
         @XmlElement
         private String genus;
    diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafWeatherCondition.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafWeatherCondition.java
    index 3157051249..83bac42e73 100644
    --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafWeatherCondition.java
    +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafWeatherCondition.java
    @@ -31,9 +31,9 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
      * 
      * 
      * 
    - *  SOFTWARE HISTORY
    - * 
    - *  Date        Ticket#     Engineer    Description
    + *  SOFTWARE HISTORY
    + * 
    + *  Date        Ticket#     Engineer    Description
      *  ------------    ----------  ----------- --------------------------
      * 09/09/2011   458			sgurung	    Initial Creation from Raytheon's taf plugin
      * 09/23/2011   458			sgurung	    Converted to HDF5
    @@ -289,8 +289,8 @@ public class NcTafWeatherCondition extends PersistableDataObject implements
             if (buffer == null) {
                 buffer = new StringBuilder();
             }
    -        // buffer.append(parentID);
    -        // buffer.append(":");
    +        // buffer.append(parentID);
    +        // buffer.append(":");
             buffer.append((sequenceId != null) ? sequenceId : "--");
             buffer.append(":");
             buffer.append((intensityProximity != null) ? intensityProximity : "_");
    diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/dao/NcTafDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/dao/NcTafDao.java
    index 1822c8f27b..b5ddcd2190 100644
    --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/dao/NcTafDao.java
    +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/dao/NcTafDao.java
    @@ -2,18 +2,18 @@
      * This software was modified from Raytheon's taf plugin by
      * NOAA/NWS/NCEP/NCO in order to output point data in HDF5.
      **/
    -package gov.noaa.nws.ncep.common.dataplugin.nctaf.dao;
    -
    +package gov.noaa.nws.ncep.common.dataplugin.nctaf.dao;
    +
     import java.io.InputStream;
     import java.util.ArrayList;
    -import java.util.List;
    +import java.util.List;
     
     import javax.xml.bind.JAXBException;
     
     import gov.noaa.nws.ncep.common.dataplugin.nctaf.NcTafRecord;
     
     import com.raytheon.edex.db.dao.spatial.ObStationDao;
    -import com.raytheon.uf.common.dataplugin.PluginException;
    +import com.raytheon.uf.common.dataplugin.PluginException;
     import com.raytheon.uf.common.dataplugin.persist.IPersistable;
     import com.raytheon.uf.common.dataquery.db.QueryParam;
     import com.raytheon.uf.common.datastorage.IDataStore;
    @@ -23,15 +23,15 @@ import com.raytheon.uf.edex.pointdata.PointDataDbDescription;
     import com.raytheon.uf.edex.pointdata.PointDataPluginDao;
     import com.raytheon.uf.common.pointdata.PointDataDescription;
     import com.raytheon.uf.common.pointdata.spatial.ObStation;
    -
    -/**
    - * Set of DAO methods for TAF data.
    - * 
    - * 
    - *
    - * SOFTWARE HISTORY
    - *
    - * Date         Ticket#    Engineer    Description
    +
    +/**
    + * Set of DAO methods for TAF data.
    + * 
    + * 
    + *
    + * SOFTWARE HISTORY
    + *
    + * Date         Ticket#    Engineer    Description
      * ------------ ---------- ----------- --------------------------
      * 09/09/2011   458			sgurung	   Initial Creation from Raytheon's taf plugin
      * 09/23/2011   458			sgurung	   Converted to HDF5
    @@ -40,20 +40,20 @@ import com.raytheon.uf.common.pointdata.spatial.ObStation;
      * 
      * @author sgurung
      * @version 1.0
    - */
    -
    -public class NcTafDao extends PointDataPluginDao {
    -
    + */
    +
    +public class NcTafDao extends PointDataPluginDao {
    +
     	/** The station dao */
         private ObStationDao obDao = new ObStationDao();
    -      
    -    /**
    -     * Creates a new NcTafDao
    -     * @throws PluginException 
    -     */
    -    public NcTafDao(String pluginName) throws PluginException {
    -        super(pluginName);
    -    }
    +      
    +    /**
    +     * Creates a new NcTafDao
    +     * @throws PluginException 
    +     */
    +    public NcTafDao(String pluginName) throws PluginException {
    +        super(pluginName);
    +    }
     
         @Override
         protected IDataStore populateDataStore(IDataStore dataStore,
    @@ -96,44 +96,44 @@ public class NcTafDao extends PointDataPluginDao {
                     QueryParam.QueryOperand.IN);
             return queryByCriteria(query);
         } 
    -    
    -    /**
    -     * Retrieves an nctaf report using the datauri .
    -     * 
    -     * @param dataURI
    -     *            The dataURI to match against.
    -     * @return The report record if it exists.
    -     */
    -    public NcTafRecord queryByDataURI(String dataURI) {
    -    	NcTafRecord report = null;
    -        List obs = null;
    -        try {
    -            obs = queryBySingleCriteria("dataURI", dataURI);
    -        } catch (DataAccessLayerException e) {
    -            e.printStackTrace();
    -        }
    -        if((obs != null)&&(obs.size() > 0)) {
    -            report = (NcTafRecord) obs.get(0);
    -        }
    -        return report;
    -    }
    -    
    -    /**
    -     * Queries for to determine if a given data uri exists on the nctaf table.
    -     * 
    -     * @param dataUri
    -     *            The DataURI to find.
    -     * @return An array of objects. If not null, there should only be a single
    -     * element.
    -     */
    -    public Object[] queryDataUriColumn(final String dataUri) {
    -
    -        String sql = "select datauri from awips.nctaf where datauri='"
    -                + dataUri + "';";
    -
    -        Object[] results = executeSQLQuery(sql);
    -
    -        return results;
    +    
    +    /**
    +     * Retrieves an nctaf report using the datauri .
    +     * 
    +     * @param dataURI
    +     *            The dataURI to match against.
    +     * @return The report record if it exists.
    +     */
    +    public NcTafRecord queryByDataURI(String dataURI) {
    +    	NcTafRecord report = null;
    +        List obs = null;
    +        try {
    +            obs = queryBySingleCriteria("dataURI", dataURI);
    +        } catch (DataAccessLayerException e) {
    +            e.printStackTrace();
    +        }
    +        if((obs != null)&&(obs.size() > 0)) {
    +            report = (NcTafRecord) obs.get(0);
    +        }
    +        return report;
    +    }
    +    
    +    /**
    +     * Queries for to determine if a given data uri exists on the nctaf table.
    +     * 
    +     * @param dataUri
    +     *            The DataURI to find.
    +     * @return An array of objects. If not null, there should only be a single
    +     * element.
    +     */
    +    public Object[] queryDataUriColumn(final String dataUri) {
    +
    +        String sql = "select datauri from awips.nctaf where datauri='"
    +                + dataUri + "';";
    +
    +        Object[] results = executeSQLQuery(sql);
    +
    +        return results;
         }
         
         public ObStationDao getObDao() {
    @@ -186,5 +186,5 @@ public class NcTafDao extends PointDataPluginDao {
             return dbDataDescription;
         }
         
    -
    -}
    +
    +}
    diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/component-deploy.xml
    index 4d38e9428d..22d3719f14 100644
    --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/component-deploy.xml
    +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/component-deploy.xml
    @@ -1,11 +1,11 @@
    -
    -    
    -    
    -
    -	
    -
    +
    +    
    +    
    +
    +	
    +
     
    \ No newline at end of file
    diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/gov.noaa.nws.ncep.common.dataplugin.ncuair.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/gov.noaa.nws.ncep.common.dataplugin.ncuair.ecl
    new file mode 100644
    index 0000000000..e69de29bb2
    diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairLiftedIndex.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairLiftedIndex.java
    index 20dc53a9c8..e2b6ea04ef 100644
    --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairLiftedIndex.java
    +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairLiftedIndex.java
    @@ -1,134 +1,134 @@
    -/**
    - * NcUairLiftedIndex
    - * 
    - * This java class defines the getters and setters for the Lifted Index
    - * and low-level and high-level wind shear data in TTAA of an upper air
    - * sounding.
    - *      
    - * 
    - * HISTORY
    - *
    - * Date         Ticket#         Engineer    Description
    - * ------------ ----------      ----------- --------------------------
    - * 03/2010      210				L. Lin  	Initial coding
    - * 04/2011		210				T. Lee		Removed table entity for H5
    - * 09/2011      457             S. Gurung   Renamed H5 to Nc and h5 to nc
    - * 09/2011                   	Chin Chen   support batch decoding methods for better performance and
    - * 											remove xml serialization as well
    - * 
    - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.common.dataplugin.ncuair; - -import java.io.Serializable; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; - -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -@XmlAccessorType(XmlAccessType.NONE) -@DynamicSerialize -public class NcUairLiftedIndex implements ISerializableObject { - -// private static final long serialVersionUID = 1L; - - // Observation pressure in Pascals - - /** - * - */ - private static final long serialVersionUID = 5454992542008085989L; - - @DynamicSerializeElement - private float liTemp; - - // - - @DynamicSerializeElement - private float loDrct; - - // - // Decimal(5,2) - - @DynamicSerializeElement - private float loSped; - - // - - @DynamicSerializeElement - private float hiDrct; - - // - // Decimal(5,2) - - @DynamicSerializeElement - private float hiSped; - - /** - * No-Arg Convstructor - */ - public NcUairLiftedIndex() { - liTemp = IDecoderConstantsN.UAIR_FLOAT_MISSING; - loDrct = IDecoderConstantsN.UAIR_FLOAT_MISSING; - loSped = IDecoderConstantsN.UAIR_FLOAT_MISSING; - hiDrct = IDecoderConstantsN.UAIR_FLOAT_MISSING; - loSped = IDecoderConstantsN.UAIR_FLOAT_MISSING; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - - public float getLiTemp() { - return liTemp; - } - - public void setLiTemp(float liTemp) { - this.liTemp = liTemp; - } - - public float getLoDrct() { - return loDrct; - } - - public void setLoDrct(float loDrct) { - this.loDrct = loDrct; - } - - public float getLoSped() { - return loSped; - } - - public void setLoSped(float loSped) { - this.loSped = loSped; - } - - public float getHiDrct() { - return hiDrct; - } - - public void setHiDrct(float hiDrct) { - this.hiDrct = hiDrct; - } - - public float getHiSped() { - return hiSped; - } - - public void setHiSped(float hiSped) { - this.hiSped = hiSped; - } - -} +/** + * NcUairLiftedIndex + * + * This java class defines the getters and setters for the Lifted Index + * and low-level and high-level wind shear data in TTAA of an upper air + * sounding. + * + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2010 210 L. Lin Initial coding + * 04/2011 210 T. Lee Removed table entity for H5 + * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc + * 09/2011 Chin Chen support batch decoding methods for better performance and + * remove xml serialization as well + *
    + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.common.dataplugin.ncuair; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; + +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +@XmlAccessorType(XmlAccessType.NONE) +@DynamicSerialize +public class NcUairLiftedIndex implements ISerializableObject { + +// private static final long serialVersionUID = 1L; + + // Observation pressure in Pascals + + /** + * + */ + private static final long serialVersionUID = 5454992542008085989L; + + @DynamicSerializeElement + private float liTemp; + + // + + @DynamicSerializeElement + private float loDrct; + + // + // Decimal(5,2) + + @DynamicSerializeElement + private float loSped; + + // + + @DynamicSerializeElement + private float hiDrct; + + // + // Decimal(5,2) + + @DynamicSerializeElement + private float hiSped; + + /** + * No-Arg Convstructor + */ + public NcUairLiftedIndex() { + liTemp = IDecoderConstantsN.UAIR_FLOAT_MISSING; + loDrct = IDecoderConstantsN.UAIR_FLOAT_MISSING; + loSped = IDecoderConstantsN.UAIR_FLOAT_MISSING; + hiDrct = IDecoderConstantsN.UAIR_FLOAT_MISSING; + loSped = IDecoderConstantsN.UAIR_FLOAT_MISSING; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + + public float getLiTemp() { + return liTemp; + } + + public void setLiTemp(float liTemp) { + this.liTemp = liTemp; + } + + public float getLoDrct() { + return loDrct; + } + + public void setLoDrct(float loDrct) { + this.loDrct = loDrct; + } + + public float getLoSped() { + return loSped; + } + + public void setLoSped(float loSped) { + this.loSped = loSped; + } + + public float getHiDrct() { + return hiDrct; + } + + public void setHiDrct(float hiDrct) { + this.hiDrct = hiDrct; + } + + public float getHiSped() { + return hiSped; + } + + public void setHiSped(float hiSped) { + this.hiSped = hiSped; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairMaxWind.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairMaxWind.java index b0013a7dd8..ceef304ec5 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairMaxWind.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairMaxWind.java @@ -1,175 +1,175 @@ -/** - * NcUairMaxWind - * - * This java class defines the getters and setters for the maximum wind - * data in TTAA of an upper air sounding. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2010 210 L. Lin Initial coding - * 04/2011 210 T. Lee Removed table entity for H5 - * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc - * 09/2011 Chin Chen support batch decoding methods for better performance and - * remove xml serialization as well - *
    - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.common.dataplugin.ncuair; - -import java.io.Serializable; - -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAccessType; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; -@XmlAccessorType(XmlAccessType.NONE) -@DynamicSerialize -public class NcUairMaxWind implements ISerializableObject { - -/** - * - */ - private static final long serialVersionUID = 3322911349013884198L; - - // Observation pressure in Pascals - - @DynamicSerializeElement - private float pres; - - // Observation wind direction in angular degrees. - - @DynamicSerializeElement - private float drct; - - // Observation wind speed in meters per second. - // Decimal(5,2) - - @DynamicSerializeElement - private float sped; - - // Observation wind shear low - - @DynamicSerializeElement - private float loShear; - - // Observation wind shear hegith - // Decimal(5,2) - - @DynamicSerializeElement - private float hiShear; - - /** - * No-Arg Constructor - */ - public NcUairMaxWind() { - sped = IDecoderConstantsN.UAIR_FLOAT_MISSING; - drct = IDecoderConstantsN.UAIR_FLOAT_MISSING; - pres = IDecoderConstantsN.UAIR_FLOAT_MISSING; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - /** - * Get the record id. - * - * @return The recordId. If not set returns null. - * - public Integer getRecordId() { - return recordId; - } -*/ - /** - * Set the record id. - * @param record - * - public void setRecordId(Integer recordId) { - this.recordId = recordId; - } -*/ - /** - * Get the level pres in Pascals. - * - * @return the pres - */ - public float getPres() { - return pres; - } - - /** - * Set the level pressure in Pascals. - * - * @param pres - * the pres to set - */ - public void setPres(float pres) { - this.pres = pres; - } - - /** - * Get the level wind direction in angular degrees. - * - * @return the drct - */ - public float getDrct() { - return drct; - } - - /** - * Set the level wind direction in angular degrees. - * - * @param drct - * the drct to set - */ - public void setDrct(float drct) { - this.drct = drct; - } - - /** - * Get the level wind speed in meters per second. - * - * @return the sped - */ - public float getSped() { - return sped; - } - - /** - * Set the level wind speed in meters per second. - * - * @param sped - * the sped to set - */ - public void setSped(float sped) { - this.sped = sped; - } - - public float getLoShear() { - return loShear; - } - - public void setLoShear(float loShear) { - this.loShear = loShear; - } - - public float getHiShear() { - return hiShear; - } - - public void setHiShear(float hiShear) { - this.hiShear = hiShear; - } - -} +/** + * NcUairMaxWind + * + * This java class defines the getters and setters for the maximum wind + * data in TTAA of an upper air sounding. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2010 210 L. Lin Initial coding + * 04/2011 210 T. Lee Removed table entity for H5 + * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc + * 09/2011 Chin Chen support batch decoding methods for better performance and + * remove xml serialization as well + *
    + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.common.dataplugin.ncuair; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAccessType; +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; +@XmlAccessorType(XmlAccessType.NONE) +@DynamicSerialize +public class NcUairMaxWind implements ISerializableObject { + +/** + * + */ + private static final long serialVersionUID = 3322911349013884198L; + + // Observation pressure in Pascals + + @DynamicSerializeElement + private float pres; + + // Observation wind direction in angular degrees. + + @DynamicSerializeElement + private float drct; + + // Observation wind speed in meters per second. + // Decimal(5,2) + + @DynamicSerializeElement + private float sped; + + // Observation wind shear low + + @DynamicSerializeElement + private float loShear; + + // Observation wind shear hegith + // Decimal(5,2) + + @DynamicSerializeElement + private float hiShear; + + /** + * No-Arg Constructor + */ + public NcUairMaxWind() { + sped = IDecoderConstantsN.UAIR_FLOAT_MISSING; + drct = IDecoderConstantsN.UAIR_FLOAT_MISSING; + pres = IDecoderConstantsN.UAIR_FLOAT_MISSING; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + /** + * Get the record id. + * + * @return The recordId. If not set returns null. + * + public Integer getRecordId() { + return recordId; + } +*/ + /** + * Set the record id. + * @param record + * + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } +*/ + /** + * Get the level pres in Pascals. + * + * @return the pres + */ + public float getPres() { + return pres; + } + + /** + * Set the level pressure in Pascals. + * + * @param pres + * the pres to set + */ + public void setPres(float pres) { + this.pres = pres; + } + + /** + * Get the level wind direction in angular degrees. + * + * @return the drct + */ + public float getDrct() { + return drct; + } + + /** + * Set the level wind direction in angular degrees. + * + * @param drct + * the drct to set + */ + public void setDrct(float drct) { + this.drct = drct; + } + + /** + * Get the level wind speed in meters per second. + * + * @return the sped + */ + public float getSped() { + return sped; + } + + /** + * Set the level wind speed in meters per second. + * + * @param sped + * the sped to set + */ + public void setSped(float sped) { + this.sped = sped; + } + + public float getLoShear() { + return loShear; + } + + public void setLoShear(float loShear) { + this.loShear = loShear; + } + + public float getHiShear() { + return hiShear; + } + + public void setHiShear(float hiShear) { + this.hiShear = hiShear; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairObsLevels.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairObsLevels.java index cb8488a652..0cb7955e93 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairObsLevels.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairObsLevels.java @@ -1,211 +1,211 @@ -/** - * NcUairObsLevels - * - * This java class defines the getters and setters for the upper air - * parameters in TTAA of an upper air sounding. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2010 210 L. Lin Initial coding - * 04/2011 210 T. Lee Removed table entity for H5 - * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc - * 09/2011 Chin Chen support batch decoding methods for better performance and - * remove xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.common.dataplugin.ncuair; - - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -@XmlAccessorType(XmlAccessType.NONE) -@DynamicSerialize -public class NcUairObsLevels implements ISerializableObject { - - /** - * - */ - private static final long serialVersionUID = 100852718286926645L; - - // Observation pressure in Pascals - @DynamicSerializeElement - private float pres; - - // Observation geopotential height in meters. - - @DynamicSerializeElement - private float hght; - - // Observation dry air temperature in degrees Kelvin. - - @DynamicSerializeElement - private float temp; - - // Observation dewpoint temperature in degrees Kelvin. - - @DynamicSerializeElement - private float dwpt; - - // Observation wind direction in angular degrees. - - @DynamicSerializeElement - private float drct; - - // Observation wind speed in meters per second. - // Decimal(5,2) - - @DynamicSerializeElement - private float Sped; - - /** - * No-Arg Constructor - */ - public NcUairObsLevels() { - Sped = IDecoderConstantsN.UAIR_FLOAT_MISSING; - drct = IDecoderConstantsN.UAIR_FLOAT_MISSING; - dwpt = IDecoderConstantsN.UAIR_FLOAT_MISSING; - temp = IDecoderConstantsN.UAIR_FLOAT_MISSING; - hght = IDecoderConstantsN.UAIR_FLOAT_MISSING; - pres = IDecoderConstantsN.UAIR_FLOAT_MISSING; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - - /** - * Get the level pressure in Pascals. - * - * @return the pres - */ - public float getPres() { - return pres; - } - - /** - * Set the level pressure in Pascals. - * - * @param pres - * the pres to set - */ - public void setPres(float pres) { - this.pres = pres; - } - - /** - * Get the level geopotential height in meters. - * - * @return the hght - */ - public float getHght() { - return hght; - } - - /** - * Set the level geopotential height in meters. - * - * @param hght - * the hght to set - */ - public void setHght(float hght) { - this.hght = hght; - } - - /** - * Get the level dry air temperature in degrees Kelvin. - * - * @return the temp - */ - public float getTemp() { - return temp; - } - - /** - * Set the level dry air temperature in degrees Kelvin. - * - * @param temp - * the temp to set - */ - public void setTemp(float temp) { - this.temp = temp; - } - - /** - * Get the level dewpoint temperature in degrees Kelvin. - * - * @return the dwpt - */ - public float getDwpt() { - return dwpt; - } - - /** - * Set the level dewpoint temperature in degrees Kelvin. - * - * @param dwpt - * the dwpt to set - */ - public void setDwpt(float dwpt) { - this.dwpt = dwpt; - } - - /** - * Get the level wind direction in angular degrees. - * - * @return the drct - */ - public float getDrct() { - return drct; - } - - /** - * Set the level wind direction in angular degrees. - * - * @param drct - * the drct to set - */ - public void setDrct(float drct) { - this.drct = drct; - } - - /** - * Get the level wind speed in meters per second. - * - * @return the Sped - */ - public float getSped() { - return Sped; - } - - /** - * Set the level wind speed in meters per second. - * - * @param Sped - * the Sped to set - */ - public void setSped(float Sped) { - this.Sped = Sped; - } - -} +/** + * NcUairObsLevels + * + * This java class defines the getters and setters for the upper air + * parameters in TTAA of an upper air sounding. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2010 210 L. Lin Initial coding + * 04/2011 210 T. Lee Removed table entity for H5 + * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc + * 09/2011 Chin Chen support batch decoding methods for better performance and + * remove xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.common.dataplugin.ncuair; + + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +@XmlAccessorType(XmlAccessType.NONE) +@DynamicSerialize +public class NcUairObsLevels implements ISerializableObject { + + /** + * + */ + private static final long serialVersionUID = 100852718286926645L; + + // Observation pressure in Pascals + @DynamicSerializeElement + private float pres; + + // Observation geopotential height in meters. + + @DynamicSerializeElement + private float hght; + + // Observation dry air temperature in degrees Kelvin. + + @DynamicSerializeElement + private float temp; + + // Observation dewpoint temperature in degrees Kelvin. + + @DynamicSerializeElement + private float dwpt; + + // Observation wind direction in angular degrees. + + @DynamicSerializeElement + private float drct; + + // Observation wind speed in meters per second. + // Decimal(5,2) + + @DynamicSerializeElement + private float Sped; + + /** + * No-Arg Constructor + */ + public NcUairObsLevels() { + Sped = IDecoderConstantsN.UAIR_FLOAT_MISSING; + drct = IDecoderConstantsN.UAIR_FLOAT_MISSING; + dwpt = IDecoderConstantsN.UAIR_FLOAT_MISSING; + temp = IDecoderConstantsN.UAIR_FLOAT_MISSING; + hght = IDecoderConstantsN.UAIR_FLOAT_MISSING; + pres = IDecoderConstantsN.UAIR_FLOAT_MISSING; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + + /** + * Get the level pressure in Pascals. + * + * @return the pres + */ + public float getPres() { + return pres; + } + + /** + * Set the level pressure in Pascals. + * + * @param pres + * the pres to set + */ + public void setPres(float pres) { + this.pres = pres; + } + + /** + * Get the level geopotential height in meters. + * + * @return the hght + */ + public float getHght() { + return hght; + } + + /** + * Set the level geopotential height in meters. + * + * @param hght + * the hght to set + */ + public void setHght(float hght) { + this.hght = hght; + } + + /** + * Get the level dry air temperature in degrees Kelvin. + * + * @return the temp + */ + public float getTemp() { + return temp; + } + + /** + * Set the level dry air temperature in degrees Kelvin. + * + * @param temp + * the temp to set + */ + public void setTemp(float temp) { + this.temp = temp; + } + + /** + * Get the level dewpoint temperature in degrees Kelvin. + * + * @return the dwpt + */ + public float getDwpt() { + return dwpt; + } + + /** + * Set the level dewpoint temperature in degrees Kelvin. + * + * @param dwpt + * the dwpt to set + */ + public void setDwpt(float dwpt) { + this.dwpt = dwpt; + } + + /** + * Get the level wind direction in angular degrees. + * + * @return the drct + */ + public float getDrct() { + return drct; + } + + /** + * Set the level wind direction in angular degrees. + * + * @param drct + * the drct to set + */ + public void setDrct(float drct) { + this.drct = drct; + } + + /** + * Get the level wind speed in meters per second. + * + * @return the Sped + */ + public float getSped() { + return Sped; + } + + /** + * Set the level wind speed in meters per second. + * + * @param Sped + * the Sped to set + */ + public void setSped(float Sped) { + this.Sped = Sped; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java index 0eb30bf4b4..130ab2af06 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java @@ -1,551 +1,551 @@ -/** - * NcUairRecord - * - * The java class defines the parameters in the postgres table and - * the for HDF5 dataset for the upper air data. - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2010 210 L. Lin Initial creation - * 4/2011 T. Lee Persist to HDF5 - * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc - * 09/2011 Chin Chen support batch decoding methods for better performance and - * remove xml serialization as well - * 10/2011 S. Gurung Replace slat/slon/selv with location of type SurfaceObsLocation - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.common.dataplugin.ncuair; - -import java.util.Calendar; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; - -import javax.persistence.Column; -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlElement; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable; -import com.raytheon.uf.common.dataplugin.annotations.DataURI; -import com.raytheon.uf.common.dataplugin.persist.IPersistable; -import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject; -import com.raytheon.uf.common.geospatial.ISpatialEnabled; -import com.raytheon.uf.common.pointdata.IPointData; -import com.raytheon.uf.common.pointdata.PointDataView; -import com.raytheon.uf.common.pointdata.spatial.SurfaceObsLocation; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import com.vividsolutions.jts.geom.Geometry; - -@Entity -@Table(name = "ncuair", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) -@DynamicSerialize -public class NcUairRecord extends PersistablePluginDataObject implements - ISpatialEnabled, IDecoderGettable, IPointData, IPersistable { - - private static final long serialVersionUID = 1L; - public static final String PLUGIN_NAME = "ncuair"; - - // Time of the UTC - @DataURI(position = 4) - @Column - @DynamicSerializeElement - private int UTC; - - // The observation report type. - @DataURI(position = 1) - @Column - @DynamicSerializeElement - private String reportType; - - // Issue time for the bulletin - @Column - @DynamicSerializeElement - private Calendar issueTime; - - // Observation time for the bulletin - @Column - @DynamicSerializeElement - private Calendar obsTime; - - // Synoptic time for the bulletin - // Time of the observation to the nearest hour. - @Column - @DynamicSerializeElement - private Calendar synopticTime; - - // Type of data such as TTAA/BB/CC/DD or PP... - @DataURI(position = 3) - @Column - @DynamicSerializeElement - private String dataType; - - // Correction indicator from wmo header - @DataURI(position = 5) - @Column - @DynamicSerializeElement - private String corr; - - // Text of the WMO header - @Column - @DynamicSerializeElement - private String wmoHeader; - - // Station number - // @DataURI(position = 2) - @Column - @DynamicSerializeElement - private String stnum; - - @Embedded - @DataURI(position = 2, embedded = true) - @XmlElement - @DynamicSerializeElement - private SurfaceObsLocation location; - - // Yes if report is a NIL. - @Column - @DynamicSerializeElement - private Boolean nil; - - // bulletin message - @Transient - @DynamicSerializeElement - private String bullMessage; - - /** - * Uair observation levels - */ - @DynamicSerializeElement - @Transient - private Set obsLevels = new HashSet(); - - /** - * Uair tropopause data - */ - @DynamicSerializeElement - @Transient - private Set tropopause = new HashSet(); - - /** - * Uair maxwind data - */ - @DynamicSerializeElement - @Transient - private Set maxwind = new HashSet(); - - /** - * Uair lifted index data - */ - @DynamicSerializeElement - @Transient - private Set liftedindex = new HashSet(); - - @Embedded - @DynamicSerializeElement - private PointDataView pointDataView; - - /** - * Empty constructor. - */ - public NcUairRecord() { - this.nil = false; - this.stnum = ""; - this.wmoHeader = ""; - // this.stid=""; - this.corr = ""; - this.dataType = ""; - } - - /** - * Constructor for DataURI construction through base class. This is used by - * the notification service. - * - * @param uri - * A data uri applicable to this class. - * @param tableDef - * The table definitions for this class. - */ - public NcUairRecord(String uri) { - super(uri); - if (location != null) { - String staId = location.getStationId(); - location.setStationId("null".equals(staId) ? null : staId); - } - } - - /** - * @return the wmoHeader - */ - public String getWmoHeader() { - return wmoHeader; - } - - /** - * @param wmoHeader - * the wmoHeader to set - */ - public void setWmoHeader(String wmoHeader) { - this.wmoHeader = wmoHeader; - } - - /** - * Get the report correction indicator. - * - * @return The corr - */ - public String getCorr() { - return corr; - } - - /** - * Set the report correction indicator. - * - * @param corr - * The corr. - */ - public void setCorr(String corr) { - this.corr = corr; - } - - /** - * Get the observation report type. - * - * @return the reportType - */ - public String getReportType() { - return reportType; - } - - /** - * Set the observation report type. - * - * @param reportType - * the reportType to set - */ - public void setReportType(String reportType) { - this.reportType = reportType; - } - - public String getStnum() { - return stnum; - } - - public void setStnum(String stnum) { - this.stnum = stnum; - } - - /* - * Get this observation's geometry. - * - * @return The geometry for this observation. - */ - public Geometry getGeometry() { - return location.getGeometry(); - } - - /** - * Get the geometry latitude. - * - * @return The geometry latitude. - */ - public double getLatitude() { - return location.getLatitude(); - } - - /** - * Get the geometry longitude. - * - * @return The geometry longitude. - */ - public double getLongitude() { - return location.getLongitude(); - } - - /** - * Get the station identifier for this observation. - * - * @return the stationId - */ - public String getStationId() { - return location.getStationId(); - } - - /** - * Get the elevation, in meters, of the observing platform or location. - * - * @return The observation elevation, in meters. - */ - public Integer getElevation() { - return location.getElevation(); - } - - /** - * Get whether the location for this observation is defined. - * - * @return Is this location defined. - */ - public Boolean getLocationDefined() { - return location.getLocationDefined(); - } - - public Calendar getObsTime() { - return obsTime; - } - - public void setObsTime(Calendar obsTime) { - this.obsTime = obsTime; - } - - public Calendar getSynopticTime() { - return synopticTime; - } - - public void setSynopticTime(Calendar synopticTime) { - this.synopticTime = synopticTime; - } - - public String getBullMessage() { - return bullMessage; - } - - public void setBullMessage(String bullMessage) { - this.bullMessage = bullMessage; - } - - public Calendar getIssueTime() { - return issueTime; - } - - public void setIssueTime(Calendar issueTime) { - this.issueTime = issueTime; - } - - public String getDataType() { - return dataType; - } - - public void setDataType(String dataType) { - this.dataType = dataType; - } - - public int getUTC() { - return UTC; - } - - public void setUTC(int utc) { - UTC = utc; - } - - public Boolean getNil() { - return nil; - } - - public void setNil(Boolean nil) { - this.nil = nil; - } - - @Override - public IDecoderGettable getDecoderGettable() { - // TODO Auto-generated method stub - return null; - } - - /** - * @return the set of uair observation levels - */ - public Set getObsLevels() { - return obsLevels; - } - - /** - * @param uair - * observation levels to set - */ - public void setObsLevels(Set uairLevel) { - this.obsLevels = uairLevel; - } - - /** - * @param add - * uair observation levels to set - */ - public void addObsLevels(NcUairObsLevels plevel) { - obsLevels.add(plevel); - // plevel.setParentID(this); - } - - /** - * @return the set of uair observation levels - */ - public Set getTropopause() { - return tropopause; - } - - /** - * @param uair - * observation levels to set - */ - public void setTropopause(Set trop) { - this.tropopause = trop; - } - - /** - * @param add - * uair observation levels to set - */ - public void addTropopause(NcUairTropopause trop) { - tropopause.add(trop); - // trop.setParentID(this); - } - - /** - * @return the set of uair maximum wind - */ - public Set getMaxWind() { - return maxwind; - } - - /** - * @param uair - * maximum wind to set - */ - public void setMaxWind(Set mwind) { - this.maxwind = mwind; - } - - /** - * @param add - * uair maximum wind to set - */ - public void addMaxWind(NcUairMaxWind mwind) { - maxwind.add(mwind); - // mwind.setParentID(this); - } - - /** - * @return the set of uair lifted index - */ - public Set getLiftedIndex() { - return liftedindex; - } - - /** - * @param uair - * lifted index to set - */ - public void setLiftedIndex(Set li) { - this.liftedindex = li; - } - - /** - * @param add - * uair lifted index to set - */ - public void addLiftedIndex(NcUairLiftedIndex li) { - liftedindex.add(li); - // li.setParentID(this); - } - - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - - } - - @Override - public SurfaceObsLocation getSpatialObject() { - return location; - } - - public SurfaceObsLocation getLocation() { - if (location == null) { - location = new SurfaceObsLocation(); - } - return location; - } - - public void setLocation(SurfaceObsLocation location) { - this.location = location; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.common.pointdata.IPointData#getPointDataView() - */ - @Override - public PointDataView getPointDataView() { - return this.pointDataView; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.common.pointdata.IPointData#setPointDataView(com.raytheon - * .uf.common.pointdata.PointDataView) - */ - @Override - public void setPointDataView(PointDataView pointDataView) { - this.pointDataView = pointDataView; - } - - @Override - public Integer getHdfFileId() { - return null; - } - - @Override - public Date getPersistenceTime() { - // return this.dataTime.getRefTime(); - return null; - } - - @Override - public void setPersistenceTime(Date persistTime) { - // TODO Auto-generated method stub - - } - - @Override - public Amount getValue(String paramName) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Collection getValues(String paramName) { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getString(String paramName) { - // TODO Auto-generated method stub - return null; - } - - @Override - public String[] getStrings(String paramName) { - // TODO Auto-generated method stub - return null; - } - +/** + * NcUairRecord + * + * The java class defines the parameters in the postgres table and + * the for HDF5 dataset for the upper air data. + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2010 210 L. Lin Initial creation + * 4/2011 T. Lee Persist to HDF5 + * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc + * 09/2011 Chin Chen support batch decoding methods for better performance and + * remove xml serialization as well + * 10/2011 S. Gurung Replace slat/slon/selv with location of type SurfaceObsLocation + * + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.common.dataplugin.ncuair; + +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; +import javax.xml.bind.annotation.XmlElement; + +import com.raytheon.uf.common.dataplugin.IDecoderGettable; +import com.raytheon.uf.common.dataplugin.annotations.DataURI; +import com.raytheon.uf.common.dataplugin.persist.IPersistable; +import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject; +import com.raytheon.uf.common.geospatial.ISpatialEnabled; +import com.raytheon.uf.common.pointdata.IPointData; +import com.raytheon.uf.common.pointdata.PointDataView; +import com.raytheon.uf.common.pointdata.spatial.SurfaceObsLocation; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import com.vividsolutions.jts.geom.Geometry; + +@Entity +@Table(name = "ncuair", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@DynamicSerialize +public class NcUairRecord extends PersistablePluginDataObject implements + ISpatialEnabled, IDecoderGettable, IPointData, IPersistable { + + private static final long serialVersionUID = 1L; + public static final String PLUGIN_NAME = "ncuair"; + + // Time of the UTC + @DataURI(position = 4) + @Column + @DynamicSerializeElement + private int UTC; + + // The observation report type. + @DataURI(position = 1) + @Column + @DynamicSerializeElement + private String reportType; + + // Issue time for the bulletin + @Column + @DynamicSerializeElement + private Calendar issueTime; + + // Observation time for the bulletin + @Column + @DynamicSerializeElement + private Calendar obsTime; + + // Synoptic time for the bulletin + // Time of the observation to the nearest hour. + @Column + @DynamicSerializeElement + private Calendar synopticTime; + + // Type of data such as TTAA/BB/CC/DD or PP... + @DataURI(position = 3) + @Column + @DynamicSerializeElement + private String dataType; + + // Correction indicator from wmo header + @DataURI(position = 5) + @Column + @DynamicSerializeElement + private String corr; + + // Text of the WMO header + @Column + @DynamicSerializeElement + private String wmoHeader; + + // Station number + // @DataURI(position = 2) + @Column + @DynamicSerializeElement + private String stnum; + + @Embedded + @DataURI(position = 2, embedded = true) + @XmlElement + @DynamicSerializeElement + private SurfaceObsLocation location; + + // Yes if report is a NIL. + @Column + @DynamicSerializeElement + private Boolean nil; + + // bulletin message + @Transient + @DynamicSerializeElement + private String bullMessage; + + /** + * Uair observation levels + */ + @DynamicSerializeElement + @Transient + private Set obsLevels = new HashSet(); + + /** + * Uair tropopause data + */ + @DynamicSerializeElement + @Transient + private Set tropopause = new HashSet(); + + /** + * Uair maxwind data + */ + @DynamicSerializeElement + @Transient + private Set maxwind = new HashSet(); + + /** + * Uair lifted index data + */ + @DynamicSerializeElement + @Transient + private Set liftedindex = new HashSet(); + + @Embedded + @DynamicSerializeElement + private PointDataView pointDataView; + + /** + * Empty constructor. + */ + public NcUairRecord() { + this.nil = false; + this.stnum = ""; + this.wmoHeader = ""; + // this.stid=""; + this.corr = ""; + this.dataType = ""; + } + + /** + * Constructor for DataURI construction through base class. This is used by + * the notification service. + * + * @param uri + * A data uri applicable to this class. + * @param tableDef + * The table definitions for this class. + */ + public NcUairRecord(String uri) { + super(uri); + if (location != null) { + String staId = location.getStationId(); + location.setStationId("null".equals(staId) ? null : staId); + } + } + + /** + * @return the wmoHeader + */ + public String getWmoHeader() { + return wmoHeader; + } + + /** + * @param wmoHeader + * the wmoHeader to set + */ + public void setWmoHeader(String wmoHeader) { + this.wmoHeader = wmoHeader; + } + + /** + * Get the report correction indicator. + * + * @return The corr + */ + public String getCorr() { + return corr; + } + + /** + * Set the report correction indicator. + * + * @param corr + * The corr. + */ + public void setCorr(String corr) { + this.corr = corr; + } + + /** + * Get the observation report type. + * + * @return the reportType + */ + public String getReportType() { + return reportType; + } + + /** + * Set the observation report type. + * + * @param reportType + * the reportType to set + */ + public void setReportType(String reportType) { + this.reportType = reportType; + } + + public String getStnum() { + return stnum; + } + + public void setStnum(String stnum) { + this.stnum = stnum; + } + + /* + * Get this observation's geometry. + * + * @return The geometry for this observation. + */ + public Geometry getGeometry() { + return location.getGeometry(); + } + + /** + * Get the geometry latitude. + * + * @return The geometry latitude. + */ + public double getLatitude() { + return location.getLatitude(); + } + + /** + * Get the geometry longitude. + * + * @return The geometry longitude. + */ + public double getLongitude() { + return location.getLongitude(); + } + + /** + * Get the station identifier for this observation. + * + * @return the stationId + */ + public String getStationId() { + return location.getStationId(); + } + + /** + * Get the elevation, in meters, of the observing platform or location. + * + * @return The observation elevation, in meters. + */ + public Integer getElevation() { + return location.getElevation(); + } + + /** + * Get whether the location for this observation is defined. + * + * @return Is this location defined. + */ + public Boolean getLocationDefined() { + return location.getLocationDefined(); + } + + public Calendar getObsTime() { + return obsTime; + } + + public void setObsTime(Calendar obsTime) { + this.obsTime = obsTime; + } + + public Calendar getSynopticTime() { + return synopticTime; + } + + public void setSynopticTime(Calendar synopticTime) { + this.synopticTime = synopticTime; + } + + public String getBullMessage() { + return bullMessage; + } + + public void setBullMessage(String bullMessage) { + this.bullMessage = bullMessage; + } + + public Calendar getIssueTime() { + return issueTime; + } + + public void setIssueTime(Calendar issueTime) { + this.issueTime = issueTime; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public int getUTC() { + return UTC; + } + + public void setUTC(int utc) { + UTC = utc; + } + + public Boolean getNil() { + return nil; + } + + public void setNil(Boolean nil) { + this.nil = nil; + } + + @Override + public IDecoderGettable getDecoderGettable() { + // TODO Auto-generated method stub + return null; + } + + /** + * @return the set of uair observation levels + */ + public Set getObsLevels() { + return obsLevels; + } + + /** + * @param uair + * observation levels to set + */ + public void setObsLevels(Set uairLevel) { + this.obsLevels = uairLevel; + } + + /** + * @param add + * uair observation levels to set + */ + public void addObsLevels(NcUairObsLevels plevel) { + obsLevels.add(plevel); + // plevel.setParentID(this); + } + + /** + * @return the set of uair observation levels + */ + public Set getTropopause() { + return tropopause; + } + + /** + * @param uair + * observation levels to set + */ + public void setTropopause(Set trop) { + this.tropopause = trop; + } + + /** + * @param add + * uair observation levels to set + */ + public void addTropopause(NcUairTropopause trop) { + tropopause.add(trop); + // trop.setParentID(this); + } + + /** + * @return the set of uair maximum wind + */ + public Set getMaxWind() { + return maxwind; + } + + /** + * @param uair + * maximum wind to set + */ + public void setMaxWind(Set mwind) { + this.maxwind = mwind; + } + + /** + * @param add + * uair maximum wind to set + */ + public void addMaxWind(NcUairMaxWind mwind) { + maxwind.add(mwind); + // mwind.setParentID(this); + } + + /** + * @return the set of uair lifted index + */ + public Set getLiftedIndex() { + return liftedindex; + } + + /** + * @param uair + * lifted index to set + */ + public void setLiftedIndex(Set li) { + this.liftedindex = li; + } + + /** + * @param add + * uair lifted index to set + */ + public void addLiftedIndex(NcUairLiftedIndex li) { + liftedindex.add(li); + // li.setParentID(this); + } + + /** + * Override existing set method to modify any classes that use the dataURI + * as a foreign key + */ + @Override + public void setIdentifier(Object dataURI) { + + this.identifier = dataURI; + + } + + @Override + public SurfaceObsLocation getSpatialObject() { + return location; + } + + public SurfaceObsLocation getLocation() { + if (location == null) { + location = new SurfaceObsLocation(); + } + return location; + } + + public void setLocation(SurfaceObsLocation location) { + this.location = location; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.common.pointdata.IPointData#getPointDataView() + */ + @Override + public PointDataView getPointDataView() { + return this.pointDataView; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.common.pointdata.IPointData#setPointDataView(com.raytheon + * .uf.common.pointdata.PointDataView) + */ + @Override + public void setPointDataView(PointDataView pointDataView) { + this.pointDataView = pointDataView; + } + + @Override + public Integer getHdfFileId() { + return null; + } + + @Override + public Date getPersistenceTime() { + // return this.dataTime.getRefTime(); + return null; + } + + @Override + public void setPersistenceTime(Date persistTime) { + // TODO Auto-generated method stub + + } + + @Override + public Amount getValue(String paramName) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Collection getValues(String paramName) { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getString(String paramName) { + // TODO Auto-generated method stub + return null; + } + + @Override + public String[] getStrings(String paramName) { + // TODO Auto-generated method stub + return null; + } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairTropopause.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairTropopause.java index ab2b8a7e53..62211db38d 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairTropopause.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairTropopause.java @@ -1,186 +1,186 @@ -/** - * H5Tropopouse - * - * This java class defines the getters and setters for the tropopause - * data in TTAA of an upper air sounding. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2010 210 L. Lin Initial coding - * 04/2011 210 T. Lee Removed table entity for H5 - * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc - * 09/2011 Chin Chen support batch decoding methods for better performance and - * remove xml serialization as well - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.common.dataplugin.ncuair; - - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -@XmlAccessorType(XmlAccessType.NONE) -@DynamicSerialize -public class NcUairTropopause implements ISerializableObject { - - /** - * - */ - private static final long serialVersionUID = 8451424934840570405L; - - @DynamicSerializeElement - private float pres; - - // Observation dry air temperature in degrees Kelvin. - - @DynamicSerializeElement - private float temp; - - // Observation dewpoint temperature in degrees Kelvin. - - @DynamicSerializeElement - private float dwpt; - - // Observation wind direction in angular degrees. - - @DynamicSerializeElement - private float drct; - - // Observation wind speed in meters per second. - // Decimal(5,2) - - @DynamicSerializeElement - private float sped; - - /** - * No-Arg Constructor - */ - public NcUairTropopause() { - sped = IDecoderConstantsN.UAIR_FLOAT_MISSING; - drct = IDecoderConstantsN.UAIR_FLOAT_MISSING; - dwpt = IDecoderConstantsN.UAIR_FLOAT_MISSING; - temp = IDecoderConstantsN.UAIR_FLOAT_MISSING; - pres = IDecoderConstantsN.UAIR_FLOAT_MISSING; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } - - - /** - * Get the level pressure in Pascals. - * - * @return the pres - */ - public float getPres() { - return pres; - } - - /** - * Set the level pressure in Pascals. - * - * @param pres - * the pres to set - */ - public void setPres(float pres) { - this.pres = pres; - } - - /** - * Get the level dry air temperature in degrees Kelvin. - * - * @return the temp - */ - public float getTemp() { - return temp; - } - - /** - * Set the level dry air temperature in degrees Kelvin. - * - * @param temp - * the temp to set - */ - public void setTemp(float temp) { - this.temp = temp; - } - - /** - * Get the level dewpoint temperature in degrees Kelvin. - * - * @return the dwpt - */ - public float getDwpt() { - return dwpt; - } - - /** - * Set the level dewpoint temperature in degrees Kelvin. - * - * @param dwpt - * the dwpt to set - */ - public void setDwpt(float dwpt) { - this.dwpt = dwpt; - } - - /** - * Get the level wind direction in angular degrees. - * - * @return the drct - */ - public float getDrct() { - return drct; - } - - /** - * Set the level wind direction in angular degrees. - * - * @param drct - * the drct to set - */ - public void setDrct(float drct) { - this.drct = drct; - } - - /** - * Get the level wind speed in meters per second. - * - * @return the sped - */ - public float getSped() { - return sped; - } - - /** - * Set the level wind speed in meters per second. - * - * @param sped - * the sped to set - */ - public void setSped(float sped) { - this.sped = sped; - } - - -} +/** + * H5Tropopouse + * + * This java class defines the getters and setters for the tropopause + * data in TTAA of an upper air sounding. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2010 210 L. Lin Initial coding + * 04/2011 210 T. Lee Removed table entity for H5 + * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc + * 09/2011 Chin Chen support batch decoding methods for better performance and + * remove xml serialization as well + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.common.dataplugin.ncuair; + + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +@XmlAccessorType(XmlAccessType.NONE) +@DynamicSerialize +public class NcUairTropopause implements ISerializableObject { + + /** + * + */ + private static final long serialVersionUID = 8451424934840570405L; + + @DynamicSerializeElement + private float pres; + + // Observation dry air temperature in degrees Kelvin. + + @DynamicSerializeElement + private float temp; + + // Observation dewpoint temperature in degrees Kelvin. + + @DynamicSerializeElement + private float dwpt; + + // Observation wind direction in angular degrees. + + @DynamicSerializeElement + private float drct; + + // Observation wind speed in meters per second. + // Decimal(5,2) + + @DynamicSerializeElement + private float sped; + + /** + * No-Arg Constructor + */ + public NcUairTropopause() { + sped = IDecoderConstantsN.UAIR_FLOAT_MISSING; + drct = IDecoderConstantsN.UAIR_FLOAT_MISSING; + dwpt = IDecoderConstantsN.UAIR_FLOAT_MISSING; + temp = IDecoderConstantsN.UAIR_FLOAT_MISSING; + pres = IDecoderConstantsN.UAIR_FLOAT_MISSING; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } + + + /** + * Get the level pressure in Pascals. + * + * @return the pres + */ + public float getPres() { + return pres; + } + + /** + * Set the level pressure in Pascals. + * + * @param pres + * the pres to set + */ + public void setPres(float pres) { + this.pres = pres; + } + + /** + * Get the level dry air temperature in degrees Kelvin. + * + * @return the temp + */ + public float getTemp() { + return temp; + } + + /** + * Set the level dry air temperature in degrees Kelvin. + * + * @param temp + * the temp to set + */ + public void setTemp(float temp) { + this.temp = temp; + } + + /** + * Get the level dewpoint temperature in degrees Kelvin. + * + * @return the dwpt + */ + public float getDwpt() { + return dwpt; + } + + /** + * Set the level dewpoint temperature in degrees Kelvin. + * + * @param dwpt + * the dwpt to set + */ + public void setDwpt(float dwpt) { + this.dwpt = dwpt; + } + + /** + * Get the level wind direction in angular degrees. + * + * @return the drct + */ + public float getDrct() { + return drct; + } + + /** + * Set the level wind direction in angular degrees. + * + * @param drct + * the drct to set + */ + public void setDrct(float drct) { + this.drct = drct; + } + + /** + * Get the level wind speed in meters per second. + * + * @return the sped + */ + public float getSped() { + return sped; + } + + /** + * Set the level wind speed in meters per second. + * + * @param sped + * the sped to set + */ + public void setSped(float sped) { + this.sped = sped; + } + + +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/package-info.java index 2dc94735ae..9c3a7204a8 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains table record for decoder plug-ins -*/ -package gov.noaa.nws.ncep.common.dataplugin.ncuair; +/** +* Contains table record for decoder plug-ins +*/ +package gov.noaa.nws.ncep.common.dataplugin.ncuair; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/component-deploy.xml old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetLocation.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetLocation.java index fafe385dce..0558b1ceb9 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetLocation.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetLocation.java @@ -1,161 +1,161 @@ -/** - * NonConvsigmetLocation - * - * This java class defines the getters and setters for the - * convective sigmet location table. - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 Uma Josyula Initial creation - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet; - -import java.io.Serializable; - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - - - -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -@Entity -@Table(name="nonconvsigmet_location") -@DynamicSerialize -public class NonConvSigmetLocation implements Serializable, ISerializableObject { - - private static final long serialVersionUID = 1L; - @Id - @GeneratedValue - private Integer recordId = null; - - - - // Collection of locations - @Column(length=120) - @DynamicSerializeElement - private String locationLine; - - // Each location of a nonconvective sigmet forecast area - @Column(length=40) - @DynamicSerializeElement - private String location; - - // Each latitude of a nonconvective sigmet forecast area - @Column - @DynamicSerializeElement - private double latitude; - - // Each longitude of a nonconvective sigmet forecast area - @Column - @DynamicSerializeElement - private double longitude; - - // Index for the order of a complete location set - @Column - @DynamicSerializeElement - private Integer index; - - /** - * No-Arg Convstructor. - */ - public NonConvSigmetLocation() { - this.locationLine=""; - this.location=""; - this.index=IDecoderConstantsN.INTEGER_MISSING; - } - - /** - * @return the recordId. If not set returns null. - */ - public Integer getRecordId() { - return recordId; - } - - /** - * @param recordId to set - */ - public void setRecordId(Integer recordId) { - this.recordId = recordId; - } - - - - /** - * @return the locationLine - */ - public String getLocationLine() { - return locationLine; - } - - /** - * @param locationLine to set - */ - public void setLocationLine(String locationLine) { - this.locationLine = locationLine; - } - - /** - * @return the location - */ - public String getLocation() { - return location; - } - - /** - * @param location to set - */ - public void setLocation(String location) { - this.location = location; - } - - /** - * @return the index - */ - public Integer getIndex() { - return index; - } - - /** - * @param index to set - */ - public void setIndex(Integer index) { - this.index = index; - } - - public double getLatitude() { - return latitude; - } - - public void setLatitude(double latitude) { - this.latitude = latitude; - } - - public double getLongitude() { - return longitude; - } - - public void setLongitude(double longitude) { - this.longitude = longitude; - } - - /** - * @return the serialVersionUID - */ - public static long getSerialVersionUID() { - return serialVersionUID; - } +/** + * NonConvsigmetLocation + * + * This java class defines the getters and setters for the + * convective sigmet location table. + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 Uma Josyula Initial creation + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet; + +import java.io.Serializable; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + + + +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +@Entity +@Table(name="nonconvsigmet_location") +@DynamicSerialize +public class NonConvSigmetLocation implements Serializable, ISerializableObject { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue + private Integer recordId = null; + + + + // Collection of locations + @Column(length=120) + @DynamicSerializeElement + private String locationLine; + + // Each location of a nonconvective sigmet forecast area + @Column(length=40) + @DynamicSerializeElement + private String location; + + // Each latitude of a nonconvective sigmet forecast area + @Column + @DynamicSerializeElement + private double latitude; + + // Each longitude of a nonconvective sigmet forecast area + @Column + @DynamicSerializeElement + private double longitude; + + // Index for the order of a complete location set + @Column + @DynamicSerializeElement + private Integer index; + + /** + * No-Arg Convstructor. + */ + public NonConvSigmetLocation() { + this.locationLine=""; + this.location=""; + this.index=IDecoderConstantsN.INTEGER_MISSING; + } + + /** + * @return the recordId. If not set returns null. + */ + public Integer getRecordId() { + return recordId; + } + + /** + * @param recordId to set + */ + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + + + + /** + * @return the locationLine + */ + public String getLocationLine() { + return locationLine; + } + + /** + * @param locationLine to set + */ + public void setLocationLine(String locationLine) { + this.locationLine = locationLine; + } + + /** + * @return the location + */ + public String getLocation() { + return location; + } + + /** + * @param location to set + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * @return the index + */ + public Integer getIndex() { + return index; + } + + /** + * @param index to set + */ + public void setIndex(Integer index) { + this.index = index; + } + + public double getLatitude() { + return latitude; + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + public double getLongitude() { + return longitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + /** + * @return the serialVersionUID + */ + public static long getSerialVersionUID() { + return serialVersionUID; + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java index 39b31aa410..c295407f6a 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java @@ -1,546 +1,546 @@ -/** - * NonConvsigmetRecord - * - * This java class performs the mapping to the database table for NONCONVSIGMET - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 Uma Josyula Initial creation - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet; - -import java.util.Calendar; -import java.util.HashSet; -import java.util.Set; -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; - -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -import javax.persistence.CascadeType; -import javax.persistence.Column; - -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; - -import org.hibernate.annotations.Index; - -import com.raytheon.uf.common.dataplugin.annotations.DataURI; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -@Entity -@Table(name = "nonconvsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) -@DynamicSerialize - - -public class NonConvSigmetRecord extends PluginDataObject{ - - /** - * - */ - private static final long serialVersionUID = 1L; - - // reportType is "non-convective sigmet". - @Column(length=32) - @DynamicSerializeElement - private String reportType; - - // WMO header - @Column(length=32) - @DynamicSerializeElement - private String wmoHeader; - - // forecastRegion as: SL - @Column(length=8) - @DataURI(position=2) - @DynamicSerializeElement - private String forecastRegion; - - // The issue office where the report from - @Column(length=32) - @DataURI(position=1) - @DynamicSerializeElement - private String issueOffice; - - // Issue time of the report - @Column - @DataURI(position=3) - @DynamicSerializeElement - private Calendar issueTime; - - // The designator - @Column(length=8) - @DynamicSerializeElement - private String designatorBBB; - - // CorrectionFlag is a flag with values (1 or 2 or 3) - @Column(length=8) - @DynamicSerializeElement - private String correctionRemarks; - - // The awipsId from the report - @Column(length=32) - @DataURI(position=4) - @DynamicSerializeElement - private String awipsId; - - // The state list from the report - @Column(length=256) - @DynamicSerializeElement - private String stateList; - - // Start time of the report - @Column - @DynamicSerializeElement - private Calendar startTime; - - // End time of the report - @Column - @DynamicSerializeElement - private Calendar endTime; - - // The type of the hazard from the report - @Column(length=16) - @DynamicSerializeElement - private String hazardType; - - // The intensity of the hazard from the report - @Column(length=64) - @DynamicSerializeElement - private String hazardIntensity; - - // The cause for the hazard from the report - @Column(length=128) - @DynamicSerializeElement - private String hazardCause; - - // The conditions stated about the hazard from the report - @Column(length=128) - @DynamicSerializeElement - private String hazardCondition; - - // The lower flight level from the report - @Column - @DynamicSerializeElement - private int flightLevel1; - - // The upper flight level from the report - @Column - @DynamicSerializeElement - private int flightLevel2; - - // The sigmet Identifier from the report - @Column(length=32) - @DynamicSerializeElement - private String sigmetId; - - // The entire report - @Column(length=3000) - @DynamicSerializeElement - private String bullMessage; - - - /** - * Convsigmet location - */ - @DynamicSerializeElement - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "parentID", nullable = false) - @Index(name = "nonConvSigmetLocation_parentid_idex") - private Set nonConvSigmetLocation = new HashSet(); - - - /** - * Default Constructor - */ - public NonConvSigmetRecord() { - this.issueOffice =""; - this.wmoHeader =""; - this.bullMessage =""; - this.designatorBBB =""; - this.forecastRegion =""; - this.reportType =""; - this.correctionRemarks =""; - this.awipsId =""; - this.flightLevel1 =IDecoderConstantsN.INTEGER_MISSING; - this.flightLevel2 =IDecoderConstantsN.INTEGER_MISSING; - this.hazardCause =""; - this.hazardCondition =""; - this.hazardIntensity =""; - this.hazardType ="UNKNOWN"; - this.stateList =""; - this.sigmetId =""; - } - - /** - * Convstructs a non-consigmet record from a dataURI - * - * @param uri The dataURI - */ - public NonConvSigmetRecord(String uri) { - super(uri); - } - - @Override - public IDecoderGettable getDecoderGettable() { - // TODO Auto-generated method stub - return null; - } - - - /** - * @return the reportType - */ - public String getReportType() { - return reportType; - } - - - /** - * @param reportType to set - */ - public void setReportType(String reportType) { - this.reportType = reportType; - } - - - /** - * @return the wmoHeader - */ - public String getWmoHeader() { - return wmoHeader; - } - - - /** - * @param wmoHeader to set - */ - public void setWmoHeader(String wmoHeader) { - this.wmoHeader = wmoHeader; - } - - - /** - * @return the forecastRegion - */ - public String getForecastRegion() { - return forecastRegion; - } - - - /** - * @param forecastRegion to set - */ - public void setForecastRegion(String forecastRegion) { - this.forecastRegion = forecastRegion; - } - - - /** - * @return the issueOffice - */ - public String getIssueOffice() { - return issueOffice; - } - - - /** - * @param issueOffice to set - */ - public void setIssueOffice(String issueOffice) { - this.issueOffice = issueOffice; - } - - - /** - * @return the issueTime - */ - public Calendar getIssueTime() { - return issueTime; - } - - - /** - * @param issueTime to set - */ - public void setIssueTime(Calendar issueTime) { - this.issueTime = issueTime; - } - - - /** - * @return the designatorBBB - */ - public String getDesignatorBBB() { - return designatorBBB; - } - - - /** - * @param designatorBBB to set - */ - public void setDesignatorBBB(String designatorBBB) { - this.designatorBBB = designatorBBB; - } - - - /** - * @return the correctionFlag - */ - public String getCorrectionRemarks() { - return correctionRemarks; - } - - - /** - * @param correctionFlag to set - */ - public void setCorrectionRemarks(String correctionRemarks) { - this.correctionRemarks = correctionRemarks; - } - - - /** - * @return the awipsId - */ - public String getAwipsId() { - return awipsId; - } - - - /** - * @param awipsId to set - */ - public void setAwipsId(String awipsId) { - this.awipsId = awipsId; - } - - - /** - * @return the stateList - */ - public String getStateList() { - return stateList; - } - - - /** - * @param stateList to set - */ - public void setStateList(String stateList) { - this.stateList = stateList; - } - - - /** - * @return the startTime - */ - public Calendar getStartTime() { - return startTime; - } - - - /** - * @param startTime to set - */ - public void setStartTime(Calendar startTime) { - this.startTime = startTime; - } - - - /** - * @return the endTime - */ - public Calendar getEndTime() { - return endTime; - } - - - /** - * @param endTime to set - */ - public void setEndTime(Calendar endTime) { - this.endTime = endTime; - } - - - /** - * @return the hazardType - */ - public String getHazardType() { - return hazardType; - } - - - /** - * @param hazardType to set - */ - public void setHazardType(String hazardType) { - this.hazardType = hazardType; - } - - - /** - * @return the hazardIntensity - */ - public String getHazardIntensity() { - return hazardIntensity; - } - - - /** - * @param hazardIntensity to set - */ - public void setHazardIntensity(String hazardIntensity) { - this.hazardIntensity = hazardIntensity; - } - - - /** - * @return the hazardCause - */ - public String getHazardCause() { - return hazardCause; - } - - - /** - * @param hazardCause to set - */ - public void setHazardCause(String hazardCause) { - this.hazardCause = hazardCause; - } - - - /** - * @return the hazardCondition - */ - public String getHazardCondition() { - return hazardCondition; - } - - - /** - * @param hazardCondition to set - */ - public void setHazardCondition(String hazardCondition) { - this.hazardCondition = hazardCondition; - } - - - /** - * @return the flightLevel1 - */ - public int getFlightLevel1() { - return flightLevel1; - } - - - /** - * @param flightLevel1 to set - */ - public void setFlightLevel1(int flightLevel1) { - this.flightLevel1 = flightLevel1; - } - - - /** - * @return the flightLevel2 - */ - public int getFlightLevel2() { - return flightLevel2; - } - - - /** - * @param flightLevel2 to set - */ - public void setFlightLevel2(int flightLevel2) { - this.flightLevel2 = flightLevel2; - } - - - /** - * @return the sigmetId - */ - public String getSigmetId() { - return sigmetId; - } - - - /** - * @param sigmetId to set - */ - public void setSigmetId(String sigmetId) { - this.sigmetId = sigmetId; - } - - - /** - * @return the bullMessage - */ - public String getBullMessage() { - return bullMessage; - } - - - /** - * @param bullMessage to set - */ - public void setBullMessage(String bullMessage) { - this.bullMessage = bullMessage; - } - - - /** - * @return the set of nonconvective sigmet location - */ - public Set getNonConvSigmetLocation() { - return nonConvSigmetLocation; - } - - /** - * @param nonconvsigmet the location to set - */ - public void setNonConvSigmetLocation(Set nonConvLocation) { - this.nonConvSigmetLocation = nonConvLocation; - } - - /** - * @param add conv Sigmet location to set - */ - public void addNonConvSigmetLocation(NonConvSigmetLocation pLocation){ - nonConvSigmetLocation.add(pLocation); - - } - - - /** - * Override existing set method to modify any - * classes that use the dataURI as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) - { - - this.identifier = dataURI; - - - - } - - - +/** + * NonConvsigmetRecord + * + * This java class performs the mapping to the database table for NONCONVSIGMET + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 Uma Josyula Initial creation + * 09/2011 Chin Chen changed to improve purge performance and + * removed xml serialization as well + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet; + +import java.util.Calendar; +import java.util.HashSet; +import java.util.Set; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.IDecoderGettable; + +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; + +import javax.persistence.CascadeType; +import javax.persistence.Column; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.Index; + +import com.raytheon.uf.common.dataplugin.annotations.DataURI; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +@Entity +@Table(name = "nonconvsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@DynamicSerialize + + +public class NonConvSigmetRecord extends PluginDataObject{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + // reportType is "non-convective sigmet". + @Column(length=32) + @DynamicSerializeElement + private String reportType; + + // WMO header + @Column(length=32) + @DynamicSerializeElement + private String wmoHeader; + + // forecastRegion as: SL + @Column(length=8) + @DataURI(position=2) + @DynamicSerializeElement + private String forecastRegion; + + // The issue office where the report from + @Column(length=32) + @DataURI(position=1) + @DynamicSerializeElement + private String issueOffice; + + // Issue time of the report + @Column + @DataURI(position=3) + @DynamicSerializeElement + private Calendar issueTime; + + // The designator + @Column(length=8) + @DynamicSerializeElement + private String designatorBBB; + + // CorrectionFlag is a flag with values (1 or 2 or 3) + @Column(length=8) + @DynamicSerializeElement + private String correctionRemarks; + + // The awipsId from the report + @Column(length=32) + @DataURI(position=4) + @DynamicSerializeElement + private String awipsId; + + // The state list from the report + @Column(length=256) + @DynamicSerializeElement + private String stateList; + + // Start time of the report + @Column + @DynamicSerializeElement + private Calendar startTime; + + // End time of the report + @Column + @DynamicSerializeElement + private Calendar endTime; + + // The type of the hazard from the report + @Column(length=16) + @DynamicSerializeElement + private String hazardType; + + // The intensity of the hazard from the report + @Column(length=64) + @DynamicSerializeElement + private String hazardIntensity; + + // The cause for the hazard from the report + @Column(length=128) + @DynamicSerializeElement + private String hazardCause; + + // The conditions stated about the hazard from the report + @Column(length=128) + @DynamicSerializeElement + private String hazardCondition; + + // The lower flight level from the report + @Column + @DynamicSerializeElement + private int flightLevel1; + + // The upper flight level from the report + @Column + @DynamicSerializeElement + private int flightLevel2; + + // The sigmet Identifier from the report + @Column(length=32) + @DynamicSerializeElement + private String sigmetId; + + // The entire report + @Column(length=3000) + @DynamicSerializeElement + private String bullMessage; + + + /** + * Convsigmet location + */ + @DynamicSerializeElement + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "parentID", nullable = false) + @Index(name = "nonConvSigmetLocation_parentid_idex") + private Set nonConvSigmetLocation = new HashSet(); + + + /** + * Default Constructor + */ + public NonConvSigmetRecord() { + this.issueOffice =""; + this.wmoHeader =""; + this.bullMessage =""; + this.designatorBBB =""; + this.forecastRegion =""; + this.reportType =""; + this.correctionRemarks =""; + this.awipsId =""; + this.flightLevel1 =IDecoderConstantsN.INTEGER_MISSING; + this.flightLevel2 =IDecoderConstantsN.INTEGER_MISSING; + this.hazardCause =""; + this.hazardCondition =""; + this.hazardIntensity =""; + this.hazardType ="UNKNOWN"; + this.stateList =""; + this.sigmetId =""; + } + + /** + * Convstructs a non-consigmet record from a dataURI + * + * @param uri The dataURI + */ + public NonConvSigmetRecord(String uri) { + super(uri); + } + + @Override + public IDecoderGettable getDecoderGettable() { + // TODO Auto-generated method stub + return null; + } + + + /** + * @return the reportType + */ + public String getReportType() { + return reportType; + } + + + /** + * @param reportType to set + */ + public void setReportType(String reportType) { + this.reportType = reportType; + } + + + /** + * @return the wmoHeader + */ + public String getWmoHeader() { + return wmoHeader; + } + + + /** + * @param wmoHeader to set + */ + public void setWmoHeader(String wmoHeader) { + this.wmoHeader = wmoHeader; + } + + + /** + * @return the forecastRegion + */ + public String getForecastRegion() { + return forecastRegion; + } + + + /** + * @param forecastRegion to set + */ + public void setForecastRegion(String forecastRegion) { + this.forecastRegion = forecastRegion; + } + + + /** + * @return the issueOffice + */ + public String getIssueOffice() { + return issueOffice; + } + + + /** + * @param issueOffice to set + */ + public void setIssueOffice(String issueOffice) { + this.issueOffice = issueOffice; + } + + + /** + * @return the issueTime + */ + public Calendar getIssueTime() { + return issueTime; + } + + + /** + * @param issueTime to set + */ + public void setIssueTime(Calendar issueTime) { + this.issueTime = issueTime; + } + + + /** + * @return the designatorBBB + */ + public String getDesignatorBBB() { + return designatorBBB; + } + + + /** + * @param designatorBBB to set + */ + public void setDesignatorBBB(String designatorBBB) { + this.designatorBBB = designatorBBB; + } + + + /** + * @return the correctionFlag + */ + public String getCorrectionRemarks() { + return correctionRemarks; + } + + + /** + * @param correctionFlag to set + */ + public void setCorrectionRemarks(String correctionRemarks) { + this.correctionRemarks = correctionRemarks; + } + + + /** + * @return the awipsId + */ + public String getAwipsId() { + return awipsId; + } + + + /** + * @param awipsId to set + */ + public void setAwipsId(String awipsId) { + this.awipsId = awipsId; + } + + + /** + * @return the stateList + */ + public String getStateList() { + return stateList; + } + + + /** + * @param stateList to set + */ + public void setStateList(String stateList) { + this.stateList = stateList; + } + + + /** + * @return the startTime + */ + public Calendar getStartTime() { + return startTime; + } + + + /** + * @param startTime to set + */ + public void setStartTime(Calendar startTime) { + this.startTime = startTime; + } + + + /** + * @return the endTime + */ + public Calendar getEndTime() { + return endTime; + } + + + /** + * @param endTime to set + */ + public void setEndTime(Calendar endTime) { + this.endTime = endTime; + } + + + /** + * @return the hazardType + */ + public String getHazardType() { + return hazardType; + } + + + /** + * @param hazardType to set + */ + public void setHazardType(String hazardType) { + this.hazardType = hazardType; + } + + + /** + * @return the hazardIntensity + */ + public String getHazardIntensity() { + return hazardIntensity; + } + + + /** + * @param hazardIntensity to set + */ + public void setHazardIntensity(String hazardIntensity) { + this.hazardIntensity = hazardIntensity; + } + + + /** + * @return the hazardCause + */ + public String getHazardCause() { + return hazardCause; + } + + + /** + * @param hazardCause to set + */ + public void setHazardCause(String hazardCause) { + this.hazardCause = hazardCause; + } + + + /** + * @return the hazardCondition + */ + public String getHazardCondition() { + return hazardCondition; + } + + + /** + * @param hazardCondition to set + */ + public void setHazardCondition(String hazardCondition) { + this.hazardCondition = hazardCondition; + } + + + /** + * @return the flightLevel1 + */ + public int getFlightLevel1() { + return flightLevel1; + } + + + /** + * @param flightLevel1 to set + */ + public void setFlightLevel1(int flightLevel1) { + this.flightLevel1 = flightLevel1; + } + + + /** + * @return the flightLevel2 + */ + public int getFlightLevel2() { + return flightLevel2; + } + + + /** + * @param flightLevel2 to set + */ + public void setFlightLevel2(int flightLevel2) { + this.flightLevel2 = flightLevel2; + } + + + /** + * @return the sigmetId + */ + public String getSigmetId() { + return sigmetId; + } + + + /** + * @param sigmetId to set + */ + public void setSigmetId(String sigmetId) { + this.sigmetId = sigmetId; + } + + + /** + * @return the bullMessage + */ + public String getBullMessage() { + return bullMessage; + } + + + /** + * @param bullMessage to set + */ + public void setBullMessage(String bullMessage) { + this.bullMessage = bullMessage; + } + + + /** + * @return the set of nonconvective sigmet location + */ + public Set getNonConvSigmetLocation() { + return nonConvSigmetLocation; + } + + /** + * @param nonconvsigmet the location to set + */ + public void setNonConvSigmetLocation(Set nonConvLocation) { + this.nonConvSigmetLocation = nonConvLocation; + } + + /** + * @param add conv Sigmet location to set + */ + public void addNonConvSigmetLocation(NonConvSigmetLocation pLocation){ + nonConvSigmetLocation.add(pLocation); + + } + + + /** + * Override existing set method to modify any + * classes that use the dataURI as a foreign key + */ + @Override + public void setIdentifier(Object dataURI) + { + + this.identifier = dataURI; + + + + } + + + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/package-info.java old mode 100644 new mode 100755 index a3058334a5..403310ea11 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/package-info.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains table record for decoder plug-ins -*/ -package gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet; +/** +* Contains table record for decoder plug-ins +*/ +package gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwh/gov.noaa.nws.ncep.common.dataplugin.sgwh.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwh/gov.noaa.nws.ncep.common.dataplugin.sgwh.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwhv/gov.noaa.nws.ncep.common.dataplugin.sgwhv.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwhv/gov.noaa.nws.ncep.common.dataplugin.sgwhv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwhv/src/gov/noaa/nws/ncep/common/dataplugin/sgwhv/dao/SgwhvDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwhv/src/gov/noaa/nws/ncep/common/dataplugin/sgwhv/dao/SgwhvDao.java index aeba4b112d..a07218e0f6 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwhv/src/gov/noaa/nws/ncep/common/dataplugin/sgwhv/dao/SgwhvDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.sgwhv/src/gov/noaa/nws/ncep/common/dataplugin/sgwhv/dao/SgwhvDao.java @@ -13,68 +13,68 @@ * * @author chin chen * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.sgwhv.dao; - -import java.util.List; + **/ +package gov.noaa.nws.ncep.common.dataplugin.sgwhv.dao; + +import java.util.List; import javax.xml.bind.JAXBException; - + import gov.noaa.nws.ncep.common.dataplugin.sgwhv.SgwhvRecord; import gov.noaa.nws.ncep.edex.common.dao.NcepPointDataPluginDao; -import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.pointdata.PointDataDescription; import com.raytheon.uf.edex.database.DataAccessLayerException; - -public class SgwhvDao extends NcepPointDataPluginDao { - private PointDataDescription pdd; - - /** - * Creates a new ReccoDao - * @throws PluginException - */ - public SgwhvDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a BUFRSGWHV report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public SgwhvRecord queryByDataURI(String dataURI) { - SgwhvRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (SgwhvRecord) obs.get(0); - } - return report; - } - - /** - * Queries for to determine if a given data uri exists on the Bufrsgwhv table. - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.sgwhv where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; + +public class SgwhvDao extends NcepPointDataPluginDao { + private PointDataDescription pdd; + + /** + * Creates a new ReccoDao + * @throws PluginException + */ + public SgwhvDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a BUFRSGWHV report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public SgwhvRecord queryByDataURI(String dataURI) { + SgwhvRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (SgwhvRecord) obs.get(0); + } + return report; + } + + /** + * Queries for to determine if a given data uri exists on the Bufrsgwhv table. + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.sgwhv where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; } public PointDataDescription getPointDataDescription() throws JAXBException { if (pdd == null) { @@ -96,5 +96,5 @@ public class SgwhvDao extends NcepPointDataPluginDao { @Override public SgwhvRecord newObject() { return new SgwhvRecord(); - } -} + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ssha/gov.noaa.nws.ncep.common.dataplugin.ssha.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ssha/gov.noaa.nws.ncep.common.dataplugin.ssha.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ssha/src/gov/noaa/nws/ncep/common/dataplugin/ssha/dao/SshaDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ssha/src/gov/noaa/nws/ncep/common/dataplugin/ssha/dao/SshaDao.java index 86d8144919..24c5b988a4 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ssha/src/gov/noaa/nws/ncep/common/dataplugin/ssha/dao/SshaDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ssha/src/gov/noaa/nws/ncep/common/dataplugin/ssha/dao/SshaDao.java @@ -13,69 +13,69 @@ * * @author Chin Chen * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.ssha.dao; - -import java.util.List; + **/ +package gov.noaa.nws.ncep.common.dataplugin.ssha.dao; + +import java.util.List; import javax.xml.bind.JAXBException; - + import gov.noaa.nws.ncep.common.dataplugin.ssha.SshaRecord; import gov.noaa.nws.ncep.edex.common.dao.NcepPointDataPluginDao; -import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.pointdata.PointDataDescription; import com.raytheon.uf.edex.database.DataAccessLayerException; - -public class SshaDao extends NcepPointDataPluginDao { - private PointDataDescription pdd; - - /** - * Creates a new BufrsshaDao - * @throws PluginException - */ - public SshaDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a BUFRSSHA report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public SshaRecord queryByDataURI(String dataURI) { - SshaRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (SshaRecord) obs.get(0); - } - return report; - } - - /** + +public class SshaDao extends NcepPointDataPluginDao { + private PointDataDescription pdd; + + /** + * Creates a new BufrsshaDao + * @throws PluginException + */ + public SshaDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a BUFRSSHA report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public SshaRecord queryByDataURI(String dataURI) { + SshaRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (SshaRecord) obs.get(0); + } + return report; + } + + /** * Queries for to determine if a given data uri exists on the Bufrssha table.import gov.noaa.nws.ncep.common.dataplugin.sgwh.SgwhRecord; - - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.ssha where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; + + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.ssha where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; } public PointDataDescription getPointDataDescription() throws JAXBException { if (pdd == null) { @@ -97,5 +97,5 @@ public class SshaDao extends NcepPointDataPluginDao { @Override public SshaRecord newObject() { return new SshaRecord(); - } -} + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/component-deploy.xml index 33d7dac712..7b3802d03e 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/component-deploy.xml +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/component-deploy.xml @@ -1,11 +1,11 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/gov.noaa.nws.ncep.common.dataplugin.stormtrack.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/gov.noaa.nws.ncep.common.dataplugin.stormtrack.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/src/gov/noaa/nws/ncep/common/dataplugin/stormtrack/dao/StormTrackDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/src/gov/noaa/nws/ncep/common/dataplugin/stormtrack/dao/StormTrackDao.java index e9536e5f0d..163786a3a8 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/src/gov/noaa/nws/ncep/common/dataplugin/stormtrack/dao/StormTrackDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.stormtrack/src/gov/noaa/nws/ncep/common/dataplugin/stormtrack/dao/StormTrackDao.java @@ -12,64 +12,64 @@ * * @author tlee * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.stormtrack.dao; - -import java.util.List; - + **/ +package gov.noaa.nws.ncep.common.dataplugin.stormtrack.dao; + +import java.util.List; + import gov.noaa.nws.ncep.common.dataplugin.stormtrack.StormTrackRecord; import gov.noaa.nws.ncep.edex.common.dao.NcepDefaultPluginDao; -import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.edex.database.DataAccessLayerException; - -public class StormTrackDao extends NcepDefaultPluginDao { - - - /** - * Creates a new ReccoDao - * @throws PluginException - */ - public StormTrackDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a StormTrack report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public StormTrackRecord queryByDataURI(String dataURI) { - StormTrackRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (StormTrackRecord) obs.get(0); - } - return report; - } - - /** - * Queries for to determine if a given data uri exists on the StormTrack table. - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.stormtrack where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; - } -} + +public class StormTrackDao extends NcepDefaultPluginDao { + + + /** + * Creates a new ReccoDao + * @throws PluginException + */ + public StormTrackDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a StormTrack report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public StormTrackRecord queryByDataURI(String dataURI) { + StormTrackRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (StormTrackRecord) obs.get(0); + } + return report; + } + + /** + * Queries for to determine if a given data uri exists on the StormTrack table. + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.stormtrack where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.tcm/gov.noaa.nws.ncep.common.dataplugin.tcm.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.tcm/gov.noaa.nws.ncep.common.dataplugin.tcm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/gov.noaa.nws.ncep.common.dataplugin.wcp.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/gov.noaa.nws.ncep.common.dataplugin.wcp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java index 7915a62c7e..255ba83e2b 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java @@ -56,14 +56,13 @@ public class WcpRecord extends PluginDataObject{ /** Report type */ @Column(length=32) @DynamicSerializeElement + @DataURI(position = 2) private String reportType; - //@DataURI(position = 1) @Column @DynamicSerializeElement private Calendar issueTime; - //@DataURI(position = 2) @DataURI(position = 1) @Column(length = 8) @DynamicSerializeElement diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/dao/WcpDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/dao/WcpDao.java index a36a65dea1..7b8639307d 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/dao/WcpDao.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/dao/WcpDao.java @@ -14,67 +14,67 @@ * * @author fjyen * @version 1.0 - **/ -package gov.noaa.nws.ncep.common.dataplugin.wcp.dao; - -import java.util.List; - -import gov.noaa.nws.ncep.common.dataplugin.wcp.WcpRecord; + **/ +package gov.noaa.nws.ncep.common.dataplugin.wcp.dao; -import com.raytheon.uf.common.dataplugin.PluginException; +import java.util.List; + +import gov.noaa.nws.ncep.common.dataplugin.wcp.WcpRecord; + +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.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.database.plugin.PluginDao; - -public class WcpDao extends PluginDao { - - - /** - * Creates a new ReccoDao - * @throws PluginException - */ - public WcpDao(String pluginName) throws PluginException { - super(pluginName); - } - - /** - * Retrieves a WCP report using the datauri . - * - * @param dataURI - * The dataURI to match against. - * @return The report record if it exists. - */ - public WcpRecord queryByDataURI(String dataURI) { - WcpRecord report = null; - List obs = null; - try { - obs = queryBySingleCriteria("dataURI", dataURI); - } catch (DataAccessLayerException e) { - e.printStackTrace(); - } - if((obs != null)&&(obs.size() > 0)) { - report = (WcpRecord) obs.get(0); - } - return report; - } - - /** - * Queries for to determine if a given data uri exists on the WCP table. - * - * @param dataUri - * The DataURI to find. - * @return An array of objects. If not null, there should only be a single - * element. - */ - public Object[] queryDataUriColumn(final String dataUri) { - - String sql = "select datauri from awips.wcp where datauri='" - + dataUri + "';"; - - Object[] results = executeSQLQuery(sql); - - return results; + +public class WcpDao extends PluginDao { + + + /** + * Creates a new ReccoDao + * @throws PluginException + */ + public WcpDao(String pluginName) throws PluginException { + super(pluginName); + } + + /** + * Retrieves a WCP report using the datauri . + * + * @param dataURI + * The dataURI to match against. + * @return The report record if it exists. + */ + public WcpRecord queryByDataURI(String dataURI) { + WcpRecord report = null; + List obs = null; + try { + obs = queryBySingleCriteria("dataURI", dataURI); + } catch (DataAccessLayerException e) { + e.printStackTrace(); + } + if((obs != null)&&(obs.size() > 0)) { + report = (WcpRecord) obs.get(0); + } + return report; + } + + /** + * Queries for to determine if a given data uri exists on the WCP table. + * + * @param dataUri + * The DataURI to find. + * @return An array of objects. If not null, there should only be a single + * element. + */ + public Object[] queryDataUriColumn(final String dataUri) { + + String sql = "select datauri from awips.wcp where datauri='" + + dataUri + "';"; + + Object[] results = executeSQLQuery(sql); + + return results; } @Override @@ -82,5 +82,5 @@ public class WcpDao extends PluginDao { IPersistable obj) throws Exception { // TODO Auto-generated method stub return null; - } -} + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.log/gov.noaa.nws.ncep.common.log.ecl b/ncep/gov.noaa.nws.ncep.common.log/gov.noaa.nws.ncep.common.log.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common.log4j.config/gov.noaa.nws.ncep.common.log4j.config.ecl b/ncep/gov.noaa.nws.ncep.common.log4j.config/gov.noaa.nws.ncep.common.log4j.config.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.common/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common/component-deploy.xml index e0fe48e841..d37f577e73 100644 --- a/ncep/gov.noaa.nws.ncep.common/component-deploy.xml +++ b/ncep/gov.noaa.nws.ncep.common/component-deploy.xml @@ -1,11 +1,11 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.common/gov.noaa.nws.ncep.common.ecl b/ncep/gov.noaa.nws.ncep.common/gov.noaa.nws.ncep.common.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.common/gov.noaa.nws.ncep.edex.common.ecl b/ncep/gov.noaa.nws.ncep.edex.common/gov.noaa.nws.ncep.edex.common.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/IceType.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/IceType.java index 622aa23505..257c7c102a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/IceType.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/IceType.java @@ -29,6 +29,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; private static final long serialVersionUID = 5545342242369880295L; public IceType(){ - super( UNIT ); - } + super( UNIT ); + setValueIsString(); + } } diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/MetParameterFactory.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/MetParameterFactory.java index 90e699fe8d..cb3949e1ec 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/MetParameterFactory.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/MetParameterFactory.java @@ -137,6 +137,7 @@ public class MetParameterFactory implements ISerializableObject{ ncParamsMap.put( HighResWaveHeight.class.getSimpleName(), new HighResWaveHeight() ); ncParamsMap.put( HumitureIndex.class.getSimpleName(), new HumitureIndex() ); ncParamsMap.put( IceCode.class.getSimpleName(), new IceCode() ); + ncParamsMap.put( IceType.class.getSimpleName(), new IceType() ); ncParamsMap.put( IcingIntensitySymbol.class.getSimpleName(), new IcingIntensitySymbol() ); ncParamsMap.put( IcingTypeSymbol.class.getSimpleName(), new IcingTypeSymbol() ); ncParamsMap.put( InterWindDir.class.getSimpleName(), new InterWindDir() ); @@ -270,6 +271,7 @@ public class MetParameterFactory implements ISerializableObject{ ncParamsMap.put( TotalSkyCoverFcst12hr.class.getSimpleName(), new TotalSkyCoverFcst12hr() ); ncParamsMap.put( TurbulenceFrequencySymbol.class.getSimpleName(), new TurbulenceFrequencySymbol() ); ncParamsMap.put( TurbulenceIntensitySymbol.class.getSimpleName(), new TurbulenceIntensitySymbol() ); + ncParamsMap.put( TurbulenceTypeSymbol.class.getSimpleName(), new TurbulenceTypeSymbol() ); ncParamsMap.put( TurbulentKineticEnergy.class.getSimpleName(), new TurbulentKineticEnergy() ); ncParamsMap.put( EstStormDirectionUComp.class.getSimpleName(), new EstStormDirectionUComp() ); ncParamsMap.put( UCompAt10Meters.class.getSimpleName(), new UCompAt10Meters() ); diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/TurbulenceTypeSymbol.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/TurbulenceTypeSymbol.java new file mode 100644 index 0000000000..f351ecee58 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/TurbulenceTypeSymbol.java @@ -0,0 +1,35 @@ +/** + * + */ +package gov.noaa.nws.ncep.edex.common.metparameters; + +import javax.measure.quantity.Dimensionless; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; + +/** + * Maps to the GEMPAK parameter TPOT + */ +@XmlRootElement +@XmlAccessorType(XmlAccessType.NONE) +@DynamicSerialize + + +public class TurbulenceTypeSymbol extends AbstractMetParameter implements + Dimensionless, ISerializableObject { + + /** + * + */ + private static final long serialVersionUID = -6287889028169403542L; + + public TurbulenceTypeSymbol() { + super(UNIT); + setValueIsString(); + } + +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingProfile.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingProfile.java index 76ca77a997..2a6eb3b00b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingProfile.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingProfile.java @@ -17,6 +17,7 @@ package gov.noaa.nws.ncep.edex.common.sounding; * 12/16/2010 362 Chin Chen add support of BUFRUA observed sounding and PFC (NAM and GFS) model sounding data * 09/14/2011 457 S. Gurung Renamed ObsSndType.H5UAIR to ObsSndType.NCUAIR *10/06/2011 465 Archana Added a list of NcSoundingLayer2 objects to the sounding profile + * 02/15/2012 Chin Chen added fcsTime to support pfc sounding query * * * @author Chin Chen @@ -74,9 +75,9 @@ public class NcSoundingProfile implements ISerializableObject{ //@DynamicSerializeElement //private String stationId; @DynamicSerializeElement - private float stationLatitude; + private double stationLatitude; @DynamicSerializeElement - private float stationLongitude; + private double stationLongitude; @DynamicSerializeElement private float sfcPress; @@ -85,6 +86,9 @@ public class NcSoundingProfile implements ISerializableObject{ @DynamicSerializeElement private int stationNum; + + @DynamicSerializeElement + private long fcsTime; @DynamicSerializeElement private NcSoundingCube.QueryStatus rtnStatus = NcSoundingCube.QueryStatus.OK; @@ -114,6 +118,15 @@ public class NcSoundingProfile implements ISerializableObject{ this.stationNum = stnNum; } + + public long getFcsTime() { + return fcsTime; + } + + public void setFcsTime(long fcsTime) { + this.fcsTime = fcsTime; + } + public List getSoundingLyLst() { return soundingLyLst; } @@ -145,19 +158,19 @@ public class NcSoundingProfile implements ISerializableObject{ } - public float getStationLatitude() { + public double getStationLatitude() { return stationLatitude; } - public void setStationLatitude(float stationLatitude) { + public void setStationLatitude(double stationLatitude) { this.stationLatitude = stationLatitude; } - public float getStationLongitude() { + public double getStationLongitude() { return stationLongitude; } - public void setStationLongitude(float stationLongitude) { + public void setStationLongitude(double stationLongitude) { this.stationLongitude = stationLongitude; } diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingStnInfo.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingStnInfo.java index 063098cfc0..4a675a958f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingStnInfo.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingStnInfo.java @@ -41,9 +41,11 @@ public class NcSoundingStnInfo implements ISerializableObject{ @DynamicSerializeElement private float stationElevation; @DynamicSerializeElement - private float stationLatitude; + //private float stationLatitude; + private double stationLatitude; @DynamicSerializeElement - private float stationLongitude; + //private float stationLongitude; + private double stationLongitude; @DynamicSerializeElement private String stnId; @DynamicSerializeElement @@ -67,16 +69,16 @@ public class NcSoundingStnInfo implements ISerializableObject{ public void setStationElevation(float stationElevation) { this.stationElevation = stationElevation; } - public float getStationLatitude() { + public double getStationLatitude() { return stationLatitude; } - public void setStationLatitude(float stationLatitude) { + public void setStationLatitude(double stationLatitude) { this.stationLatitude = stationLatitude; } - public float getStationLongitude() { + public double getStationLongitude() { return stationLongitude; } - public void setStationLongitude(float stationLongitude) { + public void setStationLongitude(double stationLongitude) { this.stationLongitude = stationLongitude; } public String getStnId() { diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/IStationField.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/IStationField.java old mode 100644 new mode 100755 index f61765c1bd..1277e1931e --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/IStationField.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/IStationField.java @@ -1,19 +1,19 @@ -package gov.noaa.nws.ncep.edex.common.stationTables; - -public interface IStationField { - - public static enum StationField { - STID, // station id - STNM, // station number - NAME, // station name - ST, // state - CO, // country - //LAT, // latitude - //LON, // longitude - //ELV, // elevation - //PRI, // priority - WFO, // WFO - LOC // location - } - -} +package gov.noaa.nws.ncep.edex.common.stationTables; + +public interface IStationField { + + public static enum StationField { + STID, // station id + STNM, // station number + NAME, // station name + ST, // state + CO, // country + //LAT, // latitude + //LON, // longitude + //ELV, // elevation + //PRI, // priority + WFO, // WFO + LOC // location + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/ObjectFactory.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/ObjectFactory.java old mode 100644 new mode 100755 index b7c82ddfab..7fe56dbf70 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/ObjectFactory.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/ObjectFactory.java @@ -1,168 +1,168 @@ -// -// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 -// See http://java.sun.com/xml/jaxb -// Any modifications to this file will be lost upon recompilation of the source schema. -// Generated on: 2009.06.08 at 02:36:43 PM EDT -// - - -package gov.noaa.nws.ncep.edex.common.stationTables; - -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlElementDecl; -import javax.xml.bind.annotation.XmlRegistry; -import javax.xml.namespace.QName; - - -/** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the gov.noaa.nws.ncep.viz.common.stnTables package. - *

    An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are - * provided in this class. - * - */ -@XmlRegistry -public class ObjectFactory { - - private final static QName _Wfo_QNAME = new QName("", "wfo"); - private final static QName _Stid_QNAME = new QName("", "stid"); - private final static QName _Stnnum_QNAME = new QName("", "stnnum"); - private final static QName _Location_QNAME = new QName("", "location"); - private final static QName _Priority_QNAME = new QName("", "priority"); - private final static QName _Elevation_QNAME = new QName("", "elevation"); - private final static QName _State_QNAME = new QName("", "state"); - private final static QName _Longitude_QNAME = new QName("", "longitude"); - private final static QName _Stnname_QNAME = new QName("", "stnname"); - private final static QName _Latitude_QNAME = new QName("", "latitude"); - private final static QName _Country_QNAME = new QName("", "country"); - - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: gov.noaa.nws.ncep.viz.common.stnTables - * - */ - public ObjectFactory() { - } - - /** - * Create an instance of {@link StationList } - * - */ - public StationList createStationList() { - return new StationList(); - } - - /** - * Create an instance of {@link Station } - * - */ - public Station createStation() { - return new Station(); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "wfo") - public JAXBElement createWfo(String value) { - return new JAXBElement(_Wfo_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "stid") - public JAXBElement createStid(String value) { - return new JAXBElement(_Stid_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "stnnum") - public JAXBElement createStnnum(String value) { - return new JAXBElement(_Stnnum_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "location") - public JAXBElement createLocation(String value) { - return new JAXBElement(_Location_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "priority") - public JAXBElement createPriority(Integer value) { - return new JAXBElement(_Priority_QNAME, Integer.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "elevation") - public JAXBElement createElevation(Integer value) { - return new JAXBElement(_Elevation_QNAME, Integer.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "state") - public JAXBElement createState(String value) { - return new JAXBElement(_State_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "longitude") - public JAXBElement createLongitude(Float value) { - return new JAXBElement(_Longitude_QNAME, Float.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "stnname") - public JAXBElement createStnname(String value) { - return new JAXBElement(_Stnname_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "latitude") - public JAXBElement createLatitude(Float value) { - return new JAXBElement(_Latitude_QNAME, Float.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "country") - public JAXBElement createCountry(String value) { - return new JAXBElement(_Country_QNAME, String.class, null, value); - } - -} +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2009.06.08 at 02:36:43 PM EDT +// + + +package gov.noaa.nws.ncep.edex.common.stationTables; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the gov.noaa.nws.ncep.viz.common.stnTables package. + *

    An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _Wfo_QNAME = new QName("", "wfo"); + private final static QName _Stid_QNAME = new QName("", "stid"); + private final static QName _Stnnum_QNAME = new QName("", "stnnum"); + private final static QName _Location_QNAME = new QName("", "location"); + private final static QName _Priority_QNAME = new QName("", "priority"); + private final static QName _Elevation_QNAME = new QName("", "elevation"); + private final static QName _State_QNAME = new QName("", "state"); + private final static QName _Longitude_QNAME = new QName("", "longitude"); + private final static QName _Stnname_QNAME = new QName("", "stnname"); + private final static QName _Latitude_QNAME = new QName("", "latitude"); + private final static QName _Country_QNAME = new QName("", "country"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: gov.noaa.nws.ncep.viz.common.stnTables + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link StationList } + * + */ + public StationList createStationList() { + return new StationList(); + } + + /** + * Create an instance of {@link Station } + * + */ + public Station createStation() { + return new Station(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "wfo") + public JAXBElement createWfo(String value) { + return new JAXBElement(_Wfo_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "stid") + public JAXBElement createStid(String value) { + return new JAXBElement(_Stid_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "stnnum") + public JAXBElement createStnnum(String value) { + return new JAXBElement(_Stnnum_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "location") + public JAXBElement createLocation(String value) { + return new JAXBElement(_Location_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "priority") + public JAXBElement createPriority(Integer value) { + return new JAXBElement(_Priority_QNAME, Integer.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "elevation") + public JAXBElement createElevation(Integer value) { + return new JAXBElement(_Elevation_QNAME, Integer.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "state") + public JAXBElement createState(String value) { + return new JAXBElement(_State_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "longitude") + public JAXBElement createLongitude(Float value) { + return new JAXBElement(_Longitude_QNAME, Float.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "stnname") + public JAXBElement createStnname(String value) { + return new JAXBElement(_Stnname_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "latitude") + public JAXBElement createLatitude(Float value) { + return new JAXBElement(_Latitude_QNAME, Float.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "country") + public JAXBElement createCountry(String value) { + return new JAXBElement(_Country_QNAME, String.class, null, value); + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/Station.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/Station.java old mode 100644 new mode 100755 index 16e73c4d48..dd7a0f878d --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/Station.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/Station.java @@ -1,339 +1,339 @@ -// -// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 -// See http://java.sun.com/xml/jaxb -// Any modifications to this file will be lost upon recompilation of the source schema. -// Generated on: 2009.06.08 at 02:36:43 PM EDT -// - - -package gov.noaa.nws.ncep.edex.common.stationTables; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

    Java class for anonymous complex type. - * - *

    The following schema fragment specifies the expected content contained within this class. - * - *

    - * <complexType>
    - *   <complexContent>
    - *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    - *       <sequence>
    - *         <element ref="{}stid" minOccurs="0"/>
    - *         <element ref="{}stnnum" minOccurs="0"/>
    - *         <element ref="{}stnname" minOccurs="0"/>
    - *         <element ref="{}state" minOccurs="0"/>
    - *         <element ref="{}country" minOccurs="0"/>
    - *         <element ref="{}latitude" minOccurs="0"/>
    - *         <element ref="{}longitude" minOccurs="0"/>
    - *         <element ref="{}elevation" minOccurs="0"/>
    - *         <element ref="{}priority" minOccurs="0"/>
    - *         <element ref="{}location" minOccurs="0"/>
    - *         <element ref="{}wfo" minOccurs="0"/>
    - *       </sequence>
    - *     </restriction>
    - *   </complexContent>
    - * </complexType>
    - * 
    - * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "stid", - "stnnum", - "stnname", - "state", - "country", - "latitude", - "longitude", - "elevation", - "priority", - "location", - "wfo" -}) -@XmlRootElement(name = "station") -public class Station { - - protected String stid; - protected String stnnum; - protected String stnname; - protected String state; - protected String country; - protected Float latitude; - protected Float longitude; - protected Integer elevation; - protected Integer priority; - protected String location; - protected String wfo; - - /** - * Gets the value of the stid property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getStid() { - return stid; - } - - /** - * Sets the value of the stid property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setStid(String value) { - this.stid = value; - } - - /** - * Gets the value of the stnnum property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getStnnum() { - return stnnum; - } - - /** - * Sets the value of the stnnum property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setStnnum(String value) { - this.stnnum = value; - } - - /** - * Gets the value of the stnname property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getStnname() { - return stnname; - } - - /** - * Sets the value of the stnname property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setStnname(String value) { - this.stnname = value; - } - - /** - * Gets the value of the state property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getState() { - return state; - } - - /** - * Sets the value of the state property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setState(String value) { - this.state = value; - } - - /** - * Gets the value of the country property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getCountry() { - return country; - } - - /** - * Sets the value of the country property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setCountry(String value) { - this.country = value; - } - - /** - * Gets the value of the latitude property. - * - * @return - * possible object is - * {@link Float } - * - */ - public Float getLatitude() { - return latitude; - } - - /** - * Sets the value of the latitude property. - * - * @param value - * allowed object is - * {@link Float } - * - */ - public void setLatitude(Float value) { - this.latitude = value; - } - - /** - * Gets the value of the longitude property. - * - * @return - * possible object is - * {@link Float } - * - */ - public Float getLongitude() { - return longitude; - } - - /** - * Sets the value of the longitude property. - * - * @param value - * allowed object is - * {@link Float } - * - */ - public void setLongitude(Float value) { - this.longitude = value; - } - - /** - * Gets the value of the elevation property. - * - * @return - * possible object is - * {@link Integer } - * - */ - public Integer getElevation() { - return elevation; - } - - /** - * Sets the value of the elevation property. - * - * @param value - * allowed object is - * {@link Integer } - * - */ - public void setElevation(Integer value) { - this.elevation = value; - } - - /** - * Gets the value of the priority property. - * - * @return - * possible object is - * {@link Integer } - * - */ - public Integer getPriority() { - return priority; - } - - /** - * Sets the value of the priority property. - * - * @param value - * allowed object is - * {@link Integer } - * - */ - public void setPriority(Integer value) { - this.priority = value; - } - - /** - * Gets the value of the location property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getLocation() { - return location; - } - - /** - * Sets the value of the location property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setLocation(String value) { - this.location = value; - } - - /** - * Gets the value of the wfo property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getWfo() { - return wfo; - } - - /** - * Sets the value of the wfo property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setWfo(String value) { - this.wfo = value; - } - -} +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2009.06.08 at 02:36:43 PM EDT +// + + +package gov.noaa.nws.ncep.edex.common.stationTables; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

    Java class for anonymous complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType>
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element ref="{}stid" minOccurs="0"/>
    + *         <element ref="{}stnnum" minOccurs="0"/>
    + *         <element ref="{}stnname" minOccurs="0"/>
    + *         <element ref="{}state" minOccurs="0"/>
    + *         <element ref="{}country" minOccurs="0"/>
    + *         <element ref="{}latitude" minOccurs="0"/>
    + *         <element ref="{}longitude" minOccurs="0"/>
    + *         <element ref="{}elevation" minOccurs="0"/>
    + *         <element ref="{}priority" minOccurs="0"/>
    + *         <element ref="{}location" minOccurs="0"/>
    + *         <element ref="{}wfo" minOccurs="0"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "stid", + "stnnum", + "stnname", + "state", + "country", + "latitude", + "longitude", + "elevation", + "priority", + "location", + "wfo" +}) +@XmlRootElement(name = "station") +public class Station { + + protected String stid; + protected String stnnum; + protected String stnname; + protected String state; + protected String country; + protected Float latitude; + protected Float longitude; + protected Integer elevation; + protected Integer priority; + protected String location; + protected String wfo; + + /** + * Gets the value of the stid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStid() { + return stid; + } + + /** + * Sets the value of the stid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStid(String value) { + this.stid = value; + } + + /** + * Gets the value of the stnnum property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStnnum() { + return stnnum; + } + + /** + * Sets the value of the stnnum property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStnnum(String value) { + this.stnnum = value; + } + + /** + * Gets the value of the stnname property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStnname() { + return stnname; + } + + /** + * Sets the value of the stnname property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStnname(String value) { + this.stnname = value; + } + + /** + * Gets the value of the state property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getState() { + return state; + } + + /** + * Sets the value of the state property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setState(String value) { + this.state = value; + } + + /** + * Gets the value of the country property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCountry() { + return country; + } + + /** + * Sets the value of the country property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCountry(String value) { + this.country = value; + } + + /** + * Gets the value of the latitude property. + * + * @return + * possible object is + * {@link Float } + * + */ + public Float getLatitude() { + return latitude; + } + + /** + * Sets the value of the latitude property. + * + * @param value + * allowed object is + * {@link Float } + * + */ + public void setLatitude(Float value) { + this.latitude = value; + } + + /** + * Gets the value of the longitude property. + * + * @return + * possible object is + * {@link Float } + * + */ + public Float getLongitude() { + return longitude; + } + + /** + * Sets the value of the longitude property. + * + * @param value + * allowed object is + * {@link Float } + * + */ + public void setLongitude(Float value) { + this.longitude = value; + } + + /** + * Gets the value of the elevation property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public Integer getElevation() { + return elevation; + } + + /** + * Sets the value of the elevation property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setElevation(Integer value) { + this.elevation = value; + } + + /** + * Gets the value of the priority property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public Integer getPriority() { + return priority; + } + + /** + * Sets the value of the priority property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setPriority(Integer value) { + this.priority = value; + } + + /** + * Gets the value of the location property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLocation() { + return location; + } + + /** + * Sets the value of the location property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLocation(String value) { + this.location = value; + } + + /** + * Gets the value of the wfo property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getWfo() { + return wfo; + } + + /** + * Sets the value of the wfo property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setWfo(String value) { + this.wfo = value; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationComparator.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationComparator.java old mode 100644 new mode 100755 index 0a2a02e19c..ce509d026f --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationComparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationComparator.java @@ -1,61 +1,61 @@ -package gov.noaa.nws.ncep.edex.common.stationTables; - -import java.util.Comparator; - -/** - * Comparator for Station fields. - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 06/09		134  		M. Li	   Initial Creation
    - *                       
    - * 
    - * - * @author mli - * @version 1 - */ - -public class StationComparator implements Comparator, IStationField { - - private StationField field; - - public StationComparator(StationField f) { - this.field = f; - } - - public int compare(Station o1, Station o2) { - switch (field) { - case STID: - return o1.getStid().compareToIgnoreCase(o2.getStid()); - case STNM: - return o1.getStnnum().compareToIgnoreCase(o2.getStnnum()); - case NAME: - return o1.getStnnum().compareToIgnoreCase(o2.getStnnum()); - case ST: - return o1.getState().compareToIgnoreCase(o2.getState()); - case CO: - return o1.getCountry().compareToIgnoreCase(o2.getCountry()); - /* - case LAT: - return o1.getLatitude().compareTo(o2.getLatitude()); - case LON: - return o1.getLongitude().compareTo(o2.getLongitude()); - case ELV: - return o1.getElevation() - o2.getElevation(); - case PRI: - return o1.getPriority() - o2.getPriority(); - */ - case WFO: - return o1.getWfo().compareToIgnoreCase(o2.getWfo()); - case LOC: - return o1.getLocation().compareToIgnoreCase(o2.getLocation()); - - default: - return 0; - } - - } +package gov.noaa.nws.ncep.edex.common.stationTables; + +import java.util.Comparator; + +/** + * Comparator for Station fields. + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 06/09		134  		M. Li	   Initial Creation
    + *                       
    + * 
    + * + * @author mli + * @version 1 + */ + +public class StationComparator implements Comparator, IStationField { + + private StationField field; + + public StationComparator(StationField f) { + this.field = f; + } + + public int compare(Station o1, Station o2) { + switch (field) { + case STID: + return o1.getStid().compareToIgnoreCase(o2.getStid()); + case STNM: + return o1.getStnnum().compareToIgnoreCase(o2.getStnnum()); + case NAME: + return o1.getStnnum().compareToIgnoreCase(o2.getStnnum()); + case ST: + return o1.getState().compareToIgnoreCase(o2.getState()); + case CO: + return o1.getCountry().compareToIgnoreCase(o2.getCountry()); + /* + case LAT: + return o1.getLatitude().compareTo(o2.getLatitude()); + case LON: + return o1.getLongitude().compareTo(o2.getLongitude()); + case ELV: + return o1.getElevation() - o2.getElevation(); + case PRI: + return o1.getPriority() - o2.getPriority(); + */ + case WFO: + return o1.getWfo().compareToIgnoreCase(o2.getWfo()); + case LOC: + return o1.getLocation().compareToIgnoreCase(o2.getLocation()); + + default: + return 0; + } + + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationList.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationList.java old mode 100644 new mode 100755 index 6ea06463d4..e8826da29d --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationList.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationList.java @@ -1,76 +1,76 @@ -// -// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 -// See http://java.sun.com/xml/jaxb -// Any modifications to this file will be lost upon recompilation of the source schema. -// Generated on: 2009.06.08 at 02:36:43 PM EDT -// - - -package gov.noaa.nws.ncep.edex.common.stationTables; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

    Java class for anonymous complex type. - * - *

    The following schema fragment specifies the expected content contained within this class. - * - *

    - * <complexType>
    - *   <complexContent>
    - *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    - *       <sequence>
    - *         <element ref="{}station" maxOccurs="unbounded" minOccurs="0"/>
    - *       </sequence>
    - *     </restriction>
    - *   </complexContent>
    - * </complexType>
    - * 
    - * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "station" -}) -@XmlRootElement(name = "stationList") -public class StationList { - - protected List station; - - /** - * Gets the value of the station property. - * - *

    - * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the station property. - * - *

    - * For example, to add a new item, do as follows: - *

    -     *    getStation().add(newItem);
    -     * 
    - * - * - *

    - * Objects of the following type(s) are allowed in the list - * {@link Station } - * - * - */ - public List getStation() { - if (station == null) { - station = new ArrayList(); - } - return this.station; - } - -} +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2009.06.08 at 02:36:43 PM EDT +// + + +package gov.noaa.nws.ncep.edex.common.stationTables; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

    Java class for anonymous complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType>
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element ref="{}station" maxOccurs="unbounded" minOccurs="0"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "station" +}) +@XmlRootElement(name = "stationList") +public class StationList { + + protected List station; + + /** + * Gets the value of the station property. + * + *

    + * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the station property. + * + *

    + * For example, to add a new item, do as follows: + *

    +     *    getStation().add(newItem);
    +     * 
    + * + * + *

    + * Objects of the following type(s) are allowed in the list + * {@link Station } + * + * + */ + public List getStation() { + if (station == null) { + station = new ArrayList(); + } + return this.station; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationTable.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationTable.java old mode 100644 new mode 100755 index 99fa8b3ddf..432fed382e --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationTable.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/stationTables/StationTable.java @@ -1,91 +1,91 @@ -package gov.noaa.nws.ncep.edex.common.stationTables; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.Collections; +package gov.noaa.nws.ncep.edex.common.stationTables; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; -import java.util.List; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.index.quadtree.Quadtree; import org.geotools.referencing.GeodeticCalculator; -/** - * This class reads a station table from an xml file and contains a list of stations. - * This class also provide general station search functions given station field, and - * field value. - * - *

    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 06/09  		?    	   	B. Yin   Initial Creation
    - * 06/09		134			M. Li		Add station search
    +/**
    + * This class reads a station table from an xml file and contains a list of stations.
    + * This class also provide general station search functions given station field, and
    + * field value.
    + * 
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 06/09  		?    	   	B. Yin   Initial Creation
    + * 06/09		134			M. Li		Add station search
      * 10/09        39/87/114   L. Lin   Make "last" as private StationField.
      * 12/09		159			B. Yin	 Add getNearestStation(...)
    - *                       
    - * 
    - * - * @author bingfan - * @version 1 - */ - -public class StationTable implements IStationField { - - private final String PACKAGE = "gov.noaa.nws.ncep.edex.common.stationTables"; - - private List stationList; - + * + *
    + * + * @author bingfan + * @version 1 + */ + +public class StationTable implements IStationField { + + private final String PACKAGE = "gov.noaa.nws.ncep.edex.common.stationTables"; + + private List stationList; + private StationField last = null; private Quadtree stTree = null; private final double DIST = 1.0; - - /** - * Constructor. - * @param tableFileName - full path of the xml table file - */ - public StationTable( String tableFileName ) { - - try{ - stationList = readStationTable( tableFileName ); - } - catch ( JAXBException exp ){ - stationList = null; - exp.printStackTrace(); - } - - } - - /** - * Reads the contents of the input station table file - * @param xmlFilename - full path of the xml table name - * @return - a list of stations - * @throws JAXBException - */ - private List readStationTable( String xmlFilename ) throws JAXBException{ - - File xmlFile = new File(xmlFilename); - - JAXBContext context = JAXBContext.newInstance( - PACKAGE); - Unmarshaller unmarshaller = context.createUnmarshaller(); - StationList stns = null; - - try { - stns = (StationList)unmarshaller.unmarshal( - new FileReader(xmlFile)); - List listOfItems = stns.getStation(); + + /** + * Constructor. + * @param tableFileName - full path of the xml table file + */ + public StationTable( String tableFileName ) { + + try{ + stationList = readStationTable( tableFileName ); + } + catch ( JAXBException exp ){ + stationList = null; + exp.printStackTrace(); + } + + } + + /** + * Reads the contents of the input station table file + * @param xmlFilename - full path of the xml table name + * @return - a list of stations + * @throws JAXBException + */ + private List readStationTable( String xmlFilename ) throws JAXBException{ + + File xmlFile = new File(xmlFilename); + + JAXBContext context = JAXBContext.newInstance( + PACKAGE); + Unmarshaller unmarshaller = context.createUnmarshaller(); + StationList stns = null; + + try { + stns = (StationList)unmarshaller.unmarshal( + new FileReader(xmlFile)); + List listOfItems = stns.getStation(); /* * save stations in a Quadtree for efficient spatial query @@ -97,136 +97,136 @@ public class StationTable implements IStationField { stTree.insert(env, st); } - return listOfItems; - - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - - } catch (NullPointerException e2) { - e2.printStackTrace(); - } - - return null; - - } - - /** - * Gets the list of the stations - * @return - the list of stations - */ - public List getStationList(){ - - return stationList; - - } - - /** - * Search a station given a field, and search key value. - * - * @param sf - * @param key - * @return Station - */ - public Station getStation(StationField sf, String key) { - if (stationList == null || stationList.isEmpty()) return null; - - StationComparator comparator = new StationComparator(sf); - if (last == null || (last != null && last != sf )) { - Collections.sort(stationList, comparator); - last = sf; - } - - Station s = getComparedStation(sf, key); - int index = Collections.binarySearch(stationList, s, comparator); - - if (index >= 0){ - return stationList.get(index); - } else - return null; - } - - /** - * Search station list given a field, and search key value. - * - * @param sf - * @param key - * @return Station - */ - public List getStations(StationField sf, String key) { - if (stationList == null || stationList.isEmpty()) return null; - - StationComparator comparator = new StationComparator(sf); - if (last == null || (last != null && last != sf )) { - Collections.sort(stationList, comparator); - last = sf; - } - - List list = new ArrayList(); - - Station s = getComparedStation(sf, key); - int index; - while ((index = Collections.binarySearch(stationList, s, comparator)) >= 0) { - list.add(stationList.get(index)); - stationList.remove(index); - } - - if (list.size() > 0) { - for (Station st : list) { - stationList.add(st); - } - - last = null; - return list; - } - else { - return null; - } - } - - - private Station getComparedStation(StationField sf, String key){ - Station station = new Station(); - switch (sf) { - case STID: - station.setStid((String)key); - break; - case STNM: - station.setStnnum((String)key); - break; - case NAME: - station.setStnname((String)key); - break; - case ST: - station.setState((String)key); - break; - case CO: - station.setCountry((String)key); - break; - /* - case LAT: - station.setLatitude((Float)key); - break; - case LON: - station.setLongitude((Float)key); - break; - case ELV: - station.setElevation((Integer)key); - break; - case PRI: - station.setPriority((Integer)key); - break; - */ - case WFO: - station.setWfo((String)key); - break; - case LOC: - station.setLocation((String)key); - break; - } - - return station; - } - + return listOfItems; + + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + + } catch (NullPointerException e2) { + e2.printStackTrace(); + } + + return null; + + } + + /** + * Gets the list of the stations + * @return - the list of stations + */ + public List getStationList(){ + + return stationList; + + } + + /** + * Search a station given a field, and search key value. + * + * @param sf + * @param key + * @return Station + */ + public Station getStation(StationField sf, String key) { + if (stationList == null || stationList.isEmpty()) return null; + + StationComparator comparator = new StationComparator(sf); + if (last == null || (last != null && last != sf )) { + Collections.sort(stationList, comparator); + last = sf; + } + + Station s = getComparedStation(sf, key); + int index = Collections.binarySearch(stationList, s, comparator); + + if (index >= 0){ + return stationList.get(index); + } else + return null; + } + + /** + * Search station list given a field, and search key value. + * + * @param sf + * @param key + * @return Station + */ + public List getStations(StationField sf, String key) { + if (stationList == null || stationList.isEmpty()) return null; + + StationComparator comparator = new StationComparator(sf); + if (last == null || (last != null && last != sf )) { + Collections.sort(stationList, comparator); + last = sf; + } + + List list = new ArrayList(); + + Station s = getComparedStation(sf, key); + int index; + while ((index = Collections.binarySearch(stationList, s, comparator)) >= 0) { + list.add(stationList.get(index)); + stationList.remove(index); + } + + if (list.size() > 0) { + for (Station st : list) { + stationList.add(st); + } + + last = null; + return list; + } + else { + return null; + } + } + + + private Station getComparedStation(StationField sf, String key){ + Station station = new Station(); + switch (sf) { + case STID: + station.setStid((String)key); + break; + case STNM: + station.setStnnum((String)key); + break; + case NAME: + station.setStnname((String)key); + break; + case ST: + station.setState((String)key); + break; + case CO: + station.setCountry((String)key); + break; + /* + case LAT: + station.setLatitude((Float)key); + break; + case LON: + station.setLongitude((Float)key); + break; + case ELV: + station.setElevation((Integer)key); + break; + case PRI: + station.setPriority((Integer)key); + break; + */ + case WFO: + station.setWfo((String)key); + break; + case LOC: + station.setLocation((String)key); + break; + } + + return station; + } + /** * Get the nearest station from the input location * @param loc diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocs.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocs.java old mode 100644 new mode 100755 index 3aea9f3dc8..46c89085f1 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocs.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocs.java @@ -1,78 +1,78 @@ -// -// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 -// See http://java.sun.com/xml/jaxb -// Any modifications to this file will be lost upon recompilation of the source schema. -// Generated on: 2009.05.05 at 04:38:50 PM EDT -// - - -package gov.noaa.nws.ncep.edex.locations; - -import java.util.ArrayList; -import java.util.List; -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.XmlType; - - -/** - *

    Java class for anonymous complex type. - * - *

    The following schema fragment specifies the expected content contained within this class. - * - *

    - * <complexType>
    - *   <complexContent>
    - *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    - *       <sequence>
    - *         <element ref="{}idftPoint" maxOccurs="unbounded"/>
    - *       </sequence>
    - *     </restriction>
    - *   </complexContent>
    - * </complexType>
    - * 
    - * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "idftPoint" -}) -@XmlRootElement(name = "idftLocs") -public class IdftLocs { - - @XmlElement(required = true) - protected List idftPoint; - - /** - * Gets the value of the idftPoint property. - * - *

    - * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the idftPoint property. - * - *

    - * For example, to add a new item, do as follows: - *

    -     *    getIdftPoint().add(newItem);
    -     * 
    - * - * - *

    - * Objects of the following type(s) are allowed in the list - * {@link IdftPoint } - * - * - */ - public List getIdftPoint() { - if (idftPoint == null) { - idftPoint = new ArrayList(); - } - return this.idftPoint; - } - -} +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2009.05.05 at 04:38:50 PM EDT +// + + +package gov.noaa.nws.ncep.edex.locations; + +import java.util.ArrayList; +import java.util.List; +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.XmlType; + + +/** + *

    Java class for anonymous complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType>
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element ref="{}idftPoint" maxOccurs="unbounded"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "idftPoint" +}) +@XmlRootElement(name = "idftLocs") +public class IdftLocs { + + @XmlElement(required = true) + protected List idftPoint; + + /** + * Gets the value of the idftPoint property. + * + *

    + * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the idftPoint property. + * + *

    + * For example, to add a new item, do as follows: + *

    +     *    getIdftPoint().add(newItem);
    +     * 
    + * + * + *

    + * Objects of the following type(s) are allowed in the list + * {@link IdftPoint } + * + * + */ + public List getIdftPoint() { + if (idftPoint == null) { + idftPoint = new ArrayList(); + } + return this.idftPoint; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocsTableReader.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocsTableReader.java old mode 100644 new mode 100755 index e3429521c6..b4b274938d --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocsTableReader.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftLocsTableReader.java @@ -1,71 +1,71 @@ -/** - * This function reads the Idft Point Location Table from idftLoc.xml - * and unmarshall it. - * - *

    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 14May2009  	98    	   F. J. Yen   Initial Creation
    - *                       
    - * 
    - * - * @author Fee Jing Yen, SIB - * @version 1 - */ -package gov.noaa.nws.ncep.edex.locations; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.List; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - -public class IdftLocsTableReader { - - - private final String PACKAGE = "gov.noaa.nws.ncep.edex.locations"; - - private String xmlFilename = null; - - public IdftLocsTableReader(String file) { - /* - * file is the full name including the path for the - * idft point location xml file, idftLoc.xml - */ - - xmlFilename = file; - } - - public List getIdftLocsTable() throws JAXBException{ - - File xmlFile = new File(xmlFilename); - - JAXBContext context = JAXBContext.newInstance( - PACKAGE); - Unmarshaller unmarshaller = context.createUnmarshaller(); - IdftLocs loc = null; - - try { - loc = (IdftLocs)unmarshaller.unmarshal( - new FileReader(xmlFile)); - List listOfItems = loc.getIdftPoint(); - return listOfItems; - - } catch (FileNotFoundException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - - } catch (NullPointerException e2) { - e2.printStackTrace(); - } - - return null; - - } +/** + * This function reads the Idft Point Location Table from idftLoc.xml + * and unmarshall it. + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 14May2009  	98    	   F. J. Yen   Initial Creation
    + *                       
    + * 
    + * + * @author Fee Jing Yen, SIB + * @version 1 + */ +package gov.noaa.nws.ncep.edex.locations; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + +public class IdftLocsTableReader { + + + private final String PACKAGE = "gov.noaa.nws.ncep.edex.locations"; + + private String xmlFilename = null; + + public IdftLocsTableReader(String file) { + /* + * file is the full name including the path for the + * idft point location xml file, idftLoc.xml + */ + + xmlFilename = file; + } + + public List getIdftLocsTable() throws JAXBException{ + + File xmlFile = new File(xmlFilename); + + JAXBContext context = JAXBContext.newInstance( + PACKAGE); + Unmarshaller unmarshaller = context.createUnmarshaller(); + IdftLocs loc = null; + + try { + loc = (IdftLocs)unmarshaller.unmarshal( + new FileReader(xmlFile)); + List listOfItems = loc.getIdftPoint(); + return listOfItems; + + } catch (FileNotFoundException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + + } catch (NullPointerException e2) { + e2.printStackTrace(); + } + + return null; + + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftPoint.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftPoint.java old mode 100644 new mode 100755 index 89e90b5324..a8db5002d7 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftPoint.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/IdftPoint.java @@ -1,203 +1,203 @@ -// -// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 -// See http://java.sun.com/xml/jaxb -// Any modifications to this file will be lost upon recompilation of the source schema. -// Generated on: 2009.05.05 at 04:38:50 PM EDT -// - - -package gov.noaa.nws.ncep.edex.locations; - -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.XmlType; - - -/** - *

    Java class for anonymous complex type. - * - *

    The following schema fragment specifies the expected content contained within this class. - * - *

    - * <complexType>
    - *   <complexContent>
    - *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    - *       <sequence>
    - *         <element ref="{}stid"/>
    - *         <element ref="{}stnnum"/>
    - *         <element ref="{}stnname"/>
    - *         <element ref="{}latitude"/>
    - *         <element ref="{}longitude"/>
    - *         <element ref="{}elevation"/>
    - *         <element ref="{}priority"/>
    - *       </sequence>
    - *     </restriction>
    - *   </complexContent>
    - * </complexType>
    - * 
    - * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "stid", - "stnnum", - "stnname", - "latitude", - "longitude", - "elevation", - "priority" -}) -@XmlRootElement(name = "idftPoint") -public class IdftPoint { - - @XmlElement(required = true) - protected String stid; - @XmlElement(required = true) - protected String stnnum; - @XmlElement(required = true) - protected String stnname; - protected float latitude; - protected float longitude; - protected int elevation; - protected int priority; - - /** - * Gets the value of the stid property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getStid() { - return stid; - } - - /** - * Sets the value of the stid property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setStid(String value) { - this.stid = value; - } - - /** - * Gets the value of the stnnum property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getStnnum() { - return stnnum; - } - - /** - * Sets the value of the stnnum property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setStnnum(String value) { - this.stnnum = value; - } - - /** - * Gets the value of the stnname property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getStnname() { - return stnname; - } - - /** - * Sets the value of the stnname property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setStnname(String value) { - this.stnname = value; - } - - /** - * Gets the value of the latitude property. - * - */ - public float getLatitude() { - return latitude; - } - - /** - * Sets the value of the latitude property. - * - */ - public void setLatitude(float value) { - this.latitude = value; - } - - /** - * Gets the value of the longitude property. - * - */ - public float getLongitude() { - return longitude; - } - - /** - * Sets the value of the longitude property. - * - */ - public void setLongitude(float value) { - this.longitude = value; - } - - /** - * Gets the value of the elevation property. - * - */ - public int getElevation() { - return elevation; - } - - /** - * Sets the value of the elevation property. - * - */ - public void setElevation(int value) { - this.elevation = value; - } - - /** - * Gets the value of the priority property. - * - */ - public int getPriority() { - return priority; - } - - /** - * Sets the value of the priority property. - * - */ - public void setPriority(int value) { - this.priority = value; - } - -} +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2009.05.05 at 04:38:50 PM EDT +// + + +package gov.noaa.nws.ncep.edex.locations; + +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.XmlType; + + +/** + *

    Java class for anonymous complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType>
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element ref="{}stid"/>
    + *         <element ref="{}stnnum"/>
    + *         <element ref="{}stnname"/>
    + *         <element ref="{}latitude"/>
    + *         <element ref="{}longitude"/>
    + *         <element ref="{}elevation"/>
    + *         <element ref="{}priority"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "stid", + "stnnum", + "stnname", + "latitude", + "longitude", + "elevation", + "priority" +}) +@XmlRootElement(name = "idftPoint") +public class IdftPoint { + + @XmlElement(required = true) + protected String stid; + @XmlElement(required = true) + protected String stnnum; + @XmlElement(required = true) + protected String stnname; + protected float latitude; + protected float longitude; + protected int elevation; + protected int priority; + + /** + * Gets the value of the stid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStid() { + return stid; + } + + /** + * Sets the value of the stid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStid(String value) { + this.stid = value; + } + + /** + * Gets the value of the stnnum property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStnnum() { + return stnnum; + } + + /** + * Sets the value of the stnnum property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStnnum(String value) { + this.stnnum = value; + } + + /** + * Gets the value of the stnname property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStnname() { + return stnname; + } + + /** + * Sets the value of the stnname property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStnname(String value) { + this.stnname = value; + } + + /** + * Gets the value of the latitude property. + * + */ + public float getLatitude() { + return latitude; + } + + /** + * Sets the value of the latitude property. + * + */ + public void setLatitude(float value) { + this.latitude = value; + } + + /** + * Gets the value of the longitude property. + * + */ + public float getLongitude() { + return longitude; + } + + /** + * Sets the value of the longitude property. + * + */ + public void setLongitude(float value) { + this.longitude = value; + } + + /** + * Gets the value of the elevation property. + * + */ + public int getElevation() { + return elevation; + } + + /** + * Sets the value of the elevation property. + * + */ + public void setElevation(int value) { + this.elevation = value; + } + + /** + * Gets the value of the priority property. + * + */ + public int getPriority() { + return priority; + } + + /** + * Sets the value of the priority property. + * + */ + public void setPriority(int value) { + this.priority = value; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/ObjectFactory.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/ObjectFactory.java old mode 100644 new mode 100755 index a57f13ba18..7c3ff7312e --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/ObjectFactory.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/ObjectFactory.java @@ -1,128 +1,128 @@ -// -// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 -// See http://java.sun.com/xml/jaxb -// Any modifications to this file will be lost upon recompilation of the source schema. -// Generated on: 2009.05.05 at 04:38:50 PM EDT -// - - -package gov.noaa.nws.ncep.edex.locations; - -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlElementDecl; -import javax.xml.bind.annotation.XmlRegistry; -import javax.xml.namespace.QName; - - -/** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the generated package. - *

    An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are - * provided in this class. - * - */ -@XmlRegistry -public class ObjectFactory { - - private final static QName _Stid_QNAME = new QName("", "stid"); - private final static QName _Stnnum_QNAME = new QName("", "stnnum"); - private final static QName _Priority_QNAME = new QName("", "priority"); - private final static QName _Elevation_QNAME = new QName("", "elevation"); - private final static QName _Longitude_QNAME = new QName("", "longitude"); - private final static QName _Stnname_QNAME = new QName("", "stnname"); - private final static QName _Latitude_QNAME = new QName("", "latitude"); - - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: generated - * - */ - public ObjectFactory() { - } - - /** - * Create an instance of {@link IdftLocs } - * - */ - public IdftLocs createIdftLocs() { - return new IdftLocs(); - } - - /** - * Create an instance of {@link IdftPoint } - * - */ - public IdftPoint createIdftPoint() { - return new IdftPoint(); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "stid") - public JAXBElement createStid(String value) { - return new JAXBElement(_Stid_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "stnnum") - public JAXBElement createStnnum(String value) { - return new JAXBElement(_Stnnum_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "priority") - public JAXBElement createPriority(Integer value) { - return new JAXBElement(_Priority_QNAME, Integer.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "elevation") - public JAXBElement createElevation(Integer value) { - return new JAXBElement(_Elevation_QNAME, Integer.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "longitude") - public JAXBElement createLongitude(Float value) { - return new JAXBElement(_Longitude_QNAME, Float.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "stnname") - public JAXBElement createStnname(String value) { - return new JAXBElement(_Stnname_QNAME, String.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} - * - */ - @XmlElementDecl(namespace = "", name = "latitude") - public JAXBElement createLatitude(Float value) { - return new JAXBElement(_Latitude_QNAME, Float.class, null, value); - } - -} +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2009.05.05 at 04:38:50 PM EDT +// + + +package gov.noaa.nws.ncep.edex.locations; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the generated package. + *

    An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _Stid_QNAME = new QName("", "stid"); + private final static QName _Stnnum_QNAME = new QName("", "stnnum"); + private final static QName _Priority_QNAME = new QName("", "priority"); + private final static QName _Elevation_QNAME = new QName("", "elevation"); + private final static QName _Longitude_QNAME = new QName("", "longitude"); + private final static QName _Stnname_QNAME = new QName("", "stnname"); + private final static QName _Latitude_QNAME = new QName("", "latitude"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: generated + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link IdftLocs } + * + */ + public IdftLocs createIdftLocs() { + return new IdftLocs(); + } + + /** + * Create an instance of {@link IdftPoint } + * + */ + public IdftPoint createIdftPoint() { + return new IdftPoint(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "stid") + public JAXBElement createStid(String value) { + return new JAXBElement(_Stid_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "stnnum") + public JAXBElement createStnnum(String value) { + return new JAXBElement(_Stnnum_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "priority") + public JAXBElement createPriority(Integer value) { + return new JAXBElement(_Priority_QNAME, Integer.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Integer }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "elevation") + public JAXBElement createElevation(Integer value) { + return new JAXBElement(_Elevation_QNAME, Integer.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "longitude") + public JAXBElement createLongitude(Float value) { + return new JAXBElement(_Longitude_QNAME, Float.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "stnname") + public JAXBElement createStnname(String value) { + return new JAXBElement(_Stnname_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Float }{@code >}} + * + */ + @XmlElementDecl(namespace = "", name = "latitude") + public JAXBElement createLatitude(Float value) { + return new JAXBElement(_Latitude_QNAME, Float.class, null, value); + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/package-info.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/package-info.java old mode 100644 new mode 100755 index d13910d183..d41b4dd232 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains supporting and test methods for reading and unmarshalling idftLocs.tbl -*/ -package gov.noaa.nws.ncep.edex.locations; +/** +* Contains supporting and test methods for reading and unmarshalling idftLocs.tbl +*/ +package gov.noaa.nws.ncep.edex.locations; diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/test_IdftLocsTableReader.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/test_IdftLocsTableReader.java old mode 100644 new mode 100755 index 84eef8c9ea..028a36dd72 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/test_IdftLocsTableReader.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/locations/test_IdftLocsTableReader.java @@ -1,51 +1,51 @@ -/** - * This function tests the Idft Point Location Table Reader, IdftLocsTableReader - * by printing out all the elements in the XML file. It also gets the first and - * last element from the list and prints them out - *

    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 12May2009  	98    	   F. J. Yen   Initial Creation
    - *                       
    - * 
    - * - * @author Fee Jing Yen, SIB - * @version 1 - */ -package gov.noaa.nws.ncep.edex.locations; - -import java.util.List; - -public class test_IdftLocsTableReader { - - public static void main(String args[]) throws Exception{ - String idftLocsXmlName = "../build.edex/esb/data/utility/edex_static/base/ncep/stns/idftLoc.xml"; - IdftLocsTableReader myloc = new IdftLocsTableReader (idftLocsXmlName); - List list = myloc.getIdftLocsTable(); - for(IdftPoint itm : list){ - System.out.println( - " Stid = " + itm.getStid() + - " Stnnum= " + itm.getStnnum() + - " Stnname = " + itm.getStnname() + - " Latitude = " + itm.getLatitude() + - " Longitude =" + itm.getLongitude() + - " Elevation =" + itm.getElevation() + - " Priortiy =" + itm.getPriority() ); - } - // Get the first and last elements of the list and print them along with the list size - System.out.println(" Stid(0)=" + list.get(0).stid - + " Stnnum(0) = " + list.get(0).stnnum - + " Stnname(0) = " + list.get(0).stnname - + " Latitude(0) = " + list.get(0).latitude - + " Longitude(0) = " + list.get(0).longitude - + "\n Stid(206) = " + list.get(206).stid - + " Stnnum(206) = " + list.get(206).stnnum - + " Stnname(206) = " + list.get(206).stnname - + " Latitude(206) = " + list.get(206).latitude - + " Longitude(206) = " + list.get(206).longitude - + "\n size = " + list.size()); - } -} +/** + * This function tests the Idft Point Location Table Reader, IdftLocsTableReader + * by printing out all the elements in the XML file. It also gets the first and + * last element from the list and prints them out + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 12May2009  	98    	   F. J. Yen   Initial Creation
    + *                       
    + * 
    + * + * @author Fee Jing Yen, SIB + * @version 1 + */ +package gov.noaa.nws.ncep.edex.locations; + +import java.util.List; + +public class test_IdftLocsTableReader { + + public static void main(String args[]) throws Exception{ + String idftLocsXmlName = "../build.edex/esb/data/utility/edex_static/base/ncep/stns/idftLoc.xml"; + IdftLocsTableReader myloc = new IdftLocsTableReader (idftLocsXmlName); + List list = myloc.getIdftLocsTable(); + for(IdftPoint itm : list){ + System.out.println( + " Stid = " + itm.getStid() + + " Stnnum= " + itm.getStnnum() + + " Stnname = " + itm.getStnname() + + " Latitude = " + itm.getLatitude() + + " Longitude =" + itm.getLongitude() + + " Elevation =" + itm.getElevation() + + " Priortiy =" + itm.getPriority() ); + } + // Get the first and last elements of the list and print them along with the list size + System.out.println(" Stid(0)=" + list.get(0).stid + + " Stnnum(0) = " + list.get(0).stnnum + + " Stnname(0) = " + list.get(0).stnname + + " Latitude(0) = " + list.get(0).latitude + + " Longitude(0) = " + list.get(0).longitude + + "\n Stid(206) = " + list.get(206).stid + + " Stnnum(206) = " + list.get(206).stnnum + + " Stnname(206) = " + list.get(206).stnname + + " Latitude(206) = " + list.get(206).latitude + + " Longitude(206) = " + list.get(206).longitude + + "\n size = " + list.size()); + } +} 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 old mode 100644 new mode 100755 index ac74fc8dbc..84cc63656f --- 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 @@ -1,182 +1,182 @@ -/** - * LatLonLocTbl - A Java class to define some known VORs and Intlsig talbes - * used to define convective/nonconvective/airmet/intl SIGMET locations. - * - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 12 Jun 2009 95/132 B. Hebbard Initial creation. - * 10 Sep 2009 39/87/114 L. Lin Remove the temporary enum - * and add xml for VORs and - * Intlsig gempak tables. - * 30 Sep 2009 3102 jkorman Changed printlns to logging statements. - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ -package gov.noaa.nws.ncep.edex.tools.decoder; - -import static com.raytheon.uf.common.localization.LocalizationContext.LocalizationType.EDEX_STATIC; -import gov.noaa.nws.ncep.edex.common.stationTables.IStationField.StationField; -import gov.noaa.nws.ncep.edex.common.stationTables.Station; -import gov.noaa.nws.ncep.edex.common.stationTables.StationTable; - -import java.io.File; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -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.PathManagerFactory; -import com.raytheon.uf.edex.decodertools.core.LatLonPoint; - -public class LatLonLocTbl { - private static Log logger = LogFactory.getLog(LatLonLocTbl.class); - - static StationTable vorsloc = null; - - static StationTable intlsigloc = null; - - static StationTable myloc = null; - - private double latitude; - - private double longitude; - - private LatLonLocTbl(double latitude, double longitude) { - this.latitude = latitude; - this.longitude = longitude; - } - - public static void readLocTable(String tableName) throws Exception { - - final String NCEP_DIR = "ncep"; - final String stnsDir = "stns"; - final String vorsLocTableName = "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, ""); - if (tableName == "vors") { - stnsFileName = baseDir + File.separator + stnsDir + File.separator - + vorsLocTableName; - } - logger.debug(" stnsFileName=" + stnsFileName); - myloc = new StationTable(stnsFileName); - - } - - public double getLatitude() { - return latitude; - } - - public double getLongitude() { - return longitude; - } - - public LatLonPoint getLatLonPoint() { - return new LatLonPoint(latitude, longitude, LatLonPoint.INDEGREES); - } - - private enum Direction { - N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW; - public double getDegrees() { - return ordinal() * 22.5; - } - } - - private static final double ONE_NM_RADIANS = Math.toRadians(1.0 / 60.0); - - /** - * Given a relative reference string, returns a LatLonPoint - * (com.raytheon.uf.edex.decodertools.core.LatLonPoint). - * - * @param location - * A String such as... "BOS" "20S EMI" "30 WNW BUM" " 40ENE HUH " - * ...referencing a VOR listed in AC 00-45F (Appendix F), - * optionally preceded by distance in nautical miles and 16-point - * compass direction string. - * @param locTable - * A string such as "vors" referring to "vors" location table or - * "intlsig" referring to intl location table - * @return The decoded location as a LatLonPoint; null on error (such as - * unrecognized VOR identifier or direction string). - * - */ - public static LatLonPoint getLatLonPoint(String location, String locTable) { - LatLonPoint point = null; - Station vor = null; - // Wrap decoding in a try block, in case of exception on - // one of the xml or direction enum, or other problems. - - try { - location = location.trim(); - - // VOR is always last 3 nonblank char of location - String navaid = location.substring(location.length() - 3); - - // Read in the location table XML if not exists - if (myloc == null) { - readLocTable(locTable); - logger.debug(" - read vors.xml to cache"); - } - // Search station ID and return whole station record - if (myloc != null) { - logger.debug(" - navaid = " + navaid); - vor = myloc.getStation(StationField.STID, navaid); - } else { - logger.debug(" - myloc is null"); - } - - // Get LatLonPoint from lat/lon - if (vor != null) { - point = new LatLonPoint(vor.getLatitude(), vor.getLongitude(), - LatLonPoint.INDEGREES); - } else { - logger.debug(" - DID NOT find station ID in vors.xml"); - } - - // If there's an offset direction/bearing, process it - if (location.length() > 3) { - String u = location.substring(0, location.length() - 3); - - Pattern p = Pattern.compile("^([0-9]+)\\s*([A-Z]+)"); - Matcher m = p.matcher(u); - if (m.find()) { - String distanceStr = m.group(1); - - String bearingStr = m.group(2); - - int distanceNM = Integer.parseInt(distanceStr); - - double distanceRad = distanceNM * ONE_NM_RADIANS; - // LatLonPoint.positionOf thinks bearing is CCW, not CW... - double bearingDeg = 360.0 - Direction.valueOf(bearingStr) - .getDegrees(); - double bearingRad = Math.toRadians(bearingDeg); - point = point.positionOf(bearingRad, distanceRad); - logger.debug(" - get a good latlon point"); - } - } - return point; - } catch (Exception e) { - logger.error("[Error decoding location in LatLonLocTbl: " - + location + "]"); - return null; - } - } - -} +/** + * LatLonLocTbl - A Java class to define some known VORs and Intlsig talbes + * used to define convective/nonconvective/airmet/intl SIGMET locations. + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 12 Jun 2009 95/132 B. Hebbard Initial creation. + * 10 Sep 2009 39/87/114 L. Lin Remove the temporary enum + * and add xml for VORs and + * Intlsig gempak tables. + * 30 Sep 2009 3102 jkorman Changed printlns to logging statements. + * + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ +package gov.noaa.nws.ncep.edex.tools.decoder; + +import static com.raytheon.uf.common.localization.LocalizationContext.LocalizationType.EDEX_STATIC; +import gov.noaa.nws.ncep.edex.common.stationTables.IStationField.StationField; +import gov.noaa.nws.ncep.edex.common.stationTables.Station; +import gov.noaa.nws.ncep.edex.common.stationTables.StationTable; + +import java.io.File; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +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.PathManagerFactory; +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; + +public class LatLonLocTbl { + private static Log logger = LogFactory.getLog(LatLonLocTbl.class); + + static StationTable vorsloc = null; + + static StationTable intlsigloc = null; + + static StationTable myloc = null; + + private double latitude; + + private double longitude; + + private LatLonLocTbl(double latitude, double longitude) { + this.latitude = latitude; + this.longitude = longitude; + } + + public static void readLocTable(String tableName) throws Exception { + + final String NCEP_DIR = "ncep"; + final String stnsDir = "stns"; + final String vorsLocTableName = "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, ""); + if (tableName == "vors") { + stnsFileName = baseDir + File.separator + stnsDir + File.separator + + vorsLocTableName; + } + logger.debug(" stnsFileName=" + stnsFileName); + myloc = new StationTable(stnsFileName); + + } + + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + + public LatLonPoint getLatLonPoint() { + return new LatLonPoint(latitude, longitude, LatLonPoint.INDEGREES); + } + + private enum Direction { + N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW; + public double getDegrees() { + return ordinal() * 22.5; + } + } + + private static final double ONE_NM_RADIANS = Math.toRadians(1.0 / 60.0); + + /** + * Given a relative reference string, returns a LatLonPoint + * (com.raytheon.uf.edex.decodertools.core.LatLonPoint). + * + * @param location + * A String such as... "BOS" "20S EMI" "30 WNW BUM" " 40ENE HUH " + * ...referencing a VOR listed in AC 00-45F (Appendix F), + * optionally preceded by distance in nautical miles and 16-point + * compass direction string. + * @param locTable + * A string such as "vors" referring to "vors" location table or + * "intlsig" referring to intl location table + * @return The decoded location as a LatLonPoint; null on error (such as + * unrecognized VOR identifier or direction string). + * + */ + public static LatLonPoint getLatLonPoint(String location, String locTable) { + LatLonPoint point = null; + Station vor = null; + // Wrap decoding in a try block, in case of exception on + // one of the xml or direction enum, or other problems. + + try { + location = location.trim(); + + // VOR is always last 3 nonblank char of location + String navaid = location.substring(location.length() - 3); + + // Read in the location table XML if not exists + if (myloc == null) { + readLocTable(locTable); + logger.debug(" - read vors.xml to cache"); + } + // Search station ID and return whole station record + if (myloc != null) { + logger.debug(" - navaid = " + navaid); + vor = myloc.getStation(StationField.STID, navaid); + } else { + logger.debug(" - myloc is null"); + } + + // Get LatLonPoint from lat/lon + if (vor != null) { + point = new LatLonPoint(vor.getLatitude(), vor.getLongitude(), + LatLonPoint.INDEGREES); + } else { + logger.debug(" - DID NOT find station ID in vors.xml"); + } + + // If there's an offset direction/bearing, process it + if (location.length() > 3) { + String u = location.substring(0, location.length() - 3); + + Pattern p = Pattern.compile("^([0-9]+)\\s*([A-Z]+)"); + Matcher m = p.matcher(u); + if (m.find()) { + String distanceStr = m.group(1); + + String bearingStr = m.group(2); + + int distanceNM = Integer.parseInt(distanceStr); + + double distanceRad = distanceNM * ONE_NM_RADIANS; + // LatLonPoint.positionOf thinks bearing is CCW, not CW... + double bearingDeg = 360.0 - Direction.valueOf(bearingStr) + .getDegrees(); + double bearingRad = Math.toRadians(bearingDeg); + point = point.positionOf(bearingRad, distanceRad); + logger.debug(" - get a good latlon point"); + } + } + return point; + } catch (Exception e) { + logger.error("[Error decoding location in LatLonLocTbl: " + + location + "]"); + return null; + } + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/MndTime.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/MndTime.java old mode 100644 new mode 100755 index f1a2c95cd9..186abc02be --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/MndTime.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/MndTime.java @@ -1,600 +1,600 @@ -/* - * - * MndTime - * - * This java class processes MND (Mass News Disseminator) block. - *
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    	Engineer    Description
    - * ------------ ---------- 	----------- --------------------------
    - * 10/2008		14			T. Lee		Creation
    - * 04/2009		14			T. Lee		Used log4j logger
    - * 06/2009		128			T. Lee		Added UTC/Zulu; Returned UTC 
    - * 										or null for MND time
    - * 07/2009		128			T. Lee		Migration to TO11
    - * 01/26/2011   N/A         M. Gao      Refactor the logic of parsing MndTime string
    - *                                      Now the regular expression is more flexible. 
    - *                                      It can tolerate extra spaces at the beginning, ending 
    - *                                      or in between of words. It can either take THU abbreviation
    - *                                      or Thursday. The similar flexibility applies to MON and MONDAY too.
    - *                                      It can also understand both format listed as below: 
    - *                                      1018 PM CDT THU APR 1 2010 or
    - *                                      1018 PM CDT THURSDAY 1 APR  2010 
    - * 
    - * - * @author T.Lee - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.tools.decoder; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.TimeZone; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -public final class MndTime { - private final Log logger = LogFactory.getLog(getClass()); - - /** MND time calendar*/ - private Calendar mndTm = null; - - /** MND time string */ - private String mndTmStr = null; - - /** - * Constructor the MND time - * - * @param messageData - */ - public MndTime (byte[] messageData) { - mndTm = processMndTime (messageData); - } - - /** - * Get MND time - * - * @return mndTm - */ - public Calendar getMndTime() { - return mndTm; - } - - /** - * Get MND time string - * - * @return mndTmStr - */ - public String getMndTimeString() { - return mndTmStr; - } - - /** - * Return MND time as Calendar object. - * - * @param tm the Matcher object - * @return cal - */ - - public Calendar processMndTime (byte[] msg) { - String s = new String(msg); - SimpleDateFormat sdf; - - /* - * MND time (local format) - */ -// final String MNDTIME_EXP_LOCAL = "(\\d{3,4}) ([A-Za-z]{2}) ([A-Za-z]{3}) " + -// "([A-Za-z]{3}) ([A-Za-z]{3}) (\\d{1,2}) (\\d{4})\r\r\n"; -// Pattern pt = Pattern.compile(MNDTIME_EXP_LOCAL); -// Matcher tm = pt.matcher(s); -// Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); -// -// /* -// * Decode local time pattern -// */ -// if (tm.find()) { -// String group1; -// String group6; -// mndTmStr = tm.group(0).trim(); -// sdf = new SimpleDateFormat ("HHmm a zzz EEE MMM dd yy"); -// group1 = tm.group(1); -// if ( tm.group(1).length() == 3 ) { -// group1 = "0"+tm.group(1); -// } -// /* -// * changes made are: -// * 1. Handle both cases of "1 APR" and "APR 1" for the string fields -// * group(5) and group(6) -// */ -//// group6 = tm.group(6); -//// if ( tm.group(6).length() == 1 ) { -//// group6 = "0"+tm.group(6); -//// } -//// String mnd = group1+" "+tm.group(2)+" "+tm.group(3)+" "+ tm.group(4)+" "+ -//// tm.group(5)+" "+group6+" "+tm.group(7); -// String [] monthAndDayStringArray = verifyAndRetrieveMonthAndDay(tm.group(5), tm.group(6)); -// String mnd = group1+" "+tm.group(2)+" "+tm.group(3)+" "+ tm.group(4)+" "+ -// monthAndDayStringArray[0]+" "+ monthAndDayStringArray[1] +" "+tm.group(7); -// try { -// java.util.Date parsedDate = sdf.parse(mnd); -// cal.setTime(parsedDate); -// } catch (ParseException pe) { -// if ( logger.isInfoEnabled()) { -// logger.info ( "Errors in processing MND local time"); -// } -// if(isTimeZoneInvalid(tm.group(3))) { -// setDayOfMonthAndMonthAndYearToCalendar(cal, monthAndDayStringArray[1], -// monthAndDayStringArray[0], tm.group(7)); -// } -// } - /* - * expression pattern string match something like "800 AM PDT THU APR 1 2010" - */ - final String MNDTIME_EXP_LOCAL_1 = "( *\\d{3,4})( *[A-Za-z]{2})( *[A-Za-z]{3})" + - "( *[A-Za-z]{3,9})( *[A-Za-z]{3,9})( *\\d{1,2})( *\\d{4} *)\r\r\n"; - Pattern pattern1 = Pattern.compile(MNDTIME_EXP_LOCAL_1); - Matcher matcher1 = pattern1.matcher(s); - /* - * expression pattern string match something like "800 AM PDT THU 1 APR 2010" - */ - final String MNDTIME_EXP_LOCAL_2 = "( *\\d{3,4})( *[A-Za-z]{2})( *[A-Za-z]{3})" + - "( *[A-Za-z]{3,9})( *\\d{1,2})( *[A-Za-z]{3,9})( *\\d{4} *)\r\r\n"; - Pattern pattern2 = Pattern.compile(MNDTIME_EXP_LOCAL_2); - Matcher matcher2 = pattern2.matcher(s); - - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - Matcher matcher = getMatcher(matcher1, matcher2); - - Pattern pt = null; - Matcher tm = null; - /* - * Decode local time pattern - */ - if (matcher != null) { - mndTmStr = matcher.group(0).trim(); - sdf = new SimpleDateFormat ("HHmm a zzz EEE MMM dd yy"); - String group1; - group1 = matcher.group(1).trim(); - if ( group1.length() == 3 ) { - group1 = "0"+matcher.group(1); - } - /* - * changes made are: - * 1. Handle both cases of "1 APR" and "APR 1" for the string fields - * group(5) and group(6) - */ - String group2 = matcher.group(2).trim(); - String group3 = matcher.group(3).trim(); - String group4 = matcher.group(4).trim(); - String group5 = matcher.group(5).trim(); - String group6 = matcher.group(6).trim(); - String group7 = matcher.group(7).trim(); - String [] monthAndDayStringArray = verifyAndRetrieveMonthAndDay(group5, group6); - String mnd = group1+" "+ group2 + " "+ group3 +" "+ group4 + " " + - monthAndDayStringArray[0] + " "+ monthAndDayStringArray[1] +" "+ group7; - try { - java.util.Date parsedDate = sdf.parse(mnd); - cal.setTime(parsedDate); - } catch (ParseException pe) { - if ( logger.isInfoEnabled()) { - logger.info ( "Errors in processing MND local time"); - } - if(isTimeZoneInvalid(group3)) { - setDayOfMonthAndMonthAndYearToCalendar(cal, monthAndDayStringArray[1], - monthAndDayStringArray[0], group7); - } - } - - } else { - - /* - * UTC format, e.g., 1500 UTC THU MAY 28 2009 - */ - final String MNDTIME_EXP_UTC = "(\\d{3,4}) UTC ([A-Za-z]{3}) ([A-Za-z]{3}) " + - "(\\d{1,2}) (\\d{4})\r\r\n"; - - pt = Pattern.compile(MNDTIME_EXP_UTC); - tm = pt.matcher(s); - - /* - * decode UTC pattern - */ - if (tm.find()) { - String group1, group4; - sdf = new SimpleDateFormat ("HHmm zzz EEE MMM dd yyyy"); - mndTmStr = tm.group(0).trim(); - try { - group1 = tm.group(1); - if ( tm.group(1).length() == 3 ) { - group1 = "0"+tm.group(1); - } - group4 = tm.group(4); - if ( tm.group(4).length() == 1 ) { - group4 = "0"+tm.group(4); - } - String mnd = group1+" UTC "+tm.group(2)+" "+tm.group(3)+" "+ group4+ - " "+tm.group(5); - cal.setTime(sdf.parse(mnd)); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - } catch (Exception e) { - if ( logger.isInfoEnabled()) { - logger.info ( "Errors in processing MND UTC time"); - } - } - - } else { - - /* - * Check Zulu pattern - */ - String MNDTIME_EXP_ZULU = "(\\d{5,6})(z|Z) ([A-Za-z]{3}) (\\d{2})//(\r\r\n|\r\n)"; - pt = Pattern.compile(MNDTIME_EXP_ZULU); - tm = pt.matcher(s); - - /* - * Check UTC pattern - */ - if (tm.find()) { - String group1; - sdf = new SimpleDateFormat ("ddHHmm zzz MMM yy"); - mndTmStr = tm.group(0).trim(); - try { - group1 = tm.group(1); - if ( tm.group(1).length() == 5 ) { - group1 = "0"+tm.group(1); - } - String time = group1+" UTC "+tm.group(3)+" "+tm.group(4); - cal.setTime(sdf.parse(time)); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - } catch (Exception e) { - if ( logger.isInfoEnabled()) { - logger.info ( "Errors in processing MND zulu time"); - } - } - } else { - - /* - * Check Zulu pattern - */ - MNDTIME_EXP_ZULU = "(\\d{5,6})(z|Z)([A-Za-z]{3})(\\d{4})//(\n|\r\n)"; - pt = Pattern.compile(MNDTIME_EXP_ZULU); - tm = pt.matcher(s); - - /* - * Check UTC pattern - */ - if (tm.find()) { - String group1; - sdf = new SimpleDateFormat ("ddHHmm zzz MMM yyyy"); - mndTmStr = tm.group(0).trim(); - try { - group1 = tm.group(1); - if ( tm.group(1).length() == 5 ) { - group1 = "0"+tm.group(1); - } - String time = group1+" UTC "+tm.group(3)+" "+tm.group(4); - cal.setTime(sdf.parse(time)); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - } catch (Exception e) { - if ( logger.isInfoEnabled()) { - logger.info ( "Errors in processing MND zulu time"); - } - } - } else { - - /* - * return null if no MND time - */ - cal = null; - } - } - } - } - return cal; - } - - private String stripExtraSpace(String str) { - if(isStringEmpty(str)) - return ""; - StringBuilder builder = new StringBuilder(str.length()); - String [] strArray = str.split(" "); - displayStringArray(strArray); - /* - * find the first string that can be parsed as an integer - * and discard any strings in front of it - */ - int firstIntegerStringIndex = findFirstIntegerStringIndex(strArray); - for(int i=firstIntegerStringIndex; i< strArray.length; i++) { - builder.append(strArray[i].trim()) - .append(" "); - } - return builder.toString().trim(); - } - - private void displayStringArray(String[] strArray) { - if(strArray == null) - System.out.println("=====, the input strArray is NULL and thus can not be displayed!!!!"); - else { - System.out.println("=======, the total number of String array is = " + strArray.length); - int arrayIndex = 1; - for(String eachString : strArray) { - System.out.println(" Array Intem No." + arrayIndex + ":= "+eachString + " with LENGTH ="+eachString.length()); - arrayIndex++; - } - } - } - - /** - * - * @param timezoneString - * @return - */ - private String replaceInvalidTimezoneValue(String timezoneString) { - String timezoneValueReturned = timezoneString; - if(timezoneValueReturned != null && timezoneValueReturned.trim().length() > 0) { - if(timezoneValueReturned.equalsIgnoreCase("PLT")) - timezoneValueReturned = "PDT"; - } - return timezoneValueReturned; - } - - /** - * - * @param strArray - * @return - */ - private int findFirstIntegerStringIndex(String[] strArray) { - int firstIntegerStringIndex = 0; - if(strArray != null) { - for(String eachString : strArray) { - if(isIntegerString(eachString)) - break; - firstIntegerStringIndex++; - } - } - return firstIntegerStringIndex; - } - - private boolean isIntegerString(String str) { - boolean isIntegerString = false; - try { - Integer.parseInt(str); - isIntegerString = true; - } catch(NumberFormatException nfe) { - //do nothing - } - return isIntegerString; - } - - /** - * a helper method to check is a string is empty - * @param str - * @return - */ - private boolean isStringEmpty(String str) { - boolean isEmpty = false; - if(str == null || str.trim().length() == 0) - isEmpty = true; - return isEmpty; - } - /** - * - * @param matcher1 - * @param matcher2 - * @return - */ - private Matcher getMatcher(Matcher matcher1, Matcher matcher2) { - Matcher matcher = null; - if(matcher1 != null && matcher1.find()) - matcher = matcher1; - else if(matcher2 != null && matcher2.find()) - matcher = matcher2; - return matcher; - } - - /** - * - * @param timeZoneString - * @return - */ - private boolean isTimeZoneInvalid(String timeZoneString) { - boolean isInvalid = false; - if(isStringEqual("PLT", timeZoneString)) - isInvalid = true; - return isInvalid; - } - - /** - * A helper method to parse and monthString and yearString directly - * and then set to the calendar object - * @param calendar - * @param monthString - * @param yearString - */ - private void setDayOfMonthAndMonthAndYearToCalendar(Calendar calendar, String dayOfMonthString, - String monthString, String yearString) { - if(calendar == null) - return; - /* - * set day of month - */ - int dayOfMonthInt = getDayOfMonthInt(dayOfMonthString); - if(isDayOfMonthIntValid(dayOfMonthInt)) - calendar.set(Calendar.DAY_OF_MONTH, dayOfMonthInt); - - /* - * set month - */ - int monthId = getMonthId(monthString); - if(isMonthIdValid(monthId)) - calendar.set(Calendar.MONTH, monthId); - - /* - * Now set year value - */ - int yearInt = getYearInt(yearString); - if(isYearIntValid(yearInt)) - calendar.set(Calendar.YEAR, yearInt); - } - - private int getMonthId(String monthString) { - int monthId = -1; - if(isStringEqual("JAN", monthString) || isStringEqual("JANUARY", monthString)) - monthId = Calendar.JANUARY; - else if(isStringEqual("FEB", monthString) || isStringEqual("FEBRUARY", monthString)) - monthId = Calendar.FEBRUARY; - else if(isStringEqual("MAR", monthString) || isStringEqual("MARCH", monthString)) - monthId = Calendar.MARCH; - else if(isStringEqual("APR", monthString) || isStringEqual("APRIL", monthString)) - monthId = Calendar.APRIL; - else if(isStringEqual("MAY", monthString)) - monthId = Calendar.MAY; - else if(isStringEqual("JUN", monthString) || isStringEqual("JUNE", monthString)) - monthId = Calendar.JUNE; - else if(isStringEqual("JUL", monthString) || isStringEqual("JULY", monthString)) - monthId = Calendar.JULY; - else if(isStringEqual("AUG", monthString) || isStringEqual("AUGUST", monthString)) - monthId = Calendar.AUGUST; - else if(isStringEqual("SEP", monthString) || isStringEqual("SEPTEMBER", monthString)) - monthId = Calendar.SEPTEMBER; - else if(isStringEqual("OCT", monthString) || isStringEqual("OCTOBER", monthString)) - monthId = Calendar.OCTOBER; - else if(isStringEqual("NOV", monthString) || isStringEqual("NOVEMBER", monthString)) - monthId = Calendar.NOVEMBER; - else if(isStringEqual("DEC", monthString) || isStringEqual("DECEMBER", monthString)) - monthId = Calendar.DECEMBER; - return monthId; - } - - private boolean isStringEqual(String str1, String str2) { - boolean isEqual = false; - if(str1.equalsIgnoreCase(str2)) - isEqual = true; - return isEqual; - } - - /** - * - * @param yearString - * @return - */ - private int getYearInt(String yearString) { - int yearInt = -1; - if(yearString != null) { - try { - yearInt = Integer.parseInt(yearString); - } catch(NumberFormatException nfe) { - //do nothing - } - } - return yearInt; - } - - private int getDayOfMonthInt(String dayOfMonthString) { - int dayOfMonthInt = -1; - if(dayOfMonthString != null) { - try { - dayOfMonthInt = Integer.parseInt(dayOfMonthString); - } catch(NumberFormatException nfe) { - //do nothing - } - } - return dayOfMonthInt; - } - - - /** - * - * @param monthId - * @return - */ - private boolean isMonthIdValid(int monthId) { - boolean isValid = true; - if(isIntegerNegative(monthId)) - isValid = false; - return isValid; - } - - /** - * - * @param yearInt - * @return - */ - private boolean isYearIntValid(int yearInt) { - boolean isValid = true; - if(isIntegerNegative(yearInt)) - isValid = false; - return isValid; - } - - private boolean isDayOfMonthIntValid(int dayOfMonthInt) { - boolean isValid = true; - if(isIntegerNegative(dayOfMonthInt)) - isValid = false; - return isValid; - } - - /** - * a method to return true if the input is a negative number - * @param intValue - * @return - */ - private boolean isIntegerNegative(int intValue) { - return intValue < 0 ? true : false; - } - - /* - * A helper method to retrieve month and day values - * Case No.1: 12 APR - * Case No.2: APR 12 - */ - private String[] verifyAndRetrieveMonthAndDay(String monthAndDayValue1, String monthAndDayValue2) { - String [] monthAndDayStringArray = new String[2]; - if(canStringBeParsedAsInteger(monthAndDayValue2)) { - monthAndDayStringArray[0] = monthAndDayValue1; - monthAndDayStringArray[1] = monthAndDayValue2; - } else if(canStringBeParsedAsInteger(monthAndDayValue1)) { - monthAndDayStringArray[0] = monthAndDayValue2; - monthAndDayStringArray[1] = monthAndDayValue1; - } - if(monthAndDayStringArray[1] != null && monthAndDayStringArray[1].length()==1) - monthAndDayStringArray[1] = "0" + monthAndDayStringArray[1]; - - checkStringArray(monthAndDayStringArray); - return monthAndDayStringArray; - } - - /* - * A helper method to check each element of the array - * to make sure there is no any null value exists in the array - * Assign an empty string value to any null element of the array - */ - private void checkStringArray(String[] stringArray) { - for(int i=0; i + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 10/2008 14 T. Lee Creation + * 04/2009 14 T. Lee Used log4j logger + * 06/2009 128 T. Lee Added UTC/Zulu; Returned UTC + * or null for MND time + * 07/2009 128 T. Lee Migration to TO11 + * 01/26/2011 N/A M. Gao Refactor the logic of parsing MndTime string + * Now the regular expression is more flexible. + * It can tolerate extra spaces at the beginning, ending + * or in between of words. It can either take THU abbreviation + * or Thursday. The similar flexibility applies to MON and MONDAY too. + * It can also understand both format listed as below: + * 1018 PM CDT THU APR 1 2010 or + * 1018 PM CDT THURSDAY 1 APR 2010 + * + * + * @author T.Lee + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.tools.decoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public final class MndTime { + private final Log logger = LogFactory.getLog(getClass()); + + /** MND time calendar*/ + private Calendar mndTm = null; + + /** MND time string */ + private String mndTmStr = null; + + /** + * Constructor the MND time + * + * @param messageData + */ + public MndTime (byte[] messageData) { + mndTm = processMndTime (messageData); + } + + /** + * Get MND time + * + * @return mndTm + */ + public Calendar getMndTime() { + return mndTm; + } + + /** + * Get MND time string + * + * @return mndTmStr + */ + public String getMndTimeString() { + return mndTmStr; + } + + /** + * Return MND time as Calendar object. + * + * @param tm the Matcher object + * @return cal + */ + + public Calendar processMndTime (byte[] msg) { + String s = new String(msg); + SimpleDateFormat sdf; + + /* + * MND time (local format) + */ +// final String MNDTIME_EXP_LOCAL = "(\\d{3,4}) ([A-Za-z]{2}) ([A-Za-z]{3}) " + +// "([A-Za-z]{3}) ([A-Za-z]{3}) (\\d{1,2}) (\\d{4})\r\r\n"; +// Pattern pt = Pattern.compile(MNDTIME_EXP_LOCAL); +// Matcher tm = pt.matcher(s); +// Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); +// +// /* +// * Decode local time pattern +// */ +// if (tm.find()) { +// String group1; +// String group6; +// mndTmStr = tm.group(0).trim(); +// sdf = new SimpleDateFormat ("HHmm a zzz EEE MMM dd yy"); +// group1 = tm.group(1); +// if ( tm.group(1).length() == 3 ) { +// group1 = "0"+tm.group(1); +// } +// /* +// * changes made are: +// * 1. Handle both cases of "1 APR" and "APR 1" for the string fields +// * group(5) and group(6) +// */ +//// group6 = tm.group(6); +//// if ( tm.group(6).length() == 1 ) { +//// group6 = "0"+tm.group(6); +//// } +//// String mnd = group1+" "+tm.group(2)+" "+tm.group(3)+" "+ tm.group(4)+" "+ +//// tm.group(5)+" "+group6+" "+tm.group(7); +// String [] monthAndDayStringArray = verifyAndRetrieveMonthAndDay(tm.group(5), tm.group(6)); +// String mnd = group1+" "+tm.group(2)+" "+tm.group(3)+" "+ tm.group(4)+" "+ +// monthAndDayStringArray[0]+" "+ monthAndDayStringArray[1] +" "+tm.group(7); +// try { +// java.util.Date parsedDate = sdf.parse(mnd); +// cal.setTime(parsedDate); +// } catch (ParseException pe) { +// if ( logger.isInfoEnabled()) { +// logger.info ( "Errors in processing MND local time"); +// } +// if(isTimeZoneInvalid(tm.group(3))) { +// setDayOfMonthAndMonthAndYearToCalendar(cal, monthAndDayStringArray[1], +// monthAndDayStringArray[0], tm.group(7)); +// } +// } + /* + * expression pattern string match something like "800 AM PDT THU APR 1 2010" + */ + final String MNDTIME_EXP_LOCAL_1 = "( *\\d{3,4})( *[A-Za-z]{2})( *[A-Za-z]{3})" + + "( *[A-Za-z]{3,9})( *[A-Za-z]{3,9})( *\\d{1,2})( *\\d{4} *)\r\r\n"; + Pattern pattern1 = Pattern.compile(MNDTIME_EXP_LOCAL_1); + Matcher matcher1 = pattern1.matcher(s); + /* + * expression pattern string match something like "800 AM PDT THU 1 APR 2010" + */ + final String MNDTIME_EXP_LOCAL_2 = "( *\\d{3,4})( *[A-Za-z]{2})( *[A-Za-z]{3})" + + "( *[A-Za-z]{3,9})( *\\d{1,2})( *[A-Za-z]{3,9})( *\\d{4} *)\r\r\n"; + Pattern pattern2 = Pattern.compile(MNDTIME_EXP_LOCAL_2); + Matcher matcher2 = pattern2.matcher(s); + + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + Matcher matcher = getMatcher(matcher1, matcher2); + + Pattern pt = null; + Matcher tm = null; + /* + * Decode local time pattern + */ + if (matcher != null) { + mndTmStr = matcher.group(0).trim(); + sdf = new SimpleDateFormat ("HHmm a zzz EEE MMM dd yy"); + String group1; + group1 = matcher.group(1).trim(); + if ( group1.length() == 3 ) { + group1 = "0"+matcher.group(1); + } + /* + * changes made are: + * 1. Handle both cases of "1 APR" and "APR 1" for the string fields + * group(5) and group(6) + */ + String group2 = matcher.group(2).trim(); + String group3 = matcher.group(3).trim(); + String group4 = matcher.group(4).trim(); + String group5 = matcher.group(5).trim(); + String group6 = matcher.group(6).trim(); + String group7 = matcher.group(7).trim(); + String [] monthAndDayStringArray = verifyAndRetrieveMonthAndDay(group5, group6); + String mnd = group1+" "+ group2 + " "+ group3 +" "+ group4 + " " + + monthAndDayStringArray[0] + " "+ monthAndDayStringArray[1] +" "+ group7; + try { + java.util.Date parsedDate = sdf.parse(mnd); + cal.setTime(parsedDate); + } catch (ParseException pe) { + if ( logger.isInfoEnabled()) { + logger.info ( "Errors in processing MND local time"); + } + if(isTimeZoneInvalid(group3)) { + setDayOfMonthAndMonthAndYearToCalendar(cal, monthAndDayStringArray[1], + monthAndDayStringArray[0], group7); + } + } + + } else { + + /* + * UTC format, e.g., 1500 UTC THU MAY 28 2009 + */ + final String MNDTIME_EXP_UTC = "(\\d{3,4}) UTC ([A-Za-z]{3}) ([A-Za-z]{3}) " + + "(\\d{1,2}) (\\d{4})\r\r\n"; + + pt = Pattern.compile(MNDTIME_EXP_UTC); + tm = pt.matcher(s); + + /* + * decode UTC pattern + */ + if (tm.find()) { + String group1, group4; + sdf = new SimpleDateFormat ("HHmm zzz EEE MMM dd yyyy"); + mndTmStr = tm.group(0).trim(); + try { + group1 = tm.group(1); + if ( tm.group(1).length() == 3 ) { + group1 = "0"+tm.group(1); + } + group4 = tm.group(4); + if ( tm.group(4).length() == 1 ) { + group4 = "0"+tm.group(4); + } + String mnd = group1+" UTC "+tm.group(2)+" "+tm.group(3)+" "+ group4+ + " "+tm.group(5); + cal.setTime(sdf.parse(mnd)); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + } catch (Exception e) { + if ( logger.isInfoEnabled()) { + logger.info ( "Errors in processing MND UTC time"); + } + } + + } else { + + /* + * Check Zulu pattern + */ + String MNDTIME_EXP_ZULU = "(\\d{5,6})(z|Z) ([A-Za-z]{3}) (\\d{2})//(\r\r\n|\r\n)"; + pt = Pattern.compile(MNDTIME_EXP_ZULU); + tm = pt.matcher(s); + + /* + * Check UTC pattern + */ + if (tm.find()) { + String group1; + sdf = new SimpleDateFormat ("ddHHmm zzz MMM yy"); + mndTmStr = tm.group(0).trim(); + try { + group1 = tm.group(1); + if ( tm.group(1).length() == 5 ) { + group1 = "0"+tm.group(1); + } + String time = group1+" UTC "+tm.group(3)+" "+tm.group(4); + cal.setTime(sdf.parse(time)); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + } catch (Exception e) { + if ( logger.isInfoEnabled()) { + logger.info ( "Errors in processing MND zulu time"); + } + } + } else { + + /* + * Check Zulu pattern + */ + MNDTIME_EXP_ZULU = "(\\d{5,6})(z|Z)([A-Za-z]{3})(\\d{4})//(\n|\r\n)"; + pt = Pattern.compile(MNDTIME_EXP_ZULU); + tm = pt.matcher(s); + + /* + * Check UTC pattern + */ + if (tm.find()) { + String group1; + sdf = new SimpleDateFormat ("ddHHmm zzz MMM yyyy"); + mndTmStr = tm.group(0).trim(); + try { + group1 = tm.group(1); + if ( tm.group(1).length() == 5 ) { + group1 = "0"+tm.group(1); + } + String time = group1+" UTC "+tm.group(3)+" "+tm.group(4); + cal.setTime(sdf.parse(time)); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + } catch (Exception e) { + if ( logger.isInfoEnabled()) { + logger.info ( "Errors in processing MND zulu time"); + } + } + } else { + + /* + * return null if no MND time + */ + cal = null; + } + } + } + } + return cal; + } + + private String stripExtraSpace(String str) { + if(isStringEmpty(str)) + return ""; + StringBuilder builder = new StringBuilder(str.length()); + String [] strArray = str.split(" "); + displayStringArray(strArray); + /* + * find the first string that can be parsed as an integer + * and discard any strings in front of it + */ + int firstIntegerStringIndex = findFirstIntegerStringIndex(strArray); + for(int i=firstIntegerStringIndex; i< strArray.length; i++) { + builder.append(strArray[i].trim()) + .append(" "); + } + return builder.toString().trim(); + } + + private void displayStringArray(String[] strArray) { + if(strArray == null) + System.out.println("=====, the input strArray is NULL and thus can not be displayed!!!!"); + else { + System.out.println("=======, the total number of String array is = " + strArray.length); + int arrayIndex = 1; + for(String eachString : strArray) { + System.out.println(" Array Intem No." + arrayIndex + ":= "+eachString + " with LENGTH ="+eachString.length()); + arrayIndex++; + } + } + } + + /** + * + * @param timezoneString + * @return + */ + private String replaceInvalidTimezoneValue(String timezoneString) { + String timezoneValueReturned = timezoneString; + if(timezoneValueReturned != null && timezoneValueReturned.trim().length() > 0) { + if(timezoneValueReturned.equalsIgnoreCase("PLT")) + timezoneValueReturned = "PDT"; + } + return timezoneValueReturned; + } + + /** + * + * @param strArray + * @return + */ + private int findFirstIntegerStringIndex(String[] strArray) { + int firstIntegerStringIndex = 0; + if(strArray != null) { + for(String eachString : strArray) { + if(isIntegerString(eachString)) + break; + firstIntegerStringIndex++; + } + } + return firstIntegerStringIndex; + } + + private boolean isIntegerString(String str) { + boolean isIntegerString = false; + try { + Integer.parseInt(str); + isIntegerString = true; + } catch(NumberFormatException nfe) { + //do nothing + } + return isIntegerString; + } + + /** + * a helper method to check is a string is empty + * @param str + * @return + */ + private boolean isStringEmpty(String str) { + boolean isEmpty = false; + if(str == null || str.trim().length() == 0) + isEmpty = true; + return isEmpty; + } + /** + * + * @param matcher1 + * @param matcher2 + * @return + */ + private Matcher getMatcher(Matcher matcher1, Matcher matcher2) { + Matcher matcher = null; + if(matcher1 != null && matcher1.find()) + matcher = matcher1; + else if(matcher2 != null && matcher2.find()) + matcher = matcher2; + return matcher; + } + + /** + * + * @param timeZoneString + * @return + */ + private boolean isTimeZoneInvalid(String timeZoneString) { + boolean isInvalid = false; + if(isStringEqual("PLT", timeZoneString)) + isInvalid = true; + return isInvalid; + } + + /** + * A helper method to parse and monthString and yearString directly + * and then set to the calendar object + * @param calendar + * @param monthString + * @param yearString + */ + private void setDayOfMonthAndMonthAndYearToCalendar(Calendar calendar, String dayOfMonthString, + String monthString, String yearString) { + if(calendar == null) + return; + /* + * set day of month + */ + int dayOfMonthInt = getDayOfMonthInt(dayOfMonthString); + if(isDayOfMonthIntValid(dayOfMonthInt)) + calendar.set(Calendar.DAY_OF_MONTH, dayOfMonthInt); + + /* + * set month + */ + int monthId = getMonthId(monthString); + if(isMonthIdValid(monthId)) + calendar.set(Calendar.MONTH, monthId); + + /* + * Now set year value + */ + int yearInt = getYearInt(yearString); + if(isYearIntValid(yearInt)) + calendar.set(Calendar.YEAR, yearInt); + } + + private int getMonthId(String monthString) { + int monthId = -1; + if(isStringEqual("JAN", monthString) || isStringEqual("JANUARY", monthString)) + monthId = Calendar.JANUARY; + else if(isStringEqual("FEB", monthString) || isStringEqual("FEBRUARY", monthString)) + monthId = Calendar.FEBRUARY; + else if(isStringEqual("MAR", monthString) || isStringEqual("MARCH", monthString)) + monthId = Calendar.MARCH; + else if(isStringEqual("APR", monthString) || isStringEqual("APRIL", monthString)) + monthId = Calendar.APRIL; + else if(isStringEqual("MAY", monthString)) + monthId = Calendar.MAY; + else if(isStringEqual("JUN", monthString) || isStringEqual("JUNE", monthString)) + monthId = Calendar.JUNE; + else if(isStringEqual("JUL", monthString) || isStringEqual("JULY", monthString)) + monthId = Calendar.JULY; + else if(isStringEqual("AUG", monthString) || isStringEqual("AUGUST", monthString)) + monthId = Calendar.AUGUST; + else if(isStringEqual("SEP", monthString) || isStringEqual("SEPTEMBER", monthString)) + monthId = Calendar.SEPTEMBER; + else if(isStringEqual("OCT", monthString) || isStringEqual("OCTOBER", monthString)) + monthId = Calendar.OCTOBER; + else if(isStringEqual("NOV", monthString) || isStringEqual("NOVEMBER", monthString)) + monthId = Calendar.NOVEMBER; + else if(isStringEqual("DEC", monthString) || isStringEqual("DECEMBER", monthString)) + monthId = Calendar.DECEMBER; + return monthId; + } + + private boolean isStringEqual(String str1, String str2) { + boolean isEqual = false; + if(str1.equalsIgnoreCase(str2)) + isEqual = true; + return isEqual; + } + + /** + * + * @param yearString + * @return + */ + private int getYearInt(String yearString) { + int yearInt = -1; + if(yearString != null) { + try { + yearInt = Integer.parseInt(yearString); + } catch(NumberFormatException nfe) { + //do nothing + } + } + return yearInt; + } + + private int getDayOfMonthInt(String dayOfMonthString) { + int dayOfMonthInt = -1; + if(dayOfMonthString != null) { + try { + dayOfMonthInt = Integer.parseInt(dayOfMonthString); + } catch(NumberFormatException nfe) { + //do nothing + } + } + return dayOfMonthInt; + } + + + /** + * + * @param monthId + * @return + */ + private boolean isMonthIdValid(int monthId) { + boolean isValid = true; + if(isIntegerNegative(monthId)) + isValid = false; + return isValid; + } + + /** + * + * @param yearInt + * @return + */ + private boolean isYearIntValid(int yearInt) { + boolean isValid = true; + if(isIntegerNegative(yearInt)) + isValid = false; + return isValid; + } + + private boolean isDayOfMonthIntValid(int dayOfMonthInt) { + boolean isValid = true; + if(isIntegerNegative(dayOfMonthInt)) + isValid = false; + return isValid; + } + + /** + * a method to return true if the input is a negative number + * @param intValue + * @return + */ + private boolean isIntegerNegative(int intValue) { + return intValue < 0 ? true : false; + } + + /* + * A helper method to retrieve month and day values + * Case No.1: 12 APR + * Case No.2: APR 12 + */ + private String[] verifyAndRetrieveMonthAndDay(String monthAndDayValue1, String monthAndDayValue2) { + String [] monthAndDayStringArray = new String[2]; + if(canStringBeParsedAsInteger(monthAndDayValue2)) { + monthAndDayStringArray[0] = monthAndDayValue1; + monthAndDayStringArray[1] = monthAndDayValue2; + } else if(canStringBeParsedAsInteger(monthAndDayValue1)) { + monthAndDayStringArray[0] = monthAndDayValue2; + monthAndDayStringArray[1] = monthAndDayValue1; + } + if(monthAndDayStringArray[1] != null && monthAndDayStringArray[1].length()==1) + monthAndDayStringArray[1] = "0" + monthAndDayStringArray[1]; + + checkStringArray(monthAndDayStringArray); + return monthAndDayStringArray; + } + + /* + * A helper method to check each element of the array + * to make sure there is no any null value exists in the array + * Assign an empty string value to any null element of the array + */ + private void checkStringArray(String[] stringArray) { + for(int i=0; i - * SOFTWARE HISTORY - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 12 Jun 2009 95 B. Hebbard Initial creation. - * 24 Jun 2009 95/132 B. Hebbard Add getLatLonPoint; move to common plugin - * 22 Jul 2009 for 132 B. Hebbard Port to TO11 until station table avail. EDEX - * - * - * - * @author bhebbard - * @version 1.0 - */ -public enum VOR { - - // (From GEMPAK vors.tbl -- for TEMPORARY use only, just until - // this is handled by more general station/location design. - // - // Note these are a SUBSET of the high-altitude VORs in North America - // used by AWC for SIGMET bounding points. It is NOT sufficient - // for lookup in cases where where all VHF NAVAIDs -- or - // even all VORs -- are required [say, for PIREP decoding]) - // - // Lat Lon - YSJ ( 45.32 , -65.88 ) , - HUL ( 46.04 , -67.83 ) , - PQI ( 46.77 , -68.09 ) , - MLT ( 45.58 , -68.52 ) , - BGR ( 44.84 , -68.87 ) , - ACK ( 41.28 , -70.03 ) , - ENE ( 43.43 , -70.61 ) , - BOS ( 42.36 , -70.99 ) , - YQB ( 46.80 , -71.38 ) , - PVD ( 41.72 , -71.43 ) , - CON ( 43.22 , -71.58 ) , - YSC ( 45.43 , -71.68 ) , - HTO ( 40.92 , -72.32 ) , - MPV ( 44.22 , -72.57 ) , - BDL ( 41.94 , -72.69 ) , - PLB ( 44.69 , -73.52 ) , - JFK ( 40.63 , -73.77 ) , - ALB ( 42.75 , -73.80 ) , - CYN ( 39.82 , -74.43 ) , - SAX ( 41.07 , -74.54 ) , - MSS ( 44.91 , -74.72 ) , - SIE ( 39.10 , -74.80 ) , - HNK ( 42.06 , -75.32 ) , - SBY ( 38.35 , -75.52 ) , - YOW ( 45.32 , -75.67 ) , - ETX ( 40.58 , -75.68 ) , - ECG ( 36.25 , -76.18 ) , - SYR ( 43.16 , -76.20 ) , - ORF ( 36.89 , -76.20 ) , - EMI ( 39.50 , -76.98 ) , - HAR ( 40.23 , -77.02 ) , - DCA ( 38.86 , -77.04 ) , - RIC ( 37.50 , -77.32 ) , - CSN ( 38.64 , -77.87 ) , - ILM ( 34.35 , -77.87 ) , - SLT ( 41.51 , -77.97 ) , - PSB ( 40.92 , -77.99 ) , - BUF ( 42.93 , -78.65 ) , - RDU ( 35.87 , -78.78 ) , - JST ( 40.32 , -78.83 ) , - JHW ( 42.19 , -79.12 ) , - LYH ( 37.25 , -79.23 ) , - YYZ ( 43.67 , -79.63 ) , - FLO ( 34.23 , -79.66 ) , - GSO ( 36.05 , -79.98 ) , - CHS ( 32.89 , -80.04 ) , - PBI ( 26.68 , -80.09 ) , - EKN ( 38.92 , -80.10 ) , - EWC ( 40.83 , -80.21 ) , - ERI ( 42.02 , -80.30 ) , - MIA ( 25.80 , -80.30 ) , - VRB ( 27.68 , -80.49 ) , - PSK ( 37.09 , -80.71 ) , - AIR ( 40.02 , -80.82 ) , - CLT ( 35.22 , -80.93 ) , - CAE ( 33.86 , -81.05 ) , - YVV ( 44.75 , -81.10 ) , - SAV ( 32.16 , -81.11 ) , - OMN ( 29.30 , -81.11 ) , - BKW ( 37.78 , -81.12 ) , - ORL ( 28.54 , -81.34 ) , - CRG ( 30.34 , -81.51 ) , - EYW ( 24.59 , -81.80 ) , - FMY ( 26.58 , -81.87 ) , // OBSOLETE - SPA ( 35.03 , -81.93 ) , - HNN ( 38.75 , -82.03 ) , - HMV ( 36.44 , -82.13 ) , - CLE ( 41.42 , -81.85 ) , - IRQ ( 33.71 , -82.16 ) , - AMG ( 31.54 , -82.51 ) , - SRQ ( 27.40 , -82.55 ) , - APE ( 40.15 , -82.59 ) , - PIE ( 27.91 , -82.68 ) , - ECK ( 43.26 , -82.72 ) , - CTY ( 29.60 , -83.05 ) , - ODF ( 34.70 , -83.30 ) , - DXO ( 42.21 , -83.37 ) , - ASP ( 44.45 , -83.39 ) , - MCN ( 32.69 , -83.65 ) , - FNT ( 42.97 , -83.74 ) , - VXV ( 35.90 , -83.89 ) , - ROD ( 40.29 , -84.04 ) , - MBS ( 43.53 , -84.08 ) , - LOZ ( 37.03 , -84.12 ) , - ABY ( 31.65 , -84.30 ) , // OBSOLETE - SSM ( 46.41 , -84.31 ) , - TLH ( 30.56 , -84.37 ) , - ATL ( 33.63 , -84.44 ) , - CVG ( 39.02 , -84.70 ) , - GQO ( 34.96 , -85.15 ) , - FWA ( 40.98 , -85.19 ) , - LGC ( 33.05 , -85.21 ) , - GRR ( 42.79 , -85.50 ) , - TVC ( 44.67 , -85.55 ) , - LOU ( 38.10 , -85.58 ) , // OBSOLETE - MKG ( 43.17 , -86.04 ) , - PMM ( 42.47 , -86.11 ) , - GIJ ( 41.77 , -86.32 ) , - MGM ( 32.22 , -86.32 ) , - IND ( 39.81 , -86.37 ) , - BWG ( 36.93 , -86.44 ) , - BNA ( 36.14 , -86.68 ) , - CEW ( 30.83 , -86.68 ) , - VUZ ( 33.67 , -86.90 ) , - BVT ( 40.56 , -87.07 ) , - TTH ( 39.49 , -87.25 ) , - MSL ( 34.70 , -87.48 ) , - SAW ( 46.36 , -87.40 ) , - PXV ( 37.93 , -87.76 ) , - ORD ( 41.98 , -87.90 ) , - GRB ( 44.56 , -88.19 ) , - BAE ( 43.12 , -88.28 ) , - JOT ( 41.55 , -88.32 ) , - SJI ( 30.73 , -88.36 ) , - IGB ( 33.48 , -88.52 ) , - MEI ( 32.38 , -88.80 ) , - DEC ( 39.74 , -88.86 ) , - YQT ( 48.37 , -89.32 ) , - DYR ( 36.02 , -89.32 ) , - RHI ( 45.63 , -89.45 ) , - BDF ( 41.16 , -89.59 ) , - DLL ( 43.55 , -89.76 ) , - MEM ( 35.06 , -89.98 ) , - LEV ( 29.18 , -90.10 ) , - JAN ( 32.51 , -90.17 ) , - MSY ( 30.00 , -90.27 ) , // OBSOLETE - FAM ( 37.67 , -90.23 ) , - MCB ( 31.30 , -90.26 ) , - SQS ( 33.46 , -90.28 ) , - STL ( 38.86 , -90.48 ) , - DBQ ( 42.40 , -90.71 ) , - ARG ( 36.11 , -90.95 ) , - UIN ( 39.85 , -91.28 ) , - BTR ( 30.48 , -91.30 ) , - ODI ( 43.91 , -91.47 ) , - EAU ( 44.90 , -91.48 ) , - IOW ( 41.52 , -91.61 ) , - MLU ( 32.52 , -92.03 ) , - LIT ( 34.68 , -92.18 ) , - DLH ( 46.80 , -92.20 ) , - COU ( 38.82 , -92.22 ) , - AEX ( 31.26 , -92.50 ) , - IRK ( 40.14 , -92.59 ) , - ELD ( 33.26 , -92.74 ) , - LCH ( 30.14 , -93.11 ) , - MSP ( 44.88 , -93.23 ) , - MCW ( 43.09 , -93.33 ) , - SGF ( 37.36 , -93.33 ) , - INL ( 48.57 , -93.40 ) , - DSM ( 41.44 , -93.65 ) , - EIC ( 32.77 , -93.81 ) , - BRD ( 46.35 , -94.03 ) , - TXK ( 33.51 , -94.07 ) , - RZC ( 36.25 , -94.12 ) , - FSM ( 35.38 , -94.27 ) , - FOD ( 42.61 , -94.29 ) , - BUM ( 38.27 , -94.49 ) , - MKC ( 39.28 , -94.59 ) , // OBSOLETE - LFK ( 31.16 , -94.72 ) , - GGG ( 32.42 , -94.75 ) , - BJI ( 47.58 , -95.02 ) , - RWF ( 44.47 , -95.13 ) , - OSW ( 37.15 , -95.20 ) , - IAH ( 29.96 , -95.35 ) , - OVR ( 41.17 , -95.74 ) , - MLC ( 34.85 , -95.78 ) , - TUL ( 36.20 , -95.79 ) , - PWE ( 40.20 , -96.21 ) , - PSX ( 28.76 , -96.31 ) , - FSD ( 43.65 , -96.78 ) , - FAR ( 46.75 , -96.85 ) , - DFW ( 32.87 , -97.03 ) , // OBSOLETE - ADM ( 34.21 , -97.17 ) , - GFK ( 47.95 , -97.19 ) , - YWG ( 49.90 , -97.23 ) , - ACT ( 31.66 , -97.27 ) , - BRO ( 25.92 , -97.38 ) , - CRP ( 27.90 , -97.45 ) , - ICT ( 37.75 , -97.58 ) , - OKC ( 35.36 , -97.61 ) , - SLN ( 38.93 , -97.62 ) , - AUS ( 30.30 , -97.70 ) , // OBSOLETE - END ( 36.35 , -97.92 ) , - OBH ( 41.38 , -98.35 ) , - ABR ( 45.42 , -98.37 ) , - SAT ( 29.64 , -98.46 ) , - SPS ( 33.99 , -98.59 ) , - ONL ( 42.47 , -98.69 ) , - LRD ( 27.48 , -99.42 ) , - JCT ( 30.60 , -99.82 ) , - ABI ( 32.48 , -99.86 ) , - GAG ( 36.34 , -99.88 ) , - ANW ( 42.57 , -99.99 ) , - PIR ( 44.40 , -100.17 ) , - HLC ( 39.26 , -100.23 ) , - CDS ( 34.37 , -100.28 ) , - SJT ( 31.38 , -100.46 ) , - MCK ( 40.20 , -100.59 ) , - BIS ( 46.77 , -100.67 ) , - LBF ( 41.13 , -100.72 ) , - GCK ( 37.92 , -100.73 ) , - DLF ( 29.36 , -100.77 ) , - LBL ( 37.04 , -100.97 ) , - MOT ( 48.26 , -101.29 ) , - AMA ( 35.29 , -101.64 ) , - GLD ( 39.39 , -101.69 ) , - DPR ( 45.08 , -101.72 ) , - LBB ( 33.70 , -101.92 ) , - MAF ( 32.02 , -102.18 ) , - LAA ( 38.20 , -102.69 ) , - DIK ( 46.86 , -102.77 ) , - TXO ( 34.50 , -102.84 ) , - SNY ( 41.10 , -102.98 ) , - FST ( 30.95 , -102.98 ) , - RAP ( 43.98 , -103.01 ) , - AKO ( 40.16 , -103.18 ) , - INK ( 31.87 , -103.24 ) , - BFF ( 41.89 , -103.48 ) , - TBE ( 37.27 , -103.60 ) , - TCC ( 35.18 , -103.60 ) , - ISN ( 48.18 , -103.63 ) , - MRF ( 30.30 , -103.95 ) , - PUB ( 38.29 , -104.43 ) , - ROW ( 33.34 , -104.62 ) , // OBSOLETE - DEN ( 39.81 , -104.66 ) , - CYS ( 41.21 , -104.77 ) , - CIM ( 36.49 , -104.87 ) , - LVS ( 35.66 , -105.14 ) , // OBSOLETE - LAR ( 41.33 , -105.72 ) , - ALS ( 37.35 , -105.82 ) , - MLS ( 46.38 , -105.95 ) , - DDY ( 43.09 , -106.28 ) , - ELP ( 31.82 , -106.28 ) , - CZI ( 44.00 , -106.44 ) , - GGW ( 48.22 , -106.63 ) , - ABQ ( 35.04 , -106.82 ) , - DBL ( 39.44 , -106.90 ) , - HBU ( 38.45 , -107.04 ) , - SHR ( 44.84 , -107.06 ) , - TCS ( 33.28 , -107.28 ) , - CHE ( 40.52 , -107.31 ) , - DMN ( 32.28 , -107.60 ) , - YYN ( 50.28 , -107.68 ) , - FMN ( 36.75 , -108.10 ) , // OBSOLETE - BOY ( 43.46 , -108.30 ) , - BIL ( 45.81 , -108.63 ) , - JNC ( 39.06 , -108.79 ) , - DVC ( 37.81 , -108.93 ) , - OCS ( 41.59 , -109.02 ) , - SJN ( 34.42 , -109.14 ) , - SSO ( 32.27 , -109.26 ) , - LWT ( 47.05 , -109.61 ) , - HVR ( 48.54 , -109.77 ) , - BPI ( 42.58 , -110.11 ) , - MTU ( 40.15 , -110.13 ) , - HVE ( 38.42 , -110.70 ) , - YXH ( 50.02 , -110.72 ) , - JAC ( 43.62 , -110.73 ) , - INW ( 35.06 , -110.80 ) , - TUS ( 32.10 , -110.92 ) , - TBC ( 36.12 , -111.27 ) , - GTF ( 47.45 , -111.41 ) , - HLN ( 46.61 , -111.95 ) , - PHX ( 33.43 , -112.02 ) , - SLC ( 40.85 , -111.98 ) , - DBS ( 44.09 , -112.21 ) , - BCE ( 37.69 , -112.30 ) , - MLD ( 42.20 , -112.45 ) , - DRK ( 34.70 , -112.48 ) , - DTA ( 39.30 , -112.51 ) , - DLN ( 45.25 , -112.55 ) , - PIH ( 42.87 , -112.65 ) , - YQL ( 49.63 , -112.80 ) , - PGS ( 35.62 , -113.54 ) , - BVL ( 40.73 , -113.76 ) , - LKT ( 45.02 , -114.08 ) , - FCA ( 48.21 , -114.18 ) , - ILC ( 38.25 , -114.39 ) , - EED ( 34.77 , -114.47 ) , - TWF ( 42.48 , -114.49 ) , - BZA ( 32.77 , -114.60 ) , - ELY ( 39.30 , -114.85 ) , - LAS ( 36.08 , -115.16 ) , - MLP ( 47.46 , -115.65 ) , - YXC ( 49.60 , -115.78 ) , - TRM ( 33.63 , -116.16 ) , - BOI ( 43.55 , -116.19 ) , - DNJ ( 44.77 , -116.21 ) , - HEC ( 34.80 , -116.46 ) , - BTY ( 36.80 , -116.75 ) , - BAM ( 40.57 , -116.92 ) , - MZB ( 32.78 , -117.23 ) , - GEG ( 47.56 , -117.63 ) , - OAL ( 38.00 , -117.77 ) , - BKE ( 44.84 , -117.81 ) , - REO ( 42.59 , -117.87 ) , - LAX ( 33.93 , -118.43 ) , - PDT ( 45.70 , -118.94 ) , - EHF ( 35.48 , -119.10 ) , - EPH ( 47.38 , -119.42 ) , - FMG ( 39.53 , -119.66 ) , - RZS ( 34.51 , -119.77 ) , - CZQ ( 36.88 , -119.82 ) , - YKM ( 46.57 , -120.45 ) , - LKV ( 42.49 , -120.51 ) , - YDC ( 49.47 , -120.52 ) , - MOD ( 37.63 , -120.96 ) , - DSD ( 44.25 , -121.30 ) , - SAC ( 38.44 , -121.55 ) , - SNS ( 36.66 , -121.60 ) , - OAK ( 37.73 , -122.22 ) , - RBL ( 40.10 , -122.24 ) , - SEA ( 47.44 , -122.31 ) , - BLI ( 48.95 , -122.58 ) , // OBSOLETE - PDX ( 45.58 , -122.60 ) , - PYE ( 38.08 , -122.87 ) , - OED ( 42.48 , -122.91 ) , - EUG ( 44.12 , -123.22 ) , - ENI ( 39.05 , -123.27 ) , - ONP ( 44.58 , -124.06 ) , - HQM ( 46.95 , -124.15 ) , - FOT ( 40.67 , -124.23 ) , - TOU ( 48.30 , -124.63 ) , - YQV ( 51.27 , -102.47 ) , - ANN ( 55.05 , -131.57 ) , - LVD ( 56.47 , -133.08 ) , - BKA ( 56.86 , -135.55 ) , - SSR ( 58.17 , -135.25 ) , - JNU ( 58.35 , -134.58 ) , - YAK ( 59.50 , -139.67 ) , - MDO ( 59.45 , -146.30 ) , - JOH ( 60.48 , -146.60 ) , - ODK ( 57.75 , -152.50 ) , - HOM ( 59.65 , -151.48 ) , - ENA ( 60.57 , -151.25 ) , - ANC ( 61.17 , -150.00 ) , - BGQ ( 61.53 , -149.82 ) , - ORT ( 62.97 , -141.93 ) , - GKN ( 62.15 , -145.45 ) , - TKA ( 62.32 , -150.10 ) , - SQA ( 61.10 , -155.63 ) , - DLG ( 59.05 , -158.50 ) , - AKN ( 58.68 , -156.65 ) , - PDN ( 56.95 , -158.65 ) , - CDB ( 55.20 , -162.73 ) , - DUT ( 53.90 , -166.55 ) , - NUD ( 51.88 , -176.65 ) , - SYA ( 52.72 , -174.12 ) , - SPY ( 57.17 , -170.22 ) , - EHM ( 58.66 , -162.07 ) , - HPB ( 61.52 , -166.14 ) , - BET ( 60.78 , -161.83 ) , - ANI ( 61.59 , -159.61 ) , - SMA ( 62.06 , -163.30 ) , - UNK ( 63.88 , -160.80 ) , - ULL ( 63.70 , -170.48 ) , - MCG ( 62.95 , -155.60 ) , - ENN ( 64.55 , -149.07 ) , - FAI ( 64.82 , -147.85 ) , - BIG ( 64.00 , -145.72 ) , - FYU ( 66.57 , -145.25 ) , - BTT ( 66.92 , -151.53 ) , - TAL ( 65.18 , -152.18 ) , - CQR ( 67.50 , -148.47 ) , - SCC ( 70.20 , -148.47 ) , - BTI ( 70.13 , -143.57 ) , - BRW ( 71.28 , -156.77 ) , - GAL ( 64.73 , -156.93 ) , - OME ( 64.52 , -165.45 ) , - OTZ ( 66.88 , -162.60 ) , - WLK ( 66.60 , -160.00 ) , - HSL ( 65.71 , -156.37 ) , - BSF ( 19.76 , -155.39 ) , - UPP ( 20.20 , -155.84 ) , - ITO ( 19.72 , -155.01 ) , - HNL ( 21.33 , -157.93 ) , - OGG ( 20.91 , -156.42 ) , - NDB ( 20.88 , -156.44 ) , - MUE ( 20.00 , -155.67 ) , - NGF ( 21.45 , -157.76 ) , - MKK ( 21.14 , -157.17 ) , - NBS ( 22.04 , -159.79 ) , - CKH ( 21.27 , -157.70 ) , - IAI ( 19.65 , -156.02 ) , - LLD ( 20.77 , -156.97 ) , - LNY ( 20.76 , -156.97 ) , - LIH ( 21.97 , -159.34 ) , - SOK ( 21.90 , -159.53 ) , - // - // Newcomers! These are in the set of VORs now used by AWC for Convective SIGMET bounds, - // but not in (out-of-the-box V5.11.4) $GEMTBL/stns/vors.tbl : - // - RSW ( 26.53 , -81.78 ) , // Lee County VORTAC Fort Myers FL L-VORTAC !? replaces FMY - PZD ( 31.66 , -84.29 ) , // Pecan VORTAC Albany GA H-VORTACW replaces ABY - IIU ( 38.10 , -85.58 ) , // Louisville VORTAC Louisville KY H-VORTAC replaces LOU - HRV ( 29.85 , -90.00 ) , // Harvey VORTAC New Orleans LA H-VORTACW replaces MSY - MCI ( 39.29 , -94.74 ) , // Kansas City VORTAC Kansas City MO H-VORTAC replaces MKC - TTT ( 32.87 , -97.04 ) , // Maverick VOR/DME Dallas-Fort Worth TX H-VORW/DME replaces DFW - CWK ( 30.38 , -97.53 ) , // Centex VORTAC Austin TX H-VORTACW replaces AUS - CME ( 33.34 , -104.62 ) , // Chisum VORTAC Roswell NM H-VORTACW replaces ROW - FTI ( 35.66 , -105.14 ) , // Fort Union VORTAC Las Vegas NM H-VORTACW replaces LVS - RSK ( 36.75 , -108.10 ) , // Rattlesnake VORTAC Farmington NM H-VORTACW replaces FMN - HUH ( 48.95 , -122.58 ) ; // Whatcom VORTAC Bellingham WA H-VORTACW replaces BLI - - private static Log logger = LogFactory.getLog(VOR.class); - - private double latitude; - private double longitude; - - private VOR (double latitude, double longitude) - { - this.latitude = latitude; - this.longitude = longitude; - } - - public double getLatitude() - { - return latitude; - } - - public double getLongitude() - { - return longitude; - } - - public LatLonPoint getLatLonPoint() - { - return new LatLonPoint (latitude, longitude, LatLonPoint.INDEGREES); - } - - private enum Direction { - N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW; - public double getDegrees() { return ordinal() * 22.5; } - } - - private static final double ONE_NM_RADIANS = Math.toRadians (1.0 / 60.0); - - /** - * Given a VOR-relative reference string, returns a LatLonPoint - * (com.raytheon.uf.edex.decodertools.core.LatLonPoint). - * - * @param location A String such as... - * "BOS" - * "20S EMI" - * "30 WNW BUM" - * " 40ENE HUH " - * ...referencing a VOR listed in AC 00-45F - * (Appendix F), optionally preceded by - * distance in nautical miles and 16-point - * compass direction string. - * @return The decoded location as a LatLonPoint; - * null on error (such as unrecognized VOR - * identifier or direction string). - * - */ - public static LatLonPoint getLatLonPoint(String location) { - // Wrap decoding in a try block, in case of exception on - // one ofthe two enum valueOf lookups, or other problems. - try { - location = location.trim(); - // VOR is always last 3 nonblank char of location - String navaid = location.substring(location.length()-3); - LatLonPoint point = VOR.valueOf(navaid).getLatLonPoint(); - // If there's an offset direction/bearing, process it - if (location.length() > 3) { - String u = location.substring(0, location.length()-3); - Pattern p = Pattern.compile("^([0-9]+)\\s*([A-Z]+)"); - Matcher m = p.matcher(u); - if (m.find()) { - String distanceStr = m.group(1); - String bearingStr = m.group(2); - int distanceNM = Integer.parseInt(distanceStr); - double distanceRad = distanceNM * ONE_NM_RADIANS; - // LatLonPoint.positionOf thinks bearing is CCW, not CW... - double bearingDeg = 360.0 - Direction.valueOf(bearingStr).getDegrees(); - double bearingRad = Math.toRadians(bearingDeg); - point = point.positionOf(bearingRad, distanceRad); - } - } - return point; - } - catch (Exception e) { - logger.error("[Error decoding location: " + location + "]"); - return null; - } - } - -} +/** + * + */ +package gov.noaa.nws.ncep.edex.tools.decoder; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +//import com.raytheon.edex.tools.decoder.LatLonPoint; //TO10 +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; //TO11 + +/** + * VOR - A *TEMPORARY* enum class to define some known VORs + * used to define convective SIGMET locations. (See below.) + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * + *
    + * SOFTWARE HISTORY
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 12 Jun 2009  95         B. Hebbard  Initial creation.
    + * 24 Jun 2009  95/132     B. Hebbard  Add getLatLonPoint; move to common plugin
    + * 22 Jul 2009  for 132    B. Hebbard  Port to TO11 until station table avail. EDEX
    + * 
    + * 
    + * + * @author bhebbard + * @version 1.0 + */ +public enum VOR { + + // (From GEMPAK vors.tbl -- for TEMPORARY use only, just until + // this is handled by more general station/location design. + // + // Note these are a SUBSET of the high-altitude VORs in North America + // used by AWC for SIGMET bounding points. It is NOT sufficient + // for lookup in cases where where all VHF NAVAIDs -- or + // even all VORs -- are required [say, for PIREP decoding]) + // + // Lat Lon + YSJ ( 45.32 , -65.88 ) , + HUL ( 46.04 , -67.83 ) , + PQI ( 46.77 , -68.09 ) , + MLT ( 45.58 , -68.52 ) , + BGR ( 44.84 , -68.87 ) , + ACK ( 41.28 , -70.03 ) , + ENE ( 43.43 , -70.61 ) , + BOS ( 42.36 , -70.99 ) , + YQB ( 46.80 , -71.38 ) , + PVD ( 41.72 , -71.43 ) , + CON ( 43.22 , -71.58 ) , + YSC ( 45.43 , -71.68 ) , + HTO ( 40.92 , -72.32 ) , + MPV ( 44.22 , -72.57 ) , + BDL ( 41.94 , -72.69 ) , + PLB ( 44.69 , -73.52 ) , + JFK ( 40.63 , -73.77 ) , + ALB ( 42.75 , -73.80 ) , + CYN ( 39.82 , -74.43 ) , + SAX ( 41.07 , -74.54 ) , + MSS ( 44.91 , -74.72 ) , + SIE ( 39.10 , -74.80 ) , + HNK ( 42.06 , -75.32 ) , + SBY ( 38.35 , -75.52 ) , + YOW ( 45.32 , -75.67 ) , + ETX ( 40.58 , -75.68 ) , + ECG ( 36.25 , -76.18 ) , + SYR ( 43.16 , -76.20 ) , + ORF ( 36.89 , -76.20 ) , + EMI ( 39.50 , -76.98 ) , + HAR ( 40.23 , -77.02 ) , + DCA ( 38.86 , -77.04 ) , + RIC ( 37.50 , -77.32 ) , + CSN ( 38.64 , -77.87 ) , + ILM ( 34.35 , -77.87 ) , + SLT ( 41.51 , -77.97 ) , + PSB ( 40.92 , -77.99 ) , + BUF ( 42.93 , -78.65 ) , + RDU ( 35.87 , -78.78 ) , + JST ( 40.32 , -78.83 ) , + JHW ( 42.19 , -79.12 ) , + LYH ( 37.25 , -79.23 ) , + YYZ ( 43.67 , -79.63 ) , + FLO ( 34.23 , -79.66 ) , + GSO ( 36.05 , -79.98 ) , + CHS ( 32.89 , -80.04 ) , + PBI ( 26.68 , -80.09 ) , + EKN ( 38.92 , -80.10 ) , + EWC ( 40.83 , -80.21 ) , + ERI ( 42.02 , -80.30 ) , + MIA ( 25.80 , -80.30 ) , + VRB ( 27.68 , -80.49 ) , + PSK ( 37.09 , -80.71 ) , + AIR ( 40.02 , -80.82 ) , + CLT ( 35.22 , -80.93 ) , + CAE ( 33.86 , -81.05 ) , + YVV ( 44.75 , -81.10 ) , + SAV ( 32.16 , -81.11 ) , + OMN ( 29.30 , -81.11 ) , + BKW ( 37.78 , -81.12 ) , + ORL ( 28.54 , -81.34 ) , + CRG ( 30.34 , -81.51 ) , + EYW ( 24.59 , -81.80 ) , + FMY ( 26.58 , -81.87 ) , // OBSOLETE + SPA ( 35.03 , -81.93 ) , + HNN ( 38.75 , -82.03 ) , + HMV ( 36.44 , -82.13 ) , + CLE ( 41.42 , -81.85 ) , + IRQ ( 33.71 , -82.16 ) , + AMG ( 31.54 , -82.51 ) , + SRQ ( 27.40 , -82.55 ) , + APE ( 40.15 , -82.59 ) , + PIE ( 27.91 , -82.68 ) , + ECK ( 43.26 , -82.72 ) , + CTY ( 29.60 , -83.05 ) , + ODF ( 34.70 , -83.30 ) , + DXO ( 42.21 , -83.37 ) , + ASP ( 44.45 , -83.39 ) , + MCN ( 32.69 , -83.65 ) , + FNT ( 42.97 , -83.74 ) , + VXV ( 35.90 , -83.89 ) , + ROD ( 40.29 , -84.04 ) , + MBS ( 43.53 , -84.08 ) , + LOZ ( 37.03 , -84.12 ) , + ABY ( 31.65 , -84.30 ) , // OBSOLETE + SSM ( 46.41 , -84.31 ) , + TLH ( 30.56 , -84.37 ) , + ATL ( 33.63 , -84.44 ) , + CVG ( 39.02 , -84.70 ) , + GQO ( 34.96 , -85.15 ) , + FWA ( 40.98 , -85.19 ) , + LGC ( 33.05 , -85.21 ) , + GRR ( 42.79 , -85.50 ) , + TVC ( 44.67 , -85.55 ) , + LOU ( 38.10 , -85.58 ) , // OBSOLETE + MKG ( 43.17 , -86.04 ) , + PMM ( 42.47 , -86.11 ) , + GIJ ( 41.77 , -86.32 ) , + MGM ( 32.22 , -86.32 ) , + IND ( 39.81 , -86.37 ) , + BWG ( 36.93 , -86.44 ) , + BNA ( 36.14 , -86.68 ) , + CEW ( 30.83 , -86.68 ) , + VUZ ( 33.67 , -86.90 ) , + BVT ( 40.56 , -87.07 ) , + TTH ( 39.49 , -87.25 ) , + MSL ( 34.70 , -87.48 ) , + SAW ( 46.36 , -87.40 ) , + PXV ( 37.93 , -87.76 ) , + ORD ( 41.98 , -87.90 ) , + GRB ( 44.56 , -88.19 ) , + BAE ( 43.12 , -88.28 ) , + JOT ( 41.55 , -88.32 ) , + SJI ( 30.73 , -88.36 ) , + IGB ( 33.48 , -88.52 ) , + MEI ( 32.38 , -88.80 ) , + DEC ( 39.74 , -88.86 ) , + YQT ( 48.37 , -89.32 ) , + DYR ( 36.02 , -89.32 ) , + RHI ( 45.63 , -89.45 ) , + BDF ( 41.16 , -89.59 ) , + DLL ( 43.55 , -89.76 ) , + MEM ( 35.06 , -89.98 ) , + LEV ( 29.18 , -90.10 ) , + JAN ( 32.51 , -90.17 ) , + MSY ( 30.00 , -90.27 ) , // OBSOLETE + FAM ( 37.67 , -90.23 ) , + MCB ( 31.30 , -90.26 ) , + SQS ( 33.46 , -90.28 ) , + STL ( 38.86 , -90.48 ) , + DBQ ( 42.40 , -90.71 ) , + ARG ( 36.11 , -90.95 ) , + UIN ( 39.85 , -91.28 ) , + BTR ( 30.48 , -91.30 ) , + ODI ( 43.91 , -91.47 ) , + EAU ( 44.90 , -91.48 ) , + IOW ( 41.52 , -91.61 ) , + MLU ( 32.52 , -92.03 ) , + LIT ( 34.68 , -92.18 ) , + DLH ( 46.80 , -92.20 ) , + COU ( 38.82 , -92.22 ) , + AEX ( 31.26 , -92.50 ) , + IRK ( 40.14 , -92.59 ) , + ELD ( 33.26 , -92.74 ) , + LCH ( 30.14 , -93.11 ) , + MSP ( 44.88 , -93.23 ) , + MCW ( 43.09 , -93.33 ) , + SGF ( 37.36 , -93.33 ) , + INL ( 48.57 , -93.40 ) , + DSM ( 41.44 , -93.65 ) , + EIC ( 32.77 , -93.81 ) , + BRD ( 46.35 , -94.03 ) , + TXK ( 33.51 , -94.07 ) , + RZC ( 36.25 , -94.12 ) , + FSM ( 35.38 , -94.27 ) , + FOD ( 42.61 , -94.29 ) , + BUM ( 38.27 , -94.49 ) , + MKC ( 39.28 , -94.59 ) , // OBSOLETE + LFK ( 31.16 , -94.72 ) , + GGG ( 32.42 , -94.75 ) , + BJI ( 47.58 , -95.02 ) , + RWF ( 44.47 , -95.13 ) , + OSW ( 37.15 , -95.20 ) , + IAH ( 29.96 , -95.35 ) , + OVR ( 41.17 , -95.74 ) , + MLC ( 34.85 , -95.78 ) , + TUL ( 36.20 , -95.79 ) , + PWE ( 40.20 , -96.21 ) , + PSX ( 28.76 , -96.31 ) , + FSD ( 43.65 , -96.78 ) , + FAR ( 46.75 , -96.85 ) , + DFW ( 32.87 , -97.03 ) , // OBSOLETE + ADM ( 34.21 , -97.17 ) , + GFK ( 47.95 , -97.19 ) , + YWG ( 49.90 , -97.23 ) , + ACT ( 31.66 , -97.27 ) , + BRO ( 25.92 , -97.38 ) , + CRP ( 27.90 , -97.45 ) , + ICT ( 37.75 , -97.58 ) , + OKC ( 35.36 , -97.61 ) , + SLN ( 38.93 , -97.62 ) , + AUS ( 30.30 , -97.70 ) , // OBSOLETE + END ( 36.35 , -97.92 ) , + OBH ( 41.38 , -98.35 ) , + ABR ( 45.42 , -98.37 ) , + SAT ( 29.64 , -98.46 ) , + SPS ( 33.99 , -98.59 ) , + ONL ( 42.47 , -98.69 ) , + LRD ( 27.48 , -99.42 ) , + JCT ( 30.60 , -99.82 ) , + ABI ( 32.48 , -99.86 ) , + GAG ( 36.34 , -99.88 ) , + ANW ( 42.57 , -99.99 ) , + PIR ( 44.40 , -100.17 ) , + HLC ( 39.26 , -100.23 ) , + CDS ( 34.37 , -100.28 ) , + SJT ( 31.38 , -100.46 ) , + MCK ( 40.20 , -100.59 ) , + BIS ( 46.77 , -100.67 ) , + LBF ( 41.13 , -100.72 ) , + GCK ( 37.92 , -100.73 ) , + DLF ( 29.36 , -100.77 ) , + LBL ( 37.04 , -100.97 ) , + MOT ( 48.26 , -101.29 ) , + AMA ( 35.29 , -101.64 ) , + GLD ( 39.39 , -101.69 ) , + DPR ( 45.08 , -101.72 ) , + LBB ( 33.70 , -101.92 ) , + MAF ( 32.02 , -102.18 ) , + LAA ( 38.20 , -102.69 ) , + DIK ( 46.86 , -102.77 ) , + TXO ( 34.50 , -102.84 ) , + SNY ( 41.10 , -102.98 ) , + FST ( 30.95 , -102.98 ) , + RAP ( 43.98 , -103.01 ) , + AKO ( 40.16 , -103.18 ) , + INK ( 31.87 , -103.24 ) , + BFF ( 41.89 , -103.48 ) , + TBE ( 37.27 , -103.60 ) , + TCC ( 35.18 , -103.60 ) , + ISN ( 48.18 , -103.63 ) , + MRF ( 30.30 , -103.95 ) , + PUB ( 38.29 , -104.43 ) , + ROW ( 33.34 , -104.62 ) , // OBSOLETE + DEN ( 39.81 , -104.66 ) , + CYS ( 41.21 , -104.77 ) , + CIM ( 36.49 , -104.87 ) , + LVS ( 35.66 , -105.14 ) , // OBSOLETE + LAR ( 41.33 , -105.72 ) , + ALS ( 37.35 , -105.82 ) , + MLS ( 46.38 , -105.95 ) , + DDY ( 43.09 , -106.28 ) , + ELP ( 31.82 , -106.28 ) , + CZI ( 44.00 , -106.44 ) , + GGW ( 48.22 , -106.63 ) , + ABQ ( 35.04 , -106.82 ) , + DBL ( 39.44 , -106.90 ) , + HBU ( 38.45 , -107.04 ) , + SHR ( 44.84 , -107.06 ) , + TCS ( 33.28 , -107.28 ) , + CHE ( 40.52 , -107.31 ) , + DMN ( 32.28 , -107.60 ) , + YYN ( 50.28 , -107.68 ) , + FMN ( 36.75 , -108.10 ) , // OBSOLETE + BOY ( 43.46 , -108.30 ) , + BIL ( 45.81 , -108.63 ) , + JNC ( 39.06 , -108.79 ) , + DVC ( 37.81 , -108.93 ) , + OCS ( 41.59 , -109.02 ) , + SJN ( 34.42 , -109.14 ) , + SSO ( 32.27 , -109.26 ) , + LWT ( 47.05 , -109.61 ) , + HVR ( 48.54 , -109.77 ) , + BPI ( 42.58 , -110.11 ) , + MTU ( 40.15 , -110.13 ) , + HVE ( 38.42 , -110.70 ) , + YXH ( 50.02 , -110.72 ) , + JAC ( 43.62 , -110.73 ) , + INW ( 35.06 , -110.80 ) , + TUS ( 32.10 , -110.92 ) , + TBC ( 36.12 , -111.27 ) , + GTF ( 47.45 , -111.41 ) , + HLN ( 46.61 , -111.95 ) , + PHX ( 33.43 , -112.02 ) , + SLC ( 40.85 , -111.98 ) , + DBS ( 44.09 , -112.21 ) , + BCE ( 37.69 , -112.30 ) , + MLD ( 42.20 , -112.45 ) , + DRK ( 34.70 , -112.48 ) , + DTA ( 39.30 , -112.51 ) , + DLN ( 45.25 , -112.55 ) , + PIH ( 42.87 , -112.65 ) , + YQL ( 49.63 , -112.80 ) , + PGS ( 35.62 , -113.54 ) , + BVL ( 40.73 , -113.76 ) , + LKT ( 45.02 , -114.08 ) , + FCA ( 48.21 , -114.18 ) , + ILC ( 38.25 , -114.39 ) , + EED ( 34.77 , -114.47 ) , + TWF ( 42.48 , -114.49 ) , + BZA ( 32.77 , -114.60 ) , + ELY ( 39.30 , -114.85 ) , + LAS ( 36.08 , -115.16 ) , + MLP ( 47.46 , -115.65 ) , + YXC ( 49.60 , -115.78 ) , + TRM ( 33.63 , -116.16 ) , + BOI ( 43.55 , -116.19 ) , + DNJ ( 44.77 , -116.21 ) , + HEC ( 34.80 , -116.46 ) , + BTY ( 36.80 , -116.75 ) , + BAM ( 40.57 , -116.92 ) , + MZB ( 32.78 , -117.23 ) , + GEG ( 47.56 , -117.63 ) , + OAL ( 38.00 , -117.77 ) , + BKE ( 44.84 , -117.81 ) , + REO ( 42.59 , -117.87 ) , + LAX ( 33.93 , -118.43 ) , + PDT ( 45.70 , -118.94 ) , + EHF ( 35.48 , -119.10 ) , + EPH ( 47.38 , -119.42 ) , + FMG ( 39.53 , -119.66 ) , + RZS ( 34.51 , -119.77 ) , + CZQ ( 36.88 , -119.82 ) , + YKM ( 46.57 , -120.45 ) , + LKV ( 42.49 , -120.51 ) , + YDC ( 49.47 , -120.52 ) , + MOD ( 37.63 , -120.96 ) , + DSD ( 44.25 , -121.30 ) , + SAC ( 38.44 , -121.55 ) , + SNS ( 36.66 , -121.60 ) , + OAK ( 37.73 , -122.22 ) , + RBL ( 40.10 , -122.24 ) , + SEA ( 47.44 , -122.31 ) , + BLI ( 48.95 , -122.58 ) , // OBSOLETE + PDX ( 45.58 , -122.60 ) , + PYE ( 38.08 , -122.87 ) , + OED ( 42.48 , -122.91 ) , + EUG ( 44.12 , -123.22 ) , + ENI ( 39.05 , -123.27 ) , + ONP ( 44.58 , -124.06 ) , + HQM ( 46.95 , -124.15 ) , + FOT ( 40.67 , -124.23 ) , + TOU ( 48.30 , -124.63 ) , + YQV ( 51.27 , -102.47 ) , + ANN ( 55.05 , -131.57 ) , + LVD ( 56.47 , -133.08 ) , + BKA ( 56.86 , -135.55 ) , + SSR ( 58.17 , -135.25 ) , + JNU ( 58.35 , -134.58 ) , + YAK ( 59.50 , -139.67 ) , + MDO ( 59.45 , -146.30 ) , + JOH ( 60.48 , -146.60 ) , + ODK ( 57.75 , -152.50 ) , + HOM ( 59.65 , -151.48 ) , + ENA ( 60.57 , -151.25 ) , + ANC ( 61.17 , -150.00 ) , + BGQ ( 61.53 , -149.82 ) , + ORT ( 62.97 , -141.93 ) , + GKN ( 62.15 , -145.45 ) , + TKA ( 62.32 , -150.10 ) , + SQA ( 61.10 , -155.63 ) , + DLG ( 59.05 , -158.50 ) , + AKN ( 58.68 , -156.65 ) , + PDN ( 56.95 , -158.65 ) , + CDB ( 55.20 , -162.73 ) , + DUT ( 53.90 , -166.55 ) , + NUD ( 51.88 , -176.65 ) , + SYA ( 52.72 , -174.12 ) , + SPY ( 57.17 , -170.22 ) , + EHM ( 58.66 , -162.07 ) , + HPB ( 61.52 , -166.14 ) , + BET ( 60.78 , -161.83 ) , + ANI ( 61.59 , -159.61 ) , + SMA ( 62.06 , -163.30 ) , + UNK ( 63.88 , -160.80 ) , + ULL ( 63.70 , -170.48 ) , + MCG ( 62.95 , -155.60 ) , + ENN ( 64.55 , -149.07 ) , + FAI ( 64.82 , -147.85 ) , + BIG ( 64.00 , -145.72 ) , + FYU ( 66.57 , -145.25 ) , + BTT ( 66.92 , -151.53 ) , + TAL ( 65.18 , -152.18 ) , + CQR ( 67.50 , -148.47 ) , + SCC ( 70.20 , -148.47 ) , + BTI ( 70.13 , -143.57 ) , + BRW ( 71.28 , -156.77 ) , + GAL ( 64.73 , -156.93 ) , + OME ( 64.52 , -165.45 ) , + OTZ ( 66.88 , -162.60 ) , + WLK ( 66.60 , -160.00 ) , + HSL ( 65.71 , -156.37 ) , + BSF ( 19.76 , -155.39 ) , + UPP ( 20.20 , -155.84 ) , + ITO ( 19.72 , -155.01 ) , + HNL ( 21.33 , -157.93 ) , + OGG ( 20.91 , -156.42 ) , + NDB ( 20.88 , -156.44 ) , + MUE ( 20.00 , -155.67 ) , + NGF ( 21.45 , -157.76 ) , + MKK ( 21.14 , -157.17 ) , + NBS ( 22.04 , -159.79 ) , + CKH ( 21.27 , -157.70 ) , + IAI ( 19.65 , -156.02 ) , + LLD ( 20.77 , -156.97 ) , + LNY ( 20.76 , -156.97 ) , + LIH ( 21.97 , -159.34 ) , + SOK ( 21.90 , -159.53 ) , + // + // Newcomers! These are in the set of VORs now used by AWC for Convective SIGMET bounds, + // but not in (out-of-the-box V5.11.4) $GEMTBL/stns/vors.tbl : + // + RSW ( 26.53 , -81.78 ) , // Lee County VORTAC Fort Myers FL L-VORTAC !? replaces FMY + PZD ( 31.66 , -84.29 ) , // Pecan VORTAC Albany GA H-VORTACW replaces ABY + IIU ( 38.10 , -85.58 ) , // Louisville VORTAC Louisville KY H-VORTAC replaces LOU + HRV ( 29.85 , -90.00 ) , // Harvey VORTAC New Orleans LA H-VORTACW replaces MSY + MCI ( 39.29 , -94.74 ) , // Kansas City VORTAC Kansas City MO H-VORTAC replaces MKC + TTT ( 32.87 , -97.04 ) , // Maverick VOR/DME Dallas-Fort Worth TX H-VORW/DME replaces DFW + CWK ( 30.38 , -97.53 ) , // Centex VORTAC Austin TX H-VORTACW replaces AUS + CME ( 33.34 , -104.62 ) , // Chisum VORTAC Roswell NM H-VORTACW replaces ROW + FTI ( 35.66 , -105.14 ) , // Fort Union VORTAC Las Vegas NM H-VORTACW replaces LVS + RSK ( 36.75 , -108.10 ) , // Rattlesnake VORTAC Farmington NM H-VORTACW replaces FMN + HUH ( 48.95 , -122.58 ) ; // Whatcom VORTAC Bellingham WA H-VORTACW replaces BLI + + private static Log logger = LogFactory.getLog(VOR.class); + + private double latitude; + private double longitude; + + private VOR (double latitude, double longitude) + { + this.latitude = latitude; + this.longitude = longitude; + } + + public double getLatitude() + { + return latitude; + } + + public double getLongitude() + { + return longitude; + } + + public LatLonPoint getLatLonPoint() + { + return new LatLonPoint (latitude, longitude, LatLonPoint.INDEGREES); + } + + private enum Direction { + N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW; + public double getDegrees() { return ordinal() * 22.5; } + } + + private static final double ONE_NM_RADIANS = Math.toRadians (1.0 / 60.0); + + /** + * Given a VOR-relative reference string, returns a LatLonPoint + * (com.raytheon.uf.edex.decodertools.core.LatLonPoint). + * + * @param location A String such as... + * "BOS" + * "20S EMI" + * "30 WNW BUM" + * " 40ENE HUH " + * ...referencing a VOR listed in AC 00-45F + * (Appendix F), optionally preceded by + * distance in nautical miles and 16-point + * compass direction string. + * @return The decoded location as a LatLonPoint; + * null on error (such as unrecognized VOR + * identifier or direction string). + * + */ + public static LatLonPoint getLatLonPoint(String location) { + // Wrap decoding in a try block, in case of exception on + // one ofthe two enum valueOf lookups, or other problems. + try { + location = location.trim(); + // VOR is always last 3 nonblank char of location + String navaid = location.substring(location.length()-3); + LatLonPoint point = VOR.valueOf(navaid).getLatLonPoint(); + // If there's an offset direction/bearing, process it + if (location.length() > 3) { + String u = location.substring(0, location.length()-3); + Pattern p = Pattern.compile("^([0-9]+)\\s*([A-Z]+)"); + Matcher m = p.matcher(u); + if (m.find()) { + String distanceStr = m.group(1); + String bearingStr = m.group(2); + int distanceNM = Integer.parseInt(distanceStr); + double distanceRad = distanceNM * ONE_NM_RADIANS; + // LatLonPoint.positionOf thinks bearing is CCW, not CW... + double bearingDeg = 360.0 - Direction.valueOf(bearingStr).getDegrees(); + double bearingRad = Math.toRadians(bearingDeg); + point = point.positionOf(bearingRad, distanceRad); + } + } + return point; + } + catch (Exception e) { + logger.error("[Error decoding location: " + location + "]"); + return null; + } + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/package-info.java old mode 100644 new mode 100755 index 44b8eecc06..bd90a7c646 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.tools.decoder; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.tools.decoder; diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/UtilN.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/UtilN.java old mode 100644 new mode 100755 index ac9ad3c11c..0d967ca0a4 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/UtilN.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/UtilN.java @@ -1,122 +1,122 @@ -/* - * - * Util - * - * This java class contains edex generic utility methods for use. - * - * T. Lee 11/2008 Creation - * T. Lee 3/2009 Fixed roll-over cases; added String functions - * T. Lee 4/2009 Added date to the base time - * T. Lee - *
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    	Engineer    Description
    - * ------------ ---------- 	----------- --------------------------
    - * 11/2008		14			T. Lee		Creation
    - *  3/2009		14			T. Lee		Fixed roll-over cases; added String functions
    - *  4/2009		14			T. Lee		Added date to the base time
    - *  5/2009		128			T. Lee		Used UTC in findDataTime
    - * 
    - * - * @author T.Lee - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.util; - -import java.util.Calendar; -import java.util.TimeZone; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import com.raytheon.edex.util.Util; - -public class UtilN { - private static final Log logger = LogFactory.getLog(UtilN.class); - - /** - * Constructor - */ - public UtilN() { - - } - /** - * Convert a string in ddhhmm format to a standard {@link Calendar} format where - * ddhhmm is the GMT format while the standard time is in Calendar format with - * Year and Month information. Usage: ddhhmm is the issue time whereas utcTime - * can be the MDN time. The former comes "after" the latter. - * - * @parm ddhhmm day-hour-minute in GMT - * @parm local Time UTC time in Calendar - */ - public static Calendar findDataTime (String ddhhmm, Calendar utcTime) { - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); ; - if ( utcTime == null ) { - try { - return Util.findCurrentTime(ddhhmm); - } catch (Exception e) { - if ( logger.isInfoEnabled()) { - logger.info( " Error in processing MND time; return current time "); - } - return cal; - } - - } else { - int iDay = Integer.parseInt(ddhhmm.substring(0, 2).trim()); - int iHour = Integer.parseInt(ddhhmm.substring(2, 4).trim()); - int iMinute = Integer.parseInt(ddhhmm.substring(4, 6).trim()); - int iMonth = utcTime.get(Calendar.MONTH); - int iYear = utcTime.get(Calendar.YEAR); - - /* - * adjust the month and year for roll-over situations - */ - if (iDay < utcTime.get(Calendar.DAY_OF_MONTH) ) { - iMonth++; - if ( iMonth == 12 ) { - iMonth = Calendar.JANUARY; - iYear++; - } - } - cal.set(iYear,iMonth,iDay,iHour,iMinute); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - return cal; - } - } - - /** - * Remove the leading spaces and tabs in a string. - */ - public static String removeLeadingWhiteSpaces (String str) { - int i; - for ( i = 0; i < str.length(); i++ ) { - if ( !Character.isWhitespace(str.charAt(i))) { - break; - } - } - return str.substring(i); - } - - /** - * Remove multiple white spaces in a string. - */ - public static String removeExtraWhiteSpaces (String str) { - StringBuffer sb = new StringBuffer(); - int i; - char first = str.charAt(0); - char second; - for ( i = 1; i < str.length(); i++ ) { - second = str.charAt(i); - if ( !Character.isWhitespace(first) || !Character.isWhitespace(second)) { - sb.append(first); - first = second; - } - if ( i == ( str.length()-1) ) { - sb.append(second); - } - } - return sb.toString(); - } -} +/* + * + * Util + * + * This java class contains edex generic utility methods for use. + * + * T. Lee 11/2008 Creation + * T. Lee 3/2009 Fixed roll-over cases; added String functions + * T. Lee 4/2009 Added date to the base time + * T. Lee + *
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    	Engineer    Description
    + * ------------ ---------- 	----------- --------------------------
    + * 11/2008		14			T. Lee		Creation
    + *  3/2009		14			T. Lee		Fixed roll-over cases; added String functions
    + *  4/2009		14			T. Lee		Added date to the base time
    + *  5/2009		128			T. Lee		Used UTC in findDataTime
    + * 
    + * + * @author T.Lee + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.util; + +import java.util.Calendar; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import com.raytheon.edex.util.Util; + +public class UtilN { + private static final Log logger = LogFactory.getLog(UtilN.class); + + /** + * Constructor + */ + public UtilN() { + + } + /** + * Convert a string in ddhhmm format to a standard {@link Calendar} format where + * ddhhmm is the GMT format while the standard time is in Calendar format with + * Year and Month information. Usage: ddhhmm is the issue time whereas utcTime + * can be the MDN time. The former comes "after" the latter. + * + * @parm ddhhmm day-hour-minute in GMT + * @parm local Time UTC time in Calendar + */ + public static Calendar findDataTime (String ddhhmm, Calendar utcTime) { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); ; + if ( utcTime == null ) { + try { + return Util.findCurrentTime(ddhhmm); + } catch (Exception e) { + if ( logger.isInfoEnabled()) { + logger.info( " Error in processing MND time; return current time "); + } + return cal; + } + + } else { + int iDay = Integer.parseInt(ddhhmm.substring(0, 2).trim()); + int iHour = Integer.parseInt(ddhhmm.substring(2, 4).trim()); + int iMinute = Integer.parseInt(ddhhmm.substring(4, 6).trim()); + int iMonth = utcTime.get(Calendar.MONTH); + int iYear = utcTime.get(Calendar.YEAR); + + /* + * adjust the month and year for roll-over situations + */ + if (iDay < utcTime.get(Calendar.DAY_OF_MONTH) ) { + iMonth++; + if ( iMonth == 12 ) { + iMonth = Calendar.JANUARY; + iYear++; + } + } + cal.set(iYear,iMonth,iDay,iHour,iMinute); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal; + } + } + + /** + * Remove the leading spaces and tabs in a string. + */ + public static String removeLeadingWhiteSpaces (String str) { + int i; + for ( i = 0; i < str.length(); i++ ) { + if ( !Character.isWhitespace(str.charAt(i))) { + break; + } + } + return str.substring(i); + } + + /** + * Remove multiple white spaces in a string. + */ + public static String removeExtraWhiteSpaces (String str) { + StringBuffer sb = new StringBuffer(); + int i; + char first = str.charAt(0); + char second; + for ( i = 1; i < str.length(); i++ ) { + second = str.charAt(i); + if ( !Character.isWhitespace(first) || !Character.isWhitespace(second)) { + sb.append(first); + first = second; + } + if ( i == ( str.length()-1) ) { + sb.append(second); + } + } + return sb.toString(); + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/package-info.java old mode 100644 new mode 100755 index 56ea3b8542..6bd08cd08a --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/dictionary/gempakParmDict.pkl b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/dictionary/gempakParmDict.pkl deleted file mode 100644 index 73dc606546..0000000000 Binary files a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/dictionary/gempakParmDict.pkl and /dev/null differ diff --git a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/idftLoc.xml b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/idftLoc.xml old mode 100644 new mode 100755 index bf4bde2cec..e8c90fc54d --- a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/idftLoc.xml +++ b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/idftLoc.xml @@ -1,1868 +1,1868 @@ - - - - - 0001 - 000001 - POINT 1 - 48.88 - -60.02 - 0 - 0 - - - 0002 - 000002 - POINT 2 - 46.24 - -51.39 - 0 - 0 - - - 0003 - 000003 - POINT 3 - 54.46 - -80.00 - 0 - 0 - - - 0004 - 000004 - POINT 4 - 50.58 - -53.43 - 0 - 0 - - - 0005 - 000005 - POINT 5 - 49.02 - -49.04 - 0 - 0 - - - 0006 - 000006 - POINT 6 - 47.27 - -45.01 - 0 - 0 - - - 0007 - 000007 - POINT 7 - 57.63 - -86.34 - 0 - 0 - - - 0008 - 000008 - POINT 8 - 57.82 - -80.00 - 0 - 0 - - - 0009 - 000009 - POINT 9 - 56.18 - -61.57 - 0 - 0 - - - 0010 - 000010 - POINT 10 - 54.97 - -56.04 - 0 - 0 - - - 0011 - 000011 - POINT 11 - 53.48 - -50.95 - 0 - 0 - - - 0012 - 000012 - POINT 12 - 51.76 - -46.31 - 0 - 0 - - - 0013 - 000013 - POINT 13 - 49.86 - -42.13 - 0 - 0 - - - 0014 - 000014 - POINT 14 - 60.39 - -94.04 - 0 - 0 - - - 0015 - 000015 - POINT 15 - 61.03 - -87.13 - 0 - 0 - - - 0016 - 000016 - POINT 16 - 61.24 - -80.00 - 0 - 0 - - - 0017 - 000017 - POINT 17 - 61.03 - -72.88 - 0 - 0 - - - 0018 - 000018 - POINT 18 - 60.39 - -65.96 - 0 - 0 - - - 0019 - 000019 - POINT 19 - 59.37 - -59.44 - 0 - 0 - - - 0020 - 000020 - POINT 20 - 58.01 - -53.43 - 0 - 0 - - - 0021 - 000021 - POINT 21 - 56.36 - -47.99 - 0 - 0 - - - 0022 - 000022 - POINT 22 - 54.46 - -43.13 - 0 - 0 - - - 0023 - 000023 - POINT 23 - 64.46 - -88.13 - 0 - 0 - - - 0024 - 000024 - POINT 24 - 64.71 - -80.00 - 0 - 0 - - - 0025 - 000025 - POINT 25 - 64.46 - -71.87 - 0 - 0 - - - 0026 - 000026 - POINT 26 - 63.74 - -64.05 - 0 - 0 - - - 0027 - 000027 - POINT 27 - 62.57 - -56.80 - 0 - 0 - - - 0028 - 000028 - POINT 28 - 61.03 - -50.26 - 0 - 0 - - - 0029 - 000029 - POINT 29 - 59.18 - -44.46 - 0 - 0 - - - 0030 - 000030 - POINT 30 - 57.08 - -39.40 - 0 - 0 - - - 0031 - 000031 - POINT 31 - 67.08 - -98.43 - 0 - 0 - - - 0032 - 000032 - POINT 32 - 67.94 - -89.46 - 0 - 0 - - - 0033 - 000033 - POINT 33 - 68.23 - -80.00 - 0 - 0 - - - 0034 - 000034 - POINT 34 - 67.08 - -61.57 - 0 - 0 - - - 0035 - 000035 - POINT 35 - 65.73 - -53.43 - 0 - 0 - - - 0036 - 000036 - POINT 36 - 63.98 - -46.31 - 0 - 0 - - - 0037 - 000037 - POINT 37 - 61.90 - -40.19 - 0 - 0 - - - 0038 - 000038 - POINT 38 - 59.58 - -35.00 - 0 - 0 - - - 0039 - 000039 - POINT 39 - 68.83 - -110.96 - 0 - 0 - - - 0040 - 000040 - POINT 40 - 70.42 - -101.80 - 0 - 0 - - - 0041 - 000041 - POINT 41 - 71.44 - -91.31 - 0 - 0 - - - 0042 - 000042 - POINT 42 - 71.79 - -80.00 - 0 - 0 - - - 0043 - 000043 - POINT 43 - 71.44 - -68.69 - 0 - 0 - - - 0044 - 000044 - POINT 44 - 70.42 - -58.20 - 0 - 0 - - - 0045 - 000045 - POINT 45 - 64.46 - -35.00 - 0 - 0 - - - 0046 - 000046 - POINT 46 - 61.90 - -29.81 - 0 - 0 - - - 0047 - 000047 - POINT 47 - 69.45 - -125.00 - 0 - 0 - - - 0048 - 000048 - POINT 48 - 71.79 - -116.87 - 0 - 0 - - - 0049 - 000049 - POINT 49 - 73.69 - -106.57 - 0 - 0 - - - 0050 - 000050 - POINT 50 - 74.95 - -94.04 - 0 - 0 - - - 0051 - 000051 - POINT 51 - 75.39 - -80.00 - 0 - 0 - - - 0052 - 000052 - POINT 52 - 74.95 - -65.96 - 0 - 0 - - - 0053 - 000053 - POINT 53 - 73.69 - -53.43 - 0 - 0 - - - 0054 - 000054 - POINT 54 - 66.81 - -28.66 - 0 - 0 - - - 0055 - 000055 - POINT 55 - 63.98 - -23.69 - 0 - 0 - - - 0056 - 000056 - POINT 56 - 68.83 - -139.04 - 0 - 0 - - - 0057 - 000057 - POINT 57 - 71.79 - -133.13 - 0 - 0 - - - 0058 - 000058 - POINT 58 - 74.51 - -125.00 - 0 - 0 - - - 0059 - 000059 - POINT 59 - 76.82 - -113.69 - 0 - 0 - - - 0060 - 000060 - POINT 60 - 78.43 - -98.43 - 0 - 0 - - - 0061 - 000061 - POINT 61 - 79.02 - -80.00 - 0 - 0 - - - 0062 - 000062 - POINT 62 - 71.79 - -26.87 - 0 - 0 - - - 0063 - 000063 - POINT 63 - 68.83 - -20.96 - 0 - 0 - - - 0064 - 000064 - POINT 64 - 65.73 - -16.57 - 0 - 0 - - - 0065 - 000065 - POINT 65 - 62.57 - -13.20 - 0 - 0 - - - 0066 - 000066 - POINT 66 - 70.42 - -148.20 - 0 - 0 - - - 0067 - 000067 - POINT 67 - 73.69 - -143.44 - 0 - 0 - - - 0068 - 000068 - POINT 68 - 76.82 - -136.31 - 0 - 0 - - - 0069 - 000069 - POINT 69 - 79.64 - -125.00 - 0 - 0 - - - 0070 - 000070 - POINT 70 - 81.80 - -106.57 - 0 - 0 - - - 0071 - 000071 - POINT 71 - 82.67 - -80.00 - 0 - 0 - - - 0072 - 000072 - POINT 72 - 81.80 - -53.43 - 0 - 0 - - - 0073 - 000073 - POINT 73 - 76.82 - -23.69 - 0 - 0 - - - 0074 - 000074 - POINT 74 - 73.69 - -16.57 - 0 - 0 - - - 0075 - 000075 - POINT 75 - 70.42 - -11.80 - 0 - 0 - - - 0076 - 000076 - POINT 76 - 67.08 - -8.43 - 0 - 0 - - - 0077 - 000077 - POINT 77 - 54.30 - -164.29 - 0 - 0 - - - 0078 - 000078 - POINT 78 - 57.63 - -163.66 - 0 - 0 - - - 0079 - 000079 - POINT 79 - 61.03 - -162.88 - 0 - 0 - - - 0080 - 000080 - POINT 80 - 64.46 - -161.87 - 0 - 0 - - - 0081 - 000081 - POINT 81 - 67.94 - -160.54 - 0 - 0 - - - 0082 - 000082 - POINT 82 - 71.44 - -158.69 - 0 - 0 - - - 0083 - 000083 - POINT 83 - 74.95 - -155.96 - 0 - 0 - - - 0084 - 000084 - POINT 84 - 78.43 - -151.57 - 0 - 0 - - - 0085 - 000085 - POINT 85 - 81.80 - -143.44 - 0 - 0 - - - 0086 - 000086 - POINT 86 - 84.81 - -125.00 - 0 - 0 - - - 0087 - 000087 - POINT 87 - 86.33 - -80.00 - 0 - 0 - - - 0088 - 000088 - POINT 88 - 84.81 - -35.00 - 0 - 0 - - - 0089 - 000089 - POINT 89 - 81.80 - -16.57 - 0 - 0 - - - 0090 - 000090 - POINT 90 - 78.43 - -8.43 - 0 - 0 - - - 0091 - 000091 - POINT 91 - 74.95 - -4.04 - 0 - 0 - - - 0092 - 000092 - POINT 92 - 71.44 - -1.31 - 0 - 0 - - - 0093 - 000093 - POINT 93 - 54.46 - -170.00 - 0 - 0 - - - 0094 - 000094 - POINT 94 - 57.82 - -170.00 - 0 - 0 - - - 0095 - 000095 - POINT 95 - 61.24 - -170.00 - 0 - 0 - - - 0096 - 000096 - POINT 96 - 64.71 - -170.00 - 0 - 0 - - - 0097 - 000097 - POINT 97 - 68.23 - -170.00 - 0 - 0 - - - 0098 - 000098 - POINT 98 - 71.79 - -170.00 - 0 - 0 - - - 0099 - 000099 - POINT 99 - 75.39 - -170.00 - 0 - 0 - - - 0100 - 000100 - POINT 100 - 79.02 - -170.00 - 0 - 0 - - - 0101 - 000101 - POINT 101 - 82.67 - -170.00 - 0 - 0 - - - 0102 - 000102 - POINT 102 - 86.33 - -170.00 - 0 - 0 - - - 0103 - 000103 - POINT 103 - 90.00 - -80.00 - 0 - 0 - - - 0104 - 000104 - POINT 104 - 86.33 - 10.00 - 0 - 0 - - - 0105 - 000105 - POINT 105 - 82.67 - 10.00 - 0 - 0 - - - 0106 - 000106 - POINT 106 - 79.02 - 10.00 - 0 - 0 - - - 0107 - 000107 - POINT 107 - 75.39 - 10.00 - 0 - 0 - - - 0108 - 000108 - POINT 108 - 71.79 - 10.00 - 0 - 0 - - - 0109 - 000109 - POINT 109 - 57.82 - 10.00 - 0 - 0 - - - 0110 - 000110 - POINT 110 - 54.46 - 10.00 - 0 - 0 - - - 0111 - 000111 - POINT 111 - 54.30 - -175.71 - 0 - 0 - - - 0112 - 000112 - POINT 112 - 57.63 - -176.34 - 0 - 0 - - - 0113 - 000113 - POINT 113 - 61.03 - -177.13 - 0 - 0 - - - 0114 - 000114 - POINT 114 - 64.46 - -178.13 - 0 - 0 - - - 0115 - 000115 - POINT 115 - 67.94 - -179.46 - 0 - 0 - - - 0116 - 000116 - POINT 116 - 71.44 - 178.69 - 0 - 0 - - - 0117 - 000117 - POINT 117 - 74.95 - 175.96 - 0 - 0 - - - 0118 - 000118 - POINT 118 - 78.43 - 171.57 - 0 - 0 - - - 0119 - 000119 - POINT 119 - 81.80 - 163.44 - 0 - 0 - - - 0120 - 000120 - POINT 120 - 84.81 - 145.00 - 0 - 0 - - - 0121 - 000121 - POINT 121 - 86.33 - 100.00 - 0 - 0 - - - 0122 - 000122 - POINT 122 - 84.81 - 55.00 - 0 - 0 - - - 0123 - 000123 - POINT 123 - 81.80 - 36.57 - 0 - 0 - - - 0124 - 000124 - POINT 124 - 78.43 - 28.44 - 0 - 0 - - - 0125 - 000125 - POINT 125 - 74.95 - 24.04 - 0 - 0 - - - 0126 - 000126 - POINT 126 - 71.44 - 21.31 - 0 - 0 - - - 0127 - 000127 - POINT 127 - 61.03 - 17.13 - 0 - 0 - - - 0128 - 000128 - POINT 128 - 57.63 - 16.34 - 0 - 0 - - - 0129 - 000129 - POINT 129 - 54.30 - 15.71 - 0 - 0 - - - 0130 - 000130 - POINT 130 - 53.80 - 178.69 - 0 - 0 - - - 0131 - 000131 - POINT 131 - 57.08 - 177.47 - 0 - 0 - - - 0132 - 000132 - POINT 132 - 60.39 - 175.96 - 0 - 0 - - - 0133 - 000133 - POINT 133 - 70.42 - 168.20 - 0 - 0 - - - 0134 - 000134 - POINT 134 - 73.69 - 163.44 - 0 - 0 - - - 0135 - 000135 - POINT 135 - 76.82 - 156.31 - 0 - 0 - - - 0136 - 000136 - POINT 136 - 79.64 - 145.00 - 0 - 0 - - - 0137 - 000137 - POINT 137 - 81.80 - 126.57 - 0 - 0 - - - 0138 - 000138 - POINT 138 - 82.67 - 100.00 - 0 - 0 - - - 0139 - 000139 - POINT 139 - 81.80 - 73.44 - 0 - 0 - - - 0140 - 000140 - POINT 140 - 79.64 - 55.00 - 0 - 0 - - - 0141 - 000141 - POINT 141 - 76.82 - 43.69 - 0 - 0 - - - 0142 - 000142 - POINT 142 - 73.69 - 36.57 - 0 - 0 - - - 0143 - 000143 - POINT 143 - 70.42 - 31.80 - 0 - 0 - - - 0144 - 000144 - POINT 144 - 63.74 - 25.95 - 0 - 0 - - - 0145 - 000145 - POINT 145 - 60.39 - 24.04 - 0 - 0 - - - 0146 - 000146 - POINT 146 - 57.08 - 22.53 - 0 - 0 - - - 0147 - 000147 - POINT 147 - 56.18 - 171.57 - 0 - 0 - - - 0148 - 000148 - POINT 148 - 59.37 - 169.44 - 0 - 0 - - - 0149 - 000149 - POINT 149 - 71.79 - 153.13 - 0 - 0 - - - 0150 - 000150 - POINT 150 - 74.51 - 145.00 - 0 - 0 - - - 0151 - 000151 - POINT 151 - 76.82 - 133.69 - 0 - 0 - - - 0152 - 000152 - POINT 152 - 78.43 - 118.44 - 0 - 0 - - - 0153 - 000153 - POINT 153 - 79.02 - 100.00 - 0 - 0 - - - 0154 - 000154 - POINT 154 - 78.43 - 81.57 - 0 - 0 - - - 0155 - 000155 - POINT 155 - 76.82 - 66.31 - 0 - 0 - - - 0156 - 000156 - POINT 156 - 74.51 - 55.00 - 0 - 0 - - - 0157 - 000157 - POINT 157 - 71.79 - 46.87 - 0 - 0 - - - 0158 - 000158 - POINT 158 - 68.83 - 40.96 - 0 - 0 - - - 0159 - 000159 - POINT 159 - 65.73 - 36.57 - 0 - 0 - - - 0160 - 000160 - POINT 160 - 59.37 - 30.56 - 0 - 0 - - - 0161 - 000161 - POINT 161 - 54.97 - 166.04 - 0 - 0 - - - 0162 - 000162 - POINT 162 - 58.01 - 163.44 - 0 - 0 - - - 0163 - 000163 - POINT 163 - 61.03 - 160.26 - 0 - 0 - - - 0164 - 000164 - POINT 164 - 71.79 - 136.87 - 0 - 0 - - - 0165 - 000165 - POINT 165 - 73.69 - 126.57 - 0 - 0 - - - 0166 - 000166 - POINT 166 - 74.95 - 114.04 - 0 - 0 - - - 0167 - 000167 - POINT 167 - 74.95 - 85.96 - 0 - 0 - - - 0168 - 000168 - POINT 168 - 73.69 - 73.44 - 0 - 0 - - - 0169 - 000169 - POINT 169 - 71.79 - 63.13 - 0 - 0 - - - 0170 - 000170 - POINT 170 - 69.45 - 55.00 - 0 - 0 - - - 0171 - 000171 - POINT 171 - 66.81 - 48.66 - 0 - 0 - - - 0172 - 000172 - POINT 172 - 45.87 - 28.44 - 0 - 0 - - - 0173 - 000173 - POINT 173 - 42.90 - 27.10 - 0 - 0 - - - 0174 - 000174 - POINT 174 - 53.48 - 160.95 - 0 - 0 - - - 0175 - 000175 - POINT 175 - 59.18 - 154.46 - 0 - 0 - - - 0176 - 000176 - POINT 176 - 70.42 - 78.20 - 0 - 0 - - - 0177 - 000177 - POINT 177 - 68.83 - 69.04 - 0 - 0 - - - 0178 - 000178 - POINT 178 - 66.81 - 61.34 - 0 - 0 - - - 0179 - 000179 - POINT 179 - 44.77 - 32.62 - 0 - 0 - - - 0180 - 000180 - POINT 180 - 41.89 - 31.04 - 0 - 0 - - - 0181 - 000181 - POINT 181 - 49.02 - 159.04 - 0 - 0 - - - 0182 - 000182 - POINT 182 - 51.76 - 156.31 - 0 - 0 - - - 0183 - 000183 - POINT 183 - 54.46 - 153.13 - 0 - 0 - - - 0184 - 000184 - POINT 184 - 57.08 - 149.40 - 0 - 0 - - - 0185 - 000185 - POINT 185 - 59.58 - 145.00 - 0 - 0 - - - 0186 - 000186 - POINT 186 - 46.24 - 38.61 - 0 - 0 - - - 0187 - 000187 - POINT 187 - 43.47 - 36.57 - 0 - 0 - - - 0188 - 000188 - POINT 188 - 47.27 - 155.01 - 0 - 0 - - - 0189 - 000189 - POINT 189 - 49.86 - 152.13 - 0 - 0 - - - 0190 - 000190 - POINT 190 - 52.38 - 148.81 - 0 - 0 - - - 0191 - 000191 - POINT 191 - 54.80 - 145.00 - 0 - 0 - - - 0192 - 000192 - POINT 192 - 57.08 - 140.60 - 0 - 0 - - - 0193 - 000193 - POINT 193 - 45.37 - 151.34 - 0 - 0 - - - 0194 - 000194 - POINT 194 - 47.80 - 148.37 - 0 - 0 - - - 0195 - 000195 - POINT 195 - 50.14 - 145.00 - 0 - 0 - - - 0196 - 000196 - POINT 196 - 52.38 - 141.19 - 0 - 0 - - - 0197 - 000197 - POINT 197 - 54.46 - 136.87 - 0 - 0 - - - 0198 - 000198 - POINT 198 - 43.35 - 148.01 - 0 - 0 - - - 0199 - 000199 - POINT 199 - 45.62 - 145.00 - 0 - 0 - - - 0200 - 000200 - POINT 200 - 47.80 - 141.63 - 0 - 0 - - - 0201 - 000201 - POINT 201 - 45.37 - 138.66 - 0 - 0 - - - 0202 - 000202 - POINT 202 - 42.90 - 136.03 - 0 - 0 - - - 0203 - 000203 - POINT 203 - 40.39 - 133.69 - 0 - 0 - - - 0204 - 000204 - POINT 204 - 42.00 - 130.26 - 0 - 0 - - - 0205 - 000205 - POINT 205 - 39.36 - 128.30 - 0 - 0 - - - 0206 - 000206 - POINT 206 - 37.96 - 123.20 - 0 - 0 - - - 0207 - 000207 - POINT 207 - 39.05 - 119.65 - 0 - 0 - - + + + + + 0001 + 000001 + POINT 1 + 48.88 + -60.02 + 0 + 0 + + + 0002 + 000002 + POINT 2 + 46.24 + -51.39 + 0 + 0 + + + 0003 + 000003 + POINT 3 + 54.46 + -80.00 + 0 + 0 + + + 0004 + 000004 + POINT 4 + 50.58 + -53.43 + 0 + 0 + + + 0005 + 000005 + POINT 5 + 49.02 + -49.04 + 0 + 0 + + + 0006 + 000006 + POINT 6 + 47.27 + -45.01 + 0 + 0 + + + 0007 + 000007 + POINT 7 + 57.63 + -86.34 + 0 + 0 + + + 0008 + 000008 + POINT 8 + 57.82 + -80.00 + 0 + 0 + + + 0009 + 000009 + POINT 9 + 56.18 + -61.57 + 0 + 0 + + + 0010 + 000010 + POINT 10 + 54.97 + -56.04 + 0 + 0 + + + 0011 + 000011 + POINT 11 + 53.48 + -50.95 + 0 + 0 + + + 0012 + 000012 + POINT 12 + 51.76 + -46.31 + 0 + 0 + + + 0013 + 000013 + POINT 13 + 49.86 + -42.13 + 0 + 0 + + + 0014 + 000014 + POINT 14 + 60.39 + -94.04 + 0 + 0 + + + 0015 + 000015 + POINT 15 + 61.03 + -87.13 + 0 + 0 + + + 0016 + 000016 + POINT 16 + 61.24 + -80.00 + 0 + 0 + + + 0017 + 000017 + POINT 17 + 61.03 + -72.88 + 0 + 0 + + + 0018 + 000018 + POINT 18 + 60.39 + -65.96 + 0 + 0 + + + 0019 + 000019 + POINT 19 + 59.37 + -59.44 + 0 + 0 + + + 0020 + 000020 + POINT 20 + 58.01 + -53.43 + 0 + 0 + + + 0021 + 000021 + POINT 21 + 56.36 + -47.99 + 0 + 0 + + + 0022 + 000022 + POINT 22 + 54.46 + -43.13 + 0 + 0 + + + 0023 + 000023 + POINT 23 + 64.46 + -88.13 + 0 + 0 + + + 0024 + 000024 + POINT 24 + 64.71 + -80.00 + 0 + 0 + + + 0025 + 000025 + POINT 25 + 64.46 + -71.87 + 0 + 0 + + + 0026 + 000026 + POINT 26 + 63.74 + -64.05 + 0 + 0 + + + 0027 + 000027 + POINT 27 + 62.57 + -56.80 + 0 + 0 + + + 0028 + 000028 + POINT 28 + 61.03 + -50.26 + 0 + 0 + + + 0029 + 000029 + POINT 29 + 59.18 + -44.46 + 0 + 0 + + + 0030 + 000030 + POINT 30 + 57.08 + -39.40 + 0 + 0 + + + 0031 + 000031 + POINT 31 + 67.08 + -98.43 + 0 + 0 + + + 0032 + 000032 + POINT 32 + 67.94 + -89.46 + 0 + 0 + + + 0033 + 000033 + POINT 33 + 68.23 + -80.00 + 0 + 0 + + + 0034 + 000034 + POINT 34 + 67.08 + -61.57 + 0 + 0 + + + 0035 + 000035 + POINT 35 + 65.73 + -53.43 + 0 + 0 + + + 0036 + 000036 + POINT 36 + 63.98 + -46.31 + 0 + 0 + + + 0037 + 000037 + POINT 37 + 61.90 + -40.19 + 0 + 0 + + + 0038 + 000038 + POINT 38 + 59.58 + -35.00 + 0 + 0 + + + 0039 + 000039 + POINT 39 + 68.83 + -110.96 + 0 + 0 + + + 0040 + 000040 + POINT 40 + 70.42 + -101.80 + 0 + 0 + + + 0041 + 000041 + POINT 41 + 71.44 + -91.31 + 0 + 0 + + + 0042 + 000042 + POINT 42 + 71.79 + -80.00 + 0 + 0 + + + 0043 + 000043 + POINT 43 + 71.44 + -68.69 + 0 + 0 + + + 0044 + 000044 + POINT 44 + 70.42 + -58.20 + 0 + 0 + + + 0045 + 000045 + POINT 45 + 64.46 + -35.00 + 0 + 0 + + + 0046 + 000046 + POINT 46 + 61.90 + -29.81 + 0 + 0 + + + 0047 + 000047 + POINT 47 + 69.45 + -125.00 + 0 + 0 + + + 0048 + 000048 + POINT 48 + 71.79 + -116.87 + 0 + 0 + + + 0049 + 000049 + POINT 49 + 73.69 + -106.57 + 0 + 0 + + + 0050 + 000050 + POINT 50 + 74.95 + -94.04 + 0 + 0 + + + 0051 + 000051 + POINT 51 + 75.39 + -80.00 + 0 + 0 + + + 0052 + 000052 + POINT 52 + 74.95 + -65.96 + 0 + 0 + + + 0053 + 000053 + POINT 53 + 73.69 + -53.43 + 0 + 0 + + + 0054 + 000054 + POINT 54 + 66.81 + -28.66 + 0 + 0 + + + 0055 + 000055 + POINT 55 + 63.98 + -23.69 + 0 + 0 + + + 0056 + 000056 + POINT 56 + 68.83 + -139.04 + 0 + 0 + + + 0057 + 000057 + POINT 57 + 71.79 + -133.13 + 0 + 0 + + + 0058 + 000058 + POINT 58 + 74.51 + -125.00 + 0 + 0 + + + 0059 + 000059 + POINT 59 + 76.82 + -113.69 + 0 + 0 + + + 0060 + 000060 + POINT 60 + 78.43 + -98.43 + 0 + 0 + + + 0061 + 000061 + POINT 61 + 79.02 + -80.00 + 0 + 0 + + + 0062 + 000062 + POINT 62 + 71.79 + -26.87 + 0 + 0 + + + 0063 + 000063 + POINT 63 + 68.83 + -20.96 + 0 + 0 + + + 0064 + 000064 + POINT 64 + 65.73 + -16.57 + 0 + 0 + + + 0065 + 000065 + POINT 65 + 62.57 + -13.20 + 0 + 0 + + + 0066 + 000066 + POINT 66 + 70.42 + -148.20 + 0 + 0 + + + 0067 + 000067 + POINT 67 + 73.69 + -143.44 + 0 + 0 + + + 0068 + 000068 + POINT 68 + 76.82 + -136.31 + 0 + 0 + + + 0069 + 000069 + POINT 69 + 79.64 + -125.00 + 0 + 0 + + + 0070 + 000070 + POINT 70 + 81.80 + -106.57 + 0 + 0 + + + 0071 + 000071 + POINT 71 + 82.67 + -80.00 + 0 + 0 + + + 0072 + 000072 + POINT 72 + 81.80 + -53.43 + 0 + 0 + + + 0073 + 000073 + POINT 73 + 76.82 + -23.69 + 0 + 0 + + + 0074 + 000074 + POINT 74 + 73.69 + -16.57 + 0 + 0 + + + 0075 + 000075 + POINT 75 + 70.42 + -11.80 + 0 + 0 + + + 0076 + 000076 + POINT 76 + 67.08 + -8.43 + 0 + 0 + + + 0077 + 000077 + POINT 77 + 54.30 + -164.29 + 0 + 0 + + + 0078 + 000078 + POINT 78 + 57.63 + -163.66 + 0 + 0 + + + 0079 + 000079 + POINT 79 + 61.03 + -162.88 + 0 + 0 + + + 0080 + 000080 + POINT 80 + 64.46 + -161.87 + 0 + 0 + + + 0081 + 000081 + POINT 81 + 67.94 + -160.54 + 0 + 0 + + + 0082 + 000082 + POINT 82 + 71.44 + -158.69 + 0 + 0 + + + 0083 + 000083 + POINT 83 + 74.95 + -155.96 + 0 + 0 + + + 0084 + 000084 + POINT 84 + 78.43 + -151.57 + 0 + 0 + + + 0085 + 000085 + POINT 85 + 81.80 + -143.44 + 0 + 0 + + + 0086 + 000086 + POINT 86 + 84.81 + -125.00 + 0 + 0 + + + 0087 + 000087 + POINT 87 + 86.33 + -80.00 + 0 + 0 + + + 0088 + 000088 + POINT 88 + 84.81 + -35.00 + 0 + 0 + + + 0089 + 000089 + POINT 89 + 81.80 + -16.57 + 0 + 0 + + + 0090 + 000090 + POINT 90 + 78.43 + -8.43 + 0 + 0 + + + 0091 + 000091 + POINT 91 + 74.95 + -4.04 + 0 + 0 + + + 0092 + 000092 + POINT 92 + 71.44 + -1.31 + 0 + 0 + + + 0093 + 000093 + POINT 93 + 54.46 + -170.00 + 0 + 0 + + + 0094 + 000094 + POINT 94 + 57.82 + -170.00 + 0 + 0 + + + 0095 + 000095 + POINT 95 + 61.24 + -170.00 + 0 + 0 + + + 0096 + 000096 + POINT 96 + 64.71 + -170.00 + 0 + 0 + + + 0097 + 000097 + POINT 97 + 68.23 + -170.00 + 0 + 0 + + + 0098 + 000098 + POINT 98 + 71.79 + -170.00 + 0 + 0 + + + 0099 + 000099 + POINT 99 + 75.39 + -170.00 + 0 + 0 + + + 0100 + 000100 + POINT 100 + 79.02 + -170.00 + 0 + 0 + + + 0101 + 000101 + POINT 101 + 82.67 + -170.00 + 0 + 0 + + + 0102 + 000102 + POINT 102 + 86.33 + -170.00 + 0 + 0 + + + 0103 + 000103 + POINT 103 + 90.00 + -80.00 + 0 + 0 + + + 0104 + 000104 + POINT 104 + 86.33 + 10.00 + 0 + 0 + + + 0105 + 000105 + POINT 105 + 82.67 + 10.00 + 0 + 0 + + + 0106 + 000106 + POINT 106 + 79.02 + 10.00 + 0 + 0 + + + 0107 + 000107 + POINT 107 + 75.39 + 10.00 + 0 + 0 + + + 0108 + 000108 + POINT 108 + 71.79 + 10.00 + 0 + 0 + + + 0109 + 000109 + POINT 109 + 57.82 + 10.00 + 0 + 0 + + + 0110 + 000110 + POINT 110 + 54.46 + 10.00 + 0 + 0 + + + 0111 + 000111 + POINT 111 + 54.30 + -175.71 + 0 + 0 + + + 0112 + 000112 + POINT 112 + 57.63 + -176.34 + 0 + 0 + + + 0113 + 000113 + POINT 113 + 61.03 + -177.13 + 0 + 0 + + + 0114 + 000114 + POINT 114 + 64.46 + -178.13 + 0 + 0 + + + 0115 + 000115 + POINT 115 + 67.94 + -179.46 + 0 + 0 + + + 0116 + 000116 + POINT 116 + 71.44 + 178.69 + 0 + 0 + + + 0117 + 000117 + POINT 117 + 74.95 + 175.96 + 0 + 0 + + + 0118 + 000118 + POINT 118 + 78.43 + 171.57 + 0 + 0 + + + 0119 + 000119 + POINT 119 + 81.80 + 163.44 + 0 + 0 + + + 0120 + 000120 + POINT 120 + 84.81 + 145.00 + 0 + 0 + + + 0121 + 000121 + POINT 121 + 86.33 + 100.00 + 0 + 0 + + + 0122 + 000122 + POINT 122 + 84.81 + 55.00 + 0 + 0 + + + 0123 + 000123 + POINT 123 + 81.80 + 36.57 + 0 + 0 + + + 0124 + 000124 + POINT 124 + 78.43 + 28.44 + 0 + 0 + + + 0125 + 000125 + POINT 125 + 74.95 + 24.04 + 0 + 0 + + + 0126 + 000126 + POINT 126 + 71.44 + 21.31 + 0 + 0 + + + 0127 + 000127 + POINT 127 + 61.03 + 17.13 + 0 + 0 + + + 0128 + 000128 + POINT 128 + 57.63 + 16.34 + 0 + 0 + + + 0129 + 000129 + POINT 129 + 54.30 + 15.71 + 0 + 0 + + + 0130 + 000130 + POINT 130 + 53.80 + 178.69 + 0 + 0 + + + 0131 + 000131 + POINT 131 + 57.08 + 177.47 + 0 + 0 + + + 0132 + 000132 + POINT 132 + 60.39 + 175.96 + 0 + 0 + + + 0133 + 000133 + POINT 133 + 70.42 + 168.20 + 0 + 0 + + + 0134 + 000134 + POINT 134 + 73.69 + 163.44 + 0 + 0 + + + 0135 + 000135 + POINT 135 + 76.82 + 156.31 + 0 + 0 + + + 0136 + 000136 + POINT 136 + 79.64 + 145.00 + 0 + 0 + + + 0137 + 000137 + POINT 137 + 81.80 + 126.57 + 0 + 0 + + + 0138 + 000138 + POINT 138 + 82.67 + 100.00 + 0 + 0 + + + 0139 + 000139 + POINT 139 + 81.80 + 73.44 + 0 + 0 + + + 0140 + 000140 + POINT 140 + 79.64 + 55.00 + 0 + 0 + + + 0141 + 000141 + POINT 141 + 76.82 + 43.69 + 0 + 0 + + + 0142 + 000142 + POINT 142 + 73.69 + 36.57 + 0 + 0 + + + 0143 + 000143 + POINT 143 + 70.42 + 31.80 + 0 + 0 + + + 0144 + 000144 + POINT 144 + 63.74 + 25.95 + 0 + 0 + + + 0145 + 000145 + POINT 145 + 60.39 + 24.04 + 0 + 0 + + + 0146 + 000146 + POINT 146 + 57.08 + 22.53 + 0 + 0 + + + 0147 + 000147 + POINT 147 + 56.18 + 171.57 + 0 + 0 + + + 0148 + 000148 + POINT 148 + 59.37 + 169.44 + 0 + 0 + + + 0149 + 000149 + POINT 149 + 71.79 + 153.13 + 0 + 0 + + + 0150 + 000150 + POINT 150 + 74.51 + 145.00 + 0 + 0 + + + 0151 + 000151 + POINT 151 + 76.82 + 133.69 + 0 + 0 + + + 0152 + 000152 + POINT 152 + 78.43 + 118.44 + 0 + 0 + + + 0153 + 000153 + POINT 153 + 79.02 + 100.00 + 0 + 0 + + + 0154 + 000154 + POINT 154 + 78.43 + 81.57 + 0 + 0 + + + 0155 + 000155 + POINT 155 + 76.82 + 66.31 + 0 + 0 + + + 0156 + 000156 + POINT 156 + 74.51 + 55.00 + 0 + 0 + + + 0157 + 000157 + POINT 157 + 71.79 + 46.87 + 0 + 0 + + + 0158 + 000158 + POINT 158 + 68.83 + 40.96 + 0 + 0 + + + 0159 + 000159 + POINT 159 + 65.73 + 36.57 + 0 + 0 + + + 0160 + 000160 + POINT 160 + 59.37 + 30.56 + 0 + 0 + + + 0161 + 000161 + POINT 161 + 54.97 + 166.04 + 0 + 0 + + + 0162 + 000162 + POINT 162 + 58.01 + 163.44 + 0 + 0 + + + 0163 + 000163 + POINT 163 + 61.03 + 160.26 + 0 + 0 + + + 0164 + 000164 + POINT 164 + 71.79 + 136.87 + 0 + 0 + + + 0165 + 000165 + POINT 165 + 73.69 + 126.57 + 0 + 0 + + + 0166 + 000166 + POINT 166 + 74.95 + 114.04 + 0 + 0 + + + 0167 + 000167 + POINT 167 + 74.95 + 85.96 + 0 + 0 + + + 0168 + 000168 + POINT 168 + 73.69 + 73.44 + 0 + 0 + + + 0169 + 000169 + POINT 169 + 71.79 + 63.13 + 0 + 0 + + + 0170 + 000170 + POINT 170 + 69.45 + 55.00 + 0 + 0 + + + 0171 + 000171 + POINT 171 + 66.81 + 48.66 + 0 + 0 + + + 0172 + 000172 + POINT 172 + 45.87 + 28.44 + 0 + 0 + + + 0173 + 000173 + POINT 173 + 42.90 + 27.10 + 0 + 0 + + + 0174 + 000174 + POINT 174 + 53.48 + 160.95 + 0 + 0 + + + 0175 + 000175 + POINT 175 + 59.18 + 154.46 + 0 + 0 + + + 0176 + 000176 + POINT 176 + 70.42 + 78.20 + 0 + 0 + + + 0177 + 000177 + POINT 177 + 68.83 + 69.04 + 0 + 0 + + + 0178 + 000178 + POINT 178 + 66.81 + 61.34 + 0 + 0 + + + 0179 + 000179 + POINT 179 + 44.77 + 32.62 + 0 + 0 + + + 0180 + 000180 + POINT 180 + 41.89 + 31.04 + 0 + 0 + + + 0181 + 000181 + POINT 181 + 49.02 + 159.04 + 0 + 0 + + + 0182 + 000182 + POINT 182 + 51.76 + 156.31 + 0 + 0 + + + 0183 + 000183 + POINT 183 + 54.46 + 153.13 + 0 + 0 + + + 0184 + 000184 + POINT 184 + 57.08 + 149.40 + 0 + 0 + + + 0185 + 000185 + POINT 185 + 59.58 + 145.00 + 0 + 0 + + + 0186 + 000186 + POINT 186 + 46.24 + 38.61 + 0 + 0 + + + 0187 + 000187 + POINT 187 + 43.47 + 36.57 + 0 + 0 + + + 0188 + 000188 + POINT 188 + 47.27 + 155.01 + 0 + 0 + + + 0189 + 000189 + POINT 189 + 49.86 + 152.13 + 0 + 0 + + + 0190 + 000190 + POINT 190 + 52.38 + 148.81 + 0 + 0 + + + 0191 + 000191 + POINT 191 + 54.80 + 145.00 + 0 + 0 + + + 0192 + 000192 + POINT 192 + 57.08 + 140.60 + 0 + 0 + + + 0193 + 000193 + POINT 193 + 45.37 + 151.34 + 0 + 0 + + + 0194 + 000194 + POINT 194 + 47.80 + 148.37 + 0 + 0 + + + 0195 + 000195 + POINT 195 + 50.14 + 145.00 + 0 + 0 + + + 0196 + 000196 + POINT 196 + 52.38 + 141.19 + 0 + 0 + + + 0197 + 000197 + POINT 197 + 54.46 + 136.87 + 0 + 0 + + + 0198 + 000198 + POINT 198 + 43.35 + 148.01 + 0 + 0 + + + 0199 + 000199 + POINT 199 + 45.62 + 145.00 + 0 + 0 + + + 0200 + 000200 + POINT 200 + 47.80 + 141.63 + 0 + 0 + + + 0201 + 000201 + POINT 201 + 45.37 + 138.66 + 0 + 0 + + + 0202 + 000202 + POINT 202 + 42.90 + 136.03 + 0 + 0 + + + 0203 + 000203 + POINT 203 + 40.39 + 133.69 + 0 + 0 + + + 0204 + 000204 + POINT 204 + 42.00 + 130.26 + 0 + 0 + + + 0205 + 000205 + POINT 205 + 39.36 + 128.30 + 0 + 0 + + + 0206 + 000206 + POINT 206 + 37.96 + 123.20 + 0 + 0 + + + 0207 + 000207 + POINT 207 + 39.05 + 119.65 + 0 + 0 + + diff --git a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/stns.xsd b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/stns.xsd old mode 100644 new mode 100755 index 145fba212c..e4416acbc5 --- a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/stns.xsd +++ b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/stns.xsd @@ -1,163 +1,163 @@ - - - - - - The station ID - - - - - - - - - - - - The station number - - - - - - - - - - - - The station name - - - - - - - - - - - state - - - - - - - - - - - country - - - - - - - - - - - The latitude - - - - - - - - - - - - The longitude - - - - - - - - - - - - The elevation - - - - - - - - - - - - The priority - - - - - - - - - - - - Volcano location - - - - - - - - - - - WFO - - - - - - - - - - - - - - - - - - - A station - - - - - - - - - - - - - - - - - - - - + + + + + + The station ID + + + + + + + + + + + + The station number + + + + + + + + + + + + The station name + + + + + + + + + + + state + + + + + + + + + + + country + + + + + + + + + + + The latitude + + + + + + + + + + + + The longitude + + + + + + + + + + + + The elevation + + + + + + + + + + + + The priority + + + + + + + + + + + + Volcano location + + + + + + + + + + + WFO + + + + + + + + + + + + + + + + + + + A station + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml old mode 100644 new mode 100755 index 2e15934cd5..80239cf1d0 --- a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml +++ b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml @@ -1,7049 +1,7049 @@ - - - - - YSJ - 000395 - ST_JOHN - NB - CN - 45.32 - -65.88 - 0 - 0 - - - - HUL - 000341 - HOULTON - ME - US - 46.04 - -67.83 - 0 - 0 - - - - PQI - 000367 - PRESQUE_ISLE - ME - US - 46.77 - -68.09 - 0 - 0 - - - - MLT - 000183 - MILLINOCKET - ME - US - 45.58 - -68.52 - 0 - 0 - - - - BGR - 000029 - BANGOR - ME - US - 44.84 - -68.87 - 0 - 0 - - - - ACK - 000005 - NANTUCKET - MA - US - 41.28 - -70.03 - 0 - 0 - - - - ENE - 000322 - KENNEBUNK - ME - US - 43.43 - -70.61 - 0 - 0 - - - - BOS - 000289 - BOSTON - MA - US - 42.36 - -70.99 - 0 - 0 - - - - YQB - 000391 - QUEBEC - QB - CN - 46.80 - -71.38 - 0 - 0 - - - - PVD - 000221 - PROVIDENCE - RI - US - 41.72 - -71.43 - 0 - 0 - - - - CON - 000062 - CONCORD - NH - US - 43.22 - -71.58 - 0 - 0 - - - - YSC - 000394 - SHERBROOKE - QB - CN - 45.43 - -71.68 - 0 - 0 - - - - HTO - 000340 - EAST_HAMPTON - NY - US - 40.92 - -72.32 - 0 - 0 - - - - MPV - 000188 - MONTPELIER - VT - US - 44.22 - -72.57 - 0 - 0 - - - - BDL - 000287 - WINSOR_LOCKS - CT - US - 41.94 - -72.69 - 0 - 0 - - - - PLB - 000365 - PLATTSBURGH - NY - US - 44.69 - -73.52 - 0 - 0 - - - - JFK - 000345 - NEW_YORK/JF_KENNEDY - NY - US - 40.63 - -73.77 - 0 - 0 - - - - ALB - 000012 - ALBANY - NY - US - 42.75 - -73.80 - 0 - 0 - - - - CYN - 000300 - COYLE - NJ - US - 39.82 - -74.43 - 0 - 0 - - - - SAX - 000376 - SPARTA - NJ - US - 41.07 - -74.54 - 0 - 0 - - - - MSS - 000353 - MASSENA - NY - US - 44.91 - -74.72 - 0 - 0 - - - - SIE - 000377 - SEA_ISLE - NJ - US - 39.10 - -74.80 - 0 - 0 - - - - HNK - 000338 - HANCOCK - NY - US - 42.06 - -75.32 - 0 - 0 - - - - SBY - 000242 - SALISBURY - MD - US - 38.35 - -75.52 - 0 - 0 - - - - YOW - 000390 - OTTAWA - ON - CN - 45.32 - -75.67 - 0 - 0 - - - - ETX - 000325 - EAST_TEXAS - PA - US - 40.58 - -75.68 - 0 - 0 - - - - ECG - 000086 - ELIZABETH_CITY - NC - US - 36.25 - -76.18 - 0 - 0 - - - - SYR - 000259 - SYRACUSE - NY - US - 43.16 - -76.20 - 0 - 0 - - - - ORF - 000203 - NORFOLK - VA - US - 36.89 - -76.20 - 0 - 0 - - - - EMI - 000320 - WESTMINSTER - MD - US - 39.50 - -76.98 - 0 - 0 - - - - HAR - 000126 - HARRISBURG - PA - US - 40.23 - -77.02 - 0 - 0 - - - - DCA - 000306 - WASHINGTON - DC - US - 38.86 - -77.04 - 0 - 0 - - - - RIC - 000229 - RICHMOND - VA - US - 37.50 - -77.32 - 0 - 0 - - - - CSN - 000299 - CASSANOVA - VA - US - 38.64 - -77.87 - 0 - 0 - - - - ILM - 000135 - WILMINGTON - NC - US - 34.35 - -77.87 - 0 - 0 - - - - SLT - 000252 - SLATE_RUN - PA - US - 41.51 - -77.97 - 0 - 0 - - - - PSB - 000368 - PHILLIPSBURG - PA - US - 40.92 - -77.99 - 0 - 0 - - - - BUF - 000044 - BUFFALO - NY - US - 42.93 - -78.65 - 0 - 0 - - - - RDU - 000372 - RALEIGH-DURHAM - NC - US - 35.87 - -78.78 - 0 - 0 - - - - JST - 000145 - JOHNSTOWN - PA - US - 40.32 - -78.83 - 0 - 0 - - - - JHW - 000346 - JAMESTOWN - NY - US - 42.19 - -79.12 - 0 - 0 - - - - LYH - 000166 - LYNCHBURG - VA - US - 37.25 - -79.23 - 0 - 0 - - - - YYZ - 000401 - TORONTO - ON - CN - 43.67 - -79.63 - 0 - 0 - - - - FLO - 000102 - FLORENCE - SC - US - 34.23 - -79.66 - 0 - 0 - - - - GSO - 000122 - GREENSBORO - NC - US - 36.05 - -79.98 - 0 - 0 - - - - CHS - 000056 - CHARLESTON - SC - US - 32.89 - -80.04 - 0 - 0 - - - - PBI - 000206 - WEST_PALM_BEACH - FL - US - 26.68 - -80.09 - 0 - 0 - - - - EKN - 000088 - ELKINS - WV - US - 38.92 - -80.10 - 0 - 0 - - - - EWC - 000326 - ELLWOOD_CITY - PA - US - 40.83 - -80.21 - 0 - 0 - - - - ERI - 000092 - ERIE - PA - US - 42.02 - -80.30 - 0 - 0 - - - - MIA - 000176 - MIAMI - FL - US - 25.80 - -80.30 - 0 - 0 - - - - VRB - 000276 - VERO_BEACH - FL - US - 27.68 - -80.49 - 0 - 0 - - - - PSK - 000369 - DUBLIN - VA - US - 37.09 - -80.71 - 0 - 0 - - - - AIR - 000280 - BELLAIRE - OH - US - 40.02 - -80.82 - 0 - 0 - - - - CLT - 000059 - CHARLOTTE - NC - US - 35.22 - -80.93 - 0 - 0 - - - - CAE - 000295 - COLUMBIA - SC - US - 33.86 - -81.05 - 0 - 0 - - - - YVV - 000396 - WIARTON - ON - CN - 44.75 - -81.10 - 0 - 0 - - - - SAV - 000239 - SAVANNAH - GA - US - 32.16 - -81.11 - 0 - 0 - - - - OMN - 000363 - ORMOND_BEACH - FL - US - 29.30 - -81.11 - 0 - 0 - - - - BKW - 000034 - BECKLEY - WV - US - 37.78 - -81.12 - 0 - 0 - - - - ORL - 000204 - ORLANDO - FL - US - 28.54 - -81.34 - 0 - 0 - - - - CRG - 000298 - JACKSONVILLE - FL - US - 30.34 - -81.51 - 0 - 0 - - - - EYW - 000096 - KEY_WEST - FL - US - 24.59 - -81.80 - 0 - 0 - - - - FMY - 000104 - FT_MEYERS - FL - US - 26.58 - -81.87 - 0 - 0 - - - - SPA - 000380 - SPARTANBURG - SC - US - 35.03 - -81.93 - 0 - 0 - - - - HNN - 000339 - HENDERSON - WV - US - 38.75 - -82.03 - 0 - 0 - - - - HMV - 000337 - HOLSTON_MOUNTAIN - TN - US - 36.44 - -82.13 - 0 - 0 - - - - CLE - 000058 - CLEVELAND - OH - US - 41.42 - -81.85 - 0 - 0 - - - - IRQ - 000344 - COLLIERS - SC - US - 33.71 - -82.16 - 0 - 0 - - - - AMG - 000015 - ALMA - GA - US - 31.54 - -82.51 - 0 - 0 - - - - SRQ - 000382 - SARASOTA - FL - US - 27.40 - -82.55 - 0 - 0 - - - - APE - 000283 - APPLETON - OH - US - 40.15 - -82.59 - 0 - 0 - - - - PIE - 000212 - SAINT_PETERSBURG - FL - US - 27.91 - -82.68 - 0 - 0 - - - - ECK - 000316 - PECK - MI - US - 43.26 - -82.72 - 0 - 0 - - - - CTY - 000066 - CROSS_CITY - FL - US - 29.60 - -83.05 - 0 - 0 - - - - ODF - 000360 - TOCCOA - GA - US - 34.70 - -83.30 - 0 - 0 - - - - DXO - 000315 - DETROIT - MI - US - 42.21 - -83.37 - 0 - 0 - - - - ASP - 000284 - OSCODA - MI - US - 44.45 - -83.39 - 0 - 0 - - - - MCN - 000170 - MACON - GA - US - 32.69 - -83.65 - 0 - 0 - - - - FNT - 000328 - FLINT - MI - US - 42.97 - -83.74 - 0 - 0 - - - - VXV - 000388 - KNOXVILLE - TN - US - 35.90 - -83.89 - 0 - 0 - - - - ROD - 000373 - ROSEWOOD - OH - US - 40.29 - -84.04 - 0 - 0 - - - - MBS - 000168 - SAGINAW - MI - US - 43.53 - -84.08 - 0 - 0 - - - - LOZ - 000160 - LONDON - KY - US - 37.03 - -84.12 - 0 - 0 - - - - ABY - 000004 - ALBANY - GA - US - 31.65 - -84.30 - 0 - 0 - - - - SSM - 000255 - SAULT_STE_MARIE - MI - US - 46.41 - -84.31 - 0 - 0 - - - - TLH - 000264 - TALLAHASSEE - FL - US - 30.56 - -84.37 - 0 - 0 - - - - ATL - 000019 - ATLANTA - GA - US - 33.63 - -84.44 - 0 - 0 - - - - CVG - 000067 - COVINGTON - KY - US - 39.02 - -84.70 - 0 - 0 - - - - GQO - 000331 - CHATTANOOGA - TN - US - 34.96 - -85.15 - 0 - 0 - - - - FWA - 000109 - FT_WAYNE - IN - US - 40.98 - -85.19 - 0 - 0 - - - - LGC - 000350 - LA_GRANGE - GA - US - 33.05 - -85.21 - 0 - 0 - - - - GRR - 000332 - GRAND_RAPIDS - MI - US - 42.79 - -85.50 - 0 - 0 - - - - TVC - 000270 - TRAVERSE_CITY - MI - US - 44.67 - -85.55 - 0 - 0 - - - - LOU - 000159 - LOUISVILLE - KY - US - 38.10 - -85.58 - 0 - 0 - - - - MKG - 000179 - MUSKEGON - MI - US - 43.17 - -86.04 - 0 - 0 - - - - PMM - 000366 - PULLMAN - MI - US - 42.47 - -86.11 - 0 - 0 - - - - GIJ - 000330 - NILES - MI - US - 41.77 - -86.32 - 0 - 0 - - - - MGM - 000175 - MONTGOMERY - AL - US - 32.22 - -86.32 - 0 - 0 - - - - IND - 000136 - INDIANAPOLIS - IN - US - 39.81 - -86.37 - 0 - 0 - - - - BWG - 000047 - BOWLING_GREEN - KY - US - 36.93 - -86.44 - 0 - 0 - - - - BNA - 000037 - NASHVILLE - TN - US - 36.14 - -86.68 - 0 - 0 - - - - CEW - 000052 - CRESTVIEW - FL - US - 30.83 - -86.68 - 0 - 0 - - - - VUZ - 000387 - VULCAN - AL - US - 33.67 - -86.90 - 0 - 0 - - - - BVT - 000293 - LAFAYETTE - IN - US - 40.56 - -87.07 - 0 - 0 - - - - TTH - 000384 - TERRE_HAUTE - IN - US - 39.49 - -87.25 - 0 - 0 - - - - MSL - 000191 - MUSCLE_SHOALS - AL - US - 34.70 - -87.48 - 0 - 0 - - - - SAW - 000189 - SAWYER - MI - US - 46.35 - -87.38 - 0 - 0 - - - - PXV - 000370 - POCKET_CITY - IN - US - 37.93 - -87.76 - 0 - 0 - - - - ORD - 000202 - O'HARE_INTERNATIONAL - IL - US - 41.98 - -87.90 - 0 - 0 - - - - GRB - 000119 - GREEN_BAY - WI - US - 44.56 - -88.19 - 0 - 0 - - - - BAE - 000285 - MILWAUKEE - WI - US - 43.12 - -88.28 - 0 - 0 - - - - JOT - 000348 - JOLIET - IL - US - 41.55 - -88.32 - 0 - 0 - - - - SJI - 000378 - SEMMNES - AL - US - 30.73 - -88.36 - 0 - 0 - - - - IGB - 000133 - BIGBEE - MS - US - 33.48 - -88.52 - 0 - 0 - - - - MEI - 000172 - MERIDIAN - MS - US - 32.38 - -88.80 - 0 - 0 - - - - DEC - 000070 - DECATUR - IL - US - 39.74 - -88.86 - 0 - 0 - - - - YQT - 000393 - THUNDER_BAY - ON - CN - 48.37 - -89.32 - 0 - 0 - - - - DYR - 000083 - DYERSBURG - TN - US - 36.02 - -89.32 - 0 - 0 - - - - RHI - 000228 - RHINELANDER - WI - US - 45.63 - -89.45 - 0 - 0 - - - - BDF - 000024 - BRADFORD - IL - US - 41.16 - -89.59 - 0 - 0 - - - - DLL - 000310 - DELLS - WI - US - 43.55 - -89.76 - 0 - 0 - - - - MEM - 000173 - MEMPHIS - TN - US - 35.06 - -89.98 - 0 - 0 - - - - LEV - 000349 - GRAND_ISLE - LA - US - 29.18 - -90.10 - 0 - 0 - - - - JAN - 000142 - JACKSON - MS - US - 32.51 - -90.17 - 0 - 0 - - - - MSY - 000195 - NEW_ORLEANS - LA - US - 30.00 - -90.27 - 0 - 0 - - - - FAM - 000097 - FARMINGTON - MO - US - 37.67 - -90.23 - 0 - 0 - - - - MCB - 000169 - MC_COMB - MS - US - 31.30 - -90.26 - 0 - 0 - - - - SQS - 000381 - SIDON - MS - US - 33.46 - -90.28 - 0 - 0 - - - - STL - 000257 - ST_LOUIS - MO - US - 38.86 - -90.48 - 0 - 0 - - - - DBQ - 000069 - DUBUQUE - IA - US - 42.40 - -90.71 - 0 - 0 - - - - ARG - 000018 - WALNUT_RIDGE - AR - US - 36.11 - -90.95 - 0 - 0 - - - - UIN - 000386 - QUINCY - IL - US - 39.85 - -91.28 - 0 - 0 - - - - BTR - 000042 - BATON_ROUGE - LA - US - 30.48 - -91.30 - 0 - 0 - - - - ODI - 000361 - NODINE - MN - US - 43.91 - -91.47 - 0 - 0 - - - - EAU - 000085 - EAU_CLAIRE - WI - US - 44.90 - -91.48 - 0 - 0 - - - - IOW - 000343 - IOWA_CITY - IA - US - 41.52 - -91.61 - 0 - 0 - - - - MLU - 000184 - MONROE - LA - US - 32.52 - -92.03 - 0 - 0 - - - - LIT - 000156 - LITTLE_ROCK - AR - US - 34.68 - -92.18 - 0 - 0 - - - - DLH - 000075 - DULUTH - MN - US - 46.80 - -92.20 - 0 - 0 - - - - COU - 000063 - COLUMBIA - MO - US - 38.82 - -92.22 - 0 - 0 - - - - AEX - 000009 - ALEXANDRIA - LA - US - 31.26 - -92.50 - 0 - 0 - - - - IRK - 000139 - KIRKSVILLE - MO - US - 40.14 - -92.59 - 0 - 0 - - - - ELD - 000319 - EL_DORADO - AR - US - 33.26 - -92.74 - 0 - 0 - - - - LCH - 000154 - LAKE_CHARLES - LA - US - 30.14 - -93.11 - 0 - 0 - - - - MSP - 000194 - MINNEAPOLIS - MN - US - 44.88 - -93.23 - 0 - 0 - - - - MCW - 000171 - MASON_CITY - IA - US - 43.09 - -93.33 - 0 - 0 - - - - SGF - 000245 - SPRINGFIELD - MO - US - 37.36 - -93.33 - 0 - 0 - - - - INL - 000137 - INTERNATIONAL_FALLS - MN - US - 48.57 - -93.40 - 0 - 0 - - - - DSM - 000079 - DES_MOINES - IA - US - 41.44 - -93.65 - 0 - 0 - - - - EIC - 000318 - SHREVEPORT - LA - US - 32.77 - -93.81 - 0 - 0 - - - - BRD - 000292 - BRAINERD - MN - US - 46.35 - -94.03 - 0 - 0 - - - - TXK - 000272 - TEXARKANA - AR - US - 33.51 - -94.07 - 0 - 0 - - - - RZC - 000374 - RAZORBACK - AR - US - 36.25 - -94.12 - 0 - 0 - - - - FSM - 000108 - FT_SMITH - AR - US - 35.38 - -94.27 - 0 - 0 - - - - FOD - 000105 - FT_DODGE - IA - US - 42.61 - -94.29 - 0 - 0 - - - - BUM - 000045 - BUTLER - MO - US - 38.27 - -94.49 - 0 - 0 - - - - MKC - 000177 - KANSAS_CITY - MO - US - 39.28 - -94.59 - 0 - 0 - - - - LFK - 000155 - LUFKIN - TX - US - 31.16 - -94.72 - 0 - 0 - - - - GGG - 000115 - LONGVIEW - TX - US - 32.42 - -94.75 - 0 - 0 - - - - BJI - 000033 - BEMIDJI - MN - US - 47.58 - -95.02 - 0 - 0 - - - - RWF - 000234 - REDWWOD_FALLS - MN - US - 44.47 - -95.13 - 0 - 0 - - - - OSW - 000205 - OSWEGO - KS - US - 37.15 - -95.20 - 0 - 0 - - - - IAH - 000131 - HOUSTON_INTERNATIONAL - TX - US - 29.96 - -95.35 - 0 - 0 - - - - OVR - 000364 - OMAHA - NE - US - 41.17 - -95.74 - 0 - 0 - - - - MLC - 000180 - MC_CALESTER - OK - US - 34.85 - -95.78 - 0 - 0 - - - - TUL - 000268 - TULSA - OK - US - 36.20 - -95.79 - 0 - 0 - - - - PWE - 000222 - PAWNEE_CITY - NE - US - 40.20 - -96.21 - 0 - 0 - - - - PSX - 000219 - PALACIOS - TX - US - 28.76 - -96.31 - 0 - 0 - - - - FSD - 000107 - SIOUX_FALLS - SD - US - 43.65 - -96.78 - 0 - 0 - - - - FAR - 000098 - FARGO - ND - US - 46.75 - -96.85 - 0 - 0 - - - - DFW - 000072 - DALLAS-FT_WORTH - TX - US - 32.87 - -97.03 - 0 - 0 - - - - ADM - 000008 - ARDMORE - OK - US - 34.21 - -97.17 - 0 - 0 - - - - GFK - 000114 - GRAND_FORKS - ND - US - 47.95 - -97.19 - 0 - 0 - - - - YWG - 000397 - WINNIPEG - MB - CN - 49.90 - -97.23 - 0 - 0 - - - - ACT - 000006 - WACO - TX - US - 31.66 - -97.27 - 0 - 0 - - - - BRO - 000041 - BROWNSVILLE - TX - US - 25.92 - -97.38 - 0 - 0 - - - - CRP - 000065 - CORPUS_CHRISTI - TX - US - 27.90 - -97.45 - 0 - 0 - - - - ICT - 000132 - WICHITA - KS - US - 37.75 - -97.58 - 0 - 0 - - - - OKC - 000198 - OKLAHOMA_CITY - OK - US - 35.36 - -97.61 - 0 - 0 - - - - SLN - 000251 - SALINA - KS - US - 38.93 - -97.62 - 0 - 0 - - - - AUS - 000020 - AUSTIN - TX - US - 30.30 - -97.70 - 0 - 0 - - - - END - 000321 - VANCE_AFB - OK - US - 36.35 - -97.92 - 0 - 0 - - - - OBH - 000358 - WOLBACH - NE - US - 41.38 - -98.35 - 0 - 0 - - - - ABR - 000003 - ABERDEEN - SD - US - 45.42 - -98.37 - 0 - 0 - - - - SAT - 000238 - SAN_ANTONIO - TX - US - 29.64 - -98.46 - 0 - 0 - - - - SPS - 000254 - WICHITA_FALLS - TX - US - 33.99 - -98.59 - 0 - 0 - - - - ONL - 000200 - ONEILL - NE - US - 42.47 - -98.69 - 0 - 0 - - - - LRD - 000161 - LAREDO - TX - US - 27.48 - -99.42 - 0 - 0 - - - - JCT - 000144 - JUNCTION - TX - US - 30.60 - -99.82 - 0 - 0 - - - - ABI - 000001 - ABILENE - TX - US - 32.48 - -99.86 - 0 - 0 - - - - GAG - 000110 - GAGE - OK - US - 36.34 - -99.88 - 0 - 0 - - - - ANW - 000282 - AINSWORTH - NE - US - 42.57 - -99.99 - 0 - 0 - - - - PIR - 000214 - PIERRE - SD - US - 44.40 - -100.17 - 0 - 0 - - - - HLC - 000335 - HILL_CITY - KS - US - 39.26 - -100.23 - 0 - 0 - - - - CDS - 000051 - CHILDRESS - TX - US - 34.37 - -100.28 - 0 - 0 - - - - SJT - 000248 - SAN_ANGELO - TX - US - 31.38 - -100.46 - 0 - 0 - - - - MCK - 000351 - MC_COOK - NE - US - 40.20 - -100.59 - 0 - 0 - - - - BIS - 000032 - BISMARK - ND - US - 46.77 - -100.67 - 0 - 0 - - - - LBF - 000152 - NORTH_PLATTE - NE - US - 41.13 - -100.72 - 0 - 0 - - - - GCK - 000112 - GARDEN_CITY - KS - US - 37.92 - -100.73 - 0 - 0 - - - - DLF - 000309 - LAUGHLIN_AFB - TX - US - 29.36 - -100.77 - 0 - 0 - - - - LBL - 000153 - LIBERAL - KS - US - 37.04 - -100.97 - 0 - 0 - - - - MOT - 000187 - MINOT - ND - US - 48.26 - -101.29 - 0 - 0 - - - - AMA - 000014 - AMARILLO - TX - US - 35.29 - -101.64 - 0 - 0 - - - - GLD - 000118 - GOODLAND - KS - US - 39.39 - -101.69 - 0 - 0 - - - - DPR - 000077 - DUPREE - SD - US - 45.08 - -101.72 - 0 - 0 - - - - LBB - 000151 - LUBBOCK_INTERNATIONAL - TX - US - 33.70 - -101.92 - 0 - 0 - - - - MAF - 000167 - MIDLAND - TX - US - 32.02 - -102.18 - 0 - 0 - - - - LAA - 000146 - LAMAR - CO - US - 38.20 - -102.69 - 0 - 0 - - - - DIK - 000074 - DICKINSIN - ND - US - 46.86 - -102.77 - 0 - 0 - - - - TXO - 000385 - TEXICO_NM/BOVINA - TX - US - 34.50 - -102.84 - 0 - 0 - - - - SNY - 000379 - SIDNEY - NE - US - 41.10 - -102.98 - 0 - 0 - - - - FST - 000329 - FT_STOCKTON - TX - US - 30.95 - -102.98 - 0 - 0 - - - - RAP - 000224 - RAPID_CITY - SD - US - 43.98 - -103.01 - 0 - 0 - - - - AKO - 000011 - AKRON - CO - US - 40.16 - -103.18 - 0 - 0 - - - - INK - 000342 - WINK - TX - US - 31.87 - -103.24 - 0 - 0 - - - - BFF - 000026 - SCOTTSBLUFF - NE - US - 41.89 - -103.48 - 0 - 0 - - - - TBE - 000261 - TOBE - CO - US - 37.27 - -103.60 - 0 - 0 - - - - TCC - 000262 - TUCUMCARI - NM - US - 35.18 - -103.60 - 0 - 0 - - - - ISN - 000140 - WILLISTON - ND - US - 48.18 - -103.63 - 0 - 0 - - - - MRF - 000190 - MARFA - TX - US - 30.30 - -103.95 - 0 - 0 - - - - PUB - 000220 - PUEBLO - CO - US - 38.29 - -104.43 - 0 - 0 - - - - ROW - 000233 - ROSWELL - NM - US - 33.34 - -104.62 - 0 - 0 - - - - DEN - 000071 - DENVER - CO - US - 39.81 - -104.66 - 0 - 0 - - - - CYS - 000301 - CHEYENNE - WY - US - 41.21 - -104.77 - 0 - 0 - - - - CIM - 000297 - CIMARRON - NM - US - 36.49 - -104.87 - 0 - 0 - - - - LVS - 000163 - LAS_VEGAS - NM - US - 35.66 - -105.14 - 0 - 0 - - - - LAR - 000148 - LARAMIE - WY - US - 41.33 - -105.72 - 0 - 0 - - - - ALS - 000013 - ALAMOSA - CO - US - 37.35 - -105.82 - 0 - 0 - - - - MLS - 000182 - MILES_CITY - MT - US - 46.38 - -105.95 - 0 - 0 - - - - DDY - 000307 - CASPER - WY - US - 43.09 - -106.28 - 0 - 0 - - - - ELP - 000090 - EL_PASO - TX - US - 31.82 - -106.28 - 0 - 0 - - - - CZI - 000302 - CRAZY_WOMAN - WY - US - 44.00 - -106.44 - 0 - 0 - - - - GGW - 000116 - GLASGOW - MT - US - 48.22 - -106.63 - 0 - 0 - - - - ABQ - 000002 - ALBUQUERQUE - NM - US - 35.04 - -106.82 - 0 - 0 - - - - DBL - 000304 - EAGLE - CO - US - 39.44 - -106.90 - 0 - 0 - - - - HBU - 000333 - GUNNISON - CO - US - 38.45 - -107.04 - 0 - 0 - - - - SHR - 000246 - SHERIDAN - WY - US - 44.84 - -107.06 - 0 - 0 - - - - TCS - 000263 - TRUTH_OR_CONSEQUENCES - NM - US - 33.28 - -107.28 - 0 - 0 - - - - CHE - 000054 - HAYDEN - CO - US - 40.52 - -107.31 - 0 - 0 - - - - DMN - 000076 - DEMING - NM - US - 32.28 - -107.60 - 0 - 0 - - - - YYN - 000400 - SWIFT_CURRENT - SA - CN - 50.28 - -107.68 - 0 - 0 - - - - FMN - 000103 - FARMINGTON - NM - US - 36.75 - -108.10 - 0 - 0 - - - - BOY - 000290 - BOYSEN_RESV. - WY - US - 43.46 - -108.30 - 0 - 0 - - - - BIL - 000031 - BILLINGS - MT - US - 45.81 - -108.63 - 0 - 0 - - - - JNC - 000347 - GRAND_JUNCTION - CO - US - 39.06 - -108.79 - 0 - 0 - - - - DVC - 000082 - DOVE_CREEK - CO - US - 37.81 - -108.93 - 0 - 0 - - - - OCS - 000359 - ROCKSPRINGS - WY - US - 41.59 - -109.02 - 0 - 0 - - - - SJN - 000247 - ST_JOHNS - AZ - US - 34.42 - -109.14 - 0 - 0 - - - - SSO - 000256 - SAN_SIMON - AZ - US - 32.27 - -109.26 - 0 - 0 - - - - LWT - 000165 - LEWISTOWN - MT - US - 47.05 - -109.61 - 0 - 0 - - - - HVR - 000129 - HAVRE - MT - US - 48.54 - -109.77 - 0 - 0 - - - - BPI - 000291 - BIG_PINEY - WY - US - 42.58 - -110.11 - 0 - 0 - - - - MTU - 000196 - MYTON - UT - US - 40.15 - -110.13 - 0 - 0 - - - - HVE - 000128 - HANKSVILLE - UT - US - 38.42 - -110.70 - 0 - 0 - - - - YXH - 000399 - MEDICINE_HAT - AB - CN - 50.02 - -110.72 - 0 - 0 - - - - JAC - 000141 - JACKSON - WY - US - 43.62 - -110.73 - 0 - 0 - - - - INW - 000138 - WINSLOW - AZ - US - 35.06 - -110.80 - 0 - 0 - - - - TUS - 000269 - TUCSON - AZ - US - 32.10 - -110.92 - 0 - 0 - - - - TBC - 000260 - TUBA_CITY - AZ - US - 36.12 - -111.27 - 0 - 0 - - - - GTF - 000123 - GREAT_FALLS - MT - US - 47.45 - -111.41 - 0 - 0 - - - - HLN - 000336 - HELENA - MT - US - 46.61 - -111.95 - 0 - 0 - - - - PHX - 000211 - PHOENIX - AZ - US - 33.43 - -112.02 - 0 - 0 - - - - SLC - 000249 - SALT_LAKE_CITY - UT - US - 40.85 - -111.98 - 0 - 0 - - - - DBS - 000305 - DUBOIS - ID - US - 44.09 - -112.21 - 0 - 0 - - - - BCE - 000023 - BRYCE_CANYON - UT - US - 37.69 - -112.30 - 0 - 0 - - - - MLD - 000352 - MALAD_CITY - ID - US - 42.20 - -112.45 - 0 - 0 - - - - DRK - 000313 - PRESCOTT - AZ - US - 34.70 - -112.48 - 0 - 0 - - - - DTA - 000080 - DELTA - UT - US - 39.30 - -112.51 - 0 - 0 - - - - DLN - 000311 - DILLON - MT - US - 45.25 - -112.55 - 0 - 0 - - - - PIH - 000213 - POCATELLO - ID - US - 42.87 - -112.65 - 0 - 0 - - - - YQL - 000392 - LETHBRIDGE - AB - CN - 49.63 - -112.80 - 0 - 0 - - - - PGS - 000210 - PEACH_SPRINGS - AZ - US - 35.62 - -113.54 - 0 - 0 - - - - BVL - 000046 - BOONEVILLE - UT - US - 40.73 - -113.76 - 0 - 0 - - - - LKT - 000157 - SALMON - ID - US - 45.02 - -114.08 - 0 - 0 - - - - FCA - 000100 - KALISPELL - MT - US - 48.21 - -114.18 - 0 - 0 - - - - ILC - 000134 - WILSON_CREEK - NV - US - 38.25 - -114.39 - 0 - 0 - - - - EED - 000087 - NEEDLES - CA - US - 34.77 - -114.47 - 0 - 0 - - - - TWF - 000271 - TWIN_FALLS - ID - US - 42.48 - -114.49 - 0 - 0 - - - - BZA - 000294 - YUMA - AZ - US - 32.77 - -114.60 - 0 - 0 - - - - ELY - 000091 - ELY - NV - US - 39.30 - -114.85 - 0 - 0 - - - - LAS - 000149 - LAS_VEGAS - NV - US - 36.08 - -115.16 - 0 - 0 - - - - MLP - 000181 - MULLAN_PASS - ID - US - 47.46 - -115.65 - 0 - 0 - - - - YXC - 000398 - CRANBROOK - BC - CN - 49.60 - -115.78 - 0 - 0 - - - - TRM - 000383 - THERMAL - CA - US - 33.63 - -116.16 - 0 - 0 - - - - BOI - 000039 - BOISE - ID - US - 43.55 - -116.19 - 0 - 0 - - - - DNJ - 000312 - MC_CALL - ID - US - 44.77 - -116.21 - 0 - 0 - - - - HEC - 000334 - HECTOR - CA - US - 34.80 - -116.46 - 0 - 0 - - - - BTY - 000043 - BEATTY - NV - US - 36.80 - -116.75 - 0 - 0 - - - - BAM - 000286 - BATTLE_MOUNTAIN - NV - US - 40.57 - -116.92 - 0 - 0 - - - - MZB - 000354 - MISSION_BAY - CA - US - 32.78 - -117.23 - 0 - 0 - - - - GEG - 000113 - SPOKANE - WA - US - 47.56 - -117.63 - 0 - 0 - - - - OAL - 000357 - COALDALE - NV - US - 38.00 - -117.77 - 0 - 0 - - - - BKE - 000288 - BAKER - OR - US - 44.84 - -117.81 - 0 - 0 - - - - REO - 000227 - ROME - OR - US - 42.59 - -117.87 - 0 - 0 - - - - LAX - 000150 - LOS_ANGELES_INTL - CA - US - 33.93 - -118.43 - 0 - 0 - - - - PDT - 000207 - PENDLETON - OR - US - 45.70 - -118.94 - 0 - 0 - - - - EHF - 000317 - BAKERSFIELD - CA - US - 35.48 - -119.10 - 0 - 0 - - - - EPH - 000324 - EPHRATA - WA - US - 47.38 - -119.42 - 0 - 0 - - - - FMG - 000327 - RENO - NV - US - 39.53 - -119.66 - 0 - 0 - - - - RZS - 000375 - SANTA_BARBARA - CA - US - 34.51 - -119.77 - 0 - 0 - - - - CZQ - 000303 - FRESNO - CA - US - 36.88 - -119.82 - 0 - 0 - - - - YKM - 000279 - YAKIMA - WA - US - 46.57 - -120.45 - 0 - 0 - - - - LKV - 000158 - LAKEVIEW - OR - US - 42.49 - -120.51 - 0 - 0 - - - - YDC - 000389 - PRINCETON - BC - CN - 49.47 - -120.52 - 0 - 0 - - - - MOD - 000186 - MODESTO - CA - US - 37.63 - -120.96 - 0 - 0 - - - - DSD - 000314 - REDMOND - WA - US - 44.25 - -121.30 - 0 - 0 - - - - SAC - 000236 - SACRAMENTO - CA - US - 38.44 - -121.55 - 0 - 0 - - - - SNS - 000253 - SALINAS - CA - US - 36.66 - -121.60 - 0 - 0 - - - - OAK - 000356 - OAKLAND - CA - US - 37.73 - -122.22 - 0 - 0 - - - - RBL - 000225 - RED_BLUFF - CA - US - 40.10 - -122.24 - 0 - 0 - - - - SEA - 000243 - SEATTLE - WA - US - 47.44 - -122.31 - 0 - 0 - - - - BLI - 000035 - BELLINGHAM - WA - US - 48.95 - -122.58 - 0 - 0 - - - - PDX - 000208 - PORTLAND - OR - US - 45.58 - -122.60 - 0 - 0 - - - - PYE - 000371 - POINT_REYES - CA - US - 38.08 - -122.87 - 0 - 0 - - - - OED - 000362 - MEDFORD - OR - US - 42.48 - -122.91 - 0 - 0 - - - - EUG - 000093 - EUGENE - OR - US - 44.12 - -123.22 - 0 - 0 - - - - ENI - 000323 - UKIAH - CA - US - 39.05 - -123.27 - 0 - 0 - - - - ONP - 000201 - NEWPORT - OR - US - 44.58 - -124.06 - 0 - 0 - - - - HQM - 000127 - HOQUIAM - WA - US - 46.95 - -124.15 - 0 - 0 - - - - FOT - 000106 - FORTUNA - CA - US - 40.67 - -124.23 - 0 - 0 - - - - TOU - 000265 - NEAH_BAY - WA - US - 48.30 - -124.63 - 0 - 0 - - - - YQV - 000402 - YORKTON - SA - CN - 51.27 - -102.47 - 0 - 0 - - - - ANN - 0 - ANNETTE_ISLAND - AK - US - 55.05 - -131.57 - 0 - 0 - - - - LVD - 0 - LEVEL_ISLAND - AK - US - 56.47 - -133.08 - 0 - 0 - - - - BKA - 0 - BIORKA_ISLAND - AK - US - 56.86 - -135.55 - 0 - 0 - - - - SSR - 0 - SISTERS_ISLAND - AK - US - 58.17 - -135.25 - 0 - 0 - - - - JNU - 0 - JUNEAU - AK - US - 58.35 - -134.58 - 0 - 0 - - - - YAK - 0 - YAKUTAT - AK - US - 59.50 - -139.67 - 0 - 0 - - - - MDO - 0 - MIDDLETON_ISLAND - AK - US - 59.45 - -146.30 - 0 - 0 - - - - JOH - 0 - JOHNSTONE_POINT - AK - US - 60.48 - -146.60 - 0 - 0 - - - - ODK - 0 - KODIAK - AK - US - 57.75 - -152.50 - 0 - 0 - - - - HOM - 0 - HOMER - AK - US - 59.65 - -151.48 - 0 - 0 - - - - ENA - 0 - KENAI - AK - US - 60.57 - -151.25 - 0 - 0 - - - - ANC - 0 - ANCHORAGE - AK - US - 61.17 - -150.00 - 0 - 0 - - - - BGQ - 0 - BIG_LAKE - AK - US - 61.53 - -149.82 - 0 - 0 - - - - ORT - 0 - NORTHWAY - AK - US - 62.97 - -141.93 - 0 - 0 - - - - GKN - 0 - GULKANA - AK - US - 62.15 - -145.45 - 0 - 0 - - - - TKA - 0 - TALKEETNA - AK - US - 62.32 - -150.10 - 0 - 0 - - - - SQA - 0 - SPARREVOHN - AK - US - 61.10 - -155.63 - 0 - 0 - - - - DLG - 0 - DILLINGHAM - AK - US - 59.05 - -158.50 - 0 - 0 - - - - AKN - 0 - KING_SALMON - AK - US - 58.68 - -156.65 - 0 - 0 - - - - PDN - 0 - PORT_HEIDEN - AK - US - 56.95 - -158.65 - 0 - 0 - - - - CDB - 0 - COLD_BAY - AK - US - 55.20 - -162.73 - 0 - 0 - - - - DUT - 0 - DUTCH_HARBOR - AK - US - 53.90 - -166.55 - 0 - 0 - - - - NUD - 0 - ADAK - AK - US - 51.88 - -176.65 - 0 - 0 - - - - SYA - 0 - SHEMYA - AK - US - 52.72 - 174.12 - 0 - 0 - - - - SPY - 0 - ST_PAUL_ISLAND - AK - US - 57.17 - -170.22 - 0 - 0 - - - - EHM - 0 - CAPE_NEWENHAM - AK - US - 58.66 - -162.07 - 0 - 0 - - - - HPB - 0 - HOOPER_BAY - AK - US - 61.52 - -166.14 - 0 - 0 - - - - BET - 0 - BETHEL - AK - US - 60.78 - -161.83 - 0 - 0 - - - - ANI - 0 - ANIAK - AK - US - 61.59 - -159.61 - 0 - 0 - - - - SMA - 0 - ST_MARYS - AK - US - 62.06 - -163.30 - 0 - 0 - - - - UNK - 0 - UNALAKLEET - AK - US - 63.88 - -160.80 - 0 - 0 - - - - ULL - 0 - KUKULIAK - AK - US - 63.70 - -170.48 - 0 - 0 - - - - MCG - 0 - MC_GRATH - AK - US - 62.95 - -155.60 - 0 - 0 - - - - ENN - 0 - NENANA - AK - US - 64.55 - -149.07 - 0 - 0 - - - - FAI - 0 - FAIRBANKS - AK - US - 64.82 - -147.85 - 0 - 0 - - - - BIG - 0 - BIG_DELTA - AK - US - 64.00 - -145.72 - 0 - 0 - - - - FYU - 0 - FORT_YUKON - AK - US - 66.57 - -145.25 - 0 - 0 - - - - BTT - 0 - BETTLES - AK - US - 66.92 - -151.53 - 0 - 0 - - - - TAL - 0 - TANANA - AK - US - 65.18 - -152.18 - 0 - 0 - - - - CQR - 0 - CHANDALAR_LAKE - AK - US - 67.50 - -148.47 - 0 - 0 - - - - SCC - 0 - DEADHORSE - AK - US - 70.20 - -148.47 - 0 - 0 - - - - BTI - 0 - BARTER_ISLAND - AK - US - 70.13 - -143.57 - 0 - 0 - - - - BRW - 0 - BARROW - AK - US - 71.28 - -156.77 - 0 - 0 - - - - GAL - 0 - GALENA - AK - US - 64.73 - -156.93 - 0 - 0 - - - - OME - 0 - NOME - AK - US - 64.52 - -165.45 - 0 - 0 - - - - OTZ - 0 - KOTZEBUE - AK - US - 66.88 - -162.60 - 0 - 0 - - - - WLK - 0 - SELAWIK - AK - US - 66.60 - -160.00 - 0 - 0 - - - - HSL - 0 - HUSLIA - AK - US - 65.71 - -156.37 - 0 - 0 - - - - BSF - 0 - BRADSHAW - HI - US - 19.76 - -155.39 - 0 - 0 - - - - UPP - 0 - UPOLU_POINT - HI - US - 20.20 - -155.84 - 0 - 0 - - - - ITO - 0 - HILO - HI - US - 19.72 - -155.01 - 0 - 0 - - - - HNL - 0 - HONOLULU - HI - US - 21.33 - -157.93 - 0 - 0 - - - - OGG - 0 - MAUI - HI - US - 20.91 - -156.42 - 0 - 0 - - - - NDB - 0 - VALLEY_ISLAND - HI - US - 20.88 - -156.44 - 0 - 0 - - - - MUE - 0 - KAMUELA - HI - US - 20.00 - -155.67 - 0 - 0 - - - - NGF - 0 - KANEOHE_BAY - HI - US - 21.45 - -157.76 - 0 - 0 - - - - MKK - 0 - MOLOKAI - HI - US - 21.14 - -157.17 - 0 - 0 - - - - NBS - 0 - BARKING_SANDS - HI - US - 22.04 - -159.79 - 0 - 0 - - - - CKH - 0 - KOKO_HEAD - HI - US - 21.27 - -157.70 - 0 - 0 - - - - IAI - 0 - KONA - HI - US - 19.65 - -156.02 - 0 - 0 - - - - LLD - 0 - LANAI - HI - US - 20.77 - -156.97 - 0 - 0 - - - - LNY - 0 - LANAI_CITY - HI - US - 20.76 - -156.97 - 0 - 0 - - - - LIH - 0 - LIHUE - HI - US - 21.97 - -159.34 - 0 - 0 - - - - SOK - 0 - SOUTH_KAUAI - HI - US - 21.90 - -159.53 - 0 - 0 - - - - RSW - 0 - LEE_COUNTY - FL - US - 26.53 - -81.78 - 0 - 0 - - - - PZD - 0 - PECAN - GA - US - 31.66 - -84.29 - 0 - 0 - - - - IIU - 0 - LOUISVILLE - KY - US - 38.10 - -85.58 - 0 - 0 - - - - HRV - 0 - HARVEY - LA - US - 29.85 - -90.00 - 0 - 0 - - - - MCI - 0 - KANSAS_CITY - MO - US - 39.29 - -94.74 - 0 - 0 - - - - TTT - 0 - MAVERICK - TX - US - 32.87 - -97.04 - 0 - 0 - - - - CWK - 0 - CENTEX - TX - US - 30.38 - -97.53 - 0 - 0 - - - - CME - 0 - CHISUM - NM - US - 33.34 - -104.62 - 0 - 0 - - - - FTI - 0 - FT_UNION - NM - US - 35.66 - -105.14 - 0 - 0 - - - - RSK - 0 - RATTLESNAKE - NM - US - 36.75 - -108.10 - 0 - 0 - - - - HUH - 0 - WHATCOM - WA - US - 48.95 - -122.58 - 0 - 0 - - - - ASRF - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - AYPY - 940350 - PORT_MORESBY_INTL - - NG - -9.43 - 147.22 - 47 - 0 - - - - BGSF - 042310 - SONDRE_STROMFJORD - - GL - 67.00 - -50.80 - 53 - 0 - - - - BIRK - 040300 - REYKJAVIK - - IL - 64.13 - -21.90 - 61 - 0 - - - - CWEG - 999999 - ALBERTA_WEATHER_CENTRE - - CN - 53.50 - -113.50 - -9999 - 0 - - - - CWLW - 712030 - KELOWNA - BC - CN - 49.95 - -119.40 - 456 - 0 - - - - CWNT - 712500 - TURTLE_MOUNTAIN - AB - CN - 49.58 - -114.42 - 2164 - 0 - - - - CWTO - 716380 - TORONTO_A_E_S__HQ - ON - CN - 43.78 - -79.47 - 187 - 0 - - - - CWUL - 999999 - QUEBEC_FCST_OFFICE - - CN - 45.50 - -73.68 - -9999 - 0 - - - - CYQX - 718030 - GANDER_INTL_AIRPORT - NF - CN - 48.95 - -54.57 - 151 - 0 - - - - DTTA - 607150 - TUNIS/CARTHAGE - - TS - 36.83 - 10.23 - 4 - 0 - - - - EBBR - 064510 - BRUSSELS_NATIONAL - - BX - 50.90 - 4.53 - 58 - 0 - - - - EDMM - 108680 - MUENCHEN - - DL - 48.25 - 11.58 - 484 - 0 - - - - EDZB - 102380 - BERGEN/HOHNE - - DL - 52.82 - 9.93 - 70 - 0 - - - - EDZE - 104100 - ESSEN/MULHEIM - - DL - 51.40 - 6.97 - 161 - 0 - - - - EDZF - 106370 - FRANKFURT/MAIN - - DL - 50.05 - 8.58 - 112 - 0 - - - - EDZH - 107710 - GAERMERSDORF - - DL - 49.43 - 11.90 - 419 - 0 - - - - EDZM - 108680 - MUENCHEN - - DL - 48.25 - 11.58 - 484 - 0 - - - - EETN - 260380 - TALLIN - - BY - 59.35 - 24.80 - 44 - 0 - - - - EFHK - 029740 - HELSINKI/VANTAA - - FI - 60.32 - 24.97 - 56 - 0 - - - - EFRO - 028450 - ROVANIEMI(CIV/MIL) - - FI - 66.57 - 25.83 - 201 - 0 - - - - EGJJ - 038950 - JERSEY_AIRPORT - - UK - 49.22 - -2.20 - 84 - 0 - - - - EHAM - 062400 - AMSTERDAM/SCHIPHOL - - NL - 52.30 - 4.77 - -2 - 0 - - - - EHDB - 062600 - DE_BILT - - NL - 52.10 - 5.18 - 4 - 0 - - - - EINN - 039620 - SHANNON_AIRPORT - - IE - 52.70 - -8.92 - 20 - 0 - - - - EKCH - 061800 - COPENHAGEN/KASTRUP - - DN - 55.63 - 12.67 - 5 - 0 - - - - ENMI - 999999 - OSLO - - NO - 59.50 - 10.70 - -9999 - 0 - - - - ENVN - 011520 - BODO - - NO - 67.25 - 14.40 - 8 - 0 - - - - ENVV - 014150 - STAVANGER - - NO - 58.87 - 5.67 - 34 - 0 - - - - EPWA - 123750 - WARSAW/OKECIE - - PL - 52.17 - 20.97 - 107 - 0 - - - - ESNN - 023660 - SUNDSVALL/HARNOSAND - - SN - 62.53 - 17.45 - 10 - 0 - - - - ESSA - 024600 - STOCKHOLM/ARLANDA - - SN - 59.65 - 17.95 - 61 - 0 - - - - EVRA - 999999 - RIGA_AIRPORT - LE - BY - 56.92 - 23.97 - 10 - 0 - - - - EYVI - 267300 - VILNIUS_INTL - MI - BY - 54.63 - 25.28 - 156 - 0 - - - - FAJS - 683680 - JAN_SMUTS - - ZA - -26.13 - 28.23 - 1700 - 0 - - - - FCBB - 644500 - BRAZZAVILLE/MAYA-MA - - CG - -4.25 - 15.25 - 316 - 0 - - - - FTTJ - 647000 - NDJAMENA(CIV/MIL) - - CD - 12.13 - 15.03 - 295 - 0 - - - - GCGC - 999999 - CANARY_ISLANDS - - CR - 28.50 - -16.00 - -9999 - 0 - - - - GMMC - 601550 - CASABLANCA - - MC - 33.57 - -7.67 - 62 - 0 - - - - HECA - 623660 - CAIRO_INTL_AIRPORT - - EG - 30.13 - 31.40 - 74 - 0 - - - - LBSF - 156140 - SOFIA - - BU - 42.65 - 23.38 - 595 - 0 - - - - LBWN - 155520 - VARNA - - BU - 43.20 - 27.92 - 43 - 0 - - - - LCLK - 176090 - LARNACA/LARNAX_ARPT - - CY - 34.88 - 33.63 - 2 - 0 - - - - LDZA - 131310 - ZAGREB/PLESO - - RH - 45.73 - 16.07 - 107 - 0 - - - - LDZO - 999999 - ZAGREB/PLESO - - RH - 45.73 - 16.07 - 107 - 0 - - - - LECB - 081810 - BARCELONA - - SP - 41.28 - 2.07 - 6 - 0 - - - - LEMM - 999999 - MADRID_CNM - - SP - 40.12 - -3.53 - -9999 - 0 - - - - LFBD - 075100 - BORDEAUX/MERIGNAC - - FR - 44.83 - -.70 - 61 - 0 - - - - LFMM - 076500 - MARSEILLE - - FR - 43.45 - 5.22 - 20 - 0 - - - - LFPW - 999999 - PARIS_MET_CENTER - - FR - 48.83 - 2.33 - 75 - 0 - - - - LFRN - 071300 - RENNES/ST.JACQUES - - FR - 48.07 - -1.73 - 37 - 0 - - - - LFST - 071900 - STRASBOURG/ENTZHEIM - - FR - 48.55 - 7.63 - 154 - 0 - - - - LGAT - 167160 - ATHENS/HELLENKION - - GR - 37.90 - 23.73 - 15 - 0 - - - - LHBP - 128390 - BUDAPEST/FERIHEGY - - HU - 47.43 - 19.27 - 185 - 0 - - - - LIMM - 160800 - MILANO/LINATE - - IY - 45.43 - 9.27 - 103 - 0 - - - - LJLJ - 130140 - LJUBLJANA/BRNIK - - LJ - 46.22 - 14.48 - 385 - 0 - - - - LKPR - 115180 - PRAGUE/RUZYNE - - CZ - 50.10 - 14.28 - 365 - 0 - - - - LLBG - 401800 - BEN-GURION(CIV/MIL) - - IS - 32.00 - 34.90 - 49 - 0 - - - - LMML - 165970 - LUQA/MALTA - - ML - 35.85 - 14.48 - 91 - 0 - - - - LOWW - 110360 - VIENNA/SCHWECHAT - - OS - 48.12 - 16.57 - 190 - 0 - - - - LPPT - 085360 - LISBON/PORTELA - - PO - 38.78 - -9.13 - 123 - 0 - - - - LROM - 154210 - BUCHAREST/OTOPENI - - RO - 44.55 - 26.10 - 95 - 0 - - - - LROP - 154210 - BUCHAREST/OTOPENI - - RO - 44.55 - 26.10 - 95 - 0 - - - - LSZH - 066700 - ZURICH-KLOTEN_(AUT) - - SW - 47.48 - 8.53 - 432 - 0 - - - - LTAC - 171280 - ANKARA/ESENBOGA - - TU - 40.11 - 32.97 - 949 - 0 - - - - LTBA - 170600 - ISTANBUL/ATATURK_AB - - TU - 40.97 - 28.82 - 37 - 0 - - - - LUKK - 338387 - KISHINAU - - UR - 46.93 - 28.93 - 122 - 0 - - - - LWSK - 135860 - SKOPJE/PETROVAC - - MK - 41.97 - 21.65 - 239 - 0 - - - - LYBE - 132720 - BELGRADE/SURCIN - - YG - 44.82 - 20.28 - 99 - 0 - - - - LZIB - 118160 - BRATISLAVA_IVANKA - - CZ - 48.20 - 17.20 - 130 - 0 - - - - NFFN - 916800 - NANDI/NADI_INTL - - FJ - -17.75 - 177.45 - 18 - 0 - - - - NZDT - 999999 - NEW_ZEALAND - - NZ - -41.00 - 172.50 - -9999 - 0 - - - - NZKL - 999999 - AUCKLAND - - NZ - -37.02 - 174.80 - 6 - 0 - - - - MHTG - 787200 - TEGUCIGALPA/TONCONT - - HO - 14.05 - -87.22 - 994 - 0 - - - - MPTO - 787920 - TOCUMEN/GEN._OMAR - - PM - 9.05 - -79.37 - 11 - 0 - - - - OBBB - 999999 - BAHRAIN_INTL_ARPT - - BN - 26.27 - 50.65 - 2 - 0 - - - - OBBI - 411500 - BAHRAIN_INTL_ARPT - - BN - 26.27 - 50.65 - 2 - 0 - - - - OEJD - 999999 - JEDDAH - - SD - 21.30 - 39.20 - -9999 - 0 - - - - OEJN - 410240 - JEDDAH/KING_ABD - - SD - 21.67 - 39.15 - 12 - 0 - - - - OIII - 407540 - TEHRAN/MEHRABAD_AFB - - IR - 35.68 - 51.35 - 1191 - 0 - - - - OIIX - 999999 - TEHRAN - - IR - 35.68 - 51.35 - 1191 - 0 - - - - OLBA - 401000 - BEIRUT_(CIV/MIL) - - LB - 33.82 - 35.48 - 19 - 0 - - - - OPKC - 417800 - KARACHI_INTL_ARPT - - PK - 24.90 - 67.13 - 22 - 0 - - - - OPLA - 416410 - LAHORE(CIV/MIL) - - PK - 31.52 - 74.40 - 217 - 0 - - - - OYSN - 413440 - SANA'A - - YE - 15.52 - 44.18 - 2190 - 0 - - - - PAFA - 702610 - FAIRBANKS_INTL_ARPT_(ASOS) - AK - US - 64.82 - -147.87 - 138 - 0 - - - - PAJN - 703810 - JUNEAU_INTL_AIRPORT_(ASOS) - AK - US - 58.37 - -134.58 - 7 - 0 - - - - PANC - 702730 - ANCHORAGE_INTL_ARPT_(ASOS) - AK - US - 61.17 - -150.02 - 40 - 0 - - - - RKSI - 470699 - CHAJANG_NI_(K-ARMY) - - KO - 37.87 - 127.18 - 100 - 0 - - - - RCTP - 466860 - TAIPEI/CHIANG_KAI_SHEK - - TW - 25.08 - 121.22 - 33 - 0 - - - - SABE - 875820 - AEROPARQUE(CIV/MIL) - - AG - -34.57 - -58.42 - 6 - 0 - - - - SACO - 873440 - CORDOBA_AIRPORT - - AG - -31.32 - -64.22 - 474 - 0 - - - - SAEZ - 875760 - BUENOS_AIRES/EZEIZA - - AG - -34.82 - -58.53 - 20 - 0 - - - - SAME - 874180 - MENDOZA/EL_PLUMERIL - - AG - -32.83 - -68.78 - 704 - 0 - - - - SARE - 871550 - RESISTENCIA_AIRPORT - - AG - -27.45 - -59.05 - 52 - 0 - - - - SBBE - 821930 - BELEM/VAL_DE_CAES - - BZ - -1.38 - -48.48 - 16 - 0 - - - - SBBR - 833780 - BRASILIA_(CIV/MIL) - - BZ - -15.87 - -47.93 - 1061 - 0 - - - - SBBS - 833780 - BRASILIA - - BZ - -15.87 - -47.93 - 1061 - 0 - - - - SBCT - 838400 - CURITIBA/AFONSO_PEN - - BZ - -25.52 - -49.17 - 908 - 0 - - - - SBCW - 838400 - CURITIBA/AFONSO_PEN - - BZ - -25.52 - -49.17 - 908 - 0 - - - - SBEG - 821110 - EDUARDO_GOMES_INTL - - BZ - -3.03 - -60.05 - 2 - 0 - - - - SBGL - 837460 - GALEAO/RIO(CIV/MIL) - - BZ - -22.82 - -43.25 - 6 - 0 - - - - SBGR - 837753 - GUARULHOS_(CIV/MIL) - - BZ - -23.43 - -46.47 - 750 - 0 - - - - SBRF - 828990 - RECIFE/GUARARAPES - - BZ - -8.07 - -34.85 - 19 - 0 - - - - SCCI - 859340 - PUNTA_ARENAS/PRES_C - - CH - -53.00 - -70.85 - 37 - 0 - - - - SCEL - 855740 - PUDAHUEL/ARTURO_MER - - CH - -33.38 - -70.78 - 476 - 0 - - - - SCFA - 854420 - ANTOFAGASTA/CERRO - - CH - -23.43 - -70.43 - 120 - 0 - - - - SCTE - 857990 - PUERTO_MONTT/TEPUAL - - CH - -41.42 - -73.08 - 86 - 0 - - - - SLLP - 852010 - LA_PAZ/JFK_INTL - - BO - -16.52 - -68.18 - 4014 - 0 - - - - SOCA - 814050 - CAYENNE/ROCHAMBEAU - - FG - 4.83 - -52.37 - 9 - 0 - - - - SPIM - 846280 - LIMA/JORGE_CHAVEZ - - PR - -12.00 - -77.12 - 13 - 0 - - - - TNCC - 789880 - HATO_ARPT_(CIV/MIL) - - NU - 12.20 - -68.97 - 67 - 0 - - - - TTPP - 789700 - PIARCO_INTL_AIRPORT - - TD - 10.62 - -61.35 - 15 - 0 - - - - UAAA - 368700 - ALMA-ATA - AL - RA - 43.23 - 76.93 - 847 - 0 - - - - UAFM - 835300 - FRUNZE - - RA - 42.85 - 74.53 - 760 - 0 - - - - UATT - 352290 - AKTJUBINSK - AL - KZ - 50.30 - 57.23 - 227 - 0 - - - - UBBB - 378640 - BAKU/BINE_ARPT - TB - AJ - 40.45 - 50.07 - -1 - 0 - - - - UGEE - 377890 - YEREVAN/ZAPADNY - TB - RS - 40.13 - 44.47 - 907 - 0 - - - - UGGG - 375490 - TBILISI/NOVO-AL - TB - RS - 41.68 - 44.95 - 490 - 0 - - - - UHBB - 315100 - BLAGOVESHCHENSK - HA - RA - 50.27 - 127.50 - 137 - 0 - - - - UHHH - 317350 - KHABAROVSK/NOVY - HA - RA - 48.52 - 135.16 - 72 - 0 - - - - UHNN - 999999 - NIKOLAEVSK-NA-AMURE_CENTER - HA - RA - 53.15 - 140.70 - 68 - 0 - - - - UHWW - 319600 - VLADIVOSTOK - HA - RA - 43.12 - 131.94 - 184 - 0 - - - - UHPP - 325400 - PETROPAVLOVSK-KAMCA - HA - RA - 52.97 - 158.75 - 24 - 0 - - - - UHSS - 321500 - JUZNO-SAHALINSK - HA - RA - 46.92 - 142.73 - 31 - 0 - - - - UIBB - 303090 - BRATSK - - RA - 56.07 - 101.83 - 489 - 0 - - - - UIII - 307100 - IRKUTSK - IR - RA - 52.27 - 104.35 - 513 - 0 - - - - UIKK - 302300 - KIRENSK - IR - RA - 57.77 - 108.07 - 258 - 0 - - - - UKBB - 333470 - BORISPOL'/KIEV - KV - UR - 50.33 - 30.97 - 119 - 0 - - - - UKFF - 339460 - SIMFEROPOL - - UR - 44.68 - 34.13 - 180 - 0 - - - - UKHH - 343000 - KHARKIV - KI - UR - 49.96 - 36.13 - 1550 - 0 - - - - UKLL - 333930 - LVOV - KI - UR - 49.82 - 23.95 - 325 - 0 - - - - UKOO - 338370 - ODESSA/TSENTRALNY - KI - UR - 46.43 - 30.77 - 35 - 0 - - - - ULAA - 225500 - ARHANGELSK - AR - RS - 64.53 - 40.47 - 13 - 0 - - - - ULLI - 260630 - ST.PETERSBURG(VOEJKOVO) - LE - RS - 59.95 - 30.70 - 78 - 0 - - - - ULLL - 260630 - ST.PETERSBURG - LE - RS - 59.95 - 30.70 - 78 - 0 - - - - ULWW - 270370 - VOLOGDA - AR - RS - 59.23 - 39.87 - 131 - 0 - - - - ULMM - 221130 - MURMANSK - AR - RS - 68.97 - 33.05 - 51 - 0 - - - - UMKK - 267020 - KALININGRAD - - BY - 54.70 - 20.62 - 27 - 0 - - - - UMMS - 268500 - MINSK - MI - BY - 53.87 - 27.53 - 234 - 0 - - - - UNBB - 298380 - BARNAUL - NO - RA - 53.40 - 83.70 - 252 - 0 - - - - UNIT - 245070 - TURA - NO - RA - 64.27 - 100.23 - 186 - 0 - - - - UNKB - 292820 - BOGUCHANY - NO - RA - 58.42 - 97.40 - 134 - 0 - - - - UNKL - 284935 - KRASNOYARSK - - RS - 56.18 - 92.52 - -9999 - 0 - - - - UNLL - 999999 - KOLPASHEVO - NO - RA - 58.30 - 82.90 - 76 - 0 - - - - UNNT - 296340 - NOVOSIBIRSK/TOLMACH - - RA - 55.03 - 82.90 - 177 - 0 - - - - UNOO - 286980 - OMSK - NO - RA - 54.93 - 73.40 - 123 - 0 - - - - UODD - 206740 - DIKSON_ISLAND - DK - RA - 73.53 - 80.40 - 47 - 0 - - - - UOHH - 208910 - KHATANGA - DK - RA - 71.98 - 102.47 - 24 - 0 - - - - UOTT - 234720 - TURUKHANSK - - RA - 65.78 - 087.95 - 37 - 0 - - - - URRV - 273290 - ROSTOV - MS - RS - 57.20 - 39.42 - 102 - 0 - - - - URWA - 999999 - ASTRAKHAN - - RS - 46.35 - 47.97 - -22 - 0 - - - - URWW - 345600 - VOLGOGRAD - TB - RS - 48.68 - 44.35 - 145 - 0 - - - - USCC - 286420 - CHELYABINSK/BALANDI - SV - RA - 55.18 - 61.32 - -9999 - 0 - - - - USDD - 999999 - SALEKHARD - NO - RA - 66.53 - 66.53 - 358 - 0 - - - - USDS - 235520 - TARKO-SALE - NO - RA - 64.92 - 77.82 - 27 - 0 - - - - USHB - 236310 - BEREZOVO - NO - RA - 63.93 - 65.05 - 27 - 0 - - - - USHH - 239330 - HANTY-MANSIJSK - NO - RA - 60.97 - 69.07 - 40 - 0 - - - - USKK - 999999 - KIROV - MS - RS - 58.60 - 49.63 - 158 - 0 - - - - USPP - 282250 - PERM - SV - RA - 58.02 - 56.30 - 172 - 0 - - - - USRR - 238490 - SURGUT - NO - RA - 61.25 - 73.50 - 44 - 0 - - - - USSS - 284400 - SVERDLOVSK - SV - RA - 56.80 - 60.63 - 237 - 0 - - - - USUU - 286610 - KURGAN - SV - RA - 55.47 - 65.40 - 79 - 0 - - - - UTAA - 388800 - ASHABAD - TA - RA - 37.97 - 58.33 - 210 - 0 - - - - UTTT - 384570 - TASHKENT/YUZNI - TA - RA - 41.27 - 69.27 - 489 - 0 - - - - UUWW - 275185 - MOSCOW/VNUKOVO - MS - RS - 55.65 - 37.27 - 203 - 0 - - - - UUYP - 234180 - PECHORA - AR - RS - 65.11 - 57.10 - 61 - 0 - - - - UUYW - 232260 - VORKUTA - AR - RA - 67.48 - 64.02 - 180 - 0 - - - - UUYY - 238040 - SYKTYVKAR - AR - RA - 61.72 - 50.83 - 119 - 0 - - - - UWKD - 275950 - KAZAN' - MS - RS - 55.78 - 49.18 - 116 - 0 - - - - UWUU - 287220 - UFA - SV - RA - 54.75 - 56.00 - 105 - 0 - - - - VABB - 430030 - BOMBAY/SANTA_CR - - IN - 19.12 - 72.84 - 14 - 0 - - - - VCBI - 434500 - COLOMBO/KATUNAYAKE - - SB - 7.17 - 79.88 - 8 - 0 - - - - VGZR - 419220 - KURMITOLA/ZIA_INTL - - BW - 23.85 - 90.40 - 10 - 0 - - - - VHHH - 450070 - HONG_KONG_INTL_ARPT - - HK - 22.33 - 114.18 - 24 - 0 - - - - VIDP - 421810 - INDIRA_GANDHI/DELHI - - IN - 28.57 - 77.12 - 233 - 0 - - - - WSSS - 486980 - SINGAPORE/CHANG - - SR - 1.37 - 103.98 - 16 - 0 - - - - YBRF - 945780 - BRISBANE - QU - AU - -27.43 - 153.08 - 2 - 0 - - - - YBTL - 942940 - TOWNSVILLE(CIV/MIL) - QU - AU - -19.25 - 146.75 - 6 - 0 - - - - YMHF - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - YMMB - 948700 - MOORABBIN_AIRPORT - VC - AU - -37.98 - 145.10 - 13 - 0 - - - - YMMC - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - YMRF - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - YPDM - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - YPRF - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - YPRM - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - YSRF - 948640 - MELBOURNE - VC - AU - -37.73 - 144.90 - 81 - 0 - - - - ZPPP - 567780 - KUNMING/WUJIABA - CD - CI - 25.02 - 102.68 - 1892 - 0 - - - + + + + + YSJ + 000395 + ST_JOHN + NB + CN + 45.32 + -65.88 + 0 + 0 + + + + HUL + 000341 + HOULTON + ME + US + 46.04 + -67.83 + 0 + 0 + + + + PQI + 000367 + PRESQUE_ISLE + ME + US + 46.77 + -68.09 + 0 + 0 + + + + MLT + 000183 + MILLINOCKET + ME + US + 45.58 + -68.52 + 0 + 0 + + + + BGR + 000029 + BANGOR + ME + US + 44.84 + -68.87 + 0 + 0 + + + + ACK + 000005 + NANTUCKET + MA + US + 41.28 + -70.03 + 0 + 0 + + + + ENE + 000322 + KENNEBUNK + ME + US + 43.43 + -70.61 + 0 + 0 + + + + BOS + 000289 + BOSTON + MA + US + 42.36 + -70.99 + 0 + 0 + + + + YQB + 000391 + QUEBEC + QB + CN + 46.80 + -71.38 + 0 + 0 + + + + PVD + 000221 + PROVIDENCE + RI + US + 41.72 + -71.43 + 0 + 0 + + + + CON + 000062 + CONCORD + NH + US + 43.22 + -71.58 + 0 + 0 + + + + YSC + 000394 + SHERBROOKE + QB + CN + 45.43 + -71.68 + 0 + 0 + + + + HTO + 000340 + EAST_HAMPTON + NY + US + 40.92 + -72.32 + 0 + 0 + + + + MPV + 000188 + MONTPELIER + VT + US + 44.22 + -72.57 + 0 + 0 + + + + BDL + 000287 + WINSOR_LOCKS + CT + US + 41.94 + -72.69 + 0 + 0 + + + + PLB + 000365 + PLATTSBURGH + NY + US + 44.69 + -73.52 + 0 + 0 + + + + JFK + 000345 + NEW_YORK/JF_KENNEDY + NY + US + 40.63 + -73.77 + 0 + 0 + + + + ALB + 000012 + ALBANY + NY + US + 42.75 + -73.80 + 0 + 0 + + + + CYN + 000300 + COYLE + NJ + US + 39.82 + -74.43 + 0 + 0 + + + + SAX + 000376 + SPARTA + NJ + US + 41.07 + -74.54 + 0 + 0 + + + + MSS + 000353 + MASSENA + NY + US + 44.91 + -74.72 + 0 + 0 + + + + SIE + 000377 + SEA_ISLE + NJ + US + 39.10 + -74.80 + 0 + 0 + + + + HNK + 000338 + HANCOCK + NY + US + 42.06 + -75.32 + 0 + 0 + + + + SBY + 000242 + SALISBURY + MD + US + 38.35 + -75.52 + 0 + 0 + + + + YOW + 000390 + OTTAWA + ON + CN + 45.32 + -75.67 + 0 + 0 + + + + ETX + 000325 + EAST_TEXAS + PA + US + 40.58 + -75.68 + 0 + 0 + + + + ECG + 000086 + ELIZABETH_CITY + NC + US + 36.25 + -76.18 + 0 + 0 + + + + SYR + 000259 + SYRACUSE + NY + US + 43.16 + -76.20 + 0 + 0 + + + + ORF + 000203 + NORFOLK + VA + US + 36.89 + -76.20 + 0 + 0 + + + + EMI + 000320 + WESTMINSTER + MD + US + 39.50 + -76.98 + 0 + 0 + + + + HAR + 000126 + HARRISBURG + PA + US + 40.23 + -77.02 + 0 + 0 + + + + DCA + 000306 + WASHINGTON + DC + US + 38.86 + -77.04 + 0 + 0 + + + + RIC + 000229 + RICHMOND + VA + US + 37.50 + -77.32 + 0 + 0 + + + + CSN + 000299 + CASSANOVA + VA + US + 38.64 + -77.87 + 0 + 0 + + + + ILM + 000135 + WILMINGTON + NC + US + 34.35 + -77.87 + 0 + 0 + + + + SLT + 000252 + SLATE_RUN + PA + US + 41.51 + -77.97 + 0 + 0 + + + + PSB + 000368 + PHILLIPSBURG + PA + US + 40.92 + -77.99 + 0 + 0 + + + + BUF + 000044 + BUFFALO + NY + US + 42.93 + -78.65 + 0 + 0 + + + + RDU + 000372 + RALEIGH-DURHAM + NC + US + 35.87 + -78.78 + 0 + 0 + + + + JST + 000145 + JOHNSTOWN + PA + US + 40.32 + -78.83 + 0 + 0 + + + + JHW + 000346 + JAMESTOWN + NY + US + 42.19 + -79.12 + 0 + 0 + + + + LYH + 000166 + LYNCHBURG + VA + US + 37.25 + -79.23 + 0 + 0 + + + + YYZ + 000401 + TORONTO + ON + CN + 43.67 + -79.63 + 0 + 0 + + + + FLO + 000102 + FLORENCE + SC + US + 34.23 + -79.66 + 0 + 0 + + + + GSO + 000122 + GREENSBORO + NC + US + 36.05 + -79.98 + 0 + 0 + + + + CHS + 000056 + CHARLESTON + SC + US + 32.89 + -80.04 + 0 + 0 + + + + PBI + 000206 + WEST_PALM_BEACH + FL + US + 26.68 + -80.09 + 0 + 0 + + + + EKN + 000088 + ELKINS + WV + US + 38.92 + -80.10 + 0 + 0 + + + + EWC + 000326 + ELLWOOD_CITY + PA + US + 40.83 + -80.21 + 0 + 0 + + + + ERI + 000092 + ERIE + PA + US + 42.02 + -80.30 + 0 + 0 + + + + MIA + 000176 + MIAMI + FL + US + 25.80 + -80.30 + 0 + 0 + + + + VRB + 000276 + VERO_BEACH + FL + US + 27.68 + -80.49 + 0 + 0 + + + + PSK + 000369 + DUBLIN + VA + US + 37.09 + -80.71 + 0 + 0 + + + + AIR + 000280 + BELLAIRE + OH + US + 40.02 + -80.82 + 0 + 0 + + + + CLT + 000059 + CHARLOTTE + NC + US + 35.22 + -80.93 + 0 + 0 + + + + CAE + 000295 + COLUMBIA + SC + US + 33.86 + -81.05 + 0 + 0 + + + + YVV + 000396 + WIARTON + ON + CN + 44.75 + -81.10 + 0 + 0 + + + + SAV + 000239 + SAVANNAH + GA + US + 32.16 + -81.11 + 0 + 0 + + + + OMN + 000363 + ORMOND_BEACH + FL + US + 29.30 + -81.11 + 0 + 0 + + + + BKW + 000034 + BECKLEY + WV + US + 37.78 + -81.12 + 0 + 0 + + + + ORL + 000204 + ORLANDO + FL + US + 28.54 + -81.34 + 0 + 0 + + + + CRG + 000298 + JACKSONVILLE + FL + US + 30.34 + -81.51 + 0 + 0 + + + + EYW + 000096 + KEY_WEST + FL + US + 24.59 + -81.80 + 0 + 0 + + + + FMY + 000104 + FT_MEYERS + FL + US + 26.58 + -81.87 + 0 + 0 + + + + SPA + 000380 + SPARTANBURG + SC + US + 35.03 + -81.93 + 0 + 0 + + + + HNN + 000339 + HENDERSON + WV + US + 38.75 + -82.03 + 0 + 0 + + + + HMV + 000337 + HOLSTON_MOUNTAIN + TN + US + 36.44 + -82.13 + 0 + 0 + + + + CLE + 000058 + CLEVELAND + OH + US + 41.42 + -81.85 + 0 + 0 + + + + IRQ + 000344 + COLLIERS + SC + US + 33.71 + -82.16 + 0 + 0 + + + + AMG + 000015 + ALMA + GA + US + 31.54 + -82.51 + 0 + 0 + + + + SRQ + 000382 + SARASOTA + FL + US + 27.40 + -82.55 + 0 + 0 + + + + APE + 000283 + APPLETON + OH + US + 40.15 + -82.59 + 0 + 0 + + + + PIE + 000212 + SAINT_PETERSBURG + FL + US + 27.91 + -82.68 + 0 + 0 + + + + ECK + 000316 + PECK + MI + US + 43.26 + -82.72 + 0 + 0 + + + + CTY + 000066 + CROSS_CITY + FL + US + 29.60 + -83.05 + 0 + 0 + + + + ODF + 000360 + TOCCOA + GA + US + 34.70 + -83.30 + 0 + 0 + + + + DXO + 000315 + DETROIT + MI + US + 42.21 + -83.37 + 0 + 0 + + + + ASP + 000284 + OSCODA + MI + US + 44.45 + -83.39 + 0 + 0 + + + + MCN + 000170 + MACON + GA + US + 32.69 + -83.65 + 0 + 0 + + + + FNT + 000328 + FLINT + MI + US + 42.97 + -83.74 + 0 + 0 + + + + VXV + 000388 + KNOXVILLE + TN + US + 35.90 + -83.89 + 0 + 0 + + + + ROD + 000373 + ROSEWOOD + OH + US + 40.29 + -84.04 + 0 + 0 + + + + MBS + 000168 + SAGINAW + MI + US + 43.53 + -84.08 + 0 + 0 + + + + LOZ + 000160 + LONDON + KY + US + 37.03 + -84.12 + 0 + 0 + + + + ABY + 000004 + ALBANY + GA + US + 31.65 + -84.30 + 0 + 0 + + + + SSM + 000255 + SAULT_STE_MARIE + MI + US + 46.41 + -84.31 + 0 + 0 + + + + TLH + 000264 + TALLAHASSEE + FL + US + 30.56 + -84.37 + 0 + 0 + + + + ATL + 000019 + ATLANTA + GA + US + 33.63 + -84.44 + 0 + 0 + + + + CVG + 000067 + COVINGTON + KY + US + 39.02 + -84.70 + 0 + 0 + + + + GQO + 000331 + CHATTANOOGA + TN + US + 34.96 + -85.15 + 0 + 0 + + + + FWA + 000109 + FT_WAYNE + IN + US + 40.98 + -85.19 + 0 + 0 + + + + LGC + 000350 + LA_GRANGE + GA + US + 33.05 + -85.21 + 0 + 0 + + + + GRR + 000332 + GRAND_RAPIDS + MI + US + 42.79 + -85.50 + 0 + 0 + + + + TVC + 000270 + TRAVERSE_CITY + MI + US + 44.67 + -85.55 + 0 + 0 + + + + LOU + 000159 + LOUISVILLE + KY + US + 38.10 + -85.58 + 0 + 0 + + + + MKG + 000179 + MUSKEGON + MI + US + 43.17 + -86.04 + 0 + 0 + + + + PMM + 000366 + PULLMAN + MI + US + 42.47 + -86.11 + 0 + 0 + + + + GIJ + 000330 + NILES + MI + US + 41.77 + -86.32 + 0 + 0 + + + + MGM + 000175 + MONTGOMERY + AL + US + 32.22 + -86.32 + 0 + 0 + + + + IND + 000136 + INDIANAPOLIS + IN + US + 39.81 + -86.37 + 0 + 0 + + + + BWG + 000047 + BOWLING_GREEN + KY + US + 36.93 + -86.44 + 0 + 0 + + + + BNA + 000037 + NASHVILLE + TN + US + 36.14 + -86.68 + 0 + 0 + + + + CEW + 000052 + CRESTVIEW + FL + US + 30.83 + -86.68 + 0 + 0 + + + + VUZ + 000387 + VULCAN + AL + US + 33.67 + -86.90 + 0 + 0 + + + + BVT + 000293 + LAFAYETTE + IN + US + 40.56 + -87.07 + 0 + 0 + + + + TTH + 000384 + TERRE_HAUTE + IN + US + 39.49 + -87.25 + 0 + 0 + + + + MSL + 000191 + MUSCLE_SHOALS + AL + US + 34.70 + -87.48 + 0 + 0 + + + + SAW + 000189 + SAWYER + MI + US + 46.35 + -87.38 + 0 + 0 + + + + PXV + 000370 + POCKET_CITY + IN + US + 37.93 + -87.76 + 0 + 0 + + + + ORD + 000202 + O'HARE_INTERNATIONAL + IL + US + 41.98 + -87.90 + 0 + 0 + + + + GRB + 000119 + GREEN_BAY + WI + US + 44.56 + -88.19 + 0 + 0 + + + + BAE + 000285 + MILWAUKEE + WI + US + 43.12 + -88.28 + 0 + 0 + + + + JOT + 000348 + JOLIET + IL + US + 41.55 + -88.32 + 0 + 0 + + + + SJI + 000378 + SEMMNES + AL + US + 30.73 + -88.36 + 0 + 0 + + + + IGB + 000133 + BIGBEE + MS + US + 33.48 + -88.52 + 0 + 0 + + + + MEI + 000172 + MERIDIAN + MS + US + 32.38 + -88.80 + 0 + 0 + + + + DEC + 000070 + DECATUR + IL + US + 39.74 + -88.86 + 0 + 0 + + + + YQT + 000393 + THUNDER_BAY + ON + CN + 48.37 + -89.32 + 0 + 0 + + + + DYR + 000083 + DYERSBURG + TN + US + 36.02 + -89.32 + 0 + 0 + + + + RHI + 000228 + RHINELANDER + WI + US + 45.63 + -89.45 + 0 + 0 + + + + BDF + 000024 + BRADFORD + IL + US + 41.16 + -89.59 + 0 + 0 + + + + DLL + 000310 + DELLS + WI + US + 43.55 + -89.76 + 0 + 0 + + + + MEM + 000173 + MEMPHIS + TN + US + 35.06 + -89.98 + 0 + 0 + + + + LEV + 000349 + GRAND_ISLE + LA + US + 29.18 + -90.10 + 0 + 0 + + + + JAN + 000142 + JACKSON + MS + US + 32.51 + -90.17 + 0 + 0 + + + + MSY + 000195 + NEW_ORLEANS + LA + US + 30.00 + -90.27 + 0 + 0 + + + + FAM + 000097 + FARMINGTON + MO + US + 37.67 + -90.23 + 0 + 0 + + + + MCB + 000169 + MC_COMB + MS + US + 31.30 + -90.26 + 0 + 0 + + + + SQS + 000381 + SIDON + MS + US + 33.46 + -90.28 + 0 + 0 + + + + STL + 000257 + ST_LOUIS + MO + US + 38.86 + -90.48 + 0 + 0 + + + + DBQ + 000069 + DUBUQUE + IA + US + 42.40 + -90.71 + 0 + 0 + + + + ARG + 000018 + WALNUT_RIDGE + AR + US + 36.11 + -90.95 + 0 + 0 + + + + UIN + 000386 + QUINCY + IL + US + 39.85 + -91.28 + 0 + 0 + + + + BTR + 000042 + BATON_ROUGE + LA + US + 30.48 + -91.30 + 0 + 0 + + + + ODI + 000361 + NODINE + MN + US + 43.91 + -91.47 + 0 + 0 + + + + EAU + 000085 + EAU_CLAIRE + WI + US + 44.90 + -91.48 + 0 + 0 + + + + IOW + 000343 + IOWA_CITY + IA + US + 41.52 + -91.61 + 0 + 0 + + + + MLU + 000184 + MONROE + LA + US + 32.52 + -92.03 + 0 + 0 + + + + LIT + 000156 + LITTLE_ROCK + AR + US + 34.68 + -92.18 + 0 + 0 + + + + DLH + 000075 + DULUTH + MN + US + 46.80 + -92.20 + 0 + 0 + + + + COU + 000063 + COLUMBIA + MO + US + 38.82 + -92.22 + 0 + 0 + + + + AEX + 000009 + ALEXANDRIA + LA + US + 31.26 + -92.50 + 0 + 0 + + + + IRK + 000139 + KIRKSVILLE + MO + US + 40.14 + -92.59 + 0 + 0 + + + + ELD + 000319 + EL_DORADO + AR + US + 33.26 + -92.74 + 0 + 0 + + + + LCH + 000154 + LAKE_CHARLES + LA + US + 30.14 + -93.11 + 0 + 0 + + + + MSP + 000194 + MINNEAPOLIS + MN + US + 44.88 + -93.23 + 0 + 0 + + + + MCW + 000171 + MASON_CITY + IA + US + 43.09 + -93.33 + 0 + 0 + + + + SGF + 000245 + SPRINGFIELD + MO + US + 37.36 + -93.33 + 0 + 0 + + + + INL + 000137 + INTERNATIONAL_FALLS + MN + US + 48.57 + -93.40 + 0 + 0 + + + + DSM + 000079 + DES_MOINES + IA + US + 41.44 + -93.65 + 0 + 0 + + + + EIC + 000318 + SHREVEPORT + LA + US + 32.77 + -93.81 + 0 + 0 + + + + BRD + 000292 + BRAINERD + MN + US + 46.35 + -94.03 + 0 + 0 + + + + TXK + 000272 + TEXARKANA + AR + US + 33.51 + -94.07 + 0 + 0 + + + + RZC + 000374 + RAZORBACK + AR + US + 36.25 + -94.12 + 0 + 0 + + + + FSM + 000108 + FT_SMITH + AR + US + 35.38 + -94.27 + 0 + 0 + + + + FOD + 000105 + FT_DODGE + IA + US + 42.61 + -94.29 + 0 + 0 + + + + BUM + 000045 + BUTLER + MO + US + 38.27 + -94.49 + 0 + 0 + + + + MKC + 000177 + KANSAS_CITY + MO + US + 39.28 + -94.59 + 0 + 0 + + + + LFK + 000155 + LUFKIN + TX + US + 31.16 + -94.72 + 0 + 0 + + + + GGG + 000115 + LONGVIEW + TX + US + 32.42 + -94.75 + 0 + 0 + + + + BJI + 000033 + BEMIDJI + MN + US + 47.58 + -95.02 + 0 + 0 + + + + RWF + 000234 + REDWWOD_FALLS + MN + US + 44.47 + -95.13 + 0 + 0 + + + + OSW + 000205 + OSWEGO + KS + US + 37.15 + -95.20 + 0 + 0 + + + + IAH + 000131 + HOUSTON_INTERNATIONAL + TX + US + 29.96 + -95.35 + 0 + 0 + + + + OVR + 000364 + OMAHA + NE + US + 41.17 + -95.74 + 0 + 0 + + + + MLC + 000180 + MC_CALESTER + OK + US + 34.85 + -95.78 + 0 + 0 + + + + TUL + 000268 + TULSA + OK + US + 36.20 + -95.79 + 0 + 0 + + + + PWE + 000222 + PAWNEE_CITY + NE + US + 40.20 + -96.21 + 0 + 0 + + + + PSX + 000219 + PALACIOS + TX + US + 28.76 + -96.31 + 0 + 0 + + + + FSD + 000107 + SIOUX_FALLS + SD + US + 43.65 + -96.78 + 0 + 0 + + + + FAR + 000098 + FARGO + ND + US + 46.75 + -96.85 + 0 + 0 + + + + DFW + 000072 + DALLAS-FT_WORTH + TX + US + 32.87 + -97.03 + 0 + 0 + + + + ADM + 000008 + ARDMORE + OK + US + 34.21 + -97.17 + 0 + 0 + + + + GFK + 000114 + GRAND_FORKS + ND + US + 47.95 + -97.19 + 0 + 0 + + + + YWG + 000397 + WINNIPEG + MB + CN + 49.90 + -97.23 + 0 + 0 + + + + ACT + 000006 + WACO + TX + US + 31.66 + -97.27 + 0 + 0 + + + + BRO + 000041 + BROWNSVILLE + TX + US + 25.92 + -97.38 + 0 + 0 + + + + CRP + 000065 + CORPUS_CHRISTI + TX + US + 27.90 + -97.45 + 0 + 0 + + + + ICT + 000132 + WICHITA + KS + US + 37.75 + -97.58 + 0 + 0 + + + + OKC + 000198 + OKLAHOMA_CITY + OK + US + 35.36 + -97.61 + 0 + 0 + + + + SLN + 000251 + SALINA + KS + US + 38.93 + -97.62 + 0 + 0 + + + + AUS + 000020 + AUSTIN + TX + US + 30.30 + -97.70 + 0 + 0 + + + + END + 000321 + VANCE_AFB + OK + US + 36.35 + -97.92 + 0 + 0 + + + + OBH + 000358 + WOLBACH + NE + US + 41.38 + -98.35 + 0 + 0 + + + + ABR + 000003 + ABERDEEN + SD + US + 45.42 + -98.37 + 0 + 0 + + + + SAT + 000238 + SAN_ANTONIO + TX + US + 29.64 + -98.46 + 0 + 0 + + + + SPS + 000254 + WICHITA_FALLS + TX + US + 33.99 + -98.59 + 0 + 0 + + + + ONL + 000200 + ONEILL + NE + US + 42.47 + -98.69 + 0 + 0 + + + + LRD + 000161 + LAREDO + TX + US + 27.48 + -99.42 + 0 + 0 + + + + JCT + 000144 + JUNCTION + TX + US + 30.60 + -99.82 + 0 + 0 + + + + ABI + 000001 + ABILENE + TX + US + 32.48 + -99.86 + 0 + 0 + + + + GAG + 000110 + GAGE + OK + US + 36.34 + -99.88 + 0 + 0 + + + + ANW + 000282 + AINSWORTH + NE + US + 42.57 + -99.99 + 0 + 0 + + + + PIR + 000214 + PIERRE + SD + US + 44.40 + -100.17 + 0 + 0 + + + + HLC + 000335 + HILL_CITY + KS + US + 39.26 + -100.23 + 0 + 0 + + + + CDS + 000051 + CHILDRESS + TX + US + 34.37 + -100.28 + 0 + 0 + + + + SJT + 000248 + SAN_ANGELO + TX + US + 31.38 + -100.46 + 0 + 0 + + + + MCK + 000351 + MC_COOK + NE + US + 40.20 + -100.59 + 0 + 0 + + + + BIS + 000032 + BISMARK + ND + US + 46.77 + -100.67 + 0 + 0 + + + + LBF + 000152 + NORTH_PLATTE + NE + US + 41.13 + -100.72 + 0 + 0 + + + + GCK + 000112 + GARDEN_CITY + KS + US + 37.92 + -100.73 + 0 + 0 + + + + DLF + 000309 + LAUGHLIN_AFB + TX + US + 29.36 + -100.77 + 0 + 0 + + + + LBL + 000153 + LIBERAL + KS + US + 37.04 + -100.97 + 0 + 0 + + + + MOT + 000187 + MINOT + ND + US + 48.26 + -101.29 + 0 + 0 + + + + AMA + 000014 + AMARILLO + TX + US + 35.29 + -101.64 + 0 + 0 + + + + GLD + 000118 + GOODLAND + KS + US + 39.39 + -101.69 + 0 + 0 + + + + DPR + 000077 + DUPREE + SD + US + 45.08 + -101.72 + 0 + 0 + + + + LBB + 000151 + LUBBOCK_INTERNATIONAL + TX + US + 33.70 + -101.92 + 0 + 0 + + + + MAF + 000167 + MIDLAND + TX + US + 32.02 + -102.18 + 0 + 0 + + + + LAA + 000146 + LAMAR + CO + US + 38.20 + -102.69 + 0 + 0 + + + + DIK + 000074 + DICKINSIN + ND + US + 46.86 + -102.77 + 0 + 0 + + + + TXO + 000385 + TEXICO_NM/BOVINA + TX + US + 34.50 + -102.84 + 0 + 0 + + + + SNY + 000379 + SIDNEY + NE + US + 41.10 + -102.98 + 0 + 0 + + + + FST + 000329 + FT_STOCKTON + TX + US + 30.95 + -102.98 + 0 + 0 + + + + RAP + 000224 + RAPID_CITY + SD + US + 43.98 + -103.01 + 0 + 0 + + + + AKO + 000011 + AKRON + CO + US + 40.16 + -103.18 + 0 + 0 + + + + INK + 000342 + WINK + TX + US + 31.87 + -103.24 + 0 + 0 + + + + BFF + 000026 + SCOTTSBLUFF + NE + US + 41.89 + -103.48 + 0 + 0 + + + + TBE + 000261 + TOBE + CO + US + 37.27 + -103.60 + 0 + 0 + + + + TCC + 000262 + TUCUMCARI + NM + US + 35.18 + -103.60 + 0 + 0 + + + + ISN + 000140 + WILLISTON + ND + US + 48.18 + -103.63 + 0 + 0 + + + + MRF + 000190 + MARFA + TX + US + 30.30 + -103.95 + 0 + 0 + + + + PUB + 000220 + PUEBLO + CO + US + 38.29 + -104.43 + 0 + 0 + + + + ROW + 000233 + ROSWELL + NM + US + 33.34 + -104.62 + 0 + 0 + + + + DEN + 000071 + DENVER + CO + US + 39.81 + -104.66 + 0 + 0 + + + + CYS + 000301 + CHEYENNE + WY + US + 41.21 + -104.77 + 0 + 0 + + + + CIM + 000297 + CIMARRON + NM + US + 36.49 + -104.87 + 0 + 0 + + + + LVS + 000163 + LAS_VEGAS + NM + US + 35.66 + -105.14 + 0 + 0 + + + + LAR + 000148 + LARAMIE + WY + US + 41.33 + -105.72 + 0 + 0 + + + + ALS + 000013 + ALAMOSA + CO + US + 37.35 + -105.82 + 0 + 0 + + + + MLS + 000182 + MILES_CITY + MT + US + 46.38 + -105.95 + 0 + 0 + + + + DDY + 000307 + CASPER + WY + US + 43.09 + -106.28 + 0 + 0 + + + + ELP + 000090 + EL_PASO + TX + US + 31.82 + -106.28 + 0 + 0 + + + + CZI + 000302 + CRAZY_WOMAN + WY + US + 44.00 + -106.44 + 0 + 0 + + + + GGW + 000116 + GLASGOW + MT + US + 48.22 + -106.63 + 0 + 0 + + + + ABQ + 000002 + ALBUQUERQUE + NM + US + 35.04 + -106.82 + 0 + 0 + + + + DBL + 000304 + EAGLE + CO + US + 39.44 + -106.90 + 0 + 0 + + + + HBU + 000333 + GUNNISON + CO + US + 38.45 + -107.04 + 0 + 0 + + + + SHR + 000246 + SHERIDAN + WY + US + 44.84 + -107.06 + 0 + 0 + + + + TCS + 000263 + TRUTH_OR_CONSEQUENCES + NM + US + 33.28 + -107.28 + 0 + 0 + + + + CHE + 000054 + HAYDEN + CO + US + 40.52 + -107.31 + 0 + 0 + + + + DMN + 000076 + DEMING + NM + US + 32.28 + -107.60 + 0 + 0 + + + + YYN + 000400 + SWIFT_CURRENT + SA + CN + 50.28 + -107.68 + 0 + 0 + + + + FMN + 000103 + FARMINGTON + NM + US + 36.75 + -108.10 + 0 + 0 + + + + BOY + 000290 + BOYSEN_RESV. + WY + US + 43.46 + -108.30 + 0 + 0 + + + + BIL + 000031 + BILLINGS + MT + US + 45.81 + -108.63 + 0 + 0 + + + + JNC + 000347 + GRAND_JUNCTION + CO + US + 39.06 + -108.79 + 0 + 0 + + + + DVC + 000082 + DOVE_CREEK + CO + US + 37.81 + -108.93 + 0 + 0 + + + + OCS + 000359 + ROCKSPRINGS + WY + US + 41.59 + -109.02 + 0 + 0 + + + + SJN + 000247 + ST_JOHNS + AZ + US + 34.42 + -109.14 + 0 + 0 + + + + SSO + 000256 + SAN_SIMON + AZ + US + 32.27 + -109.26 + 0 + 0 + + + + LWT + 000165 + LEWISTOWN + MT + US + 47.05 + -109.61 + 0 + 0 + + + + HVR + 000129 + HAVRE + MT + US + 48.54 + -109.77 + 0 + 0 + + + + BPI + 000291 + BIG_PINEY + WY + US + 42.58 + -110.11 + 0 + 0 + + + + MTU + 000196 + MYTON + UT + US + 40.15 + -110.13 + 0 + 0 + + + + HVE + 000128 + HANKSVILLE + UT + US + 38.42 + -110.70 + 0 + 0 + + + + YXH + 000399 + MEDICINE_HAT + AB + CN + 50.02 + -110.72 + 0 + 0 + + + + JAC + 000141 + JACKSON + WY + US + 43.62 + -110.73 + 0 + 0 + + + + INW + 000138 + WINSLOW + AZ + US + 35.06 + -110.80 + 0 + 0 + + + + TUS + 000269 + TUCSON + AZ + US + 32.10 + -110.92 + 0 + 0 + + + + TBC + 000260 + TUBA_CITY + AZ + US + 36.12 + -111.27 + 0 + 0 + + + + GTF + 000123 + GREAT_FALLS + MT + US + 47.45 + -111.41 + 0 + 0 + + + + HLN + 000336 + HELENA + MT + US + 46.61 + -111.95 + 0 + 0 + + + + PHX + 000211 + PHOENIX + AZ + US + 33.43 + -112.02 + 0 + 0 + + + + SLC + 000249 + SALT_LAKE_CITY + UT + US + 40.85 + -111.98 + 0 + 0 + + + + DBS + 000305 + DUBOIS + ID + US + 44.09 + -112.21 + 0 + 0 + + + + BCE + 000023 + BRYCE_CANYON + UT + US + 37.69 + -112.30 + 0 + 0 + + + + MLD + 000352 + MALAD_CITY + ID + US + 42.20 + -112.45 + 0 + 0 + + + + DRK + 000313 + PRESCOTT + AZ + US + 34.70 + -112.48 + 0 + 0 + + + + DTA + 000080 + DELTA + UT + US + 39.30 + -112.51 + 0 + 0 + + + + DLN + 000311 + DILLON + MT + US + 45.25 + -112.55 + 0 + 0 + + + + PIH + 000213 + POCATELLO + ID + US + 42.87 + -112.65 + 0 + 0 + + + + YQL + 000392 + LETHBRIDGE + AB + CN + 49.63 + -112.80 + 0 + 0 + + + + PGS + 000210 + PEACH_SPRINGS + AZ + US + 35.62 + -113.54 + 0 + 0 + + + + BVL + 000046 + BOONEVILLE + UT + US + 40.73 + -113.76 + 0 + 0 + + + + LKT + 000157 + SALMON + ID + US + 45.02 + -114.08 + 0 + 0 + + + + FCA + 000100 + KALISPELL + MT + US + 48.21 + -114.18 + 0 + 0 + + + + ILC + 000134 + WILSON_CREEK + NV + US + 38.25 + -114.39 + 0 + 0 + + + + EED + 000087 + NEEDLES + CA + US + 34.77 + -114.47 + 0 + 0 + + + + TWF + 000271 + TWIN_FALLS + ID + US + 42.48 + -114.49 + 0 + 0 + + + + BZA + 000294 + YUMA + AZ + US + 32.77 + -114.60 + 0 + 0 + + + + ELY + 000091 + ELY + NV + US + 39.30 + -114.85 + 0 + 0 + + + + LAS + 000149 + LAS_VEGAS + NV + US + 36.08 + -115.16 + 0 + 0 + + + + MLP + 000181 + MULLAN_PASS + ID + US + 47.46 + -115.65 + 0 + 0 + + + + YXC + 000398 + CRANBROOK + BC + CN + 49.60 + -115.78 + 0 + 0 + + + + TRM + 000383 + THERMAL + CA + US + 33.63 + -116.16 + 0 + 0 + + + + BOI + 000039 + BOISE + ID + US + 43.55 + -116.19 + 0 + 0 + + + + DNJ + 000312 + MC_CALL + ID + US + 44.77 + -116.21 + 0 + 0 + + + + HEC + 000334 + HECTOR + CA + US + 34.80 + -116.46 + 0 + 0 + + + + BTY + 000043 + BEATTY + NV + US + 36.80 + -116.75 + 0 + 0 + + + + BAM + 000286 + BATTLE_MOUNTAIN + NV + US + 40.57 + -116.92 + 0 + 0 + + + + MZB + 000354 + MISSION_BAY + CA + US + 32.78 + -117.23 + 0 + 0 + + + + GEG + 000113 + SPOKANE + WA + US + 47.56 + -117.63 + 0 + 0 + + + + OAL + 000357 + COALDALE + NV + US + 38.00 + -117.77 + 0 + 0 + + + + BKE + 000288 + BAKER + OR + US + 44.84 + -117.81 + 0 + 0 + + + + REO + 000227 + ROME + OR + US + 42.59 + -117.87 + 0 + 0 + + + + LAX + 000150 + LOS_ANGELES_INTL + CA + US + 33.93 + -118.43 + 0 + 0 + + + + PDT + 000207 + PENDLETON + OR + US + 45.70 + -118.94 + 0 + 0 + + + + EHF + 000317 + BAKERSFIELD + CA + US + 35.48 + -119.10 + 0 + 0 + + + + EPH + 000324 + EPHRATA + WA + US + 47.38 + -119.42 + 0 + 0 + + + + FMG + 000327 + RENO + NV + US + 39.53 + -119.66 + 0 + 0 + + + + RZS + 000375 + SANTA_BARBARA + CA + US + 34.51 + -119.77 + 0 + 0 + + + + CZQ + 000303 + FRESNO + CA + US + 36.88 + -119.82 + 0 + 0 + + + + YKM + 000279 + YAKIMA + WA + US + 46.57 + -120.45 + 0 + 0 + + + + LKV + 000158 + LAKEVIEW + OR + US + 42.49 + -120.51 + 0 + 0 + + + + YDC + 000389 + PRINCETON + BC + CN + 49.47 + -120.52 + 0 + 0 + + + + MOD + 000186 + MODESTO + CA + US + 37.63 + -120.96 + 0 + 0 + + + + DSD + 000314 + REDMOND + WA + US + 44.25 + -121.30 + 0 + 0 + + + + SAC + 000236 + SACRAMENTO + CA + US + 38.44 + -121.55 + 0 + 0 + + + + SNS + 000253 + SALINAS + CA + US + 36.66 + -121.60 + 0 + 0 + + + + OAK + 000356 + OAKLAND + CA + US + 37.73 + -122.22 + 0 + 0 + + + + RBL + 000225 + RED_BLUFF + CA + US + 40.10 + -122.24 + 0 + 0 + + + + SEA + 000243 + SEATTLE + WA + US + 47.44 + -122.31 + 0 + 0 + + + + BLI + 000035 + BELLINGHAM + WA + US + 48.95 + -122.58 + 0 + 0 + + + + PDX + 000208 + PORTLAND + OR + US + 45.58 + -122.60 + 0 + 0 + + + + PYE + 000371 + POINT_REYES + CA + US + 38.08 + -122.87 + 0 + 0 + + + + OED + 000362 + MEDFORD + OR + US + 42.48 + -122.91 + 0 + 0 + + + + EUG + 000093 + EUGENE + OR + US + 44.12 + -123.22 + 0 + 0 + + + + ENI + 000323 + UKIAH + CA + US + 39.05 + -123.27 + 0 + 0 + + + + ONP + 000201 + NEWPORT + OR + US + 44.58 + -124.06 + 0 + 0 + + + + HQM + 000127 + HOQUIAM + WA + US + 46.95 + -124.15 + 0 + 0 + + + + FOT + 000106 + FORTUNA + CA + US + 40.67 + -124.23 + 0 + 0 + + + + TOU + 000265 + NEAH_BAY + WA + US + 48.30 + -124.63 + 0 + 0 + + + + YQV + 000402 + YORKTON + SA + CN + 51.27 + -102.47 + 0 + 0 + + + + ANN + 0 + ANNETTE_ISLAND + AK + US + 55.05 + -131.57 + 0 + 0 + + + + LVD + 0 + LEVEL_ISLAND + AK + US + 56.47 + -133.08 + 0 + 0 + + + + BKA + 0 + BIORKA_ISLAND + AK + US + 56.86 + -135.55 + 0 + 0 + + + + SSR + 0 + SISTERS_ISLAND + AK + US + 58.17 + -135.25 + 0 + 0 + + + + JNU + 0 + JUNEAU + AK + US + 58.35 + -134.58 + 0 + 0 + + + + YAK + 0 + YAKUTAT + AK + US + 59.50 + -139.67 + 0 + 0 + + + + MDO + 0 + MIDDLETON_ISLAND + AK + US + 59.45 + -146.30 + 0 + 0 + + + + JOH + 0 + JOHNSTONE_POINT + AK + US + 60.48 + -146.60 + 0 + 0 + + + + ODK + 0 + KODIAK + AK + US + 57.75 + -152.50 + 0 + 0 + + + + HOM + 0 + HOMER + AK + US + 59.65 + -151.48 + 0 + 0 + + + + ENA + 0 + KENAI + AK + US + 60.57 + -151.25 + 0 + 0 + + + + ANC + 0 + ANCHORAGE + AK + US + 61.17 + -150.00 + 0 + 0 + + + + BGQ + 0 + BIG_LAKE + AK + US + 61.53 + -149.82 + 0 + 0 + + + + ORT + 0 + NORTHWAY + AK + US + 62.97 + -141.93 + 0 + 0 + + + + GKN + 0 + GULKANA + AK + US + 62.15 + -145.45 + 0 + 0 + + + + TKA + 0 + TALKEETNA + AK + US + 62.32 + -150.10 + 0 + 0 + + + + SQA + 0 + SPARREVOHN + AK + US + 61.10 + -155.63 + 0 + 0 + + + + DLG + 0 + DILLINGHAM + AK + US + 59.05 + -158.50 + 0 + 0 + + + + AKN + 0 + KING_SALMON + AK + US + 58.68 + -156.65 + 0 + 0 + + + + PDN + 0 + PORT_HEIDEN + AK + US + 56.95 + -158.65 + 0 + 0 + + + + CDB + 0 + COLD_BAY + AK + US + 55.20 + -162.73 + 0 + 0 + + + + DUT + 0 + DUTCH_HARBOR + AK + US + 53.90 + -166.55 + 0 + 0 + + + + NUD + 0 + ADAK + AK + US + 51.88 + -176.65 + 0 + 0 + + + + SYA + 0 + SHEMYA + AK + US + 52.72 + 174.12 + 0 + 0 + + + + SPY + 0 + ST_PAUL_ISLAND + AK + US + 57.17 + -170.22 + 0 + 0 + + + + EHM + 0 + CAPE_NEWENHAM + AK + US + 58.66 + -162.07 + 0 + 0 + + + + HPB + 0 + HOOPER_BAY + AK + US + 61.52 + -166.14 + 0 + 0 + + + + BET + 0 + BETHEL + AK + US + 60.78 + -161.83 + 0 + 0 + + + + ANI + 0 + ANIAK + AK + US + 61.59 + -159.61 + 0 + 0 + + + + SMA + 0 + ST_MARYS + AK + US + 62.06 + -163.30 + 0 + 0 + + + + UNK + 0 + UNALAKLEET + AK + US + 63.88 + -160.80 + 0 + 0 + + + + ULL + 0 + KUKULIAK + AK + US + 63.70 + -170.48 + 0 + 0 + + + + MCG + 0 + MC_GRATH + AK + US + 62.95 + -155.60 + 0 + 0 + + + + ENN + 0 + NENANA + AK + US + 64.55 + -149.07 + 0 + 0 + + + + FAI + 0 + FAIRBANKS + AK + US + 64.82 + -147.85 + 0 + 0 + + + + BIG + 0 + BIG_DELTA + AK + US + 64.00 + -145.72 + 0 + 0 + + + + FYU + 0 + FORT_YUKON + AK + US + 66.57 + -145.25 + 0 + 0 + + + + BTT + 0 + BETTLES + AK + US + 66.92 + -151.53 + 0 + 0 + + + + TAL + 0 + TANANA + AK + US + 65.18 + -152.18 + 0 + 0 + + + + CQR + 0 + CHANDALAR_LAKE + AK + US + 67.50 + -148.47 + 0 + 0 + + + + SCC + 0 + DEADHORSE + AK + US + 70.20 + -148.47 + 0 + 0 + + + + BTI + 0 + BARTER_ISLAND + AK + US + 70.13 + -143.57 + 0 + 0 + + + + BRW + 0 + BARROW + AK + US + 71.28 + -156.77 + 0 + 0 + + + + GAL + 0 + GALENA + AK + US + 64.73 + -156.93 + 0 + 0 + + + + OME + 0 + NOME + AK + US + 64.52 + -165.45 + 0 + 0 + + + + OTZ + 0 + KOTZEBUE + AK + US + 66.88 + -162.60 + 0 + 0 + + + + WLK + 0 + SELAWIK + AK + US + 66.60 + -160.00 + 0 + 0 + + + + HSL + 0 + HUSLIA + AK + US + 65.71 + -156.37 + 0 + 0 + + + + BSF + 0 + BRADSHAW + HI + US + 19.76 + -155.39 + 0 + 0 + + + + UPP + 0 + UPOLU_POINT + HI + US + 20.20 + -155.84 + 0 + 0 + + + + ITO + 0 + HILO + HI + US + 19.72 + -155.01 + 0 + 0 + + + + HNL + 0 + HONOLULU + HI + US + 21.33 + -157.93 + 0 + 0 + + + + OGG + 0 + MAUI + HI + US + 20.91 + -156.42 + 0 + 0 + + + + NDB + 0 + VALLEY_ISLAND + HI + US + 20.88 + -156.44 + 0 + 0 + + + + MUE + 0 + KAMUELA + HI + US + 20.00 + -155.67 + 0 + 0 + + + + NGF + 0 + KANEOHE_BAY + HI + US + 21.45 + -157.76 + 0 + 0 + + + + MKK + 0 + MOLOKAI + HI + US + 21.14 + -157.17 + 0 + 0 + + + + NBS + 0 + BARKING_SANDS + HI + US + 22.04 + -159.79 + 0 + 0 + + + + CKH + 0 + KOKO_HEAD + HI + US + 21.27 + -157.70 + 0 + 0 + + + + IAI + 0 + KONA + HI + US + 19.65 + -156.02 + 0 + 0 + + + + LLD + 0 + LANAI + HI + US + 20.77 + -156.97 + 0 + 0 + + + + LNY + 0 + LANAI_CITY + HI + US + 20.76 + -156.97 + 0 + 0 + + + + LIH + 0 + LIHUE + HI + US + 21.97 + -159.34 + 0 + 0 + + + + SOK + 0 + SOUTH_KAUAI + HI + US + 21.90 + -159.53 + 0 + 0 + + + + RSW + 0 + LEE_COUNTY + FL + US + 26.53 + -81.78 + 0 + 0 + + + + PZD + 0 + PECAN + GA + US + 31.66 + -84.29 + 0 + 0 + + + + IIU + 0 + LOUISVILLE + KY + US + 38.10 + -85.58 + 0 + 0 + + + + HRV + 0 + HARVEY + LA + US + 29.85 + -90.00 + 0 + 0 + + + + MCI + 0 + KANSAS_CITY + MO + US + 39.29 + -94.74 + 0 + 0 + + + + TTT + 0 + MAVERICK + TX + US + 32.87 + -97.04 + 0 + 0 + + + + CWK + 0 + CENTEX + TX + US + 30.38 + -97.53 + 0 + 0 + + + + CME + 0 + CHISUM + NM + US + 33.34 + -104.62 + 0 + 0 + + + + FTI + 0 + FT_UNION + NM + US + 35.66 + -105.14 + 0 + 0 + + + + RSK + 0 + RATTLESNAKE + NM + US + 36.75 + -108.10 + 0 + 0 + + + + HUH + 0 + WHATCOM + WA + US + 48.95 + -122.58 + 0 + 0 + + + + ASRF + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + AYPY + 940350 + PORT_MORESBY_INTL + + NG + -9.43 + 147.22 + 47 + 0 + + + + BGSF + 042310 + SONDRE_STROMFJORD + + GL + 67.00 + -50.80 + 53 + 0 + + + + BIRK + 040300 + REYKJAVIK + + IL + 64.13 + -21.90 + 61 + 0 + + + + CWEG + 999999 + ALBERTA_WEATHER_CENTRE + + CN + 53.50 + -113.50 + -9999 + 0 + + + + CWLW + 712030 + KELOWNA + BC + CN + 49.95 + -119.40 + 456 + 0 + + + + CWNT + 712500 + TURTLE_MOUNTAIN + AB + CN + 49.58 + -114.42 + 2164 + 0 + + + + CWTO + 716380 + TORONTO_A_E_S__HQ + ON + CN + 43.78 + -79.47 + 187 + 0 + + + + CWUL + 999999 + QUEBEC_FCST_OFFICE + + CN + 45.50 + -73.68 + -9999 + 0 + + + + CYQX + 718030 + GANDER_INTL_AIRPORT + NF + CN + 48.95 + -54.57 + 151 + 0 + + + + DTTA + 607150 + TUNIS/CARTHAGE + + TS + 36.83 + 10.23 + 4 + 0 + + + + EBBR + 064510 + BRUSSELS_NATIONAL + + BX + 50.90 + 4.53 + 58 + 0 + + + + EDMM + 108680 + MUENCHEN + + DL + 48.25 + 11.58 + 484 + 0 + + + + EDZB + 102380 + BERGEN/HOHNE + + DL + 52.82 + 9.93 + 70 + 0 + + + + EDZE + 104100 + ESSEN/MULHEIM + + DL + 51.40 + 6.97 + 161 + 0 + + + + EDZF + 106370 + FRANKFURT/MAIN + + DL + 50.05 + 8.58 + 112 + 0 + + + + EDZH + 107710 + GAERMERSDORF + + DL + 49.43 + 11.90 + 419 + 0 + + + + EDZM + 108680 + MUENCHEN + + DL + 48.25 + 11.58 + 484 + 0 + + + + EETN + 260380 + TALLIN + + BY + 59.35 + 24.80 + 44 + 0 + + + + EFHK + 029740 + HELSINKI/VANTAA + + FI + 60.32 + 24.97 + 56 + 0 + + + + EFRO + 028450 + ROVANIEMI(CIV/MIL) + + FI + 66.57 + 25.83 + 201 + 0 + + + + EGJJ + 038950 + JERSEY_AIRPORT + + UK + 49.22 + -2.20 + 84 + 0 + + + + EHAM + 062400 + AMSTERDAM/SCHIPHOL + + NL + 52.30 + 4.77 + -2 + 0 + + + + EHDB + 062600 + DE_BILT + + NL + 52.10 + 5.18 + 4 + 0 + + + + EINN + 039620 + SHANNON_AIRPORT + + IE + 52.70 + -8.92 + 20 + 0 + + + + EKCH + 061800 + COPENHAGEN/KASTRUP + + DN + 55.63 + 12.67 + 5 + 0 + + + + ENMI + 999999 + OSLO + + NO + 59.50 + 10.70 + -9999 + 0 + + + + ENVN + 011520 + BODO + + NO + 67.25 + 14.40 + 8 + 0 + + + + ENVV + 014150 + STAVANGER + + NO + 58.87 + 5.67 + 34 + 0 + + + + EPWA + 123750 + WARSAW/OKECIE + + PL + 52.17 + 20.97 + 107 + 0 + + + + ESNN + 023660 + SUNDSVALL/HARNOSAND + + SN + 62.53 + 17.45 + 10 + 0 + + + + ESSA + 024600 + STOCKHOLM/ARLANDA + + SN + 59.65 + 17.95 + 61 + 0 + + + + EVRA + 999999 + RIGA_AIRPORT + LE + BY + 56.92 + 23.97 + 10 + 0 + + + + EYVI + 267300 + VILNIUS_INTL + MI + BY + 54.63 + 25.28 + 156 + 0 + + + + FAJS + 683680 + JAN_SMUTS + + ZA + -26.13 + 28.23 + 1700 + 0 + + + + FCBB + 644500 + BRAZZAVILLE/MAYA-MA + + CG + -4.25 + 15.25 + 316 + 0 + + + + FTTJ + 647000 + NDJAMENA(CIV/MIL) + + CD + 12.13 + 15.03 + 295 + 0 + + + + GCGC + 999999 + CANARY_ISLANDS + + CR + 28.50 + -16.00 + -9999 + 0 + + + + GMMC + 601550 + CASABLANCA + + MC + 33.57 + -7.67 + 62 + 0 + + + + HECA + 623660 + CAIRO_INTL_AIRPORT + + EG + 30.13 + 31.40 + 74 + 0 + + + + LBSF + 156140 + SOFIA + + BU + 42.65 + 23.38 + 595 + 0 + + + + LBWN + 155520 + VARNA + + BU + 43.20 + 27.92 + 43 + 0 + + + + LCLK + 176090 + LARNACA/LARNAX_ARPT + + CY + 34.88 + 33.63 + 2 + 0 + + + + LDZA + 131310 + ZAGREB/PLESO + + RH + 45.73 + 16.07 + 107 + 0 + + + + LDZO + 999999 + ZAGREB/PLESO + + RH + 45.73 + 16.07 + 107 + 0 + + + + LECB + 081810 + BARCELONA + + SP + 41.28 + 2.07 + 6 + 0 + + + + LEMM + 999999 + MADRID_CNM + + SP + 40.12 + -3.53 + -9999 + 0 + + + + LFBD + 075100 + BORDEAUX/MERIGNAC + + FR + 44.83 + -.70 + 61 + 0 + + + + LFMM + 076500 + MARSEILLE + + FR + 43.45 + 5.22 + 20 + 0 + + + + LFPW + 999999 + PARIS_MET_CENTER + + FR + 48.83 + 2.33 + 75 + 0 + + + + LFRN + 071300 + RENNES/ST.JACQUES + + FR + 48.07 + -1.73 + 37 + 0 + + + + LFST + 071900 + STRASBOURG/ENTZHEIM + + FR + 48.55 + 7.63 + 154 + 0 + + + + LGAT + 167160 + ATHENS/HELLENKION + + GR + 37.90 + 23.73 + 15 + 0 + + + + LHBP + 128390 + BUDAPEST/FERIHEGY + + HU + 47.43 + 19.27 + 185 + 0 + + + + LIMM + 160800 + MILANO/LINATE + + IY + 45.43 + 9.27 + 103 + 0 + + + + LJLJ + 130140 + LJUBLJANA/BRNIK + + LJ + 46.22 + 14.48 + 385 + 0 + + + + LKPR + 115180 + PRAGUE/RUZYNE + + CZ + 50.10 + 14.28 + 365 + 0 + + + + LLBG + 401800 + BEN-GURION(CIV/MIL) + + IS + 32.00 + 34.90 + 49 + 0 + + + + LMML + 165970 + LUQA/MALTA + + ML + 35.85 + 14.48 + 91 + 0 + + + + LOWW + 110360 + VIENNA/SCHWECHAT + + OS + 48.12 + 16.57 + 190 + 0 + + + + LPPT + 085360 + LISBON/PORTELA + + PO + 38.78 + -9.13 + 123 + 0 + + + + LROM + 154210 + BUCHAREST/OTOPENI + + RO + 44.55 + 26.10 + 95 + 0 + + + + LROP + 154210 + BUCHAREST/OTOPENI + + RO + 44.55 + 26.10 + 95 + 0 + + + + LSZH + 066700 + ZURICH-KLOTEN_(AUT) + + SW + 47.48 + 8.53 + 432 + 0 + + + + LTAC + 171280 + ANKARA/ESENBOGA + + TU + 40.11 + 32.97 + 949 + 0 + + + + LTBA + 170600 + ISTANBUL/ATATURK_AB + + TU + 40.97 + 28.82 + 37 + 0 + + + + LUKK + 338387 + KISHINAU + + UR + 46.93 + 28.93 + 122 + 0 + + + + LWSK + 135860 + SKOPJE/PETROVAC + + MK + 41.97 + 21.65 + 239 + 0 + + + + LYBE + 132720 + BELGRADE/SURCIN + + YG + 44.82 + 20.28 + 99 + 0 + + + + LZIB + 118160 + BRATISLAVA_IVANKA + + CZ + 48.20 + 17.20 + 130 + 0 + + + + NFFN + 916800 + NANDI/NADI_INTL + + FJ + -17.75 + 177.45 + 18 + 0 + + + + NZDT + 999999 + NEW_ZEALAND + + NZ + -41.00 + 172.50 + -9999 + 0 + + + + NZKL + 999999 + AUCKLAND + + NZ + -37.02 + 174.80 + 6 + 0 + + + + MHTG + 787200 + TEGUCIGALPA/TONCONT + + HO + 14.05 + -87.22 + 994 + 0 + + + + MPTO + 787920 + TOCUMEN/GEN._OMAR + + PM + 9.05 + -79.37 + 11 + 0 + + + + OBBB + 999999 + BAHRAIN_INTL_ARPT + + BN + 26.27 + 50.65 + 2 + 0 + + + + OBBI + 411500 + BAHRAIN_INTL_ARPT + + BN + 26.27 + 50.65 + 2 + 0 + + + + OEJD + 999999 + JEDDAH + + SD + 21.30 + 39.20 + -9999 + 0 + + + + OEJN + 410240 + JEDDAH/KING_ABD + + SD + 21.67 + 39.15 + 12 + 0 + + + + OIII + 407540 + TEHRAN/MEHRABAD_AFB + + IR + 35.68 + 51.35 + 1191 + 0 + + + + OIIX + 999999 + TEHRAN + + IR + 35.68 + 51.35 + 1191 + 0 + + + + OLBA + 401000 + BEIRUT_(CIV/MIL) + + LB + 33.82 + 35.48 + 19 + 0 + + + + OPKC + 417800 + KARACHI_INTL_ARPT + + PK + 24.90 + 67.13 + 22 + 0 + + + + OPLA + 416410 + LAHORE(CIV/MIL) + + PK + 31.52 + 74.40 + 217 + 0 + + + + OYSN + 413440 + SANA'A + + YE + 15.52 + 44.18 + 2190 + 0 + + + + PAFA + 702610 + FAIRBANKS_INTL_ARPT_(ASOS) + AK + US + 64.82 + -147.87 + 138 + 0 + + + + PAJN + 703810 + JUNEAU_INTL_AIRPORT_(ASOS) + AK + US + 58.37 + -134.58 + 7 + 0 + + + + PANC + 702730 + ANCHORAGE_INTL_ARPT_(ASOS) + AK + US + 61.17 + -150.02 + 40 + 0 + + + + RKSI + 470699 + CHAJANG_NI_(K-ARMY) + + KO + 37.87 + 127.18 + 100 + 0 + + + + RCTP + 466860 + TAIPEI/CHIANG_KAI_SHEK + + TW + 25.08 + 121.22 + 33 + 0 + + + + SABE + 875820 + AEROPARQUE(CIV/MIL) + + AG + -34.57 + -58.42 + 6 + 0 + + + + SACO + 873440 + CORDOBA_AIRPORT + + AG + -31.32 + -64.22 + 474 + 0 + + + + SAEZ + 875760 + BUENOS_AIRES/EZEIZA + + AG + -34.82 + -58.53 + 20 + 0 + + + + SAME + 874180 + MENDOZA/EL_PLUMERIL + + AG + -32.83 + -68.78 + 704 + 0 + + + + SARE + 871550 + RESISTENCIA_AIRPORT + + AG + -27.45 + -59.05 + 52 + 0 + + + + SBBE + 821930 + BELEM/VAL_DE_CAES + + BZ + -1.38 + -48.48 + 16 + 0 + + + + SBBR + 833780 + BRASILIA_(CIV/MIL) + + BZ + -15.87 + -47.93 + 1061 + 0 + + + + SBBS + 833780 + BRASILIA + + BZ + -15.87 + -47.93 + 1061 + 0 + + + + SBCT + 838400 + CURITIBA/AFONSO_PEN + + BZ + -25.52 + -49.17 + 908 + 0 + + + + SBCW + 838400 + CURITIBA/AFONSO_PEN + + BZ + -25.52 + -49.17 + 908 + 0 + + + + SBEG + 821110 + EDUARDO_GOMES_INTL + + BZ + -3.03 + -60.05 + 2 + 0 + + + + SBGL + 837460 + GALEAO/RIO(CIV/MIL) + + BZ + -22.82 + -43.25 + 6 + 0 + + + + SBGR + 837753 + GUARULHOS_(CIV/MIL) + + BZ + -23.43 + -46.47 + 750 + 0 + + + + SBRF + 828990 + RECIFE/GUARARAPES + + BZ + -8.07 + -34.85 + 19 + 0 + + + + SCCI + 859340 + PUNTA_ARENAS/PRES_C + + CH + -53.00 + -70.85 + 37 + 0 + + + + SCEL + 855740 + PUDAHUEL/ARTURO_MER + + CH + -33.38 + -70.78 + 476 + 0 + + + + SCFA + 854420 + ANTOFAGASTA/CERRO + + CH + -23.43 + -70.43 + 120 + 0 + + + + SCTE + 857990 + PUERTO_MONTT/TEPUAL + + CH + -41.42 + -73.08 + 86 + 0 + + + + SLLP + 852010 + LA_PAZ/JFK_INTL + + BO + -16.52 + -68.18 + 4014 + 0 + + + + SOCA + 814050 + CAYENNE/ROCHAMBEAU + + FG + 4.83 + -52.37 + 9 + 0 + + + + SPIM + 846280 + LIMA/JORGE_CHAVEZ + + PR + -12.00 + -77.12 + 13 + 0 + + + + TNCC + 789880 + HATO_ARPT_(CIV/MIL) + + NU + 12.20 + -68.97 + 67 + 0 + + + + TTPP + 789700 + PIARCO_INTL_AIRPORT + + TD + 10.62 + -61.35 + 15 + 0 + + + + UAAA + 368700 + ALMA-ATA + AL + RA + 43.23 + 76.93 + 847 + 0 + + + + UAFM + 835300 + FRUNZE + + RA + 42.85 + 74.53 + 760 + 0 + + + + UATT + 352290 + AKTJUBINSK + AL + KZ + 50.30 + 57.23 + 227 + 0 + + + + UBBB + 378640 + BAKU/BINE_ARPT + TB + AJ + 40.45 + 50.07 + -1 + 0 + + + + UGEE + 377890 + YEREVAN/ZAPADNY + TB + RS + 40.13 + 44.47 + 907 + 0 + + + + UGGG + 375490 + TBILISI/NOVO-AL + TB + RS + 41.68 + 44.95 + 490 + 0 + + + + UHBB + 315100 + BLAGOVESHCHENSK + HA + RA + 50.27 + 127.50 + 137 + 0 + + + + UHHH + 317350 + KHABAROVSK/NOVY + HA + RA + 48.52 + 135.16 + 72 + 0 + + + + UHNN + 999999 + NIKOLAEVSK-NA-AMURE_CENTER + HA + RA + 53.15 + 140.70 + 68 + 0 + + + + UHWW + 319600 + VLADIVOSTOK + HA + RA + 43.12 + 131.94 + 184 + 0 + + + + UHPP + 325400 + PETROPAVLOVSK-KAMCA + HA + RA + 52.97 + 158.75 + 24 + 0 + + + + UHSS + 321500 + JUZNO-SAHALINSK + HA + RA + 46.92 + 142.73 + 31 + 0 + + + + UIBB + 303090 + BRATSK + + RA + 56.07 + 101.83 + 489 + 0 + + + + UIII + 307100 + IRKUTSK + IR + RA + 52.27 + 104.35 + 513 + 0 + + + + UIKK + 302300 + KIRENSK + IR + RA + 57.77 + 108.07 + 258 + 0 + + + + UKBB + 333470 + BORISPOL'/KIEV + KV + UR + 50.33 + 30.97 + 119 + 0 + + + + UKFF + 339460 + SIMFEROPOL + + UR + 44.68 + 34.13 + 180 + 0 + + + + UKHH + 343000 + KHARKIV + KI + UR + 49.96 + 36.13 + 1550 + 0 + + + + UKLL + 333930 + LVOV + KI + UR + 49.82 + 23.95 + 325 + 0 + + + + UKOO + 338370 + ODESSA/TSENTRALNY + KI + UR + 46.43 + 30.77 + 35 + 0 + + + + ULAA + 225500 + ARHANGELSK + AR + RS + 64.53 + 40.47 + 13 + 0 + + + + ULLI + 260630 + ST.PETERSBURG(VOEJKOVO) + LE + RS + 59.95 + 30.70 + 78 + 0 + + + + ULLL + 260630 + ST.PETERSBURG + LE + RS + 59.95 + 30.70 + 78 + 0 + + + + ULWW + 270370 + VOLOGDA + AR + RS + 59.23 + 39.87 + 131 + 0 + + + + ULMM + 221130 + MURMANSK + AR + RS + 68.97 + 33.05 + 51 + 0 + + + + UMKK + 267020 + KALININGRAD + + BY + 54.70 + 20.62 + 27 + 0 + + + + UMMS + 268500 + MINSK + MI + BY + 53.87 + 27.53 + 234 + 0 + + + + UNBB + 298380 + BARNAUL + NO + RA + 53.40 + 83.70 + 252 + 0 + + + + UNIT + 245070 + TURA + NO + RA + 64.27 + 100.23 + 186 + 0 + + + + UNKB + 292820 + BOGUCHANY + NO + RA + 58.42 + 97.40 + 134 + 0 + + + + UNKL + 284935 + KRASNOYARSK + + RS + 56.18 + 92.52 + -9999 + 0 + + + + UNLL + 999999 + KOLPASHEVO + NO + RA + 58.30 + 82.90 + 76 + 0 + + + + UNNT + 296340 + NOVOSIBIRSK/TOLMACH + + RA + 55.03 + 82.90 + 177 + 0 + + + + UNOO + 286980 + OMSK + NO + RA + 54.93 + 73.40 + 123 + 0 + + + + UODD + 206740 + DIKSON_ISLAND + DK + RA + 73.53 + 80.40 + 47 + 0 + + + + UOHH + 208910 + KHATANGA + DK + RA + 71.98 + 102.47 + 24 + 0 + + + + UOTT + 234720 + TURUKHANSK + + RA + 65.78 + 087.95 + 37 + 0 + + + + URRV + 273290 + ROSTOV + MS + RS + 57.20 + 39.42 + 102 + 0 + + + + URWA + 999999 + ASTRAKHAN + + RS + 46.35 + 47.97 + -22 + 0 + + + + URWW + 345600 + VOLGOGRAD + TB + RS + 48.68 + 44.35 + 145 + 0 + + + + USCC + 286420 + CHELYABINSK/BALANDI + SV + RA + 55.18 + 61.32 + -9999 + 0 + + + + USDD + 999999 + SALEKHARD + NO + RA + 66.53 + 66.53 + 358 + 0 + + + + USDS + 235520 + TARKO-SALE + NO + RA + 64.92 + 77.82 + 27 + 0 + + + + USHB + 236310 + BEREZOVO + NO + RA + 63.93 + 65.05 + 27 + 0 + + + + USHH + 239330 + HANTY-MANSIJSK + NO + RA + 60.97 + 69.07 + 40 + 0 + + + + USKK + 999999 + KIROV + MS + RS + 58.60 + 49.63 + 158 + 0 + + + + USPP + 282250 + PERM + SV + RA + 58.02 + 56.30 + 172 + 0 + + + + USRR + 238490 + SURGUT + NO + RA + 61.25 + 73.50 + 44 + 0 + + + + USSS + 284400 + SVERDLOVSK + SV + RA + 56.80 + 60.63 + 237 + 0 + + + + USUU + 286610 + KURGAN + SV + RA + 55.47 + 65.40 + 79 + 0 + + + + UTAA + 388800 + ASHABAD + TA + RA + 37.97 + 58.33 + 210 + 0 + + + + UTTT + 384570 + TASHKENT/YUZNI + TA + RA + 41.27 + 69.27 + 489 + 0 + + + + UUWW + 275185 + MOSCOW/VNUKOVO + MS + RS + 55.65 + 37.27 + 203 + 0 + + + + UUYP + 234180 + PECHORA + AR + RS + 65.11 + 57.10 + 61 + 0 + + + + UUYW + 232260 + VORKUTA + AR + RA + 67.48 + 64.02 + 180 + 0 + + + + UUYY + 238040 + SYKTYVKAR + AR + RA + 61.72 + 50.83 + 119 + 0 + + + + UWKD + 275950 + KAZAN' + MS + RS + 55.78 + 49.18 + 116 + 0 + + + + UWUU + 287220 + UFA + SV + RA + 54.75 + 56.00 + 105 + 0 + + + + VABB + 430030 + BOMBAY/SANTA_CR + + IN + 19.12 + 72.84 + 14 + 0 + + + + VCBI + 434500 + COLOMBO/KATUNAYAKE + + SB + 7.17 + 79.88 + 8 + 0 + + + + VGZR + 419220 + KURMITOLA/ZIA_INTL + + BW + 23.85 + 90.40 + 10 + 0 + + + + VHHH + 450070 + HONG_KONG_INTL_ARPT + + HK + 22.33 + 114.18 + 24 + 0 + + + + VIDP + 421810 + INDIRA_GANDHI/DELHI + + IN + 28.57 + 77.12 + 233 + 0 + + + + WSSS + 486980 + SINGAPORE/CHANG + + SR + 1.37 + 103.98 + 16 + 0 + + + + YBRF + 945780 + BRISBANE + QU + AU + -27.43 + 153.08 + 2 + 0 + + + + YBTL + 942940 + TOWNSVILLE(CIV/MIL) + QU + AU + -19.25 + 146.75 + 6 + 0 + + + + YMHF + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + YMMB + 948700 + MOORABBIN_AIRPORT + VC + AU + -37.98 + 145.10 + 13 + 0 + + + + YMMC + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + YMRF + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + YPDM + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + YPRF + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + YPRM + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + YSRF + 948640 + MELBOURNE + VC + AU + -37.73 + 144.90 + 81 + 0 + + + + ZPPP + 567780 + KUNMING/WUJIABA + CD + CI + 25.02 + 102.68 + 1892 + 0 + + + diff --git a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/zones.xml b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/zones.xml old mode 100644 new mode 100755 index 662ba89deb..fb26a34d6f --- a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/zones.xml +++ b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/zones.xml @@ -1,47189 +1,47189 @@ - - - - - AKZ187 - 21870 - Central_Aleutians - AK - US - 52.22 - -174.23 - 0 - 0 - AFC - - - AKZ213 - 22130 - St_Lawrence_I_and_Bering_St_Cst - AK - US - 63.36 - -170.27 - 0 - 0 - AFG - - - AKZ195 - 21950 - Pribilof_Islands - AK - US - 57.18 - -170.26 - 0 - 0 - AFC - - - AKZ185 - 21850 - Eastern_Aleutians - AK - US - 53.63 - -166.66 - 0 - 0 - AFC - - - AKZ207 - 22070 - Chukchi_Sea_Coast - AK - US - 67.98 - -165.11 - 0 - 0 - AFG - - - AKZ211 - 22110 - Southern_Seward_Peninsula_Coast - AK - US - 64.58 - -164.56 - 0 - 0 - AFG - - - AKZ214 - 22140 - Yukon_Delta - AK - US - 62.24 - -164.37 - 0 - 0 - AFG - - - AKZ155 - 21550 - Kuskokwim_Delta - AK - US - 60.18 - -163.61 - 0 - 0 - AFC - - - AKZ208 - 22080 - Lower_Kobuk_and_Noatak_Valleys - AK - US - 67.77 - -162.75 - 0 - 0 - AFG - - - AKZ210 - 22100 - Nrn_and_Interior_Seward_Penin - AK - US - 65.40 - -162.41 - 0 - 0 - AFG - - - AKZ201 - 22010 - Western_Arctic_Coast - AK - US - 69.84 - -161.53 - 0 - 0 - AFG - - - AKZ181 - 21810 - Alaska_Peninsula - AK - US - 55.82 - -161.44 - 0 - 0 - AFC - - - AKZ209 - 22090 - Baldwin_Penin_and_Selawik_Vly - AK - US - 66.69 - -161.06 - 0 - 0 - AFG - - - AKZ212 - 22120 - Ern_Norton_Snd_and_Nulato_Hills - AK - US - 63.74 - -160.39 - 0 - 0 - AFG - - - HIZ001 - 110010 - Niihau - HI - US - 21.89 - -160.15 - 0 - 0 - HFO - - - AKZ215 - 22150 - Lower_Yukon_Valley - AK - US - 62.56 - -159.94 - 0 - 0 - AFG - - - HIZ003 - 110030 - Kauai_Leeward - HI - US - 22.02 - -159.67 - 0 - 0 - HFO - - - HIZ004 - 110040 - Kauai_Mountains - HI - US - 22.07 - -159.54 - 0 - 0 - HFO - - - HIZ002 - 110020 - Kauai_Windward - HI - US - 22.05 - -159.40 - 0 - 0 - HFO - - - AKZ205 - 22050 - Northwestern_Brooks_Range - AK - US - 69.06 - -158.44 - 0 - 0 - AFG - - - HIZ006 - 110060 - Waianae_Coast - HI - US - 21.48 - -158.21 - 0 - 0 - HFO - - - HIZ011 - 110110 - Waianae_Mountains - HI - US - 21.46 - -158.10 - 0 - 0 - HFO - - - HIZ007 - 110070 - Oahu_North_Shore - HI - US - 21.59 - -158.08 - 0 - 0 - HFO - - - HIZ005 - 110050 - Oahu_South_Shore - HI - US - 21.33 - -158.05 - 0 - 0 - HFO - - - HIZ010 - 110100 - Central_Oahu - HI - US - 21.50 - -158.01 - 0 - 0 - HFO - - - HIZ008 - 110080 - Oahu_Koolau - HI - US - 21.50 - -157.89 - 0 - 0 - HFO - - - HIZ009 - 110090 - Olomana - HI - US - 21.39 - -157.73 - 0 - 0 - HFO - - - HIZ013 - 110130 - Molokai_Leeward - HI - US - 21.14 - -157.09 - 0 - 0 - HFO - - - AKZ217 - 22170 - Upper_Kobuk_and_Noatak_Valleys - AK - US - 67.41 - -156.95 - 0 - 0 - AFG - - - HIZ015 - 110150 - Lanai_Mauka - HI - US - 20.82 - -156.92 - 0 - 0 - HFO - - - HIZ012 - 110120 - Molokai_Windward - HI - US - 21.14 - -156.85 - 0 - 0 - HFO - - - HIZ014 - 110140 - Lanai_Makai - HI - US - 20.83 - -156.84 - 0 - 0 - HFO - - - HIZ018 - 110180 - Maui_Leeward_West - HI - US - 20.89 - -156.67 - 0 - 0 - HFO - - - HIZ016 - 110160 - Kahoolawe - HI - US - 20.56 - -156.62 - 0 - 0 - HFO - - - AKZ216 - 22160 - Lwr_Koyukuk_and_Middle_Yukon_Vly - AK - US - 64.44 - -156.58 - 0 - 0 - AFG - - - HIZ017 - 110170 - Maui_Windward_West - HI - US - 20.92 - -156.58 - 0 - 0 - HFO - - - HIZ019 - 110190 - Maui_Central_Valley - HI - US - 20.85 - -156.45 - 0 - 0 - HFO - - - HIZ021 - 110210 - Leeward_Haleakala - HI - US - 20.72 - -156.31 - 0 - 0 - HFO - - - HIZ022 - 110220 - Haleakala_Summit - HI - US - 20.72 - -156.23 - 0 - 0 - HFO - - - HIZ020 - 110200 - Windward_Haleakala - HI - US - 20.80 - -156.18 - 0 - 0 - HFO - - - AKZ151 - 21510 - Kuskokwim_Valley - AK - US - 62.26 - -156.04 - 0 - 0 - AFC - - - HIZ023 - 110230 - Kona - HI - US - 19.45 - -155.86 - 0 - 0 - HFO - - - HIZ026 - 110260 - Kohala - HI - US - 20.02 - -155.74 - 0 - 0 - HFO - - - AKZ161 - 21610 - Bristol_Bay - AK - US - 58.67 - -155.70 - 0 - 0 - AFC - - - HIZ027 - 110270 - Big_Island_Interior - HI - US - 19.56 - -155.61 - 0 - 0 - HFO - - - HIZ028 - 110280 - Big_Island_Summit - HI - US - 19.44 - -155.58 - 0 - 0 - HFO - - - HIZ024 - 110240 - South_Big_Island - HI - US - 19.19 - -155.42 - 0 - 0 - HFO - - - AKZ202 - 22020 - Northern_Arctic_Coast - AK - US - 70.78 - -155.25 - 0 - 0 - AFG - - - HIZ025 - 110250 - Big_Island_North_and_East - HI - US - 19.81 - -155.19 - 0 - 0 - HFO - - - AKZ171 - 21710 - Kodiak_Island - AK - US - 58.65 - -154.17 - 0 - 0 - AFC - - - AKZ219 - 22190 - Upper_Koyukuk_Valley - AK - US - 66.28 - -152.42 - 0 - 0 - AFG - - - AKZ221 - 22210 - Central_Interior - AK - US - 64.61 - -151.55 - 0 - 0 - AFG - - - AKZ145 - 21450 - Susitna_Valley - AK - US - 61.95 - -150.71 - 0 - 0 - AFC - - - AKZ121 - 21210 - Western_Kenai_Peninsula - AK - US - 60.12 - -150.69 - 0 - 0 - AFC - - - AKZ225 - 22250 - Denali - AK - US - 63.51 - -150.21 - 0 - 0 - AFG - - - AKZ101 - 21010 - Anchorage - AK - US - 61.20 - -149.71 - 0 - 0 - AFC - - - AKZ203 - 22030 - Central_Beaufort_Sea_Coast - AK - US - 70.34 - -149.66 - 0 - 0 - AFG - - - AKZ111 - 21110 - Matanuska_Valley - AK - US - 61.60 - -149.43 - 0 - 0 - AFC - - - AKZ125 - 21250 - Western_Prince_William_Sound - AK - US - 60.28 - -149.43 - 0 - 0 - AFC - - - AKZ218 - 22180 - Southeastern_Brooks_Range - AK - US - 67.94 - -147.78 - 0 - 0 - AFG - - - AKZ206 - 22060 - Northeastern_Brooks_Range - AK - US - 68.97 - -147.55 - 0 - 0 - AFG - - - AKZ222 - 22220 - Middle_Tanana_Valley - AK - US - 64.97 - -147.45 - 0 - 0 - AFG - - - AKZ223 - 22230 - Deltana_and_Tanana_Flats - AK - US - 64.13 - -146.62 - 0 - 0 - AFG - - - AKZ131 - 21310 - Northeast_Prince_William_Sound - AK - US - 61.14 - -146.39 - 0 - 0 - AFC - - - AKZ220 - 22200 - Yukon_Flats_and_Surrounding_Upla - AK - US - 66.46 - -146.25 - 0 - 0 - AFG - - - AKZ135 - 21350 - Southeast_Prince_William_Sound - AK - US - 60.65 - -145.32 - 0 - 0 - AFC - - - AKZ141 - 21410 - Copper_River_Basin - AK - US - 61.88 - -144.85 - 0 - 0 - AFC - - - AKZ204 - 22040 - Eastern_Beaufort_Sea_Coast - AK - US - 69.85 - -143.75 - 0 - 0 - AFG - - - AKZ224 - 22240 - Upr_Tanana_Vly_and_the_Ftymile_C - AK - US - 64.21 - -143.50 - 0 - 0 - AFG - - - AKZ226 - 22260 - Eastern_Alaska_Range - AK - US - 62.77 - -142.76 - 0 - 0 - AFG - - - AKZ017 - 20170 - C_Fairweather_to_C_Suckling_Csta - AK - US - 59.74 - -140.70 - 0 - 0 - AJK - - - AKZ022 - 20220 - Salisbury_Snd_to_C_Fairweather_C - AK - US - 58.68 - -137.66 - 0 - 0 - AJK - - - AKZ020 - 20200 - Glacier_Bay - AK - US - 58.79 - -136.99 - 0 - 0 - AJK - - - AKZ021 - 20210 - Eastern_Chichagof_Island - AK - US - 57.88 - -135.51 - 0 - 0 - AJK - - - AKZ019 - 20190 - Haines_Borough_and_Lynn_Canal - AK - US - 58.95 - -135.41 - 0 - 0 - AJK - - - AKZ018 - 20180 - Taiya_Inlet_and_Klondike_Hiway - AK - US - 59.57 - -135.35 - 0 - 0 - AJK - - - AKZ023 - 20230 - C_Decision_to_Salisbury_Snd_Csta - AK - US - 56.85 - -135.25 - 0 - 0 - AJK - - - AKZ024 - 20240 - Ern_Baranof_I_and_Srn_Admty_I - AK - US - 57.31 - -134.27 - 0 - 0 - AJK - - - AKZ025 - 20250 - Juneau_Borough_and_Nrn_Admty_I - AK - US - 58.08 - -133.64 - 0 - 0 - AJK - - - AKZ027 - 20270 - Dixon_Entr_to_C_Decision_Cstal_A - AK - US - 55.36 - -133.19 - 0 - 0 - AJK - - - AKZ026 - 20260 - Inr_Chnls_fr_Kupreanof_I_to_Etol - AK - US - 56.53 - -133.00 - 0 - 0 - AJK - - - AKZ028 - 20280 - Southern_Inner_Channels - AK - US - 55.71 - -132.71 - 0 - 0 - AJK - - - AKZ029 - 20290 - Misty_Fjords - AK - US - 55.67 - -130.98 - 0 - 0 - AJK - - - WAZ516 - 475160 - North_Coast - WA - US - 47.95 - -124.39 - 0 - 0 - SEW - - - ORZ022 - 370220 - Curry_County_Coast - OR - US - 42.35 - -124.27 - 0 - 0 - MFR - - - WAZ515 - 475150 - Western_Strait_of_Juan_De_Fuca - WA - US - 48.19 - -124.25 - 0 - 0 - SEW - - - ORZ021 - 370210 - South_Central_Oregon_Coast - OR - US - 43.28 - -124.24 - 0 - 0 - MFR - - - WAZ517 - 475170 - Central_Coast - WA - US - 47.16 - -124.06 - 0 - 0 - SEW - - - CAZ001 - 50010 - Redwood_Coast - CA - US - 41.02 - -124.03 - 0 - 0 - EKA - - - ORZ002 - 370020 - Central_Oregon_Coast - OR - US - 44.44 - -124.01 - 0 - 0 - PQR - - - ORZ001 - 370010 - North_Oregon_Coast - OR - US - 45.64 - -123.92 - 0 - 0 - PQR - - - ORZ024 - 370240 - Ern_Curry_Cnty_and_Josephine_Cnt - OR - US - 42.39 - -123.75 - 0 - 0 - MFR - - - CAZ003 - 50030 - North_Coast_Interior - CA - US - 40.99 - -123.72 - 0 - 0 - EKA - - - WAZ021 - 470210 - South_Washington_Coast - WA - US - 46.47 - -123.71 - 0 - 0 - PQR - - - CAZ002 - 50020 - Mendocino_Coast - CA - US - 39.40 - -123.64 - 0 - 0 - EKA - - - ORZ004 - 370040 - Ctrl_Coast_Range_of_Wrn_Oregon - OR - US - 44.42 - -123.62 - 0 - 0 - PQR - - - WAZ513 - 475130 - Olympics - WA - US - 47.71 - -123.61 - 0 - 0 - SEW - - - WAZ512 - 475120 - Lower_Chehalis_Valley_Area - WA - US - 47.09 - -123.52 - 0 - 0 - SEW - - - WAZ020 - 470200 - Willapa_Hills - WA - US - 46.52 - -123.51 - 0 - 0 - PQR - - - ORZ003 - 370030 - Coast_Range_of_Northwest_Oregon - OR - US - 45.59 - -123.40 - 0 - 0 - PQR - - - CAZ076 - 50760 - Mendocino_Interior - CA - US - 39.40 - -123.39 - 0 - 0 - EKA - - - ORZ023 - 370230 - Central_Douglas_County - OR - US - 43.32 - -123.35 - 0 - 0 - MFR - - - WAZ514 - 475140 - Eastern_Strait_of_Juan_de_Fuca - WA - US - 48.07 - -123.28 - 0 - 0 - SEW - - - CAZ080 - 50800 - Western_Siskiyou_County - CA - US - 41.49 - -123.13 - 0 - 0 - MFR - - - ORZ008 - 370080 - South__Willamette_Valley - OR - US - 44.32 - -123.11 - 0 - 0 - PQR - - - CAZ004 - 50040 - Upper_Trinity_River - CA - US - 40.44 - -123.07 - 0 - 0 - EKA - - - CAZ505 - 55050 - Cstal_N_Bay_Incl_Pt_Reyes_Natl_S - CA - US - 38.30 - -122.99 - 0 - 0 - MTR - - - WAZ001 - 470010 - San_Juan_County - WA - US - 48.60 - -122.99 - 0 - 0 - SEW - - - ORZ007 - 370070 - Central_Willamette_Valley - OR - US - 45.05 - -122.94 - 0 - 0 - PQR - - - WAZ511 - 475110 - Hood_Canal_Area - WA - US - 47.52 - -122.94 - 0 - 0 - SEW - - - WAZ022 - 470220 - Lwr_Columbia_and_I_-_5_Corridor_ - WA - US - 46.11 - -122.88 - 0 - 0 - PQR - - - ORZ005 - 370050 - Lower_Columbia - OR - US - 45.97 - -122.87 - 0 - 0 - PQR - - - WAZ504 - 475040 - Southwest_Interior - WA - US - 46.78 - -122.87 - 0 - 0 - SEW - - - ORZ026 - 370260 - Jackson_County - OR - US - 42.48 - -122.86 - 0 - 0 - MFR - - - ORZ006 - 370060 - Greater_Portland_Metro_Area - OR - US - 45.52 - -122.83 - 0 - 0 - PQR - - - CAZ506 - 55060 - North_Bay_Interior_Valleys - CA - US - 38.34 - -122.78 - 0 - 0 - MTR - - - ORZ012 - 370120 - Cascade_Foothills_in_Lane_Cnty - OR - US - 43.91 - -122.77 - 0 - 0 - PQR - - - ORZ025 - 370250 - Ern_Douglas_County_Foothills - OR - US - 43.18 - -122.75 - 0 - 0 - MFR - - - CAZ063 - 50630 - Mtns_SWrn_Shasta_Cnty_to_Nrn_L_C - CA - US - 39.91 - -122.73 - 0 - 0 - STO - - - CAZ064 - 50640 - Clear_Lake/Southern_Lake_County - CA - US - 38.96 - -122.67 - 0 - 0 - STO - - - CAZ081 - 50810 - Central_Siskiyou_County - CA - US - 41.68 - -122.60 - 0 - 0 - MFR - - - WAZ503 - 475030 - Western_Whatcom_County - WA - US - 48.82 - -122.59 - 0 - 0 - SEW - - - WAZ039 - 470390 - Greater_Vancouver_Area - WA - US - 45.73 - -122.54 - 0 - 0 - PQR - - - ORZ010 - 370100 - Nrn_Oregon_Cascade_Foothills - OR - US - 44.86 - -122.52 - 0 - 0 - PQR - - - WAZ509 - 475090 - Tacoma_Area - WA - US - 47.17 - -122.52 - 0 - 0 - SEW - - - WAZ510 - 475100 - Admiralty_Inlet_Area - WA - US - 48.15 - -122.50 - 0 - 0 - SEW - - - WAZ040 - 470400 - S_Washington_Cascade_Foothills - WA - US - 46.00 - -122.48 - 0 - 0 - PQR - - - CAZ006 - 50060 - San_Francisco - CA - US - 37.75 - -122.42 - 0 - 0 - MTR - - - WAZ506 - 475060 - Western_Skagit_County - WA - US - 48.47 - -122.42 - 0 - 0 - SEW - - - CAZ509 - 55090 - San_Francisco_Peninsula_Coast - CA - US - 37.36 - -122.38 - 0 - 0 - MTR - - - WAZ508 - 475080 - Seattle/Bremerton_Area - WA - US - 47.51 - -122.29 - 0 - 0 - SEW - - - CAZ507 - 55070 - North_Bay_Mountains - CA - US - 38.54 - -122.27 - 0 - 0 - MTR - - - CAZ015 - 50150 - Northern_Sacramento_Valley - CA - US - 40.26 - -122.25 - 0 - 0 - STO - - - ORZ013 - 370130 - Cascades_in_Lane_County - OR - US - 43.84 - -122.25 - 0 - 0 - PQR - - - ORZ028 - 370280 - Siskiyou_Mtns_and_Srn_Oregon_Cas - OR - US - 42.41 - -122.24 - 0 - 0 - MFR - - - CAZ013 - 50130 - Shasta_L_Area_/_Nrn_Shasta_Cnty - CA - US - 40.87 - -122.21 - 0 - 0 - STO - - - ORZ027 - 370270 - South_Central_Oregon_Cascades - OR - US - 43.21 - -122.21 - 0 - 0 - MFR - - - CAZ082 - 50820 - South_Central_Siskiyou_County - CA - US - 41.30 - -122.14 - 0 - 0 - MFR - - - WAZ507 - 475070 - Everett_and_Vicinity - WA - US - 48.03 - -122.14 - 0 - 0 - SEW - - - CAZ508 - 55080 - San_Francisco_Bay_Shoreline - CA - US - 37.64 - -122.08 - 0 - 0 - MTR - - - WAZ505 - 475050 - East_Puget_Sound_Lowlands - WA - US - 47.53 - -122.05 - 0 - 0 - SEW - - - WAZ019 - 470190 - South_Washington_Cascades - WA - US - 46.00 - -122.04 - 0 - 0 - PQR - - - CAZ512 - 55120 - Santa_Cruz_Mountains - CA - US - 37.20 - -121.98 - 0 - 0 - MTR - - - CAZ510 - 55100 - East_Bay_Interior_Valleys - CA - US - 37.82 - -121.97 - 0 - 0 - MTR - - - ORZ009 - 370090 - Western_Columbia_River_Gorge - OR - US - 45.61 - -121.96 - 0 - 0 - PQR - - - ORZ011 - 370110 - Northern_Oregon_Cascades - OR - US - 44.93 - -121.94 - 0 - 0 - PQR - - - WAZ023 - 470230 - Western_Columbia_River_Gorge - WA - US - 45.66 - -121.92 - 0 - 0 - PQR - - - CAZ016 - 50160 - Central_Sacramento_Valley - CA - US - 39.40 - -121.90 - 0 - 0 - STO - - - CAZ083 - 50830 - N_Ctrl_and_SE_Siskiyou_County - CA - US - 41.59 - -121.90 - 0 - 0 - MFR - - - CAZ530 - 55300 - Srn_Monterey_Bay_and_Big_Sur_Cst - CA - US - 36.35 - -121.90 - 0 - 0 - MTR - - - WAZ519 - 475190 - W_Slopes_Ctrl_Cascades_and_Passe - WA - US - 47.08 - -121.89 - 0 - 0 - SEW - - - CAZ018 - 50180 - Carquinez_Strait_and_Delta - CA - US - 38.07 - -121.80 - 0 - 0 - STO - - - CAZ529 - 55290 - Northern_Monterey_Bay - CA - US - 36.96 - -121.79 - 0 - 0 - MTR - - - CAZ511 - 55110 - E_Bay_Hills_and_the_Diablo_Rng - CA - US - 37.48 - -121.73 - 0 - 0 - MTR - - - CAZ513 - 55130 - Santa_Clara_Vly_Incl_San_Jose - CA - US - 37.17 - -121.69 - 0 - 0 - MTR - - - CAZ066 - 50660 - NE_Foothills/Sacramento_Valley - CA - US - 40.13 - -121.65 - 0 - 0 - STO - - - CAZ017 - 50170 - Southern_Sacramento_Valley - CA - US - 38.64 - -121.63 - 0 - 0 - STO - - - CAZ084 - 50840 - NE_Siskiyou_and_NW_Modoc_Cnties - CA - US - 41.86 - -121.63 - 0 - 0 - MFR - - - ORZ029 - 370290 - Klamath_Basin - OR - US - 42.47 - -121.63 - 0 - 0 - MFR - - - ORZ014 - 370140 - Upper_Hood_River_Valley - OR - US - 45.56 - -121.58 - 0 - 0 - PQR - - - CAZ528 - 55280 - Nrn_Salinas_Vly/Hollister_Vly_an - CA - US - 36.67 - -121.56 - 0 - 0 - MTR - - - CAZ014 - 50140 - Burney_Basin_/_Ern_Shasta_Cnty - CA - US - 40.88 - -121.52 - 0 - 0 - STO - - - WAZ518 - 475180 - W_Slopes_Nrn_Cascades_and_Passes - WA - US - 48.39 - -121.49 - 0 - 0 - SEW - - - CAZ517 - 55170 - Sta_Lucia_Mtns_and_Los_Padres_Na - CA - US - 36.19 - -121.39 - 0 - 0 - MTR - - - CAZ068 - 50680 - Wrn_Plumas_County/Lassen_Park - CA - US - 40.22 - -121.32 - 0 - 0 - STO - - - ORZ030 - 370300 - Nrn_and_Ern_Klamath_Cnty_and_Wrn - OR - US - 42.80 - -121.24 - 0 - 0 - MFR - - - ORZ042 - 370420 - North_Central_Oregon - OR - US - 45.04 - -121.10 - 0 - 0 - PDT - - - CAZ516 - 55160 - Srn_Salinas_Vly/Arroyo_Seco_and_ - CA - US - 36.09 - -121.09 - 0 - 0 - MTR - - - WAZ024 - 470240 - East_Columbia_River_Gorge - WA - US - 45.70 - -121.06 - 0 - 0 - PDT - - - ORZ041 - 370410 - East_Columbia_River_Gorge - OR - US - 45.64 - -121.02 - 0 - 0 - PDT - - - WAZ501 - 475010 - E_Slopes_of_the_Ctrl_Cascades - WA - US - 47.05 - -120.96 - 0 - 0 - PDT - - - ORZ043 - 370430 - Central_Oregon - OR - US - 44.00 - -120.95 - 0 - 0 - PDT - - - CAZ019 - 50190 - Northern_San_Joaquin_Valley - CA - US - 37.76 - -120.93 - 0 - 0 - STO - - - CAZ518 - 55180 - Mtns_Of_Sn_Benito_Cnty_And_Int_M - CA - US - 36.39 - -120.89 - 0 - 0 - MTR - - - CAZ034 - 50340 - San_Luis_Obispo_Cnty_Ctrl_Coast - CA - US - 35.35 - -120.78 - 0 - 0 - LOX - - - WAZ502 - 475020 - East_Slopes_of_the_Srn_Cascades - WA - US - 46.10 - -120.78 - 0 - 0 - PDT - - - CAZ085 - 50850 - Modoc_County - CA - US - 41.58 - -120.74 - 0 - 0 - MFR - - - CAZ067 - 50670 - Motherlode - CA - US - 38.63 - -120.71 - 0 - 0 - STO - - - CAZ071 - 50710 - Lassen-Ern_Plumas-Ern_Sierra_Cnt - CA - US - 40.31 - -120.66 - 0 - 0 - REV - - - WAZ027 - 470270 - Yakima_Valley - WA - US - 46.43 - -120.45 - 0 - 0 - PDT - - - CAZ035 - 50350 - Santa_Barbara_County_Ctrl_Coast - CA - US - 34.72 - -120.41 - 0 - 0 - LOX - - - CAZ089 - 50890 - West-Central_San_Joaquin_Valley - CA - US - 36.62 - -120.39 - 0 - 0 - HNX - - - WAZ026 - 470260 - Kittitas_Valley - WA - US - 47.00 - -120.39 - 0 - 0 - PDT - - - WAZ042 - 470420 - East_Slopes_Northern_Cascades - WA - US - 48.13 - -120.38 - 0 - 0 - OTX - - - CAZ069 - 50690 - West_Slope_Nrn_Sierra_Nevada - CA - US - 38.76 - -120.37 - 0 - 0 - STO - - - CAZ037 - 50370 - San_Luis_Obispo_Cnty_Int_Vlys - CA - US - 35.41 - -120.31 - 0 - 0 - LOX - - - ORZ031 - 370310 - Central_and_Eastern_Lake_County - OR - US - 42.80 - -120.24 - 0 - 0 - MFR - - - ORZ506 - 375060 - Ochoco-John_Day_Highlands - OR - US - 44.34 - -120.20 - 0 - 0 - PDT - - - WAZ041 - 470410 - Wenatchee_Area - WA - US - 47.61 - -120.18 - 0 - 0 - OTX - - - CAZ051 - 50510 - San_Luis_Obispo_County_Mtns - CA - US - 35.16 - -120.17 - 0 - 0 - LOX - - - CAZ036 - 50360 - Santa_Ynez_Valley - CA - US - 34.72 - -120.14 - 0 - 0 - LOX - - - CAZ070 - 50700 - Surprise_Valley_California - CA - US - 41.58 - -120.11 - 0 - 0 - REV - - - CAZ090 - 50900 - East-Central_San_Joaquin_Valley - CA - US - 37.11 - -120.11 - 0 - 0 - HNX - - - ORZ504 - 375040 - Nrn_Wheeler_and_Srn_Gilliam_Cnti - OR - US - 45.01 - -120.10 - 0 - 0 - PDT - - - CAZ072 - 50720 - Greater_Lake_Tahoe_Area - CA - US - 38.89 - -119.96 - 0 - 0 - REV - - - CAZ039 - 50390 - Santa_Barbara_County_S_Coast - CA - US - 34.45 - -119.95 - 0 - 0 - LOX - - - NVZ002 - 280020 - Greater_Lake_Tahoe_Area - NV - US - 39.19 - -119.90 - 0 - 0 - REV - - - CAZ052 - 50520 - Santa_Barbara_County_Mountains - CA - US - 34.77 - -119.88 - 0 - 0 - LOX - - - CAZ091 - 50910 - Southwestern_San_Joaquin_Valley - CA - US - 35.75 - -119.78 - 0 - 0 - HNX - - - CAZ038 - 50380 - Cuyama_Valley - CA - US - 34.96 - -119.77 - 0 - 0 - LOX - - - NVZ005 - 280050 - Northern_Washoe_County - NV - US - 41.01 - -119.65 - 0 - 0 - REV - - - ORZ044 - 370440 - Lower_Columbia_Basin - OR - US - 45.60 - -119.65 - 0 - 0 - PDT - - - WAZ044 - 470440 - Waterville_Plateau - WA - US - 47.68 - -119.65 - 0 - 0 - OTX - - - CAZ093 - 50930 - Mariposa_Madera_and_Fresno_Cnty_ - CA - US - 37.24 - -119.64 - 0 - 0 - HNX - - - NVZ003 - 280030 - Gter_Reno-Carson_Cty-Minden_Area - NV - US - 39.36 - -119.63 - 0 - 0 - REV - - - ORZ505 - 375050 - John_Day_Basin - OR - US - 44.63 - -119.49 - 0 - 0 - PDT - - - WAZ034 - 470340 - Moses_Lake_Area - WA - US - 47.03 - -119.48 - 0 - 0 - OTX - - - WAZ043 - 470430 - Okanogan_Valley - WA - US - 48.47 - -119.47 - 0 - 0 - OTX - - - WAZ028 - 470280 - Lower_Columbia_Basin - WA - US - 46.21 - -119.43 - 0 - 0 - PDT - - - CAZ044 - 50440 - Ventura_County_Interior_Valleys - CA - US - 34.44 - -119.25 - 0 - 0 - LOX - - - CAZ040 - 50400 - Ventura_County_Coast - CA - US - 34.22 - -119.19 - 0 - 0 - LOX - - - CAZ092 - 50920 - Southeastern_San_Joaquin_Valley - CA - US - 35.82 - -119.14 - 0 - 0 - HNX - - - CAZ096 - 50960 - Sierra_NV_fr_Yosemite_to_Kings_C - CA - US - 37.43 - -119.12 - 0 - 0 - HNX - - - CAZ053 - 50530 - Ventura_County_Mountains - CA - US - 34.65 - -119.10 - 0 - 0 - LOX - - - ORZ501 - 375010 - Foothills_of_the_Blue_Mountains - OR - US - 45.53 - -119.07 - 0 - 0 - PDT - - - ORZ061 - 370610 - Harney_County - OR - US - 43.01 - -119.06 - 0 - 0 - BOI - - - CAZ094 - 50940 - Tulare_County_Foothills - CA - US - 36.23 - -118.96 - 0 - 0 - HNX - - - WAZ035 - 470350 - Upper_Columbia_Basin - WA - US - 47.41 - -118.91 - 0 - 0 - OTX - - - ORZ503 - 375030 - Southern_Blue_Mtns_of_Oregon - OR - US - 45.23 - -118.88 - 0 - 0 - PDT - - - CAZ045 - 50450 - Ventura_County_Coastal_Valleys - CA - US - 34.23 - -118.87 - 0 - 0 - LOX - - - WAZ038 - 470380 - Okanogan_Highlands - WA - US - 48.42 - -118.75 - 0 - 0 - OTX - - - CAZ073 - 50730 - Mono - CA - US - 38.08 - -118.74 - 0 - 0 - REV - - - CAZ095 - 50950 - Kern_County_Mountains - CA - US - 35.30 - -118.71 - 0 - 0 - HNX - - - CAZ046 - 50460 - Santa_Monica_Mtns_Recnl_Area - CA - US - 34.09 - -118.58 - 0 - 0 - LOX - - - CAZ088 - 50880 - Santa_Clarita_Valley - CA - US - 34.46 - -118.55 - 0 - 0 - LOX - - - NVZ001 - 280010 - Mineral_and_Srn_Lyon_Counties - NV - US - 38.56 - -118.55 - 0 - 0 - REV - - - NVZ004 - 280040 - Wrn_NV_Bsn_and_Rng_including_Pyr - NV - US - 40.01 - -118.53 - 0 - 0 - REV - - - CAZ547 - 55470 - Los_Angeles_Cnty_Sn_Fernando_Vly - CA - US - 34.21 - -118.51 - 0 - 0 - LOX - - - CAZ097 - 50970 - Tulare_County_Mountains - CA - US - 36.27 - -118.48 - 0 - 0 - HNX - - - CAZ087 - 50870 - Catalina_Island - CA - US - 33.39 - -118.45 - 0 - 0 - LOX - - - CAZ054 - 50540 - Los_Angeles_Cnty_Mtns_excluding_ - CA - US - 34.48 - -118.26 - 0 - 0 - LOX - - - CAZ519 - 55190 - Ern_Sierra_Slopes_of_Inyo_Cnty - CA - US - 36.63 - -118.26 - 0 - 0 - VEF - - - CAZ041 - 50410 - Los_Angeles_Cnty_Cst_including_D - CA - US - 33.92 - -118.24 - 0 - 0 - LOX - - - CAZ059 - 50590 - Antelope_Valley - CA - US - 34.62 - -118.22 - 0 - 0 - LOX - - - ORZ502 - 375020 - Northern_Blue_Mtns_of_Oregon - OR - US - 45.65 - -118.19 - 0 - 0 - PDT - - - NVZ030 - 280300 - Humboldt_County - NV - US - 41.26 - -118.16 - 0 - 0 - LKN - - - WAZ029 - 470290 - Foothills_of_the_Blue_Mountains - WA - US - 46.31 - -118.16 - 0 - 0 - PDT - - - CAZ520 - 55200 - Owens_Valley - CA - US - 36.63 - -118.08 - 0 - 0 - VEF - - - CAZ521 - 55210 - White_Mountains_of_Inyo_County - CA - US - 36.92 - -118.00 - 0 - 0 - VEF - - - CAZ548 - 55480 - Los_Angeles_Cnty_Sn_Gabriel_Vly - CA - US - 34.05 - -117.96 - 0 - 0 - LOX - - - CAZ099 - 50990 - Southeastern_Kern_County_Desert - CA - US - 35.15 - -117.93 - 0 - 0 - HNX - - - WAZ030 - 470300 - Northwest_Blue_Mountains - WA - US - 46.17 - -117.87 - 0 - 0 - PDT - - - CAZ098 - 50980 - Indian_Wells_Valley - CA - US - 35.62 - -117.82 - 0 - 0 - HNX - - - CAZ042 - 50420 - Orange_County_Coastal_Areas - CA - US - 33.67 - -117.79 - 0 - 0 - SGX - - - WAZ037 - 470370 - Northeast_Mountains - WA - US - 48.36 - -117.71 - 0 - 0 - OTX - - - WAZ036 - 470360 - Spokane_Area - WA - US - 47.60 - -117.70 - 0 - 0 - OTX - - - ORZ049 - 370490 - Grande_Ronde_Valley - OR - US - 45.39 - -117.69 - 0 - 0 - PDT - - - ORZ062 - 370620 - Baker_County - OR - US - 44.66 - -117.65 - 0 - 0 - BOI - - - WAZ033 - 470330 - Washington_Palouse - WA - US - 46.89 - -117.64 - 0 - 0 - OTX - - - ORZ063 - 370630 - Malheur_County - OR - US - 43.21 - -117.62 - 0 - 0 - BOI - - - CAZ057 - 50570 - Santa_Ana_Mtns_and_Foothills - CA - US - 33.63 - -117.45 - 0 - 0 - SGX - - - WAZ031 - 470310 - Northeast_Blue_Mountains - WA - US - 46.21 - -117.37 - 0 - 0 - OTX - - - CAZ043 - 50430 - San_Diego_County_Coastal_Areas - CA - US - 33.00 - -117.28 - 0 - 0 - SGX - - - CAZ048 - 50480 - Sn_Bernardino_and_Rivside_Cnty_V - CA - US - 33.85 - -117.28 - 0 - 0 - SGX - - - ORZ050 - 370500 - Wallowa_County - OR - US - 45.54 - -117.17 - 0 - 0 - PDT - - - WAZ032 - 470320 - Lwr_Garfield_and_Asotin_Cnties - WA - US - 46.35 - -117.16 - 0 - 0 - OTX - - - NVZ014 - 280140 - Esmeralda_and_Ctrl_Nye_County - NV - US - 37.65 - -117.15 - 0 - 0 - VEF - - - CAZ055 - 50550 - San_Bernardino_County_Mountains - CA - US - 34.23 - -117.13 - 0 - 0 - SGX - - - ORZ064 - 370640 - Oregon_Lower_Treasure_Valley - OR - US - 44.02 - -117.11 - 0 - 0 - BOI - - - CAZ050 - 50500 - San_Diego_County_Valleys - CA - US - 33.03 - -117.06 - 0 - 0 - SGX - - - CAZ060 - 50600 - Apple_and_Lucerne_Valleys - CA - US - 34.43 - -117.03 - 0 - 0 - SGX - - - CAZ523 - 55230 - Western_Mojave_Desert - CA - US - 35.27 - -116.98 - 0 - 0 - VEF - - - IDZ003 - 120030 - Idaho_Palouse - ID - US - 46.96 - -116.96 - 0 - 0 - OTX - - - CAZ522 - 55220 - Death_Valley_National_Park - CA - US - 36.63 - -116.85 - 0 - 0 - VEF - - - IDZ002 - 120020 - Coeur_d'Alene_Area - ID - US - 47.62 - -116.83 - 0 - 0 - OTX - - - NVZ037 - 280370 - Srn_Lander_Cnty_and_Srn_Eureka_C - NV - US - 39.62 - -116.78 - 0 - 0 - LKN - - - NVZ036 - 280360 - Nrn_Lander_Cnty_and_Nrn_Eureka_C - NV - US - 40.51 - -116.76 - 0 - 0 - LKN - - - IDZ012 - 120120 - Lower_Treasure_Valley - ID - US - 43.82 - -116.75 - 0 - 0 - BOI - - - IDZ026 - 120260 - Lewiston_Area - ID - US - 46.47 - -116.71 - 0 - 0 - OTX - - - IDZ029 - 120290 - Owyhee_Mountains - ID - US - 43.07 - -116.70 - 0 - 0 - BOI - - - CAZ056 - 50560 - Riverside_County_Mountains - CA - US - 33.73 - -116.60 - 0 - 0 - SGX - - - NVZ013 - 280130 - Northern_Nye_County - NV - US - 38.60 - -116.59 - 0 - 0 - LKN - - - CAZ058 - 50580 - San_Diego_County_Mountains - CA - US - 33.00 - -116.57 - 0 - 0 - SGX - - - IDZ001 - 120010 - Northern_Panhandle - ID - US - 48.36 - -116.55 - 0 - 0 - OTX - - - IDZ027 - 120270 - Lewis_and_Srn_Nez_Perce_Cnties - ID - US - 46.16 - -116.51 - 0 - 0 - OTX - - - IDZ008 - 120080 - Lwr_Hells_Canyon/Salmon_Riv_Rgn - ID - US - 45.65 - -116.49 - 0 - 0 - MSO - - - CAZ061 - 50610 - Coachella_Valley - CA - US - 33.73 - -116.36 - 0 - 0 - SGX - - - CAZ062 - 50620 - San_Diego_County_Deserts - CA - US - 33.02 - -116.31 - 0 - 0 - SGX - - - CAZ525 - 55250 - Morongo_Basin - CA - US - 34.39 - -116.15 - 0 - 0 - VEF - - - NVZ017 - 280170 - Wrn_Clark_and_Srn_Nye_County - NV - US - 36.28 - -116.11 - 0 - 0 - VEF - - - IDZ015 - 120150 - Southwest_Highlands - ID - US - 42.51 - -116.02 - 0 - 0 - BOI - - - IDZ011 - 120110 - West_Central_Mountains - ID - US - 44.70 - -115.94 - 0 - 0 - BOI - - - IDZ004 - 120040 - Central_Panhandle_Mountains - ID - US - 47.34 - -115.93 - 0 - 0 - OTX - - - CAZ030 - 50300 - Joshua_Tree_National_Park - CA - US - 33.93 - -115.89 - 0 - 0 - PSR - - - IDZ007 - 120070 - Orofino/Grangeville_Region - ID - US - 46.24 - -115.85 - 0 - 0 - MSO - - - IDZ014 - 120140 - Upper_Treasure_Valley - ID - US - 43.16 - -115.77 - 0 - 0 - BOI - - - CAZ524 - 55240 - Ern_Mojave_Dsrt,_Incl_the_Mojave - CA - US - 35.17 - -115.61 - 0 - 0 - VEF - - - NVZ019 - 280190 - Spring_Mtns-Red_Rock_Canyon - NV - US - 36.13 - -115.57 - 0 - 0 - VEF - - - NVZ031 - 280310 - Northern_Elko_County - NV - US - 41.49 - -115.52 - 0 - 0 - LKN - - - IDZ005 - 120050 - Northern_Clearwater_Mountains - ID - US - 46.65 - -115.47 - 0 - 0 - MSO - - - CAZ033 - 50330 - Imperial_County - CA - US - 33.02 - -115.41 - 0 - 0 - PSR - - - IDZ013 - 120130 - Boise_Mountains - ID - US - 43.79 - -115.39 - 0 - 0 - BOI - - - CAZ032 - 50320 - Riverside_County/Ern_Deserts - CA - US - 33.75 - -115.33 - 0 - 0 - PSR - - - IDZ006 - 120060 - Southern_Clearwater_Mountains - ID - US - 45.88 - -115.33 - 0 - 0 - MSO - - - NVZ034 - 280340 - Ruby_Mtns/East_Humboldt_Range - NV - US - 40.56 - -115.33 - 0 - 0 - LKN - - - MTZ001 - 260010 - Kootenai/Cabinet_Region - MT - US - 48.18 - -115.15 - 0 - 0 - MSO - - - NVZ018 - 280180 - Sheep_Range - NV - US - 36.84 - -115.15 - 0 - 0 - VEF - - - NVZ020 - 280200 - Las_Vegas_Valley - NV - US - 36.11 - -115.12 - 0 - 0 - VEF - - - NVZ022 - 280220 - Southern_Clark_County - NV - US - 35.50 - -115.09 - 0 - 0 - VEF - - - CAZ526 - 55260 - Cadiz_Basin - CA - US - 34.45 - -115.08 - 0 - 0 - VEF - - - MTZ004 - 260040 - Lower_Clark_Fork_Region - MT - US - 47.38 - -115.02 - 0 - 0 - MSO - - - NVZ035 - 280350 - White_Pine_County - NV - US - 39.40 - -114.97 - 0 - 0 - LKN - - - NVZ015 - 280150 - Lincoln_County - NV - US - 37.76 - -114.96 - 0 - 0 - VEF - - - IDZ028 - 120280 - Camas_Prairie - ID - US - 43.34 - -114.86 - 0 - 0 - BOI - - - NVZ032 - 280320 - SW_and_South_Ctrl_Elko_County - NV - US - 40.64 - -114.83 - 0 - 0 - LKN - - - CAZ031 - 50310 - Lower_Colorado_River_Valley_CA - CA - US - 33.39 - -114.79 - 0 - 0 - PSR - - - NVZ021 - 280210 - L_Mead_National_Recreation_Area - NV - US - 35.79 - -114.78 - 0 - 0 - VEF - - - IDZ030 - 120300 - Southern_Twin__Falls_County - ID - US - 42.26 - -114.65 - 0 - 0 - BOI - - - AZZ036 - 30360 - L_Mead_National_Recreation_Area - AZ - US - 35.67 - -114.61 - 0 - 0 - VEF - - - AZZ025 - 30250 - Yuma/Martinez_Lake_and_Vicinity - AZ - US - 32.69 - -114.58 - 0 - 0 - PSR - - - NVZ016 - 280160 - Northeast_Clark_County - NV - US - 36.55 - -114.53 - 0 - 0 - VEF - - - IDZ016 - 120160 - Western_Magic_Valley - ID - US - 42.80 - -114.50 - 0 - 0 - BOI - - - IDZ018 - 120180 - Sawtooth_Mountains - ID - US - 44.18 - -114.49 - 0 - 0 - PIH - - - CAZ527 - 55270 - Sn_Bernardino_Cnty-Upr_CO_Riv_Vl - CA - US - 34.58 - -114.44 - 0 - 0 - VEF - - - AZZ020 - 30200 - Lower_Colorado_River_Valley_AZ - AZ - US - 33.65 - -114.43 - 0 - 0 - PSR - - - IDZ009 - 120090 - Western_Lemhi_County - ID - US - 45.10 - -114.39 - 0 - 0 - MSO - - - AZZ002 - 30020 - Lake_Havasu_and_Fort_Mohave - AZ - US - 34.63 - -114.37 - 0 - 0 - VEF - - - MTZ003 - 260030 - Flathead/Mission_Valleys - MT - US - 47.82 - -114.31 - 0 - 0 - MSO - - - IDZ031 - 120310 - Big_and_Little_Wood_River_Rgn - ID - US - 43.59 - -114.29 - 0 - 0 - PIH - - - NVZ033 - 280330 - Extreme_Eastern_Elko_County - NV - US - 40.64 - -114.23 - 0 - 0 - LKN - - - MTZ005 - 260050 - Missoula/Bitterroot_Valleys - MT - US - 46.44 - -114.10 - 0 - 0 - MSO - - - MTZ006 - 260060 - Bitterroot/Sapphire_Mountains - MT - US - 46.16 - -113.95 - 0 - 0 - MSO - - - MTZ002 - 260020 - West_Glacier_Region - MT - US - 48.30 - -113.94 - 0 - 0 - MSO - - - AZZ003 - 30030 - Northwest_Deserts - AZ - US - 35.14 - -113.92 - 0 - 0 - VEF - - - AZZ021 - 30210 - West_Central_Deserts - AZ - US - 33.86 - -113.90 - 0 - 0 - PSR - - - AZZ026 - 30260 - Southwest_Deserts - AZ - US - 32.75 - -113.90 - 0 - 0 - PSR - - - IDZ017 - 120170 - Eastern_Magic_Valley - ID - US - 42.94 - -113.79 - 0 - 0 - PIH - - - MTZ043 - 260430 - Potomac/Seeley_Lake_Region - MT - US - 47.12 - -113.60 - 0 - 0 - MSO - - - IDZ032 - 120320 - Lost_River/Pashimeroi - ID - US - 44.17 - -113.54 - 0 - 0 - PIH - - - IDZ010 - 120100 - Eastern_Lemhi_County - ID - US - 44.96 - -113.48 - 0 - 0 - MSO - - - UTZ019 - 440190 - Utah's_Dixie_and_Zion_Natl_Pk - UT - US - 37.20 - -113.47 - 0 - 0 - SLC - - - UTZ016 - 440160 - Southwest_Utah - UT - US - 37.98 - -113.33 - 0 - 0 - SLC - - - AZZ001 - 30010 - Northwest_Plateau - AZ - US - 36.49 - -113.28 - 0 - 0 - VEF - - - IDZ022 - 120220 - South_Central_Highlands - ID - US - 42.39 - -113.17 - 0 - 0 - PIH - - - MTZ009 - 260090 - Northern_Rocky_Mountain_Front - MT - US - 48.56 - -113.12 - 0 - 0 - TFX - - - AZZ037 - 30370 - Yavapai_County_Vlys_and_Basins - AZ - US - 34.56 - -113.07 - 0 - 0 - FGZ - - - UTZ005 - 440050 - Great_Salt_Lake_Desert_and_Mtns - UT - US - 40.95 - -113.00 - 0 - 0 - SLC - - - UTZ015 - 440150 - West_Central_Utah - UT - US - 39.29 - -112.99 - 0 - 0 - SLC - - - AZZ008 - 30080 - Yavapai_County__Mountains - AZ - US - 34.82 - -112.97 - 0 - 0 - FGZ - - - AZZ031 - 30310 - Western_Pima_County - AZ - US - 32.14 - -112.87 - 0 - 0 - TWC - - - MTZ007 - 260070 - Butte/Blackfoot_Region - MT - US - 46.40 - -112.84 - 0 - 0 - MSO - - - AZZ027 - 30270 - Southwest_Maricopa_County - AZ - US - 32.94 - -112.77 - 0 - 0 - PSR - - - AZZ022 - 30220 - Northwest_Maricopa_County - AZ - US - 33.67 - -112.70 - 0 - 0 - PSR - - - MTZ008 - 260080 - Beaverhead - MT - US - 45.15 - -112.69 - 0 - 0 - TFX - - - MTZ010 - 260100 - Eastern_Glacier - MT - US - 48.65 - -112.67 - 0 - 0 - TFX - - - IDZ020 - 120200 - Upper_Snake_River_Plain - ID - US - 43.66 - -112.62 - 0 - 0 - PIH - - - MTZ048 - 260480 - Southern_Rocky_Mountain_Front - MT - US - 47.73 - -112.60 - 0 - 0 - TFX - - - IDZ021 - 120210 - Lower_Snake_River_Plain - ID - US - 42.94 - -112.55 - 0 - 0 - PIH - - - AZZ007 - 30070 - Coconino_Plateau - AZ - US - 35.71 - -112.43 - 0 - 0 - FGZ - - - UTZ003 - 440030 - Salt_Lake_and_Tooele_Valleys - UT - US - 40.45 - -112.42 - 0 - 0 - SLC - - - UTZ518 - 445180 - Southern_Utah_Mountains - UT - US - 37.79 - -112.33 - 0 - 0 - SLC - - - AZZ006 - 30060 - Grand_Canyon_Country - AZ - US - 36.22 - -112.32 - 0 - 0 - FGZ - - - MTZ014 - 260140 - Central_and_Srn_Lewis_and_Clark - MT - US - 46.87 - -112.28 - 0 - 0 - TFX - - - UTZ002 - 440020 - Northern_Wasatch_Front - UT - US - 41.39 - -112.16 - 0 - 0 - SLC - - - AZZ004 - 30040 - Kaibab_Plateau - AZ - US - 36.56 - -112.14 - 0 - 0 - FGZ - - - MTZ052 - 260520 - Jefferson - MT - US - 46.15 - -112.13 - 0 - 0 - TFX - - - AZZ023 - 30230 - Greater_Phoenix_Area - AZ - US - 33.57 - -112.09 - 0 - 0 - PSR - - - UTZ020 - 440200 - South_Central_Utah - UT - US - 37.50 - -112.04 - 0 - 0 - SLC - - - MTZ015 - 260150 - Madison - MT - US - 45.28 - -112.02 - 0 - 0 - TFX - - - IDZ019 - 120190 - Upper_Snake_Highlands - ID - US - 44.13 - -112.01 - 0 - 0 - PIH - - - MTZ046 - 260460 - Eastern_Pondera - MT - US - 48.23 - -112.00 - 0 - 0 - TFX - - - IDZ024 - 120240 - Cache_Valley/Idaho_Portion - ID - US - 42.14 - -111.94 - 0 - 0 - PIH - - - UTZ001 - 440010 - Cache_Valley/Utah_Portion - UT - US - 41.73 - -111.93 - 0 - 0 - SLC - - - AZZ038 - 30380 - Oak_Creek_and_Sycamore_Canyons - AZ - US - 34.93 - -111.89 - 0 - 0 - FGZ - - - AZZ005 - 30050 - Marble_and_Glen_Canyons - AZ - US - 36.63 - -111.87 - 0 - 0 - FGZ - - - UTZ004 - 440040 - Southern_Wasatch_Front - UT - US - 40.01 - -111.87 - 0 - 0 - SLC - - - UTZ014 - 440140 - Sanpete/Sevier_Valleys - UT - US - 39.17 - -111.84 - 0 - 0 - SLC - - - AZZ032 - 30320 - Tohono_Oodham_Nation - AZ - US - 31.98 - -111.83 - 0 - 0 - TWC - - - AZZ015 - 30150 - Western_Mogollon_Rim - AZ - US - 35.20 - -111.80 - 0 - 0 - FGZ - - - MTZ049 - 260490 - Eastern_Teton - MT - US - 47.80 - -111.80 - 0 - 0 - TFX - - - IDZ023 - 120230 - Caribou_Highlands - ID - US - 42.94 - -111.78 - 0 - 0 - PIH - - - MTZ044 - 260440 - Toole - MT - US - 48.60 - -111.74 - 0 - 0 - TFX - - - AZZ028 - 30280 - NW_and_North_Ctrl_Pinal_County - AZ - US - 33.08 - -111.67 - 0 - 0 - PSR - - - UTZ007 - 440070 - Wasatch_Mountains_I-80_North - UT - US - 41.36 - -111.61 - 0 - 0 - SLC - - - IDZ025 - 120250 - Wasatch_Mountains/Idaho_Portion - ID - US - 42.30 - -111.47 - 0 - 0 - PIH - - - UTZ008 - 440080 - Wasatch_Mountains_South_of_I-80 - UT - US - 40.17 - -111.45 - 0 - 0 - SLC - - - UTZ517 - 445170 - Central_Utah_Mountains - UT - US - 39.02 - -111.44 - 0 - 0 - SLC - - - MTZ053 - 260530 - Broadwater - MT - US - 46.31 - -111.42 - 0 - 0 - TFX - - - UTZ006 - 440060 - Wasatch_Mountain_Valleys - UT - US - 40.86 - -111.39 - 0 - 0 - SLC - - - MTZ012 - 260120 - Cascade - MT - US - 47.26 - -111.34 - 0 - 0 - TFX - - - AZZ029 - 30290 - Southeast_Pinal_County - AZ - US - 32.88 - -111.33 - 0 - 0 - TWC - - - MTZ055 - 260550 - Gallatin - MT - US - 45.34 - -111.29 - 0 - 0 - TFX - - - AZZ012 - 30120 - Ltl_CO_Riv_Vly_in_Coconino_Cnty - AZ - US - 35.44 - -111.25 - 0 - 0 - FGZ - - - MTZ045 - 260450 - Liberty - MT - US - 48.56 - -111.08 - 0 - 0 - TFX - - - AZZ024 - 30240 - Srn_Gila/Tonto_NF_Foothills - AZ - US - 33.51 - -111.03 - 0 - 0 - PSR - - - MTZ054 - 260540 - Meagher - MT - US - 46.63 - -110.97 - 0 - 0 - TFX - - - WYZ023 - 500230 - Star_Valley - WY - US - 42.89 - -110.96 - 0 - 0 - RIW - - - AZZ009 - 30090 - NE_Plateaus_and_Mesas_Hwy_264_Nw - AZ - US - 36.39 - -110.92 - 0 - 0 - FGZ - - - AZZ033 - 30330 - Tucson_Metro/Marana/Grn_Valley - AZ - US - 32.13 - -110.92 - 0 - 0 - TWC - - - AZZ034 - 30340 - Santa_Cruz_County - AZ - US - 31.54 - -110.91 - 0 - 0 - TWC - - - AZZ018 - 30180 - Northern_Gila_County - AZ - US - 34.06 - -110.85 - 0 - 0 - FGZ - - - UTZ012 - 440120 - Castle_Country - UT - US - 39.29 - -110.85 - 0 - 0 - SLC - - - AZZ016 - 30160 - Eastern_Mogollon_Rim - AZ - US - 34.49 - -110.77 - 0 - 0 - FGZ - - - MTZ064 - 260640 - Paradise_Valley - MT - US - 45.33 - -110.73 - 0 - 0 - BYZ - - - UTZ010 - 440100 - Wasatch_Plateau/Book_Cliffs - UT - US - 39.76 - -110.73 - 0 - 0 - SLC - - - UTZ009 - 440090 - Western_Uinta_Mountains - UT - US - 40.70 - -110.70 - 0 - 0 - SLC - - - UTZ021 - 440210 - Glen_Canyon_Rec_Area/L_Powell - UT - US - 37.54 - -110.70 - 0 - 0 - SLC - - - WYZ024 - 500240 - Salt_River_and_Wyoming_Ranges - WY - US - 42.55 - -110.65 - 0 - 0 - RIW - - - UTZ013 - 440130 - San_Rafael_Swell - UT - US - 38.54 - -110.64 - 0 - 0 - SLC - - - WYZ013 - 500130 - Jackson_Hole - WY - US - 43.63 - -110.62 - 0 - 0 - RIW - - - MTZ040 - 260400 - Northern_Park - MT - US - 45.98 - -110.55 - 0 - 0 - BYZ - - - WYZ012 - 500120 - Teton_and_Gros_Ventre_Mountains - WY - US - 43.64 - -110.55 - 0 - 0 - RIW - - - WYZ021 - 500210 - Southwest_Wyoming - WY - US - 41.29 - -110.55 - 0 - 0 - SLC - - - WYZ027 - 500270 - South_Lincoln_County - WY - US - 41.93 - -110.55 - 0 - 0 - RIW - - - MTZ065 - 260650 - Livingston_Area - MT - US - 45.65 - -110.51 - 0 - 0 - BYZ - - - WYZ001 - 500010 - Yellowstone_National_Park - WY - US - 44.62 - -110.49 - 0 - 0 - RIW - - - MTZ013 - 260130 - Chouteau - MT - US - 47.86 - -110.48 - 0 - 0 - TFX - - - UTZ011 - 440110 - Western_Uinta_Basin - UT - US - 40.22 - -110.46 - 0 - 0 - SLC - - - MTZ068 - 260680 - Crazy_Mountains - MT - US - 46.10 - -110.32 - 0 - 0 - BYZ - - - AZZ040 - 30400 - NE_Plateaus_and_Mesas_S_of_Hwy_2 - AZ - US - 35.52 - -110.30 - 0 - 0 - FGZ - - - AZZ013 - 30130 - Ltl_CO_Riv_Vly_in_Navajo_Cnty - AZ - US - 34.88 - -110.29 - 0 - 0 - FGZ - - - MTZ050 - 260500 - Judith_Basin - MT - US - 47.05 - -110.27 - 0 - 0 - TFX - - - AZZ039 - 30390 - Black_Mesa_Area - AZ - US - 36.37 - -110.25 - 0 - 0 - FGZ - - - MTZ067 - 260670 - Absaroka/Beartooth_Mountains - MT - US - 45.33 - -110.13 - 0 - 0 - BYZ - - - MTZ011 - 260110 - Hill - MT - US - 48.57 - -110.11 - 0 - 0 - TFX - - - UTZ029 - 440290 - Canyonlands/Natural_Bridges - UT - US - 37.87 - -110.03 - 0 - 0 - GJT - - - WYZ025 - 500250 - Upper_Grn_River_Basin_Foothills - WY - US - 42.98 - -110.03 - 0 - 0 - RIW - - - MTZ041 - 260410 - Northern_Sweet_Grass - MT - US - 45.93 - -109.86 - 0 - 0 - BYZ - - - MTZ028 - 260280 - Southern_Wheatland - MT - US - 46.38 - -109.84 - 0 - 0 - BYZ - - - MTZ066 - 260660 - Beartooth_Foothills - MT - US - 45.54 - -109.81 - 0 - 0 - BYZ - - - AZZ010 - 30100 - Chinle_Valley - AZ - US - 36.36 - -109.76 - 0 - 0 - FGZ - - - AZZ030 - 30300 - Upper_Gila_River_Valley - AZ - US - 33.05 - -109.75 - 0 - 0 - TWC - - - AZZ035 - 30350 - Cochise_County - AZ - US - 31.89 - -109.75 - 0 - 0 - TWC - - - WYZ014 - 500140 - Wind_River_Mountains_West - WY - US - 43.00 - -109.70 - 0 - 0 - RIW - - - WYZ026 - 500260 - Upper_Green_River_Basin - WY - US - 42.42 - -109.68 - 0 - 0 - RIW - - - AZZ017 - 30170 - White_Mountains - AZ - US - 33.89 - -109.65 - 0 - 0 - FGZ - - - MTZ063 - 260630 - Judith_Gap - MT - US - 46.65 - -109.65 - 0 - 0 - BYZ - - - UTZ027 - 440270 - Arches/Grand_Flat - UT - US - 38.95 - -109.61 - 0 - 0 - GJT - - - WYZ028 - 500280 - Rock_Springs_and_Green_River - WY - US - 41.51 - -109.60 - 0 - 0 - RIW - - - UTZ025 - 440250 - Tavaputs_Plateau - UT - US - 39.50 - -109.58 - 0 - 0 - GJT - - - UTZ028 - 440280 - La_Sal_and_Abajo_Mountains - UT - US - 38.15 - -109.53 - 0 - 0 - GJT - - - UTZ023 - 440230 - Eastern_Uinta_Mountains - UT - US - 40.68 - -109.52 - 0 - 0 - GJT - - - UTZ024 - 440240 - Eastern_Uinta_Basin - UT - US - 40.21 - -109.51 - 0 - 0 - GJT - - - WYZ002 - 500020 - Absaroka_Mountains - WY - US - 44.24 - -109.49 - 0 - 0 - RIW - - - AZZ014 - 30140 - Ltl_CO_Riv_Vly_in_Apache_Cnty - AZ - US - 34.58 - -109.45 - 0 - 0 - FGZ - - - UTZ022 - 440220 - Southeast_Utah - UT - US - 37.40 - -109.45 - 0 - 0 - GJT - - - WYZ029 - 500290 - Flaming_Gorge - WY - US - 41.25 - -109.42 - 0 - 0 - RIW - - - WYZ016 - 500160 - Upper_Wind_River_Basin - WY - US - 43.44 - -109.41 - 0 - 0 - RIW - - - MTZ056 - 260560 - Red_Lodge_Foothills - MT - US - 45.23 - -109.32 - 0 - 0 - BYZ - - - AZZ011 - 30110 - Chuska_Mtns_and_Defiance_Plateay - AZ - US - 35.98 - -109.31 - 0 - 0 - FGZ - - - WYZ015 - 500150 - Wind_River_Mountains_East - WY - US - 43.09 - -109.31 - 0 - 0 - RIW - - - AZZ019 - 30190 - Northern_Greenlee - AZ - US - 33.42 - -109.27 - 0 - 0 - TWC - - - MTZ051 - 260510 - Fergus - MT - US - 47.25 - -109.26 - 0 - 0 - TFX - - - MTZ042 - 260420 - Golden_Valley - MT - US - 46.36 - -109.22 - 0 - 0 - BYZ - - - MTZ034 - 260340 - Northern_Stillwater - MT - US - 45.78 - -109.21 - 0 - 0 - BYZ - - - WYZ003 - 500030 - Cody_Foothills - WY - US - 44.46 - -109.04 - 0 - 0 - RIW - - - MTZ047 - 260470 - Blaine - MT - US - 48.37 - -108.90 - 0 - 0 - TFX - - - MTZ039 - 260390 - Eastern_Carbon - MT - US - 45.32 - -108.71 - 0 - 0 - BYZ - - - COZ006 - 60060 - Grand_Valley - CO - US - 39.16 - -108.65 - 0 - 0 - GJT - - - COZ021 - 60210 - Four_Corners/Upper_Dolores_Riv - CO - US - 37.49 - -108.64 - 0 - 0 - GJT - - - NMZ030 - 310300 - Southwest_Desert/Bootheel - NM - US - 31.93 - -108.63 - 0 - 0 - EPZ - - - COZ020 - 60200 - Paradox_Vly/Little_Dolores_Riv - CO - US - 38.28 - -108.61 - 0 - 0 - GJT - - - WYZ007 - 500070 - Owl_Creek_and_Bridger_Mountains - WY - US - 43.62 - -108.61 - 0 - 0 - RIW - - - WYZ018 - 500180 - Lander_Foothills - WY - US - 42.81 - -108.61 - 0 - 0 - RIW - - - MTZ060 - 260600 - Southwest_Phillips - MT - US - 47.83 - -108.55 - 0 - 0 - GGW - - - COZ001 - 60010 - Lower_Yampa_River_Basin - CO - US - 40.30 - -108.49 - 0 - 0 - GJT - - - COZ003 - 60030 - Roan_and_Tavaputs_Plateaus - CO - US - 39.63 - -108.44 - 0 - 0 - GJT - - - MTZ029 - 260290 - Musselshell - MT - US - 46.44 - -108.40 - 0 - 0 - BYZ - - - WYZ030 - 500300 - East_Sweetwater_County - WY - US - 41.61 - -108.37 - 0 - 0 - RIW - - - COZ017 - 60170 - Uncompahgre_Plateau/Dallas_Divid - CO - US - 38.58 - -108.35 - 0 - 0 - GJT - - - WYZ017 - 500170 - Wind_River_Basin - WY - US - 43.13 - -108.34 - 0 - 0 - RIW - - - MTZ021 - 260210 - Petroleum - MT - US - 47.18 - -108.28 - 0 - 0 - GGW - - - WYZ005 - 500050 - Southwest_Big_Horn_Basin - WY - US - 43.81 - -108.25 - 0 - 0 - RIW - - - NMZ001 - 310010 - Northwest_Plateau - NM - US - 36.35 - -108.23 - 0 - 0 - ABQ - - - MTZ035 - 260350 - Yellowstone - MT - US - 45.98 - -108.20 - 0 - 0 - BYZ - - - WYZ004 - 500040 - North_Big_Horn_Basin - WY - US - 44.57 - -108.19 - 0 - 0 - RIW - - - NMZ022 - 310220 - SW_Mtns/Lower_Gila_Region - NM - US - 33.00 - -108.17 - 0 - 0 - EPZ - - - NMZ014 - 310140 - SW_Mtns/Upper_Gila_Region - NM - US - 33.77 - -108.13 - 0 - 0 - ABQ - - - NMZ008 - 310080 - West_Central_Mountains - NM - US - 35.06 - -108.09 - 0 - 0 - ABQ - - - COZ007 - 60070 - Debeque_to_Silt_Corridor - CO - US - 39.43 - -108.05 - 0 - 0 - GJT - - - WYZ019 - 500190 - Grn_Mtns_and_Rattlesnake_Range - WY - US - 42.40 - -107.96 - 0 - 0 - RIW - - - COZ011 - 60110 - Ctrl_Gunnison_and_Uncompahgre_Ri - CO - US - 38.64 - -107.94 - 0 - 0 - GJT - - - COZ022 - 60220 - Animas_River_Basin - CO - US - 37.25 - -107.92 - 0 - 0 - GJT - - - WYZ006 - 500060 - Southeast_Big_Horn_Basin - WY - US - 43.87 - -107.90 - 0 - 0 - RIW - - - COZ002 - 60020 - Central_Yampa_River_Basin - CO - US - 40.34 - -107.85 - 0 - 0 - GJT - - - COZ009 - 60090 - Grand_and_Battlement_Mesas - CO - US - 39.17 - -107.85 - 0 - 0 - GJT - - - MTZ016 - 260160 - Central_and_Southeast_Phillips - MT - US - 48.02 - -107.82 - 0 - 0 - GGW - - - MTZ059 - 260590 - Northern_Phillips - MT - US - 48.79 - -107.75 - 0 - 0 - GGW - - - NMZ031 - 310310 - Southwest_Desert/Mimbres_Basin - NM - US - 32.20 - -107.75 - 0 - 0 - EPZ - - - COZ018 - 60180 - Northwestern_San_Juan_Mountains - CO - US - 38.08 - -107.64 - 0 - 0 - GJT - - - COZ019 - 60190 - Southwest_San_Juan_Mountains - CO - US - 37.48 - -107.64 - 0 - 0 - GJT - - - COZ013 - 60130 - Flattops - CO - US - 39.98 - -107.53 - 0 - 0 - GJT - - - MTZ038 - 260380 - Southern_Big_Horn - MT - US - 45.26 - -107.48 - 0 - 0 - BYZ - - - WYZ098 - 500980 - Northeast_Big_Horn_Mountains - WY - US - 44.78 - -107.43 - 0 - 0 - BYZ - - - MTZ057 - 260570 - Northern_Big_Horn - MT - US - 45.78 - -107.40 - 0 - 0 - BYZ - - - MTZ030 - 260300 - Treasure - MT - US - 46.18 - -107.34 - 0 - 0 - BYZ - - - COZ023 - 60230 - San_Juan_River_Basin - CO - US - 37.20 - -107.30 - 0 - 0 - GJT - - - WYZ008 - 500080 - Bighorn_Mountains_West - WY - US - 44.21 - -107.28 - 0 - 0 - RIW - - - WYZ061 - 500610 - Southwest_Carbon - WY - US - 41.53 - -107.28 - 0 - 0 - CYS - - - COZ014 - 60140 - Upper_Gunnison_River_Valley - CO - US - 38.51 - -107.17 - 0 - 0 - GJT - - - NMZ002 - 310020 - Northwest_Mtns_including_Jemez - NM - US - 36.16 - -107.10 - 0 - 0 - ABQ - - - WYZ009 - 500090 - Bighorn_Mountains_Southeast - WY - US - 43.88 - -107.07 - 0 - 0 - RIW - - - MTZ022 - 260220 - Garfield - MT - US - 47.41 - -107.03 - 0 - 0 - GGW - - - COZ008 - 60080 - Central_Colorado_River_Basin - CO - US - 39.60 - -106.99 - 0 - 0 - GJT - - - MTZ031 - 260310 - Northern_Rosebud - MT - US - 46.27 - -106.99 - 0 - 0 - BYZ - - - NMZ023 - 310230 - Sierra_County_Lakes_Region - NM - US - 33.04 - -106.97 - 0 - 0 - EPZ - - - COZ005 - 60050 - Upper_Yampa_River_Basin - CO - US - 40.41 - -106.96 - 0 - 0 - GJT - - - COZ012 - 60120 - West_Elk_and_Sawatch_Mountains - CO - US - 38.84 - -106.93 - 0 - 0 - GJT - - - COZ010 - 60100 - Gore_and_Elk_Mtns/Ctrl_Mtn_Vlys - CO - US - 39.45 - -106.92 - 0 - 0 - GJT - - - NMZ032 - 310320 - Southern_Desert - NM - US - 32.37 - -106.87 - 0 - 0 - EPZ - - - NMZ015 - 310150 - Lower_Rio_Grande_Valley - NM - US - 34.03 - -106.86 - 0 - 0 - ABQ - - - NMZ009 - 310090 - Middle_Rio_Gnde_Vly/Albuquerque_ - NM - US - 34.90 - -106.85 - 0 - 0 - ABQ - - - WYZ062 - 500620 - North_Carbon - WY - US - 42.03 - -106.80 - 0 - 0 - CYS - - - WYZ020 - 500200 - Natrona_County_Lower_Elevations - WY - US - 42.97 - -106.79 - 0 - 0 - RIW - - - WYZ099 - 500990 - Sheridan_Foothills - WY - US - 44.78 - -106.77 - 0 - 0 - BYZ - - - COZ004 - 60040 - Elkhead_and_Park_Mountains - CO - US - 40.46 - -106.73 - 0 - 0 - GJT - - - COZ066 - 60660 - La_Garita_Mtns_Above_10000_Ft - CO - US - 38.05 - -106.72 - 0 - 0 - PUB - - - COZ064 - 60640 - Saguache_Cnty_W_of_Continental_D - CO - US - 38.24 - -106.64 - 0 - 0 - PUB - - - COZ031 - 60310 - W_Jackson_and_W_Gnd_Cnties_Above - CO - US - 40.48 - -106.62 - 0 - 0 - BOU - - - MTZ017 - 260170 - Central_and_Southern_Valley - MT - US - 48.12 - -106.62 - 0 - 0 - GGW - - - MTZ061 - 260610 - Northern_Valley - MT - US - 48.79 - -106.62 - 0 - 0 - GGW - - - COZ068 - 60680 - Ern_Sn_Juan_Mtns_Above_10000_Ft - CO - US - 37.40 - -106.61 - 0 - 0 - PUB - - - MTZ058 - 260580 - Southern_Rosebud - MT - US - 45.43 - -106.50 - 0 - 0 - BYZ - - - WYZ011 - 500110 - Southeast_Johnson_County - WY - US - 43.83 - -106.48 - 0 - 0 - RIW - - - WYZ010 - 500100 - Northeast_Johnson_County - WY - US - 44.36 - -106.46 - 0 - 0 - RIW - - - NMZ010 - 310100 - Sandia/Manzano_Mountains - NM - US - 34.76 - -106.40 - 0 - 0 - ABQ - - - COZ060 - 60600 - Ern_Sawatch_Mtns_Above_11000_Ft - CO - US - 38.81 - -106.39 - 0 - 0 - PUB - - - COZ059 - 60590 - Leadvl_Vic/L_Cnty_Below_11000_Ft - CO - US - 39.20 - -106.38 - 0 - 0 - PUB - - - WYZ063 - 500630 - Snowy_Range - WY - US - 41.39 - -106.37 - 0 - 0 - CYS - - - COZ065 - 60650 - Saguache_Cnty_E_of_Continental_D - CO - US - 38.07 - -106.36 - 0 - 0 - PUB - - - TXZ055 - 430550 - El_Paso - TX - US - 31.70 - -106.30 - 0 - 0 - EPZ - - - COZ030 - 60300 - Jackson_County_Below_9000_Feet - CO - US - 40.69 - -106.28 - 0 - 0 - BOU - - - WYZ022 - 500220 - Casper_Mountain - WY - US - 42.61 - -106.24 - 0 - 0 - RIW - - - COZ067 - 60670 - Upr_Rio_Gnde_Vly/Ern_Sn_Juan_Mtn - CO - US - 37.45 - -106.23 - 0 - 0 - PUB - - - COZ058 - 60580 - Wrn_Mosquito_Rng/E_L_Cnty_Above_ - CO - US - 39.21 - -106.21 - 0 - 0 - PUB - - - COZ061 - 60610 - Wrn_Chaffee_Cnty_Between_9000_an - CO - US - 38.74 - -106.20 - 0 - 0 - PUB - - - NMZ024 - 310240 - Tularosa_Basin/Southern_Desert - NM - US - 32.70 - -106.18 - 0 - 0 - EPZ - - - COZ032 - 60320 - Gnd_and_Summit_Cnties_Below_9000 - CO - US - 40.00 - -106.17 - 0 - 0 - BOU - - - COZ062 - 60620 - Ctrl_Chaffee_Cnty_Below_9000_Ft - CO - US - 38.74 - -106.12 - 0 - 0 - PUB - - - NMZ003 - 310030 - Upper_Rio_Grande_Valley - NM - US - 35.80 - -106.07 - 0 - 0 - ABQ - - - COZ069 - 60690 - Del_Norte_Vic/Nrn_Sn_Luis_Vly_Be - CO - US - 37.97 - -106.04 - 0 - 0 - PUB - - - COZ063 - 60630 - Wrn_Mosquito_Rng/E_Chaffee_Cnty_ - CO - US - 38.79 - -105.96 - 0 - 0 - PUB - - - COZ033 - 60330 - S_and_E_Jackson/Larimer/N_and_NE - CO - US - 40.55 - -105.94 - 0 - 0 - BOU - - - COZ034 - 60340 - S_and_SE_Gnd/W_Ctrl_and_SW_Bould - CO - US - 39.55 - -105.91 - 0 - 0 - BOU - - - COZ070 - 60700 - Alamosa_Vic/Ctrl_Sn_Luis_Vly_Bel - CO - US - 37.54 - -105.91 - 0 - 0 - PUB - - - NMZ011 - 310110 - Ctrl_Hi_Plains/Estancia_Valley - NM - US - 34.77 - -105.83 - 0 - 0 - ABQ - - - MTZ023 - 260230 - McCone - MT - US - 47.59 - -105.82 - 0 - 0 - GGW - - - WYZ065 - 500650 - Laramie_Valley - WY - US - 41.59 - -105.81 - 0 - 0 - CYS - - - COZ071 - 60710 - Southern_San_Luis_Valley - CO - US - 37.27 - -105.78 - 0 - 0 - PUB - - - WYZ064 - 500640 - North_Laramie_Range - WY - US - 42.32 - -105.68 - 0 - 0 - CYS - - - COZ037 - 60370 - Central_and_SE_Park_County - CO - US - 39.05 - -105.66 - 0 - 0 - BOU - - - COZ077 - 60770 - Wrn/Ctrl_Fremt_Cnty_Below_8500_F - CO - US - 38.46 - -105.63 - 0 - 0 - PUB - - - MTZ036 - 260360 - Powder_River - MT - US - 45.40 - -105.63 - 0 - 0 - BYZ - - - NMZ025 - 310250 - Southern_Sacramento_Mountains - NM - US - 32.91 - -105.63 - 0 - 0 - EPZ - - - COZ076 - 60760 - NWrn_Fremt_County_above_8500_Ft - CO - US - 38.55 - -105.61 - 0 - 0 - PUB - - - COZ073 - 60730 - Nrn_Sngre_De_Cristo_Mtns_Above_1 - CO - US - 38.00 - -105.59 - 0 - 0 - PUB - - - NMZ017 - 310170 - Capitan/Nrn_Sacramento_Mtns - NM - US - 33.71 - -105.58 - 0 - 0 - ABQ - - - MTZ018 - 260180 - Daniels - MT - US - 48.79 - -105.57 - 0 - 0 - GGW - - - NMZ004 - 310040 - Sangre_de_Cristo_Mountains - NM - US - 36.25 - -105.57 - 0 - 0 - ABQ - - - WYZ054 - 500540 - Northern_Campbell - WY - US - 44.60 - -105.55 - 0 - 0 - UNR - - - WYZ055 - 500550 - Southern_Campbell - WY - US - 43.84 - -105.55 - 0 - 0 - UNR - - - COZ072 - 60720 - Nrn_Sngre_De_Cristo_Mtns_Between - CO - US - 37.98 - -105.49 - 0 - 0 - PUB - - - WYZ059 - 500590 - Converse - WY - US - 43.02 - -105.49 - 0 - 0 - CYS - - - MTZ032 - 260320 - Custer - MT - US - 46.33 - -105.47 - 0 - 0 - BYZ - - - COZ078 - 60780 - Wet_Mtn_Valley_Below_8500_Feet - CO - US - 38.08 - -105.45 - 0 - 0 - PUB - - - TXZ056 - 430560 - Hudspeth - TX - US - 31.32 - -105.45 - 0 - 0 - EPZ - - - MTZ020 - 260200 - Western_Roosevelt - MT - US - 48.29 - -105.41 - 0 - 0 - GGW - - - COZ035 - 60350 - Larimer_and_Boulder_Cnties_Betwe - CO - US - 40.46 - -105.39 - 0 - 0 - BOU - - - MTZ026 - 260260 - Prairie - MT - US - 46.86 - -105.34 - 0 - 0 - GGW - - - COZ036 - 60360 - Jefferson_and_W_Douglas_Cnties_A - CO - US - 39.53 - -105.32 - 0 - 0 - BOU - - - WYZ066 - 500660 - Laramie_Range - WY - US - 41.45 - -105.31 - 0 - 0 - CYS - - - COZ081 - 60810 - Teller_Cnty/Rampart_Rng_above_75 - CO - US - 38.82 - -105.22 - 0 - 0 - PUB - - - COZ039 - 60390 - Boulder_And_Jefferson_Cnties_Bel - CO - US - 39.87 - -105.19 - 0 - 0 - BOU - - - COZ075 - 60750 - Srn_Sngre_De_Cristo_Mtns_Above_1 - CO - US - 37.20 - -105.17 - 0 - 0 - PUB - - - COZ079 - 60790 - Wet_Mtns_Between_6300_and_10000_ - CO - US - 38.08 - -105.14 - 0 - 0 - PUB - - - COZ080 - 60800 - Wet_Mountains_Above_10000_Ft - CO - US - 37.98 - -105.14 - 0 - 0 - PUB - - - COZ083 - 60830 - Canon_City_Vic/Ern_Fremt_County - CO - US - 38.44 - -105.14 - 0 - 0 - PUB - - - NMZ026 - 310260 - Guadalupe_Mtns_of_Chaves_County - NM - US - 32.83 - -105.08 - 0 - 0 - ABQ - - - NMZ016 - 310160 - Lincoln_Cnty_Hi_Plns/Hondo_Vly - NM - US - 33.74 - -105.07 - 0 - 0 - ABQ - - - COZ082 - 60820 - PIkes_Peak_above_11000_Ft - CO - US - 38.82 - -105.04 - 0 - 0 - PUB - - - WYZ067 - 500670 - Platte - WY - US - 42.13 - -104.97 - 0 - 0 - CYS - - - COZ087 - 60870 - Walsenbg_Vic/Upr_Huerfano_Riv_Bs - CO - US - 37.67 - -104.87 - 0 - 0 - PUB - - - MTZ025 - 260250 - Dawson - MT - US - 47.32 - -104.86 - 0 - 0 - GGW - - - COZ074 - 60740 - Srn_Sngre_De_Cristo_Mtns_Between - CO - US - 37.26 - -104.83 - 0 - 0 - PUB - - - COZ040 - 60400 - N_Douglas_Cnty_Below_6000_Feet/D - CO - US - 39.73 - -104.81 - 0 - 0 - BOU - - - COZ038 - 60380 - Larimer_Cnty_Below_6000_Feet/NW_ - CO - US - 40.63 - -104.80 - 0 - 0 - BOU - - - WYZ069 - 500690 - Cheyenne_Foothills - WY - US - 41.33 - -104.75 - 0 - 0 - CYS - - - WYZ056 - 500560 - Western_Crook - WY - US - 44.59 - -104.72 - 0 - 0 - UNR - - - TXZ258 - 432580 - Guadalupe_Mountains - TX - US - 31.90 - -104.71 - 0 - 0 - MAF - - - NMZ027 - 310270 - Guadalupe_Mtns_of_Eddy_County - NM - US - 32.30 - -104.67 - 0 - 0 - MAF - - - MTZ024 - 260240 - Richland - MT - US - 47.75 - -104.64 - 0 - 0 - GGW - - - TXZ079 - 430790 - Presidio_Valley - TX - US - 29.95 - -104.61 - 0 - 0 - MAF - - - COZ043 - 60430 - Central_and_South_Weld_County - CO - US - 40.29 - -104.59 - 0 - 0 - BOU - - - WYZ058 - 500580 - Weston - WY - US - 43.84 - -104.57 - 0 - 0 - UNR - - - MTZ019 - 260190 - Sheridan - MT - US - 48.70 - -104.55 - 0 - 0 - GGW - - - TXZ057 - 430570 - Van_Horn_and_Hiway_54_Corridor - TX - US - 31.24 - -104.55 - 0 - 0 - MAF - - - COZ086 - 60860 - Pueblo_and_Vic/Pueblo_Cnty_Below - CO - US - 38.12 - -104.54 - 0 - 0 - PUB - - - MTZ037 - 260370 - Carter - MT - US - 45.57 - -104.54 - 0 - 0 - BYZ - - - NMZ005 - 310050 - Northeast_Highlands - NM - US - 36.10 - -104.54 - 0 - 0 - ABQ - - - COZ085 - 60850 - CO_Spgs_Vic/Srn_El_Paso_Cnty/Ram - CO - US - 38.74 - -104.51 - 0 - 0 - PUB - - - MTZ062 - 260620 - Eastern_Roosevelt - MT - US - 48.28 - -104.51 - 0 - 0 - GGW - - - COZ088 - 60880 - Trinidad_Vic/Wrn_Las_Animas_Cnty - CO - US - 37.40 - -104.50 - 0 - 0 - PUB - - - COZ084 - 60840 - Nrn_El_Paso_Cnty/Monument_Ridge/ - CO - US - 38.99 - -104.49 - 0 - 0 - PUB - - - WYZ060 - 500600 - Niobrara - WY - US - 43.06 - -104.49 - 0 - 0 - CYS - - - MTZ033 - 260330 - Fallon - MT - US - 46.29 - -104.48 - 0 - 0 - BYZ - - - NMZ012 - 310120 - Conchas_Lake/Guadalupe_County - NM - US - 35.08 - -104.46 - 0 - 0 - ABQ - - - COZ041 - 60410 - Elbert/Ctrl_and_E_Douglas_Cnties - CO - US - 39.28 - -104.43 - 0 - 0 - BOU - - - NMZ018 - 310180 - De_Baca_County - NM - US - 34.39 - -104.41 - 0 - 0 - ABQ - - - TXZ080 - 430800 - Marfa_Plateau - TX - US - 30.16 - -104.39 - 0 - 0 - MAF - - - WYZ057 - 500570 - Wyoming_Black_Hills - WY - US - 44.38 - -104.37 - 0 - 0 - UNR - - - WYZ068 - 500680 - Goshen - WY - US - 42.09 - -104.35 - 0 - 0 - CYS - - - MTZ027 - 260270 - Wibaux - MT - US - 47.02 - -104.33 - 0 - 0 - GGW - - - WYZ070 - 500700 - Pine_Bluffs - WY - US - 41.28 - -104.28 - 0 - 0 - CYS - - - NMZ028 - 310280 - Eddy_County_Plains - NM - US - 32.49 - -104.27 - 0 - 0 - MAF - - - WYZ071 - 500710 - Northeastern_Crook - WY - US - 44.79 - -104.21 - 0 - 0 - UNR - - - NMZ019 - 310190 - Chaves_County_Plains - NM - US - 33.53 - -104.19 - 0 - 0 - ABQ - - - COZ042 - 60420 - Northeast_Weld_County - CO - US - 40.75 - -104.10 - 0 - 0 - BOU - - - COZ045 - 60450 - Ctrl_and_E_Adams_and_Arapahoe_Cn - CO - US - 39.78 - -104.10 - 0 - 0 - BOU - - - NMZ006 - 310060 - Harding_County - NM - US - 35.81 - -103.89 - 0 - 0 - ABQ - - - NDZ031 - 340310 - Golden_Valley - ND - US - 46.94 - -103.83 - 0 - 0 - BIS - - - COZ046 - 60460 - N_and_NE_Elbert_Cnty_Below_6000_ - CO - US - 39.33 - -103.81 - 0 - 0 - BOU - - - COZ044 - 60440 - Morgan_County - CO - US - 40.25 - -103.80 - 0 - 0 - BOU - - - TXZ074 - 430740 - Davis/Apache_Mountains_Area - TX - US - 30.71 - -103.80 - 0 - 0 - MAF - - - TXZ058 - 430580 - Reeves_Cnty_and_Upr_Trans_Pecos - TX - US - 31.39 - -103.78 - 0 - 0 - MAF - - - COZ089 - 60890 - Crowley_County - CO - US - 38.31 - -103.77 - 0 - 0 - PUB - - - NEZ001 - 270010 - Sioux - NE - US - 42.50 - -103.73 - 0 - 0 - CYS - - - COZ093 - 60930 - La_Junta_Vicinity/Otero_County - CO - US - 37.95 - -103.72 - 0 - 0 - PUB - - - SDZ024 - 410240 - Northern_Black_Hills - SD - US - 44.31 - -103.72 - 0 - 0 - UNR - - - NEZ019 - 270190 - Scotts_Bluff - NE - US - 41.85 - -103.71 - 0 - 0 - CYS - - - NEZ020 - 270200 - Banner - NE - US - 41.54 - -103.71 - 0 - 0 - CYS - - - NEZ054 - 270540 - Kimball - NE - US - 41.20 - -103.71 - 0 - 0 - CYS - - - SDZ028 - 410280 - Central_Black_Hills - SD - US - 44.00 - -103.69 - 0 - 0 - UNR - - - SDZ029 - 410290 - Southern_Black_Hills - SD - US - 43.67 - -103.69 - 0 - 0 - UNR - - - NMZ007 - 310070 - Far_Northeast_Plains - NM - US - 36.37 - -103.67 - 0 - 0 - ABQ - - - TXZ059 - 430590 - Loving - TX - US - 31.83 - -103.66 - 0 - 0 - MAF - - - SDZ025 - 410250 - Northern_Foot_Hills - SD - US - 44.44 - -103.64 - 0 - 0 - UNR - - - SDZ027 - 410270 - Southern_Foot_Hills - SD - US - 43.36 - -103.64 - 0 - 0 - UNR - - - COZ047 - 60470 - SE_Elbert_Cnty_Below_6000_Feet/S - CO - US - 38.80 - -103.60 - 0 - 0 - BOU - - - NMZ013 - 310130 - Quay_County - NM - US - 35.17 - -103.57 - 0 - 0 - ABQ - - - COZ094 - 60940 - Eastern_Las_Animas_County - CO - US - 37.32 - -103.56 - 0 - 0 - PUB - - - SDZ041 - 410410 - Fall_River - SD - US - 43.24 - -103.53 - 0 - 0 - UNR - - - NDZ043 - 340430 - Bowman - ND - US - 46.11 - -103.52 - 0 - 0 - BIS - - - SDZ012 - 410120 - Butte - SD - US - 44.89 - -103.51 - 0 - 0 - UNR - - - SDZ001 - 410010 - Harding - SD - US - 45.58 - -103.50 - 0 - 0 - UNR - - - NDZ040 - 340400 - Slope - ND - US - 46.45 - -103.49 - 0 - 0 - BIS - - - NMZ020 - 310200 - Roosevelt_County - NM - US - 34.08 - -103.49 - 0 - 0 - ABQ - - - NDZ001 - 340010 - Divide - ND - US - 48.82 - -103.47 - 0 - 0 - BIS - - - NDZ009 - 340090 - Williams - ND - US - 48.30 - -103.44 - 0 - 0 - BIS - - - NMZ033 - 310330 - Central_Lea_County - NM - US - 32.75 - -103.43 - 0 - 0 - MAF - - - NMZ029 - 310290 - Northern_Lea_County - NM - US - 33.28 - -103.40 - 0 - 0 - MAF - - - NMZ034 - 310340 - Southern_Lea_County - NM - US - 32.25 - -103.39 - 0 - 0 - MAF - - - NMZ021 - 310210 - Curry_County - NM - US - 34.64 - -103.38 - 0 - 0 - ABQ - - - NDZ032 - 340320 - Billings - ND - US - 46.98 - -103.35 - 0 - 0 - BIS - - - SDZ072 - 410720 - Sturgis/Piedmont_Foot_Hills - SD - US - 44.38 - -103.35 - 0 - 0 - UNR - - - NDZ017 - 340170 - McKenzie - ND - US - 47.74 - -103.31 - 0 - 0 - BIS - - - SDZ074 - 410740 - Hermosa_Foot_Hills - SD - US - 43.67 - -103.27 - 0 - 0 - UNR - - - COZ049 - 60490 - Washington_County - CO - US - 40.00 - -103.24 - 0 - 0 - BOU - - - SDZ026 - 410260 - Rapid_City - SD - US - 44.00 - -103.23 - 0 - 0 - UNR - - - TXZ067 - 430670 - Ward - TX - US - 31.46 - -103.18 - 0 - 0 - MAF - - - NEZ002 - 270020 - Dawes - NE - US - 42.72 - -103.14 - 0 - 0 - CYS - - - COZ048 - 60480 - Logan_County - CO - US - 40.72 - -103.11 - 0 - 0 - BOU - - - COZ095 - 60950 - Western_Kiowa_County - CO - US - 38.43 - -103.11 - 0 - 0 - PUB - - - NEZ003 - 270030 - Box_Butte - NE - US - 42.22 - -103.07 - 0 - 0 - CYS - - - TXZ060 - 430600 - Winkler - TX - US - 31.87 - -103.07 - 0 - 0 - MAF - - - TXZ081 - 430810 - Big_Bend_Area - TX - US - 29.69 - -103.06 - 0 - 0 - MAF - - - COZ097 - 60970 - Las_Animas_Vicinity/Bent_County - CO - US - 37.95 - -103.05 - 0 - 0 - PUB - - - NEZ021 - 270210 - Morrill - NE - US - 41.72 - -103.00 - 0 - 0 - CYS - - - NEZ055 - 270550 - Cheyenne - NE - US - 41.22 - -102.99 - 0 - 0 - CYS - - - SDZ030 - 410300 - Custer_Co_Plains - SD - US - 43.67 - -102.96 - 0 - 0 - UNR - - - TXZ027 - 430270 - Bailey - TX - US - 34.07 - -102.82 - 0 - 0 - LUB - - - TXZ033 - 430330 - Cochran - TX - US - 33.61 - -102.82 - 0 - 0 - LUB - - - TXZ039 - 430390 - Yoakum - TX - US - 33.17 - -102.82 - 0 - 0 - LUB - - - SDZ073 - 410730 - Southern_Meade_Co_Plains - SD - US - 44.38 - -102.78 - 0 - 0 - UNR - - - TXZ021 - 430210 - Parmer - TX - US - 34.53 - -102.78 - 0 - 0 - LUB - - - TXZ075 - 430750 - Pecos - TX - US - 30.72 - -102.67 - 0 - 0 - MAF - - - NDZ033 - 340330 - Stark - ND - US - 46.82 - -102.66 - 0 - 0 - BIS - - - NDZ018 - 340180 - Dunn - ND - US - 47.40 - -102.63 - 0 - 0 - BIS - - - TXZ050 - 430500 - Andrews - TX - US - 32.30 - -102.63 - 0 - 0 - MAF - - - TXZ045 - 430450 - Gaines - TX - US - 32.74 - -102.62 - 0 - 0 - MAF - - - COZ092 - 60920 - Cheyenne_County - CO - US - 38.82 - -102.61 - 0 - 0 - GLD - - - COZ091 - 60910 - Kit_Carson_County - CO - US - 39.30 - -102.60 - 0 - 0 - GLD - - - TXZ001 - 430010 - Dallam - TX - US - 36.27 - -102.60 - 0 - 0 - AMA - - - TXZ006 - 430060 - Hartley - TX - US - 35.84 - -102.59 - 0 - 0 - AMA - - - TXZ011 - 430110 - Oldham - TX - US - 35.40 - -102.59 - 0 - 0 - AMA - - - TXZ016 - 430160 - Deaf_Smith - TX - US - 34.97 - -102.59 - 0 - 0 - AMA - - - COZ099 - 60990 - Springfield_Vic/Baca_County - CO - US - 37.32 - -102.56 - 0 - 0 - PUB - - - SDZ031 - 410310 - Pennington_Co_Plains - SD - US - 44.10 - -102.56 - 0 - 0 - UNR - - - SDZ042 - 410420 - Shannon - SD - US - 43.35 - -102.54 - 0 - 0 - UNR - - - TXZ061 - 430610 - Ector - TX - US - 31.87 - -102.54 - 0 - 0 - MAF - - - TXZ068 - 430680 - Crane - TX - US - 31.37 - -102.54 - 0 - 0 - MAF - - - OKZ001 - 360010 - Cimarron - OK - US - 36.74 - -102.51 - 0 - 0 - AMA - - - NDZ044 - 340440 - Adams - ND - US - 46.11 - -102.50 - 0 - 0 - BIS - - - NDZ002 - 340020 - Burke - ND - US - 48.78 - -102.48 - 0 - 0 - BIS - - - SDZ002 - 410020 - Perkins - SD - US - 45.49 - -102.48 - 0 - 0 - UNR - - - SDZ013 - 410130 - Northern_Meade_Co_Plains - SD - US - 44.82 - -102.48 - 0 - 0 - UNR - - - NDZ041 - 340410 - Hettinger - ND - US - 46.42 - -102.46 - 0 - 0 - BIS - - - COZ090 - 60900 - Yuma_County - CO - US - 40.00 - -102.42 - 0 - 0 - GLD - - - NEZ004 - 270040 - Sheridan - NE - US - 42.50 - -102.40 - 0 - 0 - LBF - - - COZ096 - 60960 - Eastern_Kiowa_County - CO - US - 38.44 - -102.39 - 0 - 0 - PUB - - - COZ098 - 60980 - Lamar_Vicinity/Prowers_County - CO - US - 37.95 - -102.39 - 0 - 0 - PUB - - - NDZ010 - 340100 - Mountrail - ND - US - 48.16 - -102.38 - 0 - 0 - BIS - - - COZ050 - 60500 - Sedgwick_County - CO - US - 40.87 - -102.35 - 0 - 0 - BOU - - - COZ051 - 60510 - Phillips_County - CO - US - 40.59 - -102.35 - 0 - 0 - BOU - - - TXZ028 - 430280 - Lamb - TX - US - 34.07 - -102.35 - 0 - 0 - LUB - - - TXZ034 - 430340 - Hockley - TX - US - 33.61 - -102.34 - 0 - 0 - LUB - - - NEZ022 - 270220 - Garden - NE - US - 41.61 - -102.33 - 0 - 0 - LBF - - - NEZ056 - 270560 - Deuel - NE - US - 41.11 - -102.33 - 0 - 0 - LBF - - - TXZ040 - 430400 - Terry - TX - US - 33.17 - -102.33 - 0 - 0 - LUB - - - TXZ022 - 430220 - Castro - TX - US - 34.53 - -102.26 - 0 - 0 - LUB - - - TXZ082 - 430820 - Terrell - TX - US - 30.22 - -102.11 - 0 - 0 - MAF - - - TXZ069 - 430690 - Upton - TX - US - 31.37 - -102.04 - 0 - 0 - MAF - - - TXZ062 - 430620 - Midland - TX - US - 31.87 - -102.03 - 0 - 0 - MAF - - - TXZ051 - 430510 - Martin - TX - US - 32.30 - -101.95 - 0 - 0 - MAF - - - TXZ046 - 430460 - Dawson - TX - US - 32.74 - -101.94 - 0 - 0 - MAF - - - TXZ017 - 430170 - Randall - TX - US - 34.97 - -101.90 - 0 - 0 - AMA - - - TXZ002 - 430020 - Sherman - TX - US - 36.27 - -101.89 - 0 - 0 - AMA - - - TXZ007 - 430070 - Moore - TX - US - 35.84 - -101.89 - 0 - 0 - AMA - - - TXZ012 - 430120 - Potter - TX - US - 35.40 - -101.89 - 0 - 0 - AMA - - - TXZ029 - 430290 - Hale - TX - US - 34.07 - -101.82 - 0 - 0 - LUB - - - TXZ035 - 430350 - Lubbock - TX - US - 33.61 - -101.82 - 0 - 0 - LUB - - - TXZ041 - 430410 - Lynn - TX - US - 33.17 - -101.82 - 0 - 0 - LUB - - - KSZ041 - 160410 - Greeley - KS - US - 38.47 - -101.80 - 0 - 0 - GLD - - - KSZ084 - 160840 - Morton - KS - US - 37.19 - -101.80 - 0 - 0 - DDC - - - KSZ061 - 160610 - Hamilton - KS - US - 37.99 - -101.78 - 0 - 0 - DDC - - - KSZ074 - 160740 - Stanton - KS - US - 37.56 - -101.78 - 0 - 0 - DDC - - - KSZ027 - 160270 - Wallace - KS - US - 38.91 - -101.76 - 0 - 0 - GLD - - - NEZ023 - 270230 - Grant - NE - US - 41.91 - -101.75 - 0 - 0 - LBF - - - KSZ001 - 160010 - Cheyenne - KS - US - 39.78 - -101.73 - 0 - 0 - GLD - - - NDZ019 - 340190 - Mercer - ND - US - 47.28 - -101.73 - 0 - 0 - BIS - - - TXZ023 - 430230 - Swisher - TX - US - 34.53 - -101.73 - 0 - 0 - LUB - - - KSZ013 - 160130 - Sherman - KS - US - 39.35 - -101.72 - 0 - 0 - GLD - - - NEZ035 - 270350 - Arthur - NE - US - 41.56 - -101.70 - 0 - 0 - LBF - - - NEZ069 - 270690 - Chase - NE - US - 40.52 - -101.69 - 0 - 0 - LBF - - - NEZ079 - 270790 - Dundy - NE - US - 40.17 - -101.69 - 0 - 0 - GLD - - - SDZ044 - 410440 - Bennett - SD - US - 43.19 - -101.67 - 0 - 0 - UNR - - - TXZ076 - 430760 - Crockett - TX - US - 30.69 - -101.67 - 0 - 0 - SJT - - - NEZ057 - 270570 - Keith - NE - US - 41.19 - -101.65 - 0 - 0 - LBF - - - NEZ058 - 270580 - Perkins - NE - US - 40.85 - -101.65 - 0 - 0 - LBF - - - SDZ043 - 410430 - Jackson - SD - US - 43.69 - -101.61 - 0 - 0 - UNR - - - NDZ011 - 340110 - Ward - ND - US - 48.33 - -101.60 - 0 - 0 - BIS - - - NDZ042 - 340420 - Grant - ND - US - 46.37 - -101.58 - 0 - 0 - BIS - - - SDZ014 - 410140 - Ziebach - SD - US - 45.00 - -101.57 - 0 - 0 - UNR - - - NDZ003 - 340030 - Renville - ND - US - 48.73 - -101.54 - 0 - 0 - BIS - - - SDZ032 - 410320 - Haakon - SD - US - 44.37 - -101.53 - 0 - 0 - UNR - - - TXZ063 - 430630 - Glasscock - TX - US - 31.87 - -101.52 - 0 - 0 - MAF - - - TXZ070 - 430700 - Reagan - TX - US - 31.37 - -101.52 - 0 - 0 - MAF - - - OKZ002 - 360020 - Texas - OK - US - 36.74 - -101.49 - 0 - 0 - AMA - - - TXZ047 - 430470 - Borden - TX - US - 32.74 - -101.43 - 0 - 0 - MAF - - - TXZ052 - 430520 - Howard - TX - US - 32.30 - -101.43 - 0 - 0 - MAF - - - NEZ094 - 270940 - Western_Cherry - NE - US - 42.54 - -101.42 - 0 - 0 - LBF - - - TXZ013 - 430130 - Carson - TX - US - 35.40 - -101.36 - 0 - 0 - AMA - - - TXZ018 - 430180 - Armstrong - TX - US - 34.97 - -101.36 - 0 - 0 - AMA - - - TXZ003 - 430030 - Hansford - TX - US - 36.27 - -101.35 - 0 - 0 - AMA - - - TXZ008 - 430080 - Hutchinson - TX - US - 35.84 - -101.35 - 0 - 0 - AMA - - - KSZ042 - 160420 - Wichita - KS - US - 38.48 - -101.34 - 0 - 0 - GLD - - - NDZ034 - 340340 - Morton - ND - US - 46.63 - -101.33 - 0 - 0 - BIS - - - NDZ020 - 340200 - Oliver - ND - US - 47.14 - -101.32 - 0 - 0 - BIS - - - KSZ062 - 160620 - Kearny - KS - US - 37.99 - -101.31 - 0 - 0 - DDC - - - KSZ085 - 160850 - Stevens - KS - US - 37.19 - -101.31 - 0 - 0 - DDC - - - KSZ075 - 160750 - Grant - KS - US - 37.56 - -101.30 - 0 - 0 - DDC - - - TXZ030 - 430300 - Floyd - TX - US - 34.07 - -101.30 - 0 - 0 - LUB - - - TXZ036 - 430360 - Crosby - TX - US - 33.61 - -101.30 - 0 - 0 - LUB - - - TXZ042 - 430420 - Garza - TX - US - 33.17 - -101.30 - 0 - 0 - LUB - - - TXZ183 - 431830 - Val_Verde - TX - US - 29.76 - -101.22 - 0 - 0 - EWX - - - TXZ024 - 430240 - Briscoe - TX - US - 34.53 - -101.21 - 0 - 0 - LUB - - - SDZ003 - 410030 - Corson - SD - US - 45.71 - -101.15 - 0 - 0 - ABR - - - KSZ028 - 160280 - Logan - KS - US - 38.91 - -101.14 - 0 - 0 - GLD - - - NEZ024 - 270240 - Hooker - NE - US - 41.91 - -101.13 - 0 - 0 - LBF - - - KSZ002 - 160020 - Rawlins - KS - US - 39.78 - -101.07 - 0 - 0 - GLD - - - NEZ036 - 270360 - McPherson - NE - US - 41.56 - -101.06 - 0 - 0 - LBF - - - NEZ070 - 270700 - Hayes - NE - US - 40.52 - -101.06 - 0 - 0 - LBF - - - KSZ014 - 160140 - Thomas - KS - US - 39.35 - -101.05 - 0 - 0 - GLD - - - NDZ021 - 340210 - McLean - ND - US - 47.51 - -101.04 - 0 - 0 - BIS - - - NEZ080 - 270800 - Hitchcock - NE - US - 40.17 - -101.04 - 0 - 0 - GLD - - - TXZ064 - 430640 - Sterling - TX - US - 31.83 - -101.04 - 0 - 0 - SJT - - - TXZ071 - 430710 - Irion - TX - US - 31.31 - -100.98 - 0 - 0 - SJT - - - TXZ048 - 430480 - Scurry - TX - US - 32.74 - -100.92 - 0 - 0 - MAF - - - TXZ053 - 430530 - Mitchell - TX - US - 32.30 - -100.92 - 0 - 0 - MAF - - - KSZ043 - 160430 - Scott - KS - US - 38.48 - -100.90 - 0 - 0 - DDC - - - NDZ045 - 340450 - Sioux - ND - US - 46.19 - -100.90 - 0 - 0 - BIS - - - SDZ015 - 410150 - Dewey - SD - US - 45.10 - -100.89 - 0 - 0 - ABR - - - SDZ033 - 410330 - Stanley - SD - US - 44.48 - -100.88 - 0 - 0 - ABR - - - KSZ076 - 160760 - Haskell - KS - US - 37.56 - -100.86 - 0 - 0 - DDC - - - KSZ086 - 160860 - Seward - KS - US - 37.19 - -100.85 - 0 - 0 - DDC - - - NDZ004 - 340040 - Bottineau - ND - US - 48.77 - -100.82 - 0 - 0 - BIS - - - TXZ004 - 430040 - Ochiltree - TX - US - 36.27 - -100.82 - 0 - 0 - AMA - - - TXZ009 - 430090 - Roberts - TX - US - 35.84 - -100.82 - 0 - 0 - AMA - - - TXZ014 - 430140 - Gray - TX - US - 35.40 - -100.81 - 0 - 0 - AMA - - - TXZ019 - 430190 - Donley - TX - US - 34.96 - -100.81 - 0 - 0 - AMA - - - TXZ031 - 430310 - Motley - TX - US - 34.08 - -100.78 - 0 - 0 - LUB - - - TXZ037 - 430370 - Dickens - TX - US - 33.62 - -100.78 - 0 - 0 - LUB - - - TXZ043 - 430430 - Kent - TX - US - 33.18 - -100.78 - 0 - 0 - LUB - - - NEZ059 - 270590 - Lincoln - NE - US - 41.04 - -100.74 - 0 - 0 - LBF - - - SDZ046 - 410460 - Mellette - SD - US - 43.63 - -100.72 - 0 - 0 - UNR - - - SDZ047 - 410470 - Todd - SD - US - 43.19 - -100.72 - 0 - 0 - UNR - - - SDZ045 - 410450 - Jones - SD - US - 43.95 - -100.71 - 0 - 0 - ABR - - - TXZ025 - 430250 - Hall - TX - US - 34.53 - -100.68 - 0 - 0 - LUB - - - KSZ063 - 160630 - Finney - KS - US - 37.99 - -100.66 - 0 - 0 - DDC - - - NDZ012 - 340120 - McHenry - ND - US - 48.24 - -100.63 - 0 - 0 - BIS - - - NEZ025 - 270250 - Thomas - NE - US - 41.91 - -100.55 - 0 - 0 - LBF - - - TXZ077 - 430770 - Schleicher - TX - US - 30.89 - -100.54 - 0 - 0 - SJT - - - TXZ078 - 430780 - Sutton - TX - US - 30.49 - -100.54 - 0 - 0 - SJT - - - NEZ005 - 270050 - Eastern_Cherry - NE - US - 42.53 - -100.53 - 0 - 0 - LBF - - - TXZ065 - 430650 - Coke - TX - US - 31.89 - -100.53 - 0 - 0 - SJT - - - NDZ035 - 340350 - Burleigh - ND - US - 46.98 - -100.52 - 0 - 0 - BIS - - - KSZ029 - 160290 - Gove - KS - US - 38.91 - -100.48 - 0 - 0 - GLD - - - NEZ037 - 270370 - Logan - NE - US - 41.57 - -100.48 - 0 - 0 - LBF - - - OKZ003 - 360030 - Beaver - OK - US - 36.74 - -100.48 - 0 - 0 - AMA - - - NEZ081 - 270810 - Red_Willow - NE - US - 40.17 - -100.47 - 0 - 0 - GLD - - - KSZ003 - 160030 - Decatur - KS - US - 39.78 - -100.46 - 0 - 0 - GLD - - - KSZ044 - 160440 - Lane - KS - US - 38.47 - -100.46 - 0 - 0 - DDC - - - TXZ202 - 432020 - Kinney - TX - US - 29.35 - -100.45 - 0 - 0 - EWX - - - KSZ015 - 160150 - Sheridan - KS - US - 39.35 - -100.44 - 0 - 0 - GLD - - - KSZ077 - 160770 - Gray - KS - US - 37.73 - -100.43 - 0 - 0 - DDC - - - TXZ049 - 430490 - Fisher - TX - US - 32.74 - -100.41 - 0 - 0 - SJT - - - TXZ054 - 430540 - Nolan - TX - US - 32.30 - -100.41 - 0 - 0 - SJT - - - TXZ072 - 430720 - Tom_Green - TX - US - 31.39 - -100.40 - 0 - 0 - SJT - - - TXZ217 - 432170 - Maverick - TX - US - 28.65 - -100.39 - 0 - 0 - EWX - - - KSZ087 - 160870 - Meade - KS - US - 37.23 - -100.37 - 0 - 0 - DDC - - - NEZ071 - 270710 - Frontier - NE - US - 40.52 - -100.37 - 0 - 0 - LBF - - - NDZ022 - 340220 - Sheridan - ND - US - 47.59 - -100.36 - 0 - 0 - BIS - - - TXZ005 - 430050 - Lipscomb - TX - US - 36.28 - -100.27 - 0 - 0 - AMA - - - TXZ010 - 430100 - Hemphill - TX - US - 35.84 - -100.27 - 0 - 0 - AMA - - - TXZ015 - 430150 - Wheeler - TX - US - 35.40 - -100.27 - 0 - 0 - AMA - - - TXZ020 - 430200 - Collingsworth - TX - US - 34.96 - -100.27 - 0 - 0 - AMA - - - NDZ046 - 340460 - Emmons - ND - US - 46.29 - -100.26 - 0 - 0 - BIS - - - TXZ032 - 430320 - Cottle - TX - US - 34.08 - -100.26 - 0 - 0 - LUB - - - TXZ038 - 430380 - King - TX - US - 33.62 - -100.26 - 0 - 0 - LUB - - - TXZ044 - 430440 - Stonewall - TX - US - 33.18 - -100.26 - 0 - 0 - LUB - - - TXZ184 - 431840 - Edwards - TX - US - 29.96 - -100.22 - 0 - 0 - EWX - - - TXZ026 - 430260 - Childress - TX - US - 34.53 - -100.21 - 0 - 0 - LUB - - - SDZ034 - 410340 - Sully - SD - US - 44.72 - -100.20 - 0 - 0 - ABR - - - SDZ004 - 410040 - Campbell - SD - US - 45.77 - -100.12 - 0 - 0 - ABR - - - SDZ009 - 410090 - Walworth - SD - US - 45.43 - -100.10 - 0 - 0 - ABR - - - SDZ035 - 410350 - Hughes - SD - US - 44.33 - -100.10 - 0 - 0 - ABR - - - SDZ016 - 410160 - Potter - SD - US - 45.07 - -100.00 - 0 - 0 - ABR - - - NEZ026 - 270260 - Blaine - NE - US - 41.91 - -99.97 - 0 - 0 - LBF - - - TXZ066 - 430660 - Runnels - TX - US - 31.83 - -99.97 - 0 - 0 - SJT - - - NEZ008 - 270080 - Brown - NE - US - 42.46 - -99.93 - 0 - 0 - LBF - - - KSZ045 - 160450 - Ness - KS - US - 38.47 - -99.91 - 0 - 0 - DDC - - - NEZ082 - 270820 - Furnas - NE - US - 40.17 - -99.91 - 0 - 0 - GID - - - KSZ004 - 160040 - Norton - KS - US - 39.78 - -99.90 - 0 - 0 - GLD - - - KSZ064 - 160640 - Hodgeman - KS - US - 38.08 - -99.89 - 0 - 0 - DDC - - - KSZ078 - 160780 - Ford - KS - US - 37.69 - -99.89 - 0 - 0 - DDC - - - NDZ013 - 340130 - Pierce - ND - US - 48.20 - -99.89 - 0 - 0 - BIS - - - TXZ127 - 431270 - Taylor - TX - US - 32.30 - -99.89 - 0 - 0 - SJT - - - KSZ016 - 160160 - Graham - KS - US - 39.34 - -99.88 - 0 - 0 - GLD - - - SDZ049 - 410490 - Tripp - SD - US - 43.38 - -99.88 - 0 - 0 - UNR - - - TXZ113 - 431130 - Jones - TX - US - 32.74 - -99.88 - 0 - 0 - SJT - - - KSZ030 - 160300 - Trego - KS - US - 38.91 - -99.87 - 0 - 0 - DDC - - - NEZ072 - 270720 - Gosper - NE - US - 40.52 - -99.86 - 0 - 0 - GID - - - TXZ073 - 430730 - Concho - TX - US - 31.34 - -99.86 - 0 - 0 - SJT - - - NDZ005 - 340050 - Rolette - ND - US - 48.77 - -99.84 - 0 - 0 - BIS - - - OKZ033 - 360330 - Harmon - OK - US - 34.77 - -99.83 - 0 - 0 - OUN - - - SDZ048 - 410480 - Lyman - SD - US - 43.86 - -99.83 - 0 - 0 - ABR - - - TXZ185 - 431850 - Real - TX - US - 29.86 - -99.83 - 0 - 0 - EWX - - - KSZ088 - 160880 - Clark - KS - US - 37.23 - -99.82 - 0 - 0 - DDC - - - NEZ060 - 270600 - Dawson - NE - US - 40.86 - -99.81 - 0 - 0 - GID - - - TXZ168 - 431680 - Menard - TX - US - 30.90 - -99.80 - 0 - 0 - SJT - - - NDZ036 - 340360 - Kidder - ND - US - 46.98 - -99.79 - 0 - 0 - BIS - - - TXZ203 - 432030 - Uvalde - TX - US - 29.36 - -99.77 - 0 - 0 - EWX - - - TXZ084 - 430840 - Foard - TX - US - 33.99 - -99.76 - 0 - 0 - OUN - - - TXZ218 - 432180 - Zavala - TX - US - 28.87 - -99.76 - 0 - 0 - EWX - - - TXZ228 - 432280 - Dimmit - TX - US - 28.42 - -99.75 - 0 - 0 - EWX - - - TXZ083 - 430830 - Hardeman - TX - US - 34.32 - -99.74 - 0 - 0 - OUN - - - NEZ006 - 270060 - Keya_Paha - NE - US - 42.85 - -99.73 - 0 - 0 - LBF - - - TXZ087 - 430870 - Knox - TX - US - 33.61 - -99.73 - 0 - 0 - OUN - - - TXZ098 - 430980 - Haskell - TX - US - 33.18 - -99.73 - 0 - 0 - SJT - - - NEZ038 - 270380 - Custer - NE - US - 41.39 - -99.72 - 0 - 0 - LBF - - - TXZ169 - 431690 - Kimble - TX - US - 30.50 - -99.71 - 0 - 0 - SJT - - - OKZ009 - 360090 - Ellis - OK - US - 36.22 - -99.69 - 0 - 0 - OUN - - - OKZ014 - 360140 - Roger_Mills - OK - US - 35.72 - -99.68 - 0 - 0 - OUN - - - OKZ021 - 360210 - Beckham - OK - US - 35.27 - -99.68 - 0 - 0 - OUN - - - NDZ023 - 340230 - Wells - ND - US - 47.59 - -99.67 - 0 - 0 - BIS - - - OKZ004 - 360040 - Harper - OK - US - 36.79 - -99.65 - 0 - 0 - OUN - - - OKZ034 - 360340 - Greer - OK - US - 34.92 - -99.56 - 0 - 0 - OUN - - - TXZ239 - 432390 - Webb - TX - US - 27.73 - -99.51 - 0 - 0 - CRP - - - SDZ036 - 410360 - Hyde - SD - US - 44.55 - -99.49 - 0 - 0 - ABR - - - NDZ047 - 340470 - Logan - ND - US - 46.46 - -99.48 - 0 - 0 - BIS - - - TXZ139 - 431390 - Coleman - TX - US - 31.75 - -99.46 - 0 - 0 - SJT - - - NEZ009 - 270090 - Rock - NE - US - 42.44 - -99.45 - 0 - 0 - LBF - - - NEZ027 - 270270 - Loup - NE - US - 41.91 - -99.45 - 0 - 0 - LBF - - - NDZ050 - 340500 - McIntosh - ND - US - 46.11 - -99.44 - 0 - 0 - BIS - - - OKZ036 - 360360 - Jackson - OK - US - 34.59 - -99.44 - 0 - 0 - OUN - - - NEZ073 - 270730 - Phelps - NE - US - 40.51 - -99.41 - 0 - 0 - GID - - - NEZ083 - 270830 - Harlan - NE - US - 40.17 - -99.40 - 0 - 0 - GID - - - TXZ128 - 431280 - Callahan - TX - US - 32.30 - -99.37 - 0 - 0 - SJT - - - TXZ114 - 431140 - Shackelford - TX - US - 32.74 - -99.36 - 0 - 0 - SJT - - - TXZ154 - 431540 - McCulloch - TX - US - 31.22 - -99.35 - 0 - 0 - SJT - - - KSZ005 - 160050 - Phillips - KS - US - 39.78 - -99.34 - 0 - 0 - GID - - - TXZ186 - 431860 - Kerr - TX - US - 30.04 - -99.34 - 0 - 0 - EWX - - - KSZ017 - 160170 - Rooks - KS - US - 39.35 - -99.32 - 0 - 0 - GID - - - KSZ031 - 160310 - Ellis - KS - US - 38.91 - -99.31 - 0 - 0 - DDC - - - KSZ046 - 160460 - Rush - KS - US - 38.52 - -99.30 - 0 - 0 - DDC - - - KSZ079 - 160790 - Edwards - KS - US - 37.90 - -99.29 - 0 - 0 - DDC - - - KSZ080 - 160800 - Kiowa - KS - US - 37.55 - -99.28 - 0 - 0 - DDC - - - OKZ010 - 360100 - Woodward - OK - US - 36.48 - -99.28 - 0 - 0 - OUN - - - KSZ089 - 160890 - Comanche - KS - US - 37.19 - -99.27 - 0 - 0 - DDC - - - NDZ006 - 340060 - Towner - ND - US - 48.69 - -99.25 - 0 - 0 - FGF - - - SDZ051 - 410510 - Buffalo - SD - US - 44.06 - -99.25 - 0 - 0 - ABR - - - KSZ065 - 160650 - Pawnee - KS - US - 38.17 - -99.24 - 0 - 0 - DDC - - - SDZ005 - 410050 - McPherson - SD - US - 45.77 - -99.23 - 0 - 0 - ABR - - - SDZ010 - 410100 - Edmunds - SD - US - 45.42 - -99.22 - 0 - 0 - ABR - - - TXZ085 - 430850 - Wilbarger - TX - US - 34.14 - -99.22 - 0 - 0 - OUN - - - TXZ170 - 431700 - Mason - TX - US - 30.72 - -99.22 - 0 - 0 - SJT - - - TXZ088 - 430880 - Baylor - TX - US - 33.62 - -99.21 - 0 - 0 - OUN - - - TXZ099 - 430990 - Throckmorton - TX - US - 33.18 - -99.21 - 0 - 0 - SJT - - - TXZ187 - 431870 - Bandera - TX - US - 29.74 - -99.21 - 0 - 0 - EWX - - - TXZ248 - 432480 - Zapata - TX - US - 26.94 - -99.21 - 0 - 0 - BRO - - - NDZ014 - 340140 - Benson - ND - US - 48.11 - -99.19 - 0 - 0 - FGF - - - SDZ017 - 410170 - Faulk - SD - US - 45.07 - -99.15 - 0 - 0 - ABR - - - SDZ057 - 410570 - Brule - SD - US - 43.72 - -99.13 - 0 - 0 - FSD - - - TXZ204 - 432040 - Medina - TX - US - 29.39 - -99.11 - 0 - 0 - EWX - - - TXZ219 - 432190 - Frio - TX - US - 28.87 - -99.11 - 0 - 0 - EWX - - - TXZ229 - 432290 - La_Salle - TX - US - 28.34 - -99.10 - 0 - 0 - CRP - - - NEZ061 - 270610 - Buffalo - NE - US - 40.85 - -99.07 - 0 - 0 - GID - - - SDZ050 - 410500 - Gregory - SD - US - 43.25 - -99.02 - 0 - 0 - FSD - - - OKZ015 - 360150 - Dewey - OK - US - 35.99 - -99.01 - 0 - 0 - OUN - - - OKZ035 - 360350 - Kiowa - OK - US - 34.86 - -99.01 - 0 - 0 - OUN - - - SDZ037 - 410370 - Hand - SD - US - 44.55 - -99.01 - 0 - 0 - ABR - - - OKZ016 - 360160 - Custer - OK - US - 35.64 - -99.00 - 0 - 0 - OUN - - - NEZ028 - 270280 - Garfield - NE - US - 41.91 - -98.99 - 0 - 0 - LBF - - - NEZ039 - 270390 - Valley - NE - US - 41.56 - -98.98 - 0 - 0 - GID - - - OKZ005 - 360050 - Woods - OK - US - 36.69 - -98.98 - 0 - 0 - OUN - - - OKZ022 - 360220 - Washita - OK - US - 35.29 - -98.98 - 0 - 0 - OUN - - - NEZ046 - 270460 - Sherman - NE - US - 41.22 - -98.97 - 0 - 0 - GID - - - NDZ037 - 340370 - Stutsman - ND - US - 46.98 - -98.96 - 0 - 0 - BIS - - - NEZ074 - 270740 - Kearney - NE - US - 40.51 - -98.95 - 0 - 0 - GID - - - NEZ084 - 270840 - Franklin - NE - US - 40.17 - -98.95 - 0 - 0 - GID - - - TXZ188 - 431880 - Gillespie - TX - US - 30.32 - -98.95 - 0 - 0 - EWX - - - TXZ140 - 431400 - Brown - TX - US - 31.77 - -98.94 - 0 - 0 - SJT - - - OKZ037 - 360370 - Tillman - OK - US - 34.38 - -98.92 - 0 - 0 - OUN - - - NDZ024 - 340240 - Eddy - ND - US - 47.72 - -98.90 - 0 - 0 - FGF - - - NDZ025 - 340250 - Foster - ND - US - 47.46 - -98.89 - 0 - 0 - BIS - - - TXZ115 - 431150 - Stephens - TX - US - 32.74 - -98.83 - 0 - 0 - FWD - - - TXZ129 - 431290 - Eastland - TX - US - 32.30 - -98.80 - 0 - 0 - FWD - - - KSZ006 - 160060 - Smith - KS - US - 39.78 - -98.78 - 0 - 0 - GID - - - NEZ007 - 270070 - Boyd - NE - US - 42.88 - -98.77 - 0 - 0 - LBF - - - NEZ010 - 270100 - Holt - NE - US - 42.49 - -98.77 - 0 - 0 - LBF - - - KSZ018 - 160180 - Osborne - KS - US - 39.34 - -98.76 - 0 - 0 - GID - - - KSZ032 - 160320 - Russell - KS - US - 38.91 - -98.76 - 0 - 0 - ICT - - - TXZ252 - 432520 - Starr - TX - US - 26.52 - -98.76 - 0 - 0 - BRO - - - KSZ047 - 160470 - Barton - KS - US - 38.47 - -98.75 - 0 - 0 - ICT - - - NDZ015 - 340150 - Ramsey - ND - US - 48.23 - -98.75 - 0 - 0 - FGF - - - TXZ155 - 431550 - San_Saba - TX - US - 31.21 - -98.75 - 0 - 0 - SJT - - - KSZ066 - 160660 - Stafford - KS - US - 38.03 - -98.74 - 0 - 0 - DDC - - - KSZ081 - 160810 - Pratt - KS - US - 37.64 - -98.73 - 0 - 0 - DDC - - - TXZ249 - 432490 - Jim_Hogg - TX - US - 27.08 - -98.70 - 0 - 0 - BRO - - - SDZ063 - 410630 - Charles_Mix - SD - US - 43.17 - -98.69 - 0 - 0 - FSD - - - TXZ086 - 430860 - Wichita - TX - US - 34.01 - -98.69 - 0 - 0 - OUN - - - KSZ090 - 160900 - Barber - KS - US - 37.23 - -98.68 - 0 - 0 - DDC - - - TXZ089 - 430890 - Archer - TX - US - 33.62 - -98.68 - 0 - 0 - OUN - - - TXZ100 - 431000 - Young - TX - US - 33.18 - -98.68 - 0 - 0 - FWD - - - TXZ189 - 431890 - Kendall - TX - US - 29.93 - -98.67 - 0 - 0 - EWX - - - TXZ171 - 431710 - Llano - TX - US - 30.71 - -98.65 - 0 - 0 - EWX - - - SDZ052 - 410520 - Jerauld - SD - US - 44.07 - -98.63 - 0 - 0 - FSD - - - TXZ142 - 431420 - Mills - TX - US - 31.48 - -98.63 - 0 - 0 - FWD - - - SDZ058 - 410580 - Aurora - SD - US - 43.72 - -98.57 - 0 - 0 - FSD - - - TXZ230 - 432300 - McMullen - TX - US - 28.35 - -98.57 - 0 - 0 - CRP - - - NDZ048 - 340480 - La_Moure - ND - US - 46.46 - -98.54 - 0 - 0 - BIS - - - TXZ141 - 431410 - Comanche - TX - US - 31.98 - -98.54 - 0 - 0 - FWD - - - OKZ011 - 360110 - Major - OK - US - 36.33 - -98.53 - 0 - 0 - OUN - - - NEZ029 - 270290 - Wheeler - NE - US - 41.91 - -98.52 - 0 - 0 - LBF - - - NEZ040 - 270400 - Greeley - NE - US - 41.57 - -98.52 - 0 - 0 - GID - - - TXZ240 - 432400 - Duval - TX - US - 27.66 - -98.52 - 0 - 0 - CRP - - - NDZ051 - 340510 - Dickey - ND - US - 46.11 - -98.51 - 0 - 0 - BIS - - - NEZ047 - 270470 - Howard - NE - US - 41.22 - -98.51 - 0 - 0 - GID - - - NEZ062 - 270620 - Hall - NE - US - 40.87 - -98.50 - 0 - 0 - GID - - - NEZ075 - 270750 - Adams - NE - US - 40.52 - -98.50 - 0 - 0 - GID - - - NEZ085 - 270850 - Webster - NE - US - 40.17 - -98.49 - 0 - 0 - GID - - - TXZ205 - 432050 - Bexar - TX - US - 29.44 - -98.47 - 0 - 0 - EWX - - - NDZ007 - 340070 - Cavalier - ND - US - 48.77 - -98.46 - 0 - 0 - FGF - - - OKZ038 - 360380 - Comanche - OK - US - 34.63 - -98.46 - 0 - 0 - OUN - - - TXZ220 - 432200 - Atascosa - TX - US - 28.93 - -98.45 - 0 - 0 - EWX - - - OKZ017 - 360170 - Blaine - OK - US - 35.86 - -98.42 - 0 - 0 - OUN - - - SDZ064 - 410640 - Douglas - SD - US - 43.35 - -98.41 - 0 - 0 - FSD - - - OKZ044 - 360440 - Cotton - OK - US - 34.28 - -98.40 - 0 - 0 - OUN - - - SDZ006 - 410060 - Brown - SD - US - 45.59 - -98.36 - 0 - 0 - ABR - - - TXZ190 - 431900 - Blanco - TX - US - 30.23 - -98.36 - 0 - 0 - EWX - - - OKZ023 - 360230 - Caddo - OK - US - 35.21 - -98.35 - 0 - 0 - OUN - - - SDZ018 - 410180 - Spink - SD - US - 44.94 - -98.35 - 0 - 0 - ABR - - - TXZ206 - 432060 - Comal - TX - US - 29.82 - -98.33 - 0 - 0 - EWX - - - OKZ006 - 360060 - Alfalfa - OK - US - 36.73 - -98.32 - 0 - 0 - OUN - - - TXZ116 - 431160 - Palo_Pinto - TX - US - 32.76 - -98.31 - 0 - 0 - FWD - - - SDZ038 - 410380 - Beadle - SD - US - 44.41 - -98.28 - 0 - 0 - FSD - - - TXZ250 - 432500 - Brooks - TX - US - 27.03 - -98.26 - 0 - 0 - BRO - - - TXZ156 - 431560 - Lampasas - TX - US - 31.25 - -98.24 - 0 - 0 - FWD - - - NDZ028 - 340280 - Griggs - ND - US - 47.46 - -98.23 - 0 - 0 - FGF - - - TXZ253 - 432530 - Hidalgo - TX - US - 26.41 - -98.23 - 0 - 0 - BRO - - - KSZ007 - 160070 - Jewell - KS - US - 39.78 - -98.22 - 0 - 0 - GID - - - KSZ033 - 160330 - Lincoln - KS - US - 39.04 - -98.21 - 0 - 0 - ICT - - - TXZ130 - 431300 - Erath - TX - US - 32.22 - -98.21 - 0 - 0 - FWD - - - KSZ019 - 160190 - Mitchell - KS - US - 39.39 - -98.20 - 0 - 0 - GID - - - KSZ048 - 160480 - Ellsworth - KS - US - 38.69 - -98.20 - 0 - 0 - ICT - - - KSZ050 - 160500 - Rice - KS - US - 38.33 - -98.20 - 0 - 0 - ICT - - - NDZ026 - 340260 - Nelson - ND - US - 47.94 - -98.20 - 0 - 0 - FGF - - - TXZ090 - 430900 - Clay - TX - US - 33.81 - -98.18 - 0 - 0 - OUN - - - TXZ101 - 431010 - Jack - TX - US - 33.24 - -98.17 - 0 - 0 - FWD - - - SDZ059 - 410590 - Davison - SD - US - 43.67 - -98.15 - 0 - 0 - FSD - - - TXZ172 - 431720 - Burnet - TX - US - 30.74 - -98.15 - 0 - 0 - EWX - - - KSZ082 - 160820 - Kingman - KS - US - 37.55 - -98.13 - 0 - 0 - ICT - - - TXZ143 - 431430 - Hamilton - TX - US - 31.72 - -98.11 - 0 - 0 - FWD - - - SDZ053 - 410530 - Sanborn - SD - US - 44.02 - -98.10 - 0 - 0 - FSD - - - NDZ054 - 340540 - Western_Walsh_County - ND - US - 48.37 - -98.09 - 0 - 0 - FGF - - - KSZ067 - 160670 - Reno - KS - US - 37.95 - -98.08 - 0 - 0 - ICT - - - NDZ038 - 340380 - Barnes - ND - US - 46.94 - -98.08 - 0 - 0 - FGF - - - TXZ221 - 432210 - Wilson - TX - US - 29.16 - -98.08 - 0 - 0 - EWX - - - TXZ231 - 432310 - Live_Oak - TX - US - 28.42 - -98.08 - 0 - 0 - CRP - - - KSZ091 - 160910 - Harper - KS - US - 37.19 - -98.07 - 0 - 0 - ICT - - - NEZ016 - 270160 - Antelope - NE - US - 42.17 - -98.07 - 0 - 0 - OAX - - - NEZ030 - 270300 - Boone - NE - US - 41.70 - -98.06 - 0 - 0 - OAX - - - NEZ063 - 270630 - Hamilton - NE - US - 40.93 - -98.05 - 0 - 0 - GID - - - NEZ076 - 270760 - Clay - NE - US - 40.52 - -98.05 - 0 - 0 - GID - - - NEZ086 - 270860 - Nuckolls - NE - US - 40.17 - -98.04 - 0 - 0 - GID - - - TXZ191 - 431910 - Hays - TX - US - 30.05 - -98.02 - 0 - 0 - EWX - - - TXZ241 - 432410 - Jim_Wells - TX - US - 27.66 - -98.02 - 0 - 0 - CRP - - - NEZ041 - 270410 - Nance - NE - US - 41.39 - -97.99 - 0 - 0 - GID - - - OKZ024 - 360240 - Canadian - OK - US - 35.53 - -97.99 - 0 - 0 - OUN - - - TXZ207 - 432070 - Guadalupe - TX - US - 29.62 - -97.98 - 0 - 0 - EWX - - - NEZ048 - 270480 - Merrick - NE - US - 41.13 - -97.94 - 0 - 0 - GID - - - OKZ018 - 360180 - Kingfisher - OK - US - 35.95 - -97.94 - 0 - 0 - OUN - - - NEZ011 - 270110 - Knox - NE - US - 42.66 - -97.90 - 0 - 0 - OAX - - - SDZ068 - 410680 - Bon_Homme - SD - US - 42.97 - -97.90 - 0 - 0 - FSD - - - OKZ027 - 360270 - Grady - OK - US - 35.03 - -97.88 - 0 - 0 - OUN - - - TXZ222 - 432220 - Karnes - TX - US - 28.95 - -97.88 - 0 - 0 - EWX - - - OKZ039 - 360390 - Stephens - OK - US - 34.49 - -97.85 - 0 - 0 - OUN - - - TXZ131 - 431310 - Hood - TX - US - 32.40 - -97.84 - 0 - 0 - FWD - - - OKZ045 - 360450 - Jefferson - OK - US - 34.07 - -97.83 - 0 - 0 - OUN - - - TXZ117 - 431170 - Parker - TX - US - 32.78 - -97.80 - 0 - 0 - FWD - - - TXZ157 - 431570 - Coryell - TX - US - 31.39 - -97.80 - 0 - 0 - FWD - - - SDZ060 - 410600 - Hanson - SD - US - 43.67 - -97.79 - 0 - 0 - FSD - - - OKZ007 - 360070 - Grant - OK - US - 36.79 - -97.78 - 0 - 0 - OUN - - - OKZ012 - 360120 - Garfield - OK - US - 36.38 - -97.78 - 0 - 0 - OUN - - - TXZ132 - 431320 - Somervell - TX - US - 32.21 - -97.78 - 0 - 0 - FWD - - - TXZ192 - 431920 - Travis - TX - US - 30.33 - -97.77 - 0 - 0 - EWX - - - SDZ065 - 410650 - Hutchinson - SD - US - 43.33 - -97.76 - 0 - 0 - FSD - - - SDZ019 - 410190 - Clark - SD - US - 44.85 - -97.74 - 0 - 0 - ABR - - - TXZ091 - 430910 - Montague - TX - US - 33.71 - -97.73 - 0 - 0 - FWD - - - TXZ232 - 432320 - Bee - TX - US - 28.42 - -97.73 - 0 - 0 - CRP - - - TXZ254 - 432540 - Inland_Willacy - TX - US - 26.46 - -97.73 - 0 - 0 - BRO - - - NDZ029 - 340290 - Steele - ND - US - 47.46 - -97.72 - 0 - 0 - FGF - - - NDZ049 - 340490 - Ransom - ND - US - 46.46 - -97.66 - 0 - 0 - FGF - - - TXZ102 - 431020 - Wise - TX - US - 33.22 - -97.65 - 0 - 0 - FWD - - - KSZ008 - 160080 - Republic - KS - US - 39.82 - -97.64 - 0 - 0 - TOP - - - KSZ020 - 160200 - Cloud - KS - US - 39.48 - -97.64 - 0 - 0 - TOP - - - KSZ034 - 160340 - Ottawa - KS - US - 39.13 - -97.64 - 0 - 0 - TOP - - - KSZ049 - 160490 - Saline - KS - US - 38.78 - -97.64 - 0 - 0 - ICT - - - KSZ051 - 160510 - McPherson - KS - US - 38.38 - -97.64 - 0 - 0 - ICT - - - TXZ144 - 431440 - Bosque - TX - US - 31.90 - -97.64 - 0 - 0 - FWD - - - TXZ242 - 432420 - Kleberg - TX - US - 27.43 - -97.64 - 0 - 0 - CRP - - - TXZ251 - 432510 - Kenedy - TX - US - 26.94 - -97.64 - 0 - 0 - BRO - - - NDZ052 - 340520 - Sargent - ND - US - 46.11 - -97.62 - 0 - 0 - FGF - - - TXZ208 - 432080 - Caldwell - TX - US - 29.86 - -97.62 - 0 - 0 - EWX - - - SDZ011 - 410110 - Day - SD - US - 45.37 - -97.61 - 0 - 0 - ABR - - - SDZ054 - 410540 - Miner - SD - US - 44.02 - -97.61 - 0 - 0 - FSD - - - NEZ017 - 270170 - Pierce - NE - US - 42.26 - -97.60 - 0 - 0 - OAX - - - NEZ031 - 270310 - Madison - NE - US - 41.91 - -97.60 - 0 - 0 - OAX - - - SDZ007 - 410070 - Marshall - SD - US - 45.75 - -97.60 - 0 - 0 - ABR - - - TXZ173 - 431730 - Williamson - TX - US - 30.66 - -97.60 - 0 - 0 - EWX - - - NEZ049 - 270490 - Polk - NE - US - 41.22 - -97.59 - 0 - 0 - GID - - - NEZ064 - 270640 - York - NE - US - 40.87 - -97.59 - 0 - 0 - GID - - - NEZ077 - 270770 - Fillmore - NE - US - 40.52 - -97.59 - 0 - 0 - GID - - - NEZ087 - 270870 - Thayer - NE - US - 40.17 - -97.59 - 0 - 0 - GID - - - TXZ255 - 432550 - Inland_Cameron - TX - US - 26.10 - -97.56 - 0 - 0 - BRO - - - NEZ042 - 270420 - Platte - NE - US - 41.54 - -97.54 - 0 - 0 - OAX - - - OKZ028 - 360280 - McClain - OK - US - 35.10 - -97.54 - 0 - 0 - OUN - - - NDZ008 - 340080 - Pembina - ND - US - 48.77 - -97.52 - 0 - 0 - FGF - - - TXZ244 - 432440 - San_Patricio - TX - US - 27.99 - -97.52 - 0 - 0 - CRP - - - TXZ158 - 431580 - Bell - TX - US - 31.05 - -97.50 - 0 - 0 - FWD - - - TXZ223 - 432230 - Gonzales - TX - US - 29.45 - -97.50 - 0 - 0 - EWX - - - TXZ243 - 432430 - Nueces - TX - US - 27.78 - -97.50 - 0 - 0 - CRP - - - NDZ016 - 340160 - Eastern_Walsh_County - ND - US - 48.37 - -97.49 - 0 - 0 - FGF - - - SDZ039 - 410390 - Kingsbury - SD - US - 44.37 - -97.49 - 0 - 0 - FSD - - - TXZ256 - 432560 - Coastal_Willacy - TX - US - 26.47 - -97.49 - 0 - 0 - BRO - - - KSZ083 - 160830 - Sedgwick - KS - US - 37.69 - -97.47 - 0 - 0 - ICT - - - KSZ092 - 160920 - Sumner - KS - US - 37.23 - -97.47 - 0 - 0 - ICT - - - TXZ233 - 432330 - Goliad - TX - US - 28.65 - -97.47 - 0 - 0 - CRP - - - KSZ068 - 160680 - Harvey - KS - US - 38.04 - -97.42 - 0 - 0 - ICT - - - OKZ019 - 360190 - Logan - OK - US - 35.95 - -97.41 - 0 - 0 - OUN - - - NDZ027 - 340270 - Grand_Forks - ND - US - 47.93 - -97.40 - 0 - 0 - FGF - - - OKZ025 - 360250 - Oklahoma - OK - US - 35.55 - -97.40 - 0 - 0 - OUN - - - OKZ029 - 360290 - Cleveland - OK - US - 35.16 - -97.40 - 0 - 0 - OUN - - - SDZ069 - 410690 - Yankton - SD - US - 42.99 - -97.40 - 0 - 0 - FSD - - - SDZ061 - 410610 - McCook - SD - US - 43.67 - -97.37 - 0 - 0 - FSD - - - TXZ224 - 432240 - DeWitt - TX - US - 29.10 - -97.37 - 0 - 0 - EWX - - - TXZ133 - 431330 - Johnson - TX - US - 32.35 - -97.35 - 0 - 0 - FWD - - - TXZ193 - 431930 - Bastrop - TX - US - 30.10 - -97.35 - 0 - 0 - EWX - - - TXZ257 - 432570 - Coastal_Cameron - TX - US - 26.20 - -97.34 - 0 - 0 - BRO - - - OKZ040 - 360400 - Garvin - OK - US - 34.69 - -97.30 - 0 - 0 - OUN - - - TXZ118 - 431180 - Tarrant - TX - US - 32.78 - -97.29 - 0 - 0 - FWD - - - NEZ012 - 270120 - Cedar - NE - US - 42.61 - -97.25 - 0 - 0 - OAX - - - OKZ046 - 360460 - Carter - OK - US - 34.29 - -97.24 - 0 - 0 - OUN - - - OKZ050 - 360500 - Love - OK - US - 33.90 - -97.24 - 0 - 0 - OUN - - - NDZ039 - 340390 - Cass - ND - US - 46.94 - -97.23 - 0 - 0 - FGF - - - TXZ092 - 430920 - Cooke - TX - US - 33.69 - -97.21 - 0 - 0 - FWD - - - TXZ159 - 431590 - McLennan - TX - US - 31.56 - -97.20 - 0 - 0 - FWD - - - NEZ032 - 270320 - Stanton - NE - US - 41.92 - -97.19 - 0 - 0 - OAX - - - SDZ020 - 410200 - Codington - SD - US - 44.98 - -97.19 - 0 - 0 - ABR - - - SDZ022 - 410220 - Hamlin - SD - US - 44.67 - -97.19 - 0 - 0 - ABR - - - OKZ013 - 360130 - Noble - OK - US - 36.39 - -97.17 - 0 - 0 - OUN - - - KSZ021 - 160210 - Clay - KS - US - 39.35 - -97.16 - 0 - 0 - TOP - - - NDZ030 - 340300 - Traill - ND - US - 47.46 - -97.16 - 0 - 0 - FGF - - - SDZ066 - 410660 - Turner - SD - US - 43.29 - -97.16 - 0 - 0 - FSD - - - TXZ246 - 432460 - Refugio - TX - US - 28.30 - -97.15 - 0 - 0 - CRP - - - KSZ035 - 160350 - Dickinson - KS - US - 38.86 - -97.14 - 0 - 0 - TOP - - - NEZ088 - 270880 - Jefferson - NE - US - 40.17 - -97.14 - 0 - 0 - OAX - - - NEZ050 - 270500 - Butler - NE - US - 41.25 - -97.13 - 0 - 0 - OAX - - - NEZ065 - 270650 - Seward - NE - US - 40.87 - -97.13 - 0 - 0 - OAX - - - NEZ078 - 270780 - Saline - NE - US - 40.52 - -97.13 - 0 - 0 - OAX - - - SDZ055 - 410550 - Lake - SD - US - 44.02 - -97.13 - 0 - 0 - FSD - - - OKZ008 - 360080 - Kay - OK - US - 36.79 - -97.11 - 0 - 0 - OUN - - - TXZ103 - 431030 - Denton - TX - US - 33.21 - -97.11 - 0 - 0 - FWD - - - TXZ145 - 431450 - Hill - TX - US - 32.00 - -97.11 - 0 - 0 - FWD - - - NEZ018 - 270180 - Wayne - NE - US - 42.22 - -97.10 - 0 - 0 - OAX - - - KSZ052 - 160520 - Marion - KS - US - 38.34 - -97.09 - 0 - 0 - ICT - - - OKZ041 - 360410 - Murray - OK - US - 34.49 - -97.09 - 0 - 0 - OUN - - - KSZ009 - 160090 - Washington - KS - US - 39.78 - -97.08 - 0 - 0 - TOP - - - NEZ043 - 270430 - Colfax - NE - US - 41.56 - -97.08 - 0 - 0 - OAX - - - OKZ020 - 360200 - Payne - OK - US - 36.10 - -96.99 - 0 - 0 - OUN - - - SDZ070 - 410700 - Clay - SD - US - 42.90 - -96.99 - 0 - 0 - FSD - - - TXZ194 - 431940 - Lee - TX - US - 30.30 - -96.99 - 0 - 0 - EWX - - - TXZ234 - 432340 - Victoria - TX - US - 28.80 - -96.98 - 0 - 0 - CRP - - - TXZ174 - 431740 - Milam - TX - US - 30.80 - -96.97 - 0 - 0 - FWD - - - TXZ209 - 432090 - Fayette - TX - US - 29.90 - -96.95 - 0 - 0 - EWX - - - TXZ160 - 431600 - Falls - TX - US - 31.26 - -96.94 - 0 - 0 - FWD - - - NDZ053 - 340530 - Richland - ND - US - 46.28 - -96.92 - 0 - 0 - FGF - - - TXZ225 - 432250 - Lavaca - TX - US - 29.35 - -96.91 - 0 - 0 - EWX - - - OKZ026 - 360260 - Lincoln - OK - US - 35.71 - -96.88 - 0 - 0 - OUN - - - OKZ030 - 360300 - Pottawatomie - OK - US - 35.19 - -96.88 - 0 - 0 - OUN - - - TXZ245 - 432450 - Aransas - TX - US - 28.21 - -96.87 - 0 - 0 - CRP - - - SDZ008 - 410080 - Roberts - SD - US - 45.62 - -96.86 - 0 - 0 - ABR - - - SDZ021 - 410210 - Grant - SD - US - 45.15 - -96.84 - 0 - 0 - ABR - - - KSZ069 - 160690 - Butler - KS - US - 37.78 - -96.83 - 0 - 0 - ICT - - - KSZ093 - 160930 - Cowley - KS - US - 37.23 - -96.83 - 0 - 0 - ICT - - - NEZ013 - 270130 - Dixon - NE - US - 42.51 - -96.82 - 0 - 0 - FSD - - - MNZ004 - 230040 - Kittson - MN - US - 48.77 - -96.81 - 0 - 0 - FGF - - - NEZ033 - 270330 - Cuming - NE - US - 41.92 - -96.79 - 0 - 0 - OAX - - - SDZ040 - 410400 - Brookings - SD - US - 44.37 - -96.79 - 0 - 0 - FSD - - - SDZ062 - 410620 - Minnehaha - SD - US - 43.67 - -96.79 - 0 - 0 - FSD - - - MNZ007 - 230070 - West_Marshall - MN - US - 48.36 - -96.78 - 0 - 0 - FGF - - - TXZ119 - 431190 - Dallas - TX - US - 32.77 - -96.77 - 0 - 0 - FWD - - - OKZ051 - 360510 - Marshall - OK - US - 34.01 - -96.76 - 0 - 0 - OUN - - - MNZ001 - 230010 - West_Polk - MN - US - 47.84 - -96.75 - 0 - 0 - FGF - - - TXZ134 - 431340 - Ellis - TX - US - 32.31 - -96.74 - 0 - 0 - FWD - - - KSZ036 - 160360 - Geary - KS - US - 39.04 - -96.72 - 0 - 0 - TOP - - - SDZ067 - 410670 - Lincoln - SD - US - 43.29 - -96.69 - 0 - 0 - FSD - - - NEZ066 - 270660 - Lancaster - NE - US - 40.78 - -96.68 - 0 - 0 - OAX - - - NEZ089 - 270890 - Gage - NE - US - 40.26 - -96.68 - 0 - 0 - OAX - - - KSZ022 - 160220 - Riley - KS - US - 39.30 - -96.67 - 0 - 0 - TOP - - - OKZ047 - 360470 - Johnston - OK - US - 34.32 - -96.67 - 0 - 0 - OUN - - - SDZ023 - 410230 - Deuel - SD - US - 44.76 - -96.67 - 0 - 0 - ABR - - - SDZ056 - 410560 - Moody - SD - US - 44.02 - -96.67 - 0 - 0 - FSD - - - OKZ042 - 360420 - Pontotoc - OK - US - 34.74 - -96.66 - 0 - 0 - OUN - - - TXZ093 - 430930 - Grayson - TX - US - 33.68 - -96.65 - 0 - 0 - FWD - - - KSZ037 - 160370 - Morris - KS - US - 38.69 - -96.64 - 0 - 0 - TOP - - - OKZ059 - 360590 - Pawnee - OK - US - 36.37 - -96.64 - 0 - 0 - TSA - - - SDZ071 - 410710 - Union - SD - US - 42.79 - -96.64 - 0 - 0 - FSD - - - TXZ247 - 432470 - Calhoun - TX - US - 28.39 - -96.63 - 0 - 0 - CRP - - - NEZ044 - 270440 - Dodge - NE - US - 41.57 - -96.62 - 0 - 0 - OAX - - - TXZ195 - 431950 - Burleson - TX - US - 30.52 - -96.62 - 0 - 0 - HGX - - - TXZ235 - 432350 - Jackson - TX - US - 28.96 - -96.62 - 0 - 0 - HGX - - - NEZ051 - 270510 - Saunders - NE - US - 41.24 - -96.61 - 0 - 0 - OAX - - - OKZ031 - 360310 - Seminole - OK - US - 35.16 - -96.61 - 0 - 0 - OUN - - - KSZ053 - 160530 - Chase - KS - US - 38.30 - -96.59 - 0 - 0 - ICT - - - TXZ161 - 431610 - Limestone - TX - US - 31.53 - -96.58 - 0 - 0 - FWD - - - MNZ039 - 230390 - Traverse - MN - US - 45.80 - -96.56 - 0 - 0 - ABR - - - TXZ104 - 431040 - Collin - TX - US - 33.20 - -96.56 - 0 - 0 - FWD - - - NEZ015 - 270150 - Thurston - NE - US - 42.15 - -96.55 - 0 - 0 - OAX - - - OKZ054 - 360540 - Osage - OK - US - 36.58 - -96.54 - 0 - 0 - TSA - - - TXZ175 - 431750 - Robertson - TX - US - 31.04 - -96.54 - 0 - 0 - FWD - - - NEZ014 - 270140 - Dakota - NE - US - 42.40 - -96.53 - 0 - 0 - FSD - - - TXZ210 - 432100 - Colorado - TX - US - 29.60 - -96.53 - 0 - 0 - HGX - - - KSZ010 - 160100 - Marshall - KS - US - 39.78 - -96.52 - 0 - 0 - TOP - - - MNZ029 - 230290 - Wilkin - MN - US - 46.33 - -96.52 - 0 - 0 - FGF - - - MNZ003 - 230030 - Clay - MN - US - 46.89 - -96.51 - 0 - 0 - FGF - - - MNZ046 - 230460 - Big_Stone - MN - US - 45.38 - -96.48 - 0 - 0 - ABR - - - MNZ002 - 230020 - Norman - MN - US - 47.33 - -96.47 - 0 - 0 - FGF - - - TXZ146 - 431460 - Navarro - TX - US - 32.07 - -96.47 - 0 - 0 - FWD - - - TXZ197 - 431970 - Washington - TX - US - 30.23 - -96.44 - 0 - 0 - HGX - - - TXZ120 - 431200 - Rockwall - TX - US - 32.91 - -96.40 - 0 - 0 - FWD - - - KSZ023 - 160230 - Pottawatomie - KS - US - 39.34 - -96.37 - 0 - 0 - TOP - - - TXZ196 - 431960 - Brazos - TX - US - 30.66 - -96.34 - 0 - 0 - HGX - - - OKZ064 - 360640 - Creek - OK - US - 35.91 - -96.33 - 0 - 0 - TSA - - - TXZ211 - 432110 - Austin - TX - US - 29.85 - -96.32 - 0 - 0 - HGX - - - NEZ034 - 270340 - Burt - NE - US - 41.87 - -96.31 - 0 - 0 - OAX - - - OKZ043 - 360430 - Coal - OK - US - 34.60 - -96.30 - 0 - 0 - OUN - - - OKZ065 - 360650 - Okfuskee - OK - US - 35.47 - -96.30 - 0 - 0 - TSA - - - TXZ121 - 431210 - Kaufman - TX - US - 32.61 - -96.30 - 0 - 0 - FWD - - - MNZ071 - 230710 - Lincoln - MN - US - 44.41 - -96.27 - 0 - 0 - FSD - - - MNZ097 - 230970 - Pipestone - MN - US - 44.02 - -96.26 - 0 - 0 - FSD - - - MNZ098 - 230980 - Rock - MN - US - 43.67 - -96.26 - 0 - 0 - FSD - - - NEZ090 - 270900 - Johnson - NE - US - 40.39 - -96.26 - 0 - 0 - OAX - - - IAZ020 - 150200 - Plymouth - IA - US - 42.74 - -96.25 - 0 - 0 - FSD - - - TXZ226 - 432260 - Wharton - TX - US - 29.30 - -96.25 - 0 - 0 - HGX - - - KSZ070 - 160700 - Greenwood - KS - US - 37.88 - -96.24 - 0 - 0 - ICT - - - KSZ094 - 160940 - Elk - KS - US - 37.45 - -96.24 - 0 - 0 - ICT - - - KSZ098 - 160980 - Chautauqua - KS - US - 37.15 - -96.24 - 0 - 0 - ICT - - - IAZ001 - 150010 - Lyon - IA - US - 43.38 - -96.23 - 0 - 0 - FSD - - - NEZ092 - 270920 - Pawnee - NE - US - 40.13 - -96.23 - 0 - 0 - OAX - - - OKZ032 - 360320 - Hughes - OK - US - 35.03 - -96.23 - 0 - 0 - OUN - - - IAZ012 - 150120 - Sioux - IA - US - 43.09 - -96.22 - 0 - 0 - FSD - - - KSZ038 - 160380 - Wabaunsee - KS - US - 38.97 - -96.22 - 0 - 0 - TOP - - - OKZ052 - 360520 - Bryan - OK - US - 33.93 - -96.19 - 0 - 0 - OUN - - - NEZ045 - 270450 - Washington - NE - US - 41.54 - -96.18 - 0 - 0 - OAX - - - NEZ052 - 270520 - Douglas - NE - US - 41.29 - -96.18 - 0 - 0 - OAX - - - KSZ054 - 160540 - Lyon - KS - US - 38.45 - -96.15 - 0 - 0 - TOP - - - NEZ067 - 270670 - Cass - NE - US - 40.93 - -96.15 - 0 - 0 - OAX - - - TXZ147 - 431470 - Freestone - TX - US - 31.72 - -96.14 - 0 - 0 - FWD - - - TXZ094 - 430940 - Fannin - TX - US - 33.62 - -96.11 - 0 - 0 - FWD - - - MNZ014 - 230140 - Red_Lake - MN - US - 47.86 - -96.10 - 0 - 0 - FGF - - - MNZ054 - 230540 - Lac_qui_Parle - MN - US - 45.04 - -96.09 - 0 - 0 - MPX - - - NEZ053 - 270530 - Sarpy - NE - US - 41.09 - -96.09 - 0 - 0 - OAX - - - NEZ068 - 270680 - Otoe - NE - US - 40.66 - -96.09 - 0 - 0 - OAX - - - IAZ031 - 150310 - Woodbury - IA - US - 42.39 - -96.08 - 0 - 0 - FSD - - - TXZ105 - 431050 - Hunt - TX - US - 33.13 - -96.07 - 0 - 0 - FWD - - - MNZ013 - 230130 - Pennington - MN - US - 48.05 - -96.04 - 0 - 0 - FGF - - - OKZ048 - 360480 - Atoka - OK - US - 34.43 - -96.04 - 0 - 0 - OUN - - - OKZ060 - 360600 - Tulsa - OK - US - 36.15 - -96.03 - 0 - 0 - TSA - - - IAZ043 - 150430 - Monona - IA - US - 42.04 - -96.02 - 0 - 0 - OAX - - - MNZ030 - 230300 - West_Otter_Tail - MN - US - 46.41 - -96.02 - 0 - 0 - FGF - - - KSZ011 - 160110 - Nemaha - KS - US - 39.78 - -96.01 - 0 - 0 - TOP - - - MNZ040 - 230400 - Grant - MN - US - 45.93 - -96.01 - 0 - 0 - FGF - - - MNZ047 - 230470 - Stevens - MN - US - 45.59 - -96.00 - 0 - 0 - MPX - - - TXZ212 - 432120 - Waller - TX - US - 29.99 - -96.00 - 0 - 0 - HGX - - - MNZ008 - 230080 - East_Marshall - MN - US - 48.36 - -95.99 - 0 - 0 - FGF - - - TXZ162 - 431620 - Leon - TX - US - 31.32 - -95.99 - 0 - 0 - FWD - - - TXZ198 - 431980 - Grimes - TX - US - 30.55 - -95.99 - 0 - 0 - HGX - - - MNZ015 - 230150 - East_Polk - MN - US - 47.72 - -95.95 - 0 - 0 - FGF - - - OKZ066 - 360660 - Okmulgee - OK - US - 35.62 - -95.95 - 0 - 0 - TSA - - - TXZ135 - 431350 - Henderson - TX - US - 32.19 - -95.94 - 0 - 0 - FWD - - - TXZ236 - 432360 - Matagorda - TX - US - 28.81 - -95.94 - 0 - 0 - HGX - - - MNZ027 - 230270 - West_Becker - MN - US - 46.94 - -95.93 - 0 - 0 - FGF - - - TXZ176 - 431760 - Madison - TX - US - 30.97 - -95.93 - 0 - 0 - HGX - - - MNZ064 - 230640 - Yellow_Medicine - MN - US - 44.74 - -95.91 - 0 - 0 - MPX - - - OKZ055 - 360550 - Washington - OK - US - 36.71 - -95.90 - 0 - 0 - TSA - - - MNZ072 - 230720 - Lyon - MN - US - 44.41 - -95.84 - 0 - 0 - FSD - - - IAZ055 - 150550 - Harrison - IA - US - 41.69 - -95.82 - 0 - 0 - OAX - - - MNZ022 - 230220 - Mahnomen - MN - US - 47.33 - -95.81 - 0 - 0 - FGF - - - NEZ091 - 270910 - Nemaha - NE - US - 40.41 - -95.80 - 0 - 0 - OAX - - - TXZ123 - 431230 - Rains - TX - US - 32.85 - -95.80 - 0 - 0 - FWD - - - KSZ024 - 160240 - Jackson - KS - US - 39.43 - -95.79 - 0 - 0 - TOP - - - MNZ080 - 230800 - Murray - MN - US - 44.02 - -95.77 - 0 - 0 - FSD - - - KSZ039 - 160390 - Shawnee - KS - US - 39.04 - -95.76 - 0 - 0 - TOP - - - MNZ089 - 230890 - Nobles - MN - US - 43.67 - -95.76 - 0 - 0 - FSD - - - TXZ122 - 431220 - Van_Zandt - TX - US - 32.61 - -95.76 - 0 - 0 - FWD - - - MNZ005 - 230050 - Roseau - MN - US - 48.77 - -95.75 - 0 - 0 - FGF - - - TXZ227 - 432270 - Fort_Bend - TX - US - 29.53 - -95.75 - 0 - 0 - HGX - - - KSZ095 - 160950 - Wilson - KS - US - 37.56 - -95.74 - 0 - 0 - ICT - - - KSZ099 - 160990 - Montgomery - KS - US - 37.19 - -95.74 - 0 - 0 - ICT - - - KSZ058 - 160580 - Coffey - KS - US - 38.23 - -95.73 - 0 - 0 - TOP - - - KSZ071 - 160710 - Woodson - KS - US - 37.88 - -95.73 - 0 - 0 - ICT - - - KSZ055 - 160550 - Osage - KS - US - 38.65 - -95.72 - 0 - 0 - TOP - - - OKZ073 - 360730 - Pittsburg - OK - US - 34.95 - -95.72 - 0 - 0 - TSA - - - MNZ055 - 230550 - Swift - MN - US - 45.28 - -95.69 - 0 - 0 - MPX - - - OKZ071 - 360710 - McIntosh - OK - US - 35.35 - -95.66 - 0 - 0 - TSA - - - TXZ148 - 431480 - Anderson - TX - US - 31.80 - -95.66 - 0 - 0 - FWD - - - MNZ056 - 230560 - Chippewa - MN - US - 44.96 - -95.65 - 0 - 0 - MPX - - - NEZ093 - 270930 - Richardson - NE - US - 40.13 - -95.65 - 0 - 0 - OAX - - - IAZ079 - 150790 - Mills - IA - US - 41.03 - -95.64 - 0 - 0 - OAX - - - IAZ002 - 150020 - Osceola - IA - US - 43.38 - -95.63 - 0 - 0 - FSD - - - IAZ013 - 150130 - O'Brien - IA - US - 43.09 - -95.63 - 0 - 0 - FSD - - - IAZ021 - 150210 - Cherokee - IA - US - 42.74 - -95.63 - 0 - 0 - FSD - - - IAZ090 - 150900 - Fremont - IA - US - 40.75 - -95.63 - 0 - 0 - OAX - - - OKZ056 - 360560 - Nowata - OK - US - 36.80 - -95.61 - 0 - 0 - TSA - - - TXZ177 - 431770 - Walker - TX - US - 30.79 - -95.60 - 0 - 0 - HGX - - - IAZ069 - 150690 - Pottawattamie - IA - US - 41.34 - -95.59 - 0 - 0 - OAX - - - TXZ095 - 430950 - Lamar - TX - US - 33.66 - -95.58 - 0 - 0 - FWD - - - TXZ106 - 431060 - Delta - TX - US - 33.36 - -95.58 - 0 - 0 - FWD - - - TXZ107 - 431070 - Hopkins - TX - US - 33.18 - -95.58 - 0 - 0 - FWD - - - OKZ053 - 360530 - Choctaw - OK - US - 34.02 - -95.57 - 0 - 0 - TSA - - - OKZ061 - 360610 - Rogers - OK - US - 36.34 - -95.57 - 0 - 0 - TSA - - - KSZ012 - 160120 - Brown - KS - US - 39.82 - -95.56 - 0 - 0 - TOP - - - IAZ032 - 150320 - Ida - IA - US - 42.39 - -95.54 - 0 - 0 - FSD - - - OKZ067 - 360670 - Wagoner - OK - US - 35.97 - -95.51 - 0 - 0 - TSA - - - MOZ001 - 250010 - Atchison - MO - US - 40.43 - -95.48 - 0 - 0 - EAX - - - TXZ237 - 432370 - Brazoria - TX - US - 29.21 - -95.47 - 0 - 0 - HGX - - - MNZ031 - 230310 - East_Otter_Tail - MN - US - 46.41 - -95.46 - 0 - 0 - FGF - - - TXZ199 - 431990 - Montgomery - TX - US - 30.33 - -95.46 - 0 - 0 - HGX - - - MNZ041 - 230410 - Douglas - MN - US - 45.93 - -95.45 - 0 - 0 - MPX - - - MNZ048 - 230480 - Pope - MN - US - 45.58 - -95.44 - 0 - 0 - MPX - - - TXZ213 - 432130 - Harris - TX - US - 29.84 - -95.44 - 0 - 0 - HGX - - - OKZ070 - 360700 - Muskogee - OK - US - 35.57 - -95.42 - 0 - 0 - TSA - - - MNZ028 - 230280 - East_Becker - MN - US - 46.93 - -95.41 - 0 - 0 - FGF - - - TXZ124 - 431240 - Wood - TX - US - 32.78 - -95.40 - 0 - 0 - SHV - - - IAZ044 - 150440 - Crawford - IA - US - 42.04 - -95.39 - 0 - 0 - DMX - - - MNZ016 - 230160 - North_Clearwater - MN - US - 47.76 - -95.39 - 0 - 0 - FGF - - - KSZ026 - 160260 - Jefferson - KS - US - 39.22 - -95.38 - 0 - 0 - TOP - - - TXZ163 - 431630 - Houston - TX - US - 31.27 - -95.37 - 0 - 0 - HGX - - - MNZ023 - 230230 - South_Clearwater - MN - US - 47.32 - -95.36 - 0 - 0 - FGF - - - OKZ049 - 360490 - Pushmataha - OK - US - 34.42 - -95.36 - 0 - 0 - TSA - - - IAZ056 - 150560 - Shelby - IA - US - 41.68 - -95.31 - 0 - 0 - OAX - - - KSZ072 - 160720 - Allen - KS - US - 37.88 - -95.30 - 0 - 0 - ICT - - - KSZ096 - 160960 - Neosho - KS - US - 37.56 - -95.30 - 0 - 0 - ICT - - - KSZ059 - 160590 - Anderson - KS - US - 38.21 - -95.29 - 0 - 0 - TOP - - - KSZ100 - 161000 - Labette - KS - US - 37.19 - -95.29 - 0 - 0 - ICT - - - TXZ136 - 431360 - Smith - TX - US - 32.42 - -95.29 - 0 - 0 - SHV - - - KSZ056 - 160560 - Franklin - KS - US - 38.56 - -95.28 - 0 - 0 - TOP - - - KSZ040 - 160400 - Douglas - KS - US - 38.90 - -95.27 - 0 - 0 - TOP - - - KSZ025 - 160250 - Atchison - KS - US - 39.53 - -95.26 - 0 - 0 - EAX - - - MOZ011 - 250110 - Holt - MO - US - 40.07 - -95.26 - 0 - 0 - EAX - - - MNZ073 - 230730 - Redwood - MN - US - 44.45 - -95.23 - 0 - 0 - MPX - - - OKZ062 - 360620 - Mayes - OK - US - 36.30 - -95.23 - 0 - 0 - TSA - - - OKZ057 - 360570 - Craig - OK - US - 36.76 - -95.22 - 0 - 0 - TSA - - - OKZ075 - 360750 - Latimer - OK - US - 34.88 - -95.22 - 0 - 0 - TSA - - - TXZ108 - 431080 - Franklin - TX - US - 33.18 - -95.21 - 0 - 0 - SHV - - - MNZ081 - 230810 - Cottonwood - MN - US - 44.02 - -95.17 - 0 - 0 - FSD - - - TXZ149 - 431490 - Cherokee - TX - US - 31.79 - -95.17 - 0 - 0 - SHV - - - IAZ003 - 150030 - Dickinson - IA - US - 43.38 - -95.16 - 0 - 0 - FSD - - - IAZ014 - 150140 - Clay - IA - US - 43.08 - -95.16 - 0 - 0 - FSD - - - IAZ022 - 150220 - Buena_Vista - IA - US - 42.74 - -95.16 - 0 - 0 - FSD - - - IAZ080 - 150800 - Montgomery - IA - US - 41.04 - -95.16 - 0 - 0 - OAX - - - IAZ091 - 150910 - Page - IA - US - 40.74 - -95.16 - 0 - 0 - OAX - - - MNZ090 - 230900 - Jackson - MN - US - 43.67 - -95.16 - 0 - 0 - FSD - - - IAZ033 - 150330 - Sac - IA - US - 42.39 - -95.13 - 0 - 0 - DMX - - - OKZ074 - 360740 - Haskell - OK - US - 35.27 - -95.13 - 0 - 0 - TSA - - - TXZ164 - 431640 - Trinity - TX - US - 31.11 - -95.13 - 0 - 0 - HGX - - - KSZ102 - 161020 - Doniphan - KS - US - 39.81 - -95.10 - 0 - 0 - EAX - - - TXZ178 - 431780 - San_Jacinto - TX - US - 30.62 - -95.10 - 0 - 0 - HGX - - - OKZ068 - 360680 - Cherokee - OK - US - 35.91 - -95.04 - 0 - 0 - TSA - - - TXZ096 - 430960 - Red_River - TX - US - 33.65 - -95.02 - 0 - 0 - SHV - - - MNZ009 - 230090 - North_Beltrami - MN - US - 48.20 - -95.01 - 0 - 0 - FGF - - - MNZ057 - 230570 - Kandiyohi - MN - US - 45.15 - -95.01 - 0 - 0 - MPX - - - KSZ103 - 161030 - Leavenworth - KS - US - 39.19 - -94.99 - 0 - 0 - EAX - - - MNZ065 - 230650 - Renville - MN - US - 44.67 - -94.99 - 0 - 0 - MPX - - - TXZ109 - 431090 - Titus - TX - US - 33.19 - -94.97 - 0 - 0 - SHV - - - MNZ032 - 230320 - Wadena - MN - US - 46.59 - -94.95 - 0 - 0 - FGF - - - IAZ070 - 150700 - Cass - IA - US - 41.33 - -94.94 - 0 - 0 - DMX - - - TXZ110 - 431100 - Camp - TX - US - 33.00 - -94.94 - 0 - 0 - SHV - - - MNZ024 - 230240 - Hubbard - MN - US - 47.11 - -94.92 - 0 - 0 - FGF - - - TXZ125 - 431250 - Upshur - TX - US - 32.72 - -94.92 - 0 - 0 - SHV - - - IAZ057 - 150570 - Audubon - IA - US - 41.68 - -94.91 - 0 - 0 - DMX - - - MOZ002 - 250020 - Nodaway - MO - US - 40.36 - -94.91 - 0 - 0 - EAX - - - MNZ042 - 230420 - Todd - MN - US - 46.07 - -94.90 - 0 - 0 - MPX - - - MNZ006 - 230060 - Lake_of_The_Woods - MN - US - 48.87 - -94.89 - 0 - 0 - FGF - - - IAZ045 - 150450 - Carroll - IA - US - 42.03 - -94.87 - 0 - 0 - DMX - - - TXZ179 - 431790 - Polk - TX - US - 30.82 - -94.87 - 0 - 0 - HGX - - - MOZ020 - 250200 - Buchanan - MO - US - 39.68 - -94.86 - 0 - 0 - EAX - - - KSZ073 - 160730 - Bourbon - KS - US - 37.85 - -94.85 - 0 - 0 - SGF - - - KSZ097 - 160970 - Crawford - KS - US - 37.50 - -94.85 - 0 - 0 - SGF - - - KSZ101 - 161010 - Cherokee - KS - US - 37.16 - -94.85 - 0 - 0 - SGF - - - MOZ028 - 250280 - Platte - MO - US - 39.34 - -94.85 - 0 - 0 - EAX - - - KSZ057 - 160570 - Miami - KS - US - 38.56 - -94.84 - 0 - 0 - EAX - - - KSZ060 - 160600 - Linn - KS - US - 38.21 - -94.84 - 0 - 0 - EAX - - - MOZ012 - 250120 - Andrew - MO - US - 39.97 - -94.84 - 0 - 0 - EAX - - - KSZ105 - 161050 - Johnson - KS - US - 38.89 - -94.83 - 0 - 0 - EAX - - - OKZ058 - 360580 - Ottawa - OK - US - 36.83 - -94.83 - 0 - 0 - TSA - - - MNZ017 - 230170 - South_Beltrami - MN - US - 47.63 - -94.81 - 0 - 0 - FGF - - - OKZ077 - 360770 - McCurtain - OK - US - 34.07 - -94.81 - 0 - 0 - SHV - - - TXZ200 - 432000 - Liberty - TX - US - 30.19 - -94.81 - 0 - 0 - HGX - - - TXZ238 - 432380 - Galveston - TX - US - 29.34 - -94.81 - 0 - 0 - HGX - - - OKZ063 - 360630 - Delaware - OK - US - 36.42 - -94.79 - 0 - 0 - TSA - - - OKZ072 - 360720 - Sequoyah - OK - US - 35.46 - -94.78 - 0 - 0 - TSA - - - TXZ137 - 431370 - Gregg - TX - US - 32.51 - -94.78 - 0 - 0 - SHV - - - KSZ104 - 161040 - Wyandotte - KS - US - 39.09 - -94.75 - 0 - 0 - EAX - - - MNZ074 - 230740 - Brown - MN - US - 44.30 - -94.74 - 0 - 0 - MPX - - - OKZ076 - 360760 - Le_Flore - OK - US - 34.95 - -94.74 - 0 - 0 - TSA - - - TXZ111 - 431110 - Morris - TX - US - 33.13 - -94.74 - 0 - 0 - SHV - - - TXZ150 - 431500 - Rusk - TX - US - 32.13 - -94.72 - 0 - 0 - SHV - - - IAZ081 - 150810 - Adams - IA - US - 41.03 - -94.71 - 0 - 0 - DMX - - - IAZ092 - 150920 - Taylor - IA - US - 40.74 - -94.71 - 0 - 0 - DMX - - - IAZ004 - 150040 - Emmet - IA - US - 43.38 - -94.69 - 0 - 0 - DMX - - - IAZ015 - 150150 - Palo_Alto - IA - US - 43.08 - -94.69 - 0 - 0 - DMX - - - IAZ023 - 150230 - Pocahontas - IA - US - 42.74 - -94.69 - 0 - 0 - DMX - - - TXZ214 - 432140 - Chambers - TX - US - 29.71 - -94.67 - 0 - 0 - HGX - - - IAZ034 - 150340 - Calhoun - IA - US - 42.38 - -94.66 - 0 - 0 - DMX - - - OKZ069 - 360690 - Adair - OK - US - 35.91 - -94.64 - 0 - 0 - TSA - - - TXZ152 - 431520 - Nacogdoches - TX - US - 31.54 - -94.64 - 0 - 0 - SHV - - - MNZ082 - 230820 - Watonwan - MN - US - 43.98 - -94.62 - 0 - 0 - MPX - - - MNZ049 - 230490 - Stearns - MN - US - 45.53 - -94.59 - 0 - 0 - MPX - - - TXZ165 - 431650 - Angelina - TX - US - 31.28 - -94.57 - 0 - 0 - SHV - - - MNZ033 - 230330 - South_Cass - MN - US - 46.54 - -94.56 - 0 - 0 - DLH - - - MNZ091 - 230910 - Martin - MN - US - 43.67 - -94.55 - 0 - 0 - MPX - - - MNZ058 - 230580 - Meeker - MN - US - 45.11 - -94.51 - 0 - 0 - MPX - - - IAZ058 - 150580 - Guthrie - IA - US - 41.68 - -94.50 - 0 - 0 - DMX - - - IAZ071 - 150710 - Adair - IA - US - 41.33 - -94.48 - 0 - 0 - DMX - - - MOZ003 - 250030 - Worth - MO - US - 40.48 - -94.43 - 0 - 0 - EAX - - - MOZ004 - 250040 - Gentry - MO - US - 40.21 - -94.42 - 0 - 0 - EAX - - - MOZ021 - 250210 - Clinton - MO - US - 39.60 - -94.42 - 0 - 0 - EAX - - - MOZ029 - 250290 - Clay - MO - US - 39.28 - -94.42 - 0 - 0 - EAX - - - IAZ046 - 150460 - Greene - IA - US - 42.03 - -94.41 - 0 - 0 - DMX - - - MOZ013 - 250130 - De_Kalb - MO - US - 39.89 - -94.41 - 0 - 0 - EAX - - - TXZ201 - 432010 - Hardin - TX - US - 30.31 - -94.40 - 0 - 0 - LCH - - - TXZ097 - 430970 - Bowie - TX - US - 33.47 - -94.39 - 0 - 0 - SHV - - - TXZ126 - 431260 - Marion - TX - US - 32.79 - -94.38 - 0 - 0 - SHV - - - TXZ138 - 431380 - Harrison - TX - US - 32.56 - -94.37 - 0 - 0 - SHV - - - MNZ075 - 230750 - Nicollet - MN - US - 44.31 - -94.36 - 0 - 0 - MPX - - - MOZ037 - 250370 - Jackson - MO - US - 39.03 - -94.36 - 0 - 0 - EAX - - - MOZ077 - 250770 - Barton - MO - US - 37.50 - -94.35 - 0 - 0 - SGF - - - MOZ101 - 251010 - McDonald - MO - US - 36.63 - -94.35 - 0 - 0 - SGF - - - TXZ112 - 431120 - Cass - TX - US - 33.10 - -94.35 - 0 - 0 - SHV - - - TXZ180 - 431800 - Tyler - TX - US - 30.79 - -94.35 - 0 - 0 - LCH - - - MOZ043 - 250430 - Cass - MO - US - 38.64 - -94.34 - 0 - 0 - EAX - - - MOZ053 - 250530 - Bates - MO - US - 38.25 - -94.34 - 0 - 0 - EAX - - - MOZ066 - 250660 - Vernon - MO - US - 37.85 - -94.34 - 0 - 0 - SGF - - - MOZ088 - 250880 - Jasper - MO - US - 37.21 - -94.34 - 0 - 0 - SGF - - - MOZ093 - 250930 - Newton - MO - US - 36.90 - -94.34 - 0 - 0 - SGF - - - TXZ151 - 431510 - Panola - TX - US - 32.18 - -94.30 - 0 - 0 - SHV - - - MNZ066 - 230660 - McLeod - MN - US - 44.81 - -94.26 - 0 - 0 - MPX - - - IAZ082 - 150820 - Union - IA - US - 41.03 - -94.25 - 0 - 0 - DMX - - - IAZ093 - 150930 - Ringgold - IA - US - 40.74 - -94.25 - 0 - 0 - DMX - - - ARZ001 - 40010 - Benton - AR - US - 36.30 - -94.24 - 0 - 0 - TSA - - - ARZ029 - 40290 - Sebastian - AR - US - 35.19 - -94.24 - 0 - 0 - TSA - - - ARZ010 - 40100 - Washington - AR - US - 36.00 - -94.22 - 0 - 0 - TSA - - - ARZ050 - 40500 - Sevier - AR - US - 33.97 - -94.22 - 0 - 0 - SHV - - - IAZ005 - 150050 - Kossuth - IA - US - 43.21 - -94.22 - 0 - 0 - DMX - - - IAZ024 - 150240 - Humboldt - IA - US - 42.78 - -94.22 - 0 - 0 - DMX - - - MNZ025 - 230250 - North_Cass - MN - US - 47.14 - -94.22 - 0 - 0 - DLH - - - MNZ043 - 230430 - Morrison - MN - US - 46.06 - -94.21 - 0 - 0 - MPX - - - ARZ040 - 40400 - Polk - AR - US - 34.47 - -94.20 - 0 - 0 - LZK - - - MNZ067 - 230670 - Sibley - MN - US - 44.59 - -94.20 - 0 - 0 - MPX - - - ARZ019 - 40190 - Crawford - AR - US - 35.56 - -94.19 - 0 - 0 - TSA - - - IAZ035 - 150350 - Webster - IA - US - 42.43 - -94.19 - 0 - 0 - DMX - - - TXZ166 - 431660 - San_Augustine - TX - US - 31.38 - -94.19 - 0 - 0 - SHV - - - TXZ153 - 431530 - Shelby - TX - US - 31.78 - -94.15 - 0 - 0 - SHV - - - ARZ059 - 40590 - Little_River - AR - US - 33.74 - -94.14 - 0 - 0 - SHV - - - TXZ215 - 432150 - Jefferson - TX - US - 29.87 - -94.14 - 0 - 0 - LCH - - - ARZ037 - 40370 - Scott - AR - US - 34.89 - -94.08 - 0 - 0 - LZK - - - MNZ034 - 230340 - Crow_Wing - MN - US - 46.48 - -94.08 - 0 - 0 - DLH - - - MNZ083 - 230830 - Blue_Earth - MN - US - 44.06 - -94.07 - 0 - 0 - MPX - - - MNZ050 - 230500 - Benton - MN - US - 45.69 - -94.06 - 0 - 0 - MPX - - - IAZ059 - 150590 - Dallas - IA - US - 41.68 - -94.04 - 0 - 0 - DMX - - - ARZ051 - 40510 - Howard - AR - US - 34.05 - -94.03 - 0 - 0 - SHV - - - IAZ072 - 150720 - Madison - IA - US - 41.34 - -94.02 - 0 - 0 - DMX - - - MOZ005 - 250050 - Harrison - MO - US - 40.36 - -94.00 - 0 - 0 - EAX - - - MOZ014 - 250140 - Daviess - MO - US - 39.96 - -94.00 - 0 - 0 - EAX - - - TXZ181 - 431810 - Jasper - TX - US - 30.70 - -94.00 - 0 - 0 - LCH - - - MOZ022 - 250220 - Caldwell - MO - US - 39.66 - -93.99 - 0 - 0 - EAX - - - MOZ030 - 250300 - Ray - MO - US - 39.33 - -93.99 - 0 - 0 - EAX - - - MNZ092 - 230920 - Faribault - MN - US - 43.67 - -93.95 - 0 - 0 - MPX - - - IAZ047 - 150470 - Boone - IA - US - 42.03 - -93.94 - 0 - 0 - DMX - - - TXZ216 - 432160 - Orange - TX - US - 30.10 - -93.90 - 0 - 0 - LCH - - - MNZ059 - 230590 - Wright - MN - US - 45.20 - -93.89 - 0 - 0 - MPX - - - ARZ020 - 40200 - Franklin - AR - US - 35.49 - -93.88 - 0 - 0 - TSA - - - MOZ089 - 250890 - Dade - MO - US - 37.43 - -93.86 - 0 - 0 - SGF - - - ARZ070 - 40700 - Miller - AR - US - 33.31 - -93.85 - 0 - 0 - SHV - - - MOZ078 - 250780 - Cedar - MO - US - 37.73 - -93.85 - 0 - 0 - SGF - - - MOZ094 - 250940 - Lawrence - MO - US - 37.11 - -93.84 - 0 - 0 - SGF - - - MNZ051 - 230510 - Sherburne - MN - US - 45.41 - -93.83 - 0 - 0 - MPX - - - MOZ102 - 251020 - Barry - MO - US - 36.71 - -93.83 - 0 - 0 - SGF - - - MOZ044 - 250440 - Johnson - MO - US - 38.75 - -93.82 - 0 - 0 - EAX - - - TXZ167 - 431670 - Sabine - TX - US - 31.37 - -93.82 - 0 - 0 - SHV - - - MOZ038 - 250380 - Lafayette - MO - US - 39.09 - -93.80 - 0 - 0 - EAX - - - IAZ083 - 150830 - Clarke - IA - US - 41.03 - -93.79 - 0 - 0 - DMX - - - IAZ094 - 150940 - Decatur - IA - US - 40.74 - -93.79 - 0 - 0 - DMX - - - MOZ054 - 250540 - Henry - MO - US - 38.38 - -93.79 - 0 - 0 - EAX - - - MOZ067 - 250670 - St._Clair - MO - US - 38.02 - -93.79 - 0 - 0 - SGF - - - MNZ076 - 230760 - Le_Sueur - MN - US - 44.37 - -93.78 - 0 - 0 - MPX - - - LAZ001 - 180010 - Caddo - LA - US - 32.61 - -93.77 - 0 - 0 - SHV - - - MNZ068 - 230680 - Carver - MN - US - 44.81 - -93.77 - 0 - 0 - MPX - - - MNZ010 - 230100 - Koochiching - MN - US - 48.28 - -93.76 - 0 - 0 - DLH - - - IAZ006 - 150060 - Winnebago - IA - US - 43.38 - -93.74 - 0 - 0 - DMX - - - IAZ016 - 150160 - Hancock - IA - US - 43.08 - -93.74 - 0 - 0 - DMX - - - IAZ025 - 150250 - Wright - IA - US - 42.73 - -93.74 - 0 - 0 - DMX - - - MNZ018 - 230180 - North_Itasca - MN - US - 47.66 - -93.74 - 0 - 0 - DLH - - - IAZ036 - 150360 - Hamilton - IA - US - 42.38 - -93.72 - 0 - 0 - DMX - - - ARZ030 - 40300 - Logan - AR - US - 35.22 - -93.71 - 0 - 0 - LZK - - - ARZ060 - 40600 - Hempstead - AR - US - 33.75 - -93.71 - 0 - 0 - SHV - - - TXZ182 - 431820 - Newton - TX - US - 30.72 - -93.71 - 0 - 0 - LCH - - - ARZ011 - 40110 - Madison - AR - US - 36.03 - -93.70 - 0 - 0 - TSA - - - LAZ010 - 180100 - De_Soto - LA - US - 32.10 - -93.69 - 0 - 0 - SHV - - - ARZ041 - 40410 - Montgomery - AR - US - 34.55 - -93.66 - 0 - 0 - LZK - - - ARZ052 - 40520 - Pike - AR - US - 34.15 - -93.65 - 0 - 0 - LZK - - - MNZ044 - 230440 - Mille_Lacs - MN - US - 45.90 - -93.62 - 0 - 0 - MPX - - - ARZ071 - 40710 - Lafayette - AR - US - 33.25 - -93.61 - 0 - 0 - SHV - - - LAZ002 - 180020 - Bossier - LA - US - 32.63 - -93.61 - 0 - 0 - SHV - - - MNZ069 - 230690 - Scott - MN - US - 44.68 - -93.60 - 0 - 0 - MPX - - - MNZ084 - 230840 - Waseca - MN - US - 44.02 - -93.59 - 0 - 0 - MPX - - - ARZ002 - 40020 - Carroll - AR - US - 36.31 - -93.58 - 0 - 0 - TSA - - - MOZ006 - 250060 - Mercer - MO - US - 40.42 - -93.58 - 0 - 0 - EAX - - - IAZ060 - 150600 - Polk - IA - US - 41.68 - -93.57 - 0 - 0 - DMX - - - MNZ026 - 230260 - South_Itasca - MN - US - 47.24 - -93.57 - 0 - 0 - DLH - - - MOZ015 - 250150 - Grundy - MO - US - 40.11 - -93.57 - 0 - 0 - EAX - - - IAZ073 - 150730 - Warren - IA - US - 41.34 - -93.56 - 0 - 0 - DMX - - - LAZ017 - 180170 - Sabine - LA - US - 31.51 - -93.55 - 0 - 0 - SHV - - - MOZ023 - 250230 - Livingston - MO - US - 39.79 - -93.52 - 0 - 0 - EAX - - - IAZ048 - 150480 - Story - IA - US - 42.03 - -93.47 - 0 - 0 - DMX - - - MNZ060 - 230600 - Hennepin - MN - US - 45.02 - -93.47 - 0 - 0 - MPX - - - MOZ103 - 251030 - Stone - MO - US - 36.74 - -93.47 - 0 - 0 - SGF - - - MOZ031 - 250310 - Carroll - MO - US - 39.41 - -93.44 - 0 - 0 - EAX - - - ARZ021 - 40210 - Johnson - AR - US - 35.55 - -93.43 - 0 - 0 - LZK - - - MNZ036 - 230360 - South_Aitkin - MN - US - 46.39 - -93.43 - 0 - 0 - DLH - - - MNZ035 - 230350 - Northern_Aitkin - MN - US - 46.83 - -93.42 - 0 - 0 - DLH - - - MOZ079 - 250790 - Polk - MO - US - 37.62 - -93.41 - 0 - 0 - SGF - - - LAZ011 - 180110 - Red_River - LA - US - 32.07 - -93.36 - 0 - 0 - SHV - - - LAZ030 - 180300 - Beauregard - LA - US - 30.65 - -93.36 - 0 - 0 - LCH - - - MNZ093 - 230930 - Freeborn - MN - US - 43.67 - -93.35 - 0 - 0 - MPX - - - MOZ090 - 250900 - Greene - MO - US - 37.26 - -93.35 - 0 - 0 - SGF - - - IAZ084 - 150840 - Lucas - IA - US - 41.03 - -93.33 - 0 - 0 - DMX - - - IAZ095 - 150950 - Wayne - IA - US - 40.74 - -93.33 - 0 - 0 - DMX - - - LAZ003 - 180030 - Webster - LA - US - 32.72 - -93.33 - 0 - 0 - SHV - - - ARZ038 - 40380 - Yell - AR - US - 35.03 - -93.32 - 0 - 0 - LZK - - - LAZ041 - 180410 - Calcasieu - LA - US - 30.27 - -93.32 - 0 - 0 - LCH - - - MOZ068 - 250680 - Hickory - MO - US - 37.93 - -93.32 - 0 - 0 - SGF - - - ARZ061 - 40610 - Nevada - AR - US - 33.70 - -93.29 - 0 - 0 - SHV - - - MNZ045 - 230450 - Kanabec - MN - US - 45.95 - -93.29 - 0 - 0 - MPX - - - MNZ077 - 230770 - Rice - MN - US - 44.37 - -93.29 - 0 - 0 - MPX - - - MOZ045 - 250450 - Pettis - MO - US - 38.72 - -93.29 - 0 - 0 - EAX - - - MOZ055 - 250550 - Benton - MO - US - 38.30 - -93.29 - 0 - 0 - SGF - - - MNZ052 - 230520 - Isanti - MN - US - 45.57 - -93.27 - 0 - 0 - MPX - - - MNZ061 - 230610 - Anoka - MN - US - 45.23 - -93.27 - 0 - 0 - MPX - - - IAZ007 - 150070 - Worth - IA - US - 43.38 - -93.26 - 0 - 0 - DMX - - - IAZ017 - 150170 - Cerro_Gordo - IA - US - 43.08 - -93.26 - 0 - 0 - DMX - - - IAZ026 - 150260 - Franklin - IA - US - 42.73 - -93.26 - 0 - 0 - DMX - - - MOZ095 - 250950 - Christian - MO - US - 36.95 - -93.26 - 0 - 0 - SGF - - - IAZ037 - 150370 - Hardin - IA - US - 42.38 - -93.25 - 0 - 0 - DMX - - - LAZ051 - 180510 - Cameron - LA - US - 29.83 - -93.25 - 0 - 0 - LCH - - - MNZ085 - 230850 - Steele - MN - US - 44.02 - -93.23 - 0 - 0 - MPX - - - ARZ012 - 40120 - Newton - AR - US - 35.93 - -93.22 - 0 - 0 - LZK - - - ARZ072 - 40720 - Columbia - AR - US - 33.24 - -93.22 - 0 - 0 - SHV - - - ARZ053 - 40530 - Clark - AR - US - 34.06 - -93.19 - 0 - 0 - LZK - - - LAZ027 - 180270 - Vernon - LA - US - 31.12 - -93.19 - 0 - 0 - LCH - - - MOZ039 - 250390 - Saline - MO - US - 39.17 - -93.18 - 0 - 0 - EAX - - - MNZ062 - 230620 - Ramsey - MN - US - 45.01 - -93.11 - 0 - 0 - MPX - - - MOZ016 - 250160 - Sullivan - MO - US - 40.21 - -93.11 - 0 - 0 - EAX - - - MOZ024 - 250240 - Linn - MO - US - 39.87 - -93.11 - 0 - 0 - EAX - - - IAZ074 - 150740 - Marion - IA - US - 41.34 - -93.10 - 0 - 0 - DMX - - - LAZ012 - 180120 - Bienville - LA - US - 32.37 - -93.10 - 0 - 0 - SHV - - - ARZ042 - 40420 - Garland - AR - US - 34.58 - -93.09 - 0 - 0 - LZK - - - LAZ018 - 180180 - Natchitoches - LA - US - 31.75 - -93.08 - 0 - 0 - SHV - - - ARZ003 - 40030 - Boone - AR - US - 36.31 - -93.07 - 0 - 0 - LZK - - - IAZ061 - 150610 - Jasper - IA - US - 41.69 - -93.06 - 0 - 0 - DMX - - - ARZ022 - 40220 - Pope - AR - US - 35.43 - -93.05 - 0 - 0 - LZK - - - MOZ104 - 251040 - Taney - MO - US - 36.66 - -93.05 - 0 - 0 - SGF - - - ARZ054 - 40540 - Hot_Spring - AR - US - 34.33 - -93.04 - 0 - 0 - LZK - - - MNZ070 - 230700 - Dakota - MN - US - 44.71 - -93.03 - 0 - 0 - MPX - - - MOZ007 - 250070 - Putnam - MO - US - 40.46 - -93.02 - 0 - 0 - EAX - - - MOZ080 - 250800 - Dallas - MO - US - 37.66 - -93.02 - 0 - 0 - SGF - - - IAZ049 - 150490 - Marshall - IA - US - 42.04 - -93.01 - 0 - 0 - DMX - - - MOZ032 - 250320 - Chariton - MO - US - 39.46 - -92.99 - 0 - 0 - EAX - - - LAZ004 - 180040 - Claiborne - LA - US - 32.80 - -92.97 - 0 - 0 - SHV - - - ARZ039 - 40390 - Perry - AR - US - 34.94 - -92.92 - 0 - 0 - LZK - - - MNZ053 - 230530 - Chisago - MN - US - 45.52 - -92.89 - 0 - 0 - MPX - - - MNZ063 - 230630 - Washington - MN - US - 45.02 - -92.88 - 0 - 0 - MPX - - - MOZ091 - 250910 - Webster - MO - US - 37.28 - -92.88 - 0 - 0 - SGF - - - IAZ085 - 150850 - Monroe - IA - US - 41.03 - -92.87 - 0 - 0 - DMX - - - IAZ096 - 150960 - Appanoose - IA - US - 40.74 - -92.87 - 0 - 0 - DMX - - - MNZ086 - 230860 - Dodge - MN - US - 44.02 - -92.87 - 0 - 0 - ARX - - - LAZ031 - 180310 - Allen - LA - US - 30.66 - -92.85 - 0 - 0 - LCH - - - LAZ042 - 180420 - Jefferson_Davis - LA - US - 30.27 - -92.85 - 0 - 0 - LCH - - - MOZ056 - 250560 - Morgan - MO - US - 38.44 - -92.85 - 0 - 0 - SGF - - - ARZ066 - 40660 - Ouachita - AR - US - 33.60 - -92.83 - 0 - 0 - LZK - - - IAZ008 - 150080 - Mitchell - IA - US - 43.36 - -92.79 - 0 - 0 - ARX - - - IAZ018 - 150180 - Floyd - IA - US - 43.06 - -92.79 - 0 - 0 - ARX - - - IAZ027 - 150270 - Butler - IA - US - 42.73 - -92.79 - 0 - 0 - DMX - - - IAZ038 - 150380 - Grundy - IA - US - 42.38 - -92.79 - 0 - 0 - DMX - - - MOZ046 - 250460 - Cooper - MO - US - 38.87 - -92.78 - 0 - 0 - EAX - - - ARZ031 - 40310 - Conway - AR - US - 35.27 - -92.76 - 0 - 0 - LZK - - - MNZ094 - 230940 - Mower - MN - US - 43.67 - -92.75 - 0 - 0 - ARX - - - MOZ069 - 250690 - Camden - MO - US - 38.03 - -92.74 - 0 - 0 - SGF - - - MNZ038 - 230380 - Pine - MN - US - 46.07 - -92.71 - 0 - 0 - DLH - - - MOZ040 - 250400 - Howard - MO - US - 39.16 - -92.69 - 0 - 0 - EAX - - - ARZ013 - 40130 - Searcy - AR - US - 35.92 - -92.68 - 0 - 0 - LZK - - - ARZ004 - 40040 - Marion - AR - US - 36.28 - -92.65 - 0 - 0 - LZK - - - ARZ043 - 40430 - Saline - AR - US - 34.64 - -92.65 - 0 - 0 - LZK - - - ARZ062 - 40620 - Dallas - AR - US - 33.98 - -92.65 - 0 - 0 - LZK - - - IAZ075 - 150750 - Mahaska - IA - US - 41.34 - -92.65 - 0 - 0 - DMX - - - MNZ078 - 230780 - Goodhue - MN - US - 44.45 - -92.65 - 0 - 0 - MPX - - - LAZ005 - 180050 - Lincoln - LA - US - 32.61 - -92.64 - 0 - 0 - SHV - - - LAZ019 - 180190 - Winn - LA - US - 31.93 - -92.64 - 0 - 0 - SHV - - - MOZ047 - 250470 - Moniteau - MO - US - 38.67 - -92.62 - 0 - 0 - LSX - - - MOZ017 - 250170 - Adair - MO - US - 40.19 - -92.61 - 0 - 0 - EAX - - - LAZ020 - 180200 - Grant - LA - US - 31.60 - -92.58 - 0 - 0 - SHV - - - MOZ025 - 250250 - Macon - MO - US - 39.82 - -92.57 - 0 - 0 - EAX - - - LAZ013 - 180130 - Jackson - LA - US - 32.33 - -92.56 - 0 - 0 - SHV - - - MOZ081 - 250810 - Laclede - MO - US - 37.69 - -92.56 - 0 - 0 - SGF - - - ARZ023 - 40230 - Van_Buren - AR - US - 35.58 - -92.54 - 0 - 0 - LZK - - - ARZ067 - 40670 - Calhoun - AR - US - 33.54 - -92.54 - 0 - 0 - LZK - - - IAZ050 - 150500 - Tama - IA - US - 42.08 - -92.54 - 0 - 0 - DMX - - - IAZ062 - 150620 - Poweshiek - IA - US - 41.69 - -92.54 - 0 - 0 - DMX - - - MOZ008 - 250080 - Schuyler - MO - US - 40.47 - -92.54 - 0 - 0 - EAX - - - ARZ073 - 40730 - Union - AR - US - 33.20 - -92.52 - 0 - 0 - SHV - - - LAZ028 - 180280 - Rapides - LA - US - 31.21 - -92.52 - 0 - 0 - LCH - - - WIZ014 - 490140 - Polk - WI - US - 45.47 - -92.52 - 0 - 0 - MPX - - - MOZ033 - 250330 - Randolph - MO - US - 39.43 - -92.51 - 0 - 0 - EAX - - - MOZ096 - 250960 - Douglas - MO - US - 36.93 - -92.50 - 0 - 0 - SGF - - - MOZ092 - 250920 - Wright - MO - US - 37.27 - -92.47 - 0 - 0 - SGF - - - WIZ023 - 490230 - St._Croix - WI - US - 45.04 - -92.47 - 0 - 0 - MPX - - - WIZ024 - 490240 - Pierce - WI - US - 44.70 - -92.47 - 0 - 0 - MPX - - - WIZ006 - 490060 - Burnett - WI - US - 45.90 - -92.46 - 0 - 0 - DLH - - - MOZ105 - 251050 - Ozark - MO - US - 36.65 - -92.45 - 0 - 0 - SGF - - - ARZ055 - 40550 - Grant - AR - US - 34.28 - -92.44 - 0 - 0 - LZK - - - MNZ011 - 230110 - North_St._Louis - MN - US - 48.24 - -92.44 - 0 - 0 - DLH - - - MNZ019 - 230190 - Central_St._Louis - MN - US - 47.43 - -92.44 - 0 - 0 - DLH - - - MOZ057 - 250570 - Miller - MO - US - 38.22 - -92.44 - 0 - 0 - SGF - - - MNZ037 - 230370 - Carlton/South_St._Louis - MN - US - 46.72 - -92.43 - 0 - 0 - DLH - - - IAZ097 - 150970 - Davis - IA - US - 40.75 - -92.42 - 0 - 0 - DMX - - - IAZ086 - 150860 - Wapello - IA - US - 41.03 - -92.41 - 0 - 0 - DMX - - - ARZ044 - 40440 - Pulaski - AR - US - 34.76 - -92.39 - 0 - 0 - LZK - - - LAZ032 - 180320 - Evangeline - LA - US - 30.74 - -92.39 - 0 - 0 - LCH - - - MNZ087 - 230870 - Olmsted - MN - US - 44.01 - -92.39 - 0 - 0 - ARX - - - LAZ006 - 180060 - Union - LA - US - 32.80 - -92.38 - 0 - 0 - SHV - - - LAZ043 - 180430 - Acadia - LA - US - 30.28 - -92.38 - 0 - 0 - LCH - - - ARZ005 - 40050 - Baxter - AR - US - 36.24 - -92.37 - 0 - 0 - LZK - - - ARZ032 - 40320 - Faulkner - AR - US - 35.12 - -92.36 - 0 - 0 - LZK - - - LAZ052 - 180520 - Vermilion - LA - US - 29.85 - -92.34 - 0 - 0 - LCH - - - MOZ041 - 250410 - Boone - MO - US - 38.94 - -92.34 - 0 - 0 - LSX - - - IAZ009 - 150090 - Howard - IA - US - 43.36 - -92.32 - 0 - 0 - ARX - - - IAZ019 - 150190 - Chickasaw - IA - US - 43.07 - -92.32 - 0 - 0 - ARX - - - IAZ028 - 150280 - Bremer - IA - US - 42.78 - -92.32 - 0 - 0 - DMX - - - IAZ039 - 150390 - Black_Hawk - IA - US - 42.47 - -92.31 - 0 - 0 - DMX - - - MOZ048 - 250480 - Cole - MO - US - 38.53 - -92.22 - 0 - 0 - LSX - - - MOZ070 - 250700 - Pulaski - MO - US - 37.81 - -92.22 - 0 - 0 - SGF - - - ARZ063 - 40630 - Cleveland - AR - US - 33.89 - -92.20 - 0 - 0 - LZK - - - MNZ079 - 230790 - Wabasha - MN - US - 44.28 - -92.20 - 0 - 0 - ARX - - - LAZ022 - 180220 - La_Salle - LA - US - 31.63 - -92.19 - 0 - 0 - SHV - - - IAZ076 - 150760 - Keokuk - IA - US - 41.33 - -92.18 - 0 - 0 - DVN - - - ARZ068 - 40680 - Bradley - AR - US - 33.44 - -92.16 - 0 - 0 - LZK - - - LAZ014 - 180140 - Ouachita - LA - US - 32.50 - -92.16 - 0 - 0 - SHV - - - MOZ009 - 250090 - Scotland - MO - US - 40.46 - -92.15 - 0 - 0 - DVN - - - MOZ018 - 250180 - Knox - MO - US - 40.13 - -92.15 - 0 - 0 - LSX - - - ARZ014 - 40140 - Stone - AR - US - 35.91 - -92.12 - 0 - 0 - LZK - - - LAZ021 - 180210 - Caldwell - LA - US - 32.11 - -92.09 - 0 - 0 - SHV - - - LAZ044 - 180440 - Lafayette - LA - US - 30.22 - -92.09 - 0 - 0 - LCH - - - MNZ095 - 230950 - Fillmore - MN - US - 43.67 - -92.09 - 0 - 0 - ARX - - - WIZ026 - 490260 - Pepin - WI - US - 44.55 - -92.09 - 0 - 0 - MPX - - - LAZ033 - 180330 - St._Landry - LA - US - 30.58 - -92.08 - 0 - 0 - LCH - - - IAZ051 - 150510 - Benton - IA - US - 42.08 - -92.07 - 0 - 0 - DVN - - - MOZ026 - 250260 - Shelby - MO - US - 39.78 - -92.07 - 0 - 0 - LSX - - - IAZ063 - 150630 - Iowa - IA - US - 41.68 - -92.06 - 0 - 0 - DVN - - - ARZ024 - 40240 - Cleburne - AR - US - 35.54 - -92.02 - 0 - 0 - LZK - - - MOZ034 - 250340 - Monroe - MO - US - 39.50 - -92.01 - 0 - 0 - LSX - - - LAZ029 - 180290 - Avoyelles - LA - US - 31.10 - -91.97 - 0 - 0 - LCH - - - MOZ082 - 250820 - Texas - MO - US - 37.33 - -91.96 - 0 - 0 - SGF - - - IAZ087 - 150870 - Jefferson - IA - US - 41.03 - -91.95 - 0 - 0 - DVN - - - IAZ098 - 150980 - Van_Buren - IA - US - 40.75 - -91.95 - 0 - 0 - DVN - - - ARZ015 - 40150 - Izard - AR - US - 36.06 - -91.94 - 0 - 0 - LZK - - - MOZ050 - 250500 - Callaway - MO - US - 38.81 - -91.93 - 0 - 0 - LSX - - - MOZ049 - 250490 - Osage - MO - US - 38.50 - -91.92 - 0 - 0 - LSX - - - MOZ058 - 250580 - Maries - MO - US - 38.15 - -91.92 - 0 - 0 - SGF - - - WIZ001 - 490010 - Douglas - WI - US - 46.46 - -91.92 - 0 - 0 - DLH - - - LAZ024 - 180240 - Catahoula - LA - US - 31.60 - -91.91 - 0 - 0 - JAN - - - WIZ025 - 490250 - Dunn - WI - US - 44.95 - -91.91 - 0 - 0 - MPX - - - MOZ097 - 250970 - Howell - MO - US - 36.78 - -91.90 - 0 - 0 - SGF - - - ARZ045 - 40450 - Lonoke - AR - US - 34.78 - -91.88 - 0 - 0 - LZK - - - MOZ042 - 250420 - Audrain - MO - US - 39.21 - -91.87 - 0 - 0 - LSX - - - IAZ010 - 150100 - Winneshiek - IA - US - 43.29 - -91.85 - 0 - 0 - ARX - - - IAZ029 - 150290 - Fayette - IA - US - 42.86 - -91.85 - 0 - 0 - ARX - - - WIZ015 - 490150 - Barron - WI - US - 45.43 - -91.85 - 0 - 0 - MPX - - - IAZ040 - 150400 - Buchanan - IA - US - 42.47 - -91.84 - 0 - 0 - DVN - - - ARZ056 - 40560 - Jefferson - AR - US - 34.28 - -91.83 - 0 - 0 - LZK - - - LAZ053 - 180530 - Iberia - LA - US - 29.93 - -91.81 - 0 - 0 - LCH - - - WIZ032 - 490320 - Buffalo - WI - US - 44.32 - -91.81 - 0 - 0 - ARX - - - ARZ006 - 40060 - Fulton - AR - US - 36.38 - -91.80 - 0 - 0 - LZK - - - ARZ074 - 40740 - Ashley - AR - US - 33.20 - -91.79 - 0 - 0 - JAN - - - WIZ007 - 490070 - Washburn - WI - US - 45.90 - -91.79 - 0 - 0 - DLH - - - MOZ071 - 250710 - Phelps - MO - US - 37.88 - -91.78 - 0 - 0 - SGF - - - LAZ007 - 180070 - Morehouse - LA - US - 32.77 - -91.75 - 0 - 0 - JAN - - - ARZ033 - 40330 - White - AR - US - 35.28 - -91.73 - 0 - 0 - LZK - - - LAZ015 - 180150 - Richland - LA - US - 32.42 - -91.73 - 0 - 0 - JAN - - - ARZ069 - 40690 - Drew - AR - US - 33.59 - -91.72 - 0 - 0 - LZK - - - IAZ077 - 150770 - Washington - IA - US - 41.34 - -91.71 - 0 - 0 - DVN - - - MOZ010 - 250100 - Clark - MO - US - 40.43 - -91.70 - 0 - 0 - DVN - - - MOZ019 - 250190 - Lewis - MO - US - 40.10 - -91.70 - 0 - 0 - LSX - - - ARZ064 - 40640 - Lincoln - AR - US - 33.98 - -91.69 - 0 - 0 - LZK - - - MNZ088 - 230880 - Winona - MN - US - 44.02 - -91.69 - 0 - 0 - ARX - - - LAZ023 - 180230 - Franklin - LA - US - 32.14 - -91.68 - 0 - 0 - JAN - - - LAZ034 - 180340 - Pointe_Coupee - LA - US - 30.76 - -91.67 - 0 - 0 - LIX - - - LAZ045 - 180450 - Upper_St._Martin - LA - US - 30.27 - -91.67 - 0 - 0 - LCH - - - LAZ026 - 180260 - Concordia - LA - US - 31.37 - -91.61 - 0 - 0 - JAN - - - IAZ052 - 150520 - Linn - IA - US - 42.07 - -91.60 - 0 - 0 - DVN - - - IAZ064 - 150640 - Johnson - IA - US - 41.64 - -91.60 - 0 - 0 - DVN - - - MOZ027 - 250270 - Marion - MO - US - 39.80 - -91.58 - 0 - 0 - LSX - - - ARZ046 - 40460 - Prairie - AR - US - 34.79 - -91.57 - 0 - 0 - LZK - - - ARZ016 - 40160 - Independence - AR - US - 35.73 - -91.54 - 0 - 0 - LZK - - - IAZ088 - 150880 - Henry - IA - US - 40.99 - -91.54 - 0 - 0 - DVN - - - MNZ020 - 230200 - Southern_Lake/North_Shore - MN - US - 47.31 - -91.51 - 0 - 0 - DLH - - - MOZ059 - 250590 - Gasconade - MO - US - 38.44 - -91.51 - 0 - 0 - LSX - - - ARZ007 - 40070 - Sharp - AR - US - 36.19 - -91.49 - 0 - 0 - LZK - - - MOZ083 - 250830 - Dent - MO - US - 37.60 - -91.49 - 0 - 0 - SGF - - - MNZ096 - 230960 - Houston - MN - US - 43.67 - -91.48 - 0 - 0 - ARX - - - LAZ054 - 180540 - St._Mary - LA - US - 29.72 - -91.47 - 0 - 0 - LCH - - - LAZ035 - 180350 - West_Feliciana - LA - US - 30.86 - -91.46 - 0 - 0 - LIX - - - MOZ035 - 250350 - Ralls - MO - US - 39.50 - -91.46 - 0 - 0 - LSX - - - MOZ051 - 250510 - Montgomery - MO - US - 38.91 - -91.46 - 0 - 0 - LSX - - - LAZ008 - 180080 - West_Carroll - LA - US - 32.80 - -91.44 - 0 - 0 - JAN - - - IAZ099 - 150990 - Lee - IA - US - 40.59 - -91.42 - 0 - 0 - DVN - - - MNZ012 - 230120 - Northern_Cook/Northern_Lake - MN - US - 47.70 - -91.41 - 0 - 0 - DLH - - - MOZ106 - 251060 - Oregon - MO - US - 36.69 - -91.40 - 0 - 0 - SGF - - - MSZ060 - 240600 - Adams - MS - US - 31.49 - -91.40 - 0 - 0 - JAN - - - WIZ033 - 490330 - Trempealeau - WI - US - 44.29 - -91.38 - 0 - 0 - ARX - - - ARZ057 - 40570 - Arkansas - AR - US - 34.25 - -91.37 - 0 - 0 - LZK - - - IAZ041 - 150410 - Delaware - IA - US - 42.47 - -91.37 - 0 - 0 - DVN - - - LAZ046 - 180460 - Iberville - LA - US - 30.27 - -91.35 - 0 - 0 - LIX - - - MOZ098 - 250980 - Shannon - MO - US - 37.15 - -91.35 - 0 - 0 - SGF - - - IAZ011 - 150110 - Allamakee - IA - US - 43.29 - -91.34 - 0 - 0 - ARX - - - MSZ068 - 240680 - Wilkinson - MS - US - 31.19 - -91.34 - 0 - 0 - LIX - - - MOZ072 - 250720 - Crawford - MO - US - 37.95 - -91.32 - 0 - 0 - LSX - - - ARZ025 - 40250 - Jackson - AR - US - 35.63 - -91.31 - 0 - 0 - LZK - - - LAZ047 - 180470 - West_Baton_Rouge - LA - US - 30.49 - -91.31 - 0 - 0 - LIX - - - LAZ025 - 180250 - Tensas - LA - US - 32.00 - -91.30 - 0 - 0 - JAN - - - WIZ027 - 490270 - Chippewa - WI - US - 45.07 - -91.29 - 0 - 0 - MPX - - - WIZ028 - 490280 - Eau_Claire - WI - US - 44.73 - -91.29 - 0 - 0 - MPX - - - LAZ055 - 180550 - Lower_St._Martin - LA - US - 29.85 - -91.28 - 0 - 0 - LCH - - - ARZ034 - 40340 - Woodruff - AR - US - 35.18 - -91.26 - 0 - 0 - LZK - - - ARZ075 - 40750 - Chicot - AR - US - 33.29 - -91.25 - 0 - 0 - JAN - - - IAZ030 - 150300 - Clayton - IA - US - 42.86 - -91.25 - 0 - 0 - ARX - - - LAZ009 - 180090 - East_Carroll - LA - US - 32.78 - -91.23 - 0 - 0 - JAN - - - IAZ078 - 150780 - Louisa - IA - US - 41.25 - -91.22 - 0 - 0 - DVN - - - ILZ095 - 130950 - Adams - IL - US - 39.98 - -91.22 - 0 - 0 - LSX - - - ARZ047 - 40470 - Monroe - AR - US - 34.67 - -91.21 - 0 - 0 - LZK - - - ARZ065 - 40650 - Desha - AR - US - 33.82 - -91.21 - 0 - 0 - LZK - - - ILZ034 - 130340 - Hancock - IL - US - 40.42 - -91.21 - 0 - 0 - DVN - - - LAZ016 - 180160 - Madison - LA - US - 32.35 - -91.21 - 0 - 0 - JAN - - - MOZ060 - 250600 - Warren - MO - US - 38.77 - -91.19 - 0 - 0 - LSX - - - IAZ089 - 150890 - Des_Moines - IA - US - 40.89 - -91.18 - 0 - 0 - DVN - - - WIZ041 - 490410 - La_Crosse - WI - US - 43.91 - -91.17 - 0 - 0 - ARX - - - WIZ002 - 490020 - Bayfield - WI - US - 46.58 - -91.15 - 0 - 0 - DLH - - - IAZ065 - 150650 - Cedar - IA - US - 41.77 - -91.14 - 0 - 0 - DVN - - - IAZ053 - 150530 - Jones - IA - US - 42.12 - -91.13 - 0 - 0 - DVN - - - WIZ008 - 490080 - Sawyer - WI - US - 45.90 - -91.12 - 0 - 0 - DLH - - - WIZ016 - 490160 - Rusk - WI - US - 45.47 - -91.11 - 0 - 0 - MPX - - - MOZ036 - 250360 - Pike - MO - US - 39.37 - -91.10 - 0 - 0 - LSX - - - ARZ008 - 40080 - Randolph - AR - US - 36.32 - -91.08 - 0 - 0 - MEG - - - IAZ067 - 150670 - Muscatine - IA - US - 41.47 - -91.08 - 0 - 0 - DVN - - - LAZ048 - 180480 - East_Baton_Rouge - LA - US - 30.52 - -91.08 - 0 - 0 - LIX - - - LAZ036 - 180360 - East_Feliciana - LA - US - 30.83 - -91.07 - 0 - 0 - LIX - - - LAZ056 - 180560 - Assumption - LA - US - 29.86 - -91.07 - 0 - 0 - LIX - - - MOZ062 - 250620 - Franklin - MO - US - 38.45 - -91.06 - 0 - 0 - LSX - - - ARZ017 - 40170 - Lawrence - AR - US - 36.07 - -91.05 - 0 - 0 - MEG - - - MSZ059 - 240590 - Jefferson - MS - US - 31.75 - -91.05 - 0 - 0 - JAN - - - MOZ099 - 250990 - Reynolds - MO - US - 37.33 - -91.03 - 0 - 0 - LSX - - - MSZ040 - 240400 - Issaquena - MS - US - 32.73 - -91.01 - 0 - 0 - JAN - - - ILZ025 - 130250 - Henderson - IL - US - 40.85 - -91.00 - 0 - 0 - DVN - - - MSZ053 - 240530 - Claiborne - MS - US - 32.01 - -90.98 - 0 - 0 - JAN - - - ILZ097 - 130970 - Pike - IL - US - 39.62 - -90.97 - 0 - 0 - LSX - - - MOZ052 - 250520 - Lincoln - MO - US - 39.05 - -90.97 - 0 - 0 - LSX - - - MOZ107 - 251070 - Carter - MO - US - 36.96 - -90.95 - 0 - 0 - PAH - - - MSZ034 - 240340 - Washington - MS - US - 33.28 - -90.95 - 0 - 0 - JAN - - - MSZ018 - 240180 - Bolivar - MS - US - 33.83 - -90.94 - 0 - 0 - JAN - - - WIZ054 - 490540 - Crawford - WI - US - 43.21 - -90.94 - 0 - 0 - ARX - - - MSZ061 - 240610 - Franklin - MS - US - 31.47 - -90.89 - 0 - 0 - JAN - - - LAZ049 - 180490 - Ascension - LA - US - 30.21 - -90.87 - 0 - 0 - LIX - - - MOZ073 - 250730 - Washington - MO - US - 37.97 - -90.87 - 0 - 0 - LSX - - - LAZ066 - 180660 - Lower_Terrebonne - LA - US - 29.34 - -90.86 - 0 - 0 - LIX - - - MOZ108 - 251080 - Ripley - MO - US - 36.66 - -90.86 - 0 - 0 - PAH - - - MSZ047 - 240470 - Warren - MS - US - 32.34 - -90.86 - 0 - 0 - JAN - - - ARZ058 - 40580 - Phillips - AR - US - 34.39 - -90.82 - 0 - 0 - MEG - - - IAZ042 - 150420 - Dubuque - IA - US - 42.49 - -90.82 - 0 - 0 - DVN - - - LAZ065 - 180650 - Upper_Terrebonne - LA - US - 29.67 - -90.82 - 0 - 0 - LIX - - - MSZ069 - 240690 - Amite - MS - US - 31.18 - -90.82 - 0 - 0 - LIX - - - MSZ041 - 240410 - Sharkey - MS - US - 32.89 - -90.81 - 0 - 0 - JAN - - - LAZ057 - 180570 - St._James - LA - US - 30.03 - -90.80 - 0 - 0 - LIX - - - WIZ053 - 490530 - Vernon - WI - US - 43.58 - -90.79 - 0 - 0 - ARX - - - WIZ061 - 490610 - Grant - WI - US - 42.86 - -90.79 - 0 - 0 - ARX - - - ARZ035 - 40350 - Cross - AR - US - 35.30 - -90.77 - 0 - 0 - MEG - - - ARZ048 - 40480 - St._Francis - AR - US - 35.01 - -90.77 - 0 - 0 - MEG - - - ILZ024 - 130240 - Mercer - IL - US - 41.20 - -90.77 - 0 - 0 - DVN - - - ARZ049 - 40490 - Lee - AR - US - 34.77 - -90.75 - 0 - 0 - MEG - - - WIZ034 - 490340 - Jackson - WI - US - 44.33 - -90.74 - 0 - 0 - ARX - - - LAZ037 - 180370 - St._Helena - LA - US - 30.83 - -90.73 - 0 - 0 - LIX - - - ILZ096 - 130960 - Brown - IL - US - 39.98 - -90.72 - 0 - 0 - LSX - - - LAZ050 - 180500 - Livingston - LA - US - 30.42 - -90.72 - 0 - 0 - LIX - - - ILZ098 - 130980 - Calhoun - IL - US - 39.14 - -90.71 - 0 - 0 - LSX - - - ILZ035 - 130350 - McDonough - IL - US - 40.46 - -90.68 - 0 - 0 - DVN - - - MOZ084 - 250840 - Iron - MO - US - 37.51 - -90.67 - 0 - 0 - LSX - - - MSZ010 - 240100 - Coahoma - MS - US - 34.26 - -90.67 - 0 - 0 - MEG - - - ARZ026 - 40260 - Craighead - AR - US - 35.85 - -90.66 - 0 - 0 - MEG - - - ARZ027 - 40270 - Poinsett - AR - US - 35.58 - -90.66 - 0 - 0 - MEG - - - WIZ042 - 490420 - Monroe - WI - US - 43.94 - -90.64 - 0 - 0 - ARX - - - ILZ026 - 130260 - Warren - IL - US - 40.85 - -90.62 - 0 - 0 - DVN - - - MNZ021 - 230210 - Southern_Cook/North_Shore - MN - US - 47.75 - -90.62 - 0 - 0 - DLH - - - WIZ003 - 490030 - Ashland - WI - US - 46.53 - -90.62 - 0 - 0 - DLH - - - WIZ029 - 490290 - Clark - WI - US - 44.73 - -90.62 - 0 - 0 - ARX - - - IAZ068 - 150680 - Scott - IA - US - 41.61 - -90.61 - 0 - 0 - DVN - - - MSZ019 - 240190 - Sunflower - MS - US - 33.63 - -90.61 - 0 - 0 - JAN - - - ILZ040 - 130400 - Schuyler - IL - US - 40.13 - -90.57 - 0 - 0 - ILX - - - LAZ059 - 180590 - Upper_Lafourche - LA - US - 29.74 - -90.57 - 0 - 0 - LIX - - - MOZ061 - 250610 - St._Charles - MO - US - 38.75 - -90.54 - 0 - 0 - LSX - - - MOZ074 - 250740 - St._Francois - MO - US - 37.86 - -90.54 - 0 - 0 - LSX - - - MSZ035 - 240350 - Humphreys - MS - US - 33.13 - -90.53 - 0 - 0 - JAN - - - IAZ054 - 150540 - Jackson - IA - US - 42.21 - -90.52 - 0 - 0 - DVN - - - IAZ066 - 150660 - Clinton - IA - US - 41.88 - -90.52 - 0 - 0 - DVN - - - MOZ065 - 250650 - Jefferson - MO - US - 38.25 - -90.52 - 0 - 0 - LSX - - - ARZ018 - 40180 - Greene - AR - US - 36.12 - -90.51 - 0 - 0 - MEG - - - LAZ058 - 180580 - St._John_The_Baptist - LA - US - 30.09 - -90.50 - 0 - 0 - LIX - - - MSZ062 - 240620 - Lincoln - MS - US - 31.54 - -90.49 - 0 - 0 - JAN - - - WIZ017 - 490170 - Taylor - WI - US - 45.21 - -90.48 - 0 - 0 - ARX - - - ILZ049 - 130490 - Scott - IL - US - 39.66 - -90.47 - 0 - 0 - ILX - - - MOZ100 - 251000 - Wayne - MO - US - 37.12 - -90.45 - 0 - 0 - PAH - - - ARZ009 - 40090 - Clay - AR - US - 36.35 - -90.43 - 0 - 0 - MEG - - - MOZ063 - 250630 - St._Louis - MO - US - 38.64 - -90.43 - 0 - 0 - LSX - - - WIZ055 - 490550 - Richland - WI - US - 43.36 - -90.43 - 0 - 0 - ARX - - - MSZ054 - 240540 - Copiah - MS - US - 31.87 - -90.42 - 0 - 0 - JAN - - - MOZ109 - 251090 - Butler - MO - US - 36.71 - -90.41 - 0 - 0 - PAH - - - LAZ038 - 180380 - Tangipahoa - LA - US - 30.65 - -90.40 - 0 - 0 - LIX - - - MSZ070 - 240700 - Pike - MS - US - 31.18 - -90.40 - 0 - 0 - LIX - - - ILZ058 - 130580 - Greene - IL - US - 39.32 - -90.39 - 0 - 0 - LSX - - - MSZ007 - 240070 - Tunica - MS - US - 34.66 - -90.39 - 0 - 0 - MEG - - - MSZ048 - 240480 - Hinds - MS - US - 32.31 - -90.39 - 0 - 0 - JAN - - - ILZ099 - 130990 - Jersey - IL - US - 39.09 - -90.38 - 0 - 0 - LSX - - - MSZ042 - 240420 - Yazoo - MS - US - 32.77 - -90.36 - 0 - 0 - JAN - - - WIZ009 - 490090 - Price - WI - US - 45.68 - -90.36 - 0 - 0 - DLH - - - MOZ085 - 250850 - Madison - MO - US - 37.48 - -90.35 - 0 - 0 - LSX - - - LAZ060 - 180600 - St._Charles - LA - US - 29.89 - -90.34 - 0 - 0 - LIX - - - ILZ015 - 130150 - Rock_Island - IL - US - 41.56 - -90.31 - 0 - 0 - DVN - - - ILZ001 - 130010 - Jo_Daviess - IL - US - 42.35 - -90.29 - 0 - 0 - DVN - - - ILZ047 - 130470 - Cass - IL - US - 40.00 - -90.29 - 0 - 0 - ILX - - - LAZ067 - 180670 - Lower_Lafourche - LA - US - 29.31 - -90.29 - 0 - 0 - LIX - - - MSZ011 - 240110 - Quitman - MS - US - 34.30 - -90.29 - 0 - 0 - MEG - - - ARZ036 - 40360 - Crittenden - AR - US - 35.14 - -90.28 - 0 - 0 - MEG - - - ILZ050 - 130500 - Morgan - IL - US - 39.70 - -90.27 - 0 - 0 - ILX - - - MSZ025 - 240250 - Leflore - MS - US - 33.53 - -90.27 - 0 - 0 - JAN - - - MOZ064 - 250640 - St._Louis_City - MO - US - 38.65 - -90.24 - 0 - 0 - LSX - - - WIZ004 - 490040 - Iron - WI - US - 46.29 - -90.23 - 0 - 0 - DLH - - - ILZ027 - 130270 - Knox - IL - US - 40.93 - -90.22 - 0 - 0 - ILX - - - MOZ075 - 250750 - Ste._Genevieve - MO - US - 37.90 - -90.20 - 0 - 0 - LSX - - - MSZ020 - 240200 - Tallahatchie - MS - US - 33.93 - -90.19 - 0 - 0 - MEG - - - ILZ036 - 130360 - Fulton - IL - US - 40.45 - -90.16 - 0 - 0 - ILX - - - ILZ016 - 130160 - Henry - IL - US - 41.37 - -90.15 - 0 - 0 - DVN - - - ILZ102 - 131020 - Monroe - IL - US - 38.30 - -90.14 - 0 - 0 - LSX - - - LAZ061 - 180610 - Upper_Jefferson - LA - US - 29.81 - -90.14 - 0 - 0 - LIX - - - WIZ062 - 490620 - Iowa - WI - US - 43.01 - -90.13 - 0 - 0 - MKX - - - WIZ067 - 490670 - Lafayette - WI - US - 42.66 - -90.13 - 0 - 0 - MKX - - - MSZ063 - 240630 - Lawrence - MS - US - 31.55 - -90.10 - 0 - 0 - JAN - - - MSZ036 - 240360 - Holmes - MS - US - 33.13 - -90.09 - 0 - 0 - JAN - - - MSZ043 - 240430 - Madison - MS - US - 32.65 - -90.08 - 0 - 0 - JAN - - - LAZ068 - 180680 - Lower_Jefferson - LA - US - 29.56 - -90.07 - 0 - 0 - LIX - - - MSZ071 - 240710 - Walthall - MS - US - 31.18 - -90.05 - 0 - 0 - LIX - - - WIZ043 - 490430 - Juneau - WI - US - 43.95 - -90.05 - 0 - 0 - ARX - - - MOZ086 - 250860 - Bollinger - MO - US - 37.32 - -90.04 - 0 - 0 - PAH - - - LAZ039 - 180390 - Washington - LA - US - 30.84 - -90.03 - 0 - 0 - LIX - - - WIZ035 - 490350 - Wood - WI - US - 44.47 - -90.02 - 0 - 0 - GRB - - - ILZ007 - 130070 - Carroll - IL - US - 42.06 - -90.01 - 0 - 0 - DVN - - - MOZ113 - 251130 - Dunklin - MO - US - 36.31 - -90.01 - 0 - 0 - MEG - - - MSZ001 - 240010 - De_Soto - MS - US - 34.86 - -90.01 - 0 - 0 - MEG - - - ILZ101 - 131010 - St._Clair - IL - US - 38.44 - -89.99 - 0 - 0 - LSX - - - ILZ041 - 130410 - Mason - IL - US - 40.25 - -89.98 - 0 - 0 - ILX - - - MOZ110 - 251100 - Stoddard - MO - US - 36.88 - -89.98 - 0 - 0 - PAH - - - MSZ049 - 240490 - Rankin - MS - US - 32.33 - -89.98 - 0 - 0 - JAN - - - TNZ088 - 420880 - Shelby - TN - US - 35.21 - -89.97 - 0 - 0 - MEG - - - ARZ028 - 40280 - Mississippi - AR - US - 35.71 - -89.96 - 0 - 0 - MEG - - - LAZ063 - 180630 - Upper_Plaquemines - LA - US - 29.77 - -89.96 - 0 - 0 - LIX - - - MSZ012 - 240120 - Panola - MS - US - 34.36 - -89.96 - 0 - 0 - MEG - - - WIZ056 - 490560 - Sauk - WI - US - 43.40 - -89.96 - 0 - 0 - MKX - - - ILZ009 - 130090 - Whiteside - IL - US - 41.76 - -89.95 - 0 - 0 - DVN - - - MSZ008 - 240080 - Tate - MS - US - 34.67 - -89.95 - 0 - 0 - MEG - - - ILZ100 - 131000 - Madison - IL - US - 38.83 - -89.94 - 0 - 0 - LSX - - - MSZ055 - 240550 - Simpson - MS - US - 31.91 - -89.94 - 0 - 0 - JAN - - - ILZ059 - 130590 - Macoupin - IL - US - 39.26 - -89.93 - 0 - 0 - LSX - - - MSZ027 - 240270 - Carroll - MS - US - 33.45 - -89.91 - 0 - 0 - JAN - - - ILZ079 - 130790 - Randolph - IL - US - 38.01 - -89.90 - 0 - 0 - LSX - - - LAZ040 - 180400 - St._Tammany - LA - US - 30.44 - -89.89 - 0 - 0 - LIX - - - LAZ062 - 180620 - Orleans - LA - US - 30.03 - -89.88 - 0 - 0 - LIX - - - LAZ064 - 180640 - Upper_St._Bernard - LA - US - 29.91 - -89.86 - 0 - 0 - LIX - - - MSZ072 - 240720 - Marion - MS - US - 31.22 - -89.85 - 0 - 0 - JAN - - - MOZ076 - 250760 - Perry - MO - US - 37.74 - -89.83 - 0 - 0 - PAH - - - ILZ028 - 130280 - Stark - IL - US - 41.11 - -89.82 - 0 - 0 - ILX - - - MSZ026 - 240260 - Grenada - MS - US - 33.79 - -89.82 - 0 - 0 - JAN - - - TNZ049 - 420490 - Tipton - TN - US - 35.51 - -89.82 - 0 - 0 - MEG - - - WIZ044 - 490440 - Adams - WI - US - 43.95 - -89.81 - 0 - 0 - ARX - - - ILZ048 - 130480 - Menard - IL - US - 40.04 - -89.79 - 0 - 0 - ILX - - - MSZ064 - 240640 - Jefferson_Davis - MS - US - 31.59 - -89.78 - 0 - 0 - JAN - - - WIZ030 - 490300 - Marathon - WI - US - 44.90 - -89.76 - 0 - 0 - GRB - - - MOZ115 - 251150 - Pemiscot - MO - US - 36.21 - -89.75 - 0 - 0 - MEG - - - WIZ018 - 490180 - Lincoln - WI - US - 45.34 - -89.73 - 0 - 0 - GRB - - - ILZ029 - 130290 - Peoria - IL - US - 40.75 - -89.72 - 0 - 0 - ILX - - - MSZ021 - 240210 - Yalobusha - MS - US - 34.03 - -89.72 - 0 - 0 - MEG - - - MIZ009 - 220090 - Gogebic - MI - US - 46.44 - -89.70 - 0 - 0 - MQT - - - ILZ002 - 130020 - Stephenson - IL - US - 42.35 - -89.66 - 0 - 0 - DVN - - - MOZ114 - 251140 - New_Madrid - MO - US - 36.61 - -89.66 - 0 - 0 - PAH - - - MOZ087 - 250870 - Cape_Girardeau - MO - US - 37.37 - -89.65 - 0 - 0 - PAH - - - TNZ048 - 420480 - Lauderdale - TN - US - 35.75 - -89.65 - 0 - 0 - MEG - - - MSZ037 - 240370 - Attala - MS - US - 33.09 - -89.64 - 0 - 0 - JAN - - - ILZ051 - 130510 - Sangamon - IL - US - 39.75 - -89.61 - 0 - 0 - ILX - - - ILZ037 - 130370 - Tazewell - IL - US - 40.54 - -89.60 - 0 - 0 - ILX - - - WIZ068 - 490680 - Green - WI - US - 42.68 - -89.60 - 0 - 0 - MKX - - - LAZ070 - 180700 - Lower_St._Bernard - LA - US - 29.85 - -89.59 - 0 - 0 - LIX - - - MSZ077 - 240770 - Pearl_River - MS - US - 30.74 - -89.59 - 0 - 0 - LIX - - - MSZ028 - 240280 - Montgomery - MS - US - 33.49 - -89.58 - 0 - 0 - JAN - - - MSZ065 - 240650 - Covington - MS - US - 31.62 - -89.57 - 0 - 0 - JAN - - - MOZ111 - 251110 - Scott - MO - US - 37.06 - -89.55 - 0 - 0 - PAH - - - MSZ050 - 240500 - Scott - MS - US - 32.43 - -89.55 - 0 - 0 - JAN - - - WIZ010 - 490100 - Oneida - WI - US - 45.68 - -89.54 - 0 - 0 - GRB - - - MSZ056 - 240560 - Smith - MS - US - 32.01 - -89.53 - 0 - 0 - JAN - - - WIZ036 - 490360 - Portage - WI - US - 44.46 - -89.53 - 0 - 0 - GRB - - - ILZ017 - 130170 - Bureau - IL - US - 41.37 - -89.52 - 0 - 0 - DVN - - - MSZ044 - 240440 - Leake - MS - US - 32.76 - -89.52 - 0 - 0 - JAN - - - TNZ001 - 420010 - Lake - TN - US - 36.34 - -89.52 - 0 - 0 - MEG - - - MSZ073 - 240730 - Lamar - MS - US - 31.21 - -89.50 - 0 - 0 - JAN - - - MSZ080 - 240800 - Hancock - MS - US - 30.42 - -89.50 - 0 - 0 - LIX - - - LAZ069 - 180690 - Lower_Plaquemines - LA - US - 29.37 - -89.48 - 0 - 0 - LIX - - - MSZ002 - 240020 - Marshall - MS - US - 34.75 - -89.48 - 0 - 0 - MEG - - - MSZ013 - 240130 - Lafayette - MS - US - 34.37 - -89.48 - 0 - 0 - MEG - - - WIZ005 - 490050 - Vilas - WI - US - 46.08 - -89.48 - 0 - 0 - GRB - - - ILZ064 - 130640 - Bond - IL - US - 38.88 - -89.45 - 0 - 0 - LSX - - - TNZ019 - 420190 - Dyer - TN - US - 36.05 - -89.44 - 0 - 0 - MEG - - - ILZ069 - 130690 - Clinton - IL - US - 38.58 - -89.43 - 0 - 0 - LSX - - - ILZ074 - 130740 - Washington - IL - US - 38.36 - -89.43 - 0 - 0 - LSX - - - ILZ060 - 130600 - Montgomery - IL - US - 39.26 - -89.42 - 0 - 0 - LSX - - - ILZ084 - 130840 - Jackson - IL - US - 37.76 - -89.42 - 0 - 0 - PAH - - - TNZ089 - 420890 - Fayette - TN - US - 35.20 - -89.42 - 0 - 0 - MEG - - - WIZ063 - 490630 - Dane - WI - US - 43.07 - -89.42 - 0 - 0 - MKX - - - WIZ057 - 490570 - Columbia - WI - US - 43.47 - -89.39 - 0 - 0 - MKX - - - ILZ042 - 130420 - Logan - IL - US - 40.12 - -89.38 - 0 - 0 - ILX - - - WIZ046 - 490460 - Marquette - WI - US - 43.81 - -89.38 - 0 - 0 - MKX - - - MIZ002 - 220020 - Ontonagon - MI - US - 46.68 - -89.37 - 0 - 0 - MQT - - - ILZ080 - 130800 - Perry - IL - US - 38.08 - -89.36 - 0 - 0 - PAH - - - ILZ030 - 130300 - Marshall - IL - US - 41.04 - -89.35 - 0 - 0 - ILX - - - ILZ008 - 130080 - Ogle - IL - US - 42.04 - -89.32 - 0 - 0 - LOT - - - ILZ018 - 130180 - Putnam - IL - US - 41.21 - -89.32 - 0 - 0 - DVN - - - ILZ092 - 130920 - Alexander - IL - US - 37.16 - -89.32 - 0 - 0 - PAH - - - MOZ112 - 251120 - Mississippi - MO - US - 36.83 - -89.32 - 0 - 0 - PAH - - - MSZ022 - 240220 - Calhoun - MS - US - 33.95 - -89.32 - 0 - 0 - MEG - - - ILZ010 - 130100 - Lee - IL - US - 41.75 - -89.29 - 0 - 0 - LOT - - - ILZ052 - 130520 - Christian - IL - US - 39.58 - -89.29 - 0 - 0 - ILX - - - ILZ088 - 130880 - Union - IL - US - 37.47 - -89.29 - 0 - 0 - PAH - - - MSZ074 - 240740 - Forrest - MS - US - 31.18 - -89.29 - 0 - 0 - JAN - - - TNZ050 - 420500 - Haywood - TN - US - 35.61 - -89.29 - 0 - 0 - MEG - - - MSZ032 - 240320 - Choctaw - MS - US - 33.33 - -89.27 - 0 - 0 - JAN - - - MSZ029 - 240290 - Webster - MS - US - 33.60 - -89.26 - 0 - 0 - JAN - - - ILZ031 - 130310 - Woodford - IL - US - 40.76 - -89.25 - 0 - 0 - ILX - - - WIZ045 - 490450 - Waushara - WI - US - 44.11 - -89.24 - 0 - 0 - GRB - - - KYZ001 - 170010 - Fulton - KY - US - 36.58 - -89.20 - 0 - 0 - PAH - - - ILZ003 - 130030 - Winnebago - IL - US - 42.32 - -89.17 - 0 - 0 - LOT - - - MSZ003 - 240030 - Benton - MS - US - 34.80 - -89.17 - 0 - 0 - MEG - - - MSZ066 - 240660 - Jones - MS - US - 31.63 - -89.16 - 0 - 0 - JAN - - - TNZ002 - 420020 - Obion - TN - US - 36.35 - -89.14 - 0 - 0 - MEG - - - TNZ051 - 420510 - Crockett - TN - US - 35.84 - -89.13 - 0 - 0 - MEG - - - MSZ051 - 240510 - Newton - MS - US - 32.41 - -89.12 - 0 - 0 - JAN - - - MSZ045 - 240450 - Neshoba - MS - US - 32.76 - -89.11 - 0 - 0 - JAN - - - MSZ057 - 240570 - Jasper - MS - US - 32.02 - -89.11 - 0 - 0 - JAN - - - ILZ093 - 130930 - Pulaski - IL - US - 37.20 - -89.10 - 0 - 0 - PAH - - - MSZ078 - 240780 - Stone - MS - US - 30.78 - -89.10 - 0 - 0 - MOB - - - WIZ069 - 490690 - Rock - WI - US - 42.67 - -89.07 - 0 - 0 - MKX - - - MSZ038 - 240380 - Winston - MS - US - 33.11 - -89.06 - 0 - 0 - JAN - - - MSZ081 - 240810 - Harrison - MS - US - 30.44 - -89.06 - 0 - 0 - LIX - - - WIZ047 - 490470 - Green_Lake - WI - US - 43.81 - -89.06 - 0 - 0 - MKX - - - MSZ015 - 240150 - Pontotoc - MS - US - 34.23 - -89.03 - 0 - 0 - MEG - - - WIZ019 - 490190 - Langlade - WI - US - 45.25 - -89.03 - 0 - 0 - GRB - - - KYZ002 - 170020 - Hickman - KY - US - 36.65 - -89.01 - 0 - 0 - PAH - - - KYZ003 - 170030 - Carlisle - KY - US - 36.87 - -89.00 - 0 - 0 - PAH - - - KYZ004 - 170040 - Ballard - KY - US - 37.07 - -89.00 - 0 - 0 - PAH - - - ILZ053 - 130530 - Macon - IL - US - 39.86 - -88.99 - 0 - 0 - ILX - - - TNZ090 - 420900 - Hardeman - TN - US - 35.22 - -88.99 - 0 - 0 - MEG - - - ILZ065 - 130650 - Fayette - IL - US - 38.98 - -88.98 - 0 - 0 - LSX - - - MSZ014 - 240140 - Union - MS - US - 34.49 - -88.98 - 0 - 0 - MEG - - - MSZ075 - 240750 - Perry - MS - US - 31.18 - -88.98 - 0 - 0 - MOB - - - MSZ023 - 240230 - Chickasaw - MS - US - 33.91 - -88.95 - 0 - 0 - MEG - - - TNZ020 - 420200 - Gibson - TN - US - 36.01 - -88.95 - 0 - 0 - MEG - - - ILZ081 - 130810 - Franklin - IL - US - 38.00 - -88.94 - 0 - 0 - PAH - - - ILZ075 - 130750 - Jefferson - IL - US - 38.30 - -88.93 - 0 - 0 - PAH - - - ILZ085 - 130850 - Williamson - IL - US - 37.74 - -88.93 - 0 - 0 - PAH - - - ILZ070 - 130700 - Marion - IL - US - 38.65 - -88.92 - 0 - 0 - LSX - - - WIZ037 - 490370 - Waupaca - WI - US - 44.46 - -88.91 - 0 - 0 - GRB - - - MSZ004 - 240040 - Tippah - MS - US - 34.80 - -88.89 - 0 - 0 - MEG - - - ILZ019 - 130190 - La_Salle - IL - US - 41.28 - -88.88 - 0 - 0 - LOT - - - ILZ089 - 130890 - Johnson - IL - US - 37.45 - -88.88 - 0 - 0 - PAH - - - ILZ038 - 130380 - McLean - IL - US - 40.52 - -88.87 - 0 - 0 - ILX - - - ILZ043 - 130430 - De_Witt - IL - US - 40.17 - -88.87 - 0 - 0 - ILX - - - MSZ033 - 240330 - Oktibbeha - MS - US - 33.43 - -88.87 - 0 - 0 - JAN - - - MIZ001 - 220010 - Keweenaw - MI - US - 48.01 - -88.84 - 0 - 0 - MQT - - - TNZ052 - 420520 - Madison - TN - US - 35.62 - -88.84 - 0 - 0 - MEG - - - ILZ004 - 130040 - Boone - IL - US - 42.32 - -88.83 - 0 - 0 - LOT - - - MIZ084 - 220840 - Southern_Houghton - MI - US - 46.64 - -88.83 - 0 - 0 - MQT - - - ILZ061 - 130610 - Shelby - IL - US - 39.43 - -88.81 - 0 - 0 - ILX - - - ILZ011 - 130110 - DeKalb - IL - US - 41.89 - -88.77 - 0 - 0 - LOT - - - WIZ064 - 490640 - Jefferson - WI - US - 43.02 - -88.77 - 0 - 0 - MKX - - - MSZ030 - 240300 - Clay - MS - US - 33.66 - -88.75 - 0 - 0 - JAN - - - TNZ003 - 420030 - Weakley - TN - US - 36.28 - -88.73 - 0 - 0 - MEG - - - WIZ011 - 490110 - Forest - WI - US - 45.72 - -88.73 - 0 - 0 - GRB - - - WIZ020 - 490200 - Menominee - WI - US - 44.99 - -88.73 - 0 - 0 - GRB - - - WIZ031 - 490310 - Shawano - WI - US - 44.81 - -88.73 - 0 - 0 - GRB - - - ILZ094 - 130940 - Massac - IL - US - 37.20 - -88.71 - 0 - 0 - PAH - - - KYZ005 - 170050 - McCracken - KY - US - 37.08 - -88.71 - 0 - 0 - PAH - - - WIZ058 - 490580 - Dodge - WI - US - 43.42 - -88.70 - 0 - 0 - MKX - - - MSZ067 - 240670 - Wayne - MS - US - 31.66 - -88.69 - 0 - 0 - MOB - - - MSZ016 - 240160 - Lee - MS - US - 34.30 - -88.68 - 0 - 0 - MEG - - - MSZ058 - 240580 - Clarke - MS - US - 32.03 - -88.68 - 0 - 0 - JAN - - - KYZ006 - 170060 - Graves - KY - US - 36.73 - -88.66 - 0 - 0 - PAH - - - MSZ052 - 240520 - Lauderdale - MS - US - 32.40 - -88.66 - 0 - 0 - JAN - - - ILZ054 - 130540 - Moultrie - IL - US - 39.62 - -88.64 - 0 - 0 - ILX - - - MSZ079 - 240790 - George - MS - US - 30.87 - -88.64 - 0 - 0 - MOB - - - WIZ048 - 490480 - Winnebago - WI - US - 44.07 - -88.64 - 0 - 0 - GRB - - - MSZ046 - 240460 - Kemper - MS - US - 32.76 - -88.63 - 0 - 0 - JAN - - - MSZ076 - 240760 - Greene - MS - US - 31.22 - -88.63 - 0 - 0 - MOB - - - MSZ082 - 240820 - Jackson - MS - US - 30.47 - -88.63 - 0 - 0 - LIX - - - ILZ044 - 130440 - Piatt - IL - US - 40.04 - -88.61 - 0 - 0 - ILX - - - TNZ053 - 420530 - Chester - TN - US - 35.42 - -88.61 - 0 - 0 - MEG - - - ILZ032 - 130320 - Livingston - IL - US - 40.87 - -88.59 - 0 - 0 - LOT - - - ILZ066 - 130660 - Effingham - IL - US - 39.06 - -88.59 - 0 - 0 - ILX - - - MSZ005 - 240050 - Alcorn - MS - US - 34.88 - -88.58 - 0 - 0 - MEG - - - TNZ091 - 420910 - McNairy - TN - US - 35.20 - -88.58 - 0 - 0 - MEG - - - MIZ003 - 220030 - Northern_Houghton - MI - US - 47.05 - -88.57 - 0 - 0 - MQT - - - ILZ090 - 130900 - Pope - IL - US - 37.34 - -88.56 - 0 - 0 - PAH - - - MSZ039 - 240390 - Noxubee - MS - US - 33.11 - -88.56 - 0 - 0 - JAN - - - MIZ010 - 220100 - Iron - MI - US - 46.18 - -88.55 - 0 - 0 - MQT - - - ILZ082 - 130820 - Hamilton - IL - US - 38.08 - -88.54 - 0 - 0 - PAH - - - ILZ086 - 130860 - Saline - IL - US - 37.76 - -88.54 - 0 - 0 - PAH - - - WIZ070 - 490700 - Walworth - WI - US - 42.67 - -88.53 - 0 - 0 - MKX - - - MSZ009 - 240090 - Prentiss - MS - US - 34.61 - -88.52 - 0 - 0 - MEG - - - WIZ051 - 490510 - Fond_Du_Lac - WI - US - 43.74 - -88.52 - 0 - 0 - MKX - - - ILZ071 - 130710 - Clay - IL - US - 38.76 - -88.48 - 0 - 0 - ILX - - - MSZ024 - 240240 - Monroe - MS - US - 33.87 - -88.46 - 0 - 0 - MEG - - - MSZ031 - 240310 - Lowndes - MS - US - 33.52 - -88.46 - 0 - 0 - JAN - - - WIZ038 - 490380 - Outagamie - WI - US - 44.42 - -88.46 - 0 - 0 - GRB - - - ILZ005 - 130050 - McHenry - IL - US - 42.32 - -88.45 - 0 - 0 - LOT - - - ILZ020 - 130200 - Kendall - IL - US - 41.59 - -88.44 - 0 - 0 - LOT - - - TNZ021 - 420210 - Carroll - TN - US - 35.97 - -88.44 - 0 - 0 - MEG - - - ILZ012 - 130120 - Kane - IL - US - 41.94 - -88.43 - 0 - 0 - LOT - - - ILZ076 - 130760 - Wayne - IL - US - 38.43 - -88.43 - 0 - 0 - PAH - - - ILZ021 - 130210 - Grundy - IL - US - 41.29 - -88.42 - 0 - 0 - LOT - - - TNZ054 - 420540 - Henderson - TN - US - 35.62 - -88.39 - 0 - 0 - MEG - - - WIZ021 - 490210 - Northern_Oconto_County - WI - US - 45.20 - -88.39 - 0 - 0 - GRB - - - KYZ007 - 170070 - Livingston - KY - US - 37.20 - -88.38 - 0 - 0 - PAH - - - WIZ012 - 490120 - Florence - WI - US - 45.87 - -88.36 - 0 - 0 - GRB - - - MSZ017 - 240170 - Itawamba - MS - US - 34.28 - -88.35 - 0 - 0 - MEG - - - MIZ004 - 220040 - Baraga - MI - US - 46.69 - -88.33 - 0 - 0 - MQT - - - KYZ008 - 170080 - Marshall - KY - US - 36.91 - -88.31 - 0 - 0 - PAH - - - WIZ065 - 490650 - Waukesha - WI - US - 43.02 - -88.30 - 0 - 0 - MKX - - - KYZ009 - 170090 - Calloway - KY - US - 36.63 - -88.27 - 0 - 0 - PAH - - - TNZ004 - 420040 - Henry - TN - US - 36.32 - -88.26 - 0 - 0 - MEG - - - ILZ091 - 130910 - Hardin - IL - US - 37.51 - -88.25 - 0 - 0 - PAH - - - ILZ062 - 130620 - Cumberland - IL - US - 39.28 - -88.24 - 0 - 0 - ILX - - - ILZ056 - 130560 - Coles - IL - US - 39.53 - -88.22 - 0 - 0 - ILX - - - MSZ006 - 240060 - Tishomingo - MS - US - 34.73 - -88.22 - 0 - 0 - MEG - - - WIZ049 - 490490 - Calumet - WI - US - 44.07 - -88.22 - 0 - 0 - GRB - - - WIZ059 - 490590 - Washington - WI - US - 43.37 - -88.22 - 0 - 0 - MKX - - - ALZ063 - 10630 - Lower_Mobile - AL - US - 30.44 - -88.21 - 0 - 0 - MOB - - - ILZ055 - 130550 - Douglas - IL - US - 39.77 - -88.21 - 0 - 0 - ILX - - - ILZ087 - 130870 - Gallatin - IL - US - 37.75 - -88.21 - 0 - 0 - PAH - - - ALZ051 - 10510 - Choctaw - AL - US - 32.01 - -88.20 - 0 - 0 - MOB - - - ILZ039 - 130390 - Ford - IL - US - 40.70 - -88.20 - 0 - 0 - LOT - - - ILZ045 - 130450 - Champaign - IL - US - 40.14 - -88.20 - 0 - 0 - ILX - - - ALZ052 - 10520 - Washington - AL - US - 31.41 - -88.18 - 0 - 0 - MOB - - - ALZ061 - 10610 - Upper_Mobile - AL - US - 30.93 - -88.18 - 0 - 0 - MOB - - - TNZ092 - 420920 - Hardin - TN - US - 35.22 - -88.18 - 0 - 0 - MEG - - - ILZ067 - 130670 - Jasper - IL - US - 39.02 - -88.16 - 0 - 0 - ILX - - - ILZ083 - 130830 - White - IL - US - 38.08 - -88.15 - 0 - 0 - PAH - - - ALZ030 - 10300 - Sumter - AL - US - 32.65 - -88.13 - 0 - 0 - BMX - - - WIZ074 - 490740 - Southern_Oconto_County - WI - US - 44.85 - -88.12 - 0 - 0 - GRB - - - ALZ012 - 10120 - Lamar - AL - US - 33.80 - -88.11 - 0 - 0 - BMX - - - ILZ072 - 130720 - Richland - IL - US - 38.72 - -88.11 - 0 - 0 - ILX - - - TNZ055 - 420550 - Decatur - TN - US - 35.62 - -88.10 - 0 - 0 - MEG - - - WIZ013 - 490130 - Northern_Marinette_County - WI - US - 45.57 - -88.10 - 0 - 0 - GRB - - - ALZ022 - 10220 - Pickens - AL - US - 33.26 - -88.09 - 0 - 0 - BMX - - - ILZ013 - 130130 - DuPage - IL - US - 41.85 - -88.09 - 0 - 0 - LOT - - - KYZ010 - 170100 - Crittenden - KY - US - 37.34 - -88.09 - 0 - 0 - PAH - - - KYZ011 - 170110 - Lyon - KY - US - 37.03 - -88.07 - 0 - 0 - PAH - - - TNZ022 - 420220 - Benton - TN - US - 36.09 - -88.07 - 0 - 0 - OHX - - - ILZ077 - 130770 - Edwards - IL - US - 38.42 - -88.05 - 0 - 0 - PAH - - - WIZ072 - 490720 - Kenosha - WI - US - 42.58 - -88.05 - 0 - 0 - MKX - - - WIZ071 - 490710 - Racine - WI - US - 42.73 - -88.03 - 0 - 0 - MKX - - - WIZ039 - 490390 - Brown - WI - US - 44.46 - -87.99 - 0 - 0 - GRB - - - ILZ006 - 130060 - Lake - IL - US - 42.32 - -87.98 - 0 - 0 - LOT - - - ALZ031 - 10310 - Greene - AL - US - 32.84 - -87.96 - 0 - 0 - BMX - - - KYZ014 - 170140 - Union - KY - US - 37.69 - -87.95 - 0 - 0 - PAH - - - WIZ066 - 490660 - Milwaukee - WI - US - 43.02 - -87.94 - 0 - 0 - MKX - - - WIZ073 - 490730 - Southern_Marinette_County - WI - US - 45.18 - -87.94 - 0 - 0 - GRB - - - WIZ052 - 490520 - Sheboygan - WI - US - 43.72 - -87.93 - 0 - 0 - MKX - - - ALZ011 - 10110 - Marion - AL - US - 34.12 - -87.92 - 0 - 0 - BMX - - - KYZ012 - 170120 - Trigg - KY - US - 36.83 - -87.92 - 0 - 0 - PAH - - - WIZ060 - 490600 - Ozaukee - WI - US - 43.37 - -87.92 - 0 - 0 - MKX - - - ILZ014 - 130140 - Cook - IL - US - 41.81 - -87.90 - 0 - 0 - LOT - - - ILZ022 - 130220 - Will - IL - US - 41.47 - -87.90 - 0 - 0 - LOT - - - INZ085 - 140850 - Posey - IN - US - 38.01 - -87.90 - 0 - 0 - PAH - - - ILZ023 - 130230 - Kankakee - IL - US - 41.15 - -87.89 - 0 - 0 - LOT - - - KYZ013 - 170130 - Caldwell - KY - US - 37.17 - -87.89 - 0 - 0 - PAH - - - MIZ011 - 220110 - Dickinson - MI - US - 45.99 - -87.87 - 0 - 0 - MQT - - - ALZ003 - 10030 - Franklin - AL - US - 34.45 - -87.85 - 0 - 0 - HUN - - - TNZ056 - 420560 - Perry - TN - US - 35.64 - -87.85 - 0 - 0 - OHX - - - ALZ053 - 10530 - Clarke - AL - US - 31.60 - -87.84 - 0 - 0 - MOB - - - ILZ033 - 130330 - Iroquois - IL - US - 40.75 - -87.83 - 0 - 0 - LOT - - - TNZ005 - 420050 - Stewart - TN - US - 36.50 - -87.83 - 0 - 0 - OHX - - - ILZ078 - 130780 - Wabash - IL - US - 38.41 - -87.82 - 0 - 0 - PAH - - - TNZ093 - 420930 - Wayne - TN - US - 35.26 - -87.80 - 0 - 0 - OHX - - - ALZ039 - 10390 - Marengo - AL - US - 32.27 - -87.79 - 0 - 0 - BMX - - - ALZ002 - 10020 - Colbert - AL - US - 34.74 - -87.78 - 0 - 0 - HUN - - - ILZ063 - 130630 - Clark - IL - US - 39.33 - -87.78 - 0 - 0 - ILX - - - TNZ024 - 420240 - Humphreys - TN - US - 36.03 - -87.77 - 0 - 0 - OHX - - - WIZ050 - 490500 - Manitowoc - WI - US - 44.11 - -87.77 - 0 - 0 - GRB - - - ILZ057 - 130570 - Edgar - IL - US - 39.68 - -87.75 - 0 - 0 - ILX - - - TNZ023 - 420230 - Houston - TN - US - 36.28 - -87.75 - 0 - 0 - OHX - - - ILZ046 - 130460 - Vermilion - IL - US - 40.19 - -87.74 - 0 - 0 - ILX - - - ILZ068 - 130680 - Crawford - IL - US - 39.02 - -87.74 - 0 - 0 - ILX - - - ALZ062 - 10620 - Upper_Baldwin - AL - US - 31.01 - -87.72 - 0 - 0 - MOB - - - ILZ073 - 130730 - Lawrence - IL - US - 38.72 - -87.71 - 0 - 0 - ILX - - - ALZ001 - 10010 - Lauderdale - AL - US - 34.88 - -87.70 - 0 - 0 - HUN - - - ALZ064 - 10640 - Lower_Baldwin - AL - US - 30.45 - -87.70 - 0 - 0 - MOB - - - ALZ013 - 10130 - Fayette - AL - US - 33.73 - -87.68 - 0 - 0 - BMX - - - KYZ015 - 170150 - Webster - KY - US - 37.50 - -87.66 - 0 - 0 - PAH - - - INZ081 - 140810 - Gibson - IN - US - 38.35 - -87.65 - 0 - 0 - PAH - - - ALZ032 - 10320 - Hale - AL - US - 32.75 - -87.64 - 0 - 0 - BMX - - - KYZ018 - 170180 - Henderson - KY - US - 37.81 - -87.61 - 0 - 0 - PAH - - - MIZ005 - 220050 - Marquette - MI - US - 46.48 - -87.61 - 0 - 0 - MQT - - - INZ086 - 140860 - Vanderburgh - IN - US - 38.00 - -87.58 - 0 - 0 - PAH - - - KYZ016 - 170160 - Hopkins - KY - US - 37.34 - -87.58 - 0 - 0 - PAH - - - MIZ012 - 220120 - Menominee - MI - US - 45.55 - -87.57 - 0 - 0 - MQT - - - WIZ040 - 490400 - Kewaunee - WI - US - 44.50 - -87.57 - 0 - 0 - GRB - - - KYZ017 - 170170 - Christian - KY - US - 36.90 - -87.50 - 0 - 0 - PAH - - - TNZ058 - 420580 - Lewis - TN - US - 35.53 - -87.49 - 0 - 0 - OHX - - - TNZ057 - 420570 - Hickman - TN - US - 35.81 - -87.47 - 0 - 0 - OHX - - - INZ060 - 140600 - Sullivan - IN - US - 39.08 - -87.46 - 0 - 0 - IND - - - ALZ023 - 10230 - Tuscaloosa - AL - US - 33.32 - -87.45 - 0 - 0 - BMX - - - INZ043 - 140430 - Vermillion - IN - US - 39.89 - -87.45 - 0 - 0 - IND - - - INZ067 - 140670 - Knox - IN - US - 38.66 - -87.43 - 0 - 0 - IND - - - INZ051 - 140510 - Vigo - IN - US - 39.43 - -87.42 - 0 - 0 - IND - - - FLZ001 - 90010 - Inland_Escambia - FL - US - 30.86 - -87.40 - 0 - 0 - MOB - - - INZ010 - 140100 - Newton - IN - US - 40.98 - -87.40 - 0 - 0 - LOT - - - TNZ094 - 420940 - Lawrence - TN - US - 35.24 - -87.40 - 0 - 0 - OHX - - - INZ001 - 140010 - Lake - IN - US - 41.44 - -87.38 - 0 - 0 - LOT - - - TNZ006 - 420060 - Montgomery - TN - US - 36.49 - -87.38 - 0 - 0 - OHX - - - ALZ014 - 10140 - Winston - AL - US - 34.15 - -87.37 - 0 - 0 - BMX - - - ALZ055 - 10550 - Monroe - AL - US - 31.54 - -87.35 - 0 - 0 - MOB - - - TNZ025 - 420250 - Dickson - TN - US - 36.15 - -87.35 - 0 - 0 - OHX - - - ALZ004 - 10040 - Lawrence - AL - US - 34.56 - -87.32 - 0 - 0 - HUN - - - INZ019 - 140190 - Benton - IN - US - 40.61 - -87.32 - 0 - 0 - LOT - - - INZ028 - 140280 - Warren - IN - US - 40.31 - -87.32 - 0 - 0 - IND - - - ALZ015 - 10150 - Walker - AL - US - 33.76 - -87.30 - 0 - 0 - BMX - - - INZ082 - 140820 - Pike - IN - US - 38.39 - -87.28 - 0 - 0 - PAH - - - KYZ020 - 170200 - McLean - KY - US - 37.54 - -87.28 - 0 - 0 - PAH - - - ALZ033 - 10330 - Perry - AL - US - 32.59 - -87.27 - 0 - 0 - BMX - - - INZ035 - 140350 - Fountain - IN - US - 40.17 - -87.27 - 0 - 0 - IND - - - WIZ022 - 490220 - Door - WI - US - 45.05 - -87.27 - 0 - 0 - GRB - - - ALZ054 - 10540 - Wilcox - AL - US - 32.05 - -87.26 - 0 - 0 - MOB - - - INZ087 - 140870 - Warrick - IN - US - 38.06 - -87.25 - 0 - 0 - PAH - - - INZ044 - 140440 - Parke - IN - US - 39.79 - -87.23 - 0 - 0 - IND - - - FLZ002 - 90020 - Coastal_Escambia - FL - US - 30.50 - -87.20 - 0 - 0 - MOB - - - KYZ022 - 170220 - Todd - KY - US - 36.86 - -87.20 - 0 - 0 - PAH - - - ALZ059 - 10590 - Escambia - AL - US - 31.13 - -87.16 - 0 - 0 - MOB - - - ALZ034 - 10340 - Bibb - AL - US - 33.04 - -87.15 - 0 - 0 - BMX - - - ALZ040 - 10400 - Dallas - AL - US - 32.38 - -87.14 - 0 - 0 - BMX - - - KYZ021 - 170210 - Muhlenberg - KY - US - 37.23 - -87.14 - 0 - 0 - PAH - - - KYZ019 - 170190 - Daviess - KY - US - 37.75 - -87.12 - 0 - 0 - PAH - - - INZ011 - 140110 - Jasper - IN - US - 41.01 - -87.11 - 0 - 0 - LOT - - - INZ052 - 140520 - Clay - IN - US - 39.39 - -87.10 - 0 - 0 - IND - - - INZ068 - 140680 - Daviess - IN - US - 38.70 - -87.10 - 0 - 0 - IND - - - TNZ026 - 420260 - Cheatham - TN - US - 36.26 - -87.09 - 0 - 0 - OHX - - - INZ002 - 140020 - Porter - IN - US - 41.47 - -87.08 - 0 - 0 - LOT - - - TNZ060 - 420600 - Maury - TN - US - 35.64 - -87.07 - 0 - 0 - OHX - - - ALZ056 - 10560 - Conecuh - AL - US - 31.47 - -87.04 - 0 - 0 - MOB - - - FLZ003 - 90030 - Inland_Santa_Rosa - FL - US - 30.86 - -87.04 - 0 - 0 - MOB - - - ALZ005 - 10050 - Limestone - AL - US - 34.78 - -87.02 - 0 - 0 - HUN - - - INZ088 - 140880 - Spencer - IN - US - 37.99 - -87.02 - 0 - 0 - PAH - - - TNZ095 - 420950 - Giles - TN - US - 35.23 - -87.02 - 0 - 0 - OHX - - - INZ061 - 140610 - Greene - IN - US - 39.03 - -86.98 - 0 - 0 - IND - - - ALZ024 - 10240 - Jefferson - AL - US - 33.55 - -86.93 - 0 - 0 - BMX - - - MIZ013 - 220130 - Delta - MI - US - 45.82 - -86.91 - 0 - 0 - MQT - - - TNZ059 - 420590 - Williamson - TN - US - 35.88 - -86.91 - 0 - 0 - OHX - - - INZ029 - 140290 - Tippecanoe - IN - US - 40.40 - -86.90 - 0 - 0 - IND - - - INZ036 - 140360 - Montgomery - IN - US - 40.05 - -86.90 - 0 - 0 - IND - - - FLZ004 - 90040 - Coastal_Santa_Rosa - FL - US - 30.53 - -86.89 - 0 - 0 - MOB - - - INZ083 - 140830 - Dubois - IN - US - 38.36 - -86.88 - 0 - 0 - LMK - - - KYZ026 - 170260 - Ohio - KY - US - 37.48 - -86.86 - 0 - 0 - LMK - - - INZ053 - 140530 - Owen - IN - US - 39.31 - -86.85 - 0 - 0 - IND - - - KYZ070 - 170700 - Logan - KY - US - 36.86 - -86.85 - 0 - 0 - LMK - - - INZ020 - 140200 - White - IN - US - 40.75 - -86.84 - 0 - 0 - IWX - - - ALZ007 - 10070 - Morgan - AL - US - 34.50 - -86.83 - 0 - 0 - HUN - - - INZ045 - 140450 - Putnam - IN - US - 39.67 - -86.83 - 0 - 0 - IND - - - TNZ007 - 420070 - Robertson - TN - US - 36.50 - -86.82 - 0 - 0 - OHX - - - INZ069 - 140690 - Martin - IN - US - 38.70 - -86.81 - 0 - 0 - IND - - - KYZ023 - 170230 - Hancock - KY - US - 37.83 - -86.81 - 0 - 0 - LMK - - - ALZ016 - 10160 - Cullman - AL - US - 34.09 - -86.78 - 0 - 0 - HUN - - - TNZ027 - 420270 - Davidson - TN - US - 36.19 - -86.78 - 0 - 0 - OHX - - - TNZ061 - 420610 - Marshall - TN - US - 35.49 - -86.77 - 0 - 0 - OHX - - - INZ003 - 140030 - La_Porte - IN - US - 41.50 - -86.71 - 0 - 0 - IWX - - - ALZ035 - 10350 - Chilton - AL - US - 32.87 - -86.70 - 0 - 0 - BMX - - - INZ012 - 140120 - Starke - IN - US - 41.31 - -86.70 - 0 - 0 - IWX - - - INZ013 - 140130 - Pulaski - IN - US - 41.05 - -86.70 - 0 - 0 - IWX - - - ALZ025 - 10250 - Shelby - AL - US - 33.29 - -86.68 - 0 - 0 - BMX - - - ALZ057 - 10570 - Butler - AL - US - 31.75 - -86.68 - 0 - 0 - MOB - - - KYZ061 - 170610 - Butler - KY - US - 37.20 - -86.67 - 0 - 0 - LMK - - - ALZ041 - 10410 - Autauga - AL - US - 32.52 - -86.66 - 0 - 0 - BMX - - - ALZ042 - 10420 - Lowndes - AL - US - 32.19 - -86.66 - 0 - 0 - BMX - - - ALZ017 - 10170 - Blount - AL - US - 34.01 - -86.64 - 0 - 0 - BMX - - - INZ089 - 140890 - Perry - IN - US - 38.05 - -86.63 - 0 - 0 - LMK - - - FLZ006 - 90060 - Coastal_Okaloosa - FL - US - 30.55 - -86.59 - 0 - 0 - MOB - - - KYZ072 - 170720 - Simpson - KY - US - 36.77 - -86.59 - 0 - 0 - LMK - - - FLZ005 - 90050 - Inland_Okaloosa - FL - US - 30.86 - -86.58 - 0 - 0 - MOB - - - INZ021 - 140210 - Carroll - IN - US - 40.59 - -86.57 - 0 - 0 - IND - - - TNZ096 - 420960 - Lincoln - TN - US - 35.19 - -86.57 - 0 - 0 - HUN - - - MIZ077 - 220770 - Berrien - MI - US - 42.01 - -86.53 - 0 - 0 - IWX - - - ALZ006 - 10060 - Madison - AL - US - 34.74 - -86.52 - 0 - 0 - HUN - - - INZ046 - 140460 - Hendricks - IN - US - 39.77 - -86.52 - 0 - 0 - IND - - - INZ062 - 140620 - Monroe - IN - US - 39.16 - -86.52 - 0 - 0 - IND - - - INZ076 - 140760 - Orange - IN - US - 38.54 - -86.50 - 0 - 0 - LMK - - - INZ070 - 140700 - Lawrence - IN - US - 38.84 - -86.49 - 0 - 0 - IND - - - INZ037 - 140370 - Boone - IN - US - 40.06 - -86.48 - 0 - 0 - IND - - - INZ054 - 140540 - Morgan - IN - US - 39.48 - -86.48 - 0 - 0 - IND - - - MIZ006 - 220060 - Alger - MI - US - 46.43 - -86.48 - 0 - 0 - MQT - - - TNZ008 - 420080 - Sumner - TN - US - 36.45 - -86.48 - 0 - 0 - OHX - - - INZ030 - 140300 - Clinton - IN - US - 40.31 - -86.47 - 0 - 0 - IND - - - INZ084 - 140840 - Crawford - IN - US - 38.26 - -86.46 - 0 - 0 - LMK - - - TNZ075 - 420750 - Bedford - TN - US - 35.52 - -86.45 - 0 - 0 - OHX - - - ALZ060 - 10600 - Covington - AL - US - 31.26 - -86.44 - 0 - 0 - MOB - - - KYZ024 - 170240 - Breckinridge - KY - US - 37.81 - -86.42 - 0 - 0 - LMK - - - TNZ062 - 420620 - Rutherford - TN - US - 35.86 - -86.41 - 0 - 0 - OHX - - - KYZ071 - 170710 - Warren - KY - US - 36.99 - -86.40 - 0 - 0 - LMK - - - INZ022 - 140220 - Cass - IN - US - 40.75 - -86.38 - 0 - 0 - IWX - - - TNZ076 - 420760 - Moore - TN - US - 35.28 - -86.38 - 0 - 0 - HUN - - - KYZ027 - 170270 - Grayson - KY - US - 37.47 - -86.35 - 0 - 0 - LMK - - - ALZ008 - 10080 - Marshall - AL - US - 34.36 - -86.32 - 0 - 0 - HUN - - - ALZ058 - 10580 - Crenshaw - AL - US - 31.75 - -86.32 - 0 - 0 - MOB - - - ALZ026 - 10260 - St._Clair - AL - US - 33.69 - -86.31 - 0 - 0 - BMX - - - INZ004 - 140040 - St._Joseph - IN - US - 41.60 - -86.30 - 0 - 0 - IWX - - - MIZ043 - 220430 - Oceana - MI - US - 43.64 - -86.29 - 0 - 0 - GRR - - - TNZ028 - 420280 - Wilson - TN - US - 36.15 - -86.29 - 0 - 0 - OHX - - - MIZ037 - 220370 - Mason - MI - US - 44.00 - -86.28 - 0 - 0 - GRR - - - ALZ036 - 10360 - Coosa - AL - US - 32.93 - -86.27 - 0 - 0 - BMX - - - INZ014 - 140140 - Marshall - IN - US - 41.33 - -86.27 - 0 - 0 - IWX - - - KYZ062 - 170620 - Edmonson - KY - US - 37.20 - -86.27 - 0 - 0 - LMK - - - INZ063 - 140630 - Brown - IN - US - 39.19 - -86.24 - 0 - 0 - IND - - - KYZ025 - 170250 - Meade - KY - US - 38.00 - -86.24 - 0 - 0 - LMK - - - MIZ085 - 220850 - Northern_Schoolcraft - MI - US - 46.33 - -86.23 - 0 - 0 - MQT - - - ALZ044 - 10440 - Montgomery - AL - US - 32.24 - -86.21 - 0 - 0 - BMX - - - FLZ007 - 90070 - Inland_Walton - FL - US - 30.85 - -86.21 - 0 - 0 - TAE - - - INZ015 - 140150 - Fulton - IN - US - 41.05 - -86.21 - 0 - 0 - IWX - - - KYZ073 - 170730 - Allen - KY - US - 36.78 - -86.19 - 0 - 0 - LMK - - - MIZ014 - 220140 - Southern_Schoolcraft - MI - US - 46.00 - -86.17 - 0 - 0 - MQT - - - ALZ027 - 10270 - Talladega - AL - US - 33.40 - -86.15 - 0 - 0 - BMX - - - ALZ043 - 10430 - Elmore - AL - US - 32.59 - -86.14 - 0 - 0 - BMX - - - INZ047 - 140470 - Marion - IN - US - 39.78 - -86.14 - 0 - 0 - IND - - - INZ090 - 140900 - Harrison - IN - US - 38.19 - -86.13 - 0 - 0 - LMK - - - MIZ050 - 220500 - Muskegon - MI - US - 43.30 - -86.13 - 0 - 0 - GRR - - - TNZ029 - 420290 - Trousdale - TN - US - 36.40 - -86.13 - 0 - 0 - OHX - - - FLZ008 - 90080 - Coastal_Walton - FL - US - 30.49 - -86.12 - 0 - 0 - TAE - - - INZ031 - 140310 - Howard - IN - US - 40.48 - -86.12 - 0 - 0 - IND - - - INZ055 - 140550 - Johnson - IN - US - 39.49 - -86.11 - 0 - 0 - IND - - - MIZ031 - 220310 - Manistee - MI - US - 44.35 - -86.10 - 0 - 0 - APX - - - TNZ097 - 420970 - Franklin - TN - US - 35.18 - -86.10 - 0 - 0 - HUN - - - INZ077 - 140770 - Washington - IN - US - 38.60 - -86.09 - 0 - 0 - LMK - - - INZ071 - 140710 - Jackson - IN - US - 38.90 - -86.07 - 0 - 0 - IND - - - MIZ071 - 220710 - Van_Buren - MI - US - 42.25 - -86.07 - 0 - 0 - GRR - - - TNZ077 - 420770 - Coffee - TN - US - 35.50 - -86.07 - 0 - 0 - OHX - - - INZ039 - 140390 - Hamilton - IN - US - 40.08 - -86.06 - 0 - 0 - IND - - - ALZ018 - 10180 - Etowah - AL - US - 34.03 - -86.05 - 0 - 0 - BMX - - - INZ038 - 140380 - Tipton - IN - US - 40.32 - -86.05 - 0 - 0 - IND - - - TNZ063 - 420630 - Cannon - TN - US - 35.81 - -86.05 - 0 - 0 - OHX - - - MIZ025 - 220250 - Benzie - MI - US - 44.65 - -86.04 - 0 - 0 - APX - - - MIZ056 - 220560 - Ottawa - MI - US - 42.99 - -86.03 - 0 - 0 - GRR - - - INZ023 - 140230 - Miami - IN - US - 40.79 - -86.02 - 0 - 0 - IWX - - - MIZ078 - 220780 - Cass - MI - US - 41.92 - -86.00 - 0 - 0 - IWX - - - TNZ009 - 420090 - Macon - TN - US - 36.53 - -86.00 - 0 - 0 - OHX - - - ALZ065 - 10650 - Coffee - AL - US - 31.41 - -85.99 - 0 - 0 - TAE - - - KYZ028 - 170280 - Hardin - KY - US - 37.72 - -85.98 - 0 - 0 - LMK - - - ALZ009 - 10090 - Jackson - AL - US - 34.74 - -85.97 - 0 - 0 - HUN - - - KYZ074 - 170740 - Barren - KY - US - 36.95 - -85.96 - 0 - 0 - LMK - - - TNZ030 - 420300 - Smith - TN - US - 36.26 - -85.96 - 0 - 0 - OHX - - - ALZ049 - 10490 - Pike - AL - US - 31.85 - -85.93 - 0 - 0 - BMX - - - ALZ028 - 10280 - Clay - AL - US - 33.30 - -85.91 - 0 - 0 - BMX - - - KYZ063 - 170630 - Hart - KY - US - 37.30 - -85.91 - 0 - 0 - LMK - - - MIZ064 - 220640 - Allegan - MI - US - 42.60 - -85.91 - 0 - 0 - GRR - - - INZ064 - 140640 - Bartholomew - IN - US - 39.19 - -85.90 - 0 - 0 - IND - - - INZ091 - 140910 - Floyd - IN - US - 38.30 - -85.90 - 0 - 0 - LMK - - - INZ016 - 140160 - Kosciusko - IN - US - 41.25 - -85.87 - 0 - 0 - IWX - - - INZ005 - 140050 - Elkhart - IN - US - 41.60 - -85.86 - 0 - 0 - IWX - - - TNZ064 - 420640 - DeKalb - TN - US - 35.98 - -85.84 - 0 - 0 - OHX - - - ALZ019 - 10190 - Calhoun - AL - US - 33.76 - -85.83 - 0 - 0 - BMX - - - ALZ068 - 10680 - Geneva - AL - US - 31.10 - -85.83 - 0 - 0 - TAE - - - ALZ010 - 10100 - De_Kalb - AL - US - 34.53 - -85.82 - 0 - 0 - HUN - - - ALZ037 - 10370 - Tallapoosa - AL - US - 32.81 - -85.80 - 0 - 0 - BMX - - - INZ024 - 140240 - Wabash - IN - US - 40.85 - -85.80 - 0 - 0 - IWX - - - INZ056 - 140560 - Shelby - IN - US - 39.52 - -85.80 - 0 - 0 - IND - - - MIZ038 - 220380 - Lake - MI - US - 43.99 - -85.80 - 0 - 0 - GRR - - - MIZ044 - 220440 - Newaygo - MI - US - 43.56 - -85.80 - 0 - 0 - GRR - - - FLZ009 - 90090 - Holmes - FL - US - 30.86 - -85.77 - 0 - 0 - TAE - - - INZ048 - 140480 - Hancock - IN - US - 39.83 - -85.77 - 0 - 0 - IND - - - TNZ078 - 420780 - Warren - TN - US - 35.68 - -85.77 - 0 - 0 - OHX - - - INZ078 - 140780 - Scott - IN - US - 38.69 - -85.74 - 0 - 0 - LMK - - - ALZ045 - 10450 - Macon - AL - US - 32.42 - -85.72 - 0 - 0 - BMX - - - INZ040 - 140400 - Madison - IN - US - 40.17 - -85.72 - 0 - 0 - IND - - - ALZ046 - 10460 - Bullock - AL - US - 32.10 - -85.71 - 0 - 0 - BMX - - - FLZ010 - 90100 - Washington - FL - US - 30.62 - -85.71 - 0 - 0 - TAE - - - INZ092 - 140920 - Clark - IN - US - 38.44 - -85.71 - 0 - 0 - LMK - - - KYZ075 - 170750 - Monroe - KY - US - 36.73 - -85.71 - 0 - 0 - LMK - - - MIZ020 - 220200 - Leelanau - MI - US - 44.99 - -85.71 - 0 - 0 - APX - - - KYZ029 - 170290 - Bullitt - KY - US - 37.97 - -85.70 - 0 - 0 - LMK - - - TNZ079 - 420790 - Grundy - TN - US - 35.38 - -85.70 - 0 - 0 - OHX - - - KYZ030 - 170300 - Jefferson - KY - US - 38.19 - -85.69 - 0 - 0 - LMK - - - KYZ053 - 170530 - Larue - KY - US - 37.57 - -85.69 - 0 - 0 - LMK - - - FLZ012 - 90120 - Bay - FL - US - 30.31 - -85.68 - 0 - 0 - TAE - - - TNZ031 - 420310 - Jackson - TN - US - 36.37 - -85.67 - 0 - 0 - OHX - - - INZ032 - 140320 - Grant - IN - US - 40.53 - -85.66 - 0 - 0 - IWX - - - INZ072 - 140720 - Jennings - IN - US - 39.00 - -85.63 - 0 - 0 - IND - - - ALZ020 - 10200 - Cherokee - AL - US - 34.23 - -85.62 - 0 - 0 - BMX - - - KYZ076 - 170760 - Metcalfe - KY - US - 37.01 - -85.62 - 0 - 0 - LMK - - - TNZ098 - 420980 - Marion - TN - US - 35.16 - -85.62 - 0 - 0 - MRX - - - ALZ066 - 10660 - Dale - AL - US - 31.41 - -85.61 - 0 - 0 - TAE - - - ALZ021 - 10210 - Cleburne - AL - US - 33.72 - -85.60 - 0 - 0 - BMX - - - MIZ026 - 220260 - Grand_Traverse - MI - US - 44.75 - -85.58 - 0 - 0 - APX - - - MIZ032 - 220320 - Wexford - MI - US - 44.34 - -85.58 - 0 - 0 - APX - - - MIZ057 - 220570 - Kent - MI - US - 43.03 - -85.56 - 0 - 0 - GRR - - - MIZ079 - 220790 - St._Joseph - MI - US - 41.92 - -85.55 - 0 - 0 - IWX - - - MIZ007 - 220070 - Luce - MI - US - 46.50 - -85.54 - 0 - 0 - MQT - - - TNZ010 - 420100 - Clay - TN - US - 36.52 - -85.54 - 0 - 0 - OHX - - - KYZ064 - 170640 - Green - KY - US - 37.29 - -85.53 - 0 - 0 - LMK - - - MIZ072 - 220720 - Kalamazoo - MI - US - 42.25 - -85.53 - 0 - 0 - GRR - - - INZ017 - 140170 - Whitley - IN - US - 41.15 - -85.50 - 0 - 0 - IWX - - - INZ065 - 140650 - Decatur - IN - US - 39.29 - -85.50 - 0 - 0 - IND - - - INZ025 - 140250 - Huntington - IN - US - 40.84 - -85.49 - 0 - 0 - IWX - - - GAZ001 - 100010 - Dade - GA - US - 34.81 - -85.48 - 0 - 0 - FFC - - - INZ057 - 140570 - Rush - IN - US - 39.62 - -85.48 - 0 - 0 - IND - - - KYZ031 - 170310 - Oldham - KY - US - 38.42 - -85.47 - 0 - 0 - LMK - - - INZ079 - 140790 - Jefferson - IN - US - 38.75 - -85.45 - 0 - 0 - LMK - - - KYZ045 - 170450 - Nelson - KY - US - 37.76 - -85.45 - 0 - 0 - LMK - - - TNZ032 - 420320 - Putnam - TN - US - 36.15 - -85.45 - 0 - 0 - OHX - - - ALZ029 - 10290 - Randolph - AL - US - 33.31 - -85.44 - 0 - 0 - BMX - - - TNZ065 - 420650 - White - TN - US - 35.94 - -85.44 - 0 - 0 - OHX - - - INZ006 - 140060 - Lagrange - IN - US - 41.65 - -85.43 - 0 - 0 - IWX - - - INZ008 - 140080 - Noble - IN - US - 41.41 - -85.43 - 0 - 0 - IWX - - - TNZ080 - 420800 - Van_Buren - TN - US - 35.69 - -85.43 - 0 - 0 - OHX - - - KYZ081 - 170810 - Cumberland - KY - US - 36.78 - -85.42 - 0 - 0 - LMK - - - TNZ081 - 420810 - Sequatchie - TN - US - 35.36 - -85.42 - 0 - 0 - MRX - - - ALZ050 - 10500 - Barbour - AL - US - 31.89 - -85.40 - 0 - 0 - BMX - - - INZ041 - 140410 - Delaware - IN - US - 40.24 - -85.40 - 0 - 0 - IND - - - INZ049 - 140490 - Henry - IN - US - 39.94 - -85.40 - 0 - 0 - IND - - - ALZ038 - 10380 - Chambers - AL - US - 32.93 - -85.36 - 0 - 0 - BMX - - - ALZ069 - 10690 - Houston - AL - US - 31.16 - -85.35 - 0 - 0 - TAE - - - ALZ047 - 10470 - Lee - AL - US - 32.58 - -85.34 - 0 - 0 - BMX - - - KYZ065 - 170650 - Taylor - KY - US - 37.33 - -85.34 - 0 - 0 - LMK - - - MIZ039 - 220390 - Osceola - MI - US - 43.99 - -85.33 - 0 - 0 - GRR - - - MIZ045 - 220450 - Mecosta - MI - US - 43.64 - -85.33 - 0 - 0 - GRR - - - INZ033 - 140330 - Blackford - IN - US - 40.49 - -85.32 - 0 - 0 - IWX - - - GAZ011 - 100110 - Chattooga - GA - US - 34.44 - -85.31 - 0 - 0 - FFC - - - KYZ032 - 170320 - Trimble - KY - US - 38.62 - -85.31 - 0 - 0 - LMK - - - KYZ038 - 170380 - Spencer - KY - US - 38.05 - -85.31 - 0 - 0 - LMK - - - MIZ065 - 220650 - Barry - MI - US - 42.60 - -85.31 - 0 - 0 - GRR - - - GAZ002 - 100020 - Walker - GA - US - 34.79 - -85.29 - 0 - 0 - FFC - - - KYZ077 - 170770 - Adair - KY - US - 37.12 - -85.29 - 0 - 0 - LMK - - - KYZ054 - 170540 - Marion - KY - US - 37.57 - -85.28 - 0 - 0 - LMK - - - TNZ033 - 420330 - Overton - TN - US - 36.35 - -85.28 - 0 - 0 - OHX - - - INZ073 - 140730 - Ripley - IN - US - 39.11 - -85.27 - 0 - 0 - ILN - - - INZ026 - 140260 - Wells - IN - US - 40.76 - -85.26 - 0 - 0 - IWX - - - ALZ067 - 10670 - Henry - AL - US - 31.55 - -85.23 - 0 - 0 - TAE - - - FLZ011 - 90110 - Jackson - FL - US - 30.79 - -85.23 - 0 - 0 - TAE - - - GAZ019 - 100190 - Floyd - GA - US - 34.34 - -85.23 - 0 - 0 - FFC - - - FLZ014 - 90140 - Gulf - FL - US - 29.94 - -85.22 - 0 - 0 - TAE - - - KYZ034 - 170340 - Shelby - KY - US - 38.20 - -85.22 - 0 - 0 - LMK - - - GAZ041 - 100410 - Haralson - GA - US - 33.78 - -85.21 - 0 - 0 - FFC - - - KYZ046 - 170460 - Washington - KY - US - 37.77 - -85.20 - 0 - 0 - LMK - - - MIZ051 - 220510 - Montcalm - MI - US - 43.30 - -85.20 - 0 - 0 - GRR - - - TNZ099 - 420990 - Hamilton - TN - US - 35.23 - -85.20 - 0 - 0 - MRX - - - GAZ030 - 100300 - Polk - GA - US - 34.00 - -85.17 - 0 - 0 - FFC - - - INZ058 - 140580 - Fayette - IN - US - 39.65 - -85.17 - 0 - 0 - ILN - - - ALZ048 - 10480 - Russell - AL - US - 32.29 - -85.16 - 0 - 0 - BMX - - - FLZ013 - 90130 - Calhoun - FL - US - 30.40 - -85.16 - 0 - 0 - TAE - - - TNZ082 - 420820 - Bledsoe - TN - US - 35.57 - -85.16 - 0 - 0 - MRX - - - KYZ082 - 170820 - Clinton - KY - US - 36.75 - -85.15 - 0 - 0 - LMK - - - MIZ021 - 220210 - Antrim - MI - US - 45.01 - -85.15 - 0 - 0 - APX - - - KYZ089 - 170890 - Carroll - KY - US - 38.68 - -85.14 - 0 - 0 - ILN - - - TNZ011 - 420110 - Pickett - TN - US - 36.52 - -85.14 - 0 - 0 - OHX - - - GAZ003 - 100030 - Catoosa - GA - US - 34.88 - -85.12 - 0 - 0 - FFC - - - KYZ033 - 170330 - Henry - KY - US - 38.47 - -85.12 - 0 - 0 - LMK - - - GAZ052 - 100520 - Heard - GA - US - 33.28 - -85.11 - 0 - 0 - FFC - - - MIZ033 - 220330 - Missaukee - MI - US - 44.34 - -85.10 - 0 - 0 - APX - - - MIZ027 - 220270 - Kalkaska - MI - US - 44.69 - -85.09 - 0 - 0 - APX - - - MIZ058 - 220580 - Ionia - MI - US - 42.95 - -85.08 - 0 - 0 - GRR - - - GAZ042 - 100420 - Carroll - GA - US - 33.62 - -85.07 - 0 - 0 - FFC - - - INZ018 - 140180 - Allen - IN - US - 41.11 - -85.07 - 0 - 0 - IWX - - - KYZ078 - 170780 - Russell - KY - US - 37.01 - -85.07 - 0 - 0 - LMK - - - INZ066 - 140660 - Franklin - IN - US - 39.39 - -85.06 - 0 - 0 - ILN - - - MIZ019 - 220190 - Charlevoix - MI - US - 45.25 - -85.06 - 0 - 0 - APX - - - MIZ080 - 220800 - Branch - MI - US - 41.92 - -85.06 - 0 - 0 - IWX - - - GAZ066 - 100660 - Troup - GA - US - 33.04 - -85.04 - 0 - 0 - FFC - - - GAZ120 - 101200 - Quitman - GA - US - 31.88 - -85.02 - 0 - 0 - TAE - - - INZ050 - 140500 - Wayne - IN - US - 39.87 - -85.02 - 0 - 0 - ILN - - - INZ034 - 140340 - Jay - IN - US - 40.45 - -85.01 - 0 - 0 - IWX - - - INZ042 - 140420 - Randolph - IN - US - 40.17 - -85.01 - 0 - 0 - IND - - - MIZ073 - 220730 - Calhoun - MI - US - 42.25 - -85.01 - 0 - 0 - GRR - - - INZ080 - 140800 - Switzerland - IN - US - 38.81 - -85.00 - 0 - 0 - ILN - - - KYZ039 - 170390 - Anderson - KY - US - 38.00 - -85.00 - 0 - 0 - LMK - - - INZ007 - 140070 - Steuben - IN - US - 41.65 - -84.99 - 0 - 0 - IWX - - - INZ009 - 140090 - De_Kalb - IN - US - 41.41 - -84.99 - 0 - 0 - IWX - - - INZ075 - 140750 - Ohio - IN - US - 38.97 - -84.99 - 0 - 0 - ILN - - - MIZ015 - 220150 - Mackinac - MI - US - 46.04 - -84.99 - 0 - 0 - APX - - - GAZ004 - 100040 - Whitfield - GA - US - 34.80 - -84.98 - 0 - 0 - FFC - - - INZ074 - 140740 - Dearborn - IN - US - 39.12 - -84.98 - 0 - 0 - ILN - - - TNZ066 - 420660 - Cumberland - TN - US - 35.96 - -84.98 - 0 - 0 - OHX - - - GAZ121 - 101210 - Clay - GA - US - 31.64 - -84.96 - 0 - 0 - TAE - - - KYZ066 - 170660 - Casey - KY - US - 37.33 - -84.95 - 0 - 0 - LMK - - - MIZ016 - 220160 - Emmet - MI - US - 45.53 - -84.95 - 0 - 0 - APX - - - INZ027 - 140270 - Adams - IN - US - 40.76 - -84.94 - 0 - 0 - IWX - - - INZ059 - 140590 - Union - IN - US - 39.62 - -84.93 - 0 - 0 - ILN - - - GAZ078 - 100780 - Harris - GA - US - 32.73 - -84.92 - 0 - 0 - FFC - - - TNZ083 - 420830 - Rhea - TN - US - 35.62 - -84.92 - 0 - 0 - MRX - - - KYZ035 - 170350 - Franklin - KY - US - 38.23 - -84.89 - 0 - 0 - LMK - - - TNZ034 - 420340 - Fentress - TN - US - 36.36 - -84.89 - 0 - 0 - OHX - - - GAZ031 - 100310 - Paulding - GA - US - 33.93 - -84.88 - 0 - 0 - FFC - - - GAZ012 - 100120 - Gordon - GA - US - 34.51 - -84.87 - 0 - 0 - FFC - - - GAZ089 - 100890 - Muscogee - GA - US - 32.49 - -84.87 - 0 - 0 - FFC - - - GAZ142 - 101420 - Early - GA - US - 31.30 - -84.87 - 0 - 0 - TAE - - - GAZ155 - 101550 - Seminole - GA - US - 30.90 - -84.87 - 0 - 0 - TAE - - - KYZ047 - 170470 - Mercer - KY - US - 37.82 - -84.87 - 0 - 0 - LMK - - - KYZ055 - 170550 - Boyle - KY - US - 37.63 - -84.86 - 0 - 0 - LMK - - - FLZ026 - 90260 - Liberty - FL - US - 30.29 - -84.85 - 0 - 0 - TAE - - - GAZ102 - 101020 - Stewart - GA - US - 32.07 - -84.85 - 0 - 0 - FFC - - - KYZ090 - 170900 - Gallatin - KY - US - 38.77 - -84.85 - 0 - 0 - ILN - - - MIZ040 - 220400 - Clare - MI - US - 43.99 - -84.85 - 0 - 0 - GRR - - - MIZ046 - 220460 - Isabella - MI - US - 43.64 - -84.85 - 0 - 0 - GRR - - - TNZ100 - 421000 - Bradley - TN - US - 35.18 - -84.85 - 0 - 0 - MRX - - - GAZ020 - 100200 - Bartow - GA - US - 34.25 - -84.84 - 0 - 0 - FFC - - - MIZ066 - 220660 - Eaton - MI - US - 42.60 - -84.84 - 0 - 0 - GRR - - - KYZ083 - 170830 - Wayne - KY - US - 36.80 - -84.83 - 0 - 0 - JKL - - - KYZ094 - 170940 - Owen - KY - US - 38.53 - -84.83 - 0 - 0 - ILN - - - GAZ090 - 100900 - Chattahoochee - GA - US - 32.38 - -84.82 - 0 - 0 - FFC - - - TNZ084 - 420840 - Meigs - TN - US - 35.52 - -84.82 - 0 - 0 - MRX - - - FLZ015 - 90150 - Franklin - FL - US - 29.80 - -84.77 - 0 - 0 - TAE - - - GAZ005 - 100050 - Murray - GA - US - 34.79 - -84.76 - 0 - 0 - FFC - - - KYZ040 - 170400 - Woodford - KY - US - 38.02 - -84.76 - 0 - 0 - LMK - - - GAZ053 - 100530 - Coweta - GA - US - 33.35 - -84.75 - 0 - 0 - FFC - - - KYZ091 - 170910 - Boone - KY - US - 38.96 - -84.75 - 0 - 0 - ILN - - - GAZ043 - 100430 - Douglas - GA - US - 33.69 - -84.74 - 0 - 0 - FFC - - - GAZ122 - 101220 - Randolph - GA - US - 31.77 - -84.74 - 0 - 0 - TAE - - - GAZ143 - 101430 - Miller - GA - US - 31.17 - -84.72 - 0 - 0 - TAE - - - GAZ067 - 100670 - Meriwether - GA - US - 33.03 - -84.67 - 0 - 0 - FFC - - - KYZ067 - 170670 - Lincoln - KY - US - 37.44 - -84.66 - 0 - 0 - LMK - - - OHZ060 - 350600 - Preble - OH - US - 39.74 - -84.65 - 0 - 0 - ILN - - - KYZ095 - 170950 - Grant - KY - US - 38.64 - -84.64 - 0 - 0 - ILN - - - TNZ085 - 420850 - McMinn - TN - US - 35.45 - -84.63 - 0 - 0 - MRX - - - GAZ123 - 101230 - Calhoun - GA - US - 31.54 - -84.62 - 0 - 0 - TAE - - - GAZ156 - 101560 - Decatur - GA - US - 30.89 - -84.62 - 0 - 0 - TAE - - - MIZ022 - 220220 - Otsego - MI - US - 45.03 - -84.62 - 0 - 0 - APX - - - OHZ034 - 350340 - Mercer - OH - US - 40.54 - -84.62 - 0 - 0 - ILN - - - OHZ042 - 350420 - Darke - OH - US - 40.14 - -84.62 - 0 - 0 - ILN - - - TNZ035 - 420350 - Morgan - TN - US - 36.14 - -84.62 - 0 - 0 - MRX - - - FLZ016 - 90160 - Gadsden - FL - US - 30.56 - -84.61 - 0 - 0 - TAE - - - KYZ079 - 170790 - Pulaski - KY - US - 37.12 - -84.61 - 0 - 0 - JKL - - - MIZ028 - 220280 - Crawford - MI - US - 44.69 - -84.61 - 0 - 0 - APX - - - MIZ034 - 220340 - Roscommon - MI - US - 44.34 - -84.61 - 0 - 0 - APX - - - MIZ052 - 220520 - Gratiot - MI - US - 43.30 - -84.61 - 0 - 0 - GRR - - - MIZ059 - 220590 - Clinton - MI - US - 42.95 - -84.60 - 0 - 0 - GRR - - - MIZ081 - 220810 - Hillsdale - MI - US - 41.89 - -84.60 - 0 - 0 - IWX - - - GAZ044 - 100440 - South_Fulton - GA - US - 33.62 - -84.59 - 0 - 0 - FFC - - - KYZ036 - 170360 - Scott - KY - US - 38.30 - -84.59 - 0 - 0 - LMK - - - KYZ048 - 170480 - Jessamine - KY - US - 37.87 - -84.59 - 0 - 0 - LMK - - - OHZ070 - 350700 - Butler - OH - US - 39.44 - -84.58 - 0 - 0 - ILN - - - OHZ015 - 350150 - Paulding - OH - US - 41.12 - -84.57 - 0 - 0 - IWX - - - OHZ024 - 350240 - Van_Wert - OH - US - 40.84 - -84.57 - 0 - 0 - IWX - - - TNZ101 - 421010 - West_Polk - TN - US - 35.14 - -84.57 - 0 - 0 - MRX - - - GAZ032 - 100320 - Cobb - GA - US - 33.93 - -84.56 - 0 - 0 - FFC - - - OHZ001 - 350010 - Williams - OH - US - 41.57 - -84.56 - 0 - 0 - IWX - - - KYZ056 - 170560 - Garrard - KY - US - 37.65 - -84.55 - 0 - 0 - LMK - - - GAZ103 - 101030 - Webster - GA - US - 32.07 - -84.54 - 0 - 0 - FFC - - - OHZ077 - 350770 - Hamilton - OH - US - 39.16 - -84.54 - 0 - 0 - ILN - - - GAZ091 - 100910 - Marion - GA - US - 32.35 - -84.52 - 0 - 0 - FFC - - - KYZ084 - 170840 - McCreary - KY - US - 36.78 - -84.52 - 0 - 0 - JKL - - - KYZ092 - 170920 - Kenton - KY - US - 38.94 - -84.52 - 0 - 0 - ILN - - - TNZ067 - 420670 - Roane - TN - US - 35.85 - -84.52 - 0 - 0 - MRX - - - OHZ004 - 350040 - Defiance - OH - US - 41.29 - -84.51 - 0 - 0 - IWX - - - TNZ012 - 420120 - Scott - TN - US - 36.39 - -84.51 - 0 - 0 - MRX - - - GAZ054 - 100540 - Fayette - GA - US - 33.41 - -84.49 - 0 - 0 - FFC - - - GAZ079 - 100790 - Talbot - GA - US - 32.70 - -84.49 - 0 - 0 - FFC - - - KYZ041 - 170410 - Fayette - KY - US - 38.03 - -84.48 - 0 - 0 - LMK - - - MIZ017 - 220170 - Cheboygan - MI - US - 45.49 - -84.47 - 0 - 0 - APX - - - GAZ013 - 100130 - Pickens - GA - US - 34.47 - -84.46 - 0 - 0 - FFC - - - GAZ021 - 100210 - Cherokee - GA - US - 34.25 - -84.46 - 0 - 0 - FFC - - - TNZ102 - 421020 - East_Polk - TN - US - 35.12 - -84.44 - 0 - 0 - MRX - - - MIZ074 - 220740 - Jackson - MI - US - 42.25 - -84.43 - 0 - 0 - GRR - - - GAZ007 - 100070 - Gilmer - GA - US - 34.70 - -84.42 - 0 - 0 - FFC - - - GAZ124 - 101240 - Terrell - GA - US - 31.79 - -84.42 - 0 - 0 - TAE - - - FLZ027 - 90270 - Wakulla - FL - US - 30.14 - -84.40 - 0 - 0 - TAE - - - GAZ068 - 100680 - Pike - GA - US - 33.09 - -84.39 - 0 - 0 - FFC - - - GAZ144 - 101440 - Baker - GA - US - 31.27 - -84.39 - 0 - 0 - TAE - - - MIZ041 - 220410 - Gladwin - MI - US - 43.99 - -84.39 - 0 - 0 - APX - - - MIZ047 - 220470 - Midland - MI - US - 43.65 - -84.39 - 0 - 0 - DTX - - - KYZ093 - 170930 - Campbell - KY - US - 38.96 - -84.37 - 0 - 0 - ILN - - - KYZ096 - 170960 - Pendleton - KY - US - 38.70 - -84.37 - 0 - 0 - ILN - - - MIZ067 - 220670 - Ingham - MI - US - 42.60 - -84.37 - 0 - 0 - GRR - - - GAZ033 - 100330 - North_Fulton - GA - US - 33.92 - -84.35 - 0 - 0 - FFC - - - GAZ055 - 100550 - Clayton - GA - US - 33.50 - -84.35 - 0 - 0 - FFC - - - MIZ008 - 220080 - Chippewa - MI - US - 46.34 - -84.35 - 0 - 0 - APX - - - TNZ068 - 420680 - Loudon - TN - US - 35.76 - -84.35 - 0 - 0 - MRX - - - FLZ017 - 90170 - Leon - FL - US - 30.49 - -84.34 - 0 - 0 - TAE - - - KYZ037 - 170370 - Harrison - KY - US - 38.43 - -84.33 - 0 - 0 - LMK - - - KYZ068 - 170680 - Rockcastle - KY - US - 37.35 - -84.33 - 0 - 0 - JKL - - - GAZ069 - 100690 - Upson - GA - US - 32.85 - -84.32 - 0 - 0 - FFC - - - KYZ057 - 170570 - Madison - KY - US - 37.72 - -84.31 - 0 - 0 - LMK - - - GAZ092 - 100920 - Schley - GA - US - 32.29 - -84.30 - 0 - 0 - FFC - - - GAZ056 - 100560 - Spalding - GA - US - 33.27 - -84.29 - 0 - 0 - FFC - - - TNZ086 - 420860 - Northwest_Monroe - TN - US - 35.46 - -84.28 - 0 - 0 - MRX - - - OHZ061 - 350610 - Montgomery - OH - US - 39.75 - -84.27 - 0 - 0 - ILN - - - GAZ145 - 101450 - Mitchell - GA - US - 31.26 - -84.25 - 0 - 0 - TAE - - - GAZ080 - 100800 - Taylor - GA - US - 32.55 - -84.23 - 0 - 0 - FFC - - - GAZ006 - 100060 - Fannin - GA - US - 34.80 - -84.22 - 0 - 0 - FFC - - - GAZ157 - 101570 - Grady - GA - US - 30.88 - -84.22 - 0 - 0 - TAE - - - OHZ051 - 350510 - Miami - OH - US - 40.04 - -84.22 - 0 - 0 - ILN - - - GAZ125 - 101250 - Dougherty - GA - US - 31.55 - -84.21 - 0 - 0 - TAE - - - KYZ042 - 170420 - Bourbon - KY - US - 38.22 - -84.21 - 0 - 0 - LMK - - - OHZ043 - 350430 - Shelby - OH - US - 40.33 - -84.21 - 0 - 0 - ILN - - - TNZ036 - 420360 - Anderson - TN - US - 36.10 - -84.20 - 0 - 0 - MRX - - - GAZ045 - 100450 - DeKalb - GA - US - 33.79 - -84.19 - 0 - 0 - FFC - - - GAZ104 - 101040 - Sumter - GA - US - 32.05 - -84.18 - 0 - 0 - FFC - - - KYZ049 - 170490 - Clark - KY - US - 37.97 - -84.17 - 0 - 0 - LMK - - - OHZ071 - 350710 - Warren - OH - US - 39.42 - -84.17 - 0 - 0 - ILN - - - OHZ035 - 350350 - Auglaize - OH - US - 40.52 - -84.16 - 0 - 0 - ILN - - - GAZ014 - 100140 - Dawson - GA - US - 34.48 - -84.15 - 0 - 0 - FFC - - - GAZ070 - 100700 - Lamar - GA - US - 33.06 - -84.15 - 0 - 0 - FFC - - - MIZ060 - 220600 - Shiawassee - MI - US - 42.96 - -84.15 - 0 - 0 - DTX - - - OHZ078 - 350780 - Clermont - OH - US - 39.02 - -84.15 - 0 - 0 - ILN - - - TNZ087 - 420870 - Southeast_Monroe - TN - US - 35.38 - -84.15 - 0 - 0 - MRX - - - GAZ057 - 100570 - Henry - GA - US - 33.48 - -84.14 - 0 - 0 - FFC - - - TNZ013 - 420130 - Campbell - TN - US - 36.39 - -84.14 - 0 - 0 - MRX - - - GAZ126 - 101260 - Lee - GA - US - 31.77 - -84.13 - 0 - 0 - TAE - - - MIZ023 - 220230 - Montmorency - MI - US - 45.03 - -84.13 - 0 - 0 - APX - - - MIZ029 - 220290 - Oscoda - MI - US - 44.68 - -84.13 - 0 - 0 - APX - - - MIZ035 - 220350 - Ogemaw - MI - US - 44.34 - -84.13 - 0 - 0 - APX - - - OHZ016 - 350160 - Putnam - OH - US - 41.01 - -84.13 - 0 - 0 - IWX - - - OHZ025 - 350250 - Allen - OH - US - 40.78 - -84.13 - 0 - 0 - IWX - - - KYZ080 - 170800 - Laurel - KY - US - 37.13 - -84.12 - 0 - 0 - JKL - - - KYZ085 - 170850 - Whitley - KY - US - 36.78 - -84.12 - 0 - 0 - JKL - - - OHZ002 - 350020 - Fulton - OH - US - 41.60 - -84.12 - 0 - 0 - IWX - - - OHZ005 - 350050 - Henry - OH - US - 41.32 - -84.10 - 0 - 0 - IWX - - - GAZ022 - 100220 - Forsyth - GA - US - 34.19 - -84.09 - 0 - 0 - FFC - - - KYZ097 - 170970 - Bracken - KY - US - 38.68 - -84.08 - 0 - 0 - ILN - - - KYZ098 - 170980 - Robertson - KY - US - 38.51 - -84.08 - 0 - 0 - ILN - - - MIZ082 - 220820 - Lenawee - MI - US - 41.90 - -84.07 - 0 - 0 - DTX - - - MIZ048 - 220480 - Bay - MI - US - 43.74 - -84.06 - 0 - 0 - DTX - - - GAZ046 - 100460 - Rockdale - GA - US - 33.66 - -84.04 - 0 - 0 - FFC - - - GAZ093 - 100930 - Macon - GA - US - 32.35 - -84.04 - 0 - 0 - FFC - - - GAZ034 - 100340 - Gwinnett - GA - US - 33.96 - -84.03 - 0 - 0 - FFC - - - MIZ053 - 220530 - Saginaw - MI - US - 43.35 - -84.03 - 0 - 0 - DTX - - - KYZ043 - 170430 - Nicholas - KY - US - 38.33 - -84.02 - 0 - 0 - LMK - - - GAZ015 - 100150 - Lumpkin - GA - US - 34.57 - -84.01 - 0 - 0 - FFC - - - NCZ060 - 330600 - Cherokee - NC - US - 35.14 - -84.01 - 0 - 0 - MRX - - - KYZ069 - 170690 - Jackson - KY - US - 37.42 - -84.00 - 0 - 0 - JKL - - - GAZ008 - 100080 - Union - GA - US - 34.81 - -83.98 - 0 - 0 - FFC - - - GAZ058 - 100580 - Butts - GA - US - 33.32 - -83.97 - 0 - 0 - FFC - - - GAZ081 - 100810 - Crawford - GA - US - 32.69 - -83.97 - 0 - 0 - FFC - - - TNZ069 - 420690 - Knox - TN - US - 35.99 - -83.96 - 0 - 0 - MRX - - - KYZ058 - 170580 - Estill - KY - US - 37.70 - -83.93 - 0 - 0 - JKL - - - GAZ071 - 100710 - Monroe - GA - US - 33.02 - -83.92 - 0 - 0 - FFC - - - GAZ158 - 101580 - Thomas - GA - US - 30.87 - -83.92 - 0 - 0 - TAE - - - KYZ050 - 170500 - Montgomery - KY - US - 38.05 - -83.92 - 0 - 0 - JKL - - - TNZ071 - 420710 - NW_Blount - TN - US - 35.71 - -83.92 - 0 - 0 - MRX - - - MIZ068 - 220680 - Livingston - MI - US - 42.61 - -83.91 - 0 - 0 - DTX - - - OHZ062 - 350620 - Greene - OH - US - 39.70 - -83.88 - 0 - 0 - ILN - - - MIZ042 - 220420 - Arenac - MI - US - 44.04 - -83.87 - 0 - 0 - APX - - - GAZ048 - 100480 - Newton - GA - US - 33.56 - -83.86 - 0 - 0 - FFC - - - GAZ094 - 100940 - Peach - GA - US - 32.56 - -83.86 - 0 - 0 - FFC - - - OHZ079 - 350790 - Brown - OH - US - 38.95 - -83.86 - 0 - 0 - ILN - - - FLZ018 - 90180 - Jefferson - FL - US - 30.38 - -83.84 - 0 - 0 - TAE - - - GAZ023 - 100230 - Hall - GA - US - 34.30 - -83.84 - 0 - 0 - FFC - - - GAZ127 - 101270 - Worth - GA - US - 31.59 - -83.84 - 0 - 0 - TAE - - - KYZ059 - 170590 - Powell - KY - US - 37.83 - -83.84 - 0 - 0 - JKL - - - KYZ086 - 170860 - Knox - KY - US - 36.87 - -83.84 - 0 - 0 - JKL - - - MIZ075 - 220750 - Washtenaw - MI - US - 42.26 - -83.84 - 0 - 0 - DTX - - - TNZ037 - 420370 - Union - TN - US - 36.30 - -83.84 - 0 - 0 - MRX - - - TNZ072 - 420720 - Blount_Smoky_Mountains - TN - US - 35.57 - -83.84 - 0 - 0 - MRX - - - GAZ105 - 101050 - Dooly - GA - US - 32.16 - -83.82 - 0 - 0 - FFC - - - KYZ099 - 170990 - Mason - KY - US - 38.62 - -83.82 - 0 - 0 - ILN - - - MIZ018 - 220180 - Presque_Isle - MI - US - 45.42 - -83.82 - 0 - 0 - APX - - - NCZ058 - 330580 - Graham - NC - US - 35.34 - -83.81 - 0 - 0 - GSP - - - OHZ072 - 350720 - Clinton - OH - US - 39.39 - -83.79 - 0 - 0 - ILN - - - GAZ106 - 101060 - Crisp - GA - US - 31.91 - -83.78 - 0 - 0 - FFC - - - OHZ053 - 350530 - Clark - OH - US - 39.90 - -83.78 - 0 - 0 - ILN - - - OHZ044 - 350440 - Logan - OH - US - 40.38 - -83.76 - 0 - 0 - ILN - - - OHZ052 - 350520 - Champaign - OH - US - 40.14 - -83.76 - 0 - 0 - ILN - - - GAZ016 - 100160 - White - GA - US - 34.65 - -83.75 - 0 - 0 - FFC - - - GAZ047 - 100470 - Walton - GA - US - 33.76 - -83.75 - 0 - 0 - FFC - - - GAZ146 - 101460 - Colquitt - GA - US - 31.18 - -83.75 - 0 - 0 - TAE - - - NCZ061 - 330610 - Clay - NC - US - 35.07 - -83.75 - 0 - 0 - MRX - - - GAZ009 - 100090 - Towns - GA - US - 34.89 - -83.74 - 0 - 0 - FFC - - - KYZ116 - 171160 - Clay - KY - US - 37.15 - -83.74 - 0 - 0 - JKL - - - OHZ003 - 350030 - Lucas - OH - US - 41.57 - -83.74 - 0 - 0 - CLE - - - KYZ051 - 170510 - Bath - KY - US - 38.15 - -83.73 - 0 - 0 - JKL - - - KYZ044 - 170440 - Fleming - KY - US - 38.36 - -83.72 - 0 - 0 - JKL - - - KYZ111 - 171110 - Lee - KY - US - 37.60 - -83.72 - 0 - 0 - JKL - - - KYZ087 - 170870 - Bell - KY - US - 36.77 - -83.71 - 0 - 0 - JKL - - - KYZ114 - 171140 - Owsley - KY - US - 37.40 - -83.71 - 0 - 0 - JKL - - - GAZ035 - 100350 - Barrow - GA - US - 34.01 - -83.70 - 0 - 0 - FFC - - - GAZ059 - 100590 - Jasper - GA - US - 33.33 - -83.69 - 0 - 0 - FFC - - - GAZ082 - 100820 - Bibb - GA - US - 32.80 - -83.69 - 0 - 0 - FFC - - - MIZ061 - 220610 - Genesee - MI - US - 43.00 - -83.69 - 0 - 0 - DTX - - - TNZ014 - 420140 - Claiborne - TN - US - 36.47 - -83.69 - 0 - 0 - MRX - - - GAZ095 - 100950 - Houston - GA - US - 32.49 - -83.67 - 0 - 0 - FFC - - - FLZ028 - 90280 - Taylor - FL - US - 29.99 - -83.65 - 0 - 0 - TAE - - - OHZ026 - 350260 - Hardin - OH - US - 40.66 - -83.65 - 0 - 0 - ILN - - - OHZ006 - 350060 - Wood - OH - US - 41.39 - -83.64 - 0 - 0 - CLE - - - OHZ017 - 350170 - Hancock - OH - US - 40.99 - -83.64 - 0 - 0 - CLE - - - GAZ128 - 101280 - Turner - GA - US - 31.71 - -83.63 - 0 - 0 - TAE - - - KYZ060 - 170600 - Menifee - KY - US - 37.94 - -83.61 - 0 - 0 - JKL - - - OHZ080 - 350800 - Highland - OH - US - 39.20 - -83.61 - 0 - 0 - ILN - - - MIZ036 - 220360 - Iosco - MI - US - 44.34 - -83.60 - 0 - 0 - APX - - - GAZ025 - 100250 - Jackson - GA - US - 34.13 - -83.59 - 0 - 0 - FFC - - - MIZ030 - 220300 - Alcona - MI - US - 44.69 - -83.59 - 0 - 0 - APX - - - GAZ072 - 100720 - Jones - GA - US - 33.01 - -83.58 - 0 - 0 - FFC - - - NCZ051 - 330510 - Swain - NC - US - 35.48 - -83.56 - 0 - 0 - GSP - - - GAZ159 - 101590 - Brooks - GA - US - 30.85 - -83.55 - 0 - 0 - TAE - - - MIZ024 - 220240 - Alpena - MI - US - 45.03 - -83.54 - 0 - 0 - APX - - - TNZ073 - 420730 - North_Sevier - TN - US - 35.87 - -83.53 - 0 - 0 - MRX - - - GAZ017 - 100170 - Habersham - GA - US - 34.63 - -83.51 - 0 - 0 - GSP - - - GAZ024 - 100240 - Banks - GA - US - 34.35 - -83.50 - 0 - 0 - FFC - - - GAZ129 - 101290 - Tift - GA - US - 31.46 - -83.50 - 0 - 0 - TAE - - - TNZ038 - 420380 - Grainger - TN - US - 36.25 - -83.50 - 0 - 0 - MRX - - - FLZ019 - 90190 - Madison - FL - US - 30.46 - -83.49 - 0 - 0 - TAE - - - OHZ081 - 350810 - Adams - OH - US - 38.82 - -83.49 - 0 - 0 - ILN - - - GAZ049 - 100490 - Morgan - GA - US - 33.62 - -83.48 - 0 - 0 - FFC - - - KYZ108 - 171080 - Wolfe - KY - US - 37.75 - -83.48 - 0 - 0 - JKL - - - MIZ083 - 220830 - Monroe - MI - US - 41.91 - -83.48 - 0 - 0 - DTX - - - TNZ070 - 420700 - Jefferson - TN - US - 36.04 - -83.47 - 0 - 0 - MRX - - - GAZ037 - 100370 - Oconee - GA - US - 33.83 - -83.46 - 0 - 0 - FFC - - - GAZ107 - 101070 - Pulaski - GA - US - 32.25 - -83.46 - 0 - 0 - FFC - - - OHZ063 - 350630 - Fayette - OH - US - 39.54 - -83.46 - 0 - 0 - ILN - - - TNZ074 - 420740 - Sevier_Smoky_Mountains - TN - US - 35.69 - -83.46 - 0 - 0 - MRX - - - GAZ147 - 101470 - Cook - GA - US - 31.19 - -83.43 - 0 - 0 - TAE - - - OHZ054 - 350540 - Madison - OH - US - 39.90 - -83.43 - 0 - 0 - ILN - - - KYZ052 - 170520 - Rowan - KY - US - 38.21 - -83.42 - 0 - 0 - JKL - - - NCZ062 - 330620 - Macon - NC - US - 35.16 - -83.42 - 0 - 0 - GSP - - - GAZ083 - 100830 - Twiggs - GA - US - 32.67 - -83.41 - 0 - 0 - FFC - - - MIZ054 - 220540 - Tuscola - MI - US - 43.51 - -83.40 - 0 - 0 - DTX - - - GAZ108 - 101080 - Wilcox - GA - US - 31.98 - -83.39 - 0 - 0 - FFC - - - MIZ069 - 220690 - Oakland - MI - US - 42.66 - -83.39 - 0 - 0 - DTX - - - GAZ010 - 100100 - Rabun - GA - US - 34.85 - -83.38 - 0 - 0 - GSP - - - GAZ036 - 100360 - Clarke - GA - US - 33.95 - -83.38 - 0 - 0 - FFC - - - KYZ117 - 171170 - Leslie - KY - US - 37.11 - -83.36 - 0 - 0 - JKL - - - OHZ045 - 350450 - Union - OH - US - 40.30 - -83.36 - 0 - 0 - ILN - - - GAZ060 - 100600 - Putnam - GA - US - 33.32 - -83.34 - 0 - 0 - FFC - - - KYZ100 - 171000 - Lewis - KY - US - 38.52 - -83.34 - 0 - 0 - ILN - - - GAZ096 - 100960 - Bleckley - GA - US - 32.42 - -83.32 - 0 - 0 - FFC - - - OHZ027 - 350270 - Wyandot - OH - US - 40.84 - -83.31 - 0 - 0 - CLE - - - GAZ018 - 100180 - Stephens - GA - US - 34.57 - -83.29 - 0 - 0 - GSP - - - KYZ112 - 171120 - Breathitt - KY - US - 37.52 - -83.28 - 0 - 0 - JKL - - - KYZ115 - 171150 - Perry - KY - US - 37.22 - -83.28 - 0 - 0 - JKL - - - TNZ039 - 420390 - Hamblen - TN - US - 36.23 - -83.28 - 0 - 0 - MRX - - - GAZ131 - 101310 - Irwin - GA - US - 31.62 - -83.25 - 0 - 0 - TAE - - - GAZ160 - 101600 - Lowndes - GA - US - 30.82 - -83.25 - 0 - 0 - TAE - - - GAZ073 - 100730 - Baldwin - GA - US - 33.05 - -83.24 - 0 - 0 - FFC - - - GAZ130 - 101300 - Ben_Hill - GA - US - 31.75 - -83.24 - 0 - 0 - TAE - - - GAZ026 - 100260 - Franklin - GA - US - 34.39 - -83.23 - 0 - 0 - GSP - - - GAZ148 - 101480 - Berrien - GA - US - 31.25 - -83.23 - 0 - 0 - TAE - - - KYZ106 - 171060 - Morgan - KY - US - 37.92 - -83.23 - 0 - 0 - JKL - - - MIZ062 - 220620 - Lapeer - MI - US - 43.11 - -83.22 - 0 - 0 - DTX - - - MIZ076 - 220760 - Wayne - MI - US - 42.25 - -83.21 - 0 - 0 - DTX - - - GAZ027 - 100270 - Madison - GA - US - 34.13 - -83.19 - 0 - 0 - FFC - - - KYZ088 - 170880 - Harlan - KY - US - 36.85 - -83.19 - 0 - 0 - JKL - - - GAZ050 - 100500 - Greene - GA - US - 33.56 - -83.18 - 0 - 0 - FFC - - - GAZ084 - 100840 - Wilkinson - GA - US - 32.79 - -83.18 - 0 - 0 - FFC - - - FLZ034 - 90340 - Dixie - FL - US - 29.56 - -83.16 - 0 - 0 - TAE - - - NCZ059 - 330590 - Northern_Jackson - NC - US - 35.37 - -83.14 - 0 - 0 - GSP - - - OHZ036 - 350360 - Marion - OH - US - 40.57 - -83.14 - 0 - 0 - CLE - - - TNZ015 - 420150 - Hancock - TN - US - 36.50 - -83.14 - 0 - 0 - MRX - - - TNZ040 - 420400 - Northwest_Cocke - TN - US - 36.00 - -83.13 - 0 - 0 - MRX - - - FLZ029 - 90290 - Lafayette - FL - US - 30.04 - -83.12 - 0 - 0 - TAE - - - GAZ109 - 101090 - Dodge - GA - US - 32.17 - -83.12 - 0 - 0 - FFC - - - OHZ008 - 350080 - Sandusky - OH - US - 41.37 - -83.12 - 0 - 0 - CLE - - - OHZ018 - 350180 - Seneca - OH - US - 41.12 - -83.12 - 0 - 0 - CLE - - - SCZ001 - 400010 - Oconee_Mountains - SC - US - 34.83 - -83.12 - 0 - 0 - GSP - - - TNZ041 - 420410 - Cocke_Smoky_Mountains - TN - US - 35.86 - -83.09 - 0 - 0 - MRX - - - GAZ161 - 101610 - Lanier - GA - US - 31.02 - -83.08 - 0 - 0 - TAE - - - KYZ104 - 171040 - Elliott - KY - US - 38.14 - -83.08 - 0 - 0 - JKL - - - KYZ109 - 171090 - Magoffin - KY - US - 37.69 - -83.08 - 0 - 0 - JKL - - - OHZ082 - 350820 - Pike - OH - US - 39.07 - -83.08 - 0 - 0 - ILN - - - NCZ063 - 330630 - Southern_Jackson - NC - US - 35.15 - -83.07 - 0 - 0 - GSP - - - OHZ073 - 350730 - Ross - OH - US - 39.34 - -83.07 - 0 - 0 - ILN - - - KYZ102 - 171020 - Carter - KY - US - 38.34 - -83.06 - 0 - 0 - RLX - - - OHZ007 - 350070 - Ottawa - OH - US - 41.54 - -83.06 - 0 - 0 - CLE - - - GAZ038 - 100380 - Oglethorpe - GA - US - 33.87 - -83.04 - 0 - 0 - FFC - - - MIZ049 - 220490 - Huron - MI - US - 43.87 - -83.04 - 0 - 0 - DTX - - - GAZ061 - 100610 - Hancock - GA - US - 33.27 - -83.02 - 0 - 0 - FFC - - - OHZ055 - 350550 - Franklin - OH - US - 39.96 - -83.01 - 0 - 0 - ILN - - - FLZ021 - 90210 - Suwannee - FL - US - 30.17 - -83.00 - 0 - 0 - JAX - - - NCZ052 - 330520 - Haywood - NC - US - 35.54 - -83.00 - 0 - 0 - GSP - - - OHZ064 - 350640 - Pickaway - OH - US - 39.63 - -83.00 - 0 - 0 - ILN - - - SCZ004 - 400040 - Greater_Oconee - SC - US - 34.64 - -83.00 - 0 - 0 - GSP - - - VAZ001 - 460010 - Lee - VA - US - 36.74 - -83.00 - 0 - 0 - MRX - - - OHZ046 - 350460 - Delaware - OH - US - 40.28 - -82.99 - 0 - 0 - ILN - - - FLZ020 - 90200 - Hamilton - FL - US - 30.48 - -82.96 - 0 - 0 - JAX - - - OHZ088 - 350880 - Scioto - OH - US - 38.79 - -82.96 - 0 - 0 - ILN - - - GAZ028 - 100280 - Hart - GA - US - 34.35 - -82.95 - 0 - 0 - GSP - - - TNZ016 - 420160 - Hawkins - TN - US - 36.42 - -82.94 - 0 - 0 - MRX - - - GAZ097 - 100970 - Laurens - GA - US - 32.43 - -82.93 - 0 - 0 - FFC - - - GAZ110 - 101100 - Telfair - GA - US - 31.96 - -82.93 - 0 - 0 - FFC - - - KYZ101 - 171010 - Greenup - KY - US - 38.56 - -82.92 - 0 - 0 - RLX - - - KYZ113 - 171130 - Knott - KY - US - 37.36 - -82.92 - 0 - 0 - JKL - - - MIZ070 - 220700 - Macomb - MI - US - 42.68 - -82.92 - 0 - 0 - DTX - - - OHZ028 - 350280 - Crawford - OH - US - 40.85 - -82.91 - 0 - 0 - CLE - - - GAZ149 - 101490 - Atkinson - GA - US - 31.30 - -82.88 - 0 - 0 - JAX - - - TNZ042 - 420420 - Northwest_Greene - TN - US - 36.21 - -82.88 - 0 - 0 - MRX - - - GAZ132 - 101320 - Coffee - GA - US - 31.59 - -82.87 - 0 - 0 - JAX - - - GAZ162 - 101620 - Echols - GA - US - 30.73 - -82.86 - 0 - 0 - JAX - - - KYZ118 - 171180 - Letcher - KY - US - 37.12 - -82.86 - 0 - 0 - JKL - - - GAZ051 - 100510 - Taliaferro - GA - US - 33.59 - -82.85 - 0 - 0 - FFC - - - GAZ029 - 100290 - Elbert - GA - US - 34.12 - -82.84 - 0 - 0 - GSP - - - KYZ107 - 171070 - Johnson - KY - US - 37.86 - -82.82 - 0 - 0 - JKL - - - OHZ037 - 350370 - Morrow - OH - US - 40.53 - -82.82 - 0 - 0 - CLE - - - FLZ035 - 90350 - Gilchrist - FL - US - 29.75 - -82.81 - 0 - 0 - JAX - - - MIZ055 - 220550 - Sanilac - MI - US - 43.43 - -82.81 - 0 - 0 - DTX - - - NCZ064 - 330640 - Transylvania - NC - US - 35.22 - -82.81 - 0 - 0 - GSP - - - GAZ074 - 100740 - Washington - GA - US - 32.99 - -82.79 - 0 - 0 - FFC - - - FLZ039 - 90390 - Levy - FL - US - 29.30 - -82.78 - 0 - 0 - TBW - - - TNZ043 - 420430 - Southeast_Greene - TN - US - 36.01 - -82.77 - 0 - 0 - MRX - - - KYZ110 - 171100 - Floyd - KY - US - 37.52 - -82.76 - 0 - 0 - JKL - - - GAZ111 - 101110 - Wheeler - GA - US - 32.11 - -82.75 - 0 - 0 - FFC - - - KYZ105 - 171050 - Lawrence - KY - US - 38.08 - -82.75 - 0 - 0 - RLX - - - GAZ039 - 100390 - Wilkes - GA - US - 33.79 - -82.74 - 0 - 0 - FFC - - - SCZ002 - 400020 - Pickens_Mountains - SC - US - 34.95 - -82.73 - 0 - 0 - GSP - - - FLZ050 - 90500 - Pinellas - FL - US - 27.89 - -82.71 - 0 - 0 - TBW - - - MIZ063 - 220630 - St._Clair - MI - US - 42.85 - -82.71 - 0 - 0 - DTX - - - GAZ085 - 100850 - Johnson - GA - US - 32.67 - -82.70 - 0 - 0 - FFC - - - KYZ103 - 171030 - Boyd - KY - US - 38.37 - -82.70 - 0 - 0 - RLX - - - GAZ163 - 101630 - Clinch - GA - US - 30.88 - -82.69 - 0 - 0 - JAX - - - SCZ005 - 400050 - Greater_Pickens - SC - US - 34.79 - -82.69 - 0 - 0 - GSP - - - NCZ048 - 330480 - Madison - NC - US - 35.87 - -82.68 - 0 - 0 - GSP - - - SCZ010 - 400100 - Anderson - SC - US - 34.51 - -82.65 - 0 - 0 - GSP - - - VAZ005 - 460050 - Scott - VA - US - 36.74 - -82.64 - 0 - 0 - MRX - - - GAZ062 - 100620 - Warren - GA - US - 33.43 - -82.63 - 0 - 0 - FFC - - - GAZ133 - 101330 - Jeff_Davis - GA - US - 31.82 - -82.63 - 0 - 0 - JAX - - - FLZ022 - 90220 - Columbia - FL - US - 30.21 - -82.62 - 0 - 0 - JAX - - - OHZ009 - 350090 - Erie - OH - US - 41.39 - -82.62 - 0 - 0 - CLE - - - OHZ083 - 350830 - Jackson - OH - US - 39.02 - -82.62 - 0 - 0 - RLX - - - OHZ065 - 350650 - Fairfield - OH - US - 39.74 - -82.60 - 0 - 0 - ILN - - - GAZ075 - 100750 - Glascock - GA - US - 33.23 - -82.59 - 0 - 0 - FFC - - - VAZ002 - 460020 - Wise - VA - US - 37.00 - -82.59 - 0 - 0 - MRX - - - OHZ019 - 350190 - Huron - OH - US - 41.14 - -82.58 - 0 - 0 - CLE - - - GAZ098 - 100980 - Treutlen - GA - US - 32.40 - -82.56 - 0 - 0 - FFC - - - OHZ087 - 350870 - Lawrence - OH - US - 38.62 - -82.56 - 0 - 0 - RLX - - - GAZ112 - 101120 - Montgomery - GA - US - 32.15 - -82.53 - 0 - 0 - FFC - - - NCZ053 - 330530 - Buncombe - NC - US - 35.62 - -82.53 - 0 - 0 - GSP - - - OHZ029 - 350290 - Richland - OH - US - 40.77 - -82.53 - 0 - 0 - CLE - - - OHZ084 - 350840 - Vinton - OH - US - 39.21 - -82.51 - 0 - 0 - RLX - - - KYZ119 - 171190 - Martin - KY - US - 37.82 - -82.50 - 0 - 0 - JKL - - - NCZ065 - 330650 - Henderson - NC - US - 35.32 - -82.50 - 0 - 0 - GSP - - - SCZ003 - 400030 - Greenville_Mountains - SC - US - 35.09 - -82.49 - 0 - 0 - GSP - - - SCZ011 - 400110 - Abbeville - SC - US - 34.25 - -82.49 - 0 - 0 - GSP - - - TNZ044 - 420440 - Washington - TN - US - 36.27 - -82.49 - 0 - 0 - MRX - - - OHZ056 - 350560 - Licking - OH - US - 40.09 - -82.48 - 0 - 0 - ILN - - - GAZ063 - 100630 - McDuffie - GA - US - 33.49 - -82.47 - 0 - 0 - CAE - - - FLZ042 - 90420 - Citrus - FL - US - 28.86 - -82.46 - 0 - 0 - TBW - - - OHZ047 - 350470 - Knox - OH - US - 40.40 - -82.46 - 0 - 0 - CLE - - - FLZ049 - 90490 - Pasco - FL - US - 28.32 - -82.45 - 0 - 0 - TBW - - - OHZ074 - 350740 - Hocking - OH - US - 39.50 - -82.45 - 0 - 0 - ILN - - - GAZ040 - 100400 - Lincoln - GA - US - 33.81 - -82.44 - 0 - 0 - CAE - - - GAZ076 - 100760 - Jefferson - GA - US - 33.04 - -82.44 - 0 - 0 - FFC - - - GAZ134 - 101340 - Bacon - GA - US - 31.56 - -82.42 - 0 - 0 - JAX - - - GAZ150 - 101500 - Ware - GA - US - 31.02 - -82.41 - 0 - 0 - JAX - - - TNZ045 - 420450 - Unicoi - TN - US - 36.11 - -82.41 - 0 - 0 - MRX - - - WVZ005 - 480050 - Wayne - WV - US - 38.14 - -82.41 - 0 - 0 - RLX - - - FLZ055 - 90550 - Manatee - FL - US - 27.43 - -82.40 - 0 - 0 - TBW - - - FLZ048 - 90480 - Hernando - FL - US - 28.56 - -82.37 - 0 - 0 - TBW - - - FLZ030 - 90300 - Union - FL - US - 30.03 - -82.35 - 0 - 0 - JAX - - - FLZ036 - 90360 - Alachua - FL - US - 29.68 - -82.35 - 0 - 0 - JAX - - - FLZ051 - 90510 - Hillsborough - FL - US - 27.91 - -82.35 - 0 - 0 - TBW - - - FLZ060 - 90600 - Sarasota - FL - US - 27.17 - -82.35 - 0 - 0 - TBW - - - KYZ120 - 171200 - Pike - KY - US - 37.47 - -82.35 - 0 - 0 - JKL - - - OHZ086 - 350860 - Gallia - OH - US - 38.81 - -82.34 - 0 - 0 - RLX - - - SCZ006 - 400060 - Greater_Greenville - SC - US - 34.77 - -82.34 - 0 - 0 - GSP - - - VAZ003 - 460030 - Dickenson - VA - US - 37.13 - -82.34 - 0 - 0 - RLX - - - GAZ113 - 101130 - Toombs - GA - US - 32.13 - -82.33 - 0 - 0 - FFC - - - GAZ086 - 100860 - Emanuel - GA - US - 32.56 - -82.32 - 0 - 0 - FFC - - - SCZ018 - 400180 - McCormick - SC - US - 33.83 - -82.32 - 0 - 0 - CAE - - - NCZ049 - 330490 - Yancey - NC - US - 35.89 - -82.31 - 0 - 0 - GSP - - - NCZ509 - 335090 - Polk_Mountains - NC - US - 35.29 - -82.31 - 0 - 0 - GSP - - - GAZ135 - 101350 - Appling - GA - US - 31.72 - -82.30 - 0 - 0 - JAX - - - OHZ030 - 350300 - Ashland - OH - US - 40.81 - -82.28 - 0 - 0 - CLE - - - WVZ006 - 480060 - Cabell - WV - US - 38.41 - -82.27 - 0 - 0 - RLX - - - TNZ017 - 420170 - Sullivan - TN - US - 36.51 - -82.26 - 0 - 0 - MRX - - - FLZ023 - 90230 - Baker - FL - US - 30.36 - -82.25 - 0 - 0 - JAX - - - GAZ064 - 100640 - Columbia - GA - US - 33.53 - -82.24 - 0 - 0 - CAE - - - OHZ066 - 350660 - Perry - OH - US - 39.74 - -82.24 - 0 - 0 - RLX - - - FLZ031 - 90310 - Bradford - FL - US - 29.93 - -82.23 - 0 - 0 - JAX - - - GAZ151 - 101510 - Pierce - GA - US - 31.37 - -82.20 - 0 - 0 - JAX - - - NCZ507 - 335070 - Rutherford_Mountains - NC - US - 35.46 - -82.18 - 0 - 0 - GSP - - - GAZ164 - 101640 - Charlton - GA - US - 30.71 - -82.15 - 0 - 0 - JAX - - - TNZ046 - 420460 - Northwest_Carter - TN - US - 36.38 - -82.15 - 0 - 0 - MRX - - - FLZ043 - 90430 - Sumter - FL - US - 28.63 - -82.13 - 0 - 0 - TBW - - - NCZ510 - 335100 - Eastern_Polk - NC - US - 35.29 - -82.13 - 0 - 0 - GSP - - - NCZ050 - 330500 - Mitchell - NC - US - 35.98 - -82.12 - 0 - 0 - GSP - - - OHZ010 - 350100 - Lorain - OH - US - 41.29 - -82.11 - 0 - 0 - CLE - - - TNZ047 - 420470 - Southeast_Carter - TN - US - 36.23 - -82.11 - 0 - 0 - MRX - - - WVZ024 - 480240 - Mingo - WV - US - 37.74 - -82.11 - 0 - 0 - RLX - - - NCZ505 - 335050 - McDowell_Mountains - NC - US - 35.74 - -82.10 - 0 - 0 - GSP - - - SCZ019 - 400190 - Greenwood - SC - US - 34.18 - -82.10 - 0 - 0 - GSP - - - FLZ040 - 90400 - Marion - FL - US - 29.24 - -82.09 - 0 - 0 - JAX - - - GAZ065 - 100650 - Richmond - GA - US - 33.39 - -82.09 - 0 - 0 - CAE - - - VAZ006 - 460060 - Russell - VA - US - 36.93 - -82.09 - 0 - 0 - MRX - - - GAZ099 - 100990 - Candler - GA - US - 32.41 - -82.08 - 0 - 0 - CHS - - - WVZ013 - 480130 - Lincoln - WV - US - 38.16 - -82.04 - 0 - 0 - RLX - - - OHZ085 - 350850 - Meigs - OH - US - 39.04 - -82.03 - 0 - 0 - RLX - - - OHZ075 - 350750 - Athens - OH - US - 39.36 - -82.01 - 0 - 0 - RLX - - - VAZ004 - 460040 - Buchanan - VA - US - 37.29 - -82.01 - 0 - 0 - RLX - - - GAZ114 - 101140 - Tattnall - GA - US - 32.05 - -82.00 - 0 - 0 - CHS - - - GAZ152 - 101520 - Brantley - GA - US - 31.19 - -82.00 - 0 - 0 - JAX - - - WVZ007 - 480070 - Mason - WV - US - 38.75 - -82.00 - 0 - 0 - RLX - - - SCZ012 - 400120 - Laurens - SC - US - 34.49 - -81.98 - 0 - 0 - GSP - - - FLZ062 - 90620 - Charlotte - FL - US - 26.90 - -81.97 - 0 - 0 - TBW - - - VAZ008 - 460080 - Washington - VA - US - 36.76 - -81.97 - 0 - 0 - MRX - - - GAZ087 - 100870 - Jenkins - GA - US - 32.78 - -81.96 - 0 - 0 - CHS - - - OHZ057 - 350570 - Muskingum - OH - US - 39.96 - -81.96 - 0 - 0 - PBZ - - - SCZ007 - 400070 - Spartanburg - SC - US - 34.89 - -81.96 - 0 - 0 - GSP - - - NCZ506 - 335060 - Eastern_McDowell - NC - US - 35.64 - -81.95 - 0 - 0 - GSP - - - GAZ077 - 100770 - Burke - GA - US - 33.05 - -81.94 - 0 - 0 - CAE - - - NCZ508 - 335080 - Greater_Rutherford - NC - US - 35.39 - -81.94 - 0 - 0 - GSP - - - OHZ038 - 350380 - Holmes - OH - US - 40.56 - -81.93 - 0 - 0 - CLE - - - FLZ065 - 90650 - Lee - FL - US - 26.55 - -81.92 - 0 - 0 - TBW - - - OHZ020 - 350200 - Medina - OH - US - 41.13 - -81.92 - 0 - 0 - CLE - - - NCZ033 - 330330 - Avery - NC - US - 36.10 - -81.91 - 0 - 0 - GSP - - - SCZ025 - 400250 - Edgefield - SC - US - 33.76 - -81.91 - 0 - 0 - CAE - - - OHZ048 - 350480 - Coshocton - OH - US - 40.30 - -81.90 - 0 - 0 - PBZ - - - WVZ025 - 480250 - Logan - WV - US - 37.83 - -81.90 - 0 - 0 - RLX - - - GAZ136 - 101360 - Wayne - GA - US - 31.58 - -81.88 - 0 - 0 - JAX - - - OHZ031 - 350310 - Wayne - OH - US - 40.83 - -81.88 - 0 - 0 - CLE - - - WVZ014 - 480140 - Putnam - WV - US - 38.48 - -81.88 - 0 - 0 - RLX - - - GAZ115 - 101150 - Evans - GA - US - 32.16 - -81.87 - 0 - 0 - CHS - - - NCZ503 - 335030 - Burke_Mountains - NC - US - 35.88 - -81.85 - 0 - 0 - GSP - - - TNZ018 - 420180 - Johnson - TN - US - 36.44 - -81.85 - 0 - 0 - MRX - - - OHZ067 - 350670 - Morgan - OH - US - 39.61 - -81.83 - 0 - 0 - RLX - - - FLZ032 - 90320 - Clay - FL - US - 29.96 - -81.82 - 0 - 0 - JAX - - - FLZ056 - 90560 - Hardee - FL - US - 27.49 - -81.81 - 0 - 0 - TBW - - - FLZ061 - 90610 - De_Soto - FL - US - 27.19 - -81.81 - 0 - 0 - TBW - - - FLZ144 - 91440 - Southern_Lake_County - FL - US - 28.56 - -81.80 - 0 - 0 - MLB - - - GAZ165 - 101650 - Inland_Camden - GA - US - 30.95 - -81.76 - 0 - 0 - JAX - - - FLZ037 - 90370 - Putnam - FL - US - 29.58 - -81.75 - 0 - 0 - JAX - - - FLZ024 - 90240 - Nassau - FL - US - 30.54 - -81.74 - 0 - 0 - JAX - - - SCZ026 - 400260 - Saluda - SC - US - 33.99 - -81.74 - 0 - 0 - CAE - - - FLZ069 - 90690 - Coastal_Collier_County - FL - US - 26.07 - -81.73 - 0 - 0 - MFL - - - GAZ100 - 101000 - Bulloch - GA - US - 32.40 - -81.73 - 0 - 0 - CHS - - - GAZ137 - 101370 - Long - GA - US - 31.77 - -81.73 - 0 - 0 - CHS - - - WVZ026 - 480260 - Boone - WV - US - 38.00 - -81.72 - 0 - 0 - RLX - - - FLZ025 - 90250 - Duval - FL - US - 30.34 - -81.71 - 0 - 0 - JAX - - - WVZ008 - 480080 - Jackson - WV - US - 38.83 - -81.71 - 0 - 0 - RLX - - - NCZ018 - 330180 - Watauga - NC - US - 36.25 - -81.68 - 0 - 0 - RNK - - - NCZ504 - 335040 - Greater_Burke - NC - US - 35.72 - -81.66 - 0 - 0 - GSP - - - OHZ011 - 350110 - Cuyahoga - OH - US - 41.45 - -81.66 - 0 - 0 - CLE - - - WVZ033 - 480330 - McDowell - WV - US - 37.38 - -81.65 - 0 - 0 - RLX - - - FLZ044 - 90440 - Northern_Lake_County - FL - US - 29.03 - -81.64 - 0 - 0 - MLB - - - SCZ013 - 400130 - Union - SC - US - 34.68 - -81.64 - 0 - 0 - GSP - - - GAZ088 - 100880 - Screven - GA - US - 32.77 - -81.63 - 0 - 0 - CHS - - - GAZ153 - 101530 - Inland_Glynn - GA - US - 31.28 - -81.63 - 0 - 0 - JAX - - - FLZ052 - 90520 - Polk - FL - US - 28.00 - -81.62 - 0 - 0 - TBW - - - SCZ008 - 400080 - Cherokee - SC - US - 35.01 - -81.62 - 0 - 0 - GSP - - - SCZ020 - 400200 - Newberry - SC - US - 34.29 - -81.62 - 0 - 0 - CAE - - - NCZ501 - 335010 - Caldwell_Mountains - NC - US - 36.01 - -81.61 - 0 - 0 - GSP - - - SCZ030 - 400300 - Aiken - SC - US - 33.54 - -81.60 - 0 - 0 - CAE - - - VAZ007 - 460070 - Tazewell - VA - US - 37.14 - -81.56 - 0 - 0 - RNK - - - WVZ015 - 480150 - Kanawha - WV - US - 38.30 - -81.56 - 0 - 0 - RLX - - - FLZ078 - 90780 - Monroe/Lower_Keys - FL - US - 24.64 - -81.55 - 0 - 0 - KEY - - - GAZ166 - 101660 - Coastal_Camden - GA - US - 30.91 - -81.55 - 0 - 0 - JAX - - - GAZ138 - 101380 - Inland_Liberty - GA - US - 31.87 - -81.54 - 0 - 0 - CHS - - - NCZ068 - 330680 - Cleveland - NC - US - 35.36 - -81.54 - 0 - 0 - GSP - - - VAZ009 - 460090 - Smyth - VA - US - 36.82 - -81.54 - 0 - 0 - RNK - - - WVZ034 - 480340 - Wyoming - WV - US - 37.60 - -81.54 - 0 - 0 - RLX - - - OHZ021 - 350210 - Summit - OH - US - 41.13 - -81.53 - 0 - 0 - CLE - - - NCZ502 - 335020 - Greater_Caldwell - NC - US - 35.91 - -81.52 - 0 - 0 - GSP - - - GAZ116 - 101160 - Inland_Bryan - GA - US - 32.00 - -81.50 - 0 - 0 - CHS - - - WVZ009 - 480090 - Wood - WV - US - 39.22 - -81.50 - 0 - 0 - RLX - - - NCZ001 - 330010 - Ashe - NC - US - 36.41 - -81.49 - 0 - 0 - RNK - - - OHZ039 - 350390 - Tuscarawas - OH - US - 40.43 - -81.49 - 0 - 0 - PBZ - - - GAZ140 - 101400 - Inland_McIntosh - GA - US - 31.52 - -81.48 - 0 - 0 - CHS - - - SCZ035 - 400350 - Barnwell - SC - US - 33.29 - -81.48 - 0 - 0 - CAE - - - OHZ058 - 350580 - Guernsey - OH - US - 40.02 - -81.47 - 0 - 0 - PBZ - - - OHZ068 - 350680 - Noble - OH - US - 39.76 - -81.46 - 0 - 0 - PBZ - - - FLZ033 - 90330 - St._Johns - FL - US - 29.94 - -81.45 - 0 - 0 - JAX - - - OHZ076 - 350760 - Washington - OH - US - 39.43 - -81.45 - 0 - 0 - RLX - - - GAZ154 - 101540 - Coastal_Glynn - GA - US - 31.23 - -81.41 - 0 - 0 - JAX - - - WVZ017 - 480170 - Wirt - WV - US - 39.04 - -81.38 - 0 - 0 - RLX - - - FLZ041 - 90410 - Inland_Volusia_County - FL - US - 29.10 - -81.37 - 0 - 0 - MLB - - - OHZ032 - 350320 - Stark - OH - US - 40.81 - -81.36 - 0 - 0 - CLE - - - SCZ040 - 400400 - Allendale - SC - US - 32.95 - -81.34 - 0 - 0 - CHS - - - GAZ101 - 101010 - Effingham - GA - US - 32.35 - -81.33 - 0 - 0 - CHS - - - GAZ141 - 101410 - Coastal_McIntosh - GA - US - 31.46 - -81.33 - 0 - 0 - CHS - - - WVZ016 - 480160 - Roane - WV - US - 38.74 - -81.32 - 0 - 0 - RLX - - - FLZ038 - 90380 - Flagler - FL - US - 29.47 - -81.31 - 0 - 0 - JAX - - - FLZ070 - 90700 - Inland_Collier_County - FL - US - 26.16 - -81.31 - 0 - 0 - MFL - - - FLZ045 - 90450 - Orange - FL - US - 28.56 - -81.27 - 0 - 0 - MLB - - - FLZ053 - 90530 - Osceola - FL - US - 27.99 - -81.26 - 0 - 0 - MLB - - - FLZ057 - 90570 - Highlands - FL - US - 27.34 - -81.26 - 0 - 0 - TBW - - - VAZ015 - 460150 - Grayson - VA - US - 36.69 - -81.26 - 0 - 0 - RNK - - - GAZ118 - 101180 - Inland_Chatham - GA - US - 32.07 - -81.24 - 0 - 0 - CHS - - - OHZ012 - 350120 - Lake - OH - US - 41.71 - -81.24 - 0 - 0 - CLE - - - SCZ027 - 400270 - Lexington - SC - US - 33.92 - -81.24 - 0 - 0 - CAE - - - NCZ056 - 330560 - Catawba - NC - US - 35.68 - -81.23 - 0 - 0 - GSP - - - NCZ069 - 330690 - Lincoln - NC - US - 35.48 - -81.23 - 0 - 0 - GSP - - - FLZ046 - 90460 - Seminole - FL - US - 28.74 - -81.22 - 0 - 0 - MLB - - - FLZ063 - 90630 - Glades - FL - US - 26.99 - -81.22 - 0 - 0 - MFL - - - FLZ066 - 90660 - Hendry - FL - US - 26.52 - -81.22 - 0 - 0 - MFL - - - WVZ035 - 480350 - Raleigh - WV - US - 37.75 - -81.22 - 0 - 0 - RLX - - - GAZ139 - 101390 - Coastal_Liberty - GA - US - 31.66 - -81.21 - 0 - 0 - CHS - - - NCZ019 - 330190 - Wilkes - NC - US - 36.21 - -81.21 - 0 - 0 - RNK - - - GAZ117 - 101170 - Coastal_Bryan - GA - US - 31.83 - -81.20 - 0 - 0 - CHS - - - OHZ013 - 350130 - Geauga - OH - US - 41.53 - -81.19 - 0 - 0 - CLE - - - OHZ022 - 350220 - Portage - OH - US - 41.17 - -81.19 - 0 - 0 - CLE - - - WVZ010 - 480100 - Pleasants - WV - US - 39.37 - -81.19 - 0 - 0 - RLX - - - NCZ070 - 330700 - Gaston - NC - US - 35.28 - -81.18 - 0 - 0 - GSP - - - SCZ009 - 400090 - York - SC - US - 34.99 - -81.18 - 0 - 0 - GSP - - - SCZ014 - 400140 - Chester - SC - US - 34.68 - -81.18 - 0 - 0 - GSP - - - NCZ035 - 330350 - Alexander - NC - US - 35.90 - -81.17 - 0 - 0 - GSP - - - VAZ010 - 460100 - Bland - VA - US - 37.13 - -81.15 - 0 - 0 - RNK - - - WVZ018 - 480180 - Calhoun - WV - US - 38.83 - -81.13 - 0 - 0 - RLX - - - FLZ075 - 90750 - Mainland_Monroe - FL - US - 25.46 - -81.12 - 0 - 0 - MFL - - - NCZ002 - 330020 - Alleghany - NC - US - 36.47 - -81.12 - 0 - 0 - RNK - - - SCZ042 - 400420 - Hampton - SC - US - 32.79 - -81.12 - 0 - 0 - CHS - - - OHZ049 - 350490 - Harrison - OH - US - 40.29 - -81.10 - 0 - 0 - PBZ - - - SCZ021 - 400210 - Fairfield - SC - US - 34.37 - -81.10 - 0 - 0 - CAE - - - WVZ042 - 480420 - Mercer - WV - US - 37.42 - -81.10 - 0 - 0 - RNK - - - OHZ040 - 350400 - Carroll - OH - US - 40.57 - -81.09 - 0 - 0 - PBZ - - - OHZ069 - 350690 - Monroe - OH - US - 39.70 - -81.07 - 0 - 0 - PBZ - - - WVZ019 - 480190 - Ritchie - WV - US - 39.20 - -81.07 - 0 - 0 - RLX - - - WVZ036 - 480360 - Fayette - WV - US - 38.04 - -81.07 - 0 - 0 - RLX - - - VAZ012 - 460120 - Wythe - VA - US - 36.92 - -81.06 - 0 - 0 - RNK - - - SCZ047 - 400470 - Inland_Jasper - SC - US - 32.42 - -81.05 - 0 - 0 - CHS - - - WVZ027 - 480270 - Clay - WV - US - 38.47 - -81.05 - 0 - 0 - RLX - - - FLZ141 - 91410 - Coastal_Volusia_County - FL - US - 29.02 - -81.03 - 0 - 0 - MLB - - - GAZ119 - 101190 - Coastal_Chatham - GA - US - 31.91 - -81.02 - 0 - 0 - CHS - - - SCZ041 - 400410 - Bamberg - SC - US - 33.23 - -81.01 - 0 - 0 - CAE - - - SCZ051 - 400510 - Coastal_Jasper - SC - US - 32.27 - -81.00 - 0 - 0 - CHS - - - OHZ059 - 350590 - Belmont - OH - US - 40.00 - -80.97 - 0 - 0 - PBZ - - - SCZ028 - 400280 - Richland - SC - US - 34.00 - -80.97 - 0 - 0 - CAE - - - FLZ077 - 90770 - Monroe/Middle_Keys - FL - US - 24.76 - -80.96 - 0 - 0 - KEY - - - FLZ058 - 90580 - Okeechobee - FL - US - 27.38 - -80.94 - 0 - 0 - MLB - - - NCZ036 - 330360 - Iredell - NC - US - 35.78 - -80.90 - 0 - 0 - GSP - - - WVZ011 - 480110 - Tyler - WV - US - 39.45 - -80.87 - 0 - 0 - RLX - - - WVZ043 - 480430 - Summers - WV - US - 37.65 - -80.87 - 0 - 0 - RNK - - - FLZ147 - 91470 - Northern_Brevard_County - FL - US - 28.56 - -80.86 - 0 - 0 - MLB - - - WVZ037 - 480370 - Nicholas - WV - US - 38.32 - -80.84 - 0 - 0 - RLX - - - WVZ029 - 480290 - Gilmer - WV - US - 38.92 - -80.83 - 0 - 0 - RLX - - - NCZ071 - 330710 - Mecklenburg - NC - US - 35.26 - -80.80 - 0 - 0 - GSP - - - OHZ033 - 350330 - Mahoning - OH - US - 41.01 - -80.80 - 0 - 0 - CLE - - - OHZ041 - 350410 - Columbiana - OH - US - 40.76 - -80.80 - 0 - 0 - PBZ - - - SCZ036 - 400360 - Orangeburg - SC - US - 33.44 - -80.79 - 0 - 0 - CAE - - - OHZ050 - 350500 - Jefferson - OH - US - 40.37 - -80.77 - 0 - 0 - PBZ - - - SCZ037 - 400370 - Calhoun - SC - US - 33.67 - -80.77 - 0 - 0 - CAE - - - OHZ014 - 350140 - Ashtabula_Inland - OH - US - 41.71 - -80.76 - 0 - 0 - CLE - - - OHZ023 - 350230 - Trumbull - OH - US - 41.31 - -80.76 - 0 - 0 - CLE - - - OHZ089 - 350890 - Ashtabula_Lakeshore - OH - US - 41.88 - -80.76 - 0 - 0 - CLE - - - VAZ016 - 460160 - Carroll - VA - US - 36.74 - -80.75 - 0 - 0 - RNK - - - WVZ028 - 480280 - Braxton - WV - US - 38.71 - -80.74 - 0 - 0 - RLX - - - SCZ043 - 400430 - Inland_Colleton - SC - US - 32.92 - -80.73 - 0 - 0 - CHS - - - WVZ020 - 480200 - Doddridge - WV - US - 39.27 - -80.73 - 0 - 0 - RLX - - - SCZ048 - 400480 - Beaufort - SC - US - 32.39 - -80.72 - 0 - 0 - CHS - - - VAZ011 - 460110 - Giles - VA - US - 37.31 - -80.72 - 0 - 0 - RNK - - - VAZ013 - 460130 - Pulaski - VA - US - 37.06 - -80.72 - 0 - 0 - RNK - - - NCZ003 - 330030 - Surry - NC - US - 36.40 - -80.70 - 0 - 0 - RNK - - - WVZ004 - 480040 - Marshall - WV - US - 39.88 - -80.70 - 0 - 0 - PBZ - - - WVZ012 - 480120 - Wetzel - WV - US - 39.58 - -80.67 - 0 - 0 - PBZ - - - FLZ047 - 90470 - Southern_Brevard_County - FL - US - 28.08 - -80.66 - 0 - 0 - MLB - - - NCZ020 - 330200 - Yadkin - NC - US - 36.16 - -80.66 - 0 - 0 - RNK - - - SCZ015 - 400150 - Lancaster - SC - US - 34.76 - -80.66 - 0 - 0 - CAE - - - FLZ174 - 91740 - Far_South_Miami-Dade_County - FL - US - 25.30 - -80.63 - 0 - 0 - MFL - - - WVZ003 - 480030 - Ohio - WV - US - 40.11 - -80.63 - 0 - 0 - PBZ - - - FLZ073 - 90730 - Inland_Miami-Dade_County - FL - US - 25.69 - -80.61 - 0 - 0 - MFL - - - FLZ054 - 90540 - Indian_River - FL - US - 27.71 - -80.60 - 0 - 0 - MLB - - - WVZ001 - 480010 - Hancock - WV - US - 40.52 - -80.60 - 0 - 0 - PBZ - - - WVZ002 - 480020 - Brooke - WV - US - 40.28 - -80.60 - 0 - 0 - PBZ - - - FLZ071 - 90710 - Inland_Broward_County - FL - US - 26.15 - -80.59 - 0 - 0 - MFL - - - SCZ022 - 400220 - Kershaw - SC - US - 34.34 - -80.58 - 0 - 0 - CAE - - - NCZ082 - 330820 - Union - NC - US - 35.01 - -80.56 - 0 - 0 - GSP - - - FLZ067 - 90670 - Inland_Palm_Beach_County - FL - US - 26.64 - -80.54 - 0 - 0 - MFL - - - NCZ072 - 330720 - Cabarrus - NC - US - 35.35 - -80.54 - 0 - 0 - GSP - - - WVZ044 - 480440 - Monroe - WV - US - 37.55 - -80.54 - 0 - 0 - RNK - - - NCZ037 - 330370 - Davie - NC - US - 35.90 - -80.53 - 0 - 0 - GSP - - - WVZ030 - 480300 - Lewis - WV - US - 38.94 - -80.52 - 0 - 0 - RLX - - - NCZ057 - 330570 - Rowan - NC - US - 35.67 - -80.47 - 0 - 0 - GSP - - - SCZ049 - 400490 - Coastal_Colleton - SC - US - 32.61 - -80.46 - 0 - 0 - CHS - - - FLZ059 - 90590 - St._Lucie - FL - US - 27.38 - -80.44 - 0 - 0 - MLB - - - SCZ044 - 400440 - Dorchester - SC - US - 33.07 - -80.44 - 0 - 0 - CHS - - - WVZ038 - 480380 - Webster - WV - US - 38.49 - -80.43 - 0 - 0 - RLX - - - WVZ045 - 480450 - Greenbrier - WV - US - 37.98 - -80.43 - 0 - 0 - RNK - - - VAZ014 - 460140 - Montgomery - VA - US - 37.17 - -80.40 - 0 - 0 - RNK - - - WVZ031 - 480310 - Harrison - WV - US - 39.28 - -80.39 - 0 - 0 - RLX - - - FLZ064 - 90640 - Martin - FL - US - 27.11 - -80.38 - 0 - 0 - MLB - - - FLZ076 - 90760 - Monroe/Upper_Keys - FL - US - 25.15 - -80.38 - 0 - 0 - KEY - - - VAZ017 - 460170 - Floyd - VA - US - 36.92 - -80.37 - 0 - 0 - RNK - - - PAZ020 - 380200 - Beaver - PA - US - 40.67 - -80.34 - 0 - 0 - PBZ - - - VAZ032 - 460320 - Patrick - VA - US - 36.71 - -80.33 - 0 - 0 - RNK - - - PAZ013 - 380130 - Lawrence - PA - US - 40.99 - -80.31 - 0 - 0 - PBZ - - - FLZ173 - 91730 - Coastal_Miami_Dade_County - FL - US - 25.64 - -80.30 - 0 - 0 - MFL - - - FLZ072 - 90720 - Metro_Broward_County - FL - US - 26.15 - -80.28 - 0 - 0 - MFL - - - FLZ074 - 90740 - Metropolitan_Miami_Dade - FL - US - 25.78 - -80.28 - 0 - 0 - MFL - - - NCZ073 - 330730 - Stanly - NC - US - 35.33 - -80.28 - 0 - 0 - RAH - - - NCZ021 - 330210 - Forsyth - NC - US - 36.11 - -80.27 - 0 - 0 - RAH - - - SCZ031 - 400310 - Sumter - SC - US - 33.90 - -80.27 - 0 - 0 - CAE - - - NCZ038 - 330380 - Davidson - NC - US - 35.76 - -80.26 - 0 - 0 - RAH - - - PAZ007 - 380070 - Mercer - PA - US - 41.28 - -80.26 - 0 - 0 - PBZ - - - NCZ004 - 330040 - Stokes - NC - US - 36.40 - -80.24 - 0 - 0 - RNK - - - SCZ029 - 400290 - Lee - SC - US - 34.16 - -80.23 - 0 - 0 - CAE - - - WVZ039 - 480390 - Upshur - WV - US - 38.90 - -80.23 - 0 - 0 - RLX - - - PAZ031 - 380310 - Greene - PA - US - 39.87 - -80.22 - 0 - 0 - PBZ - - - VAZ018 - 460180 - Craig - VA - US - 37.49 - -80.22 - 0 - 0 - RNK - - - WVZ021 - 480210 - Marion - WV - US - 39.51 - -80.22 - 0 - 0 - PBZ - - - SCZ038 - 400380 - Clarendon - SC - US - 33.69 - -80.21 - 0 - 0 - CAE - - - PAZ029 - 380290 - Washington - PA - US - 40.22 - -80.19 - 0 - 0 - PBZ - - - SCZ016 - 400160 - Chesterfield - SC - US - 34.59 - -80.17 - 0 - 0 - CAE - - - FLZ068 - 90680 - Metro_Palm_Beach_County - FL - US - 26.64 - -80.14 - 0 - 0 - MFL - - - PAZ001 - 380010 - Northern_Erie - PA - US - 42.10 - -80.14 - 0 - 0 - CLE - - - FLZ172 - 91720 - Coastal_Broward_County - FL - US - 26.15 - -80.12 - 0 - 0 - MFL - - - WVZ022 - 480220 - Monongalia - WV - US - 39.58 - -80.10 - 0 - 0 - PBZ - - - NCZ083 - 330830 - Anson - NC - US - 35.01 - -80.09 - 0 - 0 - RAH - - - PAZ002 - 380020 - Southern_Erie - PA - US - 42.03 - -80.07 - 0 - 0 - CLE - - - PAZ003 - 380030 - Crawford - PA - US - 41.67 - -80.07 - 0 - 0 - CLE - - - FLZ168 - 91680 - Coastal_Palm_Beach_County - FL - US - 26.65 - -80.06 - 0 - 0 - MFL - - - WVZ032 - 480320 - Taylor - WV - US - 39.34 - -80.06 - 0 - 0 - RLX - - - VAZ022 - 460220 - Roanoke - VA - US - 37.26 - -80.05 - 0 - 0 - RNK - - - PAZ021 - 380210 - Allegheny - PA - US - 40.44 - -80.03 - 0 - 0 - PBZ - - - WVZ040 - 480400 - Barbour - WV - US - 39.12 - -80.02 - 0 - 0 - RLX - - - WVZ046 - 480460 - Pocahontas - WV - US - 38.39 - -80.00 - 0 - 0 - RLX - - - SCZ023 - 400230 - Darlington - SC - US - 34.31 - -79.98 - 0 - 0 - ILM - - - VAZ019 - 460190 - Alleghany - VA - US - 37.78 - -79.95 - 0 - 0 - RNK - - - PAZ014 - 380140 - Butler - PA - US - 40.92 - -79.93 - 0 - 0 - PBZ - - - VAZ033 - 460330 - Franklin - VA - US - 37.01 - -79.92 - 0 - 0 - RNK - - - SCZ045 - 400450 - Berkeley - SC - US - 33.17 - -79.90 - 0 - 0 - CHS - - - NCZ074 - 330740 - Montgomery - NC - US - 35.32 - -79.89 - 0 - 0 - RAH - - - VAZ043 - 460430 - Henry - VA - US - 36.70 - -79.87 - 0 - 0 - RNK - - - SCZ050 - 400500 - Charleston - SC - US - 32.85 - -79.86 - 0 - 0 - CHS - - - WVZ047 - 480470 - Randolph - WV - US - 38.75 - -79.81 - 0 - 0 - RLX - - - NCZ039 - 330390 - Randolph - NC - US - 35.71 - -79.80 - 0 - 0 - RAH - - - NCZ022 - 330220 - Guilford - NC - US - 36.07 - -79.79 - 0 - 0 - RAH - - - VAZ023 - 460230 - Botetourt - VA - US - 37.55 - -79.79 - 0 - 0 - RNK - - - NCZ005 - 330050 - Rockingham - NC - US - 36.39 - -79.77 - 0 - 0 - RNK - - - NCZ084 - 330840 - Richmond - NC - US - 34.99 - -79.76 - 0 - 0 - RAH - - - VAZ020 - 460200 - Bath - VA - US - 38.06 - -79.75 - 0 - 0 - RNK - - - PAZ008 - 380080 - Venango - PA - US - 41.40 - -79.74 - 0 - 0 - PBZ - - - SCZ039 - 400390 - Williamsburg - SC - US - 33.59 - -79.71 - 0 - 0 - ILM - - - WVZ023 - 480230 - Preston - WV - US - 39.46 - -79.70 - 0 - 0 - PBZ - - - SCZ017 - 400170 - Marlboro - SC - US - 34.55 - -79.69 - 0 - 0 - ILM - - - SCZ032 - 400320 - Florence - SC - US - 34.04 - -79.69 - 0 - 0 - ILM - - - PAZ032 - 380320 - Fayette - PA - US - 39.93 - -79.66 - 0 - 0 - PBZ - - - WVZ041 - 480410 - Tucker - WV - US - 39.11 - -79.57 - 0 - 0 - PBZ - - - VAZ021 - 460210 - Highland - VA - US - 38.39 - -79.56 - 0 - 0 - LWX - - - VAZ034 - 460340 - Bedford - VA - US - 37.31 - -79.52 - 0 - 0 - RNK - - - NCZ085 - 330850 - Scotland - NC - US - 34.84 - -79.51 - 0 - 0 - RAH - - - PAZ015 - 380150 - Clarion - PA - US - 41.20 - -79.46 - 0 - 0 - PBZ - - - PAZ022 - 380220 - Armstrong - PA - US - 40.85 - -79.46 - 0 - 0 - PBZ - - - PAZ030 - 380300 - Westmoreland - PA - US - 40.36 - -79.44 - 0 - 0 - PBZ - - - WVZ501 - 485010 - Western_Grant - WV - US - 39.20 - -79.44 - 0 - 0 - LWX - - - NCZ075 - 330750 - Moore - NC - US - 35.28 - -79.43 - 0 - 0 - RAH - - - NYZ019 - 320190 - Chautauqua - NY - US - 42.29 - -79.41 - 0 - 0 - BUF - - - VAZ024 - 460240 - Rockbridge - VA - US - 37.81 - -79.41 - 0 - 0 - RNK - - - VAZ044 - 460440 - Pittsylvania - VA - US - 36.84 - -79.41 - 0 - 0 - RNK - - - NCZ023 - 330230 - Alamance - NC - US - 36.04 - -79.39 - 0 - 0 - RAH - - - SCZ024 - 400240 - Dillon - SC - US - 34.42 - -79.36 - 0 - 0 - ILM - - - SCZ033 - 400330 - Marion - SC - US - 34.00 - -79.35 - 0 - 0 - ILM - - - WVZ054 - 480540 - Pendleton - WV - US - 38.68 - -79.35 - 0 - 0 - LWX - - - NCZ006 - 330060 - Caswell - NC - US - 36.39 - -79.34 - 0 - 0 - RNK - - - SCZ046 - 400460 - Georgetown - SC - US - 33.45 - -79.34 - 0 - 0 - ILM - - - PAZ004 - 380040 - Warren - PA - US - 41.81 - -79.27 - 0 - 0 - CTP - - - NCZ086 - 330860 - Hoke - NC - US - 35.02 - -79.24 - 0 - 0 - RAH - - - PAZ009 - 380090 - Forest - PA - US - 41.47 - -79.24 - 0 - 0 - PBZ - - - NCZ040 - 330400 - Chatham - NC - US - 35.69 - -79.23 - 0 - 0 - RAH - - - MDZ001 - 200010 - Garrett - MD - US - 39.46 - -79.21 - 0 - 0 - PBZ - - - NCZ076 - 330760 - Lee - NC - US - 35.46 - -79.17 - 0 - 0 - RAH - - - WVZ502 - 485020 - Eastern_Grant - WV - US - 39.06 - -79.17 - 0 - 0 - LWX - - - VAZ035 - 460350 - Amherst - VA - US - 37.59 - -79.16 - 0 - 0 - RNK - - - PAZ023 - 380230 - Indiana - PA - US - 40.64 - -79.14 - 0 - 0 - PBZ - - - NCZ087 - 330870 - Robeson - NC - US - 34.63 - -79.13 - 0 - 0 - ILM - - - VAZ025 - 460250 - Augusta - VA - US - 38.18 - -79.13 - 0 - 0 - LWX - - - VAZ045 - 460450 - Campbell - VA - US - 37.25 - -79.13 - 0 - 0 - RNK - - - WVZ503 - 485030 - Western_Mineral - WV - US - 39.40 - -79.13 - 0 - 0 - LWX - - - NCZ024 - 330240 - Orange - NC - US - 36.04 - -79.11 - 0 - 0 - RAH - - - PAZ033 - 380330 - Somerset - PA - US - 40.00 - -79.04 - 0 - 0 - CTP - - - NCZ007 - 330070 - Person - NC - US - 36.39 - -78.98 - 0 - 0 - RAH - - - PAZ016 - 380160 - Jefferson - PA - US - 41.14 - -78.96 - 0 - 0 - PBZ - - - SCZ034 - 400340 - Horry - SC - US - 33.94 - -78.94 - 0 - 0 - ILM - - - MDZ501 - 205010 - Extreme_Western_Allegany - MD - US - 39.58 - -78.92 - 0 - 0 - LWX - - - VAZ036 - 460360 - Nelson - VA - US - 37.79 - -78.92 - 0 - 0 - LWX - - - WVZ504 - 485040 - Eastern_Mineral - WV - US - 39.44 - -78.89 - 0 - 0 - LWX - - - NCZ077 - 330770 - Harnett - NC - US - 35.38 - -78.88 - 0 - 0 - RAH - - - VAZ058 - 460580 - Halifax - VA - US - 36.80 - -78.88 - 0 - 0 - RNK - - - NCZ025 - 330250 - Durham - NC - US - 36.05 - -78.86 - 0 - 0 - RAH - - - VAZ026 - 460260 - Rockingham - VA - US - 38.53 - -78.86 - 0 - 0 - LWX - - - VAZ046 - 460460 - Appomattox - VA - US - 37.38 - -78.81 - 0 - 0 - RNK - - - WVZ055 - 480550 - Hardy - WV - US - 39.00 - -78.81 - 0 - 0 - LWX - - - NCZ088 - 330880 - Cumberland - NC - US - 35.04 - -78.80 - 0 - 0 - RAH - - - NYZ085 - 320850 - Southern_Erie - NY - US - 42.62 - -78.80 - 0 - 0 - BUF - - - NYZ001 - 320010 - Niagara - NY - US - 43.20 - -78.77 - 0 - 0 - BUF - - - NYZ010 - 320100 - Northern_Erie - NY - US - 42.94 - -78.74 - 0 - 0 - BUF - - - PAZ024 - 380240 - Cambria - PA - US - 40.48 - -78.71 - 0 - 0 - CTP - - - NYZ020 - 320200 - Cattaraugus - NY - US - 42.27 - -78.68 - 0 - 0 - BUF - - - VAZ059 - 460590 - Charlotte - VA - US - 36.98 - -78.68 - 0 - 0 - RNK - - - PAZ010 - 380100 - Elk - PA - US - 41.42 - -78.67 - 0 - 0 - CTP - - - WVZ050 - 480500 - Hampshire - WV - US - 39.32 - -78.66 - 0 - 0 - LWX - - - MDZ502 - 205020 - Central_and_Eastern_Allegany - MD - US - 39.58 - -78.65 - 0 - 0 - LWX - - - NCZ008 - 330080 - Granville - NC - US - 36.28 - -78.63 - 0 - 0 - RAH - - - NCZ041 - 330410 - Wake - NC - US - 35.79 - -78.63 - 0 - 0 - RAH - - - NCZ099 - 330990 - Columbus - NC - US - 34.21 - -78.61 - 0 - 0 - ILM - - - PAZ005 - 380050 - McKean - PA - US - 41.80 - -78.58 - 0 - 0 - CTP - - - VAZ027 - 460270 - Shenandoah - VA - US - 38.86 - -78.58 - 0 - 0 - LWX - - - VAZ047 - 460470 - Buckingham - VA - US - 37.56 - -78.55 - 0 - 0 - RNK - - - NCZ096 - 330960 - Bladen - NC - US - 34.61 - -78.53 - 0 - 0 - ILM - - - VAZ037 - 460370 - Albemarle - VA - US - 38.00 - -78.52 - 0 - 0 - LWX - - - PAZ034 - 380340 - Bedford - PA - US - 40.02 - -78.48 - 0 - 0 - CTP - - - VAZ029 - 460290 - Page - VA - US - 38.62 - -78.48 - 0 - 0 - LWX - - - VAZ038 - 460380 - Greene - VA - US - 38.33 - -78.47 - 0 - 0 - LWX - - - VAZ060 - 460600 - Prince_Edward - VA - US - 37.24 - -78.46 - 0 - 0 - AKQ - - - PAZ017 - 380170 - Clearfield - PA - US - 40.99 - -78.43 - 0 - 0 - CTP - - - NCZ009 - 330090 - Vance - NC - US - 36.35 - -78.40 - 0 - 0 - RAH - - - NCZ042 - 330420 - Johnston - NC - US - 35.53 - -78.39 - 0 - 0 - RAH - - - NCZ089 - 330890 - Sampson - NC - US - 34.93 - -78.39 - 0 - 0 - RAH - - - VAZ065 - 460650 - Mecklenburg - VA - US - 36.72 - -78.39 - 0 - 0 - AKQ - - - PAZ025 - 380250 - Blair - PA - US - 40.50 - -78.37 - 0 - 0 - CTP - - - NCZ100 - 331000 - Brunswick - NC - US - 34.10 - -78.30 - 0 - 0 - ILM - - - VAZ028 - 460280 - Frederick - VA - US - 39.23 - -78.29 - 0 - 0 - LWX - - - NCZ026 - 330260 - Franklin - NC - US - 36.04 - -78.28 - 0 - 0 - RAH - - - VAZ048 - 460480 - Fluvanna - VA - US - 37.85 - -78.28 - 0 - 0 - AKQ - - - VAZ061 - 460610 - Cumberland - VA - US - 37.52 - -78.28 - 0 - 0 - AKQ - - - VAZ039 - 460390 - Madison - VA - US - 38.43 - -78.27 - 0 - 0 - LWX - - - VAZ066 - 460660 - Lunenburg - VA - US - 36.95 - -78.25 - 0 - 0 - AKQ - - - WVZ051 - 480510 - Morgan - WV - US - 39.54 - -78.25 - 0 - 0 - LWX - - - NYZ002 - 320020 - Orleans - NY - US - 43.25 - -78.23 - 0 - 0 - BUF - - - NYZ012 - 320120 - Wyoming - NY - US - 42.70 - -78.22 - 0 - 0 - BUF - - - PAZ011 - 380110 - Cameron - PA - US - 41.42 - -78.21 - 0 - 0 - CTP - - - VAZ030 - 460300 - Warren - VA - US - 38.90 - -78.20 - 0 - 0 - LWX - - - NYZ011 - 320110 - Genesee - NY - US - 43.00 - -78.18 - 0 - 0 - BUF - - - VAZ040 - 460400 - Rappahannock - VA - US - 38.69 - -78.14 - 0 - 0 - LWX - - - PAZ035 - 380350 - Fulton - PA - US - 39.94 - -78.13 - 0 - 0 - CTP - - - NCZ010 - 330100 - Warren - NC - US - 36.37 - -78.11 - 0 - 0 - RAH - - - NCZ078 - 330780 - Wayne - NC - US - 35.37 - -78.06 - 0 - 0 - RAH - - - VAZ050 - 460500 - Orange - VA - US - 38.26 - -78.04 - 0 - 0 - LWX - - - VAZ067 - 460670 - Nottoway - VA - US - 37.14 - -78.03 - 0 - 0 - AKQ - - - WVZ052 - 480520 - Berkeley - WV - US - 39.44 - -78.03 - 0 - 0 - LWX - - - NYZ021 - 320210 - Allegany - NY - US - 42.26 - -78.01 - 0 - 0 - BUF - - - PAZ018 - 380180 - Northern_Centre - PA - US - 41.00 - -78.01 - 0 - 0 - CTP - - - VAZ049 - 460490 - Louisa - VA - US - 37.94 - -78.00 - 0 - 0 - AKQ - - - VAZ031 - 460310 - Clarke - VA - US - 39.12 - -77.99 - 0 - 0 - LWX - - - NCZ027 - 330270 - Nash - NC - US - 35.96 - -77.98 - 0 - 0 - RAH - - - PAZ026 - 380260 - Huntingdon - PA - US - 40.40 - -77.97 - 0 - 0 - CTP - - - VAZ068 - 460680 - Amelia - VA - US - 37.34 - -77.95 - 0 - 0 - AKQ - - - NCZ043 - 330430 - Wilson - NC - US - 35.71 - -77.93 - 0 - 0 - RAH - - - NCZ090 - 330900 - Duplin - NC - US - 34.95 - -77.93 - 0 - 0 - MHX - - - VAZ051 - 460510 - Culpeper - VA - US - 38.51 - -77.93 - 0 - 0 - LWX - - - PAZ006 - 380060 - Potter - PA - US - 41.74 - -77.91 - 0 - 0 - CTP - - - VAZ062 - 460620 - Goochland - VA - US - 37.73 - -77.90 - 0 - 0 - AKQ - - - VAZ069 - 460690 - Powhatan - VA - US - 37.55 - -77.90 - 0 - 0 - AKQ - - - NCZ097 - 330970 - Pender - NC - US - 34.51 - -77.89 - 0 - 0 - ILM - - - NCZ101 - 331010 - New_Hanover - NC - US - 34.16 - -77.88 - 0 - 0 - ILM - - - WVZ053 - 480530 - Jefferson - WV - US - 39.32 - -77.88 - 0 - 0 - LWX - - - VAZ079 - 460790 - Brunswick - VA - US - 36.79 - -77.86 - 0 - 0 - AKQ - - - VAZ041 - 460410 - Fauquier - VA - US - 38.71 - -77.84 - 0 - 0 - LWX - - - PAZ036 - 380360 - Franklin - PA - US - 40.01 - -77.78 - 0 - 0 - CTP - - - NYZ013 - 320130 - Livingston - NY - US - 42.73 - -77.77 - 0 - 0 - BUF - - - MDZ003 - 200030 - Washington - MD - US - 39.52 - -77.72 - 0 - 0 - LWX - - - PAZ012 - 380120 - Northern_Clinton - PA - US - 41.28 - -77.71 - 0 - 0 - CTP - - - PAZ019 - 380190 - Southern_Centre - PA - US - 40.89 - -77.69 - 0 - 0 - CTP - - - NYZ003 - 320030 - Monroe - NY - US - 43.16 - -77.68 - 0 - 0 - BUF - - - VAZ056 - 460560 - Spotsylvania - VA - US - 38.19 - -77.66 - 0 - 0 - LWX - - - NCZ079 - 330790 - Greene - NC - US - 35.50 - -77.65 - 0 - 0 - MHX - - - VAZ080 - 460800 - Dinwiddie - VA - US - 37.07 - -77.65 - 0 - 0 - AKQ - - - VAZ042 - 460420 - Loudoun - VA - US - 39.09 - -77.64 - 0 - 0 - LWX - - - NCZ011 - 330110 - Halifax - NC - US - 36.25 - -77.62 - 0 - 0 - RAH - - - NCZ091 - 330910 - Lenoir - NC - US - 35.21 - -77.61 - 0 - 0 - MHX - - - PAZ027 - 380270 - Mifflin - PA - US - 40.61 - -77.60 - 0 - 0 - CTP - - - NCZ028 - 330280 - Edgecombe - NC - US - 35.91 - -77.59 - 0 - 0 - RAH - - - VAZ070 - 460700 - Chesterfield - VA - US - 37.39 - -77.56 - 0 - 0 - AKQ - - - VAZ087 - 460870 - Greensville - VA - US - 36.72 - -77.56 - 0 - 0 - AKQ - - - PAZ028 - 380280 - Juniata - PA - US - 40.48 - -77.50 - 0 - 0 - CTP - - - NCZ012 - 330120 - Northampton - NC - US - 36.36 - -77.49 - 0 - 0 - AKQ - - - VAZ052 - 460520 - Pr_William/Manassas/Manassas_Pk - VA - US - 38.72 - -77.47 - 0 - 0 - LWX - - - VAZ055 - 460550 - Stafford - VA - US - 38.42 - -77.46 - 0 - 0 - LWX - - - VAZ063 - 460630 - Hanover - VA - US - 37.78 - -77.46 - 0 - 0 - AKQ - - - VAZ071 - 460710 - Henrico - VA - US - 37.53 - -77.42 - 0 - 0 - AKQ - - - MDZ004 - 200040 - Frederick - MD - US - 39.47 - -77.40 - 0 - 0 - LWX - - - NCZ044 - 330440 - Pitt - NC - US - 35.58 - -77.40 - 0 - 0 - MHX - - - NCZ092 - 330920 - Jones - NC - US - 35.01 - -77.39 - 0 - 0 - MHX - - - PAZ045 - 380450 - Southern_Clinton - PA - US - 41.09 - -77.39 - 0 - 0 - CTP - - - NYZ022 - 320220 - Steuben - NY - US - 42.29 - -77.36 - 0 - 0 - BGM - - - VAZ064 - 460640 - Caroline - VA - US - 38.01 - -77.36 - 0 - 0 - AKQ - - - NYZ014 - 320140 - Ontario - NY - US - 42.81 - -77.29 - 0 - 0 - BUF - - - PAZ056 - 380560 - Perry - PA - US - 40.41 - -77.29 - 0 - 0 - CTP - - - VAZ053 - 460530 - Fairfax - VA - US - 38.84 - -77.29 - 0 - 0 - LWX - - - VAZ088 - 460880 - Sussex - VA - US - 36.91 - -77.29 - 0 - 0 - AKQ - - - NCZ098 - 330980 - Onslow - NC - US - 34.72 - -77.26 - 0 - 0 - MHX - - - PAZ037 - 380370 - Tioga - PA - US - 41.77 - -77.25 - 0 - 0 - CTP - - - PAZ063 - 380630 - Cumberland - PA - US - 40.14 - -77.24 - 0 - 0 - CTP - - - PAZ064 - 380640 - Adams - PA - US - 39.90 - -77.22 - 0 - 0 - CTP - - - VAZ081 - 460810 - Prince_George - VA - US - 37.16 - -77.22 - 0 - 0 - AKQ - - - MDZ009 - 200090 - Montgomery - MD - US - 39.14 - -77.20 - 0 - 0 - LWX - - - VAZ057 - 460570 - King_George - VA - US - 38.28 - -77.18 - 0 - 0 - LWX - - - VAZ092 - 460920 - Southampton - VA - US - 36.78 - -77.16 - 0 - 0 - AKQ - - - NYZ015 - 320150 - Yates - NY - US - 42.61 - -77.13 - 0 - 0 - BGM - - - VAZ054 - 460540 - Arlington/Falls_Ch/Alexandria - VA - US - 38.86 - -77.12 - 0 - 0 - LWX - - - PAZ041 - 380410 - Northern_Lycoming - PA - US - 41.41 - -77.11 - 0 - 0 - CTP - - - PAZ049 - 380490 - Union - PA - US - 40.98 - -77.10 - 0 - 0 - CTP - - - NCZ029 - 330290 - Martin - NC - US - 35.86 - -77.09 - 0 - 0 - MHX - - - PAZ050 - 380500 - Snyder - PA - US - 40.76 - -77.09 - 0 - 0 - CTP - - - VAZ082 - 460820 - Charles_City - VA - US - 37.36 - -77.08 - 0 - 0 - AKQ - - - VAZ072 - 460720 - King_William - VA - US - 37.71 - -77.06 - 0 - 0 - AKQ - - - MDZ005 - 200050 - Carroll - MD - US - 39.53 - -77.05 - 0 - 0 - LWX - - - NCZ093 - 330930 - Craven - NC - US - 35.13 - -77.05 - 0 - 0 - MHX - - - NYZ004 - 320040 - Wayne - NY - US - 43.18 - -77.04 - 0 - 0 - BUF - - - DCZ001 - 510010 - District_of_Columbia - DC - US - 38.89 - -77.02 - 0 - 0 - LWX - - - NCZ030 - 330300 - Bertie - NC - US - 36.03 - -77.01 - 0 - 0 - AKQ - - - VAZ083 - 460830 - New_Kent - VA - US - 37.50 - -76.99 - 0 - 0 - AKQ - - - MDZ016 - 200160 - Charles - MD - US - 38.48 - -76.98 - 0 - 0 - LWX - - - NCZ013 - 330130 - Hertford - NC - US - 36.39 - -76.96 - 0 - 0 - AKQ - - - MDZ010 - 200100 - Howard - MD - US - 39.23 - -76.94 - 0 - 0 - LWX - - - VAZ074 - 460740 - Essex - VA - US - 37.95 - -76.93 - 0 - 0 - AKQ - - - VAZ073 - 460730 - King_and_Queen - VA - US - 37.70 - -76.92 - 0 - 0 - AKQ - - - VAZ089 - 460890 - Surry - VA - US - 37.10 - -76.91 - 0 - 0 - AKQ - - - MDZ013 - 200130 - Prince_Georges - MD - US - 38.83 - -76.88 - 0 - 0 - LWX - - - PAZ046 - 380460 - Southern_Lycoming - PA - US - 41.22 - -76.88 - 0 - 0 - CTP - - - NYZ023 - 320230 - Schuyler - NY - US - 42.40 - -76.86 - 0 - 0 - BGM - - - NCZ080 - 330800 - Beaufort - NC - US - 35.48 - -76.84 - 0 - 0 - MHX - - - VAZ075 - 460750 - Westmoreland - VA - US - 38.12 - -76.80 - 0 - 0 - AKQ - - - PAZ057 - 380570 - Dauphin - PA - US - 40.40 - -76.79 - 0 - 0 - CTP - - - NYZ016 - 320160 - Seneca - NY - US - 42.79 - -76.78 - 0 - 0 - BGM - - - NYZ024 - 320240 - Chemung - NY - US - 42.15 - -76.75 - 0 - 0 - BGM - - - VAZ090 - 460900 - James_City - VA - US - 37.32 - -76.75 - 0 - 0 - AKQ - - - VAZ076 - 460760 - Richmond - VA - US - 37.95 - -76.73 - 0 - 0 - AKQ - - - NCZ014 - 330140 - Gates - NC - US - 36.42 - -76.71 - 0 - 0 - AKQ - - - NCZ094 - 330940 - Pamlico - NC - US - 35.15 - -76.71 - 0 - 0 - MHX - - - VAZ093 - 460930 - Isle_of_Wight - VA - US - 36.89 - -76.71 - 0 - 0 - AKQ - - - PAZ065 - 380650 - York - PA - US - 39.97 - -76.69 - 0 - 0 - CTP - - - PAZ052 - 380520 - Northumberland - PA - US - 40.89 - -76.67 - 0 - 0 - CTP - - - VAZ096 - 460960 - Suffolk - VA - US - 36.74 - -76.67 - 0 - 0 - AKQ - - - NCZ031 - 330310 - Chowan - NC - US - 36.17 - -76.66 - 0 - 0 - AKQ - - - PAZ051 - 380510 - Montour - PA - US - 41.02 - -76.66 - 0 - 0 - CTP - - - MDZ006 - 200060 - Northern_Baltimore - MD - US - 39.57 - -76.64 - 0 - 0 - LWX - - - VAZ085 - 460850 - Middlesex - VA - US - 37.65 - -76.64 - 0 - 0 - AKQ - - - MDZ011 - 200110 - Southern_Baltimore - MD - US - 39.31 - -76.61 - 0 - 0 - LWX - - - MDZ014 - 200140 - Anne_Arundel - MD - US - 38.97 - -76.61 - 0 - 0 - LWX - - - NCZ045 - 330450 - Washington - NC - US - 35.84 - -76.60 - 0 - 0 - MHX - - - NCZ095 - 330950 - Carteret - NC - US - 34.85 - -76.60 - 0 - 0 - MHX - - - NYZ005 - 320050 - Northern_Cayuga - NY - US - 43.22 - -76.60 - 0 - 0 - BUF - - - MDZ017 - 200170 - St._Marys - MD - US - 38.28 - -76.59 - 0 - 0 - LWX - - - VAZ084 - 460840 - Gloucester - VA - US - 37.43 - -76.55 - 0 - 0 - AKQ - - - MDZ018 - 200180 - Calvert - MD - US - 38.54 - -76.54 - 0 - 0 - LWX - - - PAZ038 - 380380 - Bradford - PA - US - 41.77 - -76.53 - 0 - 0 - BGM - - - PAZ042 - 380420 - Sullivan - PA - US - 41.44 - -76.52 - 0 - 0 - CTP - - - VAZ091 - 460910 - York - VA - US - 37.23 - -76.51 - 0 - 0 - AKQ - - - NYZ017 - 320170 - Southern_Cayuga - NY - US - 42.82 - -76.50 - 0 - 0 - BGM - - - VAZ094 - 460940 - Newport_News/Hampton - VA - US - 37.10 - -76.50 - 0 - 0 - AKQ - - - NYZ025 - 320250 - Tompkins - NY - US - 42.45 - -76.47 - 0 - 0 - BGM - - - VAZ078 - 460780 - Lancaster - VA - US - 37.73 - -76.45 - 0 - 0 - AKQ - - - VAZ077 - 460770 - Northumberland - VA - US - 37.86 - -76.44 - 0 - 0 - AKQ - - - PAZ053 - 380530 - Columbia - PA - US - 41.04 - -76.43 - 0 - 0 - CTP - - - PAZ059 - 380590 - Lebanon - PA - US - 40.38 - -76.42 - 0 - 0 - CTP - - - NCZ032 - 330320 - Perquimans - NC - US - 36.22 - -76.40 - 0 - 0 - AKQ - - - MDZ007 - 200070 - Harford - MD - US - 39.50 - -76.32 - 0 - 0 - LWX - - - NYZ055 - 320550 - Tioga - NY - US - 42.20 - -76.32 - 0 - 0 - BGM - - - PAZ066 - 380660 - Lancaster - PA - US - 40.02 - -76.31 - 0 - 0 - CTP - - - VAZ095 - 460950 - Norfolk/Portsmouth - VA - US - 36.87 - -76.30 - 0 - 0 - AKQ - - - VAZ086 - 460860 - Mathews - VA - US - 37.42 - -76.29 - 0 - 0 - AKQ - - - NCZ015 - 330150 - Pasquotank - NC - US - 36.31 - -76.28 - 0 - 0 - AKQ - - - VAZ097 - 460970 - Chesapeake - VA - US - 36.71 - -76.28 - 0 - 0 - AKQ - - - NCZ081 - 330810 - Western_Hyde - NC - US - 35.51 - -76.26 - 0 - 0 - MHX - - - PAZ058 - 380580 - Schuylkill - PA - US - 40.72 - -76.23 - 0 - 0 - CTP - - - NCZ046 - 330460 - Tyrrell - NC - US - 35.79 - -76.21 - 0 - 0 - MHX - - - NYZ006 - 320060 - Oswego - NY - US - 43.43 - -76.19 - 0 - 0 - BUF - - - NYZ018 - 320180 - Onondaga - NY - US - 43.02 - -76.19 - 0 - 0 - BGM - - - NCZ016 - 330160 - Camden - NC - US - 36.36 - -76.17 - 0 - 0 - AKQ - - - MDZ012 - 200120 - Kent - MD - US - 39.20 - -76.15 - 0 - 0 - PHI - - - MDZ019 - 200190 - Talbot - MD - US - 38.76 - -76.15 - 0 - 0 - PHI - - - NYZ044 - 320440 - Cortland - NY - US - 42.60 - -76.07 - 0 - 0 - BGM - - - MDZ015 - 200150 - Queen_Anne's - MD - US - 39.06 - -76.06 - 0 - 0 - PHI - - - VAZ098 - 460980 - Virginia_Beach - VA - US - 36.74 - -76.05 - 0 - 0 - AKQ - - - MDZ021 - 200210 - Dorchester - MD - US - 38.41 - -76.03 - 0 - 0 - AKQ - - - PAZ043 - 380430 - Wyoming - PA - US - 41.52 - -76.01 - 0 - 0 - BGM - - - PAZ060 - 380600 - Berks - PA - US - 40.41 - -75.99 - 0 - 0 - PHI - - - PAZ047 - 380470 - Luzerne - PA - US - 41.16 - -75.96 - 0 - 0 - BGM - - - NYZ007 - 320070 - Jefferson - NY - US - 44.03 - -75.95 - 0 - 0 - BUF - - - VAZ100 - 461000 - Northampton - VA - US - 37.34 - -75.95 - 0 - 0 - AKQ - - - NCZ017 - 330170 - Western_Currituck - NC - US - 36.31 - -75.94 - 0 - 0 - AKQ - - - MDZ008 - 200080 - Cecil - MD - US - 39.55 - -75.93 - 0 - 0 - PHI - - - NCZ104 - 331040 - Eastern_Hyde - NC - US - 35.13 - -75.92 - 0 - 0 - MHX - - - NCZ047 - 330470 - Western_Dare - NC - US - 35.77 - -75.87 - 0 - 0 - MHX - - - MDZ020 - 200200 - Caroline - MD - US - 38.90 - -75.86 - 0 - 0 - PHI - - - NCZ102 - 331020 - Eastern_Currituck - NC - US - 36.37 - -75.84 - 0 - 0 - AKQ - - - PAZ039 - 380390 - Susquehanna - PA - US - 41.82 - -75.81 - 0 - 0 - BGM - - - MDZ023 - 200230 - Somerset - MD - US - 38.10 - -75.80 - 0 - 0 - AKQ - - - NYZ056 - 320560 - Broome - NY - US - 42.21 - -75.76 - 0 - 0 - BGM - - - PAZ067 - 380670 - Chester - PA - US - 39.99 - -75.76 - 0 - 0 - PHI - - - PAZ054 - 380540 - Carbon - PA - US - 40.94 - -75.74 - 0 - 0 - PHI - - - PAZ044 - 380440 - Lackawanna - PA - US - 41.40 - -75.64 - 0 - 0 - BGM - - - VAZ099 - 460990 - Accomack - VA - US - 37.74 - -75.64 - 0 - 0 - AKQ - - - MDZ022 - 200220 - Wicomico - MD - US - 38.39 - -75.62 - 0 - 0 - AKQ - - - NYZ036 - 320360 - Madison - NY - US - 42.96 - -75.62 - 0 - 0 - BGM - - - PAZ061 - 380610 - Lehigh - PA - US - 40.60 - -75.62 - 0 - 0 - PHI - - - DEZ001 - 80010 - New_Castle - DE - US - 39.57 - -75.60 - 0 - 0 - PHI - - - NYZ045 - 320450 - Chenango - NY - US - 42.47 - -75.59 - 0 - 0 - BGM - - - DEZ002 - 80020 - Kent - DE - US - 39.10 - -75.53 - 0 - 0 - PHI - - - NCZ103 - 331030 - Eastern_Dare - NC - US - 35.48 - -75.48 - 0 - 0 - MHX - - - NYZ008 - 320080 - Lewis - NY - US - 43.82 - -75.48 - 0 - 0 - BUF - - - NYZ009 - 320090 - Northern_Oneida - NY - US - 43.38 - -75.48 - 0 - 0 - BGM - - - PAZ070 - 380700 - Delaware - PA - US - 39.93 - -75.43 - 0 - 0 - PHI - - - DEZ003 - 80030 - Inland_Sussex - DE - US - 38.70 - -75.42 - 0 - 0 - PHI - - - NYZ037 - 320370 - Southern_Oneida - NY - US - 43.08 - -75.41 - 0 - 0 - BGM - - - MDZ024 - 200240 - Inland_Worcester - MD - US - 38.23 - -75.39 - 0 - 0 - AKQ - - - PAZ068 - 380680 - Montgomery - PA - US - 40.21 - -75.36 - 0 - 0 - PHI - - - PAZ062 - 380620 - Northampton - PA - US - 40.75 - -75.34 - 0 - 0 - PHI - - - NJZ016 - 300160 - Salem - NJ - US - 39.58 - -75.32 - 0 - 0 - PHI - - - PAZ055 - 380550 - Monroe - PA - US - 41.03 - -75.31 - 0 - 0 - PHI - - - PAZ072 - 380720 - Southern_Wayne - PA - US - 41.44 - -75.28 - 0 - 0 - BGM - - - PAZ040 - 380400 - Northern_Wayne - PA - US - 41.80 - -75.27 - 0 - 0 - BGM - - - NYZ087 - 320870 - Southwestern_St._Lawrence - NY - US - 44.46 - -75.23 - 0 - 0 - BTV - - - MDZ025 - 200250 - Maryland_Beaches - MD - US - 38.17 - -75.18 - 0 - 0 - AKQ - - - NJZ017 - 300170 - Gloucester - NJ - US - 39.70 - -75.16 - 0 - 0 - PHI - - - NJZ021 - 300210 - Cumberland - NJ - US - 39.37 - -75.14 - 0 - 0 - PHI - - - PAZ071 - 380710 - Philadelphia - PA - US - 39.99 - -75.13 - 0 - 0 - PHI - - - PAZ069 - 380690 - Bucks - PA - US - 40.32 - -75.11 - 0 - 0 - PHI - - - DEZ004 - 80040 - Delaware_Beaches - DE - US - 38.63 - -75.09 - 0 - 0 - PHI - - - PAZ048 - 380480 - Pike - PA - US - 41.34 - -75.03 - 0 - 0 - BGM - - - NYZ046 - 320460 - Otsego - NY - US - 42.61 - -75.02 - 0 - 0 - BGM - - - NJZ007 - 300070 - Warren - NJ - US - 40.83 - -74.99 - 0 - 0 - PHI - - - NYZ026 - 320260 - Northern_St._Lawrence - NY - US - 44.86 - -74.99 - 0 - 0 - BTV - - - NYZ032 - 320320 - Northern_Herkimer - NY - US - 43.71 - -74.97 - 0 - 0 - ALY - - - NJZ009 - 300090 - Hunterdon - NJ - US - 40.56 - -74.96 - 0 - 0 - PHI - - - NJZ018 - 300180 - Camden - NJ - US - 39.79 - -74.95 - 0 - 0 - PHI - - - NYZ038 - 320380 - Southern_Herkimer - NY - US - 43.08 - -74.95 - 0 - 0 - ALY - - - NYZ029 - 320290 - Southeastern_St._Lawrence - NY - US - 44.39 - -74.93 - 0 - 0 - BTV - - - NYZ057 - 320570 - Delaware - NY - US - 42.19 - -74.93 - 0 - 0 - BGM - - - NJZ023 - 300230 - Cape_May - NJ - US - 39.15 - -74.81 - 0 - 0 - PHI - - - NJZ019 - 300190 - Northwestern_Burlington - NJ - US - 39.97 - -74.77 - 0 - 0 - PHI - - - NJZ024 - 300240 - Atlantic_Coastal_Cape_May - NJ - US - 39.11 - -74.76 - 0 - 0 - PHI - - - NYZ062 - 320620 - Sullivan - NY - US - 41.72 - -74.76 - 0 - 0 - BGM - - - NJZ015 - 300150 - Mercer - NJ - US - 40.27 - -74.71 - 0 - 0 - PHI - - - NJZ022 - 300220 - Atlantic - NJ - US - 39.50 - -74.69 - 0 - 0 - PHI - - - NJZ001 - 300010 - Sussex - NJ - US - 41.13 - -74.68 - 0 - 0 - PHI - - - NJZ010 - 300100 - Somerset - NJ - US - 40.56 - -74.60 - 0 - 0 - PHI - - - NJZ027 - 300270 - Southeastern_Burlington - NJ - US - 39.73 - -74.60 - 0 - 0 - PHI - - - NJZ008 - 300080 - Morris - NJ - US - 40.86 - -74.58 - 0 - 0 - PHI - - - NJZ025 - 300250 - Coastal_Atlantic - NJ - US - 39.40 - -74.46 - 0 - 0 - PHI - - - NYZ033 - 320330 - Hamilton - NY - US - 43.66 - -74.46 - 0 - 0 - ALY - - - NYZ039 - 320390 - Southern_Fulton - NY - US - 43.05 - -74.44 - 0 - 0 - ALY - - - NYZ047 - 320470 - Schoharie - NY - US - 42.59 - -74.44 - 0 - 0 - ALY - - - NYZ082 - 320820 - Northern_Fulton - NY - US - 43.17 - -74.44 - 0 - 0 - ALY - - - NJZ012 - 300120 - Middlesex - NJ - US - 40.42 - -74.43 - 0 - 0 - PHI - - - NYZ040 - 320400 - Montgomery - NY - US - 42.91 - -74.43 - 0 - 0 - ALY - - - NYZ063 - 320630 - Western_Ulster - NY - US - 41.88 - -74.43 - 0 - 0 - ALY - - - NYZ027 - 320270 - Northern_Franklin - NY - US - 44.86 - -74.39 - 0 - 0 - BTV - - - NJZ002 - 300020 - Western_Passaic - NJ - US - 41.09 - -74.36 - 0 - 0 - OKX - - - NYZ067 - 320670 - Orange - NY - US - 41.39 - -74.36 - 0 - 0 - OKX - - - NJZ013 - 300130 - Western_Monmouth - NJ - US - 40.26 - -74.32 - 0 - 0 - PHI - - - NJZ020 - 300200 - Ocean - NJ - US - 39.85 - -74.32 - 0 - 0 - PHI - - - NJZ011 - 300110 - Union - NJ - US - 40.66 - -74.31 - 0 - 0 - OKX - - - NYZ058 - 320580 - Western_Greene - NY - US - 42.26 - -74.28 - 0 - 0 - ALY - - - NJZ026 - 300260 - Coastal_Ocean - NJ - US - 39.64 - -74.26 - 0 - 0 - PHI - - - NYZ030 - 320300 - Southern_Franklin - NY - US - 44.54 - -74.26 - 0 - 0 - BTV - - - NJZ005 - 300050 - Essex - NJ - US - 40.79 - -74.25 - 0 - 0 - OKX - - - NJZ004 - 300040 - Eastern_Passaic - NJ - US - 40.91 - -74.20 - 0 - 0 - OKX - - - NYZ048 - 320480 - Western_Schenectady - NY - US - 42.80 - -74.17 - 0 - 0 - ALY - - - NYZ074 - 320740 - Richmond_(Staten_Is.) - NY - US - 40.58 - -74.15 - 0 - 0 - OKX - - - NYZ051 - 320510 - Western_Albany - NY - US - 42.58 - -74.14 - 0 - 0 - ALY - - - NYZ064 - 320640 - Eastern_Ulster - NY - US - 41.88 - -74.09 - 0 - 0 - ALY - - - NJZ003 - 300030 - Bergen - NJ - US - 40.94 - -74.08 - 0 - 0 - OKX - - - NJZ006 - 300060 - Hudson - NJ - US - 40.74 - -74.07 - 0 - 0 - OKX - - - NYZ069 - 320690 - Rockland - NY - US - 41.16 - -74.07 - 0 - 0 - OKX - - - NJZ014 - 300140 - Eastern_Monmouth - NJ - US - 40.28 - -74.03 - 0 - 0 - PHI - - - NYZ049 - 320490 - Eastern_Schenectady - NY - US - 42.85 - -73.96 - 0 - 0 - ALY - - - NYZ072 - 320720 - New_York_(Manhattan) - NY - US - 40.79 - -73.96 - 0 - 0 - OKX - - - NYZ075 - 320750 - Kings_(Brooklyn) - NY - US - 40.66 - -73.94 - 0 - 0 - OKX - - - NYZ059 - 320590 - Eastern_Greene - NY - US - 42.30 - -73.91 - 0 - 0 - ALY - - - NYZ034 - 320340 - Western_Essex - NY - US - 44.10 - -73.90 - 0 - 0 - BTV - - - NYZ050 - 320500 - Southern_Saratoga - NY - US - 42.94 - -73.88 - 0 - 0 - ALY - - - NYZ041 - 320410 - Northern_Saratoga - NY - US - 43.17 - -73.87 - 0 - 0 - ALY - - - NYZ052 - 320520 - Eastern_Albany - NY - US - 42.62 - -73.86 - 0 - 0 - ALY - - - NYZ065 - 320650 - Western_Dutchess - NY - US - 41.76 - -73.85 - 0 - 0 - ALY - - - NYZ073 - 320730 - Bronx - NY - US - 40.86 - -73.85 - 0 - 0 - OKX - - - NYZ042 - 320420 - Northern_Warren - NY - US - 43.58 - -73.84 - 0 - 0 - ALY - - - NYZ076 - 320760 - Queens - NY - US - 40.68 - -73.83 - 0 - 0 - OKX - - - NYZ031 - 320310 - Western_Clinton - NY - US - 44.71 - -73.79 - 0 - 0 - BTV - - - NYZ071 - 320710 - Southern_Westchester - NY - US - 40.99 - -73.78 - 0 - 0 - OKX - - - NYZ068 - 320680 - Putnam - NY - US - 41.43 - -73.76 - 0 - 0 - OKX - - - NYZ060 - 320600 - Western_Columbia - NY - US - 42.24 - -73.75 - 0 - 0 - ALY - - - NYZ083 - 320830 - Southeast_Warren - NY - US - 43.34 - -73.74 - 0 - 0 - ALY - - - NYZ070 - 320700 - Northern_Westchester - NY - US - 41.18 - -73.73 - 0 - 0 - OKX - - - NYZ053 - 320530 - Western_Rensselaer - NY - US - 42.70 - -73.62 - 0 - 0 - ALY - - - NYZ066 - 320660 - Eastern_Dutchess - NY - US - 41.78 - -73.62 - 0 - 0 - ALY - - - NYZ077 - 320770 - Nassau - NY - US - 40.75 - -73.59 - 0 - 0 - OKX - - - NYZ028 - 320280 - Eastern_Clinton - NY - US - 44.74 - -73.57 - 0 - 0 - BTV - - - NYZ061 - 320610 - Eastern_Columbia - NY - US - 42.24 - -73.52 - 0 - 0 - ALY - - - NYZ043 - 320430 - Northern_Washington - NY - US - 43.56 - -73.44 - 0 - 0 - ALY - - - NYZ084 - 320840 - Southern_Washington - NY - US - 43.18 - -73.44 - 0 - 0 - ALY - - - NYZ035 - 320350 - Eastern_Essex - NY - US - 44.17 - -73.43 - 0 - 0 - BTV - - - NYZ054 - 320540 - Eastern_Rensselaer - NY - US - 42.72 - -73.42 - 0 - 0 - ALY - - - CTZ009 - 70090 - Southern_Fairfield - CT - US - 41.13 - -73.41 - 0 - 0 - OKX - - - CTZ005 - 70050 - Northern_Fairfield - CT - US - 41.41 - -73.31 - 0 - 0 - OKX - - - VTZ001 - 450010 - Grand_Isle - VT - US - 44.78 - -73.29 - 0 - 0 - BTV - - - MAZ025 - 210250 - Southern_Berkshire - MA - US - 42.23 - -73.25 - 0 - 0 - ALY - - - CTZ013 - 70130 - Southern_Litchfield - CT - US - 41.64 - -73.24 - 0 - 0 - ALY - - - VTZ009 - 450090 - Western_Addison - VT - US - 44.02 - -73.23 - 0 - 0 - BTV - - - CTZ001 - 70010 - Northern_Litchfield - CT - US - 41.86 - -73.20 - 0 - 0 - ALY - - - NYZ078 - 320780 - Northwest_Suffolk - NY - US - 40.88 - -73.18 - 0 - 0 - OKX - - - VTZ011 - 450110 - Western_Rutland - VT - US - 43.57 - -73.18 - 0 - 0 - BTV - - - MAZ001 - 210010 - Northern_Berkshire - MA - US - 42.56 - -73.16 - 0 - 0 - ALY - - - NYZ080 - 320800 - Southwest_Suffolk - NY - US - 40.73 - -73.15 - 0 - 0 - OKX - - - VTZ005 - 450050 - Western_Chittenden - VT - US - 44.49 - -73.13 - 0 - 0 - BTV - - - VTZ013 - 450130 - Bennington - VT - US - 43.02 - -73.06 - 0 - 0 - ALY - - - CTZ006 - 70060 - Northern_New_Haven - CT - US - 41.47 - -73.03 - 0 - 0 - OKX - - - VTZ002 - 450020 - Western_Franklin - VT - US - 44.82 - -73.03 - 0 - 0 - BTV - - - VTZ017 - 450170 - Eastern_Chittenden - VT - US - 44.40 - -72.94 - 0 - 0 - BTV - - - VTZ018 - 450180 - Eastern_Addison - VT - US - 44.05 - -72.94 - 0 - 0 - BTV - - - MAZ009 - 210090 - Western_Hampden - MA - US - 42.19 - -72.93 - 0 - 0 - BOX - - - MAZ008 - 210080 - Western_Hampshire - MA - US - 42.39 - -72.87 - 0 - 0 - BOX - - - VTZ019 - 450190 - Eastern_Rutland - VT - US - 43.57 - -72.86 - 0 - 0 - BTV - - - CTZ010 - 70100 - Southern_New_Haven - CT - US - 41.30 - -72.82 - 0 - 0 - OKX - - - MAZ002 - 210020 - Western_Franklin - MA - US - 42.59 - -72.80 - 0 - 0 - BOX - - - VTZ014 - 450140 - Western_Windham - VT - US - 43.00 - -72.78 - 0 - 0 - ALY - - - VTZ016 - 450160 - Eastern_Franklin - VT - US - 44.83 - -72.77 - 0 - 0 - BTV - - - CTZ002 - 70020 - Hartford - CT - US - 41.79 - -72.72 - 0 - 0 - BOX - - - VTZ006 - 450060 - Lamoille - VT - US - 44.60 - -72.65 - 0 - 0 - BTV - - - VTZ012 - 450120 - Windsor - VT - US - 43.59 - -72.59 - 0 - 0 - BTV - - - VTZ008 - 450080 - Washington - VT - US - 44.26 - -72.58 - 0 - 0 - BTV - - - VTZ015 - 450150 - Eastern_Windham - VT - US - 42.98 - -72.57 - 0 - 0 - ALY - - - CTZ007 - 70070 - Northern_Middlesex - CT - US - 41.48 - -72.53 - 0 - 0 - OKX - - - MAZ010 - 210100 - Eastern_Hampshire - MA - US - 42.31 - -72.51 - 0 - 0 - BOX - - - MAZ011 - 210110 - Eastern_Hampden - MA - US - 42.14 - -72.50 - 0 - 0 - BOX - - - CTZ011 - 70110 - Southern_Middlesex - CT - US - 41.33 - -72.46 - 0 - 0 - OKX - - - MAZ003 - 210030 - Eastern_Franklin - MA - US - 42.52 - -72.46 - 0 - 0 - BOX - - - NYZ079 - 320790 - Northeast_Suffolk - NY - US - 41.07 - -72.41 - 0 - 0 - OKX - - - VTZ010 - 450100 - Orange - VT - US - 43.99 - -72.41 - 0 - 0 - BTV - - - NYZ081 - 320810 - Southeast_Suffolk - NY - US - 40.90 - -72.37 - 0 - 0 - OKX - - - CTZ003 - 70030 - Tolland - CT - US - 41.81 - -72.31 - 0 - 0 - BOX - - - NHZ011 - 290110 - Cheshire - NH - US - 42.94 - -72.24 - 0 - 0 - BOX - - - VTZ003 - 450030 - Orleans - VT - US - 44.77 - -72.23 - 0 - 0 - BTV - - - NHZ007 - 290070 - Sullivan - NH - US - 43.36 - -72.20 - 0 - 0 - GYX - - - CTZ008 - 70080 - Northern_New_London - CT - US - 41.53 - -72.13 - 0 - 0 - OKX - - - VTZ007 - 450070 - Caledonia - VT - US - 44.46 - -72.13 - 0 - 0 - BTV - - - CTZ004 - 70040 - Windham - CT - US - 41.83 - -72.02 - 0 - 0 - BOX - - - CTZ012 - 70120 - Southern_New_London - CT - US - 41.36 - -71.96 - 0 - 0 - OKX - - - NHZ005 - 290050 - Southern_Grafton - NH - US - 43.71 - -71.93 - 0 - 0 - GYX - - - MAZ004 - 210040 - Northern_Worcester - MA - US - 42.43 - -71.92 - 0 - 0 - BOX - - - MAZ012 - 210120 - Southern_Worcester - MA - US - 42.18 - -71.81 - 0 - 0 - BOX - - - NHZ015 - 290150 - Wrn_And_Central_Hillsborough - NH - US - 42.95 - -71.78 - 0 - 0 - BOX - - - NHZ003 - 290030 - Northern_Grafton - NH - US - 44.13 - -71.76 - 0 - 0 - GYX - - - VTZ004 - 450040 - Essex - VT - US - 44.68 - -71.74 - 0 - 0 - BTV - - - NHZ008 - 290080 - Merrimack - NH - US - 43.31 - -71.67 - 0 - 0 - GYX - - - RIZ003 - 390030 - Western_Kent - RI - US - 41.66 - -71.66 - 0 - 0 - BOX - - - RIZ006 - 390060 - Washington - RI - US - 41.48 - -71.66 - 0 - 0 - BOX - - - MAZ026 - 210260 - Northwest_Middlesex_County - MA - US - 42.61 - -71.59 - 0 - 0 - BOX - - - RIZ001 - 390010 - Northwest_Providence - RI - US - 41.87 - -71.59 - 0 - 0 - BOX - - - RIZ008 - 390080 - Block_Island - RI - US - 41.19 - -71.57 - 0 - 0 - BOX - - - NHZ012 - 290120 - Eastern_Hillsborough - NH - US - 42.88 - -71.50 - 0 - 0 - BOX - - - RIZ004 - 390040 - Eastern_Kent - RI - US - 41.68 - -71.46 - 0 - 0 - BOX - - - NHZ009 - 290090 - Belknap - NH - US - 43.52 - -71.45 - 0 - 0 - GYX - - - RIZ002 - 390020 - Southeast_Providence - RI - US - 41.81 - -71.45 - 0 - 0 - BOX - - - NHZ002 - 290020 - Southern_Coos - NH - US - 44.41 - -71.39 - 0 - 0 - GYX - - - MAZ005 - 210050 - Central_Middlesex_County - MA - US - 42.44 - -71.33 - 0 - 0 - BOX - - - NHZ001 - 290010 - Northern_Coos - NH - US - 45.02 - -71.33 - 0 - 0 - GYX - - - RIZ005 - 390050 - Bristol - RI - US - 41.71 - -71.27 - 0 - 0 - BOX - - - NHZ006 - 290060 - Southern_Carroll - NH - US - 43.71 - -71.26 - 0 - 0 - GYX - - - RIZ007 - 390070 - Newport - RI - US - 41.56 - -71.26 - 0 - 0 - BOX - - - MAZ013 - 210130 - Western_Norfolk - MA - US - 42.15 - -71.24 - 0 - 0 - BOX - - - NHZ004 - 290040 - Northern_Carroll - NH - US - 44.10 - -71.22 - 0 - 0 - GYX - - - MAZ017 - 210170 - Northern_Bristol - MA - US - 41.93 - -71.18 - 0 - 0 - BOX - - - NHZ013 - 290130 - Interior_Rockingham - NH - US - 43.01 - -71.17 - 0 - 0 - GYX - - - MAZ014 - 210140 - Southeast_Middlesex - MA - US - 42.41 - -71.16 - 0 - 0 - BOX - - - MAZ006 - 210060 - Western_Essex - MA - US - 42.72 - -71.08 - 0 - 0 - BOX - - - MAZ015 - 210150 - Suffolk - MA - US - 42.34 - -71.07 - 0 - 0 - BOX - - - MAZ020 - 210200 - Southern_Bristol - MA - US - 41.65 - -71.07 - 0 - 0 - BOX - - - NHZ010 - 290100 - Strafford - NH - US - 43.33 - -71.03 - 0 - 0 - GYX - - - MAZ016 - 210160 - Eastern_Norfolk - MA - US - 42.22 - -71.02 - 0 - 0 - BOX - - - MAZ018 - 210180 - Western_Plymouth - MA - US - 42.00 - -70.88 - 0 - 0 - BOX - - - MAZ007 - 210070 - Eastern_Essex - MA - US - 42.65 - -70.83 - 0 - 0 - BOX - - - NHZ014 - 290140 - Coastal_Rockingham - NH - US - 42.99 - -70.82 - 0 - 0 - GYX - - - MEZ007 - 190070 - Northern_Oxford - ME - US - 44.88 - -70.80 - 0 - 0 - GYX - - - MAZ021 - 210210 - Southern_Plymouth - MA - US - 41.72 - -70.77 - 0 - 0 - BOX - - - MAZ019 - 210190 - Eastern_Plymouth - MA - US - 42.03 - -70.73 - 0 - 0 - BOX - - - MEZ018 - 190180 - Interior_York - ME - US - 43.52 - -70.73 - 0 - 0 - GYX - - - MAZ023 - 210230 - Dukes - MA - US - 41.38 - -70.70 - 0 - 0 - BOX - - - MEZ012 - 190120 - Southern_Oxford - ME - US - 44.20 - -70.63 - 0 - 0 - GYX - - - MEZ023 - 190230 - Coastal_York - ME - US - 43.34 - -70.58 - 0 - 0 - GYX - - - MEZ019 - 190190 - Interior_Cumberland - ME - US - 43.91 - -70.49 - 0 - 0 - GYX - - - MEZ008 - 190080 - Northern_Franklin - ME - US - 45.14 - -70.48 - 0 - 0 - GYX - - - MEZ024 - 190240 - Coastal_Cumberland - ME - US - 43.75 - -70.26 - 0 - 0 - GYX - - - MEZ020 - 190200 - Androscoggin - ME - US - 44.20 - -70.24 - 0 - 0 - GYX - - - MEZ013 - 190130 - Southern_Franklin - ME - US - 44.67 - -70.23 - 0 - 0 - GYX - - - MEZ009 - 190090 - Central_Somerset - ME - US - 45.42 - -70.10 - 0 - 0 - GYX - - - MEZ003 - 190030 - Northern_Somerset - ME - US - 46.27 - -70.01 - 0 - 0 - CAR - - - MAZ024 - 210240 - Nantucket - MA - US - 41.31 - -70.00 - 0 - 0 - BOX - - - MAZ022 - 210220 - Barnstable - MA - US - 41.80 - -69.99 - 0 - 0 - BOX - - - MEZ025 - 190250 - Sagadahoc - ME - US - 43.94 - -69.89 - 0 - 0 - GYX - - - MEZ021 - 190210 - Kennebec - ME - US - 44.42 - -69.75 - 0 - 0 - GYX - - - MEZ014 - 190140 - Southern_Somerset - ME - US - 44.85 - -69.67 - 0 - 0 - GYX - - - MEZ026 - 190260 - Lincoln - ME - US - 44.05 - -69.54 - 0 - 0 - GYX - - - MEZ010 - 190100 - Central_Piscataquis - ME - US - 45.55 - -69.38 - 0 - 0 - CAR - - - MEZ004 - 190040 - Northern_Piscataquis - ME - US - 46.12 - -69.27 - 0 - 0 - CAR - - - MEZ027 - 190270 - Knox - ME - US - 44.14 - -69.23 - 0 - 0 - GYX - - - MEZ031 - 190310 - Southern_Piscataquis - ME - US - 45.27 - -69.22 - 0 - 0 - CAR - - - MEZ022 - 190220 - Interior_Waldo - ME - US - 44.53 - -69.16 - 0 - 0 - GYX - - - MEZ001 - 190010 - Northwest_Aroostook - ME - US - 47.01 - -69.06 - 0 - 0 - CAR - - - MEZ028 - 190280 - Coastal_Waldo - ME - US - 44.36 - -69.04 - 0 - 0 - GYX - - - MEZ015 - 190150 - Southern_Penobscot - ME - US - 44.93 - -68.81 - 0 - 0 - CAR - - - MEZ005 - 190050 - Northern_Penobscot - ME - US - 45.95 - -68.69 - 0 - 0 - CAR - - - MEZ011 - 190110 - Central_Penobscot - ME - US - 45.39 - -68.41 - 0 - 0 - CAR - - - MEZ016 - 190160 - Interior_Hancock - ME - US - 44.88 - -68.41 - 0 - 0 - CAR - - - MEZ029 - 190290 - Coastal_Hancock - ME - US - 44.45 - -68.39 - 0 - 0 - CAR - - - MEZ002 - 190020 - Northeast_Aroostook - ME - US - 46.83 - -68.30 - 0 - 0 - CAR - - - MEZ006 - 190060 - Southeast_Aroostook - ME - US - 45.97 - -68.09 - 0 - 0 - CAR - - - MEZ032 - 190320 - Northern_Washington - ME - US - 45.48 - -67.73 - 0 - 0 - CAR - - - MEZ017 - 190170 - Central_Washington - ME - US - 45.00 - -67.57 - 0 - 0 - CAR - - - MEZ030 - 190300 - Coastal_Washington - ME - US - 44.67 - -67.49 - 0 - 0 - CAR - - - PRZ010 - 530100 - Mayaguez_and_Vicinity - PR - US - 18.26 - -67.12 - 0 - 0 - SJU - - - PRZ011 - 530110 - Southwest - PR - US - 18.05 - -67.04 - 0 - 0 - SJU - - - PRZ008 - 530080 - Northwest - PR - US - 18.42 - -66.97 - 0 - 0 - SJU - - - PRZ009 - 530090 - Western_Interior - PR - US - 18.21 - -66.82 - 0 - 0 - SJU - - - PRZ007 - 530070 - Ponce_and_Vicinity - PR - US - 18.03 - -66.63 - 0 - 0 - SJU - - - PRZ005 - 530050 - North_Central - PR - US - 18.40 - -66.48 - 0 - 0 - SJU - - - PRZ006 - 530060 - Central_Interior - PR - US - 18.20 - -66.43 - 0 - 0 - SJU - - - PRZ001 - 530010 - San_Juan_and_Vicinity - PR - US - 18.37 - -66.11 - 0 - 0 - SJU - - - PRZ003 - 530030 - Southeast - PR - US - 18.02 - -66.07 - 0 - 0 - SJU - - - PRZ004 - 530040 - Eastern_Interior - PR - US - 18.17 - -66.04 - 0 - 0 - SJU - - - PRZ002 - 530020 - Northeast - PR - US - 18.26 - -65.76 - 0 - 0 - SJU - - - PRZ013 - 530130 - Vieques - PR - US - 18.13 - -65.42 - 0 - 0 - SJU - - - PRZ012 - 530120 - Culebra - PR - US - 18.32 - -65.31 - 0 - 0 - SJU - - - VIZ001 - 520010 - St._Thomas...St._John..._and_Adj - VI - US - 18.34 - -64.87 - 0 - 0 - SJU - - - VIZ002 - 520020 - St_Croix - VI - US - 17.73 - -64.73 - 0 - 0 - SJU - - - CAZ000 - 50000 - No_name - CA - US - 32.92 - -118.48 - 0 - 0 - - - - GUZ012 - 540120 - Sonsorol - GU - US - 5.30 - 132.22 - 0 - 0 - GUM - - - GUZ011 - 540110 - Koror - GU - US - 7.53 - 134.56 - 0 - 0 - GUM - - - GUZ013 - 540130 - Kayangel - GU - US - 8.08 - 134.72 - 0 - 0 - GUM - - - GUZ022 - 540220 - Ngulu - GU - US - 8.30 - 137.51 - 0 - 0 - GUM - - - GUZ021 - 540210 - Yap - GU - US - 9.54 - 138.12 - 0 - 0 - GUM - - - GUZ023 - 540230 - Ulithi - GU - US - 10.02 - 139.79 - 0 - 0 - GUM - - - GUZ024 - 540240 - Sorol - GU - US - 8.21 - 140.70 - 0 - 0 - GUM - - - GUZ025 - 540250 - Woleai - GU - US - 7.38 - 143.92 - 0 - 0 - GUM - - - GUZ001 - 540010 - Guam - GU - US - 13.44 - 144.79 - 0 - 0 - GUM - - - GUZ002 - 540020 - Rota - GU - US - 14.15 - 145.20 - 0 - 0 - GUM - - - GUZ003 - 540030 - Tinian - GU - US - 15.01 - 145.63 - 0 - 0 - GUM - - - GUZ005 - 540050 - Agrihan - GU - US - 18.76 - 145.66 - 0 - 0 - GUM - - - GUZ004 - 540040 - Saipan - GU - US - 15.19 - 145.76 - 0 - 0 - GUM - - - GUZ026 - 540260 - Satawal - GU - US - 7.36 - 147.04 - 0 - 0 - GUM - - - GUZ032 - 540320 - Puluwat - GU - US - 7.38 - 149.18 - 0 - 0 - GUM - - - GUZ031 - 540310 - Chuuk - GU - US - 7.35 - 151.83 - 0 - 0 - GUM - - - GUZ033 - 540330 - Lukunor - GU - US - 5.50 - 153.82 - 0 - 0 - GUM - - - GUZ041 - 540410 - Pohnpei - GU - US - 6.88 - 158.22 - 0 - 0 - GUM - - - GUZ042 - 540420 - Mokil - GU - US - 6.68 - 159.79 - 0 - 0 - GUM - - - GUZ043 - 540430 - Pingelap - GU - US - 6.21 - 160.71 - 0 - 0 - GUM - - - GUZ062 - 540620 - Ujelang - GU - US - 9.76 - 160.97 - 0 - 0 - GUM - - - GUZ063 - 540630 - Enewetak - GU - US - 11.34 - 162.33 - 0 - 0 - GUM - - - GUZ051 - 540510 - Kosrae - GU - US - 5.32 - 162.97 - 0 - 0 - GUM - - - GUZ081 - 540810 - Wake_Island - GU - US - 19.30 - 166.63 - 0 - 0 - GUM - - - GUZ064 - 540640 - Ailinglaplap - GU - US - 7.29 - 168.75 - 0 - 0 - GUM - - - GUZ065 - 540650 - Jaluit - GU - US - 5.85 - 169.53 - 0 - 0 - GUM - - - GUZ066 - 540660 - Utirik - GU - US - 11.24 - 169.86 - 0 - 0 - GUM - - - GUZ067 - 540670 - Wotje - GU - US - 9.55 - 170.24 - 0 - 0 - GUM - - - GUZ061 - 540610 - Majuro - GU - US - 7.11 - 171.08 - 0 - 0 - GUM - - - GUZ068 - 540680 - Mili - GU - US - 6.04 - 171.95 - 0 - 0 - GUM - - - AKZ191 - 21910 - Western_Aleutians - AK - US - 51.51 - 179.05 - 0 - 0 - AFC - - - PKZ175 - 691750 - Adak_to_Kiska - - US - 51.71 - -178.59 - 0 - 0 - AFC - - - PKZ185 - 691850 - St_Matthew_Island_Waters - - US - 60.43 - -174.18 - 0 - 0 - AFC - - - PKZ172 - 691720 - Nikolski_to_Adak - - US - 52.26 - -173.19 - 0 - 0 - AFC - - - PSZ152 - 721520 - Coastal_waters_of_Swain's_I - - US - -11.08 - -171.03 - 0 - 0 - STU - - - PSZ150 - 721500 - Cstal_wtrs_of_Tututila_and_Aunuu - - US - -14.31 - -170.77 - 0 - 0 - STU - - - PKZ179 - 691790 - Pribilof_Is_Nearshore_Waters - - US - 56.90 - -169.97 - 0 - 0 - AFC - - - PKZ210 - 692100 - Dall_Point_to_Wales - - US - 63.31 - -169.57 - 0 - 0 - AFG - - - PSZ151 - 721510 - Coastal_waters_of_Manua - - US - -14.21 - -169.45 - 0 - 0 - STU - - - PKZ225 - 692250 - Cape_Thompson_to_Cape_Beaufort - - US - 69.01 - -167.45 - 0 - 0 - AFG - - - PKZ170 - 691700 - Cape_Sarichef_to_Nikoski - - US - 53.72 - -166.78 - 0 - 0 - AFC - - - PKZ220 - 692200 - Wales_to_Cape_Thompson - - US - 66.97 - -166.69 - 0 - 0 - AFG - - - PKZ171 - 691710 - Unalaska_Bay - - US - 53.92 - -166.59 - 0 - 0 - AFC - - - PKZ180 - 691800 - Cape_Newenham_to_Dall_Point - - US - 59.92 - -165.98 - 0 - 0 - AFC - - - PKZ200 - 692000 - Norton_Sound - - US - 63.99 - -163.30 - 0 - 0 - AFG - - - PKZ230 - 692300 - Cape_Beaufort_to_Point_Franklin - - US - 70.53 - -163.03 - 0 - 0 - AFG - - - PKZ165 - 691650 - Port_Heiden_to_Cape_Sarichef - - US - 56.01 - -162.88 - 0 - 0 - AFC - - - PKZ215 - 692150 - Kotzebue_Sound - - US - 66.65 - -162.83 - 0 - 0 - AFG - - - PKZ155 - 691550 - Castle_Cape_to_Cape_Sarichef - - US - 54.50 - -160.72 - 0 - 0 - AFC - - - PKZ160 - 691600 - Cape_Newenham_to_Port_Heiden - - US - 57.98 - -160.52 - 0 - 0 - AFC - - - PHZ110 - 701100 - Kauai_Northwest_Waters - - US - 22.44 - -159.99 - 0 - 0 - HFO - - - PHZ112 - 701120 - Kauai_Leeward_Waters - - US - 21.64 - -159.99 - 0 - 0 - HFO - - - PHZ111 - 701110 - Kauai_Windward_Waters - - US - 22.41 - -159.03 - 0 - 0 - HFO - - - PHZ113 - 701130 - Kauai_Channel - - US - 21.62 - -159.00 - 0 - 0 - HFO - - - PHZ115 - 701150 - Oahu_Leeward_Waters - - US - 21.04 - -158.18 - 0 - 0 - HFO - - - PHZ114 - 701140 - Oahu_Windward_Waters - - US - 21.88 - -157.59 - 0 - 0 - HFO - - - PHZ116 - 701160 - Kaiwi_Channel - - US - 21.22 - -157.49 - 0 - 0 - HFO - - - PHZ118 - 701180 - Maui_County_Leeward_Waters - - US - 20.70 - -157.49 - 0 - 0 - HFO - - - PHZ120 - 701200 - Pailolo_Channel - - US - 21.03 - -156.91 - 0 - 0 - HFO - - - PHZ119 - 701190 - Maalaea_Bay - - US - 20.75 - -156.53 - 0 - 0 - HFO - - - PHZ121 - 701210 - Alenuihaha_Channel - - US - 20.30 - -156.44 - 0 - 0 - HFO - - - PHZ123 - 701230 - Big_Island_Leeward_Waters - - US - 19.34 - -156.40 - 0 - 0 - HFO - - - PHZ117 - 701170 - Maui_County_Windward_Waters - - US - 21.32 - -156.39 - 0 - 0 - HFO - - - PKZ235 - 692350 - Point_Franklin_to_Cape_Halkett - - US - 71.66 - -156.01 - 0 - 0 - AFG - - - PKZ150 - 691500 - Sitkinak_to_Castle_Cape - - US - 55.91 - -155.76 - 0 - 0 - AFC - - - PHZ124 - 701240 - Big_Island_Southeast_Waters - - US - 18.71 - -155.37 - 0 - 0 - HFO - - - PHZ122 - 701220 - Big_Island_Windward_Waters - - US - 19.92 - -154.97 - 0 - 0 - HFO - - - PKZ138 - 691380 - _Shelikof_Strait - - US - 57.83 - -153.52 - 0 - 0 - AFC - - - PKZ137 - 691370 - _Marmot_Bay - - US - 58.00 - -152.62 - 0 - 0 - AFC - - - PKZ136 - 691360 - _Chiniak_Bay - - US - 57.70 - -152.37 - 0 - 0 - AFC - - - PKZ132 - 691320 - Shuyak_Island_To_Sitkinak - - US - 56.92 - -152.20 - 0 - 0 - AFC - - - PKZ140 - 691400 - Cook_Inlt_N_of_Kamishak_Bay_and_ - - US - 60.34 - -151.89 - 0 - 0 - AFC - - - PKZ141 - 691410 - Kachemak_Bay - - US - 59.56 - -151.45 - 0 - 0 - AFC - - - PKZ130 - 691300 - Barren_Is_And_Kamishak_Bay_Wtrs - - US - 58.64 - -151.33 - 0 - 0 - AFC - - - PKZ121 - 691210 - _Resurrection_Bay - - US - 60.06 - -149.39 - 0 - 0 - AFC - - - PKZ240 - 692400 - Cape_Halkett_to_Flaxman_Island - - US - 71.09 - -149.19 - 0 - 0 - AFG - - - PKZ129 - 691290 - Passage_Canal - - US - 60.81 - -148.58 - 0 - 0 - AFC - - - PKZ125 - 691250 - Prince_William_Sound - - US - 60.48 - -147.34 - 0 - 0 - AFC - - - PKZ120 - 691200 - Cape_Suckling_to_Gore_Point - - US - 59.42 - -147.01 - 0 - 0 - AFC - - - PKZ128 - 691280 - _Valdez_Arm - - US - 60.94 - -146.86 - 0 - 0 - AFC - - - PKZ127 - 691270 - _Valdez_Narrows - - US - 61.05 - -146.67 - 0 - 0 - AFC - - - PKZ126 - 691260 - _Port_of_Valdez - - US - 61.11 - -146.44 - 0 - 0 - AFC - - - PKZ245 - 692450 - Flaxman_I_to_Demarcation_Point - - US - 70.60 - -143.39 - 0 - 0 - AFG - - - PKZ052 - 690520 - Icy_Cape_to_Cape_Suckling - - US - 59.40 - -142.97 - 0 - 0 - AJK - - - PKZ051 - 690510 - Cape_Fairweather_to_Icy_Cape - - US - 58.95 - -140.30 - 0 - 0 - AJK - - - PKZ053 - 690530 - Yakutat_Bay - - US - 59.80 - -139.76 - 0 - 0 - AJK - - - PKZ043 - 690430 - SE_AK_Outside_Wtrs_From_C_Edgecu - - US - 57.59 - -137.69 - 0 - 0 - AJK - - - PKZ022 - 690220 - Cross_Sound - - US - 58.14 - -136.36 - 0 - 0 - AJK - - - PKZ011 - 690110 - _Glacier_Bay - - US - 58.72 - -136.23 - 0 - 0 - AJK - - - PKZ042 - 690420 - Cape_Decision_to_Cape_Edgecumbe - - US - 56.23 - -136.12 - 0 - 0 - AJK - - - PKZ021 - 690210 - Icy_Strait - - US - 58.27 - -135.73 - 0 - 0 - AJK - - - PKZ012 - 690120 - Northern_Lynn_Canal - - US - 59.10 - -135.30 - 0 - 0 - AJK - - - PKZ013 - 690130 - Southern_Lynn_Canal - - US - 58.59 - -135.07 - 0 - 0 - AJK - - - PKZ032 - 690320 - Northern_Chatham_Strait - - US - 57.61 - -134.77 - 0 - 0 - AJK - - - PKZ033 - 690330 - Southern_Chatham_Strait - - US - 56.54 - -134.55 - 0 - 0 - AJK - - - PKZ041 - 690410 - Dixon_Entrance_to_Cape_Decision - - US - 55.04 - -134.31 - 0 - 0 - AJK - - - PKZ031 - 690310 - Stephens_Passage - - US - 57.94 - -134.29 - 0 - 0 - AJK - - - PKZ034 - 690340 - Frederick_Sound - - US - 56.99 - -134.28 - 0 - 0 - AJK - - - PKZ035 - 690350 - Sumner_Strait - - US - 56.40 - -133.28 - 0 - 0 - AJK - - - PKZ036 - 690360 - Clarence_Strait - - US - 55.40 - -131.52 - 0 - 0 - AJK - - - PZZ170 - 611700 - Cstal_Wtrs_From_C_Flattery_To_Ja - - US - 48.22 - -125.73 - 0 - 0 - SEW - - - PZZ173 - 611730 - Wtrs_From_James_I_To_Pt_Grenvl_2 - - US - 47.57 - -125.40 - 0 - 0 - SEW - - - PZZ376 - 613760 - Wtrs_fr_C_Blanco_OR_to_Pt._St._G - - US - 42.33 - -125.39 - 0 - 0 - MFR - - - PZZ370 - 613700 - Wtrs_fr_Florence_to_C_Blanco_OR_ - - US - 43.40 - -125.19 - 0 - 0 - MFR - - - PZZ275 - 612750 - Wtrs_fr_Cascade_Hd_to_Florence_O - - US - 44.59 - -125.15 - 0 - 0 - PQR - - - PZZ470 - 614700 - Wtrs_fr_Pt._St._Geo_to_C_Mendoci - - US - 41.14 - -125.08 - 0 - 0 - EKA - - - PZZ176 - 611760 - Cstal_Wtrs_From_Pt_Grenvl_To_C_S - - US - 46.97 - -125.06 - 0 - 0 - SEW - - - PZZ153 - 611530 - Cstal_Wtrs_From_James_I_To_Pt_Gr - - US - 47.74 - -124.99 - 0 - 0 - SEW - - - PZZ270 - 612700 - Wtrs_fr_C_Shoalwtr_WA_to_Cascade - - US - 45.92 - -124.99 - 0 - 0 - PQR - - - PZZ150 - 611500 - Cstal_Wtrs_From_C_Flattery_To_Ja - - US - 48.17 - -124.89 - 0 - 0 - SEW - - - PZZ475 - 614750 - Wtrs_fr_C_Mendocino_to_Pt._Arena - - US - 39.69 - -124.74 - 0 - 0 - EKA - - - PZZ350 - 613500 - Cstal_wtrs_fr_Florence_to_C_Blan - - US - 43.47 - -124.68 - 0 - 0 - MFR - - - PZZ330 - 613300 - Chetco_River_Bar - - US - 42.31 - -124.60 - 0 - 0 - MFR - - - PZZ130 - 611300 - W_Entr_U.S._Wtrs_St_Of_Juan_De_F - - US - 48.37 - -124.48 - 0 - 0 - SEW - - - PZZ310 - 613100 - Coos_Bay_Bar - - US - 43.43 - -124.47 - 0 - 0 - MFR - - - PZZ156 - 611560 - Cstal_Wtrs_From_Pt_Grenvl_To_C_S - - US - 47.02 - -124.44 - 0 - 0 - SEW - - - PZZ356 - 613560 - Cstal_wtrs_fr_C_Blanco_OR_to_Pt. - - US - 42.24 - -124.43 - 0 - 0 - MFR - - - PZZ450 - 614500 - Cstal_wtrs_fr_Pt._St._Geo_to_C_M - - US - 41.11 - -124.33 - 0 - 0 - EKA - - - PZZ250 - 612500 - Cstal_wtrs_fr_C_Shoalwtr_WA_to_C - - US - 45.93 - -124.20 - 0 - 0 - PQR - - - PZZ410 - 614100 - Humboldt_Bay_Bar - - US - 40.77 - -124.19 - 0 - 0 - EKA - - - PZZ255 - 612550 - Cstal_wtrs_fr_Cascade_Hd_to_Flor - - US - 44.47 - -124.10 - 0 - 0 - PQR - - - PZZ110 - 611100 - Grays_Harbor_Bar - - US - 46.93 - -123.99 - 0 - 0 - SEW - - - PZZ570 - 615700 - Wtrs_fr_Pt._Arena_to_Pigeon_Pt._ - - US - 38.08 - -123.99 - 0 - 0 - MTR - - - PZZ455 - 614550 - Cstal_wtrs_fr_C_Mendocino_to_Pt. - - US - 39.69 - -123.91 - 0 - 0 - EKA - - - PZZ131 - 611310 - Ctrl_U.S._Wtrs_St_Of_Juan_De_Fuc - - US - 48.27 - -123.68 - 0 - 0 - SEW - - - PZZ210 - 612100 - Columbia_River_Bar - - US - 46.21 - -123.68 - 0 - 0 - PQR - - - PZZ540 - 615400 - Cstal_Wtrs_fr_Pt_Arena_to_Pt_Rey - - US - 38.48 - -123.53 - 0 - 0 - MTR - - - PZZ132 - 611320 - E_Entr_U.S._Wtrs_St_Of_Juan_De_F - - US - 48.21 - -122.96 - 0 - 0 - SEW - - - PZZ133 - 611330 - Nrn_Inlnd_Wtrs_Incl_The_Sn_Juan_ - - US - 48.58 - -122.78 - 0 - 0 - SEW - - - PZZ575 - 615750 - Wtrs_fr_Pigeon_Pt._to_Pt._Piedra - - US - 36.41 - -122.76 - 0 - 0 - MTR - - - PZZ545 - 615450 - Cstal_Wtrs_fr_Pt_Reyes_to_Pigeon - - US - 37.58 - -122.72 - 0 - 0 - MTR - - - PZZ134 - 611340 - Admiralty_Inlet - - US - 48.06 - -122.68 - 0 - 0 - SEW - - - PZZ560 - 615600 - Cstal_Wtrs_fr_Pigeon_Pt_to_Pt_Pi - - US - 36.99 - -122.59 - 0 - 0 - MTR - - - PZZ135 - 611350 - Puget_Sound_and_Hood_Canal - - US - 47.56 - -122.47 - 0 - 0 - SEW - - - PZZ530 - 615300 - Sn_Francisco/Sn_Pablo/Suisun_Bay - - US - 37.83 - -122.39 - 0 - 0 - MTR - - - PZZ535 - 615350 - Monterey_Bay - - US - 36.79 - -121.89 - 0 - 0 - MTR - - - PZZ565 - 615650 - Cstal_Wtrs_fr_Pt_Pinos_to_Pt_Pie - - US - 36.11 - -121.84 - 0 - 0 - MTR - - - PZZ670 - 616700 - The_Wtrs_fr_Pt._Piedras_Blancas_ - - US - 35.14 - -121.55 - 0 - 0 - LOX - - - PZZ673 - 616730 - Wtrs_fr_Pt._Arguello_to_Sta_Cruz - - US - 34.18 - -120.98 - 0 - 0 - LOX - - - PZZ650 - 616500 - E_Sta_Barbara_Chnl_fr_Pt._Concep - - US - 34.28 - -119.87 - 0 - 0 - LOX - - - PZZ676 - 616760 - Out_wtrs_fr_Sta_Cruz_I_to_Sn_Cle - - US - 33.54 - -119.79 - 0 - 0 - LOX - - - PZZ655 - 616550 - Inr_wtrs_fr_Pt_Mugu_to_Sn_Mateo_ - - US - 33.59 - -118.55 - 0 - 0 - LOX - - - PZZ775 - 617750 - Wtrs_fr_Sn_Mateo_point_to_the_Me - - US - 32.83 - -118.20 - 0 - 0 - SGX - - - PZZ750 - 617500 - Cstal_Wtrs_fr_Sn_Mateo_Pt_to_the - - US - 32.92 - -117.55 - 0 - 0 - SGX - - - GMZ135 - 681350 - Laguna_Madre_From_5_nm_N_Of_Port - - US - 26.93 - -97.44 - 0 - 0 - BRO - - - GMZ132 - 681320 - Laguna_Madre_From_The_Arroyo_Col - - US - 26.49 - -97.37 - 0 - 0 - BRO - - - GMZ230 - 682300 - Bays_and_Wtrways_fr_Baffin_Bay_t - - US - 27.54 - -97.31 - 0 - 0 - CRP - - - GMZ130 - 681300 - Laguna_Madre_From_the_Port_Of_Br - - US - 26.19 - -97.30 - 0 - 0 - BRO - - - GMZ155 - 681550 - Cstal_wtrs_fr_Baffin_Bay_to_Port - - US - 26.92 - -97.23 - 0 - 0 - BRO - - - GMZ250 - 682500 - Cstal_wtrs_fr_Baffin_Bay_to_Port - - US - 27.52 - -97.10 - 0 - 0 - CRP - - - GMZ150 - 681500 - Cstal_wtrs_fr_Port_Mansfield_TX_ - - US - 26.28 - -97.04 - 0 - 0 - BRO - - - GMZ235 - 682350 - Bays_and_Wtrways_fr_Port_Aransas - - US - 28.16 - -96.82 - 0 - 0 - CRP - - - GMZ175 - 681750 - Wtrs_fr_Baffin_Bay_to_Port_Mansf - - US - 26.87 - -96.68 - 0 - 0 - BRO - - - GMZ255 - 682550 - Cstal_wtrs_fr_Port_Aransas_to_Ma - - US - 28.06 - -96.66 - 0 - 0 - CRP - - - GMZ270 - 682700 - Wtrs_fr_Baffin_Bay_to_Port_Arans - - US - 27.35 - -96.51 - 0 - 0 - CRP - - - GMZ170 - 681700 - Wtrs_fr_Port_Mansfield_TX_to_the - - US - 26.26 - -96.50 - 0 - 0 - BRO - - - GMZ330 - 683300 - Matagorda_Bay - - US - 28.60 - -96.32 - 0 - 0 - HGX - - - GMZ275 - 682750 - Wtrs_fr_Port_Aransas_to_Matagord - - US - 27.74 - -96.12 - 0 - 0 - CRP - - - GMZ350 - 683500 - Cstal_wtrs_fr_Freeport_to_Matago - - US - 28.52 - -95.70 - 0 - 0 - HGX - - - GMZ370 - 683700 - Wtrs_fr_Freeport_to_Matagorda_Sh - - US - 28.13 - -95.38 - 0 - 0 - HGX - - - GMZ335 - 683350 - Galveston_Bay - - US - 29.41 - -94.87 - 0 - 0 - HGX - - - GMZ355 - 683550 - Cstal_wtrs_fr_Hi_I_to_Freeport_T - - US - 29.10 - -94.78 - 0 - 0 - HGX - - - GMZ375 - 683750 - Wtrs_fr_Hi_I_to_Freeport_TX_fr_2 - - US - 28.66 - -94.60 - 0 - 0 - HGX - - - GMZ450 - 684500 - Cstal_wtrs_fr_Cameron_LA_to_Hi_I - - US - 29.58 - -93.95 - 0 - 0 - LCH - - - GMZ430 - 684300 - Sabine_Lake - - US - 29.62 - -93.85 - 0 - 0 - LCH - - - GMZ470 - 684700 - Wtrs_fr_Cameron_LA_to_Hi_I_TX_fr - - US - 29.07 - -93.82 - 0 - 0 - LCH - - - GMZ432 - 684320 - Calcasieu_Lake - - US - 29.92 - -93.31 - 0 - 0 - LCH - - - GMZ452 - 684520 - Cstal_wtrs_fr_Intracoastal_Cty_t - - US - 29.48 - -92.72 - 0 - 0 - LCH - - - GMZ472 - 684720 - Wtrs_fr__Intracoastal_Cty_to_Cam - - US - 28.95 - -92.68 - 0 - 0 - LCH - - - LSZ145 - 651450 - Duluth_MN_to_Port_Wing_WI - - US - 46.76 - -91.84 - 0 - 0 - DLH - - - LSZ144 - 651440 - Two_Harbors_to_Duluth_MN - - US - 46.89 - -91.82 - 0 - 0 - DLH - - - GMZ475 - 684750 - Wtrs_fr_Lwr_Atchafalaya_Riv_to_I - - US - 28.70 - -91.72 - 0 - 0 - LCH - - - GMZ435 - 684350 - Vermillion_Bay - - US - 29.38 - -91.70 - 0 - 0 - LCH - - - GMZ455 - 684550 - Cstal_wtrs_fr_Lwr_Atchafalaya_Ri - - US - 29.32 - -91.69 - 0 - 0 - LCH - - - LSZ143 - 651430 - Silver_Bay_Hbr_to_2_Hbrs_MN - - US - 47.13 - -91.40 - 0 - 0 - DLH - - - LSZ146 - 651460 - Port_Wing_to_Sand_Island_WI - - US - 46.91 - -91.19 - 0 - 0 - DLH - - - LSZ142 - 651420 - Taconite_Hbr_to_Silver_Bay_Hbr_M - - US - 47.38 - -91.05 - 0 - 0 - DLH - - - LSZ121 - 651210 - Chequamegon_Bay-Bayfield_to_Oak_ - - US - 46.69 - -90.81 - 0 - 0 - DLH - - - LSZ147 - 651470 - Sand_Island_to_Bayfield_WI - - US - 46.91 - -90.71 - 0 - 0 - DLH - - - LSZ148 - 651480 - Oak_Point_to_Saxon_Harbor_WI - - US - 46.67 - -90.59 - 0 - 0 - DLH - - - LSZ141 - 651410 - Grand_Marais_to_Taconite_Hbr_MN - - US - 47.58 - -90.57 - 0 - 0 - DLH - - - LSZ162 - 651620 - L_Sup_W_of_a_line_fr_Saxon_Hbr_W - - US - 47.28 - -90.56 - 0 - 0 - DLH - - - LSZ240 - 652400 - Saxon_Harbor_WI_to_Black_Riv_MI - - US - 46.66 - -90.24 - 0 - 0 - MQT - - - GMZ550 - 685500 - Cstal_wtrs_fr_the_SW_pass_of_the - - US - 29.00 - -90.19 - 0 - 0 - LIX - - - GMZ570 - 685700 - Wtrs_fr_the_SW_Pass_of_the_MS_Ri - - US - 28.39 - -90.18 - 0 - 0 - LIX - - - GMZ530 - 685300 - L_Pontchartrain_and_L_Maurepas - - US - 30.17 - -90.10 - 0 - 0 - LIX - - - LSZ241 - 652410 - Black_River_To_Ontonagon_MI - - US - 46.81 - -89.91 - 0 - 0 - MQT - - - LSZ140 - 651400 - Gnd_Portage_to_Gnd_Marais_MN - - US - 47.84 - -89.85 - 0 - 0 - DLH - - - LSZ263 - 652630 - L_Sup_fr_Saxon_Hbr_WI_to_Upr_Ent - - US - 47.45 - -89.29 - 0 - 0 - MQT - - - GMZ555 - 685550 - Cstal_wtrs_fr_Pascagoula_MS_to_t - - US - 29.72 - -89.09 - 0 - 0 - LIX - - - LSZ242 - 652420 - Ontonagon_to_Upr_Entr_of_Portage - - US - 47.10 - -88.96 - 0 - 0 - MQT - - - GMZ575 - 685750 - Wtrs_fr_Pascagoula_MS_to_the_SW_ - - US - 28.86 - -88.56 - 0 - 0 - LIX - - - LSZ243 - 652430 - Upr_Entr_of_Portage_Canal_to_Eag - - US - 47.37 - -88.47 - 0 - 0 - MQT - - - LSZ247 - 652470 - Portage_L_to_Huron_I_MI_to_Lwr_E - - US - 46.90 - -88.37 - 0 - 0 - MQT - - - LSZ246 - 652460 - Pt_Isabelle_to_Lwr_Entr_of_Porta - - US - 47.15 - -88.22 - 0 - 0 - MQT - - - LSZ264 - 652640 - L_Sup_fr_Upr_Entr_to_Portage_Can - - US - 47.83 - -88.08 - 0 - 0 - MQT - - - GMZ650 - 686500 - Cstal_wtrs_fr_Pensacola_FL_to_Pa - - US - 30.19 - -88.01 - 0 - 0 - MOB - - - LSZ244 - 652440 - Eagle_River_to_Manitou_I_MI - - US - 47.49 - -87.95 - 0 - 0 - MQT - - - GMZ630 - 686300 - Mobile_Bay - - US - 30.53 - -87.93 - 0 - 0 - MOB - - - LMZ644 - 646440 - Port_Washington_to_N_Pt_Lt_WI - - US - 43.24 - -87.87 - 0 - 0 - MKX - - - LMZ522 - 645220 - Grn_Bay_S_of_line_fr__Oconto_WI_ - - US - 44.71 - -87.79 - 0 - 0 - GRB - - - LMZ645 - 646450 - N_Point_Light_to_Wind_Point_WI - - US - 42.93 - -87.77 - 0 - 0 - MKX - - - LMZ740 - 647400 - Winthrop_Hbr_to_Wilmette_Hbr_IL - - US - 42.28 - -87.77 - 0 - 0 - LOT - - - LSZ265 - 652650 - L_Sup_W_of_Line_fr_Manitou_I_to_ - - US - 47.00 - -87.73 - 0 - 0 - MQT - - - LMZ643 - 646430 - Sheboygan_to_Port_Washington_WI - - US - 43.55 - -87.72 - 0 - 0 - MKX - - - LMZ646 - 646460 - Wind_Pt_WI_to_Winthrop_Hbr_IL - - US - 42.64 - -87.72 - 0 - 0 - MKX - - - LSZ245 - 652450 - Manitou_I_to_Point_Isabelle_MI - - US - 47.32 - -87.71 - 0 - 0 - MQT - - - GMZ670 - 686700 - Wtrs_fr_Pensacola_FL_to_Pascagou - - US - 29.60 - -87.65 - 0 - 0 - MOB - - - LMZ543 - 645430 - Two_Rivers_to_Sheboygan_WI - - US - 43.95 - -87.64 - 0 - 0 - GRB - - - LMZ742 - 647420 - Nerly_I_to_Calumet_Harbor_IL - - US - 41.84 - -87.60 - 0 - 0 - LOT - - - LMZ741 - 647410 - Wilmette_Harbor_to_Nerly_I_IL - - US - 41.98 - -87.58 - 0 - 0 - LOT - - - LSZ248 - 652480 - Huron_Islands_to_Marquette_MI - - US - 46.77 - -87.52 - 0 - 0 - MQT - - - LMZ669 - 646690 - L_MI_fr_Sheboygan_to_Port_Washin - - US - 43.63 - -87.44 - 0 - 0 - MKX - - - LMZ743 - 647430 - Calumet_Harbor_IL_to_Gary_IN - - US - 41.70 - -87.42 - 0 - 0 - LOT - - - LMZ671 - 646710 - L_MI_fr_Port_Washington_to_N_Pt_ - - US - 43.20 - -87.41 - 0 - 0 - MKX - - - LMZ673 - 646730 - L_MI_fr_N_Pt_Lt_to_Wind_Pt_WI_5N - - US - 42.93 - -87.40 - 0 - 0 - MKX - - - LMZ521 - 645210 - Grn_Bay_S_of_line_fr__Cedar_Riv_ - - US - 45.11 - -87.39 - 0 - 0 - GRB - - - LMZ542 - 645420 - Sturgeon_Bay_to_Two_Rivers_WI - - US - 44.49 - -87.37 - 0 - 0 - GRB - - - LMZ777 - 647770 - L_MI_fr_Winthrop_Hbr_to_Wilmette - - US - 42.31 - -87.37 - 0 - 0 - LOT - - - LMZ567 - 645670 - L_MI_fr_2_Rivs_to_Sheboygan_WI_5 - - US - 44.05 - -87.33 - 0 - 0 - GRB - - - LMZ675 - 646750 - L_MI_fr_Wind_Pt_WI_to_Winthrop_H - - US - 42.61 - -87.32 - 0 - 0 - MKX - - - LMZ779 - 647790 - L_MI_fr_Wilmette_Hbr_to_MI_Cty_i - - US - 41.95 - -87.26 - 0 - 0 - LOT - - - LMZ744 - 647440 - Gary_to_Burns_Harbor_IN - - US - 41.67 - -87.25 - 0 - 0 - LOT - - - LMZ565 - 645650 - L_MI_fr_Sturgeon_Bay_to_2_Rivs_W - - US - 44.47 - -87.11 - 0 - 0 - GRB - - - LSZ249 - 652490 - Marquette_to_Munising_MI - - US - 46.60 - -87.05 - 0 - 0 - MQT - - - LMZ745 - 647450 - Burns_Harbor_to_MI_City_IN - - US - 41.72 - -87.04 - 0 - 0 - LOT - - - LMZ541 - 645410 - Rock_I_Passage_to_Sturgeon_Bay_W - - US - 45.07 - -86.96 - 0 - 0 - GRB - - - LMZ870 - 648700 - L_MI_fr_Whthall_to_Pentwtr_MI_5N - - US - 43.63 - -86.96 - 0 - 0 - GRR - - - LMZ221 - 642210 - Grn_Bay_N_of_line_fr_Cedar_Riv_M - - US - 45.66 - -86.94 - 0 - 0 - MQT - - - LMZ046 - 640460 - MI_City_IN_to_New_Buffalo_MI - - US - 41.80 - -86.86 - 0 - 0 - IWX - - - LSZ266 - 652660 - L_Sup_E_of_a_line_fr_Manitou_I_t - - US - 47.21 - -86.85 - 0 - 0 - MQT - - - LMZ878 - 648780 - L_MI_fr_St_Joseph_to_S_Haven_MI_ - - US - 42.36 - -86.84 - 0 - 0 - GRR - - - GMZ675 - 686750 - Wtrs_fr_Destin_to_Pensacola_FL_f - - US - 29.72 - -86.83 - 0 - 0 - MOB - - - LMZ080 - 640800 - L_MI_MI_Cty_IN_to_St._Joseph_MI_ - - US - 41.97 - -86.79 - 0 - 0 - IWX - - - LMZ872 - 648720 - L_MI_fr_Gnd_Haven_to_Whthall_MI_ - - US - 43.22 - -86.78 - 0 - 0 - GRR - - - LMZ874 - 648740 - L_MI_fr_Holland_to_Gnd_Haven_MI_ - - US - 42.95 - -86.78 - 0 - 0 - GRR - - - LMZ366 - 643660 - L_MI_fr_Pt_Betsie_to_Manistee_MI - - US - 44.53 - -86.75 - 0 - 0 - APX - - - GMZ655 - 686550 - Cstal_wtrs_fr_Destin_to_Pensacol - - US - 30.24 - -86.72 - 0 - 0 - MOB - - - LMZ043 - 640430 - New_Buffalo_MI_to_St_Joseph_MI - - US - 41.97 - -86.67 - 0 - 0 - IWX - - - LMZ563 - 645630 - L_MI_fr_Rock_I_Passage_to_Sturge - - US - 45.02 - -86.67 - 0 - 0 - GRB - - - LMZ250 - 642500 - 5NM_E_of_a_line_fr_Fairport_MI_t - - US - 45.49 - -86.66 - 0 - 0 - MQT - - - LMZ868 - 648680 - L_MI_fr_Pentwtr_to_Manistee_MI_5 - - US - 43.95 - -86.65 - 0 - 0 - GRR - - - LMZ876 - 648760 - L_MI_fr_S_Haven_to_Holland_MI_5N - - US - 42.60 - -86.65 - 0 - 0 - GRR - - - LMZ849 - 648490 - Pentwater_to_Manistee_MI - - US - 44.03 - -86.57 - 0 - 0 - GRR - - - LMZ848 - 648480 - Whitehall_to_Pentwater_MI - - US - 43.59 - -86.53 - 0 - 0 - GRR - - - LSZ250 - 652500 - Munising_to_Grand_Marais_MI - - US - 46.59 - -86.49 - 0 - 0 - MQT - - - LMZ844 - 648440 - St_Joseph_to_South_Haven_MI - - US - 42.28 - -86.46 - 0 - 0 - GRR - - - LMZ847 - 648470 - Grand_Haven_to_Whitehall_MI - - US - 43.22 - -86.36 - 0 - 0 - GRR - - - LMZ346 - 643460 - Manistee_to_Point_Betsie_MI - - US - 44.48 - -86.33 - 0 - 0 - APX - - - LMZ261 - 642610 - L_MI_fr_Seul_Choix_Pt_to_Rock_I_ - - US - 45.60 - -86.32 - 0 - 0 - MQT - - - LMZ846 - 648460 - Holland_to_Grand_Haven_MI - - US - 42.91 - -86.30 - 0 - 0 - GRR - - - LMZ845 - 648450 - South_Haven_to_Holland_MI - - US - 42.59 - -86.28 - 0 - 0 - GRR - - - LMZ248 - 642480 - Seul_Choix_Pt_to_Pt_Detour_MI - - US - 45.79 - -86.27 - 0 - 0 - MQT - - - LMZ364 - 643640 - L_MI_fr_Charlevoix_to_Pt_Betsie_ - - US - 45.02 - -86.19 - 0 - 0 - APX - - - LMZ345 - 643450 - Pt_Betsie_to_Sleeping_Bear_Pt_MI - - US - 44.82 - -86.18 - 0 - 0 - APX - - - LMZ344 - 643440 - Sleeping_Bear_Pt_to_Gnd_Traverse - - US - 45.09 - -85.79 - 0 - 0 - APX - - - GMZ770 - 687700 - Wtrs_fr_Apalachicola_to_Destin_F - - US - 29.27 - -85.76 - 0 - 0 - TAE - - - LMZ341 - 643410 - Seul_Choix_Pt_to_5NM_W_of_Mackin - - US - 45.96 - -85.71 - 0 - 0 - APX - - - GMZ750 - 687500 - Cstal_wtrs_fr_Apalachicola_to_De - - US - 29.84 - -85.65 - 0 - 0 - TAE - - - LSZ267 - 652670 - L_Sup_fr_Gnd_Marais_MI_to_Whtfis - - US - 47.00 - -85.61 - 0 - 0 - MQT - - - LMZ362 - 643620 - L_MI_S_of_a_line_fr_Seul_Choix_P - - US - 45.60 - -85.57 - 0 - 0 - APX - - - LMZ323 - 643230 - Gnd_Traverse_Bay_S_of_a_line_Gnd - - US - 44.98 - -85.56 - 0 - 0 - APX - - - LSZ251 - 652510 - Grand_Marais_to_Whitefish_Pt_MI - - US - 46.75 - -85.41 - 0 - 0 - MQT - - - LMZ342 - 643420 - Norwood_MI_to_5NM_W_of_Mackinac_ - - US - 45.53 - -85.20 - 0 - 0 - APX - - - LSZ321 - 653210 - Whtfish_Bay_(U.S._Portion)/Whtfi - - US - 46.54 - -84.77 - 0 - 0 - APX - - - LHZ345 - 743450 - Sts_of_Mackinac_within_5NM_of_Ma - - US - 45.81 - -84.71 - 0 - 0 - APX - - - GMZ755 - 687550 - Cstal_Wtrs_From__Ochlockonee_Riv - - US - 29.61 - -84.54 - 0 - 0 - TAE - - - GMZ775 - 687750 - Wtrs_fr__Suwannee_Riv_to_Apalach - - US - 29.15 - -84.35 - 0 - 0 - TAE - - - LHZ347 - 743470 - 5NM_E_of_Mackinac_Br_to_Presque_ - - US - 45.73 - -84.31 - 0 - 0 - APX - - - LHZ346 - 743460 - St_Ignace_to_False_Detour_Chnl - - US - 45.94 - -84.13 - 0 - 0 - APX - - - LSZ322 - 653220 - St._Marys_Riv_Pt_Iroquois_to_E._ - - US - 46.26 - -84.11 - 0 - 0 - APX - - - GMZ730 - 687300 - Apalachee_Bay_or_Cstal_Wtrs_From - - US - 29.90 - -83.95 - 0 - 0 - TAE - - - LHZ361 - 743610 - L_Huron_fr_5NM_E_of_Mackinac_Br_ - - US - 45.63 - -83.69 - 0 - 0 - APX - - - LHZ422 - 744220 - Inr_Saginaw_Bay_SW_of_Pt_Au_Gres - - US - 43.80 - -83.67 - 0 - 0 - DTX - - - GMZ870 - 688700 - Wtrs_fr_Tarpon_Spgs_to_Suwannee_ - - US - 28.60 - -83.54 - 0 - 0 - TBW - - - GMZ765 - 687650 - Cstal_wtrs_fr__Suwannee_Riv_to_K - - US - 29.50 - -83.53 - 0 - 0 - TAE - - - LHZ421 - 744210 - Out_Saginaw_Bay_SW_of_Alabaster_ - - US - 44.07 - -83.38 - 0 - 0 - DTX - - - GMZ873 - 688730 - Wtrs_fr_Englewood_to_Tarpon_Spgs - - US - 27.42 - -83.36 - 0 - 0 - TBW - - - LEZ142 - 631420 - Maumee_Bay_to_Reno_Beach_OH - - US - 41.74 - -83.35 - 0 - 0 - CLE - - - LHZ348 - 743480 - Presque_I_Lt_to_Sturgeon_Pt_MI_I - - US - 45.06 - -83.32 - 0 - 0 - APX - - - LEZ444 - 634440 - MI_Wtrs_of_L_Erie_fr_Detroit_Riv - - US - 41.89 - -83.29 - 0 - 0 - DTX - - - LHZ349 - 743490 - Sturgeon_Point_to_Alabaster_MI - - US - 44.45 - -83.26 - 0 - 0 - APX - - - LEZ162 - 631620 - Detroit_Riv_Lt._to_Maumee_Bay_OH - - US - 41.86 - -83.20 - 0 - 0 - CLE - - - LCZ423 - 604230 - Detroit_River - - US - 42.18 - -83.16 - 0 - 0 - DTX - - - GMZ850 - 688500 - Cstal_wtrs_fr_Tarpon_Spgs_to_Suw - - US - 28.74 - -82.94 - 0 - 0 - TBW - - - LEZ143 - 631430 - Reno_Beach_to_The_Islands_OH - - US - 41.63 - -82.94 - 0 - 0 - CLE - - - LEZ163 - 631630 - Reno_Beach_to_The_Is_OH_beyond_5 - - US - 41.73 - -82.92 - 0 - 0 - CLE - - - GMZ853 - 688530 - Cstal_wtrs_fr_Englewood_to_Tarpo - - US - 27.53 - -82.87 - 0 - 0 - TBW - - - GMZ876 - 688760 - Wtrs_fr_Bonita_Beach_to_Englewoo - - US - 26.39 - -82.86 - 0 - 0 - TBW - - - LHZ362 - 743620 - L_Huron_fr_Presque_I_Lt_to_Sturg - - US - 45.10 - -82.84 - 0 - 0 - APX - - - LCZ460 - 604600 - L_St._Clair_Open_L_(U.S._Portion - - US - 42.52 - -82.76 - 0 - 0 - DTX - - - LHZ363 - 743630 - L_Huron_fr_Sturgeon_Pt_to_Alabas - - US - 44.42 - -82.75 - 0 - 0 - APX - - - LEZ144 - 631440 - The_Islands_to_Vermilion_OH - - US - 41.48 - -82.71 - 0 - 0 - CLE - - - GMZ830 - 688300 - Tampa_Bay_waters - - US - 27.76 - -82.60 - 0 - 0 - TBW - - - LHZ441 - 744410 - Port_Austin_to_Harbor_Beach_MI - - US - 43.93 - -82.59 - 0 - 0 - DTX - - - LHZ442 - 744420 - Harbor_Beach_to_Port_Sanilac_MI - - US - 43.64 - -82.53 - 0 - 0 - DTX - - - GMZ075 - 680750 - Wtrs_fr_Key_W_to_20_NM_W_of_Dry_ - - US - 24.26 - -82.51 - 0 - 0 - KEY - - - LHZ462 - 744620 - L_Huron_fr_Port_Austin_to_Hbr_Be - - US - 44.05 - -82.51 - 0 - 0 - DTX - - - LEZ164 - 631640 - The_Is_to_Vermilion_OH_beyond_5n - - US - 41.59 - -82.48 - 0 - 0 - CLE - - - LCZ422 - 604220 - St._Clair_River - - US - 42.77 - -82.47 - 0 - 0 - DTX - - - LHZ443 - 744430 - Port_Sanilac_to_Port_Huron_MI - - US - 43.21 - -82.43 - 0 - 0 - DTX - - - GMZ676 - 686760 - Wtrs_fr_Chokoloskee_to_Bonita_Be - - US - 25.80 - -82.42 - 0 - 0 - MFL - - - LHZ463 - 744630 - L_Huron_fr_Hbr_Beach_to_Port_Sni - - US - 43.70 - -82.41 - 0 - 0 - DTX - - - LHZ464 - 744640 - L_Huron_fr_Port_Snilac_to_Port_H - - US - 43.33 - -82.40 - 0 - 0 - DTX - - - GMZ856 - 688560 - Cstal_wtrs_fr_Bonita_Beach_to_En - - US - 26.56 - -82.28 - 0 - 0 - TBW - - - LEZ145 - 631450 - Vermilion_to_Avon_Point_OH - - US - 41.51 - -82.17 - 0 - 0 - CLE - - - LEZ165 - 631650 - Vermilion_to_Avon_Pt_OH_beyond_5 - - US - 41.61 - -82.04 - 0 - 0 - CLE - - - GMZ033 - 680330 - Wtrs_fr_E_C_Sable_to_Chokoloskee - - US - 25.27 - -82.00 - 0 - 0 - KEY - - - GMZ656 - 686560 - Cstal_wtrs_fr_Chokoloskee_to_Bon - - US - 25.96 - -81.92 - 0 - 0 - MFL - - - LEZ166 - 631660 - Avon_Pt_to_Willowick_OH_beyond_5 - - US - 41.82 - -81.81 - 0 - 0 - CLE - - - LEZ146 - 631460 - Avon_Point_to_Willowick_OH - - US - 41.54 - -81.66 - 0 - 0 - CLE - - - GMZ054 - 680540 - Cstal_wtrs_fr_the_W_end_of_the_S - - US - 24.48 - -81.61 - 0 - 0 - KEY - - - GMZ032 - 680320 - Gulf_Side_of_the_Lwr_Keys_out_20 - - US - 24.86 - -81.48 - 0 - 0 - KEY - - - GMZ074 - 680740 - Wtrs_fr_the_W_end_of_the_Seven_M - - US - 23.93 - -81.44 - 0 - 0 - KEY - - - GMZ657 - 686570 - Cstal_wtrs_fr_E_C_Sable_to_Choko - - US - 25.47 - -81.41 - 0 - 0 - MFL - - - AMZ450 - 664500 - Cstal_wtrs_fr_Altamaha_Snd_to_Fe - - US - 30.99 - -81.28 - 0 - 0 - JAX - - - LEZ147 - 631470 - Willowick_to_Geneva-on-the_L_OH - - US - 41.80 - -81.22 - 0 - 0 - CLE - - - AMZ452 - 664520 - Cstal_wtrs_fr_Fernandina_Beach_t - - US - 30.28 - -81.18 - 0 - 0 - JAX - - - LEZ167 - 631670 - Willowick_to_Geneva-on-the-L_OH_ - - US - 42.00 - -81.16 - 0 - 0 - CLE - - - AMZ354 - 663540 - Cstal_wtrs_fr_Savannah_GA_to_Alt - - US - 31.67 - -81.05 - 0 - 0 - CHS - - - AMZ550 - 665500 - Flagler_Beach_to_Volusia-Brevard - - US - 29.22 - -80.97 - 0 - 0 - MLB - - - AMZ454 - 664540 - Cstal_wtrs_fr_St._Augustine_to_F - - US - 29.66 - -80.94 - 0 - 0 - JAX - - - GMZ053 - 680530 - Cstal_wtrs_fr_Craig_Key_to_the_W - - US - 24.57 - -80.90 - 0 - 0 - KEY - - - GMZ031 - 680310 - Florida_Bay - - US - 24.99 - -80.86 - 0 - 0 - KEY - - - AMZ610 - 666100 - Lake_Okeechobee - - US - 26.94 - -80.82 - 0 - 0 - MFL - - - GMZ073 - 680730 - Wtrs_fr_Craig_Key_to_the_W_end_o - - US - 24.10 - -80.79 - 0 - 0 - KEY - - - LEZ148 - 631480 - Geneva-on-the-L_to_Conneaut_OH - - US - 41.96 - -80.75 - 0 - 0 - CLE - - - AMZ472 - 664720 - Wtrs_fr_Fernandina_Beach_to_St._ - - US - 30.27 - -80.73 - 0 - 0 - JAX - - - AMZ470 - 664700 - Wtrs_fr_Altamaha_Snd_GA_to_Ferna - - US - 30.90 - -80.71 - 0 - 0 - JAX - - - LEZ168 - 631680 - Geneva-on-the-L_to_Conneaut_OH_b - - US - 42.11 - -80.69 - 0 - 0 - CLE - - - AMZ474 - 664740 - Wtrs_fr_St._Augustine_to_Flagler - - US - 29.71 - -80.54 - 0 - 0 - JAX - - - AMZ552 - 665520 - Volusia-Brevard_Cnty_Line_to_Seb - - US - 28.39 - -80.48 - 0 - 0 - MLB - - - AMZ352 - 663520 - Cstal_wtrs_fr_Edisto_Beach_SC_to - - US - 32.18 - -80.47 - 0 - 0 - CHS - - - AMZ374 - 663740 - Wtrs_fr_Savannah_GA_to_Altamaha_ - - US - 31.48 - -80.45 - 0 - 0 - CHS - - - LEZ169 - 631690 - Conneaut_OH_to_Ripley_NY_beyond_ - - US - 42.33 - -80.35 - 0 - 0 - CLE - - - GMZ052 - 680520 - Cstal_wtrs_fr_O_Reef_to_Craig_Ke - - US - 24.94 - -80.34 - 0 - 0 - KEY - - - AMZ630 - 666300 - Biscayne_Bay - - US - 25.58 - -80.28 - 0 - 0 - MFL - - - AMZ570 - 665700 - Flagler_Beach_to_Volusia-Brevard - - US - 29.20 - -80.22 - 0 - 0 - MLB - - - LEZ149 - 631490 - Conneaut_OH_to_Ripley_NY - - US - 42.15 - -80.15 - 0 - 0 - CLE - - - GMZ072 - 680720 - Wtrs_fr_O_Reef_to_Craig_Key_fr_2 - - US - 24.53 - -80.05 - 0 - 0 - KEY - - - AMZ555 - 665550 - Sebastian_Inlt_to_Jupiter_Inlt_0 - - US - 27.40 - -80.03 - 0 - 0 - MLB - - - AMZ651 - 666510 - Cstal_wtrs_fr_Deerfield_Beach_to - - US - 25.77 - -80.01 - 0 - 0 - MFL - - - AMZ330 - 663300 - Charleston_Harbor - - US - 32.78 - -79.89 - 0 - 0 - CHS - - - AMZ572 - 665720 - Volusia-Brevard_Cnty_Line_to_Seb - - US - 28.42 - -79.87 - 0 - 0 - MLB - - - AMZ650 - 666500 - Cstal_wtrs_fr_Jupiter_Inlt_to_De - - US - 26.59 - -79.74 - 0 - 0 - MFL - - - AMZ370 - 663700 - Wtrs_fr_S_Sntee_Riv_SC_to_Savann - - US - 32.35 - -79.63 - 0 - 0 - CHS - - - LEZ040 - 630400 - Ripley_to_Dunkirk_NY - - US - 42.43 - -79.56 - 0 - 0 - BUF - - - AMZ575 - 665750 - Sebastian_Inlt_to_Jupiter_Inlt_2 - - US - 27.46 - -79.52 - 0 - 0 - MLB - - - AMZ350 - 663500 - Cstal_wtrs_fr_S_Sntee_Riv_to_Edi - - US - 32.65 - -79.51 - 0 - 0 - CHS - - - AMZ671 - 666710 - Wtrs_fr_Deerfield_Beach_to_O_Ree - - US - 25.50 - -79.50 - 0 - 0 - MFL - - - LEZ061 - 630610 - Ripley_to_Buffalo_NY_extending_f - - US - 42.55 - -79.49 - 0 - 0 - BUF - - - AMZ670 - 666700 - Wtrs_fr_Jupiter_Inlt_to_Deerfiel - - US - 26.58 - -79.34 - 0 - 0 - MFL - - - LEZ041 - 630410 - Dunkirk_to_Buffalo_NY - - US - 42.69 - -79.11 - 0 - 0 - BUF - - - LEZ020 - 630200 - Buffalo_Hbr_and_the_Upr_Niagara_ - - US - 43.11 - -79.06 - 0 - 0 - BUF - - - AMZ256 - 662560 - Cstal_wtrs_fr_Murrells_Inlt_to_S - - US - 33.21 - -78.86 - 0 - 0 - ILM - - - LOZ042 - 620420 - Niagara_Riv_to_Hamlin_Beach_NY - - US - 43.36 - -78.79 - 0 - 0 - BUF - - - LOZ062 - 620620 - Niagara_Riv_to_Hamlin_Beach_NY_b - - US - 43.55 - -78.63 - 0 - 0 - BUF - - - AMZ254 - 662540 - Cstal_wtrs_fr_Ltl_Riv_Inlt_to_Mu - - US - 33.62 - -78.59 - 0 - 0 - ILM - - - AMZ252 - 662520 - Cstal_wtrs_fr_C_Fear_NC_to_Ltl_R - - US - 33.69 - -78.01 - 0 - 0 - ILM - - - AMZ270 - 662700 - Wtrs_fr_Surf_Cty_NC_to_S_Sntee_R - - US - 33.49 - -77.96 - 0 - 0 - ILM - - - AMZ250 - 662500 - Cstal_wtrs_fr_Surf_Cty_to_C_Fear - - US - 34.07 - -77.60 - 0 - 0 - ILM - - - LOZ043 - 620430 - Hamlin_Beach_to_Sodus_Bay_NY - - US - 43.33 - -77.46 - 0 - 0 - BUF - - - LOZ063 - 620630 - Hamlin_Beach_to_Sodus_Bay_NY_bey - - US - 43.47 - -77.38 - 0 - 0 - BUF - - - ANZ536 - 675360 - Tidal_Potomac_fr_Ind_Hd_to_Cobb_ - - US - 38.42 - -77.12 - 0 - 0 - LWX - - - ANZ535 - 675350 - Tidal_Potomac_fr_Key_Br_to_Ind_H - - US - 38.75 - -77.04 - 0 - 0 - LWX - - - AMZ158 - 661580 - Cstal_wtrs_fr_C_Lookout_to_Surf_ - - US - 34.52 - -76.95 - 0 - 0 - MHX - - - LOZ064 - 620640 - Sodus_Bay_to_Mex_Bay_NY_beyond_5 - - US - 43.62 - -76.75 - 0 - 0 - BUF - - - LOZ044 - 620440 - Sodus_Bay_to_Mexico_Bay_NY - - US - 43.44 - -76.62 - 0 - 0 - BUF - - - ANZ537 - 675370 - Tidal_Potomac_fr_Cobb_I_MD_to_Sm - - US - 38.15 - -76.58 - 0 - 0 - LWX - - - ANZ533 - 675330 - Chsapke_Bay_fr_N_Beach_to_Drum_P - - US - 38.56 - -76.41 - 0 - 0 - LWX - - - LOZ065 - 620650 - Mex_Bay_NY_to_the_St._Lawrence_R - - US - 43.78 - -76.39 - 0 - 0 - BUF - - - LOZ045 - 620450 - Mex_Bay_NY_to_the_St._Lawrence_R - - US - 43.86 - -76.36 - 0 - 0 - BUF - - - ANZ531 - 675310 - Chsapke_Bay_fr_Pooles_I_to_Sndy_ - - US - 39.18 - -76.35 - 0 - 0 - LWX - - - AMZ156 - 661560 - Cstal_wtrs_fr_Ocracoke_Inlt_to_C - - US - 34.80 - -76.27 - 0 - 0 - MHX - - - ANZ532 - 675320 - Chsapke_Bay_fr_Sndy_Pt_to_N_Beac - - US - 38.90 - -76.27 - 0 - 0 - LWX - - - AMZ135 - 661350 - Pamlico_Sound - - US - 35.30 - -76.13 - 0 - 0 - MHX - - - ANZ632 - 676320 - Chsapke_Bay_fr_New_Pt_Comfort_to - - US - 37.10 - -76.13 - 0 - 0 - AKQ - - - ANZ534 - 675340 - Chsapke_Bay_fr_Drum_Pt_MD_to_Smi - - US - 38.13 - -76.11 - 0 - 0 - LWX - - - AMZ130 - 661300 - Albemarle_Sound - - US - 36.00 - -76.09 - 0 - 0 - MHX - - - ANZ631 - 676310 - Chsapke_Bay_fr_Windmill_Pt_to_Ne - - US - 37.46 - -76.09 - 0 - 0 - AKQ - - - ANZ530 - 675300 - Chesapeake_Bay_N_of_Pooles_I_MD - - US - 39.46 - -76.06 - 0 - 0 - LWX - - - ANZ630 - 676300 - Chsapke_Bay_fr_Smith_Pt_to_Windm - - US - 37.80 - -76.04 - 0 - 0 - AKQ - - - ANZ633 - 676330 - Currituck_Sound - - US - 36.40 - -75.92 - 0 - 0 - AKQ - - - SLZ022 - 730220 - St._Lawrence_Riv_above_Ogdensbg_ - - US - 44.45 - -75.79 - 0 - 0 - BUF - - - ANZ656 - 676560 - Cstal_wtrs_fr_C_Charles_Lt_VA_to - - US - 36.78 - -75.68 - 0 - 0 - AKQ - - - AMZ170 - 661700 - Wtrs_fr_Currituck_Beach_Lt_to_Su - - US - 34.83 - -75.64 - 0 - 0 - MHX - - - ANZ654 - 676540 - Cstal_wtrs_fr_Parramore_I_to_C_C - - US - 37.31 - -75.62 - 0 - 0 - AKQ - - - ANZ658 - 676580 - Cstal_wtrs_fr_NC_VA_border_to_Cu - - US - 36.36 - -75.60 - 0 - 0 - AKQ - - - AMZ154 - 661540 - Cstal_wtrs_fr_C_Hatteras_to_Ocra - - US - 35.05 - -75.58 - 0 - 0 - MHX - - - AMZ150 - 661500 - Cstal_wtrs_fr_Currituck_Beach_Lt - - US - 36.02 - -75.50 - 0 - 0 - MHX - - - ANZ652 - 676520 - Cstal_wtrs_fr_Chincoteague_to_Pa - - US - 37.81 - -75.39 - 0 - 0 - AKQ - - - AMZ152 - 661520 - Cstal_wtrs_fr_Oregon_Inlt_to_C_H - - US - 35.50 - -75.38 - 0 - 0 - MHX - - - ANZ430 - 674300 - DE_Bay_wtrs_N_of_E_Pt_NJ_to_Slau - - US - 39.32 - -75.34 - 0 - 0 - PHI - - - SLZ024 - 730240 - St._Lawrence_Riv_fr_Ogdensbg_to_ - - US - 44.86 - -75.23 - 0 - 0 - BUF - - - ANZ431 - 674310 - DE_Bay_wtrs_S_of_E_Pt_NJ_to_Slau - - US - 39.00 - -75.10 - 0 - 0 - PHI - - - ANZ670 - 676700 - Wtrs_fr_Fenwick_I_DE_to_Currituc - - US - 37.28 - -75.10 - 0 - 0 - AKQ - - - ANZ650 - 676500 - Cstal_wtrs_fr_Fenwick_I_DE_to_Ch - - US - 38.23 - -75.07 - 0 - 0 - AKQ - - - ANZ454 - 674540 - Cstal_wtrs_fr_C_May_NJ_to_C_Henl - - US - 38.80 - -74.89 - 0 - 0 - PHI - - - ANZ455 - 674550 - Cstal_wtrs_fr_C_Henlopen_to_Fenw - - US - 38.48 - -74.74 - 0 - 0 - PHI - - - ANZ453 - 674530 - Cstal_wtrs_fr_Gt_Egg_Inlt_to_C_M - - US - 38.97 - -74.57 - 0 - 0 - PHI - - - ANZ452 - 674520 - Cstal_wtrs_fr_Ltl_Egg_Inlt_to_Gt - - US - 39.26 - -74.36 - 0 - 0 - PHI - - - ANZ338 - 673380 - New_York_Harbor - - US - 40.55 - -74.09 - 0 - 0 - OKX - - - ANZ470 - 674700 - Wtrs_fr_Sndy_Hook_NJ_to_Fenwick_ - - US - 39.18 - -74.02 - 0 - 0 - PHI - - - ANZ451 - 674510 - Cstal_wtrs_fr_Manasquan_Inlt_to_ - - US - 39.65 - -73.95 - 0 - 0 - PHI - - - ANZ450 - 674500 - Cstal_wtrs_fr_Sndy_Hook_to_Manas - - US - 40.16 - -73.78 - 0 - 0 - PHI - - - ANZ355 - 673550 - Sndy_Hook_NJ_to_Fire_I_Inlt_NY_o - - US - 40.41 - -73.51 - 0 - 0 - OKX - - - ANZ335 - 673350 - Long_I_Snd_W_of_New_Haven_CT/Por - - US - 41.04 - -73.36 - 0 - 0 - OKX - - - ANZ353 - 673530 - Fire_I_Inlt_NY_to_Moriches_Inlt_ - - US - 40.55 - -73.04 - 0 - 0 - OKX - - - ANZ345 - 673450 - S_Shore_Bays_fr_Jones_Inlt_throu - - US - 40.74 - -73.00 - 0 - 0 - OKX - - - ANZ370 - 673700 - Wtrs_fr_Montauk_Pt_NY_to_Sndy_Ho - - US - 40.31 - -72.48 - 0 - 0 - OKX - - - ANZ330 - 673300 - Long_I_Snd_E_of_New_Haven_CT/Por - - US - 41.15 - -72.44 - 0 - 0 - OKX - - - ANZ340 - 673400 - Peconic_and_Gardiners_Bays - - US - 41.02 - -72.33 - 0 - 0 - OKX - - - ANZ350 - 673500 - Moriches_Inlt_NY_to_Montauk_Pt_N - - US - 40.75 - -72.21 - 0 - 0 - OKX - - - ANZ237 - 672370 - Block_Island_Sound - - US - 41.21 - -71.61 - 0 - 0 - BOX - - - ANZ236 - 672360 - Narragansett_Bay - - US - 41.62 - -71.29 - 0 - 0 - BOX - - - ANZ235 - 672350 - Rhode_Island_Sound - - US - 41.32 - -71.13 - 0 - 0 - BOX - - - ANZ230 - 672300 - Boston_Harbor - - US - 42.34 - -70.94 - 0 - 0 - BOX - - - ANZ233 - 672330 - Vineyard_Sound - - US - 41.43 - -70.78 - 0 - 0 - BOX - - - ANZ234 - 672340 - Buzzards_Bay - - US - 41.52 - -70.74 - 0 - 0 - BOX - - - ANZ255 - 672550 - Cstal_wtrs_fr_Nantucket_MA_to_Ma - - US - 41.07 - -70.74 - 0 - 0 - BOX - - - ANZ250 - 672500 - Cstal_wtrs_fr_Merrimack_Riv_MA_o - - US - 42.44 - -70.37 - 0 - 0 - BOX - - - ANZ231 - 672310 - Cape_Cod_Bay - - US - 41.92 - -70.34 - 0 - 0 - BOX - - - ANZ154 - 671540 - Cstal_Wtrs_fr_C_Elizabeth,_ME_to - - US - 43.11 - -70.26 - 0 - 0 - GYX - - - ANZ232 - 672320 - Nantucket_Sound - - US - 41.48 - -70.26 - 0 - 0 - BOX - - - ANZ153 - 671530 - Casco_Bay - - US - 43.72 - -70.06 - 0 - 0 - GYX - - - ANZ254 - 672540 - Cstal_wtrs_fr_Provincetown_MA_to - - US - 41.66 - -69.75 - 0 - 0 - BOX - - - ANZ152 - 671520 - Cstal_Wtrs_fr_Port_Clyde,_ME_to_ - - US - 43.57 - -69.47 - 0 - 0 - GYX - - - ANZ170 - 671700 - Wtrs_fr_Stonington_ME_to_Merrima - - US - 43.32 - -69.31 - 0 - 0 - GYX - - - ANZ270 - 672700 - Wtrs_fr_Merrimack_Riv_MA_to_Watc - - US - 41.69 - -69.29 - 0 - 0 - BOX - - - ANZ150 - 671500 - Cstal_Wtrs_fr_Stonington,_ME_to_ - - US - 43.84 - -68.91 - 0 - 0 - GYX - - - ANZ151 - 671510 - Penobscot_Bay - - US - 44.18 - -68.77 - 0 - 0 - GYX - - - ANZ051 - 670510 - Cstal_Wtrs_fr_Schoodic_Pt,_ME_to - - US - 44.00 - -68.25 - 0 - 0 - CAR - - - ANZ052 - 670520 - Intra_Cstal_Wtrs_fr_Schoodic_Pt, - - US - 44.19 - -68.25 - 0 - 0 - CAR - - - ANZ070 - 670700 - Wtrs_fr_Eport_ME_to_Stonington_( - - US - 43.84 - -67.86 - 0 - 0 - CAR - - - AMZ741 - 667410 - Mona_Passage_Southward_to_17N - - US - 17.74 - -67.69 - 0 - 0 - SJU - - - ANZ050 - 670500 - Cstal_Wtrs_fr_Eport,_ME_to_Schoo - - US - 44.30 - -67.48 - 0 - 0 - CAR - - - AMZ742 - 667420 - Cstal_Wtrs_OF_NWrn_Puerto_Rico_o - - US - 18.34 - -67.30 - 0 - 0 - SJU - - - AMZ745 - 667450 - Cstal_Wtrs_OF_SWrn_Puerto_Rico_o - - US - 18.06 - -67.28 - 0 - 0 - SJU - - - AMZ712 - 667120 - Cstal_Wtrs_of_Nrn_Puerto_Rico_ou - - US - 18.60 - -66.63 - 0 - 0 - SJU - - - AMZ735 - 667350 - Cstal_Wtrs_of_Srn_Puerto_Rico_ou - - US - 17.84 - -66.43 - 0 - 0 - SJU - - - AMZ710 - 667100 - Atl_Wtrs_of_Puerto_Rico_AND_USVI - - US - 19.04 - -66.01 - 0 - 0 - SJU - - - AMZ732 - 667320 - Carib_Wtrs_of_Puerto_Rico_fr_10_ - - US - 17.49 - -65.58 - 0 - 0 - SJU - - - AMZ725 - 667250 - Cstal_Wtrs_of_Srn_USVI,_Vieques, - - US - 18.24 - -65.16 - 0 - 0 - SJU - - - AMZ715 - 667150 - Cstal_Wtrs_of_Nrn_USVI_and_Culeb - - US - 18.47 - -64.85 - 0 - 0 - SJU - - - AMZ722 - 667220 - Anegada_Passage_Sward_to_17N - - US - 17.75 - -64.08 - 0 - 0 - SJU - - - PMZ161 - 711610 - Koror_Palau_Coastal_Waters - - US - 7.34 - 134.48 - 0 - 0 - GUM - - - PMZ171 - 711710 - Yap_Coastal_Waters - - US - 9.48 - 138.08 - 0 - 0 - GUM - - - PMZ151 - 711510 - Guam_Coastal_Waters - - US - 13.32 - 144.66 - 0 - 0 - GUM - - - PMZ152 - 711520 - Rota_Coastal_Waters - - US - 14.18 - 145.24 - 0 - 0 - GUM - - - PMZ153 - 711530 - Tinian_Coastal_Waters - - US - 14.83 - 145.45 - 0 - 0 - GUM - - - PMZ154 - 711540 - Saipan_Coastal_Waters - - US - 15.40 - 145.81 - 0 - 0 - GUM - - - PMZ172 - 711720 - Chuuk_Coastal_Waters - - US - 7.45 - 151.83 - 0 - 0 - GUM - - - PMZ173 - 711730 - Pohnpei_Coastal_Waters - - US - 6.97 - 158.23 - 0 - 0 - GUM - - - PMZ174 - 711740 - Kosrae_Coastal_Waters - - US - 5.35 - 162.95 - 0 - 0 - GUM - - - PMZ191 - 711910 - Waters_out_to_40_Nautical_Miles - - US - 19.30 - 166.64 - 0 - 0 - GUM - - - PMZ181 - 711810 - Majuro_Coastal_Waters - - US - 7.08 - 171.38 - 0 - 0 - GUM - - - PKZ176 - 691760 - Kiska_to_Attu - - US - 52.48 - 174.46 - 0 - 0 - AFC - - + + + + + AKZ187 + 21870 + Central_Aleutians + AK + US + 52.22 + -174.23 + 0 + 0 + AFC + + + AKZ213 + 22130 + St_Lawrence_I_and_Bering_St_Cst + AK + US + 63.36 + -170.27 + 0 + 0 + AFG + + + AKZ195 + 21950 + Pribilof_Islands + AK + US + 57.18 + -170.26 + 0 + 0 + AFC + + + AKZ185 + 21850 + Eastern_Aleutians + AK + US + 53.63 + -166.66 + 0 + 0 + AFC + + + AKZ207 + 22070 + Chukchi_Sea_Coast + AK + US + 67.98 + -165.11 + 0 + 0 + AFG + + + AKZ211 + 22110 + Southern_Seward_Peninsula_Coast + AK + US + 64.58 + -164.56 + 0 + 0 + AFG + + + AKZ214 + 22140 + Yukon_Delta + AK + US + 62.24 + -164.37 + 0 + 0 + AFG + + + AKZ155 + 21550 + Kuskokwim_Delta + AK + US + 60.18 + -163.61 + 0 + 0 + AFC + + + AKZ208 + 22080 + Lower_Kobuk_and_Noatak_Valleys + AK + US + 67.77 + -162.75 + 0 + 0 + AFG + + + AKZ210 + 22100 + Nrn_and_Interior_Seward_Penin + AK + US + 65.40 + -162.41 + 0 + 0 + AFG + + + AKZ201 + 22010 + Western_Arctic_Coast + AK + US + 69.84 + -161.53 + 0 + 0 + AFG + + + AKZ181 + 21810 + Alaska_Peninsula + AK + US + 55.82 + -161.44 + 0 + 0 + AFC + + + AKZ209 + 22090 + Baldwin_Penin_and_Selawik_Vly + AK + US + 66.69 + -161.06 + 0 + 0 + AFG + + + AKZ212 + 22120 + Ern_Norton_Snd_and_Nulato_Hills + AK + US + 63.74 + -160.39 + 0 + 0 + AFG + + + HIZ001 + 110010 + Niihau + HI + US + 21.89 + -160.15 + 0 + 0 + HFO + + + AKZ215 + 22150 + Lower_Yukon_Valley + AK + US + 62.56 + -159.94 + 0 + 0 + AFG + + + HIZ003 + 110030 + Kauai_Leeward + HI + US + 22.02 + -159.67 + 0 + 0 + HFO + + + HIZ004 + 110040 + Kauai_Mountains + HI + US + 22.07 + -159.54 + 0 + 0 + HFO + + + HIZ002 + 110020 + Kauai_Windward + HI + US + 22.05 + -159.40 + 0 + 0 + HFO + + + AKZ205 + 22050 + Northwestern_Brooks_Range + AK + US + 69.06 + -158.44 + 0 + 0 + AFG + + + HIZ006 + 110060 + Waianae_Coast + HI + US + 21.48 + -158.21 + 0 + 0 + HFO + + + HIZ011 + 110110 + Waianae_Mountains + HI + US + 21.46 + -158.10 + 0 + 0 + HFO + + + HIZ007 + 110070 + Oahu_North_Shore + HI + US + 21.59 + -158.08 + 0 + 0 + HFO + + + HIZ005 + 110050 + Oahu_South_Shore + HI + US + 21.33 + -158.05 + 0 + 0 + HFO + + + HIZ010 + 110100 + Central_Oahu + HI + US + 21.50 + -158.01 + 0 + 0 + HFO + + + HIZ008 + 110080 + Oahu_Koolau + HI + US + 21.50 + -157.89 + 0 + 0 + HFO + + + HIZ009 + 110090 + Olomana + HI + US + 21.39 + -157.73 + 0 + 0 + HFO + + + HIZ013 + 110130 + Molokai_Leeward + HI + US + 21.14 + -157.09 + 0 + 0 + HFO + + + AKZ217 + 22170 + Upper_Kobuk_and_Noatak_Valleys + AK + US + 67.41 + -156.95 + 0 + 0 + AFG + + + HIZ015 + 110150 + Lanai_Mauka + HI + US + 20.82 + -156.92 + 0 + 0 + HFO + + + HIZ012 + 110120 + Molokai_Windward + HI + US + 21.14 + -156.85 + 0 + 0 + HFO + + + HIZ014 + 110140 + Lanai_Makai + HI + US + 20.83 + -156.84 + 0 + 0 + HFO + + + HIZ018 + 110180 + Maui_Leeward_West + HI + US + 20.89 + -156.67 + 0 + 0 + HFO + + + HIZ016 + 110160 + Kahoolawe + HI + US + 20.56 + -156.62 + 0 + 0 + HFO + + + AKZ216 + 22160 + Lwr_Koyukuk_and_Middle_Yukon_Vly + AK + US + 64.44 + -156.58 + 0 + 0 + AFG + + + HIZ017 + 110170 + Maui_Windward_West + HI + US + 20.92 + -156.58 + 0 + 0 + HFO + + + HIZ019 + 110190 + Maui_Central_Valley + HI + US + 20.85 + -156.45 + 0 + 0 + HFO + + + HIZ021 + 110210 + Leeward_Haleakala + HI + US + 20.72 + -156.31 + 0 + 0 + HFO + + + HIZ022 + 110220 + Haleakala_Summit + HI + US + 20.72 + -156.23 + 0 + 0 + HFO + + + HIZ020 + 110200 + Windward_Haleakala + HI + US + 20.80 + -156.18 + 0 + 0 + HFO + + + AKZ151 + 21510 + Kuskokwim_Valley + AK + US + 62.26 + -156.04 + 0 + 0 + AFC + + + HIZ023 + 110230 + Kona + HI + US + 19.45 + -155.86 + 0 + 0 + HFO + + + HIZ026 + 110260 + Kohala + HI + US + 20.02 + -155.74 + 0 + 0 + HFO + + + AKZ161 + 21610 + Bristol_Bay + AK + US + 58.67 + -155.70 + 0 + 0 + AFC + + + HIZ027 + 110270 + Big_Island_Interior + HI + US + 19.56 + -155.61 + 0 + 0 + HFO + + + HIZ028 + 110280 + Big_Island_Summit + HI + US + 19.44 + -155.58 + 0 + 0 + HFO + + + HIZ024 + 110240 + South_Big_Island + HI + US + 19.19 + -155.42 + 0 + 0 + HFO + + + AKZ202 + 22020 + Northern_Arctic_Coast + AK + US + 70.78 + -155.25 + 0 + 0 + AFG + + + HIZ025 + 110250 + Big_Island_North_and_East + HI + US + 19.81 + -155.19 + 0 + 0 + HFO + + + AKZ171 + 21710 + Kodiak_Island + AK + US + 58.65 + -154.17 + 0 + 0 + AFC + + + AKZ219 + 22190 + Upper_Koyukuk_Valley + AK + US + 66.28 + -152.42 + 0 + 0 + AFG + + + AKZ221 + 22210 + Central_Interior + AK + US + 64.61 + -151.55 + 0 + 0 + AFG + + + AKZ145 + 21450 + Susitna_Valley + AK + US + 61.95 + -150.71 + 0 + 0 + AFC + + + AKZ121 + 21210 + Western_Kenai_Peninsula + AK + US + 60.12 + -150.69 + 0 + 0 + AFC + + + AKZ225 + 22250 + Denali + AK + US + 63.51 + -150.21 + 0 + 0 + AFG + + + AKZ101 + 21010 + Anchorage + AK + US + 61.20 + -149.71 + 0 + 0 + AFC + + + AKZ203 + 22030 + Central_Beaufort_Sea_Coast + AK + US + 70.34 + -149.66 + 0 + 0 + AFG + + + AKZ111 + 21110 + Matanuska_Valley + AK + US + 61.60 + -149.43 + 0 + 0 + AFC + + + AKZ125 + 21250 + Western_Prince_William_Sound + AK + US + 60.28 + -149.43 + 0 + 0 + AFC + + + AKZ218 + 22180 + Southeastern_Brooks_Range + AK + US + 67.94 + -147.78 + 0 + 0 + AFG + + + AKZ206 + 22060 + Northeastern_Brooks_Range + AK + US + 68.97 + -147.55 + 0 + 0 + AFG + + + AKZ222 + 22220 + Middle_Tanana_Valley + AK + US + 64.97 + -147.45 + 0 + 0 + AFG + + + AKZ223 + 22230 + Deltana_and_Tanana_Flats + AK + US + 64.13 + -146.62 + 0 + 0 + AFG + + + AKZ131 + 21310 + Northeast_Prince_William_Sound + AK + US + 61.14 + -146.39 + 0 + 0 + AFC + + + AKZ220 + 22200 + Yukon_Flats_and_Surrounding_Upla + AK + US + 66.46 + -146.25 + 0 + 0 + AFG + + + AKZ135 + 21350 + Southeast_Prince_William_Sound + AK + US + 60.65 + -145.32 + 0 + 0 + AFC + + + AKZ141 + 21410 + Copper_River_Basin + AK + US + 61.88 + -144.85 + 0 + 0 + AFC + + + AKZ204 + 22040 + Eastern_Beaufort_Sea_Coast + AK + US + 69.85 + -143.75 + 0 + 0 + AFG + + + AKZ224 + 22240 + Upr_Tanana_Vly_and_the_Ftymile_C + AK + US + 64.21 + -143.50 + 0 + 0 + AFG + + + AKZ226 + 22260 + Eastern_Alaska_Range + AK + US + 62.77 + -142.76 + 0 + 0 + AFG + + + AKZ017 + 20170 + C_Fairweather_to_C_Suckling_Csta + AK + US + 59.74 + -140.70 + 0 + 0 + AJK + + + AKZ022 + 20220 + Salisbury_Snd_to_C_Fairweather_C + AK + US + 58.68 + -137.66 + 0 + 0 + AJK + + + AKZ020 + 20200 + Glacier_Bay + AK + US + 58.79 + -136.99 + 0 + 0 + AJK + + + AKZ021 + 20210 + Eastern_Chichagof_Island + AK + US + 57.88 + -135.51 + 0 + 0 + AJK + + + AKZ019 + 20190 + Haines_Borough_and_Lynn_Canal + AK + US + 58.95 + -135.41 + 0 + 0 + AJK + + + AKZ018 + 20180 + Taiya_Inlet_and_Klondike_Hiway + AK + US + 59.57 + -135.35 + 0 + 0 + AJK + + + AKZ023 + 20230 + C_Decision_to_Salisbury_Snd_Csta + AK + US + 56.85 + -135.25 + 0 + 0 + AJK + + + AKZ024 + 20240 + Ern_Baranof_I_and_Srn_Admty_I + AK + US + 57.31 + -134.27 + 0 + 0 + AJK + + + AKZ025 + 20250 + Juneau_Borough_and_Nrn_Admty_I + AK + US + 58.08 + -133.64 + 0 + 0 + AJK + + + AKZ027 + 20270 + Dixon_Entr_to_C_Decision_Cstal_A + AK + US + 55.36 + -133.19 + 0 + 0 + AJK + + + AKZ026 + 20260 + Inr_Chnls_fr_Kupreanof_I_to_Etol + AK + US + 56.53 + -133.00 + 0 + 0 + AJK + + + AKZ028 + 20280 + Southern_Inner_Channels + AK + US + 55.71 + -132.71 + 0 + 0 + AJK + + + AKZ029 + 20290 + Misty_Fjords + AK + US + 55.67 + -130.98 + 0 + 0 + AJK + + + WAZ516 + 475160 + North_Coast + WA + US + 47.95 + -124.39 + 0 + 0 + SEW + + + ORZ022 + 370220 + Curry_County_Coast + OR + US + 42.35 + -124.27 + 0 + 0 + MFR + + + WAZ515 + 475150 + Western_Strait_of_Juan_De_Fuca + WA + US + 48.19 + -124.25 + 0 + 0 + SEW + + + ORZ021 + 370210 + South_Central_Oregon_Coast + OR + US + 43.28 + -124.24 + 0 + 0 + MFR + + + WAZ517 + 475170 + Central_Coast + WA + US + 47.16 + -124.06 + 0 + 0 + SEW + + + CAZ001 + 50010 + Redwood_Coast + CA + US + 41.02 + -124.03 + 0 + 0 + EKA + + + ORZ002 + 370020 + Central_Oregon_Coast + OR + US + 44.44 + -124.01 + 0 + 0 + PQR + + + ORZ001 + 370010 + North_Oregon_Coast + OR + US + 45.64 + -123.92 + 0 + 0 + PQR + + + ORZ024 + 370240 + Ern_Curry_Cnty_and_Josephine_Cnt + OR + US + 42.39 + -123.75 + 0 + 0 + MFR + + + CAZ003 + 50030 + North_Coast_Interior + CA + US + 40.99 + -123.72 + 0 + 0 + EKA + + + WAZ021 + 470210 + South_Washington_Coast + WA + US + 46.47 + -123.71 + 0 + 0 + PQR + + + CAZ002 + 50020 + Mendocino_Coast + CA + US + 39.40 + -123.64 + 0 + 0 + EKA + + + ORZ004 + 370040 + Ctrl_Coast_Range_of_Wrn_Oregon + OR + US + 44.42 + -123.62 + 0 + 0 + PQR + + + WAZ513 + 475130 + Olympics + WA + US + 47.71 + -123.61 + 0 + 0 + SEW + + + WAZ512 + 475120 + Lower_Chehalis_Valley_Area + WA + US + 47.09 + -123.52 + 0 + 0 + SEW + + + WAZ020 + 470200 + Willapa_Hills + WA + US + 46.52 + -123.51 + 0 + 0 + PQR + + + ORZ003 + 370030 + Coast_Range_of_Northwest_Oregon + OR + US + 45.59 + -123.40 + 0 + 0 + PQR + + + CAZ076 + 50760 + Mendocino_Interior + CA + US + 39.40 + -123.39 + 0 + 0 + EKA + + + ORZ023 + 370230 + Central_Douglas_County + OR + US + 43.32 + -123.35 + 0 + 0 + MFR + + + WAZ514 + 475140 + Eastern_Strait_of_Juan_de_Fuca + WA + US + 48.07 + -123.28 + 0 + 0 + SEW + + + CAZ080 + 50800 + Western_Siskiyou_County + CA + US + 41.49 + -123.13 + 0 + 0 + MFR + + + ORZ008 + 370080 + South__Willamette_Valley + OR + US + 44.32 + -123.11 + 0 + 0 + PQR + + + CAZ004 + 50040 + Upper_Trinity_River + CA + US + 40.44 + -123.07 + 0 + 0 + EKA + + + CAZ505 + 55050 + Cstal_N_Bay_Incl_Pt_Reyes_Natl_S + CA + US + 38.30 + -122.99 + 0 + 0 + MTR + + + WAZ001 + 470010 + San_Juan_County + WA + US + 48.60 + -122.99 + 0 + 0 + SEW + + + ORZ007 + 370070 + Central_Willamette_Valley + OR + US + 45.05 + -122.94 + 0 + 0 + PQR + + + WAZ511 + 475110 + Hood_Canal_Area + WA + US + 47.52 + -122.94 + 0 + 0 + SEW + + + WAZ022 + 470220 + Lwr_Columbia_and_I_-_5_Corridor_ + WA + US + 46.11 + -122.88 + 0 + 0 + PQR + + + ORZ005 + 370050 + Lower_Columbia + OR + US + 45.97 + -122.87 + 0 + 0 + PQR + + + WAZ504 + 475040 + Southwest_Interior + WA + US + 46.78 + -122.87 + 0 + 0 + SEW + + + ORZ026 + 370260 + Jackson_County + OR + US + 42.48 + -122.86 + 0 + 0 + MFR + + + ORZ006 + 370060 + Greater_Portland_Metro_Area + OR + US + 45.52 + -122.83 + 0 + 0 + PQR + + + CAZ506 + 55060 + North_Bay_Interior_Valleys + CA + US + 38.34 + -122.78 + 0 + 0 + MTR + + + ORZ012 + 370120 + Cascade_Foothills_in_Lane_Cnty + OR + US + 43.91 + -122.77 + 0 + 0 + PQR + + + ORZ025 + 370250 + Ern_Douglas_County_Foothills + OR + US + 43.18 + -122.75 + 0 + 0 + MFR + + + CAZ063 + 50630 + Mtns_SWrn_Shasta_Cnty_to_Nrn_L_C + CA + US + 39.91 + -122.73 + 0 + 0 + STO + + + CAZ064 + 50640 + Clear_Lake/Southern_Lake_County + CA + US + 38.96 + -122.67 + 0 + 0 + STO + + + CAZ081 + 50810 + Central_Siskiyou_County + CA + US + 41.68 + -122.60 + 0 + 0 + MFR + + + WAZ503 + 475030 + Western_Whatcom_County + WA + US + 48.82 + -122.59 + 0 + 0 + SEW + + + WAZ039 + 470390 + Greater_Vancouver_Area + WA + US + 45.73 + -122.54 + 0 + 0 + PQR + + + ORZ010 + 370100 + Nrn_Oregon_Cascade_Foothills + OR + US + 44.86 + -122.52 + 0 + 0 + PQR + + + WAZ509 + 475090 + Tacoma_Area + WA + US + 47.17 + -122.52 + 0 + 0 + SEW + + + WAZ510 + 475100 + Admiralty_Inlet_Area + WA + US + 48.15 + -122.50 + 0 + 0 + SEW + + + WAZ040 + 470400 + S_Washington_Cascade_Foothills + WA + US + 46.00 + -122.48 + 0 + 0 + PQR + + + CAZ006 + 50060 + San_Francisco + CA + US + 37.75 + -122.42 + 0 + 0 + MTR + + + WAZ506 + 475060 + Western_Skagit_County + WA + US + 48.47 + -122.42 + 0 + 0 + SEW + + + CAZ509 + 55090 + San_Francisco_Peninsula_Coast + CA + US + 37.36 + -122.38 + 0 + 0 + MTR + + + WAZ508 + 475080 + Seattle/Bremerton_Area + WA + US + 47.51 + -122.29 + 0 + 0 + SEW + + + CAZ507 + 55070 + North_Bay_Mountains + CA + US + 38.54 + -122.27 + 0 + 0 + MTR + + + CAZ015 + 50150 + Northern_Sacramento_Valley + CA + US + 40.26 + -122.25 + 0 + 0 + STO + + + ORZ013 + 370130 + Cascades_in_Lane_County + OR + US + 43.84 + -122.25 + 0 + 0 + PQR + + + ORZ028 + 370280 + Siskiyou_Mtns_and_Srn_Oregon_Cas + OR + US + 42.41 + -122.24 + 0 + 0 + MFR + + + CAZ013 + 50130 + Shasta_L_Area_/_Nrn_Shasta_Cnty + CA + US + 40.87 + -122.21 + 0 + 0 + STO + + + ORZ027 + 370270 + South_Central_Oregon_Cascades + OR + US + 43.21 + -122.21 + 0 + 0 + MFR + + + CAZ082 + 50820 + South_Central_Siskiyou_County + CA + US + 41.30 + -122.14 + 0 + 0 + MFR + + + WAZ507 + 475070 + Everett_and_Vicinity + WA + US + 48.03 + -122.14 + 0 + 0 + SEW + + + CAZ508 + 55080 + San_Francisco_Bay_Shoreline + CA + US + 37.64 + -122.08 + 0 + 0 + MTR + + + WAZ505 + 475050 + East_Puget_Sound_Lowlands + WA + US + 47.53 + -122.05 + 0 + 0 + SEW + + + WAZ019 + 470190 + South_Washington_Cascades + WA + US + 46.00 + -122.04 + 0 + 0 + PQR + + + CAZ512 + 55120 + Santa_Cruz_Mountains + CA + US + 37.20 + -121.98 + 0 + 0 + MTR + + + CAZ510 + 55100 + East_Bay_Interior_Valleys + CA + US + 37.82 + -121.97 + 0 + 0 + MTR + + + ORZ009 + 370090 + Western_Columbia_River_Gorge + OR + US + 45.61 + -121.96 + 0 + 0 + PQR + + + ORZ011 + 370110 + Northern_Oregon_Cascades + OR + US + 44.93 + -121.94 + 0 + 0 + PQR + + + WAZ023 + 470230 + Western_Columbia_River_Gorge + WA + US + 45.66 + -121.92 + 0 + 0 + PQR + + + CAZ016 + 50160 + Central_Sacramento_Valley + CA + US + 39.40 + -121.90 + 0 + 0 + STO + + + CAZ083 + 50830 + N_Ctrl_and_SE_Siskiyou_County + CA + US + 41.59 + -121.90 + 0 + 0 + MFR + + + CAZ530 + 55300 + Srn_Monterey_Bay_and_Big_Sur_Cst + CA + US + 36.35 + -121.90 + 0 + 0 + MTR + + + WAZ519 + 475190 + W_Slopes_Ctrl_Cascades_and_Passe + WA + US + 47.08 + -121.89 + 0 + 0 + SEW + + + CAZ018 + 50180 + Carquinez_Strait_and_Delta + CA + US + 38.07 + -121.80 + 0 + 0 + STO + + + CAZ529 + 55290 + Northern_Monterey_Bay + CA + US + 36.96 + -121.79 + 0 + 0 + MTR + + + CAZ511 + 55110 + E_Bay_Hills_and_the_Diablo_Rng + CA + US + 37.48 + -121.73 + 0 + 0 + MTR + + + CAZ513 + 55130 + Santa_Clara_Vly_Incl_San_Jose + CA + US + 37.17 + -121.69 + 0 + 0 + MTR + + + CAZ066 + 50660 + NE_Foothills/Sacramento_Valley + CA + US + 40.13 + -121.65 + 0 + 0 + STO + + + CAZ017 + 50170 + Southern_Sacramento_Valley + CA + US + 38.64 + -121.63 + 0 + 0 + STO + + + CAZ084 + 50840 + NE_Siskiyou_and_NW_Modoc_Cnties + CA + US + 41.86 + -121.63 + 0 + 0 + MFR + + + ORZ029 + 370290 + Klamath_Basin + OR + US + 42.47 + -121.63 + 0 + 0 + MFR + + + ORZ014 + 370140 + Upper_Hood_River_Valley + OR + US + 45.56 + -121.58 + 0 + 0 + PQR + + + CAZ528 + 55280 + Nrn_Salinas_Vly/Hollister_Vly_an + CA + US + 36.67 + -121.56 + 0 + 0 + MTR + + + CAZ014 + 50140 + Burney_Basin_/_Ern_Shasta_Cnty + CA + US + 40.88 + -121.52 + 0 + 0 + STO + + + WAZ518 + 475180 + W_Slopes_Nrn_Cascades_and_Passes + WA + US + 48.39 + -121.49 + 0 + 0 + SEW + + + CAZ517 + 55170 + Sta_Lucia_Mtns_and_Los_Padres_Na + CA + US + 36.19 + -121.39 + 0 + 0 + MTR + + + CAZ068 + 50680 + Wrn_Plumas_County/Lassen_Park + CA + US + 40.22 + -121.32 + 0 + 0 + STO + + + ORZ030 + 370300 + Nrn_and_Ern_Klamath_Cnty_and_Wrn + OR + US + 42.80 + -121.24 + 0 + 0 + MFR + + + ORZ042 + 370420 + North_Central_Oregon + OR + US + 45.04 + -121.10 + 0 + 0 + PDT + + + CAZ516 + 55160 + Srn_Salinas_Vly/Arroyo_Seco_and_ + CA + US + 36.09 + -121.09 + 0 + 0 + MTR + + + WAZ024 + 470240 + East_Columbia_River_Gorge + WA + US + 45.70 + -121.06 + 0 + 0 + PDT + + + ORZ041 + 370410 + East_Columbia_River_Gorge + OR + US + 45.64 + -121.02 + 0 + 0 + PDT + + + WAZ501 + 475010 + E_Slopes_of_the_Ctrl_Cascades + WA + US + 47.05 + -120.96 + 0 + 0 + PDT + + + ORZ043 + 370430 + Central_Oregon + OR + US + 44.00 + -120.95 + 0 + 0 + PDT + + + CAZ019 + 50190 + Northern_San_Joaquin_Valley + CA + US + 37.76 + -120.93 + 0 + 0 + STO + + + CAZ518 + 55180 + Mtns_Of_Sn_Benito_Cnty_And_Int_M + CA + US + 36.39 + -120.89 + 0 + 0 + MTR + + + CAZ034 + 50340 + San_Luis_Obispo_Cnty_Ctrl_Coast + CA + US + 35.35 + -120.78 + 0 + 0 + LOX + + + WAZ502 + 475020 + East_Slopes_of_the_Srn_Cascades + WA + US + 46.10 + -120.78 + 0 + 0 + PDT + + + CAZ085 + 50850 + Modoc_County + CA + US + 41.58 + -120.74 + 0 + 0 + MFR + + + CAZ067 + 50670 + Motherlode + CA + US + 38.63 + -120.71 + 0 + 0 + STO + + + CAZ071 + 50710 + Lassen-Ern_Plumas-Ern_Sierra_Cnt + CA + US + 40.31 + -120.66 + 0 + 0 + REV + + + WAZ027 + 470270 + Yakima_Valley + WA + US + 46.43 + -120.45 + 0 + 0 + PDT + + + CAZ035 + 50350 + Santa_Barbara_County_Ctrl_Coast + CA + US + 34.72 + -120.41 + 0 + 0 + LOX + + + CAZ089 + 50890 + West-Central_San_Joaquin_Valley + CA + US + 36.62 + -120.39 + 0 + 0 + HNX + + + WAZ026 + 470260 + Kittitas_Valley + WA + US + 47.00 + -120.39 + 0 + 0 + PDT + + + WAZ042 + 470420 + East_Slopes_Northern_Cascades + WA + US + 48.13 + -120.38 + 0 + 0 + OTX + + + CAZ069 + 50690 + West_Slope_Nrn_Sierra_Nevada + CA + US + 38.76 + -120.37 + 0 + 0 + STO + + + CAZ037 + 50370 + San_Luis_Obispo_Cnty_Int_Vlys + CA + US + 35.41 + -120.31 + 0 + 0 + LOX + + + ORZ031 + 370310 + Central_and_Eastern_Lake_County + OR + US + 42.80 + -120.24 + 0 + 0 + MFR + + + ORZ506 + 375060 + Ochoco-John_Day_Highlands + OR + US + 44.34 + -120.20 + 0 + 0 + PDT + + + WAZ041 + 470410 + Wenatchee_Area + WA + US + 47.61 + -120.18 + 0 + 0 + OTX + + + CAZ051 + 50510 + San_Luis_Obispo_County_Mtns + CA + US + 35.16 + -120.17 + 0 + 0 + LOX + + + CAZ036 + 50360 + Santa_Ynez_Valley + CA + US + 34.72 + -120.14 + 0 + 0 + LOX + + + CAZ070 + 50700 + Surprise_Valley_California + CA + US + 41.58 + -120.11 + 0 + 0 + REV + + + CAZ090 + 50900 + East-Central_San_Joaquin_Valley + CA + US + 37.11 + -120.11 + 0 + 0 + HNX + + + ORZ504 + 375040 + Nrn_Wheeler_and_Srn_Gilliam_Cnti + OR + US + 45.01 + -120.10 + 0 + 0 + PDT + + + CAZ072 + 50720 + Greater_Lake_Tahoe_Area + CA + US + 38.89 + -119.96 + 0 + 0 + REV + + + CAZ039 + 50390 + Santa_Barbara_County_S_Coast + CA + US + 34.45 + -119.95 + 0 + 0 + LOX + + + NVZ002 + 280020 + Greater_Lake_Tahoe_Area + NV + US + 39.19 + -119.90 + 0 + 0 + REV + + + CAZ052 + 50520 + Santa_Barbara_County_Mountains + CA + US + 34.77 + -119.88 + 0 + 0 + LOX + + + CAZ091 + 50910 + Southwestern_San_Joaquin_Valley + CA + US + 35.75 + -119.78 + 0 + 0 + HNX + + + CAZ038 + 50380 + Cuyama_Valley + CA + US + 34.96 + -119.77 + 0 + 0 + LOX + + + NVZ005 + 280050 + Northern_Washoe_County + NV + US + 41.01 + -119.65 + 0 + 0 + REV + + + ORZ044 + 370440 + Lower_Columbia_Basin + OR + US + 45.60 + -119.65 + 0 + 0 + PDT + + + WAZ044 + 470440 + Waterville_Plateau + WA + US + 47.68 + -119.65 + 0 + 0 + OTX + + + CAZ093 + 50930 + Mariposa_Madera_and_Fresno_Cnty_ + CA + US + 37.24 + -119.64 + 0 + 0 + HNX + + + NVZ003 + 280030 + Gter_Reno-Carson_Cty-Minden_Area + NV + US + 39.36 + -119.63 + 0 + 0 + REV + + + ORZ505 + 375050 + John_Day_Basin + OR + US + 44.63 + -119.49 + 0 + 0 + PDT + + + WAZ034 + 470340 + Moses_Lake_Area + WA + US + 47.03 + -119.48 + 0 + 0 + OTX + + + WAZ043 + 470430 + Okanogan_Valley + WA + US + 48.47 + -119.47 + 0 + 0 + OTX + + + WAZ028 + 470280 + Lower_Columbia_Basin + WA + US + 46.21 + -119.43 + 0 + 0 + PDT + + + CAZ044 + 50440 + Ventura_County_Interior_Valleys + CA + US + 34.44 + -119.25 + 0 + 0 + LOX + + + CAZ040 + 50400 + Ventura_County_Coast + CA + US + 34.22 + -119.19 + 0 + 0 + LOX + + + CAZ092 + 50920 + Southeastern_San_Joaquin_Valley + CA + US + 35.82 + -119.14 + 0 + 0 + HNX + + + CAZ096 + 50960 + Sierra_NV_fr_Yosemite_to_Kings_C + CA + US + 37.43 + -119.12 + 0 + 0 + HNX + + + CAZ053 + 50530 + Ventura_County_Mountains + CA + US + 34.65 + -119.10 + 0 + 0 + LOX + + + ORZ501 + 375010 + Foothills_of_the_Blue_Mountains + OR + US + 45.53 + -119.07 + 0 + 0 + PDT + + + ORZ061 + 370610 + Harney_County + OR + US + 43.01 + -119.06 + 0 + 0 + BOI + + + CAZ094 + 50940 + Tulare_County_Foothills + CA + US + 36.23 + -118.96 + 0 + 0 + HNX + + + WAZ035 + 470350 + Upper_Columbia_Basin + WA + US + 47.41 + -118.91 + 0 + 0 + OTX + + + ORZ503 + 375030 + Southern_Blue_Mtns_of_Oregon + OR + US + 45.23 + -118.88 + 0 + 0 + PDT + + + CAZ045 + 50450 + Ventura_County_Coastal_Valleys + CA + US + 34.23 + -118.87 + 0 + 0 + LOX + + + WAZ038 + 470380 + Okanogan_Highlands + WA + US + 48.42 + -118.75 + 0 + 0 + OTX + + + CAZ073 + 50730 + Mono + CA + US + 38.08 + -118.74 + 0 + 0 + REV + + + CAZ095 + 50950 + Kern_County_Mountains + CA + US + 35.30 + -118.71 + 0 + 0 + HNX + + + CAZ046 + 50460 + Santa_Monica_Mtns_Recnl_Area + CA + US + 34.09 + -118.58 + 0 + 0 + LOX + + + CAZ088 + 50880 + Santa_Clarita_Valley + CA + US + 34.46 + -118.55 + 0 + 0 + LOX + + + NVZ001 + 280010 + Mineral_and_Srn_Lyon_Counties + NV + US + 38.56 + -118.55 + 0 + 0 + REV + + + NVZ004 + 280040 + Wrn_NV_Bsn_and_Rng_including_Pyr + NV + US + 40.01 + -118.53 + 0 + 0 + REV + + + CAZ547 + 55470 + Los_Angeles_Cnty_Sn_Fernando_Vly + CA + US + 34.21 + -118.51 + 0 + 0 + LOX + + + CAZ097 + 50970 + Tulare_County_Mountains + CA + US + 36.27 + -118.48 + 0 + 0 + HNX + + + CAZ087 + 50870 + Catalina_Island + CA + US + 33.39 + -118.45 + 0 + 0 + LOX + + + CAZ054 + 50540 + Los_Angeles_Cnty_Mtns_excluding_ + CA + US + 34.48 + -118.26 + 0 + 0 + LOX + + + CAZ519 + 55190 + Ern_Sierra_Slopes_of_Inyo_Cnty + CA + US + 36.63 + -118.26 + 0 + 0 + VEF + + + CAZ041 + 50410 + Los_Angeles_Cnty_Cst_including_D + CA + US + 33.92 + -118.24 + 0 + 0 + LOX + + + CAZ059 + 50590 + Antelope_Valley + CA + US + 34.62 + -118.22 + 0 + 0 + LOX + + + ORZ502 + 375020 + Northern_Blue_Mtns_of_Oregon + OR + US + 45.65 + -118.19 + 0 + 0 + PDT + + + NVZ030 + 280300 + Humboldt_County + NV + US + 41.26 + -118.16 + 0 + 0 + LKN + + + WAZ029 + 470290 + Foothills_of_the_Blue_Mountains + WA + US + 46.31 + -118.16 + 0 + 0 + PDT + + + CAZ520 + 55200 + Owens_Valley + CA + US + 36.63 + -118.08 + 0 + 0 + VEF + + + CAZ521 + 55210 + White_Mountains_of_Inyo_County + CA + US + 36.92 + -118.00 + 0 + 0 + VEF + + + CAZ548 + 55480 + Los_Angeles_Cnty_Sn_Gabriel_Vly + CA + US + 34.05 + -117.96 + 0 + 0 + LOX + + + CAZ099 + 50990 + Southeastern_Kern_County_Desert + CA + US + 35.15 + -117.93 + 0 + 0 + HNX + + + WAZ030 + 470300 + Northwest_Blue_Mountains + WA + US + 46.17 + -117.87 + 0 + 0 + PDT + + + CAZ098 + 50980 + Indian_Wells_Valley + CA + US + 35.62 + -117.82 + 0 + 0 + HNX + + + CAZ042 + 50420 + Orange_County_Coastal_Areas + CA + US + 33.67 + -117.79 + 0 + 0 + SGX + + + WAZ037 + 470370 + Northeast_Mountains + WA + US + 48.36 + -117.71 + 0 + 0 + OTX + + + WAZ036 + 470360 + Spokane_Area + WA + US + 47.60 + -117.70 + 0 + 0 + OTX + + + ORZ049 + 370490 + Grande_Ronde_Valley + OR + US + 45.39 + -117.69 + 0 + 0 + PDT + + + ORZ062 + 370620 + Baker_County + OR + US + 44.66 + -117.65 + 0 + 0 + BOI + + + WAZ033 + 470330 + Washington_Palouse + WA + US + 46.89 + -117.64 + 0 + 0 + OTX + + + ORZ063 + 370630 + Malheur_County + OR + US + 43.21 + -117.62 + 0 + 0 + BOI + + + CAZ057 + 50570 + Santa_Ana_Mtns_and_Foothills + CA + US + 33.63 + -117.45 + 0 + 0 + SGX + + + WAZ031 + 470310 + Northeast_Blue_Mountains + WA + US + 46.21 + -117.37 + 0 + 0 + OTX + + + CAZ043 + 50430 + San_Diego_County_Coastal_Areas + CA + US + 33.00 + -117.28 + 0 + 0 + SGX + + + CAZ048 + 50480 + Sn_Bernardino_and_Rivside_Cnty_V + CA + US + 33.85 + -117.28 + 0 + 0 + SGX + + + ORZ050 + 370500 + Wallowa_County + OR + US + 45.54 + -117.17 + 0 + 0 + PDT + + + WAZ032 + 470320 + Lwr_Garfield_and_Asotin_Cnties + WA + US + 46.35 + -117.16 + 0 + 0 + OTX + + + NVZ014 + 280140 + Esmeralda_and_Ctrl_Nye_County + NV + US + 37.65 + -117.15 + 0 + 0 + VEF + + + CAZ055 + 50550 + San_Bernardino_County_Mountains + CA + US + 34.23 + -117.13 + 0 + 0 + SGX + + + ORZ064 + 370640 + Oregon_Lower_Treasure_Valley + OR + US + 44.02 + -117.11 + 0 + 0 + BOI + + + CAZ050 + 50500 + San_Diego_County_Valleys + CA + US + 33.03 + -117.06 + 0 + 0 + SGX + + + CAZ060 + 50600 + Apple_and_Lucerne_Valleys + CA + US + 34.43 + -117.03 + 0 + 0 + SGX + + + CAZ523 + 55230 + Western_Mojave_Desert + CA + US + 35.27 + -116.98 + 0 + 0 + VEF + + + IDZ003 + 120030 + Idaho_Palouse + ID + US + 46.96 + -116.96 + 0 + 0 + OTX + + + CAZ522 + 55220 + Death_Valley_National_Park + CA + US + 36.63 + -116.85 + 0 + 0 + VEF + + + IDZ002 + 120020 + Coeur_d'Alene_Area + ID + US + 47.62 + -116.83 + 0 + 0 + OTX + + + NVZ037 + 280370 + Srn_Lander_Cnty_and_Srn_Eureka_C + NV + US + 39.62 + -116.78 + 0 + 0 + LKN + + + NVZ036 + 280360 + Nrn_Lander_Cnty_and_Nrn_Eureka_C + NV + US + 40.51 + -116.76 + 0 + 0 + LKN + + + IDZ012 + 120120 + Lower_Treasure_Valley + ID + US + 43.82 + -116.75 + 0 + 0 + BOI + + + IDZ026 + 120260 + Lewiston_Area + ID + US + 46.47 + -116.71 + 0 + 0 + OTX + + + IDZ029 + 120290 + Owyhee_Mountains + ID + US + 43.07 + -116.70 + 0 + 0 + BOI + + + CAZ056 + 50560 + Riverside_County_Mountains + CA + US + 33.73 + -116.60 + 0 + 0 + SGX + + + NVZ013 + 280130 + Northern_Nye_County + NV + US + 38.60 + -116.59 + 0 + 0 + LKN + + + CAZ058 + 50580 + San_Diego_County_Mountains + CA + US + 33.00 + -116.57 + 0 + 0 + SGX + + + IDZ001 + 120010 + Northern_Panhandle + ID + US + 48.36 + -116.55 + 0 + 0 + OTX + + + IDZ027 + 120270 + Lewis_and_Srn_Nez_Perce_Cnties + ID + US + 46.16 + -116.51 + 0 + 0 + OTX + + + IDZ008 + 120080 + Lwr_Hells_Canyon/Salmon_Riv_Rgn + ID + US + 45.65 + -116.49 + 0 + 0 + MSO + + + CAZ061 + 50610 + Coachella_Valley + CA + US + 33.73 + -116.36 + 0 + 0 + SGX + + + CAZ062 + 50620 + San_Diego_County_Deserts + CA + US + 33.02 + -116.31 + 0 + 0 + SGX + + + CAZ525 + 55250 + Morongo_Basin + CA + US + 34.39 + -116.15 + 0 + 0 + VEF + + + NVZ017 + 280170 + Wrn_Clark_and_Srn_Nye_County + NV + US + 36.28 + -116.11 + 0 + 0 + VEF + + + IDZ015 + 120150 + Southwest_Highlands + ID + US + 42.51 + -116.02 + 0 + 0 + BOI + + + IDZ011 + 120110 + West_Central_Mountains + ID + US + 44.70 + -115.94 + 0 + 0 + BOI + + + IDZ004 + 120040 + Central_Panhandle_Mountains + ID + US + 47.34 + -115.93 + 0 + 0 + OTX + + + CAZ030 + 50300 + Joshua_Tree_National_Park + CA + US + 33.93 + -115.89 + 0 + 0 + PSR + + + IDZ007 + 120070 + Orofino/Grangeville_Region + ID + US + 46.24 + -115.85 + 0 + 0 + MSO + + + IDZ014 + 120140 + Upper_Treasure_Valley + ID + US + 43.16 + -115.77 + 0 + 0 + BOI + + + CAZ524 + 55240 + Ern_Mojave_Dsrt,_Incl_the_Mojave + CA + US + 35.17 + -115.61 + 0 + 0 + VEF + + + NVZ019 + 280190 + Spring_Mtns-Red_Rock_Canyon + NV + US + 36.13 + -115.57 + 0 + 0 + VEF + + + NVZ031 + 280310 + Northern_Elko_County + NV + US + 41.49 + -115.52 + 0 + 0 + LKN + + + IDZ005 + 120050 + Northern_Clearwater_Mountains + ID + US + 46.65 + -115.47 + 0 + 0 + MSO + + + CAZ033 + 50330 + Imperial_County + CA + US + 33.02 + -115.41 + 0 + 0 + PSR + + + IDZ013 + 120130 + Boise_Mountains + ID + US + 43.79 + -115.39 + 0 + 0 + BOI + + + CAZ032 + 50320 + Riverside_County/Ern_Deserts + CA + US + 33.75 + -115.33 + 0 + 0 + PSR + + + IDZ006 + 120060 + Southern_Clearwater_Mountains + ID + US + 45.88 + -115.33 + 0 + 0 + MSO + + + NVZ034 + 280340 + Ruby_Mtns/East_Humboldt_Range + NV + US + 40.56 + -115.33 + 0 + 0 + LKN + + + MTZ001 + 260010 + Kootenai/Cabinet_Region + MT + US + 48.18 + -115.15 + 0 + 0 + MSO + + + NVZ018 + 280180 + Sheep_Range + NV + US + 36.84 + -115.15 + 0 + 0 + VEF + + + NVZ020 + 280200 + Las_Vegas_Valley + NV + US + 36.11 + -115.12 + 0 + 0 + VEF + + + NVZ022 + 280220 + Southern_Clark_County + NV + US + 35.50 + -115.09 + 0 + 0 + VEF + + + CAZ526 + 55260 + Cadiz_Basin + CA + US + 34.45 + -115.08 + 0 + 0 + VEF + + + MTZ004 + 260040 + Lower_Clark_Fork_Region + MT + US + 47.38 + -115.02 + 0 + 0 + MSO + + + NVZ035 + 280350 + White_Pine_County + NV + US + 39.40 + -114.97 + 0 + 0 + LKN + + + NVZ015 + 280150 + Lincoln_County + NV + US + 37.76 + -114.96 + 0 + 0 + VEF + + + IDZ028 + 120280 + Camas_Prairie + ID + US + 43.34 + -114.86 + 0 + 0 + BOI + + + NVZ032 + 280320 + SW_and_South_Ctrl_Elko_County + NV + US + 40.64 + -114.83 + 0 + 0 + LKN + + + CAZ031 + 50310 + Lower_Colorado_River_Valley_CA + CA + US + 33.39 + -114.79 + 0 + 0 + PSR + + + NVZ021 + 280210 + L_Mead_National_Recreation_Area + NV + US + 35.79 + -114.78 + 0 + 0 + VEF + + + IDZ030 + 120300 + Southern_Twin__Falls_County + ID + US + 42.26 + -114.65 + 0 + 0 + BOI + + + AZZ036 + 30360 + L_Mead_National_Recreation_Area + AZ + US + 35.67 + -114.61 + 0 + 0 + VEF + + + AZZ025 + 30250 + Yuma/Martinez_Lake_and_Vicinity + AZ + US + 32.69 + -114.58 + 0 + 0 + PSR + + + NVZ016 + 280160 + Northeast_Clark_County + NV + US + 36.55 + -114.53 + 0 + 0 + VEF + + + IDZ016 + 120160 + Western_Magic_Valley + ID + US + 42.80 + -114.50 + 0 + 0 + BOI + + + IDZ018 + 120180 + Sawtooth_Mountains + ID + US + 44.18 + -114.49 + 0 + 0 + PIH + + + CAZ527 + 55270 + Sn_Bernardino_Cnty-Upr_CO_Riv_Vl + CA + US + 34.58 + -114.44 + 0 + 0 + VEF + + + AZZ020 + 30200 + Lower_Colorado_River_Valley_AZ + AZ + US + 33.65 + -114.43 + 0 + 0 + PSR + + + IDZ009 + 120090 + Western_Lemhi_County + ID + US + 45.10 + -114.39 + 0 + 0 + MSO + + + AZZ002 + 30020 + Lake_Havasu_and_Fort_Mohave + AZ + US + 34.63 + -114.37 + 0 + 0 + VEF + + + MTZ003 + 260030 + Flathead/Mission_Valleys + MT + US + 47.82 + -114.31 + 0 + 0 + MSO + + + IDZ031 + 120310 + Big_and_Little_Wood_River_Rgn + ID + US + 43.59 + -114.29 + 0 + 0 + PIH + + + NVZ033 + 280330 + Extreme_Eastern_Elko_County + NV + US + 40.64 + -114.23 + 0 + 0 + LKN + + + MTZ005 + 260050 + Missoula/Bitterroot_Valleys + MT + US + 46.44 + -114.10 + 0 + 0 + MSO + + + MTZ006 + 260060 + Bitterroot/Sapphire_Mountains + MT + US + 46.16 + -113.95 + 0 + 0 + MSO + + + MTZ002 + 260020 + West_Glacier_Region + MT + US + 48.30 + -113.94 + 0 + 0 + MSO + + + AZZ003 + 30030 + Northwest_Deserts + AZ + US + 35.14 + -113.92 + 0 + 0 + VEF + + + AZZ021 + 30210 + West_Central_Deserts + AZ + US + 33.86 + -113.90 + 0 + 0 + PSR + + + AZZ026 + 30260 + Southwest_Deserts + AZ + US + 32.75 + -113.90 + 0 + 0 + PSR + + + IDZ017 + 120170 + Eastern_Magic_Valley + ID + US + 42.94 + -113.79 + 0 + 0 + PIH + + + MTZ043 + 260430 + Potomac/Seeley_Lake_Region + MT + US + 47.12 + -113.60 + 0 + 0 + MSO + + + IDZ032 + 120320 + Lost_River/Pashimeroi + ID + US + 44.17 + -113.54 + 0 + 0 + PIH + + + IDZ010 + 120100 + Eastern_Lemhi_County + ID + US + 44.96 + -113.48 + 0 + 0 + MSO + + + UTZ019 + 440190 + Utah's_Dixie_and_Zion_Natl_Pk + UT + US + 37.20 + -113.47 + 0 + 0 + SLC + + + UTZ016 + 440160 + Southwest_Utah + UT + US + 37.98 + -113.33 + 0 + 0 + SLC + + + AZZ001 + 30010 + Northwest_Plateau + AZ + US + 36.49 + -113.28 + 0 + 0 + VEF + + + IDZ022 + 120220 + South_Central_Highlands + ID + US + 42.39 + -113.17 + 0 + 0 + PIH + + + MTZ009 + 260090 + Northern_Rocky_Mountain_Front + MT + US + 48.56 + -113.12 + 0 + 0 + TFX + + + AZZ037 + 30370 + Yavapai_County_Vlys_and_Basins + AZ + US + 34.56 + -113.07 + 0 + 0 + FGZ + + + UTZ005 + 440050 + Great_Salt_Lake_Desert_and_Mtns + UT + US + 40.95 + -113.00 + 0 + 0 + SLC + + + UTZ015 + 440150 + West_Central_Utah + UT + US + 39.29 + -112.99 + 0 + 0 + SLC + + + AZZ008 + 30080 + Yavapai_County__Mountains + AZ + US + 34.82 + -112.97 + 0 + 0 + FGZ + + + AZZ031 + 30310 + Western_Pima_County + AZ + US + 32.14 + -112.87 + 0 + 0 + TWC + + + MTZ007 + 260070 + Butte/Blackfoot_Region + MT + US + 46.40 + -112.84 + 0 + 0 + MSO + + + AZZ027 + 30270 + Southwest_Maricopa_County + AZ + US + 32.94 + -112.77 + 0 + 0 + PSR + + + AZZ022 + 30220 + Northwest_Maricopa_County + AZ + US + 33.67 + -112.70 + 0 + 0 + PSR + + + MTZ008 + 260080 + Beaverhead + MT + US + 45.15 + -112.69 + 0 + 0 + TFX + + + MTZ010 + 260100 + Eastern_Glacier + MT + US + 48.65 + -112.67 + 0 + 0 + TFX + + + IDZ020 + 120200 + Upper_Snake_River_Plain + ID + US + 43.66 + -112.62 + 0 + 0 + PIH + + + MTZ048 + 260480 + Southern_Rocky_Mountain_Front + MT + US + 47.73 + -112.60 + 0 + 0 + TFX + + + IDZ021 + 120210 + Lower_Snake_River_Plain + ID + US + 42.94 + -112.55 + 0 + 0 + PIH + + + AZZ007 + 30070 + Coconino_Plateau + AZ + US + 35.71 + -112.43 + 0 + 0 + FGZ + + + UTZ003 + 440030 + Salt_Lake_and_Tooele_Valleys + UT + US + 40.45 + -112.42 + 0 + 0 + SLC + + + UTZ518 + 445180 + Southern_Utah_Mountains + UT + US + 37.79 + -112.33 + 0 + 0 + SLC + + + AZZ006 + 30060 + Grand_Canyon_Country + AZ + US + 36.22 + -112.32 + 0 + 0 + FGZ + + + MTZ014 + 260140 + Central_and_Srn_Lewis_and_Clark + MT + US + 46.87 + -112.28 + 0 + 0 + TFX + + + UTZ002 + 440020 + Northern_Wasatch_Front + UT + US + 41.39 + -112.16 + 0 + 0 + SLC + + + AZZ004 + 30040 + Kaibab_Plateau + AZ + US + 36.56 + -112.14 + 0 + 0 + FGZ + + + MTZ052 + 260520 + Jefferson + MT + US + 46.15 + -112.13 + 0 + 0 + TFX + + + AZZ023 + 30230 + Greater_Phoenix_Area + AZ + US + 33.57 + -112.09 + 0 + 0 + PSR + + + UTZ020 + 440200 + South_Central_Utah + UT + US + 37.50 + -112.04 + 0 + 0 + SLC + + + MTZ015 + 260150 + Madison + MT + US + 45.28 + -112.02 + 0 + 0 + TFX + + + IDZ019 + 120190 + Upper_Snake_Highlands + ID + US + 44.13 + -112.01 + 0 + 0 + PIH + + + MTZ046 + 260460 + Eastern_Pondera + MT + US + 48.23 + -112.00 + 0 + 0 + TFX + + + IDZ024 + 120240 + Cache_Valley/Idaho_Portion + ID + US + 42.14 + -111.94 + 0 + 0 + PIH + + + UTZ001 + 440010 + Cache_Valley/Utah_Portion + UT + US + 41.73 + -111.93 + 0 + 0 + SLC + + + AZZ038 + 30380 + Oak_Creek_and_Sycamore_Canyons + AZ + US + 34.93 + -111.89 + 0 + 0 + FGZ + + + AZZ005 + 30050 + Marble_and_Glen_Canyons + AZ + US + 36.63 + -111.87 + 0 + 0 + FGZ + + + UTZ004 + 440040 + Southern_Wasatch_Front + UT + US + 40.01 + -111.87 + 0 + 0 + SLC + + + UTZ014 + 440140 + Sanpete/Sevier_Valleys + UT + US + 39.17 + -111.84 + 0 + 0 + SLC + + + AZZ032 + 30320 + Tohono_Oodham_Nation + AZ + US + 31.98 + -111.83 + 0 + 0 + TWC + + + AZZ015 + 30150 + Western_Mogollon_Rim + AZ + US + 35.20 + -111.80 + 0 + 0 + FGZ + + + MTZ049 + 260490 + Eastern_Teton + MT + US + 47.80 + -111.80 + 0 + 0 + TFX + + + IDZ023 + 120230 + Caribou_Highlands + ID + US + 42.94 + -111.78 + 0 + 0 + PIH + + + MTZ044 + 260440 + Toole + MT + US + 48.60 + -111.74 + 0 + 0 + TFX + + + AZZ028 + 30280 + NW_and_North_Ctrl_Pinal_County + AZ + US + 33.08 + -111.67 + 0 + 0 + PSR + + + UTZ007 + 440070 + Wasatch_Mountains_I-80_North + UT + US + 41.36 + -111.61 + 0 + 0 + SLC + + + IDZ025 + 120250 + Wasatch_Mountains/Idaho_Portion + ID + US + 42.30 + -111.47 + 0 + 0 + PIH + + + UTZ008 + 440080 + Wasatch_Mountains_South_of_I-80 + UT + US + 40.17 + -111.45 + 0 + 0 + SLC + + + UTZ517 + 445170 + Central_Utah_Mountains + UT + US + 39.02 + -111.44 + 0 + 0 + SLC + + + MTZ053 + 260530 + Broadwater + MT + US + 46.31 + -111.42 + 0 + 0 + TFX + + + UTZ006 + 440060 + Wasatch_Mountain_Valleys + UT + US + 40.86 + -111.39 + 0 + 0 + SLC + + + MTZ012 + 260120 + Cascade + MT + US + 47.26 + -111.34 + 0 + 0 + TFX + + + AZZ029 + 30290 + Southeast_Pinal_County + AZ + US + 32.88 + -111.33 + 0 + 0 + TWC + + + MTZ055 + 260550 + Gallatin + MT + US + 45.34 + -111.29 + 0 + 0 + TFX + + + AZZ012 + 30120 + Ltl_CO_Riv_Vly_in_Coconino_Cnty + AZ + US + 35.44 + -111.25 + 0 + 0 + FGZ + + + MTZ045 + 260450 + Liberty + MT + US + 48.56 + -111.08 + 0 + 0 + TFX + + + AZZ024 + 30240 + Srn_Gila/Tonto_NF_Foothills + AZ + US + 33.51 + -111.03 + 0 + 0 + PSR + + + MTZ054 + 260540 + Meagher + MT + US + 46.63 + -110.97 + 0 + 0 + TFX + + + WYZ023 + 500230 + Star_Valley + WY + US + 42.89 + -110.96 + 0 + 0 + RIW + + + AZZ009 + 30090 + NE_Plateaus_and_Mesas_Hwy_264_Nw + AZ + US + 36.39 + -110.92 + 0 + 0 + FGZ + + + AZZ033 + 30330 + Tucson_Metro/Marana/Grn_Valley + AZ + US + 32.13 + -110.92 + 0 + 0 + TWC + + + AZZ034 + 30340 + Santa_Cruz_County + AZ + US + 31.54 + -110.91 + 0 + 0 + TWC + + + AZZ018 + 30180 + Northern_Gila_County + AZ + US + 34.06 + -110.85 + 0 + 0 + FGZ + + + UTZ012 + 440120 + Castle_Country + UT + US + 39.29 + -110.85 + 0 + 0 + SLC + + + AZZ016 + 30160 + Eastern_Mogollon_Rim + AZ + US + 34.49 + -110.77 + 0 + 0 + FGZ + + + MTZ064 + 260640 + Paradise_Valley + MT + US + 45.33 + -110.73 + 0 + 0 + BYZ + + + UTZ010 + 440100 + Wasatch_Plateau/Book_Cliffs + UT + US + 39.76 + -110.73 + 0 + 0 + SLC + + + UTZ009 + 440090 + Western_Uinta_Mountains + UT + US + 40.70 + -110.70 + 0 + 0 + SLC + + + UTZ021 + 440210 + Glen_Canyon_Rec_Area/L_Powell + UT + US + 37.54 + -110.70 + 0 + 0 + SLC + + + WYZ024 + 500240 + Salt_River_and_Wyoming_Ranges + WY + US + 42.55 + -110.65 + 0 + 0 + RIW + + + UTZ013 + 440130 + San_Rafael_Swell + UT + US + 38.54 + -110.64 + 0 + 0 + SLC + + + WYZ013 + 500130 + Jackson_Hole + WY + US + 43.63 + -110.62 + 0 + 0 + RIW + + + MTZ040 + 260400 + Northern_Park + MT + US + 45.98 + -110.55 + 0 + 0 + BYZ + + + WYZ012 + 500120 + Teton_and_Gros_Ventre_Mountains + WY + US + 43.64 + -110.55 + 0 + 0 + RIW + + + WYZ021 + 500210 + Southwest_Wyoming + WY + US + 41.29 + -110.55 + 0 + 0 + SLC + + + WYZ027 + 500270 + South_Lincoln_County + WY + US + 41.93 + -110.55 + 0 + 0 + RIW + + + MTZ065 + 260650 + Livingston_Area + MT + US + 45.65 + -110.51 + 0 + 0 + BYZ + + + WYZ001 + 500010 + Yellowstone_National_Park + WY + US + 44.62 + -110.49 + 0 + 0 + RIW + + + MTZ013 + 260130 + Chouteau + MT + US + 47.86 + -110.48 + 0 + 0 + TFX + + + UTZ011 + 440110 + Western_Uinta_Basin + UT + US + 40.22 + -110.46 + 0 + 0 + SLC + + + MTZ068 + 260680 + Crazy_Mountains + MT + US + 46.10 + -110.32 + 0 + 0 + BYZ + + + AZZ040 + 30400 + NE_Plateaus_and_Mesas_S_of_Hwy_2 + AZ + US + 35.52 + -110.30 + 0 + 0 + FGZ + + + AZZ013 + 30130 + Ltl_CO_Riv_Vly_in_Navajo_Cnty + AZ + US + 34.88 + -110.29 + 0 + 0 + FGZ + + + MTZ050 + 260500 + Judith_Basin + MT + US + 47.05 + -110.27 + 0 + 0 + TFX + + + AZZ039 + 30390 + Black_Mesa_Area + AZ + US + 36.37 + -110.25 + 0 + 0 + FGZ + + + MTZ067 + 260670 + Absaroka/Beartooth_Mountains + MT + US + 45.33 + -110.13 + 0 + 0 + BYZ + + + MTZ011 + 260110 + Hill + MT + US + 48.57 + -110.11 + 0 + 0 + TFX + + + UTZ029 + 440290 + Canyonlands/Natural_Bridges + UT + US + 37.87 + -110.03 + 0 + 0 + GJT + + + WYZ025 + 500250 + Upper_Grn_River_Basin_Foothills + WY + US + 42.98 + -110.03 + 0 + 0 + RIW + + + MTZ041 + 260410 + Northern_Sweet_Grass + MT + US + 45.93 + -109.86 + 0 + 0 + BYZ + + + MTZ028 + 260280 + Southern_Wheatland + MT + US + 46.38 + -109.84 + 0 + 0 + BYZ + + + MTZ066 + 260660 + Beartooth_Foothills + MT + US + 45.54 + -109.81 + 0 + 0 + BYZ + + + AZZ010 + 30100 + Chinle_Valley + AZ + US + 36.36 + -109.76 + 0 + 0 + FGZ + + + AZZ030 + 30300 + Upper_Gila_River_Valley + AZ + US + 33.05 + -109.75 + 0 + 0 + TWC + + + AZZ035 + 30350 + Cochise_County + AZ + US + 31.89 + -109.75 + 0 + 0 + TWC + + + WYZ014 + 500140 + Wind_River_Mountains_West + WY + US + 43.00 + -109.70 + 0 + 0 + RIW + + + WYZ026 + 500260 + Upper_Green_River_Basin + WY + US + 42.42 + -109.68 + 0 + 0 + RIW + + + AZZ017 + 30170 + White_Mountains + AZ + US + 33.89 + -109.65 + 0 + 0 + FGZ + + + MTZ063 + 260630 + Judith_Gap + MT + US + 46.65 + -109.65 + 0 + 0 + BYZ + + + UTZ027 + 440270 + Arches/Grand_Flat + UT + US + 38.95 + -109.61 + 0 + 0 + GJT + + + WYZ028 + 500280 + Rock_Springs_and_Green_River + WY + US + 41.51 + -109.60 + 0 + 0 + RIW + + + UTZ025 + 440250 + Tavaputs_Plateau + UT + US + 39.50 + -109.58 + 0 + 0 + GJT + + + UTZ028 + 440280 + La_Sal_and_Abajo_Mountains + UT + US + 38.15 + -109.53 + 0 + 0 + GJT + + + UTZ023 + 440230 + Eastern_Uinta_Mountains + UT + US + 40.68 + -109.52 + 0 + 0 + GJT + + + UTZ024 + 440240 + Eastern_Uinta_Basin + UT + US + 40.21 + -109.51 + 0 + 0 + GJT + + + WYZ002 + 500020 + Absaroka_Mountains + WY + US + 44.24 + -109.49 + 0 + 0 + RIW + + + AZZ014 + 30140 + Ltl_CO_Riv_Vly_in_Apache_Cnty + AZ + US + 34.58 + -109.45 + 0 + 0 + FGZ + + + UTZ022 + 440220 + Southeast_Utah + UT + US + 37.40 + -109.45 + 0 + 0 + GJT + + + WYZ029 + 500290 + Flaming_Gorge + WY + US + 41.25 + -109.42 + 0 + 0 + RIW + + + WYZ016 + 500160 + Upper_Wind_River_Basin + WY + US + 43.44 + -109.41 + 0 + 0 + RIW + + + MTZ056 + 260560 + Red_Lodge_Foothills + MT + US + 45.23 + -109.32 + 0 + 0 + BYZ + + + AZZ011 + 30110 + Chuska_Mtns_and_Defiance_Plateay + AZ + US + 35.98 + -109.31 + 0 + 0 + FGZ + + + WYZ015 + 500150 + Wind_River_Mountains_East + WY + US + 43.09 + -109.31 + 0 + 0 + RIW + + + AZZ019 + 30190 + Northern_Greenlee + AZ + US + 33.42 + -109.27 + 0 + 0 + TWC + + + MTZ051 + 260510 + Fergus + MT + US + 47.25 + -109.26 + 0 + 0 + TFX + + + MTZ042 + 260420 + Golden_Valley + MT + US + 46.36 + -109.22 + 0 + 0 + BYZ + + + MTZ034 + 260340 + Northern_Stillwater + MT + US + 45.78 + -109.21 + 0 + 0 + BYZ + + + WYZ003 + 500030 + Cody_Foothills + WY + US + 44.46 + -109.04 + 0 + 0 + RIW + + + MTZ047 + 260470 + Blaine + MT + US + 48.37 + -108.90 + 0 + 0 + TFX + + + MTZ039 + 260390 + Eastern_Carbon + MT + US + 45.32 + -108.71 + 0 + 0 + BYZ + + + COZ006 + 60060 + Grand_Valley + CO + US + 39.16 + -108.65 + 0 + 0 + GJT + + + COZ021 + 60210 + Four_Corners/Upper_Dolores_Riv + CO + US + 37.49 + -108.64 + 0 + 0 + GJT + + + NMZ030 + 310300 + Southwest_Desert/Bootheel + NM + US + 31.93 + -108.63 + 0 + 0 + EPZ + + + COZ020 + 60200 + Paradox_Vly/Little_Dolores_Riv + CO + US + 38.28 + -108.61 + 0 + 0 + GJT + + + WYZ007 + 500070 + Owl_Creek_and_Bridger_Mountains + WY + US + 43.62 + -108.61 + 0 + 0 + RIW + + + WYZ018 + 500180 + Lander_Foothills + WY + US + 42.81 + -108.61 + 0 + 0 + RIW + + + MTZ060 + 260600 + Southwest_Phillips + MT + US + 47.83 + -108.55 + 0 + 0 + GGW + + + COZ001 + 60010 + Lower_Yampa_River_Basin + CO + US + 40.30 + -108.49 + 0 + 0 + GJT + + + COZ003 + 60030 + Roan_and_Tavaputs_Plateaus + CO + US + 39.63 + -108.44 + 0 + 0 + GJT + + + MTZ029 + 260290 + Musselshell + MT + US + 46.44 + -108.40 + 0 + 0 + BYZ + + + WYZ030 + 500300 + East_Sweetwater_County + WY + US + 41.61 + -108.37 + 0 + 0 + RIW + + + COZ017 + 60170 + Uncompahgre_Plateau/Dallas_Divid + CO + US + 38.58 + -108.35 + 0 + 0 + GJT + + + WYZ017 + 500170 + Wind_River_Basin + WY + US + 43.13 + -108.34 + 0 + 0 + RIW + + + MTZ021 + 260210 + Petroleum + MT + US + 47.18 + -108.28 + 0 + 0 + GGW + + + WYZ005 + 500050 + Southwest_Big_Horn_Basin + WY + US + 43.81 + -108.25 + 0 + 0 + RIW + + + NMZ001 + 310010 + Northwest_Plateau + NM + US + 36.35 + -108.23 + 0 + 0 + ABQ + + + MTZ035 + 260350 + Yellowstone + MT + US + 45.98 + -108.20 + 0 + 0 + BYZ + + + WYZ004 + 500040 + North_Big_Horn_Basin + WY + US + 44.57 + -108.19 + 0 + 0 + RIW + + + NMZ022 + 310220 + SW_Mtns/Lower_Gila_Region + NM + US + 33.00 + -108.17 + 0 + 0 + EPZ + + + NMZ014 + 310140 + SW_Mtns/Upper_Gila_Region + NM + US + 33.77 + -108.13 + 0 + 0 + ABQ + + + NMZ008 + 310080 + West_Central_Mountains + NM + US + 35.06 + -108.09 + 0 + 0 + ABQ + + + COZ007 + 60070 + Debeque_to_Silt_Corridor + CO + US + 39.43 + -108.05 + 0 + 0 + GJT + + + WYZ019 + 500190 + Grn_Mtns_and_Rattlesnake_Range + WY + US + 42.40 + -107.96 + 0 + 0 + RIW + + + COZ011 + 60110 + Ctrl_Gunnison_and_Uncompahgre_Ri + CO + US + 38.64 + -107.94 + 0 + 0 + GJT + + + COZ022 + 60220 + Animas_River_Basin + CO + US + 37.25 + -107.92 + 0 + 0 + GJT + + + WYZ006 + 500060 + Southeast_Big_Horn_Basin + WY + US + 43.87 + -107.90 + 0 + 0 + RIW + + + COZ002 + 60020 + Central_Yampa_River_Basin + CO + US + 40.34 + -107.85 + 0 + 0 + GJT + + + COZ009 + 60090 + Grand_and_Battlement_Mesas + CO + US + 39.17 + -107.85 + 0 + 0 + GJT + + + MTZ016 + 260160 + Central_and_Southeast_Phillips + MT + US + 48.02 + -107.82 + 0 + 0 + GGW + + + MTZ059 + 260590 + Northern_Phillips + MT + US + 48.79 + -107.75 + 0 + 0 + GGW + + + NMZ031 + 310310 + Southwest_Desert/Mimbres_Basin + NM + US + 32.20 + -107.75 + 0 + 0 + EPZ + + + COZ018 + 60180 + Northwestern_San_Juan_Mountains + CO + US + 38.08 + -107.64 + 0 + 0 + GJT + + + COZ019 + 60190 + Southwest_San_Juan_Mountains + CO + US + 37.48 + -107.64 + 0 + 0 + GJT + + + COZ013 + 60130 + Flattops + CO + US + 39.98 + -107.53 + 0 + 0 + GJT + + + MTZ038 + 260380 + Southern_Big_Horn + MT + US + 45.26 + -107.48 + 0 + 0 + BYZ + + + WYZ098 + 500980 + Northeast_Big_Horn_Mountains + WY + US + 44.78 + -107.43 + 0 + 0 + BYZ + + + MTZ057 + 260570 + Northern_Big_Horn + MT + US + 45.78 + -107.40 + 0 + 0 + BYZ + + + MTZ030 + 260300 + Treasure + MT + US + 46.18 + -107.34 + 0 + 0 + BYZ + + + COZ023 + 60230 + San_Juan_River_Basin + CO + US + 37.20 + -107.30 + 0 + 0 + GJT + + + WYZ008 + 500080 + Bighorn_Mountains_West + WY + US + 44.21 + -107.28 + 0 + 0 + RIW + + + WYZ061 + 500610 + Southwest_Carbon + WY + US + 41.53 + -107.28 + 0 + 0 + CYS + + + COZ014 + 60140 + Upper_Gunnison_River_Valley + CO + US + 38.51 + -107.17 + 0 + 0 + GJT + + + NMZ002 + 310020 + Northwest_Mtns_including_Jemez + NM + US + 36.16 + -107.10 + 0 + 0 + ABQ + + + WYZ009 + 500090 + Bighorn_Mountains_Southeast + WY + US + 43.88 + -107.07 + 0 + 0 + RIW + + + MTZ022 + 260220 + Garfield + MT + US + 47.41 + -107.03 + 0 + 0 + GGW + + + COZ008 + 60080 + Central_Colorado_River_Basin + CO + US + 39.60 + -106.99 + 0 + 0 + GJT + + + MTZ031 + 260310 + Northern_Rosebud + MT + US + 46.27 + -106.99 + 0 + 0 + BYZ + + + NMZ023 + 310230 + Sierra_County_Lakes_Region + NM + US + 33.04 + -106.97 + 0 + 0 + EPZ + + + COZ005 + 60050 + Upper_Yampa_River_Basin + CO + US + 40.41 + -106.96 + 0 + 0 + GJT + + + COZ012 + 60120 + West_Elk_and_Sawatch_Mountains + CO + US + 38.84 + -106.93 + 0 + 0 + GJT + + + COZ010 + 60100 + Gore_and_Elk_Mtns/Ctrl_Mtn_Vlys + CO + US + 39.45 + -106.92 + 0 + 0 + GJT + + + NMZ032 + 310320 + Southern_Desert + NM + US + 32.37 + -106.87 + 0 + 0 + EPZ + + + NMZ015 + 310150 + Lower_Rio_Grande_Valley + NM + US + 34.03 + -106.86 + 0 + 0 + ABQ + + + NMZ009 + 310090 + Middle_Rio_Gnde_Vly/Albuquerque_ + NM + US + 34.90 + -106.85 + 0 + 0 + ABQ + + + WYZ062 + 500620 + North_Carbon + WY + US + 42.03 + -106.80 + 0 + 0 + CYS + + + WYZ020 + 500200 + Natrona_County_Lower_Elevations + WY + US + 42.97 + -106.79 + 0 + 0 + RIW + + + WYZ099 + 500990 + Sheridan_Foothills + WY + US + 44.78 + -106.77 + 0 + 0 + BYZ + + + COZ004 + 60040 + Elkhead_and_Park_Mountains + CO + US + 40.46 + -106.73 + 0 + 0 + GJT + + + COZ066 + 60660 + La_Garita_Mtns_Above_10000_Ft + CO + US + 38.05 + -106.72 + 0 + 0 + PUB + + + COZ064 + 60640 + Saguache_Cnty_W_of_Continental_D + CO + US + 38.24 + -106.64 + 0 + 0 + PUB + + + COZ031 + 60310 + W_Jackson_and_W_Gnd_Cnties_Above + CO + US + 40.48 + -106.62 + 0 + 0 + BOU + + + MTZ017 + 260170 + Central_and_Southern_Valley + MT + US + 48.12 + -106.62 + 0 + 0 + GGW + + + MTZ061 + 260610 + Northern_Valley + MT + US + 48.79 + -106.62 + 0 + 0 + GGW + + + COZ068 + 60680 + Ern_Sn_Juan_Mtns_Above_10000_Ft + CO + US + 37.40 + -106.61 + 0 + 0 + PUB + + + MTZ058 + 260580 + Southern_Rosebud + MT + US + 45.43 + -106.50 + 0 + 0 + BYZ + + + WYZ011 + 500110 + Southeast_Johnson_County + WY + US + 43.83 + -106.48 + 0 + 0 + RIW + + + WYZ010 + 500100 + Northeast_Johnson_County + WY + US + 44.36 + -106.46 + 0 + 0 + RIW + + + NMZ010 + 310100 + Sandia/Manzano_Mountains + NM + US + 34.76 + -106.40 + 0 + 0 + ABQ + + + COZ060 + 60600 + Ern_Sawatch_Mtns_Above_11000_Ft + CO + US + 38.81 + -106.39 + 0 + 0 + PUB + + + COZ059 + 60590 + Leadvl_Vic/L_Cnty_Below_11000_Ft + CO + US + 39.20 + -106.38 + 0 + 0 + PUB + + + WYZ063 + 500630 + Snowy_Range + WY + US + 41.39 + -106.37 + 0 + 0 + CYS + + + COZ065 + 60650 + Saguache_Cnty_E_of_Continental_D + CO + US + 38.07 + -106.36 + 0 + 0 + PUB + + + TXZ055 + 430550 + El_Paso + TX + US + 31.70 + -106.30 + 0 + 0 + EPZ + + + COZ030 + 60300 + Jackson_County_Below_9000_Feet + CO + US + 40.69 + -106.28 + 0 + 0 + BOU + + + WYZ022 + 500220 + Casper_Mountain + WY + US + 42.61 + -106.24 + 0 + 0 + RIW + + + COZ067 + 60670 + Upr_Rio_Gnde_Vly/Ern_Sn_Juan_Mtn + CO + US + 37.45 + -106.23 + 0 + 0 + PUB + + + COZ058 + 60580 + Wrn_Mosquito_Rng/E_L_Cnty_Above_ + CO + US + 39.21 + -106.21 + 0 + 0 + PUB + + + COZ061 + 60610 + Wrn_Chaffee_Cnty_Between_9000_an + CO + US + 38.74 + -106.20 + 0 + 0 + PUB + + + NMZ024 + 310240 + Tularosa_Basin/Southern_Desert + NM + US + 32.70 + -106.18 + 0 + 0 + EPZ + + + COZ032 + 60320 + Gnd_and_Summit_Cnties_Below_9000 + CO + US + 40.00 + -106.17 + 0 + 0 + BOU + + + COZ062 + 60620 + Ctrl_Chaffee_Cnty_Below_9000_Ft + CO + US + 38.74 + -106.12 + 0 + 0 + PUB + + + NMZ003 + 310030 + Upper_Rio_Grande_Valley + NM + US + 35.80 + -106.07 + 0 + 0 + ABQ + + + COZ069 + 60690 + Del_Norte_Vic/Nrn_Sn_Luis_Vly_Be + CO + US + 37.97 + -106.04 + 0 + 0 + PUB + + + COZ063 + 60630 + Wrn_Mosquito_Rng/E_Chaffee_Cnty_ + CO + US + 38.79 + -105.96 + 0 + 0 + PUB + + + COZ033 + 60330 + S_and_E_Jackson/Larimer/N_and_NE + CO + US + 40.55 + -105.94 + 0 + 0 + BOU + + + COZ034 + 60340 + S_and_SE_Gnd/W_Ctrl_and_SW_Bould + CO + US + 39.55 + -105.91 + 0 + 0 + BOU + + + COZ070 + 60700 + Alamosa_Vic/Ctrl_Sn_Luis_Vly_Bel + CO + US + 37.54 + -105.91 + 0 + 0 + PUB + + + NMZ011 + 310110 + Ctrl_Hi_Plains/Estancia_Valley + NM + US + 34.77 + -105.83 + 0 + 0 + ABQ + + + MTZ023 + 260230 + McCone + MT + US + 47.59 + -105.82 + 0 + 0 + GGW + + + WYZ065 + 500650 + Laramie_Valley + WY + US + 41.59 + -105.81 + 0 + 0 + CYS + + + COZ071 + 60710 + Southern_San_Luis_Valley + CO + US + 37.27 + -105.78 + 0 + 0 + PUB + + + WYZ064 + 500640 + North_Laramie_Range + WY + US + 42.32 + -105.68 + 0 + 0 + CYS + + + COZ037 + 60370 + Central_and_SE_Park_County + CO + US + 39.05 + -105.66 + 0 + 0 + BOU + + + COZ077 + 60770 + Wrn/Ctrl_Fremt_Cnty_Below_8500_F + CO + US + 38.46 + -105.63 + 0 + 0 + PUB + + + MTZ036 + 260360 + Powder_River + MT + US + 45.40 + -105.63 + 0 + 0 + BYZ + + + NMZ025 + 310250 + Southern_Sacramento_Mountains + NM + US + 32.91 + -105.63 + 0 + 0 + EPZ + + + COZ076 + 60760 + NWrn_Fremt_County_above_8500_Ft + CO + US + 38.55 + -105.61 + 0 + 0 + PUB + + + COZ073 + 60730 + Nrn_Sngre_De_Cristo_Mtns_Above_1 + CO + US + 38.00 + -105.59 + 0 + 0 + PUB + + + NMZ017 + 310170 + Capitan/Nrn_Sacramento_Mtns + NM + US + 33.71 + -105.58 + 0 + 0 + ABQ + + + MTZ018 + 260180 + Daniels + MT + US + 48.79 + -105.57 + 0 + 0 + GGW + + + NMZ004 + 310040 + Sangre_de_Cristo_Mountains + NM + US + 36.25 + -105.57 + 0 + 0 + ABQ + + + WYZ054 + 500540 + Northern_Campbell + WY + US + 44.60 + -105.55 + 0 + 0 + UNR + + + WYZ055 + 500550 + Southern_Campbell + WY + US + 43.84 + -105.55 + 0 + 0 + UNR + + + COZ072 + 60720 + Nrn_Sngre_De_Cristo_Mtns_Between + CO + US + 37.98 + -105.49 + 0 + 0 + PUB + + + WYZ059 + 500590 + Converse + WY + US + 43.02 + -105.49 + 0 + 0 + CYS + + + MTZ032 + 260320 + Custer + MT + US + 46.33 + -105.47 + 0 + 0 + BYZ + + + COZ078 + 60780 + Wet_Mtn_Valley_Below_8500_Feet + CO + US + 38.08 + -105.45 + 0 + 0 + PUB + + + TXZ056 + 430560 + Hudspeth + TX + US + 31.32 + -105.45 + 0 + 0 + EPZ + + + MTZ020 + 260200 + Western_Roosevelt + MT + US + 48.29 + -105.41 + 0 + 0 + GGW + + + COZ035 + 60350 + Larimer_and_Boulder_Cnties_Betwe + CO + US + 40.46 + -105.39 + 0 + 0 + BOU + + + MTZ026 + 260260 + Prairie + MT + US + 46.86 + -105.34 + 0 + 0 + GGW + + + COZ036 + 60360 + Jefferson_and_W_Douglas_Cnties_A + CO + US + 39.53 + -105.32 + 0 + 0 + BOU + + + WYZ066 + 500660 + Laramie_Range + WY + US + 41.45 + -105.31 + 0 + 0 + CYS + + + COZ081 + 60810 + Teller_Cnty/Rampart_Rng_above_75 + CO + US + 38.82 + -105.22 + 0 + 0 + PUB + + + COZ039 + 60390 + Boulder_And_Jefferson_Cnties_Bel + CO + US + 39.87 + -105.19 + 0 + 0 + BOU + + + COZ075 + 60750 + Srn_Sngre_De_Cristo_Mtns_Above_1 + CO + US + 37.20 + -105.17 + 0 + 0 + PUB + + + COZ079 + 60790 + Wet_Mtns_Between_6300_and_10000_ + CO + US + 38.08 + -105.14 + 0 + 0 + PUB + + + COZ080 + 60800 + Wet_Mountains_Above_10000_Ft + CO + US + 37.98 + -105.14 + 0 + 0 + PUB + + + COZ083 + 60830 + Canon_City_Vic/Ern_Fremt_County + CO + US + 38.44 + -105.14 + 0 + 0 + PUB + + + NMZ026 + 310260 + Guadalupe_Mtns_of_Chaves_County + NM + US + 32.83 + -105.08 + 0 + 0 + ABQ + + + NMZ016 + 310160 + Lincoln_Cnty_Hi_Plns/Hondo_Vly + NM + US + 33.74 + -105.07 + 0 + 0 + ABQ + + + COZ082 + 60820 + PIkes_Peak_above_11000_Ft + CO + US + 38.82 + -105.04 + 0 + 0 + PUB + + + WYZ067 + 500670 + Platte + WY + US + 42.13 + -104.97 + 0 + 0 + CYS + + + COZ087 + 60870 + Walsenbg_Vic/Upr_Huerfano_Riv_Bs + CO + US + 37.67 + -104.87 + 0 + 0 + PUB + + + MTZ025 + 260250 + Dawson + MT + US + 47.32 + -104.86 + 0 + 0 + GGW + + + COZ074 + 60740 + Srn_Sngre_De_Cristo_Mtns_Between + CO + US + 37.26 + -104.83 + 0 + 0 + PUB + + + COZ040 + 60400 + N_Douglas_Cnty_Below_6000_Feet/D + CO + US + 39.73 + -104.81 + 0 + 0 + BOU + + + COZ038 + 60380 + Larimer_Cnty_Below_6000_Feet/NW_ + CO + US + 40.63 + -104.80 + 0 + 0 + BOU + + + WYZ069 + 500690 + Cheyenne_Foothills + WY + US + 41.33 + -104.75 + 0 + 0 + CYS + + + WYZ056 + 500560 + Western_Crook + WY + US + 44.59 + -104.72 + 0 + 0 + UNR + + + TXZ258 + 432580 + Guadalupe_Mountains + TX + US + 31.90 + -104.71 + 0 + 0 + MAF + + + NMZ027 + 310270 + Guadalupe_Mtns_of_Eddy_County + NM + US + 32.30 + -104.67 + 0 + 0 + MAF + + + MTZ024 + 260240 + Richland + MT + US + 47.75 + -104.64 + 0 + 0 + GGW + + + TXZ079 + 430790 + Presidio_Valley + TX + US + 29.95 + -104.61 + 0 + 0 + MAF + + + COZ043 + 60430 + Central_and_South_Weld_County + CO + US + 40.29 + -104.59 + 0 + 0 + BOU + + + WYZ058 + 500580 + Weston + WY + US + 43.84 + -104.57 + 0 + 0 + UNR + + + MTZ019 + 260190 + Sheridan + MT + US + 48.70 + -104.55 + 0 + 0 + GGW + + + TXZ057 + 430570 + Van_Horn_and_Hiway_54_Corridor + TX + US + 31.24 + -104.55 + 0 + 0 + MAF + + + COZ086 + 60860 + Pueblo_and_Vic/Pueblo_Cnty_Below + CO + US + 38.12 + -104.54 + 0 + 0 + PUB + + + MTZ037 + 260370 + Carter + MT + US + 45.57 + -104.54 + 0 + 0 + BYZ + + + NMZ005 + 310050 + Northeast_Highlands + NM + US + 36.10 + -104.54 + 0 + 0 + ABQ + + + COZ085 + 60850 + CO_Spgs_Vic/Srn_El_Paso_Cnty/Ram + CO + US + 38.74 + -104.51 + 0 + 0 + PUB + + + MTZ062 + 260620 + Eastern_Roosevelt + MT + US + 48.28 + -104.51 + 0 + 0 + GGW + + + COZ088 + 60880 + Trinidad_Vic/Wrn_Las_Animas_Cnty + CO + US + 37.40 + -104.50 + 0 + 0 + PUB + + + COZ084 + 60840 + Nrn_El_Paso_Cnty/Monument_Ridge/ + CO + US + 38.99 + -104.49 + 0 + 0 + PUB + + + WYZ060 + 500600 + Niobrara + WY + US + 43.06 + -104.49 + 0 + 0 + CYS + + + MTZ033 + 260330 + Fallon + MT + US + 46.29 + -104.48 + 0 + 0 + BYZ + + + NMZ012 + 310120 + Conchas_Lake/Guadalupe_County + NM + US + 35.08 + -104.46 + 0 + 0 + ABQ + + + COZ041 + 60410 + Elbert/Ctrl_and_E_Douglas_Cnties + CO + US + 39.28 + -104.43 + 0 + 0 + BOU + + + NMZ018 + 310180 + De_Baca_County + NM + US + 34.39 + -104.41 + 0 + 0 + ABQ + + + TXZ080 + 430800 + Marfa_Plateau + TX + US + 30.16 + -104.39 + 0 + 0 + MAF + + + WYZ057 + 500570 + Wyoming_Black_Hills + WY + US + 44.38 + -104.37 + 0 + 0 + UNR + + + WYZ068 + 500680 + Goshen + WY + US + 42.09 + -104.35 + 0 + 0 + CYS + + + MTZ027 + 260270 + Wibaux + MT + US + 47.02 + -104.33 + 0 + 0 + GGW + + + WYZ070 + 500700 + Pine_Bluffs + WY + US + 41.28 + -104.28 + 0 + 0 + CYS + + + NMZ028 + 310280 + Eddy_County_Plains + NM + US + 32.49 + -104.27 + 0 + 0 + MAF + + + WYZ071 + 500710 + Northeastern_Crook + WY + US + 44.79 + -104.21 + 0 + 0 + UNR + + + NMZ019 + 310190 + Chaves_County_Plains + NM + US + 33.53 + -104.19 + 0 + 0 + ABQ + + + COZ042 + 60420 + Northeast_Weld_County + CO + US + 40.75 + -104.10 + 0 + 0 + BOU + + + COZ045 + 60450 + Ctrl_and_E_Adams_and_Arapahoe_Cn + CO + US + 39.78 + -104.10 + 0 + 0 + BOU + + + NMZ006 + 310060 + Harding_County + NM + US + 35.81 + -103.89 + 0 + 0 + ABQ + + + NDZ031 + 340310 + Golden_Valley + ND + US + 46.94 + -103.83 + 0 + 0 + BIS + + + COZ046 + 60460 + N_and_NE_Elbert_Cnty_Below_6000_ + CO + US + 39.33 + -103.81 + 0 + 0 + BOU + + + COZ044 + 60440 + Morgan_County + CO + US + 40.25 + -103.80 + 0 + 0 + BOU + + + TXZ074 + 430740 + Davis/Apache_Mountains_Area + TX + US + 30.71 + -103.80 + 0 + 0 + MAF + + + TXZ058 + 430580 + Reeves_Cnty_and_Upr_Trans_Pecos + TX + US + 31.39 + -103.78 + 0 + 0 + MAF + + + COZ089 + 60890 + Crowley_County + CO + US + 38.31 + -103.77 + 0 + 0 + PUB + + + NEZ001 + 270010 + Sioux + NE + US + 42.50 + -103.73 + 0 + 0 + CYS + + + COZ093 + 60930 + La_Junta_Vicinity/Otero_County + CO + US + 37.95 + -103.72 + 0 + 0 + PUB + + + SDZ024 + 410240 + Northern_Black_Hills + SD + US + 44.31 + -103.72 + 0 + 0 + UNR + + + NEZ019 + 270190 + Scotts_Bluff + NE + US + 41.85 + -103.71 + 0 + 0 + CYS + + + NEZ020 + 270200 + Banner + NE + US + 41.54 + -103.71 + 0 + 0 + CYS + + + NEZ054 + 270540 + Kimball + NE + US + 41.20 + -103.71 + 0 + 0 + CYS + + + SDZ028 + 410280 + Central_Black_Hills + SD + US + 44.00 + -103.69 + 0 + 0 + UNR + + + SDZ029 + 410290 + Southern_Black_Hills + SD + US + 43.67 + -103.69 + 0 + 0 + UNR + + + NMZ007 + 310070 + Far_Northeast_Plains + NM + US + 36.37 + -103.67 + 0 + 0 + ABQ + + + TXZ059 + 430590 + Loving + TX + US + 31.83 + -103.66 + 0 + 0 + MAF + + + SDZ025 + 410250 + Northern_Foot_Hills + SD + US + 44.44 + -103.64 + 0 + 0 + UNR + + + SDZ027 + 410270 + Southern_Foot_Hills + SD + US + 43.36 + -103.64 + 0 + 0 + UNR + + + COZ047 + 60470 + SE_Elbert_Cnty_Below_6000_Feet/S + CO + US + 38.80 + -103.60 + 0 + 0 + BOU + + + NMZ013 + 310130 + Quay_County + NM + US + 35.17 + -103.57 + 0 + 0 + ABQ + + + COZ094 + 60940 + Eastern_Las_Animas_County + CO + US + 37.32 + -103.56 + 0 + 0 + PUB + + + SDZ041 + 410410 + Fall_River + SD + US + 43.24 + -103.53 + 0 + 0 + UNR + + + NDZ043 + 340430 + Bowman + ND + US + 46.11 + -103.52 + 0 + 0 + BIS + + + SDZ012 + 410120 + Butte + SD + US + 44.89 + -103.51 + 0 + 0 + UNR + + + SDZ001 + 410010 + Harding + SD + US + 45.58 + -103.50 + 0 + 0 + UNR + + + NDZ040 + 340400 + Slope + ND + US + 46.45 + -103.49 + 0 + 0 + BIS + + + NMZ020 + 310200 + Roosevelt_County + NM + US + 34.08 + -103.49 + 0 + 0 + ABQ + + + NDZ001 + 340010 + Divide + ND + US + 48.82 + -103.47 + 0 + 0 + BIS + + + NDZ009 + 340090 + Williams + ND + US + 48.30 + -103.44 + 0 + 0 + BIS + + + NMZ033 + 310330 + Central_Lea_County + NM + US + 32.75 + -103.43 + 0 + 0 + MAF + + + NMZ029 + 310290 + Northern_Lea_County + NM + US + 33.28 + -103.40 + 0 + 0 + MAF + + + NMZ034 + 310340 + Southern_Lea_County + NM + US + 32.25 + -103.39 + 0 + 0 + MAF + + + NMZ021 + 310210 + Curry_County + NM + US + 34.64 + -103.38 + 0 + 0 + ABQ + + + NDZ032 + 340320 + Billings + ND + US + 46.98 + -103.35 + 0 + 0 + BIS + + + SDZ072 + 410720 + Sturgis/Piedmont_Foot_Hills + SD + US + 44.38 + -103.35 + 0 + 0 + UNR + + + NDZ017 + 340170 + McKenzie + ND + US + 47.74 + -103.31 + 0 + 0 + BIS + + + SDZ074 + 410740 + Hermosa_Foot_Hills + SD + US + 43.67 + -103.27 + 0 + 0 + UNR + + + COZ049 + 60490 + Washington_County + CO + US + 40.00 + -103.24 + 0 + 0 + BOU + + + SDZ026 + 410260 + Rapid_City + SD + US + 44.00 + -103.23 + 0 + 0 + UNR + + + TXZ067 + 430670 + Ward + TX + US + 31.46 + -103.18 + 0 + 0 + MAF + + + NEZ002 + 270020 + Dawes + NE + US + 42.72 + -103.14 + 0 + 0 + CYS + + + COZ048 + 60480 + Logan_County + CO + US + 40.72 + -103.11 + 0 + 0 + BOU + + + COZ095 + 60950 + Western_Kiowa_County + CO + US + 38.43 + -103.11 + 0 + 0 + PUB + + + NEZ003 + 270030 + Box_Butte + NE + US + 42.22 + -103.07 + 0 + 0 + CYS + + + TXZ060 + 430600 + Winkler + TX + US + 31.87 + -103.07 + 0 + 0 + MAF + + + TXZ081 + 430810 + Big_Bend_Area + TX + US + 29.69 + -103.06 + 0 + 0 + MAF + + + COZ097 + 60970 + Las_Animas_Vicinity/Bent_County + CO + US + 37.95 + -103.05 + 0 + 0 + PUB + + + NEZ021 + 270210 + Morrill + NE + US + 41.72 + -103.00 + 0 + 0 + CYS + + + NEZ055 + 270550 + Cheyenne + NE + US + 41.22 + -102.99 + 0 + 0 + CYS + + + SDZ030 + 410300 + Custer_Co_Plains + SD + US + 43.67 + -102.96 + 0 + 0 + UNR + + + TXZ027 + 430270 + Bailey + TX + US + 34.07 + -102.82 + 0 + 0 + LUB + + + TXZ033 + 430330 + Cochran + TX + US + 33.61 + -102.82 + 0 + 0 + LUB + + + TXZ039 + 430390 + Yoakum + TX + US + 33.17 + -102.82 + 0 + 0 + LUB + + + SDZ073 + 410730 + Southern_Meade_Co_Plains + SD + US + 44.38 + -102.78 + 0 + 0 + UNR + + + TXZ021 + 430210 + Parmer + TX + US + 34.53 + -102.78 + 0 + 0 + LUB + + + TXZ075 + 430750 + Pecos + TX + US + 30.72 + -102.67 + 0 + 0 + MAF + + + NDZ033 + 340330 + Stark + ND + US + 46.82 + -102.66 + 0 + 0 + BIS + + + NDZ018 + 340180 + Dunn + ND + US + 47.40 + -102.63 + 0 + 0 + BIS + + + TXZ050 + 430500 + Andrews + TX + US + 32.30 + -102.63 + 0 + 0 + MAF + + + TXZ045 + 430450 + Gaines + TX + US + 32.74 + -102.62 + 0 + 0 + MAF + + + COZ092 + 60920 + Cheyenne_County + CO + US + 38.82 + -102.61 + 0 + 0 + GLD + + + COZ091 + 60910 + Kit_Carson_County + CO + US + 39.30 + -102.60 + 0 + 0 + GLD + + + TXZ001 + 430010 + Dallam + TX + US + 36.27 + -102.60 + 0 + 0 + AMA + + + TXZ006 + 430060 + Hartley + TX + US + 35.84 + -102.59 + 0 + 0 + AMA + + + TXZ011 + 430110 + Oldham + TX + US + 35.40 + -102.59 + 0 + 0 + AMA + + + TXZ016 + 430160 + Deaf_Smith + TX + US + 34.97 + -102.59 + 0 + 0 + AMA + + + COZ099 + 60990 + Springfield_Vic/Baca_County + CO + US + 37.32 + -102.56 + 0 + 0 + PUB + + + SDZ031 + 410310 + Pennington_Co_Plains + SD + US + 44.10 + -102.56 + 0 + 0 + UNR + + + SDZ042 + 410420 + Shannon + SD + US + 43.35 + -102.54 + 0 + 0 + UNR + + + TXZ061 + 430610 + Ector + TX + US + 31.87 + -102.54 + 0 + 0 + MAF + + + TXZ068 + 430680 + Crane + TX + US + 31.37 + -102.54 + 0 + 0 + MAF + + + OKZ001 + 360010 + Cimarron + OK + US + 36.74 + -102.51 + 0 + 0 + AMA + + + NDZ044 + 340440 + Adams + ND + US + 46.11 + -102.50 + 0 + 0 + BIS + + + NDZ002 + 340020 + Burke + ND + US + 48.78 + -102.48 + 0 + 0 + BIS + + + SDZ002 + 410020 + Perkins + SD + US + 45.49 + -102.48 + 0 + 0 + UNR + + + SDZ013 + 410130 + Northern_Meade_Co_Plains + SD + US + 44.82 + -102.48 + 0 + 0 + UNR + + + NDZ041 + 340410 + Hettinger + ND + US + 46.42 + -102.46 + 0 + 0 + BIS + + + COZ090 + 60900 + Yuma_County + CO + US + 40.00 + -102.42 + 0 + 0 + GLD + + + NEZ004 + 270040 + Sheridan + NE + US + 42.50 + -102.40 + 0 + 0 + LBF + + + COZ096 + 60960 + Eastern_Kiowa_County + CO + US + 38.44 + -102.39 + 0 + 0 + PUB + + + COZ098 + 60980 + Lamar_Vicinity/Prowers_County + CO + US + 37.95 + -102.39 + 0 + 0 + PUB + + + NDZ010 + 340100 + Mountrail + ND + US + 48.16 + -102.38 + 0 + 0 + BIS + + + COZ050 + 60500 + Sedgwick_County + CO + US + 40.87 + -102.35 + 0 + 0 + BOU + + + COZ051 + 60510 + Phillips_County + CO + US + 40.59 + -102.35 + 0 + 0 + BOU + + + TXZ028 + 430280 + Lamb + TX + US + 34.07 + -102.35 + 0 + 0 + LUB + + + TXZ034 + 430340 + Hockley + TX + US + 33.61 + -102.34 + 0 + 0 + LUB + + + NEZ022 + 270220 + Garden + NE + US + 41.61 + -102.33 + 0 + 0 + LBF + + + NEZ056 + 270560 + Deuel + NE + US + 41.11 + -102.33 + 0 + 0 + LBF + + + TXZ040 + 430400 + Terry + TX + US + 33.17 + -102.33 + 0 + 0 + LUB + + + TXZ022 + 430220 + Castro + TX + US + 34.53 + -102.26 + 0 + 0 + LUB + + + TXZ082 + 430820 + Terrell + TX + US + 30.22 + -102.11 + 0 + 0 + MAF + + + TXZ069 + 430690 + Upton + TX + US + 31.37 + -102.04 + 0 + 0 + MAF + + + TXZ062 + 430620 + Midland + TX + US + 31.87 + -102.03 + 0 + 0 + MAF + + + TXZ051 + 430510 + Martin + TX + US + 32.30 + -101.95 + 0 + 0 + MAF + + + TXZ046 + 430460 + Dawson + TX + US + 32.74 + -101.94 + 0 + 0 + MAF + + + TXZ017 + 430170 + Randall + TX + US + 34.97 + -101.90 + 0 + 0 + AMA + + + TXZ002 + 430020 + Sherman + TX + US + 36.27 + -101.89 + 0 + 0 + AMA + + + TXZ007 + 430070 + Moore + TX + US + 35.84 + -101.89 + 0 + 0 + AMA + + + TXZ012 + 430120 + Potter + TX + US + 35.40 + -101.89 + 0 + 0 + AMA + + + TXZ029 + 430290 + Hale + TX + US + 34.07 + -101.82 + 0 + 0 + LUB + + + TXZ035 + 430350 + Lubbock + TX + US + 33.61 + -101.82 + 0 + 0 + LUB + + + TXZ041 + 430410 + Lynn + TX + US + 33.17 + -101.82 + 0 + 0 + LUB + + + KSZ041 + 160410 + Greeley + KS + US + 38.47 + -101.80 + 0 + 0 + GLD + + + KSZ084 + 160840 + Morton + KS + US + 37.19 + -101.80 + 0 + 0 + DDC + + + KSZ061 + 160610 + Hamilton + KS + US + 37.99 + -101.78 + 0 + 0 + DDC + + + KSZ074 + 160740 + Stanton + KS + US + 37.56 + -101.78 + 0 + 0 + DDC + + + KSZ027 + 160270 + Wallace + KS + US + 38.91 + -101.76 + 0 + 0 + GLD + + + NEZ023 + 270230 + Grant + NE + US + 41.91 + -101.75 + 0 + 0 + LBF + + + KSZ001 + 160010 + Cheyenne + KS + US + 39.78 + -101.73 + 0 + 0 + GLD + + + NDZ019 + 340190 + Mercer + ND + US + 47.28 + -101.73 + 0 + 0 + BIS + + + TXZ023 + 430230 + Swisher + TX + US + 34.53 + -101.73 + 0 + 0 + LUB + + + KSZ013 + 160130 + Sherman + KS + US + 39.35 + -101.72 + 0 + 0 + GLD + + + NEZ035 + 270350 + Arthur + NE + US + 41.56 + -101.70 + 0 + 0 + LBF + + + NEZ069 + 270690 + Chase + NE + US + 40.52 + -101.69 + 0 + 0 + LBF + + + NEZ079 + 270790 + Dundy + NE + US + 40.17 + -101.69 + 0 + 0 + GLD + + + SDZ044 + 410440 + Bennett + SD + US + 43.19 + -101.67 + 0 + 0 + UNR + + + TXZ076 + 430760 + Crockett + TX + US + 30.69 + -101.67 + 0 + 0 + SJT + + + NEZ057 + 270570 + Keith + NE + US + 41.19 + -101.65 + 0 + 0 + LBF + + + NEZ058 + 270580 + Perkins + NE + US + 40.85 + -101.65 + 0 + 0 + LBF + + + SDZ043 + 410430 + Jackson + SD + US + 43.69 + -101.61 + 0 + 0 + UNR + + + NDZ011 + 340110 + Ward + ND + US + 48.33 + -101.60 + 0 + 0 + BIS + + + NDZ042 + 340420 + Grant + ND + US + 46.37 + -101.58 + 0 + 0 + BIS + + + SDZ014 + 410140 + Ziebach + SD + US + 45.00 + -101.57 + 0 + 0 + UNR + + + NDZ003 + 340030 + Renville + ND + US + 48.73 + -101.54 + 0 + 0 + BIS + + + SDZ032 + 410320 + Haakon + SD + US + 44.37 + -101.53 + 0 + 0 + UNR + + + TXZ063 + 430630 + Glasscock + TX + US + 31.87 + -101.52 + 0 + 0 + MAF + + + TXZ070 + 430700 + Reagan + TX + US + 31.37 + -101.52 + 0 + 0 + MAF + + + OKZ002 + 360020 + Texas + OK + US + 36.74 + -101.49 + 0 + 0 + AMA + + + TXZ047 + 430470 + Borden + TX + US + 32.74 + -101.43 + 0 + 0 + MAF + + + TXZ052 + 430520 + Howard + TX + US + 32.30 + -101.43 + 0 + 0 + MAF + + + NEZ094 + 270940 + Western_Cherry + NE + US + 42.54 + -101.42 + 0 + 0 + LBF + + + TXZ013 + 430130 + Carson + TX + US + 35.40 + -101.36 + 0 + 0 + AMA + + + TXZ018 + 430180 + Armstrong + TX + US + 34.97 + -101.36 + 0 + 0 + AMA + + + TXZ003 + 430030 + Hansford + TX + US + 36.27 + -101.35 + 0 + 0 + AMA + + + TXZ008 + 430080 + Hutchinson + TX + US + 35.84 + -101.35 + 0 + 0 + AMA + + + KSZ042 + 160420 + Wichita + KS + US + 38.48 + -101.34 + 0 + 0 + GLD + + + NDZ034 + 340340 + Morton + ND + US + 46.63 + -101.33 + 0 + 0 + BIS + + + NDZ020 + 340200 + Oliver + ND + US + 47.14 + -101.32 + 0 + 0 + BIS + + + KSZ062 + 160620 + Kearny + KS + US + 37.99 + -101.31 + 0 + 0 + DDC + + + KSZ085 + 160850 + Stevens + KS + US + 37.19 + -101.31 + 0 + 0 + DDC + + + KSZ075 + 160750 + Grant + KS + US + 37.56 + -101.30 + 0 + 0 + DDC + + + TXZ030 + 430300 + Floyd + TX + US + 34.07 + -101.30 + 0 + 0 + LUB + + + TXZ036 + 430360 + Crosby + TX + US + 33.61 + -101.30 + 0 + 0 + LUB + + + TXZ042 + 430420 + Garza + TX + US + 33.17 + -101.30 + 0 + 0 + LUB + + + TXZ183 + 431830 + Val_Verde + TX + US + 29.76 + -101.22 + 0 + 0 + EWX + + + TXZ024 + 430240 + Briscoe + TX + US + 34.53 + -101.21 + 0 + 0 + LUB + + + SDZ003 + 410030 + Corson + SD + US + 45.71 + -101.15 + 0 + 0 + ABR + + + KSZ028 + 160280 + Logan + KS + US + 38.91 + -101.14 + 0 + 0 + GLD + + + NEZ024 + 270240 + Hooker + NE + US + 41.91 + -101.13 + 0 + 0 + LBF + + + KSZ002 + 160020 + Rawlins + KS + US + 39.78 + -101.07 + 0 + 0 + GLD + + + NEZ036 + 270360 + McPherson + NE + US + 41.56 + -101.06 + 0 + 0 + LBF + + + NEZ070 + 270700 + Hayes + NE + US + 40.52 + -101.06 + 0 + 0 + LBF + + + KSZ014 + 160140 + Thomas + KS + US + 39.35 + -101.05 + 0 + 0 + GLD + + + NDZ021 + 340210 + McLean + ND + US + 47.51 + -101.04 + 0 + 0 + BIS + + + NEZ080 + 270800 + Hitchcock + NE + US + 40.17 + -101.04 + 0 + 0 + GLD + + + TXZ064 + 430640 + Sterling + TX + US + 31.83 + -101.04 + 0 + 0 + SJT + + + TXZ071 + 430710 + Irion + TX + US + 31.31 + -100.98 + 0 + 0 + SJT + + + TXZ048 + 430480 + Scurry + TX + US + 32.74 + -100.92 + 0 + 0 + MAF + + + TXZ053 + 430530 + Mitchell + TX + US + 32.30 + -100.92 + 0 + 0 + MAF + + + KSZ043 + 160430 + Scott + KS + US + 38.48 + -100.90 + 0 + 0 + DDC + + + NDZ045 + 340450 + Sioux + ND + US + 46.19 + -100.90 + 0 + 0 + BIS + + + SDZ015 + 410150 + Dewey + SD + US + 45.10 + -100.89 + 0 + 0 + ABR + + + SDZ033 + 410330 + Stanley + SD + US + 44.48 + -100.88 + 0 + 0 + ABR + + + KSZ076 + 160760 + Haskell + KS + US + 37.56 + -100.86 + 0 + 0 + DDC + + + KSZ086 + 160860 + Seward + KS + US + 37.19 + -100.85 + 0 + 0 + DDC + + + NDZ004 + 340040 + Bottineau + ND + US + 48.77 + -100.82 + 0 + 0 + BIS + + + TXZ004 + 430040 + Ochiltree + TX + US + 36.27 + -100.82 + 0 + 0 + AMA + + + TXZ009 + 430090 + Roberts + TX + US + 35.84 + -100.82 + 0 + 0 + AMA + + + TXZ014 + 430140 + Gray + TX + US + 35.40 + -100.81 + 0 + 0 + AMA + + + TXZ019 + 430190 + Donley + TX + US + 34.96 + -100.81 + 0 + 0 + AMA + + + TXZ031 + 430310 + Motley + TX + US + 34.08 + -100.78 + 0 + 0 + LUB + + + TXZ037 + 430370 + Dickens + TX + US + 33.62 + -100.78 + 0 + 0 + LUB + + + TXZ043 + 430430 + Kent + TX + US + 33.18 + -100.78 + 0 + 0 + LUB + + + NEZ059 + 270590 + Lincoln + NE + US + 41.04 + -100.74 + 0 + 0 + LBF + + + SDZ046 + 410460 + Mellette + SD + US + 43.63 + -100.72 + 0 + 0 + UNR + + + SDZ047 + 410470 + Todd + SD + US + 43.19 + -100.72 + 0 + 0 + UNR + + + SDZ045 + 410450 + Jones + SD + US + 43.95 + -100.71 + 0 + 0 + ABR + + + TXZ025 + 430250 + Hall + TX + US + 34.53 + -100.68 + 0 + 0 + LUB + + + KSZ063 + 160630 + Finney + KS + US + 37.99 + -100.66 + 0 + 0 + DDC + + + NDZ012 + 340120 + McHenry + ND + US + 48.24 + -100.63 + 0 + 0 + BIS + + + NEZ025 + 270250 + Thomas + NE + US + 41.91 + -100.55 + 0 + 0 + LBF + + + TXZ077 + 430770 + Schleicher + TX + US + 30.89 + -100.54 + 0 + 0 + SJT + + + TXZ078 + 430780 + Sutton + TX + US + 30.49 + -100.54 + 0 + 0 + SJT + + + NEZ005 + 270050 + Eastern_Cherry + NE + US + 42.53 + -100.53 + 0 + 0 + LBF + + + TXZ065 + 430650 + Coke + TX + US + 31.89 + -100.53 + 0 + 0 + SJT + + + NDZ035 + 340350 + Burleigh + ND + US + 46.98 + -100.52 + 0 + 0 + BIS + + + KSZ029 + 160290 + Gove + KS + US + 38.91 + -100.48 + 0 + 0 + GLD + + + NEZ037 + 270370 + Logan + NE + US + 41.57 + -100.48 + 0 + 0 + LBF + + + OKZ003 + 360030 + Beaver + OK + US + 36.74 + -100.48 + 0 + 0 + AMA + + + NEZ081 + 270810 + Red_Willow + NE + US + 40.17 + -100.47 + 0 + 0 + GLD + + + KSZ003 + 160030 + Decatur + KS + US + 39.78 + -100.46 + 0 + 0 + GLD + + + KSZ044 + 160440 + Lane + KS + US + 38.47 + -100.46 + 0 + 0 + DDC + + + TXZ202 + 432020 + Kinney + TX + US + 29.35 + -100.45 + 0 + 0 + EWX + + + KSZ015 + 160150 + Sheridan + KS + US + 39.35 + -100.44 + 0 + 0 + GLD + + + KSZ077 + 160770 + Gray + KS + US + 37.73 + -100.43 + 0 + 0 + DDC + + + TXZ049 + 430490 + Fisher + TX + US + 32.74 + -100.41 + 0 + 0 + SJT + + + TXZ054 + 430540 + Nolan + TX + US + 32.30 + -100.41 + 0 + 0 + SJT + + + TXZ072 + 430720 + Tom_Green + TX + US + 31.39 + -100.40 + 0 + 0 + SJT + + + TXZ217 + 432170 + Maverick + TX + US + 28.65 + -100.39 + 0 + 0 + EWX + + + KSZ087 + 160870 + Meade + KS + US + 37.23 + -100.37 + 0 + 0 + DDC + + + NEZ071 + 270710 + Frontier + NE + US + 40.52 + -100.37 + 0 + 0 + LBF + + + NDZ022 + 340220 + Sheridan + ND + US + 47.59 + -100.36 + 0 + 0 + BIS + + + TXZ005 + 430050 + Lipscomb + TX + US + 36.28 + -100.27 + 0 + 0 + AMA + + + TXZ010 + 430100 + Hemphill + TX + US + 35.84 + -100.27 + 0 + 0 + AMA + + + TXZ015 + 430150 + Wheeler + TX + US + 35.40 + -100.27 + 0 + 0 + AMA + + + TXZ020 + 430200 + Collingsworth + TX + US + 34.96 + -100.27 + 0 + 0 + AMA + + + NDZ046 + 340460 + Emmons + ND + US + 46.29 + -100.26 + 0 + 0 + BIS + + + TXZ032 + 430320 + Cottle + TX + US + 34.08 + -100.26 + 0 + 0 + LUB + + + TXZ038 + 430380 + King + TX + US + 33.62 + -100.26 + 0 + 0 + LUB + + + TXZ044 + 430440 + Stonewall + TX + US + 33.18 + -100.26 + 0 + 0 + LUB + + + TXZ184 + 431840 + Edwards + TX + US + 29.96 + -100.22 + 0 + 0 + EWX + + + TXZ026 + 430260 + Childress + TX + US + 34.53 + -100.21 + 0 + 0 + LUB + + + SDZ034 + 410340 + Sully + SD + US + 44.72 + -100.20 + 0 + 0 + ABR + + + SDZ004 + 410040 + Campbell + SD + US + 45.77 + -100.12 + 0 + 0 + ABR + + + SDZ009 + 410090 + Walworth + SD + US + 45.43 + -100.10 + 0 + 0 + ABR + + + SDZ035 + 410350 + Hughes + SD + US + 44.33 + -100.10 + 0 + 0 + ABR + + + SDZ016 + 410160 + Potter + SD + US + 45.07 + -100.00 + 0 + 0 + ABR + + + NEZ026 + 270260 + Blaine + NE + US + 41.91 + -99.97 + 0 + 0 + LBF + + + TXZ066 + 430660 + Runnels + TX + US + 31.83 + -99.97 + 0 + 0 + SJT + + + NEZ008 + 270080 + Brown + NE + US + 42.46 + -99.93 + 0 + 0 + LBF + + + KSZ045 + 160450 + Ness + KS + US + 38.47 + -99.91 + 0 + 0 + DDC + + + NEZ082 + 270820 + Furnas + NE + US + 40.17 + -99.91 + 0 + 0 + GID + + + KSZ004 + 160040 + Norton + KS + US + 39.78 + -99.90 + 0 + 0 + GLD + + + KSZ064 + 160640 + Hodgeman + KS + US + 38.08 + -99.89 + 0 + 0 + DDC + + + KSZ078 + 160780 + Ford + KS + US + 37.69 + -99.89 + 0 + 0 + DDC + + + NDZ013 + 340130 + Pierce + ND + US + 48.20 + -99.89 + 0 + 0 + BIS + + + TXZ127 + 431270 + Taylor + TX + US + 32.30 + -99.89 + 0 + 0 + SJT + + + KSZ016 + 160160 + Graham + KS + US + 39.34 + -99.88 + 0 + 0 + GLD + + + SDZ049 + 410490 + Tripp + SD + US + 43.38 + -99.88 + 0 + 0 + UNR + + + TXZ113 + 431130 + Jones + TX + US + 32.74 + -99.88 + 0 + 0 + SJT + + + KSZ030 + 160300 + Trego + KS + US + 38.91 + -99.87 + 0 + 0 + DDC + + + NEZ072 + 270720 + Gosper + NE + US + 40.52 + -99.86 + 0 + 0 + GID + + + TXZ073 + 430730 + Concho + TX + US + 31.34 + -99.86 + 0 + 0 + SJT + + + NDZ005 + 340050 + Rolette + ND + US + 48.77 + -99.84 + 0 + 0 + BIS + + + OKZ033 + 360330 + Harmon + OK + US + 34.77 + -99.83 + 0 + 0 + OUN + + + SDZ048 + 410480 + Lyman + SD + US + 43.86 + -99.83 + 0 + 0 + ABR + + + TXZ185 + 431850 + Real + TX + US + 29.86 + -99.83 + 0 + 0 + EWX + + + KSZ088 + 160880 + Clark + KS + US + 37.23 + -99.82 + 0 + 0 + DDC + + + NEZ060 + 270600 + Dawson + NE + US + 40.86 + -99.81 + 0 + 0 + GID + + + TXZ168 + 431680 + Menard + TX + US + 30.90 + -99.80 + 0 + 0 + SJT + + + NDZ036 + 340360 + Kidder + ND + US + 46.98 + -99.79 + 0 + 0 + BIS + + + TXZ203 + 432030 + Uvalde + TX + US + 29.36 + -99.77 + 0 + 0 + EWX + + + TXZ084 + 430840 + Foard + TX + US + 33.99 + -99.76 + 0 + 0 + OUN + + + TXZ218 + 432180 + Zavala + TX + US + 28.87 + -99.76 + 0 + 0 + EWX + + + TXZ228 + 432280 + Dimmit + TX + US + 28.42 + -99.75 + 0 + 0 + EWX + + + TXZ083 + 430830 + Hardeman + TX + US + 34.32 + -99.74 + 0 + 0 + OUN + + + NEZ006 + 270060 + Keya_Paha + NE + US + 42.85 + -99.73 + 0 + 0 + LBF + + + TXZ087 + 430870 + Knox + TX + US + 33.61 + -99.73 + 0 + 0 + OUN + + + TXZ098 + 430980 + Haskell + TX + US + 33.18 + -99.73 + 0 + 0 + SJT + + + NEZ038 + 270380 + Custer + NE + US + 41.39 + -99.72 + 0 + 0 + LBF + + + TXZ169 + 431690 + Kimble + TX + US + 30.50 + -99.71 + 0 + 0 + SJT + + + OKZ009 + 360090 + Ellis + OK + US + 36.22 + -99.69 + 0 + 0 + OUN + + + OKZ014 + 360140 + Roger_Mills + OK + US + 35.72 + -99.68 + 0 + 0 + OUN + + + OKZ021 + 360210 + Beckham + OK + US + 35.27 + -99.68 + 0 + 0 + OUN + + + NDZ023 + 340230 + Wells + ND + US + 47.59 + -99.67 + 0 + 0 + BIS + + + OKZ004 + 360040 + Harper + OK + US + 36.79 + -99.65 + 0 + 0 + OUN + + + OKZ034 + 360340 + Greer + OK + US + 34.92 + -99.56 + 0 + 0 + OUN + + + TXZ239 + 432390 + Webb + TX + US + 27.73 + -99.51 + 0 + 0 + CRP + + + SDZ036 + 410360 + Hyde + SD + US + 44.55 + -99.49 + 0 + 0 + ABR + + + NDZ047 + 340470 + Logan + ND + US + 46.46 + -99.48 + 0 + 0 + BIS + + + TXZ139 + 431390 + Coleman + TX + US + 31.75 + -99.46 + 0 + 0 + SJT + + + NEZ009 + 270090 + Rock + NE + US + 42.44 + -99.45 + 0 + 0 + LBF + + + NEZ027 + 270270 + Loup + NE + US + 41.91 + -99.45 + 0 + 0 + LBF + + + NDZ050 + 340500 + McIntosh + ND + US + 46.11 + -99.44 + 0 + 0 + BIS + + + OKZ036 + 360360 + Jackson + OK + US + 34.59 + -99.44 + 0 + 0 + OUN + + + NEZ073 + 270730 + Phelps + NE + US + 40.51 + -99.41 + 0 + 0 + GID + + + NEZ083 + 270830 + Harlan + NE + US + 40.17 + -99.40 + 0 + 0 + GID + + + TXZ128 + 431280 + Callahan + TX + US + 32.30 + -99.37 + 0 + 0 + SJT + + + TXZ114 + 431140 + Shackelford + TX + US + 32.74 + -99.36 + 0 + 0 + SJT + + + TXZ154 + 431540 + McCulloch + TX + US + 31.22 + -99.35 + 0 + 0 + SJT + + + KSZ005 + 160050 + Phillips + KS + US + 39.78 + -99.34 + 0 + 0 + GID + + + TXZ186 + 431860 + Kerr + TX + US + 30.04 + -99.34 + 0 + 0 + EWX + + + KSZ017 + 160170 + Rooks + KS + US + 39.35 + -99.32 + 0 + 0 + GID + + + KSZ031 + 160310 + Ellis + KS + US + 38.91 + -99.31 + 0 + 0 + DDC + + + KSZ046 + 160460 + Rush + KS + US + 38.52 + -99.30 + 0 + 0 + DDC + + + KSZ079 + 160790 + Edwards + KS + US + 37.90 + -99.29 + 0 + 0 + DDC + + + KSZ080 + 160800 + Kiowa + KS + US + 37.55 + -99.28 + 0 + 0 + DDC + + + OKZ010 + 360100 + Woodward + OK + US + 36.48 + -99.28 + 0 + 0 + OUN + + + KSZ089 + 160890 + Comanche + KS + US + 37.19 + -99.27 + 0 + 0 + DDC + + + NDZ006 + 340060 + Towner + ND + US + 48.69 + -99.25 + 0 + 0 + FGF + + + SDZ051 + 410510 + Buffalo + SD + US + 44.06 + -99.25 + 0 + 0 + ABR + + + KSZ065 + 160650 + Pawnee + KS + US + 38.17 + -99.24 + 0 + 0 + DDC + + + SDZ005 + 410050 + McPherson + SD + US + 45.77 + -99.23 + 0 + 0 + ABR + + + SDZ010 + 410100 + Edmunds + SD + US + 45.42 + -99.22 + 0 + 0 + ABR + + + TXZ085 + 430850 + Wilbarger + TX + US + 34.14 + -99.22 + 0 + 0 + OUN + + + TXZ170 + 431700 + Mason + TX + US + 30.72 + -99.22 + 0 + 0 + SJT + + + TXZ088 + 430880 + Baylor + TX + US + 33.62 + -99.21 + 0 + 0 + OUN + + + TXZ099 + 430990 + Throckmorton + TX + US + 33.18 + -99.21 + 0 + 0 + SJT + + + TXZ187 + 431870 + Bandera + TX + US + 29.74 + -99.21 + 0 + 0 + EWX + + + TXZ248 + 432480 + Zapata + TX + US + 26.94 + -99.21 + 0 + 0 + BRO + + + NDZ014 + 340140 + Benson + ND + US + 48.11 + -99.19 + 0 + 0 + FGF + + + SDZ017 + 410170 + Faulk + SD + US + 45.07 + -99.15 + 0 + 0 + ABR + + + SDZ057 + 410570 + Brule + SD + US + 43.72 + -99.13 + 0 + 0 + FSD + + + TXZ204 + 432040 + Medina + TX + US + 29.39 + -99.11 + 0 + 0 + EWX + + + TXZ219 + 432190 + Frio + TX + US + 28.87 + -99.11 + 0 + 0 + EWX + + + TXZ229 + 432290 + La_Salle + TX + US + 28.34 + -99.10 + 0 + 0 + CRP + + + NEZ061 + 270610 + Buffalo + NE + US + 40.85 + -99.07 + 0 + 0 + GID + + + SDZ050 + 410500 + Gregory + SD + US + 43.25 + -99.02 + 0 + 0 + FSD + + + OKZ015 + 360150 + Dewey + OK + US + 35.99 + -99.01 + 0 + 0 + OUN + + + OKZ035 + 360350 + Kiowa + OK + US + 34.86 + -99.01 + 0 + 0 + OUN + + + SDZ037 + 410370 + Hand + SD + US + 44.55 + -99.01 + 0 + 0 + ABR + + + OKZ016 + 360160 + Custer + OK + US + 35.64 + -99.00 + 0 + 0 + OUN + + + NEZ028 + 270280 + Garfield + NE + US + 41.91 + -98.99 + 0 + 0 + LBF + + + NEZ039 + 270390 + Valley + NE + US + 41.56 + -98.98 + 0 + 0 + GID + + + OKZ005 + 360050 + Woods + OK + US + 36.69 + -98.98 + 0 + 0 + OUN + + + OKZ022 + 360220 + Washita + OK + US + 35.29 + -98.98 + 0 + 0 + OUN + + + NEZ046 + 270460 + Sherman + NE + US + 41.22 + -98.97 + 0 + 0 + GID + + + NDZ037 + 340370 + Stutsman + ND + US + 46.98 + -98.96 + 0 + 0 + BIS + + + NEZ074 + 270740 + Kearney + NE + US + 40.51 + -98.95 + 0 + 0 + GID + + + NEZ084 + 270840 + Franklin + NE + US + 40.17 + -98.95 + 0 + 0 + GID + + + TXZ188 + 431880 + Gillespie + TX + US + 30.32 + -98.95 + 0 + 0 + EWX + + + TXZ140 + 431400 + Brown + TX + US + 31.77 + -98.94 + 0 + 0 + SJT + + + OKZ037 + 360370 + Tillman + OK + US + 34.38 + -98.92 + 0 + 0 + OUN + + + NDZ024 + 340240 + Eddy + ND + US + 47.72 + -98.90 + 0 + 0 + FGF + + + NDZ025 + 340250 + Foster + ND + US + 47.46 + -98.89 + 0 + 0 + BIS + + + TXZ115 + 431150 + Stephens + TX + US + 32.74 + -98.83 + 0 + 0 + FWD + + + TXZ129 + 431290 + Eastland + TX + US + 32.30 + -98.80 + 0 + 0 + FWD + + + KSZ006 + 160060 + Smith + KS + US + 39.78 + -98.78 + 0 + 0 + GID + + + NEZ007 + 270070 + Boyd + NE + US + 42.88 + -98.77 + 0 + 0 + LBF + + + NEZ010 + 270100 + Holt + NE + US + 42.49 + -98.77 + 0 + 0 + LBF + + + KSZ018 + 160180 + Osborne + KS + US + 39.34 + -98.76 + 0 + 0 + GID + + + KSZ032 + 160320 + Russell + KS + US + 38.91 + -98.76 + 0 + 0 + ICT + + + TXZ252 + 432520 + Starr + TX + US + 26.52 + -98.76 + 0 + 0 + BRO + + + KSZ047 + 160470 + Barton + KS + US + 38.47 + -98.75 + 0 + 0 + ICT + + + NDZ015 + 340150 + Ramsey + ND + US + 48.23 + -98.75 + 0 + 0 + FGF + + + TXZ155 + 431550 + San_Saba + TX + US + 31.21 + -98.75 + 0 + 0 + SJT + + + KSZ066 + 160660 + Stafford + KS + US + 38.03 + -98.74 + 0 + 0 + DDC + + + KSZ081 + 160810 + Pratt + KS + US + 37.64 + -98.73 + 0 + 0 + DDC + + + TXZ249 + 432490 + Jim_Hogg + TX + US + 27.08 + -98.70 + 0 + 0 + BRO + + + SDZ063 + 410630 + Charles_Mix + SD + US + 43.17 + -98.69 + 0 + 0 + FSD + + + TXZ086 + 430860 + Wichita + TX + US + 34.01 + -98.69 + 0 + 0 + OUN + + + KSZ090 + 160900 + Barber + KS + US + 37.23 + -98.68 + 0 + 0 + DDC + + + TXZ089 + 430890 + Archer + TX + US + 33.62 + -98.68 + 0 + 0 + OUN + + + TXZ100 + 431000 + Young + TX + US + 33.18 + -98.68 + 0 + 0 + FWD + + + TXZ189 + 431890 + Kendall + TX + US + 29.93 + -98.67 + 0 + 0 + EWX + + + TXZ171 + 431710 + Llano + TX + US + 30.71 + -98.65 + 0 + 0 + EWX + + + SDZ052 + 410520 + Jerauld + SD + US + 44.07 + -98.63 + 0 + 0 + FSD + + + TXZ142 + 431420 + Mills + TX + US + 31.48 + -98.63 + 0 + 0 + FWD + + + SDZ058 + 410580 + Aurora + SD + US + 43.72 + -98.57 + 0 + 0 + FSD + + + TXZ230 + 432300 + McMullen + TX + US + 28.35 + -98.57 + 0 + 0 + CRP + + + NDZ048 + 340480 + La_Moure + ND + US + 46.46 + -98.54 + 0 + 0 + BIS + + + TXZ141 + 431410 + Comanche + TX + US + 31.98 + -98.54 + 0 + 0 + FWD + + + OKZ011 + 360110 + Major + OK + US + 36.33 + -98.53 + 0 + 0 + OUN + + + NEZ029 + 270290 + Wheeler + NE + US + 41.91 + -98.52 + 0 + 0 + LBF + + + NEZ040 + 270400 + Greeley + NE + US + 41.57 + -98.52 + 0 + 0 + GID + + + TXZ240 + 432400 + Duval + TX + US + 27.66 + -98.52 + 0 + 0 + CRP + + + NDZ051 + 340510 + Dickey + ND + US + 46.11 + -98.51 + 0 + 0 + BIS + + + NEZ047 + 270470 + Howard + NE + US + 41.22 + -98.51 + 0 + 0 + GID + + + NEZ062 + 270620 + Hall + NE + US + 40.87 + -98.50 + 0 + 0 + GID + + + NEZ075 + 270750 + Adams + NE + US + 40.52 + -98.50 + 0 + 0 + GID + + + NEZ085 + 270850 + Webster + NE + US + 40.17 + -98.49 + 0 + 0 + GID + + + TXZ205 + 432050 + Bexar + TX + US + 29.44 + -98.47 + 0 + 0 + EWX + + + NDZ007 + 340070 + Cavalier + ND + US + 48.77 + -98.46 + 0 + 0 + FGF + + + OKZ038 + 360380 + Comanche + OK + US + 34.63 + -98.46 + 0 + 0 + OUN + + + TXZ220 + 432200 + Atascosa + TX + US + 28.93 + -98.45 + 0 + 0 + EWX + + + OKZ017 + 360170 + Blaine + OK + US + 35.86 + -98.42 + 0 + 0 + OUN + + + SDZ064 + 410640 + Douglas + SD + US + 43.35 + -98.41 + 0 + 0 + FSD + + + OKZ044 + 360440 + Cotton + OK + US + 34.28 + -98.40 + 0 + 0 + OUN + + + SDZ006 + 410060 + Brown + SD + US + 45.59 + -98.36 + 0 + 0 + ABR + + + TXZ190 + 431900 + Blanco + TX + US + 30.23 + -98.36 + 0 + 0 + EWX + + + OKZ023 + 360230 + Caddo + OK + US + 35.21 + -98.35 + 0 + 0 + OUN + + + SDZ018 + 410180 + Spink + SD + US + 44.94 + -98.35 + 0 + 0 + ABR + + + TXZ206 + 432060 + Comal + TX + US + 29.82 + -98.33 + 0 + 0 + EWX + + + OKZ006 + 360060 + Alfalfa + OK + US + 36.73 + -98.32 + 0 + 0 + OUN + + + TXZ116 + 431160 + Palo_Pinto + TX + US + 32.76 + -98.31 + 0 + 0 + FWD + + + SDZ038 + 410380 + Beadle + SD + US + 44.41 + -98.28 + 0 + 0 + FSD + + + TXZ250 + 432500 + Brooks + TX + US + 27.03 + -98.26 + 0 + 0 + BRO + + + TXZ156 + 431560 + Lampasas + TX + US + 31.25 + -98.24 + 0 + 0 + FWD + + + NDZ028 + 340280 + Griggs + ND + US + 47.46 + -98.23 + 0 + 0 + FGF + + + TXZ253 + 432530 + Hidalgo + TX + US + 26.41 + -98.23 + 0 + 0 + BRO + + + KSZ007 + 160070 + Jewell + KS + US + 39.78 + -98.22 + 0 + 0 + GID + + + KSZ033 + 160330 + Lincoln + KS + US + 39.04 + -98.21 + 0 + 0 + ICT + + + TXZ130 + 431300 + Erath + TX + US + 32.22 + -98.21 + 0 + 0 + FWD + + + KSZ019 + 160190 + Mitchell + KS + US + 39.39 + -98.20 + 0 + 0 + GID + + + KSZ048 + 160480 + Ellsworth + KS + US + 38.69 + -98.20 + 0 + 0 + ICT + + + KSZ050 + 160500 + Rice + KS + US + 38.33 + -98.20 + 0 + 0 + ICT + + + NDZ026 + 340260 + Nelson + ND + US + 47.94 + -98.20 + 0 + 0 + FGF + + + TXZ090 + 430900 + Clay + TX + US + 33.81 + -98.18 + 0 + 0 + OUN + + + TXZ101 + 431010 + Jack + TX + US + 33.24 + -98.17 + 0 + 0 + FWD + + + SDZ059 + 410590 + Davison + SD + US + 43.67 + -98.15 + 0 + 0 + FSD + + + TXZ172 + 431720 + Burnet + TX + US + 30.74 + -98.15 + 0 + 0 + EWX + + + KSZ082 + 160820 + Kingman + KS + US + 37.55 + -98.13 + 0 + 0 + ICT + + + TXZ143 + 431430 + Hamilton + TX + US + 31.72 + -98.11 + 0 + 0 + FWD + + + SDZ053 + 410530 + Sanborn + SD + US + 44.02 + -98.10 + 0 + 0 + FSD + + + NDZ054 + 340540 + Western_Walsh_County + ND + US + 48.37 + -98.09 + 0 + 0 + FGF + + + KSZ067 + 160670 + Reno + KS + US + 37.95 + -98.08 + 0 + 0 + ICT + + + NDZ038 + 340380 + Barnes + ND + US + 46.94 + -98.08 + 0 + 0 + FGF + + + TXZ221 + 432210 + Wilson + TX + US + 29.16 + -98.08 + 0 + 0 + EWX + + + TXZ231 + 432310 + Live_Oak + TX + US + 28.42 + -98.08 + 0 + 0 + CRP + + + KSZ091 + 160910 + Harper + KS + US + 37.19 + -98.07 + 0 + 0 + ICT + + + NEZ016 + 270160 + Antelope + NE + US + 42.17 + -98.07 + 0 + 0 + OAX + + + NEZ030 + 270300 + Boone + NE + US + 41.70 + -98.06 + 0 + 0 + OAX + + + NEZ063 + 270630 + Hamilton + NE + US + 40.93 + -98.05 + 0 + 0 + GID + + + NEZ076 + 270760 + Clay + NE + US + 40.52 + -98.05 + 0 + 0 + GID + + + NEZ086 + 270860 + Nuckolls + NE + US + 40.17 + -98.04 + 0 + 0 + GID + + + TXZ191 + 431910 + Hays + TX + US + 30.05 + -98.02 + 0 + 0 + EWX + + + TXZ241 + 432410 + Jim_Wells + TX + US + 27.66 + -98.02 + 0 + 0 + CRP + + + NEZ041 + 270410 + Nance + NE + US + 41.39 + -97.99 + 0 + 0 + GID + + + OKZ024 + 360240 + Canadian + OK + US + 35.53 + -97.99 + 0 + 0 + OUN + + + TXZ207 + 432070 + Guadalupe + TX + US + 29.62 + -97.98 + 0 + 0 + EWX + + + NEZ048 + 270480 + Merrick + NE + US + 41.13 + -97.94 + 0 + 0 + GID + + + OKZ018 + 360180 + Kingfisher + OK + US + 35.95 + -97.94 + 0 + 0 + OUN + + + NEZ011 + 270110 + Knox + NE + US + 42.66 + -97.90 + 0 + 0 + OAX + + + SDZ068 + 410680 + Bon_Homme + SD + US + 42.97 + -97.90 + 0 + 0 + FSD + + + OKZ027 + 360270 + Grady + OK + US + 35.03 + -97.88 + 0 + 0 + OUN + + + TXZ222 + 432220 + Karnes + TX + US + 28.95 + -97.88 + 0 + 0 + EWX + + + OKZ039 + 360390 + Stephens + OK + US + 34.49 + -97.85 + 0 + 0 + OUN + + + TXZ131 + 431310 + Hood + TX + US + 32.40 + -97.84 + 0 + 0 + FWD + + + OKZ045 + 360450 + Jefferson + OK + US + 34.07 + -97.83 + 0 + 0 + OUN + + + TXZ117 + 431170 + Parker + TX + US + 32.78 + -97.80 + 0 + 0 + FWD + + + TXZ157 + 431570 + Coryell + TX + US + 31.39 + -97.80 + 0 + 0 + FWD + + + SDZ060 + 410600 + Hanson + SD + US + 43.67 + -97.79 + 0 + 0 + FSD + + + OKZ007 + 360070 + Grant + OK + US + 36.79 + -97.78 + 0 + 0 + OUN + + + OKZ012 + 360120 + Garfield + OK + US + 36.38 + -97.78 + 0 + 0 + OUN + + + TXZ132 + 431320 + Somervell + TX + US + 32.21 + -97.78 + 0 + 0 + FWD + + + TXZ192 + 431920 + Travis + TX + US + 30.33 + -97.77 + 0 + 0 + EWX + + + SDZ065 + 410650 + Hutchinson + SD + US + 43.33 + -97.76 + 0 + 0 + FSD + + + SDZ019 + 410190 + Clark + SD + US + 44.85 + -97.74 + 0 + 0 + ABR + + + TXZ091 + 430910 + Montague + TX + US + 33.71 + -97.73 + 0 + 0 + FWD + + + TXZ232 + 432320 + Bee + TX + US + 28.42 + -97.73 + 0 + 0 + CRP + + + TXZ254 + 432540 + Inland_Willacy + TX + US + 26.46 + -97.73 + 0 + 0 + BRO + + + NDZ029 + 340290 + Steele + ND + US + 47.46 + -97.72 + 0 + 0 + FGF + + + NDZ049 + 340490 + Ransom + ND + US + 46.46 + -97.66 + 0 + 0 + FGF + + + TXZ102 + 431020 + Wise + TX + US + 33.22 + -97.65 + 0 + 0 + FWD + + + KSZ008 + 160080 + Republic + KS + US + 39.82 + -97.64 + 0 + 0 + TOP + + + KSZ020 + 160200 + Cloud + KS + US + 39.48 + -97.64 + 0 + 0 + TOP + + + KSZ034 + 160340 + Ottawa + KS + US + 39.13 + -97.64 + 0 + 0 + TOP + + + KSZ049 + 160490 + Saline + KS + US + 38.78 + -97.64 + 0 + 0 + ICT + + + KSZ051 + 160510 + McPherson + KS + US + 38.38 + -97.64 + 0 + 0 + ICT + + + TXZ144 + 431440 + Bosque + TX + US + 31.90 + -97.64 + 0 + 0 + FWD + + + TXZ242 + 432420 + Kleberg + TX + US + 27.43 + -97.64 + 0 + 0 + CRP + + + TXZ251 + 432510 + Kenedy + TX + US + 26.94 + -97.64 + 0 + 0 + BRO + + + NDZ052 + 340520 + Sargent + ND + US + 46.11 + -97.62 + 0 + 0 + FGF + + + TXZ208 + 432080 + Caldwell + TX + US + 29.86 + -97.62 + 0 + 0 + EWX + + + SDZ011 + 410110 + Day + SD + US + 45.37 + -97.61 + 0 + 0 + ABR + + + SDZ054 + 410540 + Miner + SD + US + 44.02 + -97.61 + 0 + 0 + FSD + + + NEZ017 + 270170 + Pierce + NE + US + 42.26 + -97.60 + 0 + 0 + OAX + + + NEZ031 + 270310 + Madison + NE + US + 41.91 + -97.60 + 0 + 0 + OAX + + + SDZ007 + 410070 + Marshall + SD + US + 45.75 + -97.60 + 0 + 0 + ABR + + + TXZ173 + 431730 + Williamson + TX + US + 30.66 + -97.60 + 0 + 0 + EWX + + + NEZ049 + 270490 + Polk + NE + US + 41.22 + -97.59 + 0 + 0 + GID + + + NEZ064 + 270640 + York + NE + US + 40.87 + -97.59 + 0 + 0 + GID + + + NEZ077 + 270770 + Fillmore + NE + US + 40.52 + -97.59 + 0 + 0 + GID + + + NEZ087 + 270870 + Thayer + NE + US + 40.17 + -97.59 + 0 + 0 + GID + + + TXZ255 + 432550 + Inland_Cameron + TX + US + 26.10 + -97.56 + 0 + 0 + BRO + + + NEZ042 + 270420 + Platte + NE + US + 41.54 + -97.54 + 0 + 0 + OAX + + + OKZ028 + 360280 + McClain + OK + US + 35.10 + -97.54 + 0 + 0 + OUN + + + NDZ008 + 340080 + Pembina + ND + US + 48.77 + -97.52 + 0 + 0 + FGF + + + TXZ244 + 432440 + San_Patricio + TX + US + 27.99 + -97.52 + 0 + 0 + CRP + + + TXZ158 + 431580 + Bell + TX + US + 31.05 + -97.50 + 0 + 0 + FWD + + + TXZ223 + 432230 + Gonzales + TX + US + 29.45 + -97.50 + 0 + 0 + EWX + + + TXZ243 + 432430 + Nueces + TX + US + 27.78 + -97.50 + 0 + 0 + CRP + + + NDZ016 + 340160 + Eastern_Walsh_County + ND + US + 48.37 + -97.49 + 0 + 0 + FGF + + + SDZ039 + 410390 + Kingsbury + SD + US + 44.37 + -97.49 + 0 + 0 + FSD + + + TXZ256 + 432560 + Coastal_Willacy + TX + US + 26.47 + -97.49 + 0 + 0 + BRO + + + KSZ083 + 160830 + Sedgwick + KS + US + 37.69 + -97.47 + 0 + 0 + ICT + + + KSZ092 + 160920 + Sumner + KS + US + 37.23 + -97.47 + 0 + 0 + ICT + + + TXZ233 + 432330 + Goliad + TX + US + 28.65 + -97.47 + 0 + 0 + CRP + + + KSZ068 + 160680 + Harvey + KS + US + 38.04 + -97.42 + 0 + 0 + ICT + + + OKZ019 + 360190 + Logan + OK + US + 35.95 + -97.41 + 0 + 0 + OUN + + + NDZ027 + 340270 + Grand_Forks + ND + US + 47.93 + -97.40 + 0 + 0 + FGF + + + OKZ025 + 360250 + Oklahoma + OK + US + 35.55 + -97.40 + 0 + 0 + OUN + + + OKZ029 + 360290 + Cleveland + OK + US + 35.16 + -97.40 + 0 + 0 + OUN + + + SDZ069 + 410690 + Yankton + SD + US + 42.99 + -97.40 + 0 + 0 + FSD + + + SDZ061 + 410610 + McCook + SD + US + 43.67 + -97.37 + 0 + 0 + FSD + + + TXZ224 + 432240 + DeWitt + TX + US + 29.10 + -97.37 + 0 + 0 + EWX + + + TXZ133 + 431330 + Johnson + TX + US + 32.35 + -97.35 + 0 + 0 + FWD + + + TXZ193 + 431930 + Bastrop + TX + US + 30.10 + -97.35 + 0 + 0 + EWX + + + TXZ257 + 432570 + Coastal_Cameron + TX + US + 26.20 + -97.34 + 0 + 0 + BRO + + + OKZ040 + 360400 + Garvin + OK + US + 34.69 + -97.30 + 0 + 0 + OUN + + + TXZ118 + 431180 + Tarrant + TX + US + 32.78 + -97.29 + 0 + 0 + FWD + + + NEZ012 + 270120 + Cedar + NE + US + 42.61 + -97.25 + 0 + 0 + OAX + + + OKZ046 + 360460 + Carter + OK + US + 34.29 + -97.24 + 0 + 0 + OUN + + + OKZ050 + 360500 + Love + OK + US + 33.90 + -97.24 + 0 + 0 + OUN + + + NDZ039 + 340390 + Cass + ND + US + 46.94 + -97.23 + 0 + 0 + FGF + + + TXZ092 + 430920 + Cooke + TX + US + 33.69 + -97.21 + 0 + 0 + FWD + + + TXZ159 + 431590 + McLennan + TX + US + 31.56 + -97.20 + 0 + 0 + FWD + + + NEZ032 + 270320 + Stanton + NE + US + 41.92 + -97.19 + 0 + 0 + OAX + + + SDZ020 + 410200 + Codington + SD + US + 44.98 + -97.19 + 0 + 0 + ABR + + + SDZ022 + 410220 + Hamlin + SD + US + 44.67 + -97.19 + 0 + 0 + ABR + + + OKZ013 + 360130 + Noble + OK + US + 36.39 + -97.17 + 0 + 0 + OUN + + + KSZ021 + 160210 + Clay + KS + US + 39.35 + -97.16 + 0 + 0 + TOP + + + NDZ030 + 340300 + Traill + ND + US + 47.46 + -97.16 + 0 + 0 + FGF + + + SDZ066 + 410660 + Turner + SD + US + 43.29 + -97.16 + 0 + 0 + FSD + + + TXZ246 + 432460 + Refugio + TX + US + 28.30 + -97.15 + 0 + 0 + CRP + + + KSZ035 + 160350 + Dickinson + KS + US + 38.86 + -97.14 + 0 + 0 + TOP + + + NEZ088 + 270880 + Jefferson + NE + US + 40.17 + -97.14 + 0 + 0 + OAX + + + NEZ050 + 270500 + Butler + NE + US + 41.25 + -97.13 + 0 + 0 + OAX + + + NEZ065 + 270650 + Seward + NE + US + 40.87 + -97.13 + 0 + 0 + OAX + + + NEZ078 + 270780 + Saline + NE + US + 40.52 + -97.13 + 0 + 0 + OAX + + + SDZ055 + 410550 + Lake + SD + US + 44.02 + -97.13 + 0 + 0 + FSD + + + OKZ008 + 360080 + Kay + OK + US + 36.79 + -97.11 + 0 + 0 + OUN + + + TXZ103 + 431030 + Denton + TX + US + 33.21 + -97.11 + 0 + 0 + FWD + + + TXZ145 + 431450 + Hill + TX + US + 32.00 + -97.11 + 0 + 0 + FWD + + + NEZ018 + 270180 + Wayne + NE + US + 42.22 + -97.10 + 0 + 0 + OAX + + + KSZ052 + 160520 + Marion + KS + US + 38.34 + -97.09 + 0 + 0 + ICT + + + OKZ041 + 360410 + Murray + OK + US + 34.49 + -97.09 + 0 + 0 + OUN + + + KSZ009 + 160090 + Washington + KS + US + 39.78 + -97.08 + 0 + 0 + TOP + + + NEZ043 + 270430 + Colfax + NE + US + 41.56 + -97.08 + 0 + 0 + OAX + + + OKZ020 + 360200 + Payne + OK + US + 36.10 + -96.99 + 0 + 0 + OUN + + + SDZ070 + 410700 + Clay + SD + US + 42.90 + -96.99 + 0 + 0 + FSD + + + TXZ194 + 431940 + Lee + TX + US + 30.30 + -96.99 + 0 + 0 + EWX + + + TXZ234 + 432340 + Victoria + TX + US + 28.80 + -96.98 + 0 + 0 + CRP + + + TXZ174 + 431740 + Milam + TX + US + 30.80 + -96.97 + 0 + 0 + FWD + + + TXZ209 + 432090 + Fayette + TX + US + 29.90 + -96.95 + 0 + 0 + EWX + + + TXZ160 + 431600 + Falls + TX + US + 31.26 + -96.94 + 0 + 0 + FWD + + + NDZ053 + 340530 + Richland + ND + US + 46.28 + -96.92 + 0 + 0 + FGF + + + TXZ225 + 432250 + Lavaca + TX + US + 29.35 + -96.91 + 0 + 0 + EWX + + + OKZ026 + 360260 + Lincoln + OK + US + 35.71 + -96.88 + 0 + 0 + OUN + + + OKZ030 + 360300 + Pottawatomie + OK + US + 35.19 + -96.88 + 0 + 0 + OUN + + + TXZ245 + 432450 + Aransas + TX + US + 28.21 + -96.87 + 0 + 0 + CRP + + + SDZ008 + 410080 + Roberts + SD + US + 45.62 + -96.86 + 0 + 0 + ABR + + + SDZ021 + 410210 + Grant + SD + US + 45.15 + -96.84 + 0 + 0 + ABR + + + KSZ069 + 160690 + Butler + KS + US + 37.78 + -96.83 + 0 + 0 + ICT + + + KSZ093 + 160930 + Cowley + KS + US + 37.23 + -96.83 + 0 + 0 + ICT + + + NEZ013 + 270130 + Dixon + NE + US + 42.51 + -96.82 + 0 + 0 + FSD + + + MNZ004 + 230040 + Kittson + MN + US + 48.77 + -96.81 + 0 + 0 + FGF + + + NEZ033 + 270330 + Cuming + NE + US + 41.92 + -96.79 + 0 + 0 + OAX + + + SDZ040 + 410400 + Brookings + SD + US + 44.37 + -96.79 + 0 + 0 + FSD + + + SDZ062 + 410620 + Minnehaha + SD + US + 43.67 + -96.79 + 0 + 0 + FSD + + + MNZ007 + 230070 + West_Marshall + MN + US + 48.36 + -96.78 + 0 + 0 + FGF + + + TXZ119 + 431190 + Dallas + TX + US + 32.77 + -96.77 + 0 + 0 + FWD + + + OKZ051 + 360510 + Marshall + OK + US + 34.01 + -96.76 + 0 + 0 + OUN + + + MNZ001 + 230010 + West_Polk + MN + US + 47.84 + -96.75 + 0 + 0 + FGF + + + TXZ134 + 431340 + Ellis + TX + US + 32.31 + -96.74 + 0 + 0 + FWD + + + KSZ036 + 160360 + Geary + KS + US + 39.04 + -96.72 + 0 + 0 + TOP + + + SDZ067 + 410670 + Lincoln + SD + US + 43.29 + -96.69 + 0 + 0 + FSD + + + NEZ066 + 270660 + Lancaster + NE + US + 40.78 + -96.68 + 0 + 0 + OAX + + + NEZ089 + 270890 + Gage + NE + US + 40.26 + -96.68 + 0 + 0 + OAX + + + KSZ022 + 160220 + Riley + KS + US + 39.30 + -96.67 + 0 + 0 + TOP + + + OKZ047 + 360470 + Johnston + OK + US + 34.32 + -96.67 + 0 + 0 + OUN + + + SDZ023 + 410230 + Deuel + SD + US + 44.76 + -96.67 + 0 + 0 + ABR + + + SDZ056 + 410560 + Moody + SD + US + 44.02 + -96.67 + 0 + 0 + FSD + + + OKZ042 + 360420 + Pontotoc + OK + US + 34.74 + -96.66 + 0 + 0 + OUN + + + TXZ093 + 430930 + Grayson + TX + US + 33.68 + -96.65 + 0 + 0 + FWD + + + KSZ037 + 160370 + Morris + KS + US + 38.69 + -96.64 + 0 + 0 + TOP + + + OKZ059 + 360590 + Pawnee + OK + US + 36.37 + -96.64 + 0 + 0 + TSA + + + SDZ071 + 410710 + Union + SD + US + 42.79 + -96.64 + 0 + 0 + FSD + + + TXZ247 + 432470 + Calhoun + TX + US + 28.39 + -96.63 + 0 + 0 + CRP + + + NEZ044 + 270440 + Dodge + NE + US + 41.57 + -96.62 + 0 + 0 + OAX + + + TXZ195 + 431950 + Burleson + TX + US + 30.52 + -96.62 + 0 + 0 + HGX + + + TXZ235 + 432350 + Jackson + TX + US + 28.96 + -96.62 + 0 + 0 + HGX + + + NEZ051 + 270510 + Saunders + NE + US + 41.24 + -96.61 + 0 + 0 + OAX + + + OKZ031 + 360310 + Seminole + OK + US + 35.16 + -96.61 + 0 + 0 + OUN + + + KSZ053 + 160530 + Chase + KS + US + 38.30 + -96.59 + 0 + 0 + ICT + + + TXZ161 + 431610 + Limestone + TX + US + 31.53 + -96.58 + 0 + 0 + FWD + + + MNZ039 + 230390 + Traverse + MN + US + 45.80 + -96.56 + 0 + 0 + ABR + + + TXZ104 + 431040 + Collin + TX + US + 33.20 + -96.56 + 0 + 0 + FWD + + + NEZ015 + 270150 + Thurston + NE + US + 42.15 + -96.55 + 0 + 0 + OAX + + + OKZ054 + 360540 + Osage + OK + US + 36.58 + -96.54 + 0 + 0 + TSA + + + TXZ175 + 431750 + Robertson + TX + US + 31.04 + -96.54 + 0 + 0 + FWD + + + NEZ014 + 270140 + Dakota + NE + US + 42.40 + -96.53 + 0 + 0 + FSD + + + TXZ210 + 432100 + Colorado + TX + US + 29.60 + -96.53 + 0 + 0 + HGX + + + KSZ010 + 160100 + Marshall + KS + US + 39.78 + -96.52 + 0 + 0 + TOP + + + MNZ029 + 230290 + Wilkin + MN + US + 46.33 + -96.52 + 0 + 0 + FGF + + + MNZ003 + 230030 + Clay + MN + US + 46.89 + -96.51 + 0 + 0 + FGF + + + MNZ046 + 230460 + Big_Stone + MN + US + 45.38 + -96.48 + 0 + 0 + ABR + + + MNZ002 + 230020 + Norman + MN + US + 47.33 + -96.47 + 0 + 0 + FGF + + + TXZ146 + 431460 + Navarro + TX + US + 32.07 + -96.47 + 0 + 0 + FWD + + + TXZ197 + 431970 + Washington + TX + US + 30.23 + -96.44 + 0 + 0 + HGX + + + TXZ120 + 431200 + Rockwall + TX + US + 32.91 + -96.40 + 0 + 0 + FWD + + + KSZ023 + 160230 + Pottawatomie + KS + US + 39.34 + -96.37 + 0 + 0 + TOP + + + TXZ196 + 431960 + Brazos + TX + US + 30.66 + -96.34 + 0 + 0 + HGX + + + OKZ064 + 360640 + Creek + OK + US + 35.91 + -96.33 + 0 + 0 + TSA + + + TXZ211 + 432110 + Austin + TX + US + 29.85 + -96.32 + 0 + 0 + HGX + + + NEZ034 + 270340 + Burt + NE + US + 41.87 + -96.31 + 0 + 0 + OAX + + + OKZ043 + 360430 + Coal + OK + US + 34.60 + -96.30 + 0 + 0 + OUN + + + OKZ065 + 360650 + Okfuskee + OK + US + 35.47 + -96.30 + 0 + 0 + TSA + + + TXZ121 + 431210 + Kaufman + TX + US + 32.61 + -96.30 + 0 + 0 + FWD + + + MNZ071 + 230710 + Lincoln + MN + US + 44.41 + -96.27 + 0 + 0 + FSD + + + MNZ097 + 230970 + Pipestone + MN + US + 44.02 + -96.26 + 0 + 0 + FSD + + + MNZ098 + 230980 + Rock + MN + US + 43.67 + -96.26 + 0 + 0 + FSD + + + NEZ090 + 270900 + Johnson + NE + US + 40.39 + -96.26 + 0 + 0 + OAX + + + IAZ020 + 150200 + Plymouth + IA + US + 42.74 + -96.25 + 0 + 0 + FSD + + + TXZ226 + 432260 + Wharton + TX + US + 29.30 + -96.25 + 0 + 0 + HGX + + + KSZ070 + 160700 + Greenwood + KS + US + 37.88 + -96.24 + 0 + 0 + ICT + + + KSZ094 + 160940 + Elk + KS + US + 37.45 + -96.24 + 0 + 0 + ICT + + + KSZ098 + 160980 + Chautauqua + KS + US + 37.15 + -96.24 + 0 + 0 + ICT + + + IAZ001 + 150010 + Lyon + IA + US + 43.38 + -96.23 + 0 + 0 + FSD + + + NEZ092 + 270920 + Pawnee + NE + US + 40.13 + -96.23 + 0 + 0 + OAX + + + OKZ032 + 360320 + Hughes + OK + US + 35.03 + -96.23 + 0 + 0 + OUN + + + IAZ012 + 150120 + Sioux + IA + US + 43.09 + -96.22 + 0 + 0 + FSD + + + KSZ038 + 160380 + Wabaunsee + KS + US + 38.97 + -96.22 + 0 + 0 + TOP + + + OKZ052 + 360520 + Bryan + OK + US + 33.93 + -96.19 + 0 + 0 + OUN + + + NEZ045 + 270450 + Washington + NE + US + 41.54 + -96.18 + 0 + 0 + OAX + + + NEZ052 + 270520 + Douglas + NE + US + 41.29 + -96.18 + 0 + 0 + OAX + + + KSZ054 + 160540 + Lyon + KS + US + 38.45 + -96.15 + 0 + 0 + TOP + + + NEZ067 + 270670 + Cass + NE + US + 40.93 + -96.15 + 0 + 0 + OAX + + + TXZ147 + 431470 + Freestone + TX + US + 31.72 + -96.14 + 0 + 0 + FWD + + + TXZ094 + 430940 + Fannin + TX + US + 33.62 + -96.11 + 0 + 0 + FWD + + + MNZ014 + 230140 + Red_Lake + MN + US + 47.86 + -96.10 + 0 + 0 + FGF + + + MNZ054 + 230540 + Lac_qui_Parle + MN + US + 45.04 + -96.09 + 0 + 0 + MPX + + + NEZ053 + 270530 + Sarpy + NE + US + 41.09 + -96.09 + 0 + 0 + OAX + + + NEZ068 + 270680 + Otoe + NE + US + 40.66 + -96.09 + 0 + 0 + OAX + + + IAZ031 + 150310 + Woodbury + IA + US + 42.39 + -96.08 + 0 + 0 + FSD + + + TXZ105 + 431050 + Hunt + TX + US + 33.13 + -96.07 + 0 + 0 + FWD + + + MNZ013 + 230130 + Pennington + MN + US + 48.05 + -96.04 + 0 + 0 + FGF + + + OKZ048 + 360480 + Atoka + OK + US + 34.43 + -96.04 + 0 + 0 + OUN + + + OKZ060 + 360600 + Tulsa + OK + US + 36.15 + -96.03 + 0 + 0 + TSA + + + IAZ043 + 150430 + Monona + IA + US + 42.04 + -96.02 + 0 + 0 + OAX + + + MNZ030 + 230300 + West_Otter_Tail + MN + US + 46.41 + -96.02 + 0 + 0 + FGF + + + KSZ011 + 160110 + Nemaha + KS + US + 39.78 + -96.01 + 0 + 0 + TOP + + + MNZ040 + 230400 + Grant + MN + US + 45.93 + -96.01 + 0 + 0 + FGF + + + MNZ047 + 230470 + Stevens + MN + US + 45.59 + -96.00 + 0 + 0 + MPX + + + TXZ212 + 432120 + Waller + TX + US + 29.99 + -96.00 + 0 + 0 + HGX + + + MNZ008 + 230080 + East_Marshall + MN + US + 48.36 + -95.99 + 0 + 0 + FGF + + + TXZ162 + 431620 + Leon + TX + US + 31.32 + -95.99 + 0 + 0 + FWD + + + TXZ198 + 431980 + Grimes + TX + US + 30.55 + -95.99 + 0 + 0 + HGX + + + MNZ015 + 230150 + East_Polk + MN + US + 47.72 + -95.95 + 0 + 0 + FGF + + + OKZ066 + 360660 + Okmulgee + OK + US + 35.62 + -95.95 + 0 + 0 + TSA + + + TXZ135 + 431350 + Henderson + TX + US + 32.19 + -95.94 + 0 + 0 + FWD + + + TXZ236 + 432360 + Matagorda + TX + US + 28.81 + -95.94 + 0 + 0 + HGX + + + MNZ027 + 230270 + West_Becker + MN + US + 46.94 + -95.93 + 0 + 0 + FGF + + + TXZ176 + 431760 + Madison + TX + US + 30.97 + -95.93 + 0 + 0 + HGX + + + MNZ064 + 230640 + Yellow_Medicine + MN + US + 44.74 + -95.91 + 0 + 0 + MPX + + + OKZ055 + 360550 + Washington + OK + US + 36.71 + -95.90 + 0 + 0 + TSA + + + MNZ072 + 230720 + Lyon + MN + US + 44.41 + -95.84 + 0 + 0 + FSD + + + IAZ055 + 150550 + Harrison + IA + US + 41.69 + -95.82 + 0 + 0 + OAX + + + MNZ022 + 230220 + Mahnomen + MN + US + 47.33 + -95.81 + 0 + 0 + FGF + + + NEZ091 + 270910 + Nemaha + NE + US + 40.41 + -95.80 + 0 + 0 + OAX + + + TXZ123 + 431230 + Rains + TX + US + 32.85 + -95.80 + 0 + 0 + FWD + + + KSZ024 + 160240 + Jackson + KS + US + 39.43 + -95.79 + 0 + 0 + TOP + + + MNZ080 + 230800 + Murray + MN + US + 44.02 + -95.77 + 0 + 0 + FSD + + + KSZ039 + 160390 + Shawnee + KS + US + 39.04 + -95.76 + 0 + 0 + TOP + + + MNZ089 + 230890 + Nobles + MN + US + 43.67 + -95.76 + 0 + 0 + FSD + + + TXZ122 + 431220 + Van_Zandt + TX + US + 32.61 + -95.76 + 0 + 0 + FWD + + + MNZ005 + 230050 + Roseau + MN + US + 48.77 + -95.75 + 0 + 0 + FGF + + + TXZ227 + 432270 + Fort_Bend + TX + US + 29.53 + -95.75 + 0 + 0 + HGX + + + KSZ095 + 160950 + Wilson + KS + US + 37.56 + -95.74 + 0 + 0 + ICT + + + KSZ099 + 160990 + Montgomery + KS + US + 37.19 + -95.74 + 0 + 0 + ICT + + + KSZ058 + 160580 + Coffey + KS + US + 38.23 + -95.73 + 0 + 0 + TOP + + + KSZ071 + 160710 + Woodson + KS + US + 37.88 + -95.73 + 0 + 0 + ICT + + + KSZ055 + 160550 + Osage + KS + US + 38.65 + -95.72 + 0 + 0 + TOP + + + OKZ073 + 360730 + Pittsburg + OK + US + 34.95 + -95.72 + 0 + 0 + TSA + + + MNZ055 + 230550 + Swift + MN + US + 45.28 + -95.69 + 0 + 0 + MPX + + + OKZ071 + 360710 + McIntosh + OK + US + 35.35 + -95.66 + 0 + 0 + TSA + + + TXZ148 + 431480 + Anderson + TX + US + 31.80 + -95.66 + 0 + 0 + FWD + + + MNZ056 + 230560 + Chippewa + MN + US + 44.96 + -95.65 + 0 + 0 + MPX + + + NEZ093 + 270930 + Richardson + NE + US + 40.13 + -95.65 + 0 + 0 + OAX + + + IAZ079 + 150790 + Mills + IA + US + 41.03 + -95.64 + 0 + 0 + OAX + + + IAZ002 + 150020 + Osceola + IA + US + 43.38 + -95.63 + 0 + 0 + FSD + + + IAZ013 + 150130 + O'Brien + IA + US + 43.09 + -95.63 + 0 + 0 + FSD + + + IAZ021 + 150210 + Cherokee + IA + US + 42.74 + -95.63 + 0 + 0 + FSD + + + IAZ090 + 150900 + Fremont + IA + US + 40.75 + -95.63 + 0 + 0 + OAX + + + OKZ056 + 360560 + Nowata + OK + US + 36.80 + -95.61 + 0 + 0 + TSA + + + TXZ177 + 431770 + Walker + TX + US + 30.79 + -95.60 + 0 + 0 + HGX + + + IAZ069 + 150690 + Pottawattamie + IA + US + 41.34 + -95.59 + 0 + 0 + OAX + + + TXZ095 + 430950 + Lamar + TX + US + 33.66 + -95.58 + 0 + 0 + FWD + + + TXZ106 + 431060 + Delta + TX + US + 33.36 + -95.58 + 0 + 0 + FWD + + + TXZ107 + 431070 + Hopkins + TX + US + 33.18 + -95.58 + 0 + 0 + FWD + + + OKZ053 + 360530 + Choctaw + OK + US + 34.02 + -95.57 + 0 + 0 + TSA + + + OKZ061 + 360610 + Rogers + OK + US + 36.34 + -95.57 + 0 + 0 + TSA + + + KSZ012 + 160120 + Brown + KS + US + 39.82 + -95.56 + 0 + 0 + TOP + + + IAZ032 + 150320 + Ida + IA + US + 42.39 + -95.54 + 0 + 0 + FSD + + + OKZ067 + 360670 + Wagoner + OK + US + 35.97 + -95.51 + 0 + 0 + TSA + + + MOZ001 + 250010 + Atchison + MO + US + 40.43 + -95.48 + 0 + 0 + EAX + + + TXZ237 + 432370 + Brazoria + TX + US + 29.21 + -95.47 + 0 + 0 + HGX + + + MNZ031 + 230310 + East_Otter_Tail + MN + US + 46.41 + -95.46 + 0 + 0 + FGF + + + TXZ199 + 431990 + Montgomery + TX + US + 30.33 + -95.46 + 0 + 0 + HGX + + + MNZ041 + 230410 + Douglas + MN + US + 45.93 + -95.45 + 0 + 0 + MPX + + + MNZ048 + 230480 + Pope + MN + US + 45.58 + -95.44 + 0 + 0 + MPX + + + TXZ213 + 432130 + Harris + TX + US + 29.84 + -95.44 + 0 + 0 + HGX + + + OKZ070 + 360700 + Muskogee + OK + US + 35.57 + -95.42 + 0 + 0 + TSA + + + MNZ028 + 230280 + East_Becker + MN + US + 46.93 + -95.41 + 0 + 0 + FGF + + + TXZ124 + 431240 + Wood + TX + US + 32.78 + -95.40 + 0 + 0 + SHV + + + IAZ044 + 150440 + Crawford + IA + US + 42.04 + -95.39 + 0 + 0 + DMX + + + MNZ016 + 230160 + North_Clearwater + MN + US + 47.76 + -95.39 + 0 + 0 + FGF + + + KSZ026 + 160260 + Jefferson + KS + US + 39.22 + -95.38 + 0 + 0 + TOP + + + TXZ163 + 431630 + Houston + TX + US + 31.27 + -95.37 + 0 + 0 + HGX + + + MNZ023 + 230230 + South_Clearwater + MN + US + 47.32 + -95.36 + 0 + 0 + FGF + + + OKZ049 + 360490 + Pushmataha + OK + US + 34.42 + -95.36 + 0 + 0 + TSA + + + IAZ056 + 150560 + Shelby + IA + US + 41.68 + -95.31 + 0 + 0 + OAX + + + KSZ072 + 160720 + Allen + KS + US + 37.88 + -95.30 + 0 + 0 + ICT + + + KSZ096 + 160960 + Neosho + KS + US + 37.56 + -95.30 + 0 + 0 + ICT + + + KSZ059 + 160590 + Anderson + KS + US + 38.21 + -95.29 + 0 + 0 + TOP + + + KSZ100 + 161000 + Labette + KS + US + 37.19 + -95.29 + 0 + 0 + ICT + + + TXZ136 + 431360 + Smith + TX + US + 32.42 + -95.29 + 0 + 0 + SHV + + + KSZ056 + 160560 + Franklin + KS + US + 38.56 + -95.28 + 0 + 0 + TOP + + + KSZ040 + 160400 + Douglas + KS + US + 38.90 + -95.27 + 0 + 0 + TOP + + + KSZ025 + 160250 + Atchison + KS + US + 39.53 + -95.26 + 0 + 0 + EAX + + + MOZ011 + 250110 + Holt + MO + US + 40.07 + -95.26 + 0 + 0 + EAX + + + MNZ073 + 230730 + Redwood + MN + US + 44.45 + -95.23 + 0 + 0 + MPX + + + OKZ062 + 360620 + Mayes + OK + US + 36.30 + -95.23 + 0 + 0 + TSA + + + OKZ057 + 360570 + Craig + OK + US + 36.76 + -95.22 + 0 + 0 + TSA + + + OKZ075 + 360750 + Latimer + OK + US + 34.88 + -95.22 + 0 + 0 + TSA + + + TXZ108 + 431080 + Franklin + TX + US + 33.18 + -95.21 + 0 + 0 + SHV + + + MNZ081 + 230810 + Cottonwood + MN + US + 44.02 + -95.17 + 0 + 0 + FSD + + + TXZ149 + 431490 + Cherokee + TX + US + 31.79 + -95.17 + 0 + 0 + SHV + + + IAZ003 + 150030 + Dickinson + IA + US + 43.38 + -95.16 + 0 + 0 + FSD + + + IAZ014 + 150140 + Clay + IA + US + 43.08 + -95.16 + 0 + 0 + FSD + + + IAZ022 + 150220 + Buena_Vista + IA + US + 42.74 + -95.16 + 0 + 0 + FSD + + + IAZ080 + 150800 + Montgomery + IA + US + 41.04 + -95.16 + 0 + 0 + OAX + + + IAZ091 + 150910 + Page + IA + US + 40.74 + -95.16 + 0 + 0 + OAX + + + MNZ090 + 230900 + Jackson + MN + US + 43.67 + -95.16 + 0 + 0 + FSD + + + IAZ033 + 150330 + Sac + IA + US + 42.39 + -95.13 + 0 + 0 + DMX + + + OKZ074 + 360740 + Haskell + OK + US + 35.27 + -95.13 + 0 + 0 + TSA + + + TXZ164 + 431640 + Trinity + TX + US + 31.11 + -95.13 + 0 + 0 + HGX + + + KSZ102 + 161020 + Doniphan + KS + US + 39.81 + -95.10 + 0 + 0 + EAX + + + TXZ178 + 431780 + San_Jacinto + TX + US + 30.62 + -95.10 + 0 + 0 + HGX + + + OKZ068 + 360680 + Cherokee + OK + US + 35.91 + -95.04 + 0 + 0 + TSA + + + TXZ096 + 430960 + Red_River + TX + US + 33.65 + -95.02 + 0 + 0 + SHV + + + MNZ009 + 230090 + North_Beltrami + MN + US + 48.20 + -95.01 + 0 + 0 + FGF + + + MNZ057 + 230570 + Kandiyohi + MN + US + 45.15 + -95.01 + 0 + 0 + MPX + + + KSZ103 + 161030 + Leavenworth + KS + US + 39.19 + -94.99 + 0 + 0 + EAX + + + MNZ065 + 230650 + Renville + MN + US + 44.67 + -94.99 + 0 + 0 + MPX + + + TXZ109 + 431090 + Titus + TX + US + 33.19 + -94.97 + 0 + 0 + SHV + + + MNZ032 + 230320 + Wadena + MN + US + 46.59 + -94.95 + 0 + 0 + FGF + + + IAZ070 + 150700 + Cass + IA + US + 41.33 + -94.94 + 0 + 0 + DMX + + + TXZ110 + 431100 + Camp + TX + US + 33.00 + -94.94 + 0 + 0 + SHV + + + MNZ024 + 230240 + Hubbard + MN + US + 47.11 + -94.92 + 0 + 0 + FGF + + + TXZ125 + 431250 + Upshur + TX + US + 32.72 + -94.92 + 0 + 0 + SHV + + + IAZ057 + 150570 + Audubon + IA + US + 41.68 + -94.91 + 0 + 0 + DMX + + + MOZ002 + 250020 + Nodaway + MO + US + 40.36 + -94.91 + 0 + 0 + EAX + + + MNZ042 + 230420 + Todd + MN + US + 46.07 + -94.90 + 0 + 0 + MPX + + + MNZ006 + 230060 + Lake_of_The_Woods + MN + US + 48.87 + -94.89 + 0 + 0 + FGF + + + IAZ045 + 150450 + Carroll + IA + US + 42.03 + -94.87 + 0 + 0 + DMX + + + TXZ179 + 431790 + Polk + TX + US + 30.82 + -94.87 + 0 + 0 + HGX + + + MOZ020 + 250200 + Buchanan + MO + US + 39.68 + -94.86 + 0 + 0 + EAX + + + KSZ073 + 160730 + Bourbon + KS + US + 37.85 + -94.85 + 0 + 0 + SGF + + + KSZ097 + 160970 + Crawford + KS + US + 37.50 + -94.85 + 0 + 0 + SGF + + + KSZ101 + 161010 + Cherokee + KS + US + 37.16 + -94.85 + 0 + 0 + SGF + + + MOZ028 + 250280 + Platte + MO + US + 39.34 + -94.85 + 0 + 0 + EAX + + + KSZ057 + 160570 + Miami + KS + US + 38.56 + -94.84 + 0 + 0 + EAX + + + KSZ060 + 160600 + Linn + KS + US + 38.21 + -94.84 + 0 + 0 + EAX + + + MOZ012 + 250120 + Andrew + MO + US + 39.97 + -94.84 + 0 + 0 + EAX + + + KSZ105 + 161050 + Johnson + KS + US + 38.89 + -94.83 + 0 + 0 + EAX + + + OKZ058 + 360580 + Ottawa + OK + US + 36.83 + -94.83 + 0 + 0 + TSA + + + MNZ017 + 230170 + South_Beltrami + MN + US + 47.63 + -94.81 + 0 + 0 + FGF + + + OKZ077 + 360770 + McCurtain + OK + US + 34.07 + -94.81 + 0 + 0 + SHV + + + TXZ200 + 432000 + Liberty + TX + US + 30.19 + -94.81 + 0 + 0 + HGX + + + TXZ238 + 432380 + Galveston + TX + US + 29.34 + -94.81 + 0 + 0 + HGX + + + OKZ063 + 360630 + Delaware + OK + US + 36.42 + -94.79 + 0 + 0 + TSA + + + OKZ072 + 360720 + Sequoyah + OK + US + 35.46 + -94.78 + 0 + 0 + TSA + + + TXZ137 + 431370 + Gregg + TX + US + 32.51 + -94.78 + 0 + 0 + SHV + + + KSZ104 + 161040 + Wyandotte + KS + US + 39.09 + -94.75 + 0 + 0 + EAX + + + MNZ074 + 230740 + Brown + MN + US + 44.30 + -94.74 + 0 + 0 + MPX + + + OKZ076 + 360760 + Le_Flore + OK + US + 34.95 + -94.74 + 0 + 0 + TSA + + + TXZ111 + 431110 + Morris + TX + US + 33.13 + -94.74 + 0 + 0 + SHV + + + TXZ150 + 431500 + Rusk + TX + US + 32.13 + -94.72 + 0 + 0 + SHV + + + IAZ081 + 150810 + Adams + IA + US + 41.03 + -94.71 + 0 + 0 + DMX + + + IAZ092 + 150920 + Taylor + IA + US + 40.74 + -94.71 + 0 + 0 + DMX + + + IAZ004 + 150040 + Emmet + IA + US + 43.38 + -94.69 + 0 + 0 + DMX + + + IAZ015 + 150150 + Palo_Alto + IA + US + 43.08 + -94.69 + 0 + 0 + DMX + + + IAZ023 + 150230 + Pocahontas + IA + US + 42.74 + -94.69 + 0 + 0 + DMX + + + TXZ214 + 432140 + Chambers + TX + US + 29.71 + -94.67 + 0 + 0 + HGX + + + IAZ034 + 150340 + Calhoun + IA + US + 42.38 + -94.66 + 0 + 0 + DMX + + + OKZ069 + 360690 + Adair + OK + US + 35.91 + -94.64 + 0 + 0 + TSA + + + TXZ152 + 431520 + Nacogdoches + TX + US + 31.54 + -94.64 + 0 + 0 + SHV + + + MNZ082 + 230820 + Watonwan + MN + US + 43.98 + -94.62 + 0 + 0 + MPX + + + MNZ049 + 230490 + Stearns + MN + US + 45.53 + -94.59 + 0 + 0 + MPX + + + TXZ165 + 431650 + Angelina + TX + US + 31.28 + -94.57 + 0 + 0 + SHV + + + MNZ033 + 230330 + South_Cass + MN + US + 46.54 + -94.56 + 0 + 0 + DLH + + + MNZ091 + 230910 + Martin + MN + US + 43.67 + -94.55 + 0 + 0 + MPX + + + MNZ058 + 230580 + Meeker + MN + US + 45.11 + -94.51 + 0 + 0 + MPX + + + IAZ058 + 150580 + Guthrie + IA + US + 41.68 + -94.50 + 0 + 0 + DMX + + + IAZ071 + 150710 + Adair + IA + US + 41.33 + -94.48 + 0 + 0 + DMX + + + MOZ003 + 250030 + Worth + MO + US + 40.48 + -94.43 + 0 + 0 + EAX + + + MOZ004 + 250040 + Gentry + MO + US + 40.21 + -94.42 + 0 + 0 + EAX + + + MOZ021 + 250210 + Clinton + MO + US + 39.60 + -94.42 + 0 + 0 + EAX + + + MOZ029 + 250290 + Clay + MO + US + 39.28 + -94.42 + 0 + 0 + EAX + + + IAZ046 + 150460 + Greene + IA + US + 42.03 + -94.41 + 0 + 0 + DMX + + + MOZ013 + 250130 + De_Kalb + MO + US + 39.89 + -94.41 + 0 + 0 + EAX + + + TXZ201 + 432010 + Hardin + TX + US + 30.31 + -94.40 + 0 + 0 + LCH + + + TXZ097 + 430970 + Bowie + TX + US + 33.47 + -94.39 + 0 + 0 + SHV + + + TXZ126 + 431260 + Marion + TX + US + 32.79 + -94.38 + 0 + 0 + SHV + + + TXZ138 + 431380 + Harrison + TX + US + 32.56 + -94.37 + 0 + 0 + SHV + + + MNZ075 + 230750 + Nicollet + MN + US + 44.31 + -94.36 + 0 + 0 + MPX + + + MOZ037 + 250370 + Jackson + MO + US + 39.03 + -94.36 + 0 + 0 + EAX + + + MOZ077 + 250770 + Barton + MO + US + 37.50 + -94.35 + 0 + 0 + SGF + + + MOZ101 + 251010 + McDonald + MO + US + 36.63 + -94.35 + 0 + 0 + SGF + + + TXZ112 + 431120 + Cass + TX + US + 33.10 + -94.35 + 0 + 0 + SHV + + + TXZ180 + 431800 + Tyler + TX + US + 30.79 + -94.35 + 0 + 0 + LCH + + + MOZ043 + 250430 + Cass + MO + US + 38.64 + -94.34 + 0 + 0 + EAX + + + MOZ053 + 250530 + Bates + MO + US + 38.25 + -94.34 + 0 + 0 + EAX + + + MOZ066 + 250660 + Vernon + MO + US + 37.85 + -94.34 + 0 + 0 + SGF + + + MOZ088 + 250880 + Jasper + MO + US + 37.21 + -94.34 + 0 + 0 + SGF + + + MOZ093 + 250930 + Newton + MO + US + 36.90 + -94.34 + 0 + 0 + SGF + + + TXZ151 + 431510 + Panola + TX + US + 32.18 + -94.30 + 0 + 0 + SHV + + + MNZ066 + 230660 + McLeod + MN + US + 44.81 + -94.26 + 0 + 0 + MPX + + + IAZ082 + 150820 + Union + IA + US + 41.03 + -94.25 + 0 + 0 + DMX + + + IAZ093 + 150930 + Ringgold + IA + US + 40.74 + -94.25 + 0 + 0 + DMX + + + ARZ001 + 40010 + Benton + AR + US + 36.30 + -94.24 + 0 + 0 + TSA + + + ARZ029 + 40290 + Sebastian + AR + US + 35.19 + -94.24 + 0 + 0 + TSA + + + ARZ010 + 40100 + Washington + AR + US + 36.00 + -94.22 + 0 + 0 + TSA + + + ARZ050 + 40500 + Sevier + AR + US + 33.97 + -94.22 + 0 + 0 + SHV + + + IAZ005 + 150050 + Kossuth + IA + US + 43.21 + -94.22 + 0 + 0 + DMX + + + IAZ024 + 150240 + Humboldt + IA + US + 42.78 + -94.22 + 0 + 0 + DMX + + + MNZ025 + 230250 + North_Cass + MN + US + 47.14 + -94.22 + 0 + 0 + DLH + + + MNZ043 + 230430 + Morrison + MN + US + 46.06 + -94.21 + 0 + 0 + MPX + + + ARZ040 + 40400 + Polk + AR + US + 34.47 + -94.20 + 0 + 0 + LZK + + + MNZ067 + 230670 + Sibley + MN + US + 44.59 + -94.20 + 0 + 0 + MPX + + + ARZ019 + 40190 + Crawford + AR + US + 35.56 + -94.19 + 0 + 0 + TSA + + + IAZ035 + 150350 + Webster + IA + US + 42.43 + -94.19 + 0 + 0 + DMX + + + TXZ166 + 431660 + San_Augustine + TX + US + 31.38 + -94.19 + 0 + 0 + SHV + + + TXZ153 + 431530 + Shelby + TX + US + 31.78 + -94.15 + 0 + 0 + SHV + + + ARZ059 + 40590 + Little_River + AR + US + 33.74 + -94.14 + 0 + 0 + SHV + + + TXZ215 + 432150 + Jefferson + TX + US + 29.87 + -94.14 + 0 + 0 + LCH + + + ARZ037 + 40370 + Scott + AR + US + 34.89 + -94.08 + 0 + 0 + LZK + + + MNZ034 + 230340 + Crow_Wing + MN + US + 46.48 + -94.08 + 0 + 0 + DLH + + + MNZ083 + 230830 + Blue_Earth + MN + US + 44.06 + -94.07 + 0 + 0 + MPX + + + MNZ050 + 230500 + Benton + MN + US + 45.69 + -94.06 + 0 + 0 + MPX + + + IAZ059 + 150590 + Dallas + IA + US + 41.68 + -94.04 + 0 + 0 + DMX + + + ARZ051 + 40510 + Howard + AR + US + 34.05 + -94.03 + 0 + 0 + SHV + + + IAZ072 + 150720 + Madison + IA + US + 41.34 + -94.02 + 0 + 0 + DMX + + + MOZ005 + 250050 + Harrison + MO + US + 40.36 + -94.00 + 0 + 0 + EAX + + + MOZ014 + 250140 + Daviess + MO + US + 39.96 + -94.00 + 0 + 0 + EAX + + + TXZ181 + 431810 + Jasper + TX + US + 30.70 + -94.00 + 0 + 0 + LCH + + + MOZ022 + 250220 + Caldwell + MO + US + 39.66 + -93.99 + 0 + 0 + EAX + + + MOZ030 + 250300 + Ray + MO + US + 39.33 + -93.99 + 0 + 0 + EAX + + + MNZ092 + 230920 + Faribault + MN + US + 43.67 + -93.95 + 0 + 0 + MPX + + + IAZ047 + 150470 + Boone + IA + US + 42.03 + -93.94 + 0 + 0 + DMX + + + TXZ216 + 432160 + Orange + TX + US + 30.10 + -93.90 + 0 + 0 + LCH + + + MNZ059 + 230590 + Wright + MN + US + 45.20 + -93.89 + 0 + 0 + MPX + + + ARZ020 + 40200 + Franklin + AR + US + 35.49 + -93.88 + 0 + 0 + TSA + + + MOZ089 + 250890 + Dade + MO + US + 37.43 + -93.86 + 0 + 0 + SGF + + + ARZ070 + 40700 + Miller + AR + US + 33.31 + -93.85 + 0 + 0 + SHV + + + MOZ078 + 250780 + Cedar + MO + US + 37.73 + -93.85 + 0 + 0 + SGF + + + MOZ094 + 250940 + Lawrence + MO + US + 37.11 + -93.84 + 0 + 0 + SGF + + + MNZ051 + 230510 + Sherburne + MN + US + 45.41 + -93.83 + 0 + 0 + MPX + + + MOZ102 + 251020 + Barry + MO + US + 36.71 + -93.83 + 0 + 0 + SGF + + + MOZ044 + 250440 + Johnson + MO + US + 38.75 + -93.82 + 0 + 0 + EAX + + + TXZ167 + 431670 + Sabine + TX + US + 31.37 + -93.82 + 0 + 0 + SHV + + + MOZ038 + 250380 + Lafayette + MO + US + 39.09 + -93.80 + 0 + 0 + EAX + + + IAZ083 + 150830 + Clarke + IA + US + 41.03 + -93.79 + 0 + 0 + DMX + + + IAZ094 + 150940 + Decatur + IA + US + 40.74 + -93.79 + 0 + 0 + DMX + + + MOZ054 + 250540 + Henry + MO + US + 38.38 + -93.79 + 0 + 0 + EAX + + + MOZ067 + 250670 + St._Clair + MO + US + 38.02 + -93.79 + 0 + 0 + SGF + + + MNZ076 + 230760 + Le_Sueur + MN + US + 44.37 + -93.78 + 0 + 0 + MPX + + + LAZ001 + 180010 + Caddo + LA + US + 32.61 + -93.77 + 0 + 0 + SHV + + + MNZ068 + 230680 + Carver + MN + US + 44.81 + -93.77 + 0 + 0 + MPX + + + MNZ010 + 230100 + Koochiching + MN + US + 48.28 + -93.76 + 0 + 0 + DLH + + + IAZ006 + 150060 + Winnebago + IA + US + 43.38 + -93.74 + 0 + 0 + DMX + + + IAZ016 + 150160 + Hancock + IA + US + 43.08 + -93.74 + 0 + 0 + DMX + + + IAZ025 + 150250 + Wright + IA + US + 42.73 + -93.74 + 0 + 0 + DMX + + + MNZ018 + 230180 + North_Itasca + MN + US + 47.66 + -93.74 + 0 + 0 + DLH + + + IAZ036 + 150360 + Hamilton + IA + US + 42.38 + -93.72 + 0 + 0 + DMX + + + ARZ030 + 40300 + Logan + AR + US + 35.22 + -93.71 + 0 + 0 + LZK + + + ARZ060 + 40600 + Hempstead + AR + US + 33.75 + -93.71 + 0 + 0 + SHV + + + TXZ182 + 431820 + Newton + TX + US + 30.72 + -93.71 + 0 + 0 + LCH + + + ARZ011 + 40110 + Madison + AR + US + 36.03 + -93.70 + 0 + 0 + TSA + + + LAZ010 + 180100 + De_Soto + LA + US + 32.10 + -93.69 + 0 + 0 + SHV + + + ARZ041 + 40410 + Montgomery + AR + US + 34.55 + -93.66 + 0 + 0 + LZK + + + ARZ052 + 40520 + Pike + AR + US + 34.15 + -93.65 + 0 + 0 + LZK + + + MNZ044 + 230440 + Mille_Lacs + MN + US + 45.90 + -93.62 + 0 + 0 + MPX + + + ARZ071 + 40710 + Lafayette + AR + US + 33.25 + -93.61 + 0 + 0 + SHV + + + LAZ002 + 180020 + Bossier + LA + US + 32.63 + -93.61 + 0 + 0 + SHV + + + MNZ069 + 230690 + Scott + MN + US + 44.68 + -93.60 + 0 + 0 + MPX + + + MNZ084 + 230840 + Waseca + MN + US + 44.02 + -93.59 + 0 + 0 + MPX + + + ARZ002 + 40020 + Carroll + AR + US + 36.31 + -93.58 + 0 + 0 + TSA + + + MOZ006 + 250060 + Mercer + MO + US + 40.42 + -93.58 + 0 + 0 + EAX + + + IAZ060 + 150600 + Polk + IA + US + 41.68 + -93.57 + 0 + 0 + DMX + + + MNZ026 + 230260 + South_Itasca + MN + US + 47.24 + -93.57 + 0 + 0 + DLH + + + MOZ015 + 250150 + Grundy + MO + US + 40.11 + -93.57 + 0 + 0 + EAX + + + IAZ073 + 150730 + Warren + IA + US + 41.34 + -93.56 + 0 + 0 + DMX + + + LAZ017 + 180170 + Sabine + LA + US + 31.51 + -93.55 + 0 + 0 + SHV + + + MOZ023 + 250230 + Livingston + MO + US + 39.79 + -93.52 + 0 + 0 + EAX + + + IAZ048 + 150480 + Story + IA + US + 42.03 + -93.47 + 0 + 0 + DMX + + + MNZ060 + 230600 + Hennepin + MN + US + 45.02 + -93.47 + 0 + 0 + MPX + + + MOZ103 + 251030 + Stone + MO + US + 36.74 + -93.47 + 0 + 0 + SGF + + + MOZ031 + 250310 + Carroll + MO + US + 39.41 + -93.44 + 0 + 0 + EAX + + + ARZ021 + 40210 + Johnson + AR + US + 35.55 + -93.43 + 0 + 0 + LZK + + + MNZ036 + 230360 + South_Aitkin + MN + US + 46.39 + -93.43 + 0 + 0 + DLH + + + MNZ035 + 230350 + Northern_Aitkin + MN + US + 46.83 + -93.42 + 0 + 0 + DLH + + + MOZ079 + 250790 + Polk + MO + US + 37.62 + -93.41 + 0 + 0 + SGF + + + LAZ011 + 180110 + Red_River + LA + US + 32.07 + -93.36 + 0 + 0 + SHV + + + LAZ030 + 180300 + Beauregard + LA + US + 30.65 + -93.36 + 0 + 0 + LCH + + + MNZ093 + 230930 + Freeborn + MN + US + 43.67 + -93.35 + 0 + 0 + MPX + + + MOZ090 + 250900 + Greene + MO + US + 37.26 + -93.35 + 0 + 0 + SGF + + + IAZ084 + 150840 + Lucas + IA + US + 41.03 + -93.33 + 0 + 0 + DMX + + + IAZ095 + 150950 + Wayne + IA + US + 40.74 + -93.33 + 0 + 0 + DMX + + + LAZ003 + 180030 + Webster + LA + US + 32.72 + -93.33 + 0 + 0 + SHV + + + ARZ038 + 40380 + Yell + AR + US + 35.03 + -93.32 + 0 + 0 + LZK + + + LAZ041 + 180410 + Calcasieu + LA + US + 30.27 + -93.32 + 0 + 0 + LCH + + + MOZ068 + 250680 + Hickory + MO + US + 37.93 + -93.32 + 0 + 0 + SGF + + + ARZ061 + 40610 + Nevada + AR + US + 33.70 + -93.29 + 0 + 0 + SHV + + + MNZ045 + 230450 + Kanabec + MN + US + 45.95 + -93.29 + 0 + 0 + MPX + + + MNZ077 + 230770 + Rice + MN + US + 44.37 + -93.29 + 0 + 0 + MPX + + + MOZ045 + 250450 + Pettis + MO + US + 38.72 + -93.29 + 0 + 0 + EAX + + + MOZ055 + 250550 + Benton + MO + US + 38.30 + -93.29 + 0 + 0 + SGF + + + MNZ052 + 230520 + Isanti + MN + US + 45.57 + -93.27 + 0 + 0 + MPX + + + MNZ061 + 230610 + Anoka + MN + US + 45.23 + -93.27 + 0 + 0 + MPX + + + IAZ007 + 150070 + Worth + IA + US + 43.38 + -93.26 + 0 + 0 + DMX + + + IAZ017 + 150170 + Cerro_Gordo + IA + US + 43.08 + -93.26 + 0 + 0 + DMX + + + IAZ026 + 150260 + Franklin + IA + US + 42.73 + -93.26 + 0 + 0 + DMX + + + MOZ095 + 250950 + Christian + MO + US + 36.95 + -93.26 + 0 + 0 + SGF + + + IAZ037 + 150370 + Hardin + IA + US + 42.38 + -93.25 + 0 + 0 + DMX + + + LAZ051 + 180510 + Cameron + LA + US + 29.83 + -93.25 + 0 + 0 + LCH + + + MNZ085 + 230850 + Steele + MN + US + 44.02 + -93.23 + 0 + 0 + MPX + + + ARZ012 + 40120 + Newton + AR + US + 35.93 + -93.22 + 0 + 0 + LZK + + + ARZ072 + 40720 + Columbia + AR + US + 33.24 + -93.22 + 0 + 0 + SHV + + + ARZ053 + 40530 + Clark + AR + US + 34.06 + -93.19 + 0 + 0 + LZK + + + LAZ027 + 180270 + Vernon + LA + US + 31.12 + -93.19 + 0 + 0 + LCH + + + MOZ039 + 250390 + Saline + MO + US + 39.17 + -93.18 + 0 + 0 + EAX + + + MNZ062 + 230620 + Ramsey + MN + US + 45.01 + -93.11 + 0 + 0 + MPX + + + MOZ016 + 250160 + Sullivan + MO + US + 40.21 + -93.11 + 0 + 0 + EAX + + + MOZ024 + 250240 + Linn + MO + US + 39.87 + -93.11 + 0 + 0 + EAX + + + IAZ074 + 150740 + Marion + IA + US + 41.34 + -93.10 + 0 + 0 + DMX + + + LAZ012 + 180120 + Bienville + LA + US + 32.37 + -93.10 + 0 + 0 + SHV + + + ARZ042 + 40420 + Garland + AR + US + 34.58 + -93.09 + 0 + 0 + LZK + + + LAZ018 + 180180 + Natchitoches + LA + US + 31.75 + -93.08 + 0 + 0 + SHV + + + ARZ003 + 40030 + Boone + AR + US + 36.31 + -93.07 + 0 + 0 + LZK + + + IAZ061 + 150610 + Jasper + IA + US + 41.69 + -93.06 + 0 + 0 + DMX + + + ARZ022 + 40220 + Pope + AR + US + 35.43 + -93.05 + 0 + 0 + LZK + + + MOZ104 + 251040 + Taney + MO + US + 36.66 + -93.05 + 0 + 0 + SGF + + + ARZ054 + 40540 + Hot_Spring + AR + US + 34.33 + -93.04 + 0 + 0 + LZK + + + MNZ070 + 230700 + Dakota + MN + US + 44.71 + -93.03 + 0 + 0 + MPX + + + MOZ007 + 250070 + Putnam + MO + US + 40.46 + -93.02 + 0 + 0 + EAX + + + MOZ080 + 250800 + Dallas + MO + US + 37.66 + -93.02 + 0 + 0 + SGF + + + IAZ049 + 150490 + Marshall + IA + US + 42.04 + -93.01 + 0 + 0 + DMX + + + MOZ032 + 250320 + Chariton + MO + US + 39.46 + -92.99 + 0 + 0 + EAX + + + LAZ004 + 180040 + Claiborne + LA + US + 32.80 + -92.97 + 0 + 0 + SHV + + + ARZ039 + 40390 + Perry + AR + US + 34.94 + -92.92 + 0 + 0 + LZK + + + MNZ053 + 230530 + Chisago + MN + US + 45.52 + -92.89 + 0 + 0 + MPX + + + MNZ063 + 230630 + Washington + MN + US + 45.02 + -92.88 + 0 + 0 + MPX + + + MOZ091 + 250910 + Webster + MO + US + 37.28 + -92.88 + 0 + 0 + SGF + + + IAZ085 + 150850 + Monroe + IA + US + 41.03 + -92.87 + 0 + 0 + DMX + + + IAZ096 + 150960 + Appanoose + IA + US + 40.74 + -92.87 + 0 + 0 + DMX + + + MNZ086 + 230860 + Dodge + MN + US + 44.02 + -92.87 + 0 + 0 + ARX + + + LAZ031 + 180310 + Allen + LA + US + 30.66 + -92.85 + 0 + 0 + LCH + + + LAZ042 + 180420 + Jefferson_Davis + LA + US + 30.27 + -92.85 + 0 + 0 + LCH + + + MOZ056 + 250560 + Morgan + MO + US + 38.44 + -92.85 + 0 + 0 + SGF + + + ARZ066 + 40660 + Ouachita + AR + US + 33.60 + -92.83 + 0 + 0 + LZK + + + IAZ008 + 150080 + Mitchell + IA + US + 43.36 + -92.79 + 0 + 0 + ARX + + + IAZ018 + 150180 + Floyd + IA + US + 43.06 + -92.79 + 0 + 0 + ARX + + + IAZ027 + 150270 + Butler + IA + US + 42.73 + -92.79 + 0 + 0 + DMX + + + IAZ038 + 150380 + Grundy + IA + US + 42.38 + -92.79 + 0 + 0 + DMX + + + MOZ046 + 250460 + Cooper + MO + US + 38.87 + -92.78 + 0 + 0 + EAX + + + ARZ031 + 40310 + Conway + AR + US + 35.27 + -92.76 + 0 + 0 + LZK + + + MNZ094 + 230940 + Mower + MN + US + 43.67 + -92.75 + 0 + 0 + ARX + + + MOZ069 + 250690 + Camden + MO + US + 38.03 + -92.74 + 0 + 0 + SGF + + + MNZ038 + 230380 + Pine + MN + US + 46.07 + -92.71 + 0 + 0 + DLH + + + MOZ040 + 250400 + Howard + MO + US + 39.16 + -92.69 + 0 + 0 + EAX + + + ARZ013 + 40130 + Searcy + AR + US + 35.92 + -92.68 + 0 + 0 + LZK + + + ARZ004 + 40040 + Marion + AR + US + 36.28 + -92.65 + 0 + 0 + LZK + + + ARZ043 + 40430 + Saline + AR + US + 34.64 + -92.65 + 0 + 0 + LZK + + + ARZ062 + 40620 + Dallas + AR + US + 33.98 + -92.65 + 0 + 0 + LZK + + + IAZ075 + 150750 + Mahaska + IA + US + 41.34 + -92.65 + 0 + 0 + DMX + + + MNZ078 + 230780 + Goodhue + MN + US + 44.45 + -92.65 + 0 + 0 + MPX + + + LAZ005 + 180050 + Lincoln + LA + US + 32.61 + -92.64 + 0 + 0 + SHV + + + LAZ019 + 180190 + Winn + LA + US + 31.93 + -92.64 + 0 + 0 + SHV + + + MOZ047 + 250470 + Moniteau + MO + US + 38.67 + -92.62 + 0 + 0 + LSX + + + MOZ017 + 250170 + Adair + MO + US + 40.19 + -92.61 + 0 + 0 + EAX + + + LAZ020 + 180200 + Grant + LA + US + 31.60 + -92.58 + 0 + 0 + SHV + + + MOZ025 + 250250 + Macon + MO + US + 39.82 + -92.57 + 0 + 0 + EAX + + + LAZ013 + 180130 + Jackson + LA + US + 32.33 + -92.56 + 0 + 0 + SHV + + + MOZ081 + 250810 + Laclede + MO + US + 37.69 + -92.56 + 0 + 0 + SGF + + + ARZ023 + 40230 + Van_Buren + AR + US + 35.58 + -92.54 + 0 + 0 + LZK + + + ARZ067 + 40670 + Calhoun + AR + US + 33.54 + -92.54 + 0 + 0 + LZK + + + IAZ050 + 150500 + Tama + IA + US + 42.08 + -92.54 + 0 + 0 + DMX + + + IAZ062 + 150620 + Poweshiek + IA + US + 41.69 + -92.54 + 0 + 0 + DMX + + + MOZ008 + 250080 + Schuyler + MO + US + 40.47 + -92.54 + 0 + 0 + EAX + + + ARZ073 + 40730 + Union + AR + US + 33.20 + -92.52 + 0 + 0 + SHV + + + LAZ028 + 180280 + Rapides + LA + US + 31.21 + -92.52 + 0 + 0 + LCH + + + WIZ014 + 490140 + Polk + WI + US + 45.47 + -92.52 + 0 + 0 + MPX + + + MOZ033 + 250330 + Randolph + MO + US + 39.43 + -92.51 + 0 + 0 + EAX + + + MOZ096 + 250960 + Douglas + MO + US + 36.93 + -92.50 + 0 + 0 + SGF + + + MOZ092 + 250920 + Wright + MO + US + 37.27 + -92.47 + 0 + 0 + SGF + + + WIZ023 + 490230 + St._Croix + WI + US + 45.04 + -92.47 + 0 + 0 + MPX + + + WIZ024 + 490240 + Pierce + WI + US + 44.70 + -92.47 + 0 + 0 + MPX + + + WIZ006 + 490060 + Burnett + WI + US + 45.90 + -92.46 + 0 + 0 + DLH + + + MOZ105 + 251050 + Ozark + MO + US + 36.65 + -92.45 + 0 + 0 + SGF + + + ARZ055 + 40550 + Grant + AR + US + 34.28 + -92.44 + 0 + 0 + LZK + + + MNZ011 + 230110 + North_St._Louis + MN + US + 48.24 + -92.44 + 0 + 0 + DLH + + + MNZ019 + 230190 + Central_St._Louis + MN + US + 47.43 + -92.44 + 0 + 0 + DLH + + + MOZ057 + 250570 + Miller + MO + US + 38.22 + -92.44 + 0 + 0 + SGF + + + MNZ037 + 230370 + Carlton/South_St._Louis + MN + US + 46.72 + -92.43 + 0 + 0 + DLH + + + IAZ097 + 150970 + Davis + IA + US + 40.75 + -92.42 + 0 + 0 + DMX + + + IAZ086 + 150860 + Wapello + IA + US + 41.03 + -92.41 + 0 + 0 + DMX + + + ARZ044 + 40440 + Pulaski + AR + US + 34.76 + -92.39 + 0 + 0 + LZK + + + LAZ032 + 180320 + Evangeline + LA + US + 30.74 + -92.39 + 0 + 0 + LCH + + + MNZ087 + 230870 + Olmsted + MN + US + 44.01 + -92.39 + 0 + 0 + ARX + + + LAZ006 + 180060 + Union + LA + US + 32.80 + -92.38 + 0 + 0 + SHV + + + LAZ043 + 180430 + Acadia + LA + US + 30.28 + -92.38 + 0 + 0 + LCH + + + ARZ005 + 40050 + Baxter + AR + US + 36.24 + -92.37 + 0 + 0 + LZK + + + ARZ032 + 40320 + Faulkner + AR + US + 35.12 + -92.36 + 0 + 0 + LZK + + + LAZ052 + 180520 + Vermilion + LA + US + 29.85 + -92.34 + 0 + 0 + LCH + + + MOZ041 + 250410 + Boone + MO + US + 38.94 + -92.34 + 0 + 0 + LSX + + + IAZ009 + 150090 + Howard + IA + US + 43.36 + -92.32 + 0 + 0 + ARX + + + IAZ019 + 150190 + Chickasaw + IA + US + 43.07 + -92.32 + 0 + 0 + ARX + + + IAZ028 + 150280 + Bremer + IA + US + 42.78 + -92.32 + 0 + 0 + DMX + + + IAZ039 + 150390 + Black_Hawk + IA + US + 42.47 + -92.31 + 0 + 0 + DMX + + + MOZ048 + 250480 + Cole + MO + US + 38.53 + -92.22 + 0 + 0 + LSX + + + MOZ070 + 250700 + Pulaski + MO + US + 37.81 + -92.22 + 0 + 0 + SGF + + + ARZ063 + 40630 + Cleveland + AR + US + 33.89 + -92.20 + 0 + 0 + LZK + + + MNZ079 + 230790 + Wabasha + MN + US + 44.28 + -92.20 + 0 + 0 + ARX + + + LAZ022 + 180220 + La_Salle + LA + US + 31.63 + -92.19 + 0 + 0 + SHV + + + IAZ076 + 150760 + Keokuk + IA + US + 41.33 + -92.18 + 0 + 0 + DVN + + + ARZ068 + 40680 + Bradley + AR + US + 33.44 + -92.16 + 0 + 0 + LZK + + + LAZ014 + 180140 + Ouachita + LA + US + 32.50 + -92.16 + 0 + 0 + SHV + + + MOZ009 + 250090 + Scotland + MO + US + 40.46 + -92.15 + 0 + 0 + DVN + + + MOZ018 + 250180 + Knox + MO + US + 40.13 + -92.15 + 0 + 0 + LSX + + + ARZ014 + 40140 + Stone + AR + US + 35.91 + -92.12 + 0 + 0 + LZK + + + LAZ021 + 180210 + Caldwell + LA + US + 32.11 + -92.09 + 0 + 0 + SHV + + + LAZ044 + 180440 + Lafayette + LA + US + 30.22 + -92.09 + 0 + 0 + LCH + + + MNZ095 + 230950 + Fillmore + MN + US + 43.67 + -92.09 + 0 + 0 + ARX + + + WIZ026 + 490260 + Pepin + WI + US + 44.55 + -92.09 + 0 + 0 + MPX + + + LAZ033 + 180330 + St._Landry + LA + US + 30.58 + -92.08 + 0 + 0 + LCH + + + IAZ051 + 150510 + Benton + IA + US + 42.08 + -92.07 + 0 + 0 + DVN + + + MOZ026 + 250260 + Shelby + MO + US + 39.78 + -92.07 + 0 + 0 + LSX + + + IAZ063 + 150630 + Iowa + IA + US + 41.68 + -92.06 + 0 + 0 + DVN + + + ARZ024 + 40240 + Cleburne + AR + US + 35.54 + -92.02 + 0 + 0 + LZK + + + MOZ034 + 250340 + Monroe + MO + US + 39.50 + -92.01 + 0 + 0 + LSX + + + LAZ029 + 180290 + Avoyelles + LA + US + 31.10 + -91.97 + 0 + 0 + LCH + + + MOZ082 + 250820 + Texas + MO + US + 37.33 + -91.96 + 0 + 0 + SGF + + + IAZ087 + 150870 + Jefferson + IA + US + 41.03 + -91.95 + 0 + 0 + DVN + + + IAZ098 + 150980 + Van_Buren + IA + US + 40.75 + -91.95 + 0 + 0 + DVN + + + ARZ015 + 40150 + Izard + AR + US + 36.06 + -91.94 + 0 + 0 + LZK + + + MOZ050 + 250500 + Callaway + MO + US + 38.81 + -91.93 + 0 + 0 + LSX + + + MOZ049 + 250490 + Osage + MO + US + 38.50 + -91.92 + 0 + 0 + LSX + + + MOZ058 + 250580 + Maries + MO + US + 38.15 + -91.92 + 0 + 0 + SGF + + + WIZ001 + 490010 + Douglas + WI + US + 46.46 + -91.92 + 0 + 0 + DLH + + + LAZ024 + 180240 + Catahoula + LA + US + 31.60 + -91.91 + 0 + 0 + JAN + + + WIZ025 + 490250 + Dunn + WI + US + 44.95 + -91.91 + 0 + 0 + MPX + + + MOZ097 + 250970 + Howell + MO + US + 36.78 + -91.90 + 0 + 0 + SGF + + + ARZ045 + 40450 + Lonoke + AR + US + 34.78 + -91.88 + 0 + 0 + LZK + + + MOZ042 + 250420 + Audrain + MO + US + 39.21 + -91.87 + 0 + 0 + LSX + + + IAZ010 + 150100 + Winneshiek + IA + US + 43.29 + -91.85 + 0 + 0 + ARX + + + IAZ029 + 150290 + Fayette + IA + US + 42.86 + -91.85 + 0 + 0 + ARX + + + WIZ015 + 490150 + Barron + WI + US + 45.43 + -91.85 + 0 + 0 + MPX + + + IAZ040 + 150400 + Buchanan + IA + US + 42.47 + -91.84 + 0 + 0 + DVN + + + ARZ056 + 40560 + Jefferson + AR + US + 34.28 + -91.83 + 0 + 0 + LZK + + + LAZ053 + 180530 + Iberia + LA + US + 29.93 + -91.81 + 0 + 0 + LCH + + + WIZ032 + 490320 + Buffalo + WI + US + 44.32 + -91.81 + 0 + 0 + ARX + + + ARZ006 + 40060 + Fulton + AR + US + 36.38 + -91.80 + 0 + 0 + LZK + + + ARZ074 + 40740 + Ashley + AR + US + 33.20 + -91.79 + 0 + 0 + JAN + + + WIZ007 + 490070 + Washburn + WI + US + 45.90 + -91.79 + 0 + 0 + DLH + + + MOZ071 + 250710 + Phelps + MO + US + 37.88 + -91.78 + 0 + 0 + SGF + + + LAZ007 + 180070 + Morehouse + LA + US + 32.77 + -91.75 + 0 + 0 + JAN + + + ARZ033 + 40330 + White + AR + US + 35.28 + -91.73 + 0 + 0 + LZK + + + LAZ015 + 180150 + Richland + LA + US + 32.42 + -91.73 + 0 + 0 + JAN + + + ARZ069 + 40690 + Drew + AR + US + 33.59 + -91.72 + 0 + 0 + LZK + + + IAZ077 + 150770 + Washington + IA + US + 41.34 + -91.71 + 0 + 0 + DVN + + + MOZ010 + 250100 + Clark + MO + US + 40.43 + -91.70 + 0 + 0 + DVN + + + MOZ019 + 250190 + Lewis + MO + US + 40.10 + -91.70 + 0 + 0 + LSX + + + ARZ064 + 40640 + Lincoln + AR + US + 33.98 + -91.69 + 0 + 0 + LZK + + + MNZ088 + 230880 + Winona + MN + US + 44.02 + -91.69 + 0 + 0 + ARX + + + LAZ023 + 180230 + Franklin + LA + US + 32.14 + -91.68 + 0 + 0 + JAN + + + LAZ034 + 180340 + Pointe_Coupee + LA + US + 30.76 + -91.67 + 0 + 0 + LIX + + + LAZ045 + 180450 + Upper_St._Martin + LA + US + 30.27 + -91.67 + 0 + 0 + LCH + + + LAZ026 + 180260 + Concordia + LA + US + 31.37 + -91.61 + 0 + 0 + JAN + + + IAZ052 + 150520 + Linn + IA + US + 42.07 + -91.60 + 0 + 0 + DVN + + + IAZ064 + 150640 + Johnson + IA + US + 41.64 + -91.60 + 0 + 0 + DVN + + + MOZ027 + 250270 + Marion + MO + US + 39.80 + -91.58 + 0 + 0 + LSX + + + ARZ046 + 40460 + Prairie + AR + US + 34.79 + -91.57 + 0 + 0 + LZK + + + ARZ016 + 40160 + Independence + AR + US + 35.73 + -91.54 + 0 + 0 + LZK + + + IAZ088 + 150880 + Henry + IA + US + 40.99 + -91.54 + 0 + 0 + DVN + + + MNZ020 + 230200 + Southern_Lake/North_Shore + MN + US + 47.31 + -91.51 + 0 + 0 + DLH + + + MOZ059 + 250590 + Gasconade + MO + US + 38.44 + -91.51 + 0 + 0 + LSX + + + ARZ007 + 40070 + Sharp + AR + US + 36.19 + -91.49 + 0 + 0 + LZK + + + MOZ083 + 250830 + Dent + MO + US + 37.60 + -91.49 + 0 + 0 + SGF + + + MNZ096 + 230960 + Houston + MN + US + 43.67 + -91.48 + 0 + 0 + ARX + + + LAZ054 + 180540 + St._Mary + LA + US + 29.72 + -91.47 + 0 + 0 + LCH + + + LAZ035 + 180350 + West_Feliciana + LA + US + 30.86 + -91.46 + 0 + 0 + LIX + + + MOZ035 + 250350 + Ralls + MO + US + 39.50 + -91.46 + 0 + 0 + LSX + + + MOZ051 + 250510 + Montgomery + MO + US + 38.91 + -91.46 + 0 + 0 + LSX + + + LAZ008 + 180080 + West_Carroll + LA + US + 32.80 + -91.44 + 0 + 0 + JAN + + + IAZ099 + 150990 + Lee + IA + US + 40.59 + -91.42 + 0 + 0 + DVN + + + MNZ012 + 230120 + Northern_Cook/Northern_Lake + MN + US + 47.70 + -91.41 + 0 + 0 + DLH + + + MOZ106 + 251060 + Oregon + MO + US + 36.69 + -91.40 + 0 + 0 + SGF + + + MSZ060 + 240600 + Adams + MS + US + 31.49 + -91.40 + 0 + 0 + JAN + + + WIZ033 + 490330 + Trempealeau + WI + US + 44.29 + -91.38 + 0 + 0 + ARX + + + ARZ057 + 40570 + Arkansas + AR + US + 34.25 + -91.37 + 0 + 0 + LZK + + + IAZ041 + 150410 + Delaware + IA + US + 42.47 + -91.37 + 0 + 0 + DVN + + + LAZ046 + 180460 + Iberville + LA + US + 30.27 + -91.35 + 0 + 0 + LIX + + + MOZ098 + 250980 + Shannon + MO + US + 37.15 + -91.35 + 0 + 0 + SGF + + + IAZ011 + 150110 + Allamakee + IA + US + 43.29 + -91.34 + 0 + 0 + ARX + + + MSZ068 + 240680 + Wilkinson + MS + US + 31.19 + -91.34 + 0 + 0 + LIX + + + MOZ072 + 250720 + Crawford + MO + US + 37.95 + -91.32 + 0 + 0 + LSX + + + ARZ025 + 40250 + Jackson + AR + US + 35.63 + -91.31 + 0 + 0 + LZK + + + LAZ047 + 180470 + West_Baton_Rouge + LA + US + 30.49 + -91.31 + 0 + 0 + LIX + + + LAZ025 + 180250 + Tensas + LA + US + 32.00 + -91.30 + 0 + 0 + JAN + + + WIZ027 + 490270 + Chippewa + WI + US + 45.07 + -91.29 + 0 + 0 + MPX + + + WIZ028 + 490280 + Eau_Claire + WI + US + 44.73 + -91.29 + 0 + 0 + MPX + + + LAZ055 + 180550 + Lower_St._Martin + LA + US + 29.85 + -91.28 + 0 + 0 + LCH + + + ARZ034 + 40340 + Woodruff + AR + US + 35.18 + -91.26 + 0 + 0 + LZK + + + ARZ075 + 40750 + Chicot + AR + US + 33.29 + -91.25 + 0 + 0 + JAN + + + IAZ030 + 150300 + Clayton + IA + US + 42.86 + -91.25 + 0 + 0 + ARX + + + LAZ009 + 180090 + East_Carroll + LA + US + 32.78 + -91.23 + 0 + 0 + JAN + + + IAZ078 + 150780 + Louisa + IA + US + 41.25 + -91.22 + 0 + 0 + DVN + + + ILZ095 + 130950 + Adams + IL + US + 39.98 + -91.22 + 0 + 0 + LSX + + + ARZ047 + 40470 + Monroe + AR + US + 34.67 + -91.21 + 0 + 0 + LZK + + + ARZ065 + 40650 + Desha + AR + US + 33.82 + -91.21 + 0 + 0 + LZK + + + ILZ034 + 130340 + Hancock + IL + US + 40.42 + -91.21 + 0 + 0 + DVN + + + LAZ016 + 180160 + Madison + LA + US + 32.35 + -91.21 + 0 + 0 + JAN + + + MOZ060 + 250600 + Warren + MO + US + 38.77 + -91.19 + 0 + 0 + LSX + + + IAZ089 + 150890 + Des_Moines + IA + US + 40.89 + -91.18 + 0 + 0 + DVN + + + WIZ041 + 490410 + La_Crosse + WI + US + 43.91 + -91.17 + 0 + 0 + ARX + + + WIZ002 + 490020 + Bayfield + WI + US + 46.58 + -91.15 + 0 + 0 + DLH + + + IAZ065 + 150650 + Cedar + IA + US + 41.77 + -91.14 + 0 + 0 + DVN + + + IAZ053 + 150530 + Jones + IA + US + 42.12 + -91.13 + 0 + 0 + DVN + + + WIZ008 + 490080 + Sawyer + WI + US + 45.90 + -91.12 + 0 + 0 + DLH + + + WIZ016 + 490160 + Rusk + WI + US + 45.47 + -91.11 + 0 + 0 + MPX + + + MOZ036 + 250360 + Pike + MO + US + 39.37 + -91.10 + 0 + 0 + LSX + + + ARZ008 + 40080 + Randolph + AR + US + 36.32 + -91.08 + 0 + 0 + MEG + + + IAZ067 + 150670 + Muscatine + IA + US + 41.47 + -91.08 + 0 + 0 + DVN + + + LAZ048 + 180480 + East_Baton_Rouge + LA + US + 30.52 + -91.08 + 0 + 0 + LIX + + + LAZ036 + 180360 + East_Feliciana + LA + US + 30.83 + -91.07 + 0 + 0 + LIX + + + LAZ056 + 180560 + Assumption + LA + US + 29.86 + -91.07 + 0 + 0 + LIX + + + MOZ062 + 250620 + Franklin + MO + US + 38.45 + -91.06 + 0 + 0 + LSX + + + ARZ017 + 40170 + Lawrence + AR + US + 36.07 + -91.05 + 0 + 0 + MEG + + + MSZ059 + 240590 + Jefferson + MS + US + 31.75 + -91.05 + 0 + 0 + JAN + + + MOZ099 + 250990 + Reynolds + MO + US + 37.33 + -91.03 + 0 + 0 + LSX + + + MSZ040 + 240400 + Issaquena + MS + US + 32.73 + -91.01 + 0 + 0 + JAN + + + ILZ025 + 130250 + Henderson + IL + US + 40.85 + -91.00 + 0 + 0 + DVN + + + MSZ053 + 240530 + Claiborne + MS + US + 32.01 + -90.98 + 0 + 0 + JAN + + + ILZ097 + 130970 + Pike + IL + US + 39.62 + -90.97 + 0 + 0 + LSX + + + MOZ052 + 250520 + Lincoln + MO + US + 39.05 + -90.97 + 0 + 0 + LSX + + + MOZ107 + 251070 + Carter + MO + US + 36.96 + -90.95 + 0 + 0 + PAH + + + MSZ034 + 240340 + Washington + MS + US + 33.28 + -90.95 + 0 + 0 + JAN + + + MSZ018 + 240180 + Bolivar + MS + US + 33.83 + -90.94 + 0 + 0 + JAN + + + WIZ054 + 490540 + Crawford + WI + US + 43.21 + -90.94 + 0 + 0 + ARX + + + MSZ061 + 240610 + Franklin + MS + US + 31.47 + -90.89 + 0 + 0 + JAN + + + LAZ049 + 180490 + Ascension + LA + US + 30.21 + -90.87 + 0 + 0 + LIX + + + MOZ073 + 250730 + Washington + MO + US + 37.97 + -90.87 + 0 + 0 + LSX + + + LAZ066 + 180660 + Lower_Terrebonne + LA + US + 29.34 + -90.86 + 0 + 0 + LIX + + + MOZ108 + 251080 + Ripley + MO + US + 36.66 + -90.86 + 0 + 0 + PAH + + + MSZ047 + 240470 + Warren + MS + US + 32.34 + -90.86 + 0 + 0 + JAN + + + ARZ058 + 40580 + Phillips + AR + US + 34.39 + -90.82 + 0 + 0 + MEG + + + IAZ042 + 150420 + Dubuque + IA + US + 42.49 + -90.82 + 0 + 0 + DVN + + + LAZ065 + 180650 + Upper_Terrebonne + LA + US + 29.67 + -90.82 + 0 + 0 + LIX + + + MSZ069 + 240690 + Amite + MS + US + 31.18 + -90.82 + 0 + 0 + LIX + + + MSZ041 + 240410 + Sharkey + MS + US + 32.89 + -90.81 + 0 + 0 + JAN + + + LAZ057 + 180570 + St._James + LA + US + 30.03 + -90.80 + 0 + 0 + LIX + + + WIZ053 + 490530 + Vernon + WI + US + 43.58 + -90.79 + 0 + 0 + ARX + + + WIZ061 + 490610 + Grant + WI + US + 42.86 + -90.79 + 0 + 0 + ARX + + + ARZ035 + 40350 + Cross + AR + US + 35.30 + -90.77 + 0 + 0 + MEG + + + ARZ048 + 40480 + St._Francis + AR + US + 35.01 + -90.77 + 0 + 0 + MEG + + + ILZ024 + 130240 + Mercer + IL + US + 41.20 + -90.77 + 0 + 0 + DVN + + + ARZ049 + 40490 + Lee + AR + US + 34.77 + -90.75 + 0 + 0 + MEG + + + WIZ034 + 490340 + Jackson + WI + US + 44.33 + -90.74 + 0 + 0 + ARX + + + LAZ037 + 180370 + St._Helena + LA + US + 30.83 + -90.73 + 0 + 0 + LIX + + + ILZ096 + 130960 + Brown + IL + US + 39.98 + -90.72 + 0 + 0 + LSX + + + LAZ050 + 180500 + Livingston + LA + US + 30.42 + -90.72 + 0 + 0 + LIX + + + ILZ098 + 130980 + Calhoun + IL + US + 39.14 + -90.71 + 0 + 0 + LSX + + + ILZ035 + 130350 + McDonough + IL + US + 40.46 + -90.68 + 0 + 0 + DVN + + + MOZ084 + 250840 + Iron + MO + US + 37.51 + -90.67 + 0 + 0 + LSX + + + MSZ010 + 240100 + Coahoma + MS + US + 34.26 + -90.67 + 0 + 0 + MEG + + + ARZ026 + 40260 + Craighead + AR + US + 35.85 + -90.66 + 0 + 0 + MEG + + + ARZ027 + 40270 + Poinsett + AR + US + 35.58 + -90.66 + 0 + 0 + MEG + + + WIZ042 + 490420 + Monroe + WI + US + 43.94 + -90.64 + 0 + 0 + ARX + + + ILZ026 + 130260 + Warren + IL + US + 40.85 + -90.62 + 0 + 0 + DVN + + + MNZ021 + 230210 + Southern_Cook/North_Shore + MN + US + 47.75 + -90.62 + 0 + 0 + DLH + + + WIZ003 + 490030 + Ashland + WI + US + 46.53 + -90.62 + 0 + 0 + DLH + + + WIZ029 + 490290 + Clark + WI + US + 44.73 + -90.62 + 0 + 0 + ARX + + + IAZ068 + 150680 + Scott + IA + US + 41.61 + -90.61 + 0 + 0 + DVN + + + MSZ019 + 240190 + Sunflower + MS + US + 33.63 + -90.61 + 0 + 0 + JAN + + + ILZ040 + 130400 + Schuyler + IL + US + 40.13 + -90.57 + 0 + 0 + ILX + + + LAZ059 + 180590 + Upper_Lafourche + LA + US + 29.74 + -90.57 + 0 + 0 + LIX + + + MOZ061 + 250610 + St._Charles + MO + US + 38.75 + -90.54 + 0 + 0 + LSX + + + MOZ074 + 250740 + St._Francois + MO + US + 37.86 + -90.54 + 0 + 0 + LSX + + + MSZ035 + 240350 + Humphreys + MS + US + 33.13 + -90.53 + 0 + 0 + JAN + + + IAZ054 + 150540 + Jackson + IA + US + 42.21 + -90.52 + 0 + 0 + DVN + + + IAZ066 + 150660 + Clinton + IA + US + 41.88 + -90.52 + 0 + 0 + DVN + + + MOZ065 + 250650 + Jefferson + MO + US + 38.25 + -90.52 + 0 + 0 + LSX + + + ARZ018 + 40180 + Greene + AR + US + 36.12 + -90.51 + 0 + 0 + MEG + + + LAZ058 + 180580 + St._John_The_Baptist + LA + US + 30.09 + -90.50 + 0 + 0 + LIX + + + MSZ062 + 240620 + Lincoln + MS + US + 31.54 + -90.49 + 0 + 0 + JAN + + + WIZ017 + 490170 + Taylor + WI + US + 45.21 + -90.48 + 0 + 0 + ARX + + + ILZ049 + 130490 + Scott + IL + US + 39.66 + -90.47 + 0 + 0 + ILX + + + MOZ100 + 251000 + Wayne + MO + US + 37.12 + -90.45 + 0 + 0 + PAH + + + ARZ009 + 40090 + Clay + AR + US + 36.35 + -90.43 + 0 + 0 + MEG + + + MOZ063 + 250630 + St._Louis + MO + US + 38.64 + -90.43 + 0 + 0 + LSX + + + WIZ055 + 490550 + Richland + WI + US + 43.36 + -90.43 + 0 + 0 + ARX + + + MSZ054 + 240540 + Copiah + MS + US + 31.87 + -90.42 + 0 + 0 + JAN + + + MOZ109 + 251090 + Butler + MO + US + 36.71 + -90.41 + 0 + 0 + PAH + + + LAZ038 + 180380 + Tangipahoa + LA + US + 30.65 + -90.40 + 0 + 0 + LIX + + + MSZ070 + 240700 + Pike + MS + US + 31.18 + -90.40 + 0 + 0 + LIX + + + ILZ058 + 130580 + Greene + IL + US + 39.32 + -90.39 + 0 + 0 + LSX + + + MSZ007 + 240070 + Tunica + MS + US + 34.66 + -90.39 + 0 + 0 + MEG + + + MSZ048 + 240480 + Hinds + MS + US + 32.31 + -90.39 + 0 + 0 + JAN + + + ILZ099 + 130990 + Jersey + IL + US + 39.09 + -90.38 + 0 + 0 + LSX + + + MSZ042 + 240420 + Yazoo + MS + US + 32.77 + -90.36 + 0 + 0 + JAN + + + WIZ009 + 490090 + Price + WI + US + 45.68 + -90.36 + 0 + 0 + DLH + + + MOZ085 + 250850 + Madison + MO + US + 37.48 + -90.35 + 0 + 0 + LSX + + + LAZ060 + 180600 + St._Charles + LA + US + 29.89 + -90.34 + 0 + 0 + LIX + + + ILZ015 + 130150 + Rock_Island + IL + US + 41.56 + -90.31 + 0 + 0 + DVN + + + ILZ001 + 130010 + Jo_Daviess + IL + US + 42.35 + -90.29 + 0 + 0 + DVN + + + ILZ047 + 130470 + Cass + IL + US + 40.00 + -90.29 + 0 + 0 + ILX + + + LAZ067 + 180670 + Lower_Lafourche + LA + US + 29.31 + -90.29 + 0 + 0 + LIX + + + MSZ011 + 240110 + Quitman + MS + US + 34.30 + -90.29 + 0 + 0 + MEG + + + ARZ036 + 40360 + Crittenden + AR + US + 35.14 + -90.28 + 0 + 0 + MEG + + + ILZ050 + 130500 + Morgan + IL + US + 39.70 + -90.27 + 0 + 0 + ILX + + + MSZ025 + 240250 + Leflore + MS + US + 33.53 + -90.27 + 0 + 0 + JAN + + + MOZ064 + 250640 + St._Louis_City + MO + US + 38.65 + -90.24 + 0 + 0 + LSX + + + WIZ004 + 490040 + Iron + WI + US + 46.29 + -90.23 + 0 + 0 + DLH + + + ILZ027 + 130270 + Knox + IL + US + 40.93 + -90.22 + 0 + 0 + ILX + + + MOZ075 + 250750 + Ste._Genevieve + MO + US + 37.90 + -90.20 + 0 + 0 + LSX + + + MSZ020 + 240200 + Tallahatchie + MS + US + 33.93 + -90.19 + 0 + 0 + MEG + + + ILZ036 + 130360 + Fulton + IL + US + 40.45 + -90.16 + 0 + 0 + ILX + + + ILZ016 + 130160 + Henry + IL + US + 41.37 + -90.15 + 0 + 0 + DVN + + + ILZ102 + 131020 + Monroe + IL + US + 38.30 + -90.14 + 0 + 0 + LSX + + + LAZ061 + 180610 + Upper_Jefferson + LA + US + 29.81 + -90.14 + 0 + 0 + LIX + + + WIZ062 + 490620 + Iowa + WI + US + 43.01 + -90.13 + 0 + 0 + MKX + + + WIZ067 + 490670 + Lafayette + WI + US + 42.66 + -90.13 + 0 + 0 + MKX + + + MSZ063 + 240630 + Lawrence + MS + US + 31.55 + -90.10 + 0 + 0 + JAN + + + MSZ036 + 240360 + Holmes + MS + US + 33.13 + -90.09 + 0 + 0 + JAN + + + MSZ043 + 240430 + Madison + MS + US + 32.65 + -90.08 + 0 + 0 + JAN + + + LAZ068 + 180680 + Lower_Jefferson + LA + US + 29.56 + -90.07 + 0 + 0 + LIX + + + MSZ071 + 240710 + Walthall + MS + US + 31.18 + -90.05 + 0 + 0 + LIX + + + WIZ043 + 490430 + Juneau + WI + US + 43.95 + -90.05 + 0 + 0 + ARX + + + MOZ086 + 250860 + Bollinger + MO + US + 37.32 + -90.04 + 0 + 0 + PAH + + + LAZ039 + 180390 + Washington + LA + US + 30.84 + -90.03 + 0 + 0 + LIX + + + WIZ035 + 490350 + Wood + WI + US + 44.47 + -90.02 + 0 + 0 + GRB + + + ILZ007 + 130070 + Carroll + IL + US + 42.06 + -90.01 + 0 + 0 + DVN + + + MOZ113 + 251130 + Dunklin + MO + US + 36.31 + -90.01 + 0 + 0 + MEG + + + MSZ001 + 240010 + De_Soto + MS + US + 34.86 + -90.01 + 0 + 0 + MEG + + + ILZ101 + 131010 + St._Clair + IL + US + 38.44 + -89.99 + 0 + 0 + LSX + + + ILZ041 + 130410 + Mason + IL + US + 40.25 + -89.98 + 0 + 0 + ILX + + + MOZ110 + 251100 + Stoddard + MO + US + 36.88 + -89.98 + 0 + 0 + PAH + + + MSZ049 + 240490 + Rankin + MS + US + 32.33 + -89.98 + 0 + 0 + JAN + + + TNZ088 + 420880 + Shelby + TN + US + 35.21 + -89.97 + 0 + 0 + MEG + + + ARZ028 + 40280 + Mississippi + AR + US + 35.71 + -89.96 + 0 + 0 + MEG + + + LAZ063 + 180630 + Upper_Plaquemines + LA + US + 29.77 + -89.96 + 0 + 0 + LIX + + + MSZ012 + 240120 + Panola + MS + US + 34.36 + -89.96 + 0 + 0 + MEG + + + WIZ056 + 490560 + Sauk + WI + US + 43.40 + -89.96 + 0 + 0 + MKX + + + ILZ009 + 130090 + Whiteside + IL + US + 41.76 + -89.95 + 0 + 0 + DVN + + + MSZ008 + 240080 + Tate + MS + US + 34.67 + -89.95 + 0 + 0 + MEG + + + ILZ100 + 131000 + Madison + IL + US + 38.83 + -89.94 + 0 + 0 + LSX + + + MSZ055 + 240550 + Simpson + MS + US + 31.91 + -89.94 + 0 + 0 + JAN + + + ILZ059 + 130590 + Macoupin + IL + US + 39.26 + -89.93 + 0 + 0 + LSX + + + MSZ027 + 240270 + Carroll + MS + US + 33.45 + -89.91 + 0 + 0 + JAN + + + ILZ079 + 130790 + Randolph + IL + US + 38.01 + -89.90 + 0 + 0 + LSX + + + LAZ040 + 180400 + St._Tammany + LA + US + 30.44 + -89.89 + 0 + 0 + LIX + + + LAZ062 + 180620 + Orleans + LA + US + 30.03 + -89.88 + 0 + 0 + LIX + + + LAZ064 + 180640 + Upper_St._Bernard + LA + US + 29.91 + -89.86 + 0 + 0 + LIX + + + MSZ072 + 240720 + Marion + MS + US + 31.22 + -89.85 + 0 + 0 + JAN + + + MOZ076 + 250760 + Perry + MO + US + 37.74 + -89.83 + 0 + 0 + PAH + + + ILZ028 + 130280 + Stark + IL + US + 41.11 + -89.82 + 0 + 0 + ILX + + + MSZ026 + 240260 + Grenada + MS + US + 33.79 + -89.82 + 0 + 0 + JAN + + + TNZ049 + 420490 + Tipton + TN + US + 35.51 + -89.82 + 0 + 0 + MEG + + + WIZ044 + 490440 + Adams + WI + US + 43.95 + -89.81 + 0 + 0 + ARX + + + ILZ048 + 130480 + Menard + IL + US + 40.04 + -89.79 + 0 + 0 + ILX + + + MSZ064 + 240640 + Jefferson_Davis + MS + US + 31.59 + -89.78 + 0 + 0 + JAN + + + WIZ030 + 490300 + Marathon + WI + US + 44.90 + -89.76 + 0 + 0 + GRB + + + MOZ115 + 251150 + Pemiscot + MO + US + 36.21 + -89.75 + 0 + 0 + MEG + + + WIZ018 + 490180 + Lincoln + WI + US + 45.34 + -89.73 + 0 + 0 + GRB + + + ILZ029 + 130290 + Peoria + IL + US + 40.75 + -89.72 + 0 + 0 + ILX + + + MSZ021 + 240210 + Yalobusha + MS + US + 34.03 + -89.72 + 0 + 0 + MEG + + + MIZ009 + 220090 + Gogebic + MI + US + 46.44 + -89.70 + 0 + 0 + MQT + + + ILZ002 + 130020 + Stephenson + IL + US + 42.35 + -89.66 + 0 + 0 + DVN + + + MOZ114 + 251140 + New_Madrid + MO + US + 36.61 + -89.66 + 0 + 0 + PAH + + + MOZ087 + 250870 + Cape_Girardeau + MO + US + 37.37 + -89.65 + 0 + 0 + PAH + + + TNZ048 + 420480 + Lauderdale + TN + US + 35.75 + -89.65 + 0 + 0 + MEG + + + MSZ037 + 240370 + Attala + MS + US + 33.09 + -89.64 + 0 + 0 + JAN + + + ILZ051 + 130510 + Sangamon + IL + US + 39.75 + -89.61 + 0 + 0 + ILX + + + ILZ037 + 130370 + Tazewell + IL + US + 40.54 + -89.60 + 0 + 0 + ILX + + + WIZ068 + 490680 + Green + WI + US + 42.68 + -89.60 + 0 + 0 + MKX + + + LAZ070 + 180700 + Lower_St._Bernard + LA + US + 29.85 + -89.59 + 0 + 0 + LIX + + + MSZ077 + 240770 + Pearl_River + MS + US + 30.74 + -89.59 + 0 + 0 + LIX + + + MSZ028 + 240280 + Montgomery + MS + US + 33.49 + -89.58 + 0 + 0 + JAN + + + MSZ065 + 240650 + Covington + MS + US + 31.62 + -89.57 + 0 + 0 + JAN + + + MOZ111 + 251110 + Scott + MO + US + 37.06 + -89.55 + 0 + 0 + PAH + + + MSZ050 + 240500 + Scott + MS + US + 32.43 + -89.55 + 0 + 0 + JAN + + + WIZ010 + 490100 + Oneida + WI + US + 45.68 + -89.54 + 0 + 0 + GRB + + + MSZ056 + 240560 + Smith + MS + US + 32.01 + -89.53 + 0 + 0 + JAN + + + WIZ036 + 490360 + Portage + WI + US + 44.46 + -89.53 + 0 + 0 + GRB + + + ILZ017 + 130170 + Bureau + IL + US + 41.37 + -89.52 + 0 + 0 + DVN + + + MSZ044 + 240440 + Leake + MS + US + 32.76 + -89.52 + 0 + 0 + JAN + + + TNZ001 + 420010 + Lake + TN + US + 36.34 + -89.52 + 0 + 0 + MEG + + + MSZ073 + 240730 + Lamar + MS + US + 31.21 + -89.50 + 0 + 0 + JAN + + + MSZ080 + 240800 + Hancock + MS + US + 30.42 + -89.50 + 0 + 0 + LIX + + + LAZ069 + 180690 + Lower_Plaquemines + LA + US + 29.37 + -89.48 + 0 + 0 + LIX + + + MSZ002 + 240020 + Marshall + MS + US + 34.75 + -89.48 + 0 + 0 + MEG + + + MSZ013 + 240130 + Lafayette + MS + US + 34.37 + -89.48 + 0 + 0 + MEG + + + WIZ005 + 490050 + Vilas + WI + US + 46.08 + -89.48 + 0 + 0 + GRB + + + ILZ064 + 130640 + Bond + IL + US + 38.88 + -89.45 + 0 + 0 + LSX + + + TNZ019 + 420190 + Dyer + TN + US + 36.05 + -89.44 + 0 + 0 + MEG + + + ILZ069 + 130690 + Clinton + IL + US + 38.58 + -89.43 + 0 + 0 + LSX + + + ILZ074 + 130740 + Washington + IL + US + 38.36 + -89.43 + 0 + 0 + LSX + + + ILZ060 + 130600 + Montgomery + IL + US + 39.26 + -89.42 + 0 + 0 + LSX + + + ILZ084 + 130840 + Jackson + IL + US + 37.76 + -89.42 + 0 + 0 + PAH + + + TNZ089 + 420890 + Fayette + TN + US + 35.20 + -89.42 + 0 + 0 + MEG + + + WIZ063 + 490630 + Dane + WI + US + 43.07 + -89.42 + 0 + 0 + MKX + + + WIZ057 + 490570 + Columbia + WI + US + 43.47 + -89.39 + 0 + 0 + MKX + + + ILZ042 + 130420 + Logan + IL + US + 40.12 + -89.38 + 0 + 0 + ILX + + + WIZ046 + 490460 + Marquette + WI + US + 43.81 + -89.38 + 0 + 0 + MKX + + + MIZ002 + 220020 + Ontonagon + MI + US + 46.68 + -89.37 + 0 + 0 + MQT + + + ILZ080 + 130800 + Perry + IL + US + 38.08 + -89.36 + 0 + 0 + PAH + + + ILZ030 + 130300 + Marshall + IL + US + 41.04 + -89.35 + 0 + 0 + ILX + + + ILZ008 + 130080 + Ogle + IL + US + 42.04 + -89.32 + 0 + 0 + LOT + + + ILZ018 + 130180 + Putnam + IL + US + 41.21 + -89.32 + 0 + 0 + DVN + + + ILZ092 + 130920 + Alexander + IL + US + 37.16 + -89.32 + 0 + 0 + PAH + + + MOZ112 + 251120 + Mississippi + MO + US + 36.83 + -89.32 + 0 + 0 + PAH + + + MSZ022 + 240220 + Calhoun + MS + US + 33.95 + -89.32 + 0 + 0 + MEG + + + ILZ010 + 130100 + Lee + IL + US + 41.75 + -89.29 + 0 + 0 + LOT + + + ILZ052 + 130520 + Christian + IL + US + 39.58 + -89.29 + 0 + 0 + ILX + + + ILZ088 + 130880 + Union + IL + US + 37.47 + -89.29 + 0 + 0 + PAH + + + MSZ074 + 240740 + Forrest + MS + US + 31.18 + -89.29 + 0 + 0 + JAN + + + TNZ050 + 420500 + Haywood + TN + US + 35.61 + -89.29 + 0 + 0 + MEG + + + MSZ032 + 240320 + Choctaw + MS + US + 33.33 + -89.27 + 0 + 0 + JAN + + + MSZ029 + 240290 + Webster + MS + US + 33.60 + -89.26 + 0 + 0 + JAN + + + ILZ031 + 130310 + Woodford + IL + US + 40.76 + -89.25 + 0 + 0 + ILX + + + WIZ045 + 490450 + Waushara + WI + US + 44.11 + -89.24 + 0 + 0 + GRB + + + KYZ001 + 170010 + Fulton + KY + US + 36.58 + -89.20 + 0 + 0 + PAH + + + ILZ003 + 130030 + Winnebago + IL + US + 42.32 + -89.17 + 0 + 0 + LOT + + + MSZ003 + 240030 + Benton + MS + US + 34.80 + -89.17 + 0 + 0 + MEG + + + MSZ066 + 240660 + Jones + MS + US + 31.63 + -89.16 + 0 + 0 + JAN + + + TNZ002 + 420020 + Obion + TN + US + 36.35 + -89.14 + 0 + 0 + MEG + + + TNZ051 + 420510 + Crockett + TN + US + 35.84 + -89.13 + 0 + 0 + MEG + + + MSZ051 + 240510 + Newton + MS + US + 32.41 + -89.12 + 0 + 0 + JAN + + + MSZ045 + 240450 + Neshoba + MS + US + 32.76 + -89.11 + 0 + 0 + JAN + + + MSZ057 + 240570 + Jasper + MS + US + 32.02 + -89.11 + 0 + 0 + JAN + + + ILZ093 + 130930 + Pulaski + IL + US + 37.20 + -89.10 + 0 + 0 + PAH + + + MSZ078 + 240780 + Stone + MS + US + 30.78 + -89.10 + 0 + 0 + MOB + + + WIZ069 + 490690 + Rock + WI + US + 42.67 + -89.07 + 0 + 0 + MKX + + + MSZ038 + 240380 + Winston + MS + US + 33.11 + -89.06 + 0 + 0 + JAN + + + MSZ081 + 240810 + Harrison + MS + US + 30.44 + -89.06 + 0 + 0 + LIX + + + WIZ047 + 490470 + Green_Lake + WI + US + 43.81 + -89.06 + 0 + 0 + MKX + + + MSZ015 + 240150 + Pontotoc + MS + US + 34.23 + -89.03 + 0 + 0 + MEG + + + WIZ019 + 490190 + Langlade + WI + US + 45.25 + -89.03 + 0 + 0 + GRB + + + KYZ002 + 170020 + Hickman + KY + US + 36.65 + -89.01 + 0 + 0 + PAH + + + KYZ003 + 170030 + Carlisle + KY + US + 36.87 + -89.00 + 0 + 0 + PAH + + + KYZ004 + 170040 + Ballard + KY + US + 37.07 + -89.00 + 0 + 0 + PAH + + + ILZ053 + 130530 + Macon + IL + US + 39.86 + -88.99 + 0 + 0 + ILX + + + TNZ090 + 420900 + Hardeman + TN + US + 35.22 + -88.99 + 0 + 0 + MEG + + + ILZ065 + 130650 + Fayette + IL + US + 38.98 + -88.98 + 0 + 0 + LSX + + + MSZ014 + 240140 + Union + MS + US + 34.49 + -88.98 + 0 + 0 + MEG + + + MSZ075 + 240750 + Perry + MS + US + 31.18 + -88.98 + 0 + 0 + MOB + + + MSZ023 + 240230 + Chickasaw + MS + US + 33.91 + -88.95 + 0 + 0 + MEG + + + TNZ020 + 420200 + Gibson + TN + US + 36.01 + -88.95 + 0 + 0 + MEG + + + ILZ081 + 130810 + Franklin + IL + US + 38.00 + -88.94 + 0 + 0 + PAH + + + ILZ075 + 130750 + Jefferson + IL + US + 38.30 + -88.93 + 0 + 0 + PAH + + + ILZ085 + 130850 + Williamson + IL + US + 37.74 + -88.93 + 0 + 0 + PAH + + + ILZ070 + 130700 + Marion + IL + US + 38.65 + -88.92 + 0 + 0 + LSX + + + WIZ037 + 490370 + Waupaca + WI + US + 44.46 + -88.91 + 0 + 0 + GRB + + + MSZ004 + 240040 + Tippah + MS + US + 34.80 + -88.89 + 0 + 0 + MEG + + + ILZ019 + 130190 + La_Salle + IL + US + 41.28 + -88.88 + 0 + 0 + LOT + + + ILZ089 + 130890 + Johnson + IL + US + 37.45 + -88.88 + 0 + 0 + PAH + + + ILZ038 + 130380 + McLean + IL + US + 40.52 + -88.87 + 0 + 0 + ILX + + + ILZ043 + 130430 + De_Witt + IL + US + 40.17 + -88.87 + 0 + 0 + ILX + + + MSZ033 + 240330 + Oktibbeha + MS + US + 33.43 + -88.87 + 0 + 0 + JAN + + + MIZ001 + 220010 + Keweenaw + MI + US + 48.01 + -88.84 + 0 + 0 + MQT + + + TNZ052 + 420520 + Madison + TN + US + 35.62 + -88.84 + 0 + 0 + MEG + + + ILZ004 + 130040 + Boone + IL + US + 42.32 + -88.83 + 0 + 0 + LOT + + + MIZ084 + 220840 + Southern_Houghton + MI + US + 46.64 + -88.83 + 0 + 0 + MQT + + + ILZ061 + 130610 + Shelby + IL + US + 39.43 + -88.81 + 0 + 0 + ILX + + + ILZ011 + 130110 + DeKalb + IL + US + 41.89 + -88.77 + 0 + 0 + LOT + + + WIZ064 + 490640 + Jefferson + WI + US + 43.02 + -88.77 + 0 + 0 + MKX + + + MSZ030 + 240300 + Clay + MS + US + 33.66 + -88.75 + 0 + 0 + JAN + + + TNZ003 + 420030 + Weakley + TN + US + 36.28 + -88.73 + 0 + 0 + MEG + + + WIZ011 + 490110 + Forest + WI + US + 45.72 + -88.73 + 0 + 0 + GRB + + + WIZ020 + 490200 + Menominee + WI + US + 44.99 + -88.73 + 0 + 0 + GRB + + + WIZ031 + 490310 + Shawano + WI + US + 44.81 + -88.73 + 0 + 0 + GRB + + + ILZ094 + 130940 + Massac + IL + US + 37.20 + -88.71 + 0 + 0 + PAH + + + KYZ005 + 170050 + McCracken + KY + US + 37.08 + -88.71 + 0 + 0 + PAH + + + WIZ058 + 490580 + Dodge + WI + US + 43.42 + -88.70 + 0 + 0 + MKX + + + MSZ067 + 240670 + Wayne + MS + US + 31.66 + -88.69 + 0 + 0 + MOB + + + MSZ016 + 240160 + Lee + MS + US + 34.30 + -88.68 + 0 + 0 + MEG + + + MSZ058 + 240580 + Clarke + MS + US + 32.03 + -88.68 + 0 + 0 + JAN + + + KYZ006 + 170060 + Graves + KY + US + 36.73 + -88.66 + 0 + 0 + PAH + + + MSZ052 + 240520 + Lauderdale + MS + US + 32.40 + -88.66 + 0 + 0 + JAN + + + ILZ054 + 130540 + Moultrie + IL + US + 39.62 + -88.64 + 0 + 0 + ILX + + + MSZ079 + 240790 + George + MS + US + 30.87 + -88.64 + 0 + 0 + MOB + + + WIZ048 + 490480 + Winnebago + WI + US + 44.07 + -88.64 + 0 + 0 + GRB + + + MSZ046 + 240460 + Kemper + MS + US + 32.76 + -88.63 + 0 + 0 + JAN + + + MSZ076 + 240760 + Greene + MS + US + 31.22 + -88.63 + 0 + 0 + MOB + + + MSZ082 + 240820 + Jackson + MS + US + 30.47 + -88.63 + 0 + 0 + LIX + + + ILZ044 + 130440 + Piatt + IL + US + 40.04 + -88.61 + 0 + 0 + ILX + + + TNZ053 + 420530 + Chester + TN + US + 35.42 + -88.61 + 0 + 0 + MEG + + + ILZ032 + 130320 + Livingston + IL + US + 40.87 + -88.59 + 0 + 0 + LOT + + + ILZ066 + 130660 + Effingham + IL + US + 39.06 + -88.59 + 0 + 0 + ILX + + + MSZ005 + 240050 + Alcorn + MS + US + 34.88 + -88.58 + 0 + 0 + MEG + + + TNZ091 + 420910 + McNairy + TN + US + 35.20 + -88.58 + 0 + 0 + MEG + + + MIZ003 + 220030 + Northern_Houghton + MI + US + 47.05 + -88.57 + 0 + 0 + MQT + + + ILZ090 + 130900 + Pope + IL + US + 37.34 + -88.56 + 0 + 0 + PAH + + + MSZ039 + 240390 + Noxubee + MS + US + 33.11 + -88.56 + 0 + 0 + JAN + + + MIZ010 + 220100 + Iron + MI + US + 46.18 + -88.55 + 0 + 0 + MQT + + + ILZ082 + 130820 + Hamilton + IL + US + 38.08 + -88.54 + 0 + 0 + PAH + + + ILZ086 + 130860 + Saline + IL + US + 37.76 + -88.54 + 0 + 0 + PAH + + + WIZ070 + 490700 + Walworth + WI + US + 42.67 + -88.53 + 0 + 0 + MKX + + + MSZ009 + 240090 + Prentiss + MS + US + 34.61 + -88.52 + 0 + 0 + MEG + + + WIZ051 + 490510 + Fond_Du_Lac + WI + US + 43.74 + -88.52 + 0 + 0 + MKX + + + ILZ071 + 130710 + Clay + IL + US + 38.76 + -88.48 + 0 + 0 + ILX + + + MSZ024 + 240240 + Monroe + MS + US + 33.87 + -88.46 + 0 + 0 + MEG + + + MSZ031 + 240310 + Lowndes + MS + US + 33.52 + -88.46 + 0 + 0 + JAN + + + WIZ038 + 490380 + Outagamie + WI + US + 44.42 + -88.46 + 0 + 0 + GRB + + + ILZ005 + 130050 + McHenry + IL + US + 42.32 + -88.45 + 0 + 0 + LOT + + + ILZ020 + 130200 + Kendall + IL + US + 41.59 + -88.44 + 0 + 0 + LOT + + + TNZ021 + 420210 + Carroll + TN + US + 35.97 + -88.44 + 0 + 0 + MEG + + + ILZ012 + 130120 + Kane + IL + US + 41.94 + -88.43 + 0 + 0 + LOT + + + ILZ076 + 130760 + Wayne + IL + US + 38.43 + -88.43 + 0 + 0 + PAH + + + ILZ021 + 130210 + Grundy + IL + US + 41.29 + -88.42 + 0 + 0 + LOT + + + TNZ054 + 420540 + Henderson + TN + US + 35.62 + -88.39 + 0 + 0 + MEG + + + WIZ021 + 490210 + Northern_Oconto_County + WI + US + 45.20 + -88.39 + 0 + 0 + GRB + + + KYZ007 + 170070 + Livingston + KY + US + 37.20 + -88.38 + 0 + 0 + PAH + + + WIZ012 + 490120 + Florence + WI + US + 45.87 + -88.36 + 0 + 0 + GRB + + + MSZ017 + 240170 + Itawamba + MS + US + 34.28 + -88.35 + 0 + 0 + MEG + + + MIZ004 + 220040 + Baraga + MI + US + 46.69 + -88.33 + 0 + 0 + MQT + + + KYZ008 + 170080 + Marshall + KY + US + 36.91 + -88.31 + 0 + 0 + PAH + + + WIZ065 + 490650 + Waukesha + WI + US + 43.02 + -88.30 + 0 + 0 + MKX + + + KYZ009 + 170090 + Calloway + KY + US + 36.63 + -88.27 + 0 + 0 + PAH + + + TNZ004 + 420040 + Henry + TN + US + 36.32 + -88.26 + 0 + 0 + MEG + + + ILZ091 + 130910 + Hardin + IL + US + 37.51 + -88.25 + 0 + 0 + PAH + + + ILZ062 + 130620 + Cumberland + IL + US + 39.28 + -88.24 + 0 + 0 + ILX + + + ILZ056 + 130560 + Coles + IL + US + 39.53 + -88.22 + 0 + 0 + ILX + + + MSZ006 + 240060 + Tishomingo + MS + US + 34.73 + -88.22 + 0 + 0 + MEG + + + WIZ049 + 490490 + Calumet + WI + US + 44.07 + -88.22 + 0 + 0 + GRB + + + WIZ059 + 490590 + Washington + WI + US + 43.37 + -88.22 + 0 + 0 + MKX + + + ALZ063 + 10630 + Lower_Mobile + AL + US + 30.44 + -88.21 + 0 + 0 + MOB + + + ILZ055 + 130550 + Douglas + IL + US + 39.77 + -88.21 + 0 + 0 + ILX + + + ILZ087 + 130870 + Gallatin + IL + US + 37.75 + -88.21 + 0 + 0 + PAH + + + ALZ051 + 10510 + Choctaw + AL + US + 32.01 + -88.20 + 0 + 0 + MOB + + + ILZ039 + 130390 + Ford + IL + US + 40.70 + -88.20 + 0 + 0 + LOT + + + ILZ045 + 130450 + Champaign + IL + US + 40.14 + -88.20 + 0 + 0 + ILX + + + ALZ052 + 10520 + Washington + AL + US + 31.41 + -88.18 + 0 + 0 + MOB + + + ALZ061 + 10610 + Upper_Mobile + AL + US + 30.93 + -88.18 + 0 + 0 + MOB + + + TNZ092 + 420920 + Hardin + TN + US + 35.22 + -88.18 + 0 + 0 + MEG + + + ILZ067 + 130670 + Jasper + IL + US + 39.02 + -88.16 + 0 + 0 + ILX + + + ILZ083 + 130830 + White + IL + US + 38.08 + -88.15 + 0 + 0 + PAH + + + ALZ030 + 10300 + Sumter + AL + US + 32.65 + -88.13 + 0 + 0 + BMX + + + WIZ074 + 490740 + Southern_Oconto_County + WI + US + 44.85 + -88.12 + 0 + 0 + GRB + + + ALZ012 + 10120 + Lamar + AL + US + 33.80 + -88.11 + 0 + 0 + BMX + + + ILZ072 + 130720 + Richland + IL + US + 38.72 + -88.11 + 0 + 0 + ILX + + + TNZ055 + 420550 + Decatur + TN + US + 35.62 + -88.10 + 0 + 0 + MEG + + + WIZ013 + 490130 + Northern_Marinette_County + WI + US + 45.57 + -88.10 + 0 + 0 + GRB + + + ALZ022 + 10220 + Pickens + AL + US + 33.26 + -88.09 + 0 + 0 + BMX + + + ILZ013 + 130130 + DuPage + IL + US + 41.85 + -88.09 + 0 + 0 + LOT + + + KYZ010 + 170100 + Crittenden + KY + US + 37.34 + -88.09 + 0 + 0 + PAH + + + KYZ011 + 170110 + Lyon + KY + US + 37.03 + -88.07 + 0 + 0 + PAH + + + TNZ022 + 420220 + Benton + TN + US + 36.09 + -88.07 + 0 + 0 + OHX + + + ILZ077 + 130770 + Edwards + IL + US + 38.42 + -88.05 + 0 + 0 + PAH + + + WIZ072 + 490720 + Kenosha + WI + US + 42.58 + -88.05 + 0 + 0 + MKX + + + WIZ071 + 490710 + Racine + WI + US + 42.73 + -88.03 + 0 + 0 + MKX + + + WIZ039 + 490390 + Brown + WI + US + 44.46 + -87.99 + 0 + 0 + GRB + + + ILZ006 + 130060 + Lake + IL + US + 42.32 + -87.98 + 0 + 0 + LOT + + + ALZ031 + 10310 + Greene + AL + US + 32.84 + -87.96 + 0 + 0 + BMX + + + KYZ014 + 170140 + Union + KY + US + 37.69 + -87.95 + 0 + 0 + PAH + + + WIZ066 + 490660 + Milwaukee + WI + US + 43.02 + -87.94 + 0 + 0 + MKX + + + WIZ073 + 490730 + Southern_Marinette_County + WI + US + 45.18 + -87.94 + 0 + 0 + GRB + + + WIZ052 + 490520 + Sheboygan + WI + US + 43.72 + -87.93 + 0 + 0 + MKX + + + ALZ011 + 10110 + Marion + AL + US + 34.12 + -87.92 + 0 + 0 + BMX + + + KYZ012 + 170120 + Trigg + KY + US + 36.83 + -87.92 + 0 + 0 + PAH + + + WIZ060 + 490600 + Ozaukee + WI + US + 43.37 + -87.92 + 0 + 0 + MKX + + + ILZ014 + 130140 + Cook + IL + US + 41.81 + -87.90 + 0 + 0 + LOT + + + ILZ022 + 130220 + Will + IL + US + 41.47 + -87.90 + 0 + 0 + LOT + + + INZ085 + 140850 + Posey + IN + US + 38.01 + -87.90 + 0 + 0 + PAH + + + ILZ023 + 130230 + Kankakee + IL + US + 41.15 + -87.89 + 0 + 0 + LOT + + + KYZ013 + 170130 + Caldwell + KY + US + 37.17 + -87.89 + 0 + 0 + PAH + + + MIZ011 + 220110 + Dickinson + MI + US + 45.99 + -87.87 + 0 + 0 + MQT + + + ALZ003 + 10030 + Franklin + AL + US + 34.45 + -87.85 + 0 + 0 + HUN + + + TNZ056 + 420560 + Perry + TN + US + 35.64 + -87.85 + 0 + 0 + OHX + + + ALZ053 + 10530 + Clarke + AL + US + 31.60 + -87.84 + 0 + 0 + MOB + + + ILZ033 + 130330 + Iroquois + IL + US + 40.75 + -87.83 + 0 + 0 + LOT + + + TNZ005 + 420050 + Stewart + TN + US + 36.50 + -87.83 + 0 + 0 + OHX + + + ILZ078 + 130780 + Wabash + IL + US + 38.41 + -87.82 + 0 + 0 + PAH + + + TNZ093 + 420930 + Wayne + TN + US + 35.26 + -87.80 + 0 + 0 + OHX + + + ALZ039 + 10390 + Marengo + AL + US + 32.27 + -87.79 + 0 + 0 + BMX + + + ALZ002 + 10020 + Colbert + AL + US + 34.74 + -87.78 + 0 + 0 + HUN + + + ILZ063 + 130630 + Clark + IL + US + 39.33 + -87.78 + 0 + 0 + ILX + + + TNZ024 + 420240 + Humphreys + TN + US + 36.03 + -87.77 + 0 + 0 + OHX + + + WIZ050 + 490500 + Manitowoc + WI + US + 44.11 + -87.77 + 0 + 0 + GRB + + + ILZ057 + 130570 + Edgar + IL + US + 39.68 + -87.75 + 0 + 0 + ILX + + + TNZ023 + 420230 + Houston + TN + US + 36.28 + -87.75 + 0 + 0 + OHX + + + ILZ046 + 130460 + Vermilion + IL + US + 40.19 + -87.74 + 0 + 0 + ILX + + + ILZ068 + 130680 + Crawford + IL + US + 39.02 + -87.74 + 0 + 0 + ILX + + + ALZ062 + 10620 + Upper_Baldwin + AL + US + 31.01 + -87.72 + 0 + 0 + MOB + + + ILZ073 + 130730 + Lawrence + IL + US + 38.72 + -87.71 + 0 + 0 + ILX + + + ALZ001 + 10010 + Lauderdale + AL + US + 34.88 + -87.70 + 0 + 0 + HUN + + + ALZ064 + 10640 + Lower_Baldwin + AL + US + 30.45 + -87.70 + 0 + 0 + MOB + + + ALZ013 + 10130 + Fayette + AL + US + 33.73 + -87.68 + 0 + 0 + BMX + + + KYZ015 + 170150 + Webster + KY + US + 37.50 + -87.66 + 0 + 0 + PAH + + + INZ081 + 140810 + Gibson + IN + US + 38.35 + -87.65 + 0 + 0 + PAH + + + ALZ032 + 10320 + Hale + AL + US + 32.75 + -87.64 + 0 + 0 + BMX + + + KYZ018 + 170180 + Henderson + KY + US + 37.81 + -87.61 + 0 + 0 + PAH + + + MIZ005 + 220050 + Marquette + MI + US + 46.48 + -87.61 + 0 + 0 + MQT + + + INZ086 + 140860 + Vanderburgh + IN + US + 38.00 + -87.58 + 0 + 0 + PAH + + + KYZ016 + 170160 + Hopkins + KY + US + 37.34 + -87.58 + 0 + 0 + PAH + + + MIZ012 + 220120 + Menominee + MI + US + 45.55 + -87.57 + 0 + 0 + MQT + + + WIZ040 + 490400 + Kewaunee + WI + US + 44.50 + -87.57 + 0 + 0 + GRB + + + KYZ017 + 170170 + Christian + KY + US + 36.90 + -87.50 + 0 + 0 + PAH + + + TNZ058 + 420580 + Lewis + TN + US + 35.53 + -87.49 + 0 + 0 + OHX + + + TNZ057 + 420570 + Hickman + TN + US + 35.81 + -87.47 + 0 + 0 + OHX + + + INZ060 + 140600 + Sullivan + IN + US + 39.08 + -87.46 + 0 + 0 + IND + + + ALZ023 + 10230 + Tuscaloosa + AL + US + 33.32 + -87.45 + 0 + 0 + BMX + + + INZ043 + 140430 + Vermillion + IN + US + 39.89 + -87.45 + 0 + 0 + IND + + + INZ067 + 140670 + Knox + IN + US + 38.66 + -87.43 + 0 + 0 + IND + + + INZ051 + 140510 + Vigo + IN + US + 39.43 + -87.42 + 0 + 0 + IND + + + FLZ001 + 90010 + Inland_Escambia + FL + US + 30.86 + -87.40 + 0 + 0 + MOB + + + INZ010 + 140100 + Newton + IN + US + 40.98 + -87.40 + 0 + 0 + LOT + + + TNZ094 + 420940 + Lawrence + TN + US + 35.24 + -87.40 + 0 + 0 + OHX + + + INZ001 + 140010 + Lake + IN + US + 41.44 + -87.38 + 0 + 0 + LOT + + + TNZ006 + 420060 + Montgomery + TN + US + 36.49 + -87.38 + 0 + 0 + OHX + + + ALZ014 + 10140 + Winston + AL + US + 34.15 + -87.37 + 0 + 0 + BMX + + + ALZ055 + 10550 + Monroe + AL + US + 31.54 + -87.35 + 0 + 0 + MOB + + + TNZ025 + 420250 + Dickson + TN + US + 36.15 + -87.35 + 0 + 0 + OHX + + + ALZ004 + 10040 + Lawrence + AL + US + 34.56 + -87.32 + 0 + 0 + HUN + + + INZ019 + 140190 + Benton + IN + US + 40.61 + -87.32 + 0 + 0 + LOT + + + INZ028 + 140280 + Warren + IN + US + 40.31 + -87.32 + 0 + 0 + IND + + + ALZ015 + 10150 + Walker + AL + US + 33.76 + -87.30 + 0 + 0 + BMX + + + INZ082 + 140820 + Pike + IN + US + 38.39 + -87.28 + 0 + 0 + PAH + + + KYZ020 + 170200 + McLean + KY + US + 37.54 + -87.28 + 0 + 0 + PAH + + + ALZ033 + 10330 + Perry + AL + US + 32.59 + -87.27 + 0 + 0 + BMX + + + INZ035 + 140350 + Fountain + IN + US + 40.17 + -87.27 + 0 + 0 + IND + + + WIZ022 + 490220 + Door + WI + US + 45.05 + -87.27 + 0 + 0 + GRB + + + ALZ054 + 10540 + Wilcox + AL + US + 32.05 + -87.26 + 0 + 0 + MOB + + + INZ087 + 140870 + Warrick + IN + US + 38.06 + -87.25 + 0 + 0 + PAH + + + INZ044 + 140440 + Parke + IN + US + 39.79 + -87.23 + 0 + 0 + IND + + + FLZ002 + 90020 + Coastal_Escambia + FL + US + 30.50 + -87.20 + 0 + 0 + MOB + + + KYZ022 + 170220 + Todd + KY + US + 36.86 + -87.20 + 0 + 0 + PAH + + + ALZ059 + 10590 + Escambia + AL + US + 31.13 + -87.16 + 0 + 0 + MOB + + + ALZ034 + 10340 + Bibb + AL + US + 33.04 + -87.15 + 0 + 0 + BMX + + + ALZ040 + 10400 + Dallas + AL + US + 32.38 + -87.14 + 0 + 0 + BMX + + + KYZ021 + 170210 + Muhlenberg + KY + US + 37.23 + -87.14 + 0 + 0 + PAH + + + KYZ019 + 170190 + Daviess + KY + US + 37.75 + -87.12 + 0 + 0 + PAH + + + INZ011 + 140110 + Jasper + IN + US + 41.01 + -87.11 + 0 + 0 + LOT + + + INZ052 + 140520 + Clay + IN + US + 39.39 + -87.10 + 0 + 0 + IND + + + INZ068 + 140680 + Daviess + IN + US + 38.70 + -87.10 + 0 + 0 + IND + + + TNZ026 + 420260 + Cheatham + TN + US + 36.26 + -87.09 + 0 + 0 + OHX + + + INZ002 + 140020 + Porter + IN + US + 41.47 + -87.08 + 0 + 0 + LOT + + + TNZ060 + 420600 + Maury + TN + US + 35.64 + -87.07 + 0 + 0 + OHX + + + ALZ056 + 10560 + Conecuh + AL + US + 31.47 + -87.04 + 0 + 0 + MOB + + + FLZ003 + 90030 + Inland_Santa_Rosa + FL + US + 30.86 + -87.04 + 0 + 0 + MOB + + + ALZ005 + 10050 + Limestone + AL + US + 34.78 + -87.02 + 0 + 0 + HUN + + + INZ088 + 140880 + Spencer + IN + US + 37.99 + -87.02 + 0 + 0 + PAH + + + TNZ095 + 420950 + Giles + TN + US + 35.23 + -87.02 + 0 + 0 + OHX + + + INZ061 + 140610 + Greene + IN + US + 39.03 + -86.98 + 0 + 0 + IND + + + ALZ024 + 10240 + Jefferson + AL + US + 33.55 + -86.93 + 0 + 0 + BMX + + + MIZ013 + 220130 + Delta + MI + US + 45.82 + -86.91 + 0 + 0 + MQT + + + TNZ059 + 420590 + Williamson + TN + US + 35.88 + -86.91 + 0 + 0 + OHX + + + INZ029 + 140290 + Tippecanoe + IN + US + 40.40 + -86.90 + 0 + 0 + IND + + + INZ036 + 140360 + Montgomery + IN + US + 40.05 + -86.90 + 0 + 0 + IND + + + FLZ004 + 90040 + Coastal_Santa_Rosa + FL + US + 30.53 + -86.89 + 0 + 0 + MOB + + + INZ083 + 140830 + Dubois + IN + US + 38.36 + -86.88 + 0 + 0 + LMK + + + KYZ026 + 170260 + Ohio + KY + US + 37.48 + -86.86 + 0 + 0 + LMK + + + INZ053 + 140530 + Owen + IN + US + 39.31 + -86.85 + 0 + 0 + IND + + + KYZ070 + 170700 + Logan + KY + US + 36.86 + -86.85 + 0 + 0 + LMK + + + INZ020 + 140200 + White + IN + US + 40.75 + -86.84 + 0 + 0 + IWX + + + ALZ007 + 10070 + Morgan + AL + US + 34.50 + -86.83 + 0 + 0 + HUN + + + INZ045 + 140450 + Putnam + IN + US + 39.67 + -86.83 + 0 + 0 + IND + + + TNZ007 + 420070 + Robertson + TN + US + 36.50 + -86.82 + 0 + 0 + OHX + + + INZ069 + 140690 + Martin + IN + US + 38.70 + -86.81 + 0 + 0 + IND + + + KYZ023 + 170230 + Hancock + KY + US + 37.83 + -86.81 + 0 + 0 + LMK + + + ALZ016 + 10160 + Cullman + AL + US + 34.09 + -86.78 + 0 + 0 + HUN + + + TNZ027 + 420270 + Davidson + TN + US + 36.19 + -86.78 + 0 + 0 + OHX + + + TNZ061 + 420610 + Marshall + TN + US + 35.49 + -86.77 + 0 + 0 + OHX + + + INZ003 + 140030 + La_Porte + IN + US + 41.50 + -86.71 + 0 + 0 + IWX + + + ALZ035 + 10350 + Chilton + AL + US + 32.87 + -86.70 + 0 + 0 + BMX + + + INZ012 + 140120 + Starke + IN + US + 41.31 + -86.70 + 0 + 0 + IWX + + + INZ013 + 140130 + Pulaski + IN + US + 41.05 + -86.70 + 0 + 0 + IWX + + + ALZ025 + 10250 + Shelby + AL + US + 33.29 + -86.68 + 0 + 0 + BMX + + + ALZ057 + 10570 + Butler + AL + US + 31.75 + -86.68 + 0 + 0 + MOB + + + KYZ061 + 170610 + Butler + KY + US + 37.20 + -86.67 + 0 + 0 + LMK + + + ALZ041 + 10410 + Autauga + AL + US + 32.52 + -86.66 + 0 + 0 + BMX + + + ALZ042 + 10420 + Lowndes + AL + US + 32.19 + -86.66 + 0 + 0 + BMX + + + ALZ017 + 10170 + Blount + AL + US + 34.01 + -86.64 + 0 + 0 + BMX + + + INZ089 + 140890 + Perry + IN + US + 38.05 + -86.63 + 0 + 0 + LMK + + + FLZ006 + 90060 + Coastal_Okaloosa + FL + US + 30.55 + -86.59 + 0 + 0 + MOB + + + KYZ072 + 170720 + Simpson + KY + US + 36.77 + -86.59 + 0 + 0 + LMK + + + FLZ005 + 90050 + Inland_Okaloosa + FL + US + 30.86 + -86.58 + 0 + 0 + MOB + + + INZ021 + 140210 + Carroll + IN + US + 40.59 + -86.57 + 0 + 0 + IND + + + TNZ096 + 420960 + Lincoln + TN + US + 35.19 + -86.57 + 0 + 0 + HUN + + + MIZ077 + 220770 + Berrien + MI + US + 42.01 + -86.53 + 0 + 0 + IWX + + + ALZ006 + 10060 + Madison + AL + US + 34.74 + -86.52 + 0 + 0 + HUN + + + INZ046 + 140460 + Hendricks + IN + US + 39.77 + -86.52 + 0 + 0 + IND + + + INZ062 + 140620 + Monroe + IN + US + 39.16 + -86.52 + 0 + 0 + IND + + + INZ076 + 140760 + Orange + IN + US + 38.54 + -86.50 + 0 + 0 + LMK + + + INZ070 + 140700 + Lawrence + IN + US + 38.84 + -86.49 + 0 + 0 + IND + + + INZ037 + 140370 + Boone + IN + US + 40.06 + -86.48 + 0 + 0 + IND + + + INZ054 + 140540 + Morgan + IN + US + 39.48 + -86.48 + 0 + 0 + IND + + + MIZ006 + 220060 + Alger + MI + US + 46.43 + -86.48 + 0 + 0 + MQT + + + TNZ008 + 420080 + Sumner + TN + US + 36.45 + -86.48 + 0 + 0 + OHX + + + INZ030 + 140300 + Clinton + IN + US + 40.31 + -86.47 + 0 + 0 + IND + + + INZ084 + 140840 + Crawford + IN + US + 38.26 + -86.46 + 0 + 0 + LMK + + + TNZ075 + 420750 + Bedford + TN + US + 35.52 + -86.45 + 0 + 0 + OHX + + + ALZ060 + 10600 + Covington + AL + US + 31.26 + -86.44 + 0 + 0 + MOB + + + KYZ024 + 170240 + Breckinridge + KY + US + 37.81 + -86.42 + 0 + 0 + LMK + + + TNZ062 + 420620 + Rutherford + TN + US + 35.86 + -86.41 + 0 + 0 + OHX + + + KYZ071 + 170710 + Warren + KY + US + 36.99 + -86.40 + 0 + 0 + LMK + + + INZ022 + 140220 + Cass + IN + US + 40.75 + -86.38 + 0 + 0 + IWX + + + TNZ076 + 420760 + Moore + TN + US + 35.28 + -86.38 + 0 + 0 + HUN + + + KYZ027 + 170270 + Grayson + KY + US + 37.47 + -86.35 + 0 + 0 + LMK + + + ALZ008 + 10080 + Marshall + AL + US + 34.36 + -86.32 + 0 + 0 + HUN + + + ALZ058 + 10580 + Crenshaw + AL + US + 31.75 + -86.32 + 0 + 0 + MOB + + + ALZ026 + 10260 + St._Clair + AL + US + 33.69 + -86.31 + 0 + 0 + BMX + + + INZ004 + 140040 + St._Joseph + IN + US + 41.60 + -86.30 + 0 + 0 + IWX + + + MIZ043 + 220430 + Oceana + MI + US + 43.64 + -86.29 + 0 + 0 + GRR + + + TNZ028 + 420280 + Wilson + TN + US + 36.15 + -86.29 + 0 + 0 + OHX + + + MIZ037 + 220370 + Mason + MI + US + 44.00 + -86.28 + 0 + 0 + GRR + + + ALZ036 + 10360 + Coosa + AL + US + 32.93 + -86.27 + 0 + 0 + BMX + + + INZ014 + 140140 + Marshall + IN + US + 41.33 + -86.27 + 0 + 0 + IWX + + + KYZ062 + 170620 + Edmonson + KY + US + 37.20 + -86.27 + 0 + 0 + LMK + + + INZ063 + 140630 + Brown + IN + US + 39.19 + -86.24 + 0 + 0 + IND + + + KYZ025 + 170250 + Meade + KY + US + 38.00 + -86.24 + 0 + 0 + LMK + + + MIZ085 + 220850 + Northern_Schoolcraft + MI + US + 46.33 + -86.23 + 0 + 0 + MQT + + + ALZ044 + 10440 + Montgomery + AL + US + 32.24 + -86.21 + 0 + 0 + BMX + + + FLZ007 + 90070 + Inland_Walton + FL + US + 30.85 + -86.21 + 0 + 0 + TAE + + + INZ015 + 140150 + Fulton + IN + US + 41.05 + -86.21 + 0 + 0 + IWX + + + KYZ073 + 170730 + Allen + KY + US + 36.78 + -86.19 + 0 + 0 + LMK + + + MIZ014 + 220140 + Southern_Schoolcraft + MI + US + 46.00 + -86.17 + 0 + 0 + MQT + + + ALZ027 + 10270 + Talladega + AL + US + 33.40 + -86.15 + 0 + 0 + BMX + + + ALZ043 + 10430 + Elmore + AL + US + 32.59 + -86.14 + 0 + 0 + BMX + + + INZ047 + 140470 + Marion + IN + US + 39.78 + -86.14 + 0 + 0 + IND + + + INZ090 + 140900 + Harrison + IN + US + 38.19 + -86.13 + 0 + 0 + LMK + + + MIZ050 + 220500 + Muskegon + MI + US + 43.30 + -86.13 + 0 + 0 + GRR + + + TNZ029 + 420290 + Trousdale + TN + US + 36.40 + -86.13 + 0 + 0 + OHX + + + FLZ008 + 90080 + Coastal_Walton + FL + US + 30.49 + -86.12 + 0 + 0 + TAE + + + INZ031 + 140310 + Howard + IN + US + 40.48 + -86.12 + 0 + 0 + IND + + + INZ055 + 140550 + Johnson + IN + US + 39.49 + -86.11 + 0 + 0 + IND + + + MIZ031 + 220310 + Manistee + MI + US + 44.35 + -86.10 + 0 + 0 + APX + + + TNZ097 + 420970 + Franklin + TN + US + 35.18 + -86.10 + 0 + 0 + HUN + + + INZ077 + 140770 + Washington + IN + US + 38.60 + -86.09 + 0 + 0 + LMK + + + INZ071 + 140710 + Jackson + IN + US + 38.90 + -86.07 + 0 + 0 + IND + + + MIZ071 + 220710 + Van_Buren + MI + US + 42.25 + -86.07 + 0 + 0 + GRR + + + TNZ077 + 420770 + Coffee + TN + US + 35.50 + -86.07 + 0 + 0 + OHX + + + INZ039 + 140390 + Hamilton + IN + US + 40.08 + -86.06 + 0 + 0 + IND + + + ALZ018 + 10180 + Etowah + AL + US + 34.03 + -86.05 + 0 + 0 + BMX + + + INZ038 + 140380 + Tipton + IN + US + 40.32 + -86.05 + 0 + 0 + IND + + + TNZ063 + 420630 + Cannon + TN + US + 35.81 + -86.05 + 0 + 0 + OHX + + + MIZ025 + 220250 + Benzie + MI + US + 44.65 + -86.04 + 0 + 0 + APX + + + MIZ056 + 220560 + Ottawa + MI + US + 42.99 + -86.03 + 0 + 0 + GRR + + + INZ023 + 140230 + Miami + IN + US + 40.79 + -86.02 + 0 + 0 + IWX + + + MIZ078 + 220780 + Cass + MI + US + 41.92 + -86.00 + 0 + 0 + IWX + + + TNZ009 + 420090 + Macon + TN + US + 36.53 + -86.00 + 0 + 0 + OHX + + + ALZ065 + 10650 + Coffee + AL + US + 31.41 + -85.99 + 0 + 0 + TAE + + + KYZ028 + 170280 + Hardin + KY + US + 37.72 + -85.98 + 0 + 0 + LMK + + + ALZ009 + 10090 + Jackson + AL + US + 34.74 + -85.97 + 0 + 0 + HUN + + + KYZ074 + 170740 + Barren + KY + US + 36.95 + -85.96 + 0 + 0 + LMK + + + TNZ030 + 420300 + Smith + TN + US + 36.26 + -85.96 + 0 + 0 + OHX + + + ALZ049 + 10490 + Pike + AL + US + 31.85 + -85.93 + 0 + 0 + BMX + + + ALZ028 + 10280 + Clay + AL + US + 33.30 + -85.91 + 0 + 0 + BMX + + + KYZ063 + 170630 + Hart + KY + US + 37.30 + -85.91 + 0 + 0 + LMK + + + MIZ064 + 220640 + Allegan + MI + US + 42.60 + -85.91 + 0 + 0 + GRR + + + INZ064 + 140640 + Bartholomew + IN + US + 39.19 + -85.90 + 0 + 0 + IND + + + INZ091 + 140910 + Floyd + IN + US + 38.30 + -85.90 + 0 + 0 + LMK + + + INZ016 + 140160 + Kosciusko + IN + US + 41.25 + -85.87 + 0 + 0 + IWX + + + INZ005 + 140050 + Elkhart + IN + US + 41.60 + -85.86 + 0 + 0 + IWX + + + TNZ064 + 420640 + DeKalb + TN + US + 35.98 + -85.84 + 0 + 0 + OHX + + + ALZ019 + 10190 + Calhoun + AL + US + 33.76 + -85.83 + 0 + 0 + BMX + + + ALZ068 + 10680 + Geneva + AL + US + 31.10 + -85.83 + 0 + 0 + TAE + + + ALZ010 + 10100 + De_Kalb + AL + US + 34.53 + -85.82 + 0 + 0 + HUN + + + ALZ037 + 10370 + Tallapoosa + AL + US + 32.81 + -85.80 + 0 + 0 + BMX + + + INZ024 + 140240 + Wabash + IN + US + 40.85 + -85.80 + 0 + 0 + IWX + + + INZ056 + 140560 + Shelby + IN + US + 39.52 + -85.80 + 0 + 0 + IND + + + MIZ038 + 220380 + Lake + MI + US + 43.99 + -85.80 + 0 + 0 + GRR + + + MIZ044 + 220440 + Newaygo + MI + US + 43.56 + -85.80 + 0 + 0 + GRR + + + FLZ009 + 90090 + Holmes + FL + US + 30.86 + -85.77 + 0 + 0 + TAE + + + INZ048 + 140480 + Hancock + IN + US + 39.83 + -85.77 + 0 + 0 + IND + + + TNZ078 + 420780 + Warren + TN + US + 35.68 + -85.77 + 0 + 0 + OHX + + + INZ078 + 140780 + Scott + IN + US + 38.69 + -85.74 + 0 + 0 + LMK + + + ALZ045 + 10450 + Macon + AL + US + 32.42 + -85.72 + 0 + 0 + BMX + + + INZ040 + 140400 + Madison + IN + US + 40.17 + -85.72 + 0 + 0 + IND + + + ALZ046 + 10460 + Bullock + AL + US + 32.10 + -85.71 + 0 + 0 + BMX + + + FLZ010 + 90100 + Washington + FL + US + 30.62 + -85.71 + 0 + 0 + TAE + + + INZ092 + 140920 + Clark + IN + US + 38.44 + -85.71 + 0 + 0 + LMK + + + KYZ075 + 170750 + Monroe + KY + US + 36.73 + -85.71 + 0 + 0 + LMK + + + MIZ020 + 220200 + Leelanau + MI + US + 44.99 + -85.71 + 0 + 0 + APX + + + KYZ029 + 170290 + Bullitt + KY + US + 37.97 + -85.70 + 0 + 0 + LMK + + + TNZ079 + 420790 + Grundy + TN + US + 35.38 + -85.70 + 0 + 0 + OHX + + + KYZ030 + 170300 + Jefferson + KY + US + 38.19 + -85.69 + 0 + 0 + LMK + + + KYZ053 + 170530 + Larue + KY + US + 37.57 + -85.69 + 0 + 0 + LMK + + + FLZ012 + 90120 + Bay + FL + US + 30.31 + -85.68 + 0 + 0 + TAE + + + TNZ031 + 420310 + Jackson + TN + US + 36.37 + -85.67 + 0 + 0 + OHX + + + INZ032 + 140320 + Grant + IN + US + 40.53 + -85.66 + 0 + 0 + IWX + + + INZ072 + 140720 + Jennings + IN + US + 39.00 + -85.63 + 0 + 0 + IND + + + ALZ020 + 10200 + Cherokee + AL + US + 34.23 + -85.62 + 0 + 0 + BMX + + + KYZ076 + 170760 + Metcalfe + KY + US + 37.01 + -85.62 + 0 + 0 + LMK + + + TNZ098 + 420980 + Marion + TN + US + 35.16 + -85.62 + 0 + 0 + MRX + + + ALZ066 + 10660 + Dale + AL + US + 31.41 + -85.61 + 0 + 0 + TAE + + + ALZ021 + 10210 + Cleburne + AL + US + 33.72 + -85.60 + 0 + 0 + BMX + + + MIZ026 + 220260 + Grand_Traverse + MI + US + 44.75 + -85.58 + 0 + 0 + APX + + + MIZ032 + 220320 + Wexford + MI + US + 44.34 + -85.58 + 0 + 0 + APX + + + MIZ057 + 220570 + Kent + MI + US + 43.03 + -85.56 + 0 + 0 + GRR + + + MIZ079 + 220790 + St._Joseph + MI + US + 41.92 + -85.55 + 0 + 0 + IWX + + + MIZ007 + 220070 + Luce + MI + US + 46.50 + -85.54 + 0 + 0 + MQT + + + TNZ010 + 420100 + Clay + TN + US + 36.52 + -85.54 + 0 + 0 + OHX + + + KYZ064 + 170640 + Green + KY + US + 37.29 + -85.53 + 0 + 0 + LMK + + + MIZ072 + 220720 + Kalamazoo + MI + US + 42.25 + -85.53 + 0 + 0 + GRR + + + INZ017 + 140170 + Whitley + IN + US + 41.15 + -85.50 + 0 + 0 + IWX + + + INZ065 + 140650 + Decatur + IN + US + 39.29 + -85.50 + 0 + 0 + IND + + + INZ025 + 140250 + Huntington + IN + US + 40.84 + -85.49 + 0 + 0 + IWX + + + GAZ001 + 100010 + Dade + GA + US + 34.81 + -85.48 + 0 + 0 + FFC + + + INZ057 + 140570 + Rush + IN + US + 39.62 + -85.48 + 0 + 0 + IND + + + KYZ031 + 170310 + Oldham + KY + US + 38.42 + -85.47 + 0 + 0 + LMK + + + INZ079 + 140790 + Jefferson + IN + US + 38.75 + -85.45 + 0 + 0 + LMK + + + KYZ045 + 170450 + Nelson + KY + US + 37.76 + -85.45 + 0 + 0 + LMK + + + TNZ032 + 420320 + Putnam + TN + US + 36.15 + -85.45 + 0 + 0 + OHX + + + ALZ029 + 10290 + Randolph + AL + US + 33.31 + -85.44 + 0 + 0 + BMX + + + TNZ065 + 420650 + White + TN + US + 35.94 + -85.44 + 0 + 0 + OHX + + + INZ006 + 140060 + Lagrange + IN + US + 41.65 + -85.43 + 0 + 0 + IWX + + + INZ008 + 140080 + Noble + IN + US + 41.41 + -85.43 + 0 + 0 + IWX + + + TNZ080 + 420800 + Van_Buren + TN + US + 35.69 + -85.43 + 0 + 0 + OHX + + + KYZ081 + 170810 + Cumberland + KY + US + 36.78 + -85.42 + 0 + 0 + LMK + + + TNZ081 + 420810 + Sequatchie + TN + US + 35.36 + -85.42 + 0 + 0 + MRX + + + ALZ050 + 10500 + Barbour + AL + US + 31.89 + -85.40 + 0 + 0 + BMX + + + INZ041 + 140410 + Delaware + IN + US + 40.24 + -85.40 + 0 + 0 + IND + + + INZ049 + 140490 + Henry + IN + US + 39.94 + -85.40 + 0 + 0 + IND + + + ALZ038 + 10380 + Chambers + AL + US + 32.93 + -85.36 + 0 + 0 + BMX + + + ALZ069 + 10690 + Houston + AL + US + 31.16 + -85.35 + 0 + 0 + TAE + + + ALZ047 + 10470 + Lee + AL + US + 32.58 + -85.34 + 0 + 0 + BMX + + + KYZ065 + 170650 + Taylor + KY + US + 37.33 + -85.34 + 0 + 0 + LMK + + + MIZ039 + 220390 + Osceola + MI + US + 43.99 + -85.33 + 0 + 0 + GRR + + + MIZ045 + 220450 + Mecosta + MI + US + 43.64 + -85.33 + 0 + 0 + GRR + + + INZ033 + 140330 + Blackford + IN + US + 40.49 + -85.32 + 0 + 0 + IWX + + + GAZ011 + 100110 + Chattooga + GA + US + 34.44 + -85.31 + 0 + 0 + FFC + + + KYZ032 + 170320 + Trimble + KY + US + 38.62 + -85.31 + 0 + 0 + LMK + + + KYZ038 + 170380 + Spencer + KY + US + 38.05 + -85.31 + 0 + 0 + LMK + + + MIZ065 + 220650 + Barry + MI + US + 42.60 + -85.31 + 0 + 0 + GRR + + + GAZ002 + 100020 + Walker + GA + US + 34.79 + -85.29 + 0 + 0 + FFC + + + KYZ077 + 170770 + Adair + KY + US + 37.12 + -85.29 + 0 + 0 + LMK + + + KYZ054 + 170540 + Marion + KY + US + 37.57 + -85.28 + 0 + 0 + LMK + + + TNZ033 + 420330 + Overton + TN + US + 36.35 + -85.28 + 0 + 0 + OHX + + + INZ073 + 140730 + Ripley + IN + US + 39.11 + -85.27 + 0 + 0 + ILN + + + INZ026 + 140260 + Wells + IN + US + 40.76 + -85.26 + 0 + 0 + IWX + + + ALZ067 + 10670 + Henry + AL + US + 31.55 + -85.23 + 0 + 0 + TAE + + + FLZ011 + 90110 + Jackson + FL + US + 30.79 + -85.23 + 0 + 0 + TAE + + + GAZ019 + 100190 + Floyd + GA + US + 34.34 + -85.23 + 0 + 0 + FFC + + + FLZ014 + 90140 + Gulf + FL + US + 29.94 + -85.22 + 0 + 0 + TAE + + + KYZ034 + 170340 + Shelby + KY + US + 38.20 + -85.22 + 0 + 0 + LMK + + + GAZ041 + 100410 + Haralson + GA + US + 33.78 + -85.21 + 0 + 0 + FFC + + + KYZ046 + 170460 + Washington + KY + US + 37.77 + -85.20 + 0 + 0 + LMK + + + MIZ051 + 220510 + Montcalm + MI + US + 43.30 + -85.20 + 0 + 0 + GRR + + + TNZ099 + 420990 + Hamilton + TN + US + 35.23 + -85.20 + 0 + 0 + MRX + + + GAZ030 + 100300 + Polk + GA + US + 34.00 + -85.17 + 0 + 0 + FFC + + + INZ058 + 140580 + Fayette + IN + US + 39.65 + -85.17 + 0 + 0 + ILN + + + ALZ048 + 10480 + Russell + AL + US + 32.29 + -85.16 + 0 + 0 + BMX + + + FLZ013 + 90130 + Calhoun + FL + US + 30.40 + -85.16 + 0 + 0 + TAE + + + TNZ082 + 420820 + Bledsoe + TN + US + 35.57 + -85.16 + 0 + 0 + MRX + + + KYZ082 + 170820 + Clinton + KY + US + 36.75 + -85.15 + 0 + 0 + LMK + + + MIZ021 + 220210 + Antrim + MI + US + 45.01 + -85.15 + 0 + 0 + APX + + + KYZ089 + 170890 + Carroll + KY + US + 38.68 + -85.14 + 0 + 0 + ILN + + + TNZ011 + 420110 + Pickett + TN + US + 36.52 + -85.14 + 0 + 0 + OHX + + + GAZ003 + 100030 + Catoosa + GA + US + 34.88 + -85.12 + 0 + 0 + FFC + + + KYZ033 + 170330 + Henry + KY + US + 38.47 + -85.12 + 0 + 0 + LMK + + + GAZ052 + 100520 + Heard + GA + US + 33.28 + -85.11 + 0 + 0 + FFC + + + MIZ033 + 220330 + Missaukee + MI + US + 44.34 + -85.10 + 0 + 0 + APX + + + MIZ027 + 220270 + Kalkaska + MI + US + 44.69 + -85.09 + 0 + 0 + APX + + + MIZ058 + 220580 + Ionia + MI + US + 42.95 + -85.08 + 0 + 0 + GRR + + + GAZ042 + 100420 + Carroll + GA + US + 33.62 + -85.07 + 0 + 0 + FFC + + + INZ018 + 140180 + Allen + IN + US + 41.11 + -85.07 + 0 + 0 + IWX + + + KYZ078 + 170780 + Russell + KY + US + 37.01 + -85.07 + 0 + 0 + LMK + + + INZ066 + 140660 + Franklin + IN + US + 39.39 + -85.06 + 0 + 0 + ILN + + + MIZ019 + 220190 + Charlevoix + MI + US + 45.25 + -85.06 + 0 + 0 + APX + + + MIZ080 + 220800 + Branch + MI + US + 41.92 + -85.06 + 0 + 0 + IWX + + + GAZ066 + 100660 + Troup + GA + US + 33.04 + -85.04 + 0 + 0 + FFC + + + GAZ120 + 101200 + Quitman + GA + US + 31.88 + -85.02 + 0 + 0 + TAE + + + INZ050 + 140500 + Wayne + IN + US + 39.87 + -85.02 + 0 + 0 + ILN + + + INZ034 + 140340 + Jay + IN + US + 40.45 + -85.01 + 0 + 0 + IWX + + + INZ042 + 140420 + Randolph + IN + US + 40.17 + -85.01 + 0 + 0 + IND + + + MIZ073 + 220730 + Calhoun + MI + US + 42.25 + -85.01 + 0 + 0 + GRR + + + INZ080 + 140800 + Switzerland + IN + US + 38.81 + -85.00 + 0 + 0 + ILN + + + KYZ039 + 170390 + Anderson + KY + US + 38.00 + -85.00 + 0 + 0 + LMK + + + INZ007 + 140070 + Steuben + IN + US + 41.65 + -84.99 + 0 + 0 + IWX + + + INZ009 + 140090 + De_Kalb + IN + US + 41.41 + -84.99 + 0 + 0 + IWX + + + INZ075 + 140750 + Ohio + IN + US + 38.97 + -84.99 + 0 + 0 + ILN + + + MIZ015 + 220150 + Mackinac + MI + US + 46.04 + -84.99 + 0 + 0 + APX + + + GAZ004 + 100040 + Whitfield + GA + US + 34.80 + -84.98 + 0 + 0 + FFC + + + INZ074 + 140740 + Dearborn + IN + US + 39.12 + -84.98 + 0 + 0 + ILN + + + TNZ066 + 420660 + Cumberland + TN + US + 35.96 + -84.98 + 0 + 0 + OHX + + + GAZ121 + 101210 + Clay + GA + US + 31.64 + -84.96 + 0 + 0 + TAE + + + KYZ066 + 170660 + Casey + KY + US + 37.33 + -84.95 + 0 + 0 + LMK + + + MIZ016 + 220160 + Emmet + MI + US + 45.53 + -84.95 + 0 + 0 + APX + + + INZ027 + 140270 + Adams + IN + US + 40.76 + -84.94 + 0 + 0 + IWX + + + INZ059 + 140590 + Union + IN + US + 39.62 + -84.93 + 0 + 0 + ILN + + + GAZ078 + 100780 + Harris + GA + US + 32.73 + -84.92 + 0 + 0 + FFC + + + TNZ083 + 420830 + Rhea + TN + US + 35.62 + -84.92 + 0 + 0 + MRX + + + KYZ035 + 170350 + Franklin + KY + US + 38.23 + -84.89 + 0 + 0 + LMK + + + TNZ034 + 420340 + Fentress + TN + US + 36.36 + -84.89 + 0 + 0 + OHX + + + GAZ031 + 100310 + Paulding + GA + US + 33.93 + -84.88 + 0 + 0 + FFC + + + GAZ012 + 100120 + Gordon + GA + US + 34.51 + -84.87 + 0 + 0 + FFC + + + GAZ089 + 100890 + Muscogee + GA + US + 32.49 + -84.87 + 0 + 0 + FFC + + + GAZ142 + 101420 + Early + GA + US + 31.30 + -84.87 + 0 + 0 + TAE + + + GAZ155 + 101550 + Seminole + GA + US + 30.90 + -84.87 + 0 + 0 + TAE + + + KYZ047 + 170470 + Mercer + KY + US + 37.82 + -84.87 + 0 + 0 + LMK + + + KYZ055 + 170550 + Boyle + KY + US + 37.63 + -84.86 + 0 + 0 + LMK + + + FLZ026 + 90260 + Liberty + FL + US + 30.29 + -84.85 + 0 + 0 + TAE + + + GAZ102 + 101020 + Stewart + GA + US + 32.07 + -84.85 + 0 + 0 + FFC + + + KYZ090 + 170900 + Gallatin + KY + US + 38.77 + -84.85 + 0 + 0 + ILN + + + MIZ040 + 220400 + Clare + MI + US + 43.99 + -84.85 + 0 + 0 + GRR + + + MIZ046 + 220460 + Isabella + MI + US + 43.64 + -84.85 + 0 + 0 + GRR + + + TNZ100 + 421000 + Bradley + TN + US + 35.18 + -84.85 + 0 + 0 + MRX + + + GAZ020 + 100200 + Bartow + GA + US + 34.25 + -84.84 + 0 + 0 + FFC + + + MIZ066 + 220660 + Eaton + MI + US + 42.60 + -84.84 + 0 + 0 + GRR + + + KYZ083 + 170830 + Wayne + KY + US + 36.80 + -84.83 + 0 + 0 + JKL + + + KYZ094 + 170940 + Owen + KY + US + 38.53 + -84.83 + 0 + 0 + ILN + + + GAZ090 + 100900 + Chattahoochee + GA + US + 32.38 + -84.82 + 0 + 0 + FFC + + + TNZ084 + 420840 + Meigs + TN + US + 35.52 + -84.82 + 0 + 0 + MRX + + + FLZ015 + 90150 + Franklin + FL + US + 29.80 + -84.77 + 0 + 0 + TAE + + + GAZ005 + 100050 + Murray + GA + US + 34.79 + -84.76 + 0 + 0 + FFC + + + KYZ040 + 170400 + Woodford + KY + US + 38.02 + -84.76 + 0 + 0 + LMK + + + GAZ053 + 100530 + Coweta + GA + US + 33.35 + -84.75 + 0 + 0 + FFC + + + KYZ091 + 170910 + Boone + KY + US + 38.96 + -84.75 + 0 + 0 + ILN + + + GAZ043 + 100430 + Douglas + GA + US + 33.69 + -84.74 + 0 + 0 + FFC + + + GAZ122 + 101220 + Randolph + GA + US + 31.77 + -84.74 + 0 + 0 + TAE + + + GAZ143 + 101430 + Miller + GA + US + 31.17 + -84.72 + 0 + 0 + TAE + + + GAZ067 + 100670 + Meriwether + GA + US + 33.03 + -84.67 + 0 + 0 + FFC + + + KYZ067 + 170670 + Lincoln + KY + US + 37.44 + -84.66 + 0 + 0 + LMK + + + OHZ060 + 350600 + Preble + OH + US + 39.74 + -84.65 + 0 + 0 + ILN + + + KYZ095 + 170950 + Grant + KY + US + 38.64 + -84.64 + 0 + 0 + ILN + + + TNZ085 + 420850 + McMinn + TN + US + 35.45 + -84.63 + 0 + 0 + MRX + + + GAZ123 + 101230 + Calhoun + GA + US + 31.54 + -84.62 + 0 + 0 + TAE + + + GAZ156 + 101560 + Decatur + GA + US + 30.89 + -84.62 + 0 + 0 + TAE + + + MIZ022 + 220220 + Otsego + MI + US + 45.03 + -84.62 + 0 + 0 + APX + + + OHZ034 + 350340 + Mercer + OH + US + 40.54 + -84.62 + 0 + 0 + ILN + + + OHZ042 + 350420 + Darke + OH + US + 40.14 + -84.62 + 0 + 0 + ILN + + + TNZ035 + 420350 + Morgan + TN + US + 36.14 + -84.62 + 0 + 0 + MRX + + + FLZ016 + 90160 + Gadsden + FL + US + 30.56 + -84.61 + 0 + 0 + TAE + + + KYZ079 + 170790 + Pulaski + KY + US + 37.12 + -84.61 + 0 + 0 + JKL + + + MIZ028 + 220280 + Crawford + MI + US + 44.69 + -84.61 + 0 + 0 + APX + + + MIZ034 + 220340 + Roscommon + MI + US + 44.34 + -84.61 + 0 + 0 + APX + + + MIZ052 + 220520 + Gratiot + MI + US + 43.30 + -84.61 + 0 + 0 + GRR + + + MIZ059 + 220590 + Clinton + MI + US + 42.95 + -84.60 + 0 + 0 + GRR + + + MIZ081 + 220810 + Hillsdale + MI + US + 41.89 + -84.60 + 0 + 0 + IWX + + + GAZ044 + 100440 + South_Fulton + GA + US + 33.62 + -84.59 + 0 + 0 + FFC + + + KYZ036 + 170360 + Scott + KY + US + 38.30 + -84.59 + 0 + 0 + LMK + + + KYZ048 + 170480 + Jessamine + KY + US + 37.87 + -84.59 + 0 + 0 + LMK + + + OHZ070 + 350700 + Butler + OH + US + 39.44 + -84.58 + 0 + 0 + ILN + + + OHZ015 + 350150 + Paulding + OH + US + 41.12 + -84.57 + 0 + 0 + IWX + + + OHZ024 + 350240 + Van_Wert + OH + US + 40.84 + -84.57 + 0 + 0 + IWX + + + TNZ101 + 421010 + West_Polk + TN + US + 35.14 + -84.57 + 0 + 0 + MRX + + + GAZ032 + 100320 + Cobb + GA + US + 33.93 + -84.56 + 0 + 0 + FFC + + + OHZ001 + 350010 + Williams + OH + US + 41.57 + -84.56 + 0 + 0 + IWX + + + KYZ056 + 170560 + Garrard + KY + US + 37.65 + -84.55 + 0 + 0 + LMK + + + GAZ103 + 101030 + Webster + GA + US + 32.07 + -84.54 + 0 + 0 + FFC + + + OHZ077 + 350770 + Hamilton + OH + US + 39.16 + -84.54 + 0 + 0 + ILN + + + GAZ091 + 100910 + Marion + GA + US + 32.35 + -84.52 + 0 + 0 + FFC + + + KYZ084 + 170840 + McCreary + KY + US + 36.78 + -84.52 + 0 + 0 + JKL + + + KYZ092 + 170920 + Kenton + KY + US + 38.94 + -84.52 + 0 + 0 + ILN + + + TNZ067 + 420670 + Roane + TN + US + 35.85 + -84.52 + 0 + 0 + MRX + + + OHZ004 + 350040 + Defiance + OH + US + 41.29 + -84.51 + 0 + 0 + IWX + + + TNZ012 + 420120 + Scott + TN + US + 36.39 + -84.51 + 0 + 0 + MRX + + + GAZ054 + 100540 + Fayette + GA + US + 33.41 + -84.49 + 0 + 0 + FFC + + + GAZ079 + 100790 + Talbot + GA + US + 32.70 + -84.49 + 0 + 0 + FFC + + + KYZ041 + 170410 + Fayette + KY + US + 38.03 + -84.48 + 0 + 0 + LMK + + + MIZ017 + 220170 + Cheboygan + MI + US + 45.49 + -84.47 + 0 + 0 + APX + + + GAZ013 + 100130 + Pickens + GA + US + 34.47 + -84.46 + 0 + 0 + FFC + + + GAZ021 + 100210 + Cherokee + GA + US + 34.25 + -84.46 + 0 + 0 + FFC + + + TNZ102 + 421020 + East_Polk + TN + US + 35.12 + -84.44 + 0 + 0 + MRX + + + MIZ074 + 220740 + Jackson + MI + US + 42.25 + -84.43 + 0 + 0 + GRR + + + GAZ007 + 100070 + Gilmer + GA + US + 34.70 + -84.42 + 0 + 0 + FFC + + + GAZ124 + 101240 + Terrell + GA + US + 31.79 + -84.42 + 0 + 0 + TAE + + + FLZ027 + 90270 + Wakulla + FL + US + 30.14 + -84.40 + 0 + 0 + TAE + + + GAZ068 + 100680 + Pike + GA + US + 33.09 + -84.39 + 0 + 0 + FFC + + + GAZ144 + 101440 + Baker + GA + US + 31.27 + -84.39 + 0 + 0 + TAE + + + MIZ041 + 220410 + Gladwin + MI + US + 43.99 + -84.39 + 0 + 0 + APX + + + MIZ047 + 220470 + Midland + MI + US + 43.65 + -84.39 + 0 + 0 + DTX + + + KYZ093 + 170930 + Campbell + KY + US + 38.96 + -84.37 + 0 + 0 + ILN + + + KYZ096 + 170960 + Pendleton + KY + US + 38.70 + -84.37 + 0 + 0 + ILN + + + MIZ067 + 220670 + Ingham + MI + US + 42.60 + -84.37 + 0 + 0 + GRR + + + GAZ033 + 100330 + North_Fulton + GA + US + 33.92 + -84.35 + 0 + 0 + FFC + + + GAZ055 + 100550 + Clayton + GA + US + 33.50 + -84.35 + 0 + 0 + FFC + + + MIZ008 + 220080 + Chippewa + MI + US + 46.34 + -84.35 + 0 + 0 + APX + + + TNZ068 + 420680 + Loudon + TN + US + 35.76 + -84.35 + 0 + 0 + MRX + + + FLZ017 + 90170 + Leon + FL + US + 30.49 + -84.34 + 0 + 0 + TAE + + + KYZ037 + 170370 + Harrison + KY + US + 38.43 + -84.33 + 0 + 0 + LMK + + + KYZ068 + 170680 + Rockcastle + KY + US + 37.35 + -84.33 + 0 + 0 + JKL + + + GAZ069 + 100690 + Upson + GA + US + 32.85 + -84.32 + 0 + 0 + FFC + + + KYZ057 + 170570 + Madison + KY + US + 37.72 + -84.31 + 0 + 0 + LMK + + + GAZ092 + 100920 + Schley + GA + US + 32.29 + -84.30 + 0 + 0 + FFC + + + GAZ056 + 100560 + Spalding + GA + US + 33.27 + -84.29 + 0 + 0 + FFC + + + TNZ086 + 420860 + Northwest_Monroe + TN + US + 35.46 + -84.28 + 0 + 0 + MRX + + + OHZ061 + 350610 + Montgomery + OH + US + 39.75 + -84.27 + 0 + 0 + ILN + + + GAZ145 + 101450 + Mitchell + GA + US + 31.26 + -84.25 + 0 + 0 + TAE + + + GAZ080 + 100800 + Taylor + GA + US + 32.55 + -84.23 + 0 + 0 + FFC + + + GAZ006 + 100060 + Fannin + GA + US + 34.80 + -84.22 + 0 + 0 + FFC + + + GAZ157 + 101570 + Grady + GA + US + 30.88 + -84.22 + 0 + 0 + TAE + + + OHZ051 + 350510 + Miami + OH + US + 40.04 + -84.22 + 0 + 0 + ILN + + + GAZ125 + 101250 + Dougherty + GA + US + 31.55 + -84.21 + 0 + 0 + TAE + + + KYZ042 + 170420 + Bourbon + KY + US + 38.22 + -84.21 + 0 + 0 + LMK + + + OHZ043 + 350430 + Shelby + OH + US + 40.33 + -84.21 + 0 + 0 + ILN + + + TNZ036 + 420360 + Anderson + TN + US + 36.10 + -84.20 + 0 + 0 + MRX + + + GAZ045 + 100450 + DeKalb + GA + US + 33.79 + -84.19 + 0 + 0 + FFC + + + GAZ104 + 101040 + Sumter + GA + US + 32.05 + -84.18 + 0 + 0 + FFC + + + KYZ049 + 170490 + Clark + KY + US + 37.97 + -84.17 + 0 + 0 + LMK + + + OHZ071 + 350710 + Warren + OH + US + 39.42 + -84.17 + 0 + 0 + ILN + + + OHZ035 + 350350 + Auglaize + OH + US + 40.52 + -84.16 + 0 + 0 + ILN + + + GAZ014 + 100140 + Dawson + GA + US + 34.48 + -84.15 + 0 + 0 + FFC + + + GAZ070 + 100700 + Lamar + GA + US + 33.06 + -84.15 + 0 + 0 + FFC + + + MIZ060 + 220600 + Shiawassee + MI + US + 42.96 + -84.15 + 0 + 0 + DTX + + + OHZ078 + 350780 + Clermont + OH + US + 39.02 + -84.15 + 0 + 0 + ILN + + + TNZ087 + 420870 + Southeast_Monroe + TN + US + 35.38 + -84.15 + 0 + 0 + MRX + + + GAZ057 + 100570 + Henry + GA + US + 33.48 + -84.14 + 0 + 0 + FFC + + + TNZ013 + 420130 + Campbell + TN + US + 36.39 + -84.14 + 0 + 0 + MRX + + + GAZ126 + 101260 + Lee + GA + US + 31.77 + -84.13 + 0 + 0 + TAE + + + MIZ023 + 220230 + Montmorency + MI + US + 45.03 + -84.13 + 0 + 0 + APX + + + MIZ029 + 220290 + Oscoda + MI + US + 44.68 + -84.13 + 0 + 0 + APX + + + MIZ035 + 220350 + Ogemaw + MI + US + 44.34 + -84.13 + 0 + 0 + APX + + + OHZ016 + 350160 + Putnam + OH + US + 41.01 + -84.13 + 0 + 0 + IWX + + + OHZ025 + 350250 + Allen + OH + US + 40.78 + -84.13 + 0 + 0 + IWX + + + KYZ080 + 170800 + Laurel + KY + US + 37.13 + -84.12 + 0 + 0 + JKL + + + KYZ085 + 170850 + Whitley + KY + US + 36.78 + -84.12 + 0 + 0 + JKL + + + OHZ002 + 350020 + Fulton + OH + US + 41.60 + -84.12 + 0 + 0 + IWX + + + OHZ005 + 350050 + Henry + OH + US + 41.32 + -84.10 + 0 + 0 + IWX + + + GAZ022 + 100220 + Forsyth + GA + US + 34.19 + -84.09 + 0 + 0 + FFC + + + KYZ097 + 170970 + Bracken + KY + US + 38.68 + -84.08 + 0 + 0 + ILN + + + KYZ098 + 170980 + Robertson + KY + US + 38.51 + -84.08 + 0 + 0 + ILN + + + MIZ082 + 220820 + Lenawee + MI + US + 41.90 + -84.07 + 0 + 0 + DTX + + + MIZ048 + 220480 + Bay + MI + US + 43.74 + -84.06 + 0 + 0 + DTX + + + GAZ046 + 100460 + Rockdale + GA + US + 33.66 + -84.04 + 0 + 0 + FFC + + + GAZ093 + 100930 + Macon + GA + US + 32.35 + -84.04 + 0 + 0 + FFC + + + GAZ034 + 100340 + Gwinnett + GA + US + 33.96 + -84.03 + 0 + 0 + FFC + + + MIZ053 + 220530 + Saginaw + MI + US + 43.35 + -84.03 + 0 + 0 + DTX + + + KYZ043 + 170430 + Nicholas + KY + US + 38.33 + -84.02 + 0 + 0 + LMK + + + GAZ015 + 100150 + Lumpkin + GA + US + 34.57 + -84.01 + 0 + 0 + FFC + + + NCZ060 + 330600 + Cherokee + NC + US + 35.14 + -84.01 + 0 + 0 + MRX + + + KYZ069 + 170690 + Jackson + KY + US + 37.42 + -84.00 + 0 + 0 + JKL + + + GAZ008 + 100080 + Union + GA + US + 34.81 + -83.98 + 0 + 0 + FFC + + + GAZ058 + 100580 + Butts + GA + US + 33.32 + -83.97 + 0 + 0 + FFC + + + GAZ081 + 100810 + Crawford + GA + US + 32.69 + -83.97 + 0 + 0 + FFC + + + TNZ069 + 420690 + Knox + TN + US + 35.99 + -83.96 + 0 + 0 + MRX + + + KYZ058 + 170580 + Estill + KY + US + 37.70 + -83.93 + 0 + 0 + JKL + + + GAZ071 + 100710 + Monroe + GA + US + 33.02 + -83.92 + 0 + 0 + FFC + + + GAZ158 + 101580 + Thomas + GA + US + 30.87 + -83.92 + 0 + 0 + TAE + + + KYZ050 + 170500 + Montgomery + KY + US + 38.05 + -83.92 + 0 + 0 + JKL + + + TNZ071 + 420710 + NW_Blount + TN + US + 35.71 + -83.92 + 0 + 0 + MRX + + + MIZ068 + 220680 + Livingston + MI + US + 42.61 + -83.91 + 0 + 0 + DTX + + + OHZ062 + 350620 + Greene + OH + US + 39.70 + -83.88 + 0 + 0 + ILN + + + MIZ042 + 220420 + Arenac + MI + US + 44.04 + -83.87 + 0 + 0 + APX + + + GAZ048 + 100480 + Newton + GA + US + 33.56 + -83.86 + 0 + 0 + FFC + + + GAZ094 + 100940 + Peach + GA + US + 32.56 + -83.86 + 0 + 0 + FFC + + + OHZ079 + 350790 + Brown + OH + US + 38.95 + -83.86 + 0 + 0 + ILN + + + FLZ018 + 90180 + Jefferson + FL + US + 30.38 + -83.84 + 0 + 0 + TAE + + + GAZ023 + 100230 + Hall + GA + US + 34.30 + -83.84 + 0 + 0 + FFC + + + GAZ127 + 101270 + Worth + GA + US + 31.59 + -83.84 + 0 + 0 + TAE + + + KYZ059 + 170590 + Powell + KY + US + 37.83 + -83.84 + 0 + 0 + JKL + + + KYZ086 + 170860 + Knox + KY + US + 36.87 + -83.84 + 0 + 0 + JKL + + + MIZ075 + 220750 + Washtenaw + MI + US + 42.26 + -83.84 + 0 + 0 + DTX + + + TNZ037 + 420370 + Union + TN + US + 36.30 + -83.84 + 0 + 0 + MRX + + + TNZ072 + 420720 + Blount_Smoky_Mountains + TN + US + 35.57 + -83.84 + 0 + 0 + MRX + + + GAZ105 + 101050 + Dooly + GA + US + 32.16 + -83.82 + 0 + 0 + FFC + + + KYZ099 + 170990 + Mason + KY + US + 38.62 + -83.82 + 0 + 0 + ILN + + + MIZ018 + 220180 + Presque_Isle + MI + US + 45.42 + -83.82 + 0 + 0 + APX + + + NCZ058 + 330580 + Graham + NC + US + 35.34 + -83.81 + 0 + 0 + GSP + + + OHZ072 + 350720 + Clinton + OH + US + 39.39 + -83.79 + 0 + 0 + ILN + + + GAZ106 + 101060 + Crisp + GA + US + 31.91 + -83.78 + 0 + 0 + FFC + + + OHZ053 + 350530 + Clark + OH + US + 39.90 + -83.78 + 0 + 0 + ILN + + + OHZ044 + 350440 + Logan + OH + US + 40.38 + -83.76 + 0 + 0 + ILN + + + OHZ052 + 350520 + Champaign + OH + US + 40.14 + -83.76 + 0 + 0 + ILN + + + GAZ016 + 100160 + White + GA + US + 34.65 + -83.75 + 0 + 0 + FFC + + + GAZ047 + 100470 + Walton + GA + US + 33.76 + -83.75 + 0 + 0 + FFC + + + GAZ146 + 101460 + Colquitt + GA + US + 31.18 + -83.75 + 0 + 0 + TAE + + + NCZ061 + 330610 + Clay + NC + US + 35.07 + -83.75 + 0 + 0 + MRX + + + GAZ009 + 100090 + Towns + GA + US + 34.89 + -83.74 + 0 + 0 + FFC + + + KYZ116 + 171160 + Clay + KY + US + 37.15 + -83.74 + 0 + 0 + JKL + + + OHZ003 + 350030 + Lucas + OH + US + 41.57 + -83.74 + 0 + 0 + CLE + + + KYZ051 + 170510 + Bath + KY + US + 38.15 + -83.73 + 0 + 0 + JKL + + + KYZ044 + 170440 + Fleming + KY + US + 38.36 + -83.72 + 0 + 0 + JKL + + + KYZ111 + 171110 + Lee + KY + US + 37.60 + -83.72 + 0 + 0 + JKL + + + KYZ087 + 170870 + Bell + KY + US + 36.77 + -83.71 + 0 + 0 + JKL + + + KYZ114 + 171140 + Owsley + KY + US + 37.40 + -83.71 + 0 + 0 + JKL + + + GAZ035 + 100350 + Barrow + GA + US + 34.01 + -83.70 + 0 + 0 + FFC + + + GAZ059 + 100590 + Jasper + GA + US + 33.33 + -83.69 + 0 + 0 + FFC + + + GAZ082 + 100820 + Bibb + GA + US + 32.80 + -83.69 + 0 + 0 + FFC + + + MIZ061 + 220610 + Genesee + MI + US + 43.00 + -83.69 + 0 + 0 + DTX + + + TNZ014 + 420140 + Claiborne + TN + US + 36.47 + -83.69 + 0 + 0 + MRX + + + GAZ095 + 100950 + Houston + GA + US + 32.49 + -83.67 + 0 + 0 + FFC + + + FLZ028 + 90280 + Taylor + FL + US + 29.99 + -83.65 + 0 + 0 + TAE + + + OHZ026 + 350260 + Hardin + OH + US + 40.66 + -83.65 + 0 + 0 + ILN + + + OHZ006 + 350060 + Wood + OH + US + 41.39 + -83.64 + 0 + 0 + CLE + + + OHZ017 + 350170 + Hancock + OH + US + 40.99 + -83.64 + 0 + 0 + CLE + + + GAZ128 + 101280 + Turner + GA + US + 31.71 + -83.63 + 0 + 0 + TAE + + + KYZ060 + 170600 + Menifee + KY + US + 37.94 + -83.61 + 0 + 0 + JKL + + + OHZ080 + 350800 + Highland + OH + US + 39.20 + -83.61 + 0 + 0 + ILN + + + MIZ036 + 220360 + Iosco + MI + US + 44.34 + -83.60 + 0 + 0 + APX + + + GAZ025 + 100250 + Jackson + GA + US + 34.13 + -83.59 + 0 + 0 + FFC + + + MIZ030 + 220300 + Alcona + MI + US + 44.69 + -83.59 + 0 + 0 + APX + + + GAZ072 + 100720 + Jones + GA + US + 33.01 + -83.58 + 0 + 0 + FFC + + + NCZ051 + 330510 + Swain + NC + US + 35.48 + -83.56 + 0 + 0 + GSP + + + GAZ159 + 101590 + Brooks + GA + US + 30.85 + -83.55 + 0 + 0 + TAE + + + MIZ024 + 220240 + Alpena + MI + US + 45.03 + -83.54 + 0 + 0 + APX + + + TNZ073 + 420730 + North_Sevier + TN + US + 35.87 + -83.53 + 0 + 0 + MRX + + + GAZ017 + 100170 + Habersham + GA + US + 34.63 + -83.51 + 0 + 0 + GSP + + + GAZ024 + 100240 + Banks + GA + US + 34.35 + -83.50 + 0 + 0 + FFC + + + GAZ129 + 101290 + Tift + GA + US + 31.46 + -83.50 + 0 + 0 + TAE + + + TNZ038 + 420380 + Grainger + TN + US + 36.25 + -83.50 + 0 + 0 + MRX + + + FLZ019 + 90190 + Madison + FL + US + 30.46 + -83.49 + 0 + 0 + TAE + + + OHZ081 + 350810 + Adams + OH + US + 38.82 + -83.49 + 0 + 0 + ILN + + + GAZ049 + 100490 + Morgan + GA + US + 33.62 + -83.48 + 0 + 0 + FFC + + + KYZ108 + 171080 + Wolfe + KY + US + 37.75 + -83.48 + 0 + 0 + JKL + + + MIZ083 + 220830 + Monroe + MI + US + 41.91 + -83.48 + 0 + 0 + DTX + + + TNZ070 + 420700 + Jefferson + TN + US + 36.04 + -83.47 + 0 + 0 + MRX + + + GAZ037 + 100370 + Oconee + GA + US + 33.83 + -83.46 + 0 + 0 + FFC + + + GAZ107 + 101070 + Pulaski + GA + US + 32.25 + -83.46 + 0 + 0 + FFC + + + OHZ063 + 350630 + Fayette + OH + US + 39.54 + -83.46 + 0 + 0 + ILN + + + TNZ074 + 420740 + Sevier_Smoky_Mountains + TN + US + 35.69 + -83.46 + 0 + 0 + MRX + + + GAZ147 + 101470 + Cook + GA + US + 31.19 + -83.43 + 0 + 0 + TAE + + + OHZ054 + 350540 + Madison + OH + US + 39.90 + -83.43 + 0 + 0 + ILN + + + KYZ052 + 170520 + Rowan + KY + US + 38.21 + -83.42 + 0 + 0 + JKL + + + NCZ062 + 330620 + Macon + NC + US + 35.16 + -83.42 + 0 + 0 + GSP + + + GAZ083 + 100830 + Twiggs + GA + US + 32.67 + -83.41 + 0 + 0 + FFC + + + MIZ054 + 220540 + Tuscola + MI + US + 43.51 + -83.40 + 0 + 0 + DTX + + + GAZ108 + 101080 + Wilcox + GA + US + 31.98 + -83.39 + 0 + 0 + FFC + + + MIZ069 + 220690 + Oakland + MI + US + 42.66 + -83.39 + 0 + 0 + DTX + + + GAZ010 + 100100 + Rabun + GA + US + 34.85 + -83.38 + 0 + 0 + GSP + + + GAZ036 + 100360 + Clarke + GA + US + 33.95 + -83.38 + 0 + 0 + FFC + + + KYZ117 + 171170 + Leslie + KY + US + 37.11 + -83.36 + 0 + 0 + JKL + + + OHZ045 + 350450 + Union + OH + US + 40.30 + -83.36 + 0 + 0 + ILN + + + GAZ060 + 100600 + Putnam + GA + US + 33.32 + -83.34 + 0 + 0 + FFC + + + KYZ100 + 171000 + Lewis + KY + US + 38.52 + -83.34 + 0 + 0 + ILN + + + GAZ096 + 100960 + Bleckley + GA + US + 32.42 + -83.32 + 0 + 0 + FFC + + + OHZ027 + 350270 + Wyandot + OH + US + 40.84 + -83.31 + 0 + 0 + CLE + + + GAZ018 + 100180 + Stephens + GA + US + 34.57 + -83.29 + 0 + 0 + GSP + + + KYZ112 + 171120 + Breathitt + KY + US + 37.52 + -83.28 + 0 + 0 + JKL + + + KYZ115 + 171150 + Perry + KY + US + 37.22 + -83.28 + 0 + 0 + JKL + + + TNZ039 + 420390 + Hamblen + TN + US + 36.23 + -83.28 + 0 + 0 + MRX + + + GAZ131 + 101310 + Irwin + GA + US + 31.62 + -83.25 + 0 + 0 + TAE + + + GAZ160 + 101600 + Lowndes + GA + US + 30.82 + -83.25 + 0 + 0 + TAE + + + GAZ073 + 100730 + Baldwin + GA + US + 33.05 + -83.24 + 0 + 0 + FFC + + + GAZ130 + 101300 + Ben_Hill + GA + US + 31.75 + -83.24 + 0 + 0 + TAE + + + GAZ026 + 100260 + Franklin + GA + US + 34.39 + -83.23 + 0 + 0 + GSP + + + GAZ148 + 101480 + Berrien + GA + US + 31.25 + -83.23 + 0 + 0 + TAE + + + KYZ106 + 171060 + Morgan + KY + US + 37.92 + -83.23 + 0 + 0 + JKL + + + MIZ062 + 220620 + Lapeer + MI + US + 43.11 + -83.22 + 0 + 0 + DTX + + + MIZ076 + 220760 + Wayne + MI + US + 42.25 + -83.21 + 0 + 0 + DTX + + + GAZ027 + 100270 + Madison + GA + US + 34.13 + -83.19 + 0 + 0 + FFC + + + KYZ088 + 170880 + Harlan + KY + US + 36.85 + -83.19 + 0 + 0 + JKL + + + GAZ050 + 100500 + Greene + GA + US + 33.56 + -83.18 + 0 + 0 + FFC + + + GAZ084 + 100840 + Wilkinson + GA + US + 32.79 + -83.18 + 0 + 0 + FFC + + + FLZ034 + 90340 + Dixie + FL + US + 29.56 + -83.16 + 0 + 0 + TAE + + + NCZ059 + 330590 + Northern_Jackson + NC + US + 35.37 + -83.14 + 0 + 0 + GSP + + + OHZ036 + 350360 + Marion + OH + US + 40.57 + -83.14 + 0 + 0 + CLE + + + TNZ015 + 420150 + Hancock + TN + US + 36.50 + -83.14 + 0 + 0 + MRX + + + TNZ040 + 420400 + Northwest_Cocke + TN + US + 36.00 + -83.13 + 0 + 0 + MRX + + + FLZ029 + 90290 + Lafayette + FL + US + 30.04 + -83.12 + 0 + 0 + TAE + + + GAZ109 + 101090 + Dodge + GA + US + 32.17 + -83.12 + 0 + 0 + FFC + + + OHZ008 + 350080 + Sandusky + OH + US + 41.37 + -83.12 + 0 + 0 + CLE + + + OHZ018 + 350180 + Seneca + OH + US + 41.12 + -83.12 + 0 + 0 + CLE + + + SCZ001 + 400010 + Oconee_Mountains + SC + US + 34.83 + -83.12 + 0 + 0 + GSP + + + TNZ041 + 420410 + Cocke_Smoky_Mountains + TN + US + 35.86 + -83.09 + 0 + 0 + MRX + + + GAZ161 + 101610 + Lanier + GA + US + 31.02 + -83.08 + 0 + 0 + TAE + + + KYZ104 + 171040 + Elliott + KY + US + 38.14 + -83.08 + 0 + 0 + JKL + + + KYZ109 + 171090 + Magoffin + KY + US + 37.69 + -83.08 + 0 + 0 + JKL + + + OHZ082 + 350820 + Pike + OH + US + 39.07 + -83.08 + 0 + 0 + ILN + + + NCZ063 + 330630 + Southern_Jackson + NC + US + 35.15 + -83.07 + 0 + 0 + GSP + + + OHZ073 + 350730 + Ross + OH + US + 39.34 + -83.07 + 0 + 0 + ILN + + + KYZ102 + 171020 + Carter + KY + US + 38.34 + -83.06 + 0 + 0 + RLX + + + OHZ007 + 350070 + Ottawa + OH + US + 41.54 + -83.06 + 0 + 0 + CLE + + + GAZ038 + 100380 + Oglethorpe + GA + US + 33.87 + -83.04 + 0 + 0 + FFC + + + MIZ049 + 220490 + Huron + MI + US + 43.87 + -83.04 + 0 + 0 + DTX + + + GAZ061 + 100610 + Hancock + GA + US + 33.27 + -83.02 + 0 + 0 + FFC + + + OHZ055 + 350550 + Franklin + OH + US + 39.96 + -83.01 + 0 + 0 + ILN + + + FLZ021 + 90210 + Suwannee + FL + US + 30.17 + -83.00 + 0 + 0 + JAX + + + NCZ052 + 330520 + Haywood + NC + US + 35.54 + -83.00 + 0 + 0 + GSP + + + OHZ064 + 350640 + Pickaway + OH + US + 39.63 + -83.00 + 0 + 0 + ILN + + + SCZ004 + 400040 + Greater_Oconee + SC + US + 34.64 + -83.00 + 0 + 0 + GSP + + + VAZ001 + 460010 + Lee + VA + US + 36.74 + -83.00 + 0 + 0 + MRX + + + OHZ046 + 350460 + Delaware + OH + US + 40.28 + -82.99 + 0 + 0 + ILN + + + FLZ020 + 90200 + Hamilton + FL + US + 30.48 + -82.96 + 0 + 0 + JAX + + + OHZ088 + 350880 + Scioto + OH + US + 38.79 + -82.96 + 0 + 0 + ILN + + + GAZ028 + 100280 + Hart + GA + US + 34.35 + -82.95 + 0 + 0 + GSP + + + TNZ016 + 420160 + Hawkins + TN + US + 36.42 + -82.94 + 0 + 0 + MRX + + + GAZ097 + 100970 + Laurens + GA + US + 32.43 + -82.93 + 0 + 0 + FFC + + + GAZ110 + 101100 + Telfair + GA + US + 31.96 + -82.93 + 0 + 0 + FFC + + + KYZ101 + 171010 + Greenup + KY + US + 38.56 + -82.92 + 0 + 0 + RLX + + + KYZ113 + 171130 + Knott + KY + US + 37.36 + -82.92 + 0 + 0 + JKL + + + MIZ070 + 220700 + Macomb + MI + US + 42.68 + -82.92 + 0 + 0 + DTX + + + OHZ028 + 350280 + Crawford + OH + US + 40.85 + -82.91 + 0 + 0 + CLE + + + GAZ149 + 101490 + Atkinson + GA + US + 31.30 + -82.88 + 0 + 0 + JAX + + + TNZ042 + 420420 + Northwest_Greene + TN + US + 36.21 + -82.88 + 0 + 0 + MRX + + + GAZ132 + 101320 + Coffee + GA + US + 31.59 + -82.87 + 0 + 0 + JAX + + + GAZ162 + 101620 + Echols + GA + US + 30.73 + -82.86 + 0 + 0 + JAX + + + KYZ118 + 171180 + Letcher + KY + US + 37.12 + -82.86 + 0 + 0 + JKL + + + GAZ051 + 100510 + Taliaferro + GA + US + 33.59 + -82.85 + 0 + 0 + FFC + + + GAZ029 + 100290 + Elbert + GA + US + 34.12 + -82.84 + 0 + 0 + GSP + + + KYZ107 + 171070 + Johnson + KY + US + 37.86 + -82.82 + 0 + 0 + JKL + + + OHZ037 + 350370 + Morrow + OH + US + 40.53 + -82.82 + 0 + 0 + CLE + + + FLZ035 + 90350 + Gilchrist + FL + US + 29.75 + -82.81 + 0 + 0 + JAX + + + MIZ055 + 220550 + Sanilac + MI + US + 43.43 + -82.81 + 0 + 0 + DTX + + + NCZ064 + 330640 + Transylvania + NC + US + 35.22 + -82.81 + 0 + 0 + GSP + + + GAZ074 + 100740 + Washington + GA + US + 32.99 + -82.79 + 0 + 0 + FFC + + + FLZ039 + 90390 + Levy + FL + US + 29.30 + -82.78 + 0 + 0 + TBW + + + TNZ043 + 420430 + Southeast_Greene + TN + US + 36.01 + -82.77 + 0 + 0 + MRX + + + KYZ110 + 171100 + Floyd + KY + US + 37.52 + -82.76 + 0 + 0 + JKL + + + GAZ111 + 101110 + Wheeler + GA + US + 32.11 + -82.75 + 0 + 0 + FFC + + + KYZ105 + 171050 + Lawrence + KY + US + 38.08 + -82.75 + 0 + 0 + RLX + + + GAZ039 + 100390 + Wilkes + GA + US + 33.79 + -82.74 + 0 + 0 + FFC + + + SCZ002 + 400020 + Pickens_Mountains + SC + US + 34.95 + -82.73 + 0 + 0 + GSP + + + FLZ050 + 90500 + Pinellas + FL + US + 27.89 + -82.71 + 0 + 0 + TBW + + + MIZ063 + 220630 + St._Clair + MI + US + 42.85 + -82.71 + 0 + 0 + DTX + + + GAZ085 + 100850 + Johnson + GA + US + 32.67 + -82.70 + 0 + 0 + FFC + + + KYZ103 + 171030 + Boyd + KY + US + 38.37 + -82.70 + 0 + 0 + RLX + + + GAZ163 + 101630 + Clinch + GA + US + 30.88 + -82.69 + 0 + 0 + JAX + + + SCZ005 + 400050 + Greater_Pickens + SC + US + 34.79 + -82.69 + 0 + 0 + GSP + + + NCZ048 + 330480 + Madison + NC + US + 35.87 + -82.68 + 0 + 0 + GSP + + + SCZ010 + 400100 + Anderson + SC + US + 34.51 + -82.65 + 0 + 0 + GSP + + + VAZ005 + 460050 + Scott + VA + US + 36.74 + -82.64 + 0 + 0 + MRX + + + GAZ062 + 100620 + Warren + GA + US + 33.43 + -82.63 + 0 + 0 + FFC + + + GAZ133 + 101330 + Jeff_Davis + GA + US + 31.82 + -82.63 + 0 + 0 + JAX + + + FLZ022 + 90220 + Columbia + FL + US + 30.21 + -82.62 + 0 + 0 + JAX + + + OHZ009 + 350090 + Erie + OH + US + 41.39 + -82.62 + 0 + 0 + CLE + + + OHZ083 + 350830 + Jackson + OH + US + 39.02 + -82.62 + 0 + 0 + RLX + + + OHZ065 + 350650 + Fairfield + OH + US + 39.74 + -82.60 + 0 + 0 + ILN + + + GAZ075 + 100750 + Glascock + GA + US + 33.23 + -82.59 + 0 + 0 + FFC + + + VAZ002 + 460020 + Wise + VA + US + 37.00 + -82.59 + 0 + 0 + MRX + + + OHZ019 + 350190 + Huron + OH + US + 41.14 + -82.58 + 0 + 0 + CLE + + + GAZ098 + 100980 + Treutlen + GA + US + 32.40 + -82.56 + 0 + 0 + FFC + + + OHZ087 + 350870 + Lawrence + OH + US + 38.62 + -82.56 + 0 + 0 + RLX + + + GAZ112 + 101120 + Montgomery + GA + US + 32.15 + -82.53 + 0 + 0 + FFC + + + NCZ053 + 330530 + Buncombe + NC + US + 35.62 + -82.53 + 0 + 0 + GSP + + + OHZ029 + 350290 + Richland + OH + US + 40.77 + -82.53 + 0 + 0 + CLE + + + OHZ084 + 350840 + Vinton + OH + US + 39.21 + -82.51 + 0 + 0 + RLX + + + KYZ119 + 171190 + Martin + KY + US + 37.82 + -82.50 + 0 + 0 + JKL + + + NCZ065 + 330650 + Henderson + NC + US + 35.32 + -82.50 + 0 + 0 + GSP + + + SCZ003 + 400030 + Greenville_Mountains + SC + US + 35.09 + -82.49 + 0 + 0 + GSP + + + SCZ011 + 400110 + Abbeville + SC + US + 34.25 + -82.49 + 0 + 0 + GSP + + + TNZ044 + 420440 + Washington + TN + US + 36.27 + -82.49 + 0 + 0 + MRX + + + OHZ056 + 350560 + Licking + OH + US + 40.09 + -82.48 + 0 + 0 + ILN + + + GAZ063 + 100630 + McDuffie + GA + US + 33.49 + -82.47 + 0 + 0 + CAE + + + FLZ042 + 90420 + Citrus + FL + US + 28.86 + -82.46 + 0 + 0 + TBW + + + OHZ047 + 350470 + Knox + OH + US + 40.40 + -82.46 + 0 + 0 + CLE + + + FLZ049 + 90490 + Pasco + FL + US + 28.32 + -82.45 + 0 + 0 + TBW + + + OHZ074 + 350740 + Hocking + OH + US + 39.50 + -82.45 + 0 + 0 + ILN + + + GAZ040 + 100400 + Lincoln + GA + US + 33.81 + -82.44 + 0 + 0 + CAE + + + GAZ076 + 100760 + Jefferson + GA + US + 33.04 + -82.44 + 0 + 0 + FFC + + + GAZ134 + 101340 + Bacon + GA + US + 31.56 + -82.42 + 0 + 0 + JAX + + + GAZ150 + 101500 + Ware + GA + US + 31.02 + -82.41 + 0 + 0 + JAX + + + TNZ045 + 420450 + Unicoi + TN + US + 36.11 + -82.41 + 0 + 0 + MRX + + + WVZ005 + 480050 + Wayne + WV + US + 38.14 + -82.41 + 0 + 0 + RLX + + + FLZ055 + 90550 + Manatee + FL + US + 27.43 + -82.40 + 0 + 0 + TBW + + + FLZ048 + 90480 + Hernando + FL + US + 28.56 + -82.37 + 0 + 0 + TBW + + + FLZ030 + 90300 + Union + FL + US + 30.03 + -82.35 + 0 + 0 + JAX + + + FLZ036 + 90360 + Alachua + FL + US + 29.68 + -82.35 + 0 + 0 + JAX + + + FLZ051 + 90510 + Hillsborough + FL + US + 27.91 + -82.35 + 0 + 0 + TBW + + + FLZ060 + 90600 + Sarasota + FL + US + 27.17 + -82.35 + 0 + 0 + TBW + + + KYZ120 + 171200 + Pike + KY + US + 37.47 + -82.35 + 0 + 0 + JKL + + + OHZ086 + 350860 + Gallia + OH + US + 38.81 + -82.34 + 0 + 0 + RLX + + + SCZ006 + 400060 + Greater_Greenville + SC + US + 34.77 + -82.34 + 0 + 0 + GSP + + + VAZ003 + 460030 + Dickenson + VA + US + 37.13 + -82.34 + 0 + 0 + RLX + + + GAZ113 + 101130 + Toombs + GA + US + 32.13 + -82.33 + 0 + 0 + FFC + + + GAZ086 + 100860 + Emanuel + GA + US + 32.56 + -82.32 + 0 + 0 + FFC + + + SCZ018 + 400180 + McCormick + SC + US + 33.83 + -82.32 + 0 + 0 + CAE + + + NCZ049 + 330490 + Yancey + NC + US + 35.89 + -82.31 + 0 + 0 + GSP + + + NCZ509 + 335090 + Polk_Mountains + NC + US + 35.29 + -82.31 + 0 + 0 + GSP + + + GAZ135 + 101350 + Appling + GA + US + 31.72 + -82.30 + 0 + 0 + JAX + + + OHZ030 + 350300 + Ashland + OH + US + 40.81 + -82.28 + 0 + 0 + CLE + + + WVZ006 + 480060 + Cabell + WV + US + 38.41 + -82.27 + 0 + 0 + RLX + + + TNZ017 + 420170 + Sullivan + TN + US + 36.51 + -82.26 + 0 + 0 + MRX + + + FLZ023 + 90230 + Baker + FL + US + 30.36 + -82.25 + 0 + 0 + JAX + + + GAZ064 + 100640 + Columbia + GA + US + 33.53 + -82.24 + 0 + 0 + CAE + + + OHZ066 + 350660 + Perry + OH + US + 39.74 + -82.24 + 0 + 0 + RLX + + + FLZ031 + 90310 + Bradford + FL + US + 29.93 + -82.23 + 0 + 0 + JAX + + + GAZ151 + 101510 + Pierce + GA + US + 31.37 + -82.20 + 0 + 0 + JAX + + + NCZ507 + 335070 + Rutherford_Mountains + NC + US + 35.46 + -82.18 + 0 + 0 + GSP + + + GAZ164 + 101640 + Charlton + GA + US + 30.71 + -82.15 + 0 + 0 + JAX + + + TNZ046 + 420460 + Northwest_Carter + TN + US + 36.38 + -82.15 + 0 + 0 + MRX + + + FLZ043 + 90430 + Sumter + FL + US + 28.63 + -82.13 + 0 + 0 + TBW + + + NCZ510 + 335100 + Eastern_Polk + NC + US + 35.29 + -82.13 + 0 + 0 + GSP + + + NCZ050 + 330500 + Mitchell + NC + US + 35.98 + -82.12 + 0 + 0 + GSP + + + OHZ010 + 350100 + Lorain + OH + US + 41.29 + -82.11 + 0 + 0 + CLE + + + TNZ047 + 420470 + Southeast_Carter + TN + US + 36.23 + -82.11 + 0 + 0 + MRX + + + WVZ024 + 480240 + Mingo + WV + US + 37.74 + -82.11 + 0 + 0 + RLX + + + NCZ505 + 335050 + McDowell_Mountains + NC + US + 35.74 + -82.10 + 0 + 0 + GSP + + + SCZ019 + 400190 + Greenwood + SC + US + 34.18 + -82.10 + 0 + 0 + GSP + + + FLZ040 + 90400 + Marion + FL + US + 29.24 + -82.09 + 0 + 0 + JAX + + + GAZ065 + 100650 + Richmond + GA + US + 33.39 + -82.09 + 0 + 0 + CAE + + + VAZ006 + 460060 + Russell + VA + US + 36.93 + -82.09 + 0 + 0 + MRX + + + GAZ099 + 100990 + Candler + GA + US + 32.41 + -82.08 + 0 + 0 + CHS + + + WVZ013 + 480130 + Lincoln + WV + US + 38.16 + -82.04 + 0 + 0 + RLX + + + OHZ085 + 350850 + Meigs + OH + US + 39.04 + -82.03 + 0 + 0 + RLX + + + OHZ075 + 350750 + Athens + OH + US + 39.36 + -82.01 + 0 + 0 + RLX + + + VAZ004 + 460040 + Buchanan + VA + US + 37.29 + -82.01 + 0 + 0 + RLX + + + GAZ114 + 101140 + Tattnall + GA + US + 32.05 + -82.00 + 0 + 0 + CHS + + + GAZ152 + 101520 + Brantley + GA + US + 31.19 + -82.00 + 0 + 0 + JAX + + + WVZ007 + 480070 + Mason + WV + US + 38.75 + -82.00 + 0 + 0 + RLX + + + SCZ012 + 400120 + Laurens + SC + US + 34.49 + -81.98 + 0 + 0 + GSP + + + FLZ062 + 90620 + Charlotte + FL + US + 26.90 + -81.97 + 0 + 0 + TBW + + + VAZ008 + 460080 + Washington + VA + US + 36.76 + -81.97 + 0 + 0 + MRX + + + GAZ087 + 100870 + Jenkins + GA + US + 32.78 + -81.96 + 0 + 0 + CHS + + + OHZ057 + 350570 + Muskingum + OH + US + 39.96 + -81.96 + 0 + 0 + PBZ + + + SCZ007 + 400070 + Spartanburg + SC + US + 34.89 + -81.96 + 0 + 0 + GSP + + + NCZ506 + 335060 + Eastern_McDowell + NC + US + 35.64 + -81.95 + 0 + 0 + GSP + + + GAZ077 + 100770 + Burke + GA + US + 33.05 + -81.94 + 0 + 0 + CAE + + + NCZ508 + 335080 + Greater_Rutherford + NC + US + 35.39 + -81.94 + 0 + 0 + GSP + + + OHZ038 + 350380 + Holmes + OH + US + 40.56 + -81.93 + 0 + 0 + CLE + + + FLZ065 + 90650 + Lee + FL + US + 26.55 + -81.92 + 0 + 0 + TBW + + + OHZ020 + 350200 + Medina + OH + US + 41.13 + -81.92 + 0 + 0 + CLE + + + NCZ033 + 330330 + Avery + NC + US + 36.10 + -81.91 + 0 + 0 + GSP + + + SCZ025 + 400250 + Edgefield + SC + US + 33.76 + -81.91 + 0 + 0 + CAE + + + OHZ048 + 350480 + Coshocton + OH + US + 40.30 + -81.90 + 0 + 0 + PBZ + + + WVZ025 + 480250 + Logan + WV + US + 37.83 + -81.90 + 0 + 0 + RLX + + + GAZ136 + 101360 + Wayne + GA + US + 31.58 + -81.88 + 0 + 0 + JAX + + + OHZ031 + 350310 + Wayne + OH + US + 40.83 + -81.88 + 0 + 0 + CLE + + + WVZ014 + 480140 + Putnam + WV + US + 38.48 + -81.88 + 0 + 0 + RLX + + + GAZ115 + 101150 + Evans + GA + US + 32.16 + -81.87 + 0 + 0 + CHS + + + NCZ503 + 335030 + Burke_Mountains + NC + US + 35.88 + -81.85 + 0 + 0 + GSP + + + TNZ018 + 420180 + Johnson + TN + US + 36.44 + -81.85 + 0 + 0 + MRX + + + OHZ067 + 350670 + Morgan + OH + US + 39.61 + -81.83 + 0 + 0 + RLX + + + FLZ032 + 90320 + Clay + FL + US + 29.96 + -81.82 + 0 + 0 + JAX + + + FLZ056 + 90560 + Hardee + FL + US + 27.49 + -81.81 + 0 + 0 + TBW + + + FLZ061 + 90610 + De_Soto + FL + US + 27.19 + -81.81 + 0 + 0 + TBW + + + FLZ144 + 91440 + Southern_Lake_County + FL + US + 28.56 + -81.80 + 0 + 0 + MLB + + + GAZ165 + 101650 + Inland_Camden + GA + US + 30.95 + -81.76 + 0 + 0 + JAX + + + FLZ037 + 90370 + Putnam + FL + US + 29.58 + -81.75 + 0 + 0 + JAX + + + FLZ024 + 90240 + Nassau + FL + US + 30.54 + -81.74 + 0 + 0 + JAX + + + SCZ026 + 400260 + Saluda + SC + US + 33.99 + -81.74 + 0 + 0 + CAE + + + FLZ069 + 90690 + Coastal_Collier_County + FL + US + 26.07 + -81.73 + 0 + 0 + MFL + + + GAZ100 + 101000 + Bulloch + GA + US + 32.40 + -81.73 + 0 + 0 + CHS + + + GAZ137 + 101370 + Long + GA + US + 31.77 + -81.73 + 0 + 0 + CHS + + + WVZ026 + 480260 + Boone + WV + US + 38.00 + -81.72 + 0 + 0 + RLX + + + FLZ025 + 90250 + Duval + FL + US + 30.34 + -81.71 + 0 + 0 + JAX + + + WVZ008 + 480080 + Jackson + WV + US + 38.83 + -81.71 + 0 + 0 + RLX + + + NCZ018 + 330180 + Watauga + NC + US + 36.25 + -81.68 + 0 + 0 + RNK + + + NCZ504 + 335040 + Greater_Burke + NC + US + 35.72 + -81.66 + 0 + 0 + GSP + + + OHZ011 + 350110 + Cuyahoga + OH + US + 41.45 + -81.66 + 0 + 0 + CLE + + + WVZ033 + 480330 + McDowell + WV + US + 37.38 + -81.65 + 0 + 0 + RLX + + + FLZ044 + 90440 + Northern_Lake_County + FL + US + 29.03 + -81.64 + 0 + 0 + MLB + + + SCZ013 + 400130 + Union + SC + US + 34.68 + -81.64 + 0 + 0 + GSP + + + GAZ088 + 100880 + Screven + GA + US + 32.77 + -81.63 + 0 + 0 + CHS + + + GAZ153 + 101530 + Inland_Glynn + GA + US + 31.28 + -81.63 + 0 + 0 + JAX + + + FLZ052 + 90520 + Polk + FL + US + 28.00 + -81.62 + 0 + 0 + TBW + + + SCZ008 + 400080 + Cherokee + SC + US + 35.01 + -81.62 + 0 + 0 + GSP + + + SCZ020 + 400200 + Newberry + SC + US + 34.29 + -81.62 + 0 + 0 + CAE + + + NCZ501 + 335010 + Caldwell_Mountains + NC + US + 36.01 + -81.61 + 0 + 0 + GSP + + + SCZ030 + 400300 + Aiken + SC + US + 33.54 + -81.60 + 0 + 0 + CAE + + + VAZ007 + 460070 + Tazewell + VA + US + 37.14 + -81.56 + 0 + 0 + RNK + + + WVZ015 + 480150 + Kanawha + WV + US + 38.30 + -81.56 + 0 + 0 + RLX + + + FLZ078 + 90780 + Monroe/Lower_Keys + FL + US + 24.64 + -81.55 + 0 + 0 + KEY + + + GAZ166 + 101660 + Coastal_Camden + GA + US + 30.91 + -81.55 + 0 + 0 + JAX + + + GAZ138 + 101380 + Inland_Liberty + GA + US + 31.87 + -81.54 + 0 + 0 + CHS + + + NCZ068 + 330680 + Cleveland + NC + US + 35.36 + -81.54 + 0 + 0 + GSP + + + VAZ009 + 460090 + Smyth + VA + US + 36.82 + -81.54 + 0 + 0 + RNK + + + WVZ034 + 480340 + Wyoming + WV + US + 37.60 + -81.54 + 0 + 0 + RLX + + + OHZ021 + 350210 + Summit + OH + US + 41.13 + -81.53 + 0 + 0 + CLE + + + NCZ502 + 335020 + Greater_Caldwell + NC + US + 35.91 + -81.52 + 0 + 0 + GSP + + + GAZ116 + 101160 + Inland_Bryan + GA + US + 32.00 + -81.50 + 0 + 0 + CHS + + + WVZ009 + 480090 + Wood + WV + US + 39.22 + -81.50 + 0 + 0 + RLX + + + NCZ001 + 330010 + Ashe + NC + US + 36.41 + -81.49 + 0 + 0 + RNK + + + OHZ039 + 350390 + Tuscarawas + OH + US + 40.43 + -81.49 + 0 + 0 + PBZ + + + GAZ140 + 101400 + Inland_McIntosh + GA + US + 31.52 + -81.48 + 0 + 0 + CHS + + + SCZ035 + 400350 + Barnwell + SC + US + 33.29 + -81.48 + 0 + 0 + CAE + + + OHZ058 + 350580 + Guernsey + OH + US + 40.02 + -81.47 + 0 + 0 + PBZ + + + OHZ068 + 350680 + Noble + OH + US + 39.76 + -81.46 + 0 + 0 + PBZ + + + FLZ033 + 90330 + St._Johns + FL + US + 29.94 + -81.45 + 0 + 0 + JAX + + + OHZ076 + 350760 + Washington + OH + US + 39.43 + -81.45 + 0 + 0 + RLX + + + GAZ154 + 101540 + Coastal_Glynn + GA + US + 31.23 + -81.41 + 0 + 0 + JAX + + + WVZ017 + 480170 + Wirt + WV + US + 39.04 + -81.38 + 0 + 0 + RLX + + + FLZ041 + 90410 + Inland_Volusia_County + FL + US + 29.10 + -81.37 + 0 + 0 + MLB + + + OHZ032 + 350320 + Stark + OH + US + 40.81 + -81.36 + 0 + 0 + CLE + + + SCZ040 + 400400 + Allendale + SC + US + 32.95 + -81.34 + 0 + 0 + CHS + + + GAZ101 + 101010 + Effingham + GA + US + 32.35 + -81.33 + 0 + 0 + CHS + + + GAZ141 + 101410 + Coastal_McIntosh + GA + US + 31.46 + -81.33 + 0 + 0 + CHS + + + WVZ016 + 480160 + Roane + WV + US + 38.74 + -81.32 + 0 + 0 + RLX + + + FLZ038 + 90380 + Flagler + FL + US + 29.47 + -81.31 + 0 + 0 + JAX + + + FLZ070 + 90700 + Inland_Collier_County + FL + US + 26.16 + -81.31 + 0 + 0 + MFL + + + FLZ045 + 90450 + Orange + FL + US + 28.56 + -81.27 + 0 + 0 + MLB + + + FLZ053 + 90530 + Osceola + FL + US + 27.99 + -81.26 + 0 + 0 + MLB + + + FLZ057 + 90570 + Highlands + FL + US + 27.34 + -81.26 + 0 + 0 + TBW + + + VAZ015 + 460150 + Grayson + VA + US + 36.69 + -81.26 + 0 + 0 + RNK + + + GAZ118 + 101180 + Inland_Chatham + GA + US + 32.07 + -81.24 + 0 + 0 + CHS + + + OHZ012 + 350120 + Lake + OH + US + 41.71 + -81.24 + 0 + 0 + CLE + + + SCZ027 + 400270 + Lexington + SC + US + 33.92 + -81.24 + 0 + 0 + CAE + + + NCZ056 + 330560 + Catawba + NC + US + 35.68 + -81.23 + 0 + 0 + GSP + + + NCZ069 + 330690 + Lincoln + NC + US + 35.48 + -81.23 + 0 + 0 + GSP + + + FLZ046 + 90460 + Seminole + FL + US + 28.74 + -81.22 + 0 + 0 + MLB + + + FLZ063 + 90630 + Glades + FL + US + 26.99 + -81.22 + 0 + 0 + MFL + + + FLZ066 + 90660 + Hendry + FL + US + 26.52 + -81.22 + 0 + 0 + MFL + + + WVZ035 + 480350 + Raleigh + WV + US + 37.75 + -81.22 + 0 + 0 + RLX + + + GAZ139 + 101390 + Coastal_Liberty + GA + US + 31.66 + -81.21 + 0 + 0 + CHS + + + NCZ019 + 330190 + Wilkes + NC + US + 36.21 + -81.21 + 0 + 0 + RNK + + + GAZ117 + 101170 + Coastal_Bryan + GA + US + 31.83 + -81.20 + 0 + 0 + CHS + + + OHZ013 + 350130 + Geauga + OH + US + 41.53 + -81.19 + 0 + 0 + CLE + + + OHZ022 + 350220 + Portage + OH + US + 41.17 + -81.19 + 0 + 0 + CLE + + + WVZ010 + 480100 + Pleasants + WV + US + 39.37 + -81.19 + 0 + 0 + RLX + + + NCZ070 + 330700 + Gaston + NC + US + 35.28 + -81.18 + 0 + 0 + GSP + + + SCZ009 + 400090 + York + SC + US + 34.99 + -81.18 + 0 + 0 + GSP + + + SCZ014 + 400140 + Chester + SC + US + 34.68 + -81.18 + 0 + 0 + GSP + + + NCZ035 + 330350 + Alexander + NC + US + 35.90 + -81.17 + 0 + 0 + GSP + + + VAZ010 + 460100 + Bland + VA + US + 37.13 + -81.15 + 0 + 0 + RNK + + + WVZ018 + 480180 + Calhoun + WV + US + 38.83 + -81.13 + 0 + 0 + RLX + + + FLZ075 + 90750 + Mainland_Monroe + FL + US + 25.46 + -81.12 + 0 + 0 + MFL + + + NCZ002 + 330020 + Alleghany + NC + US + 36.47 + -81.12 + 0 + 0 + RNK + + + SCZ042 + 400420 + Hampton + SC + US + 32.79 + -81.12 + 0 + 0 + CHS + + + OHZ049 + 350490 + Harrison + OH + US + 40.29 + -81.10 + 0 + 0 + PBZ + + + SCZ021 + 400210 + Fairfield + SC + US + 34.37 + -81.10 + 0 + 0 + CAE + + + WVZ042 + 480420 + Mercer + WV + US + 37.42 + -81.10 + 0 + 0 + RNK + + + OHZ040 + 350400 + Carroll + OH + US + 40.57 + -81.09 + 0 + 0 + PBZ + + + OHZ069 + 350690 + Monroe + OH + US + 39.70 + -81.07 + 0 + 0 + PBZ + + + WVZ019 + 480190 + Ritchie + WV + US + 39.20 + -81.07 + 0 + 0 + RLX + + + WVZ036 + 480360 + Fayette + WV + US + 38.04 + -81.07 + 0 + 0 + RLX + + + VAZ012 + 460120 + Wythe + VA + US + 36.92 + -81.06 + 0 + 0 + RNK + + + SCZ047 + 400470 + Inland_Jasper + SC + US + 32.42 + -81.05 + 0 + 0 + CHS + + + WVZ027 + 480270 + Clay + WV + US + 38.47 + -81.05 + 0 + 0 + RLX + + + FLZ141 + 91410 + Coastal_Volusia_County + FL + US + 29.02 + -81.03 + 0 + 0 + MLB + + + GAZ119 + 101190 + Coastal_Chatham + GA + US + 31.91 + -81.02 + 0 + 0 + CHS + + + SCZ041 + 400410 + Bamberg + SC + US + 33.23 + -81.01 + 0 + 0 + CAE + + + SCZ051 + 400510 + Coastal_Jasper + SC + US + 32.27 + -81.00 + 0 + 0 + CHS + + + OHZ059 + 350590 + Belmont + OH + US + 40.00 + -80.97 + 0 + 0 + PBZ + + + SCZ028 + 400280 + Richland + SC + US + 34.00 + -80.97 + 0 + 0 + CAE + + + FLZ077 + 90770 + Monroe/Middle_Keys + FL + US + 24.76 + -80.96 + 0 + 0 + KEY + + + FLZ058 + 90580 + Okeechobee + FL + US + 27.38 + -80.94 + 0 + 0 + MLB + + + NCZ036 + 330360 + Iredell + NC + US + 35.78 + -80.90 + 0 + 0 + GSP + + + WVZ011 + 480110 + Tyler + WV + US + 39.45 + -80.87 + 0 + 0 + RLX + + + WVZ043 + 480430 + Summers + WV + US + 37.65 + -80.87 + 0 + 0 + RNK + + + FLZ147 + 91470 + Northern_Brevard_County + FL + US + 28.56 + -80.86 + 0 + 0 + MLB + + + WVZ037 + 480370 + Nicholas + WV + US + 38.32 + -80.84 + 0 + 0 + RLX + + + WVZ029 + 480290 + Gilmer + WV + US + 38.92 + -80.83 + 0 + 0 + RLX + + + NCZ071 + 330710 + Mecklenburg + NC + US + 35.26 + -80.80 + 0 + 0 + GSP + + + OHZ033 + 350330 + Mahoning + OH + US + 41.01 + -80.80 + 0 + 0 + CLE + + + OHZ041 + 350410 + Columbiana + OH + US + 40.76 + -80.80 + 0 + 0 + PBZ + + + SCZ036 + 400360 + Orangeburg + SC + US + 33.44 + -80.79 + 0 + 0 + CAE + + + OHZ050 + 350500 + Jefferson + OH + US + 40.37 + -80.77 + 0 + 0 + PBZ + + + SCZ037 + 400370 + Calhoun + SC + US + 33.67 + -80.77 + 0 + 0 + CAE + + + OHZ014 + 350140 + Ashtabula_Inland + OH + US + 41.71 + -80.76 + 0 + 0 + CLE + + + OHZ023 + 350230 + Trumbull + OH + US + 41.31 + -80.76 + 0 + 0 + CLE + + + OHZ089 + 350890 + Ashtabula_Lakeshore + OH + US + 41.88 + -80.76 + 0 + 0 + CLE + + + VAZ016 + 460160 + Carroll + VA + US + 36.74 + -80.75 + 0 + 0 + RNK + + + WVZ028 + 480280 + Braxton + WV + US + 38.71 + -80.74 + 0 + 0 + RLX + + + SCZ043 + 400430 + Inland_Colleton + SC + US + 32.92 + -80.73 + 0 + 0 + CHS + + + WVZ020 + 480200 + Doddridge + WV + US + 39.27 + -80.73 + 0 + 0 + RLX + + + SCZ048 + 400480 + Beaufort + SC + US + 32.39 + -80.72 + 0 + 0 + CHS + + + VAZ011 + 460110 + Giles + VA + US + 37.31 + -80.72 + 0 + 0 + RNK + + + VAZ013 + 460130 + Pulaski + VA + US + 37.06 + -80.72 + 0 + 0 + RNK + + + NCZ003 + 330030 + Surry + NC + US + 36.40 + -80.70 + 0 + 0 + RNK + + + WVZ004 + 480040 + Marshall + WV + US + 39.88 + -80.70 + 0 + 0 + PBZ + + + WVZ012 + 480120 + Wetzel + WV + US + 39.58 + -80.67 + 0 + 0 + PBZ + + + FLZ047 + 90470 + Southern_Brevard_County + FL + US + 28.08 + -80.66 + 0 + 0 + MLB + + + NCZ020 + 330200 + Yadkin + NC + US + 36.16 + -80.66 + 0 + 0 + RNK + + + SCZ015 + 400150 + Lancaster + SC + US + 34.76 + -80.66 + 0 + 0 + CAE + + + FLZ174 + 91740 + Far_South_Miami-Dade_County + FL + US + 25.30 + -80.63 + 0 + 0 + MFL + + + WVZ003 + 480030 + Ohio + WV + US + 40.11 + -80.63 + 0 + 0 + PBZ + + + FLZ073 + 90730 + Inland_Miami-Dade_County + FL + US + 25.69 + -80.61 + 0 + 0 + MFL + + + FLZ054 + 90540 + Indian_River + FL + US + 27.71 + -80.60 + 0 + 0 + MLB + + + WVZ001 + 480010 + Hancock + WV + US + 40.52 + -80.60 + 0 + 0 + PBZ + + + WVZ002 + 480020 + Brooke + WV + US + 40.28 + -80.60 + 0 + 0 + PBZ + + + FLZ071 + 90710 + Inland_Broward_County + FL + US + 26.15 + -80.59 + 0 + 0 + MFL + + + SCZ022 + 400220 + Kershaw + SC + US + 34.34 + -80.58 + 0 + 0 + CAE + + + NCZ082 + 330820 + Union + NC + US + 35.01 + -80.56 + 0 + 0 + GSP + + + FLZ067 + 90670 + Inland_Palm_Beach_County + FL + US + 26.64 + -80.54 + 0 + 0 + MFL + + + NCZ072 + 330720 + Cabarrus + NC + US + 35.35 + -80.54 + 0 + 0 + GSP + + + WVZ044 + 480440 + Monroe + WV + US + 37.55 + -80.54 + 0 + 0 + RNK + + + NCZ037 + 330370 + Davie + NC + US + 35.90 + -80.53 + 0 + 0 + GSP + + + WVZ030 + 480300 + Lewis + WV + US + 38.94 + -80.52 + 0 + 0 + RLX + + + NCZ057 + 330570 + Rowan + NC + US + 35.67 + -80.47 + 0 + 0 + GSP + + + SCZ049 + 400490 + Coastal_Colleton + SC + US + 32.61 + -80.46 + 0 + 0 + CHS + + + FLZ059 + 90590 + St._Lucie + FL + US + 27.38 + -80.44 + 0 + 0 + MLB + + + SCZ044 + 400440 + Dorchester + SC + US + 33.07 + -80.44 + 0 + 0 + CHS + + + WVZ038 + 480380 + Webster + WV + US + 38.49 + -80.43 + 0 + 0 + RLX + + + WVZ045 + 480450 + Greenbrier + WV + US + 37.98 + -80.43 + 0 + 0 + RNK + + + VAZ014 + 460140 + Montgomery + VA + US + 37.17 + -80.40 + 0 + 0 + RNK + + + WVZ031 + 480310 + Harrison + WV + US + 39.28 + -80.39 + 0 + 0 + RLX + + + FLZ064 + 90640 + Martin + FL + US + 27.11 + -80.38 + 0 + 0 + MLB + + + FLZ076 + 90760 + Monroe/Upper_Keys + FL + US + 25.15 + -80.38 + 0 + 0 + KEY + + + VAZ017 + 460170 + Floyd + VA + US + 36.92 + -80.37 + 0 + 0 + RNK + + + PAZ020 + 380200 + Beaver + PA + US + 40.67 + -80.34 + 0 + 0 + PBZ + + + VAZ032 + 460320 + Patrick + VA + US + 36.71 + -80.33 + 0 + 0 + RNK + + + PAZ013 + 380130 + Lawrence + PA + US + 40.99 + -80.31 + 0 + 0 + PBZ + + + FLZ173 + 91730 + Coastal_Miami_Dade_County + FL + US + 25.64 + -80.30 + 0 + 0 + MFL + + + FLZ072 + 90720 + Metro_Broward_County + FL + US + 26.15 + -80.28 + 0 + 0 + MFL + + + FLZ074 + 90740 + Metropolitan_Miami_Dade + FL + US + 25.78 + -80.28 + 0 + 0 + MFL + + + NCZ073 + 330730 + Stanly + NC + US + 35.33 + -80.28 + 0 + 0 + RAH + + + NCZ021 + 330210 + Forsyth + NC + US + 36.11 + -80.27 + 0 + 0 + RAH + + + SCZ031 + 400310 + Sumter + SC + US + 33.90 + -80.27 + 0 + 0 + CAE + + + NCZ038 + 330380 + Davidson + NC + US + 35.76 + -80.26 + 0 + 0 + RAH + + + PAZ007 + 380070 + Mercer + PA + US + 41.28 + -80.26 + 0 + 0 + PBZ + + + NCZ004 + 330040 + Stokes + NC + US + 36.40 + -80.24 + 0 + 0 + RNK + + + SCZ029 + 400290 + Lee + SC + US + 34.16 + -80.23 + 0 + 0 + CAE + + + WVZ039 + 480390 + Upshur + WV + US + 38.90 + -80.23 + 0 + 0 + RLX + + + PAZ031 + 380310 + Greene + PA + US + 39.87 + -80.22 + 0 + 0 + PBZ + + + VAZ018 + 460180 + Craig + VA + US + 37.49 + -80.22 + 0 + 0 + RNK + + + WVZ021 + 480210 + Marion + WV + US + 39.51 + -80.22 + 0 + 0 + PBZ + + + SCZ038 + 400380 + Clarendon + SC + US + 33.69 + -80.21 + 0 + 0 + CAE + + + PAZ029 + 380290 + Washington + PA + US + 40.22 + -80.19 + 0 + 0 + PBZ + + + SCZ016 + 400160 + Chesterfield + SC + US + 34.59 + -80.17 + 0 + 0 + CAE + + + FLZ068 + 90680 + Metro_Palm_Beach_County + FL + US + 26.64 + -80.14 + 0 + 0 + MFL + + + PAZ001 + 380010 + Northern_Erie + PA + US + 42.10 + -80.14 + 0 + 0 + CLE + + + FLZ172 + 91720 + Coastal_Broward_County + FL + US + 26.15 + -80.12 + 0 + 0 + MFL + + + WVZ022 + 480220 + Monongalia + WV + US + 39.58 + -80.10 + 0 + 0 + PBZ + + + NCZ083 + 330830 + Anson + NC + US + 35.01 + -80.09 + 0 + 0 + RAH + + + PAZ002 + 380020 + Southern_Erie + PA + US + 42.03 + -80.07 + 0 + 0 + CLE + + + PAZ003 + 380030 + Crawford + PA + US + 41.67 + -80.07 + 0 + 0 + CLE + + + FLZ168 + 91680 + Coastal_Palm_Beach_County + FL + US + 26.65 + -80.06 + 0 + 0 + MFL + + + WVZ032 + 480320 + Taylor + WV + US + 39.34 + -80.06 + 0 + 0 + RLX + + + VAZ022 + 460220 + Roanoke + VA + US + 37.26 + -80.05 + 0 + 0 + RNK + + + PAZ021 + 380210 + Allegheny + PA + US + 40.44 + -80.03 + 0 + 0 + PBZ + + + WVZ040 + 480400 + Barbour + WV + US + 39.12 + -80.02 + 0 + 0 + RLX + + + WVZ046 + 480460 + Pocahontas + WV + US + 38.39 + -80.00 + 0 + 0 + RLX + + + SCZ023 + 400230 + Darlington + SC + US + 34.31 + -79.98 + 0 + 0 + ILM + + + VAZ019 + 460190 + Alleghany + VA + US + 37.78 + -79.95 + 0 + 0 + RNK + + + PAZ014 + 380140 + Butler + PA + US + 40.92 + -79.93 + 0 + 0 + PBZ + + + VAZ033 + 460330 + Franklin + VA + US + 37.01 + -79.92 + 0 + 0 + RNK + + + SCZ045 + 400450 + Berkeley + SC + US + 33.17 + -79.90 + 0 + 0 + CHS + + + NCZ074 + 330740 + Montgomery + NC + US + 35.32 + -79.89 + 0 + 0 + RAH + + + VAZ043 + 460430 + Henry + VA + US + 36.70 + -79.87 + 0 + 0 + RNK + + + SCZ050 + 400500 + Charleston + SC + US + 32.85 + -79.86 + 0 + 0 + CHS + + + WVZ047 + 480470 + Randolph + WV + US + 38.75 + -79.81 + 0 + 0 + RLX + + + NCZ039 + 330390 + Randolph + NC + US + 35.71 + -79.80 + 0 + 0 + RAH + + + NCZ022 + 330220 + Guilford + NC + US + 36.07 + -79.79 + 0 + 0 + RAH + + + VAZ023 + 460230 + Botetourt + VA + US + 37.55 + -79.79 + 0 + 0 + RNK + + + NCZ005 + 330050 + Rockingham + NC + US + 36.39 + -79.77 + 0 + 0 + RNK + + + NCZ084 + 330840 + Richmond + NC + US + 34.99 + -79.76 + 0 + 0 + RAH + + + VAZ020 + 460200 + Bath + VA + US + 38.06 + -79.75 + 0 + 0 + RNK + + + PAZ008 + 380080 + Venango + PA + US + 41.40 + -79.74 + 0 + 0 + PBZ + + + SCZ039 + 400390 + Williamsburg + SC + US + 33.59 + -79.71 + 0 + 0 + ILM + + + WVZ023 + 480230 + Preston + WV + US + 39.46 + -79.70 + 0 + 0 + PBZ + + + SCZ017 + 400170 + Marlboro + SC + US + 34.55 + -79.69 + 0 + 0 + ILM + + + SCZ032 + 400320 + Florence + SC + US + 34.04 + -79.69 + 0 + 0 + ILM + + + PAZ032 + 380320 + Fayette + PA + US + 39.93 + -79.66 + 0 + 0 + PBZ + + + WVZ041 + 480410 + Tucker + WV + US + 39.11 + -79.57 + 0 + 0 + PBZ + + + VAZ021 + 460210 + Highland + VA + US + 38.39 + -79.56 + 0 + 0 + LWX + + + VAZ034 + 460340 + Bedford + VA + US + 37.31 + -79.52 + 0 + 0 + RNK + + + NCZ085 + 330850 + Scotland + NC + US + 34.84 + -79.51 + 0 + 0 + RAH + + + PAZ015 + 380150 + Clarion + PA + US + 41.20 + -79.46 + 0 + 0 + PBZ + + + PAZ022 + 380220 + Armstrong + PA + US + 40.85 + -79.46 + 0 + 0 + PBZ + + + PAZ030 + 380300 + Westmoreland + PA + US + 40.36 + -79.44 + 0 + 0 + PBZ + + + WVZ501 + 485010 + Western_Grant + WV + US + 39.20 + -79.44 + 0 + 0 + LWX + + + NCZ075 + 330750 + Moore + NC + US + 35.28 + -79.43 + 0 + 0 + RAH + + + NYZ019 + 320190 + Chautauqua + NY + US + 42.29 + -79.41 + 0 + 0 + BUF + + + VAZ024 + 460240 + Rockbridge + VA + US + 37.81 + -79.41 + 0 + 0 + RNK + + + VAZ044 + 460440 + Pittsylvania + VA + US + 36.84 + -79.41 + 0 + 0 + RNK + + + NCZ023 + 330230 + Alamance + NC + US + 36.04 + -79.39 + 0 + 0 + RAH + + + SCZ024 + 400240 + Dillon + SC + US + 34.42 + -79.36 + 0 + 0 + ILM + + + SCZ033 + 400330 + Marion + SC + US + 34.00 + -79.35 + 0 + 0 + ILM + + + WVZ054 + 480540 + Pendleton + WV + US + 38.68 + -79.35 + 0 + 0 + LWX + + + NCZ006 + 330060 + Caswell + NC + US + 36.39 + -79.34 + 0 + 0 + RNK + + + SCZ046 + 400460 + Georgetown + SC + US + 33.45 + -79.34 + 0 + 0 + ILM + + + PAZ004 + 380040 + Warren + PA + US + 41.81 + -79.27 + 0 + 0 + CTP + + + NCZ086 + 330860 + Hoke + NC + US + 35.02 + -79.24 + 0 + 0 + RAH + + + PAZ009 + 380090 + Forest + PA + US + 41.47 + -79.24 + 0 + 0 + PBZ + + + NCZ040 + 330400 + Chatham + NC + US + 35.69 + -79.23 + 0 + 0 + RAH + + + MDZ001 + 200010 + Garrett + MD + US + 39.46 + -79.21 + 0 + 0 + PBZ + + + NCZ076 + 330760 + Lee + NC + US + 35.46 + -79.17 + 0 + 0 + RAH + + + WVZ502 + 485020 + Eastern_Grant + WV + US + 39.06 + -79.17 + 0 + 0 + LWX + + + VAZ035 + 460350 + Amherst + VA + US + 37.59 + -79.16 + 0 + 0 + RNK + + + PAZ023 + 380230 + Indiana + PA + US + 40.64 + -79.14 + 0 + 0 + PBZ + + + NCZ087 + 330870 + Robeson + NC + US + 34.63 + -79.13 + 0 + 0 + ILM + + + VAZ025 + 460250 + Augusta + VA + US + 38.18 + -79.13 + 0 + 0 + LWX + + + VAZ045 + 460450 + Campbell + VA + US + 37.25 + -79.13 + 0 + 0 + RNK + + + WVZ503 + 485030 + Western_Mineral + WV + US + 39.40 + -79.13 + 0 + 0 + LWX + + + NCZ024 + 330240 + Orange + NC + US + 36.04 + -79.11 + 0 + 0 + RAH + + + PAZ033 + 380330 + Somerset + PA + US + 40.00 + -79.04 + 0 + 0 + CTP + + + NCZ007 + 330070 + Person + NC + US + 36.39 + -78.98 + 0 + 0 + RAH + + + PAZ016 + 380160 + Jefferson + PA + US + 41.14 + -78.96 + 0 + 0 + PBZ + + + SCZ034 + 400340 + Horry + SC + US + 33.94 + -78.94 + 0 + 0 + ILM + + + MDZ501 + 205010 + Extreme_Western_Allegany + MD + US + 39.58 + -78.92 + 0 + 0 + LWX + + + VAZ036 + 460360 + Nelson + VA + US + 37.79 + -78.92 + 0 + 0 + LWX + + + WVZ504 + 485040 + Eastern_Mineral + WV + US + 39.44 + -78.89 + 0 + 0 + LWX + + + NCZ077 + 330770 + Harnett + NC + US + 35.38 + -78.88 + 0 + 0 + RAH + + + VAZ058 + 460580 + Halifax + VA + US + 36.80 + -78.88 + 0 + 0 + RNK + + + NCZ025 + 330250 + Durham + NC + US + 36.05 + -78.86 + 0 + 0 + RAH + + + VAZ026 + 460260 + Rockingham + VA + US + 38.53 + -78.86 + 0 + 0 + LWX + + + VAZ046 + 460460 + Appomattox + VA + US + 37.38 + -78.81 + 0 + 0 + RNK + + + WVZ055 + 480550 + Hardy + WV + US + 39.00 + -78.81 + 0 + 0 + LWX + + + NCZ088 + 330880 + Cumberland + NC + US + 35.04 + -78.80 + 0 + 0 + RAH + + + NYZ085 + 320850 + Southern_Erie + NY + US + 42.62 + -78.80 + 0 + 0 + BUF + + + NYZ001 + 320010 + Niagara + NY + US + 43.20 + -78.77 + 0 + 0 + BUF + + + NYZ010 + 320100 + Northern_Erie + NY + US + 42.94 + -78.74 + 0 + 0 + BUF + + + PAZ024 + 380240 + Cambria + PA + US + 40.48 + -78.71 + 0 + 0 + CTP + + + NYZ020 + 320200 + Cattaraugus + NY + US + 42.27 + -78.68 + 0 + 0 + BUF + + + VAZ059 + 460590 + Charlotte + VA + US + 36.98 + -78.68 + 0 + 0 + RNK + + + PAZ010 + 380100 + Elk + PA + US + 41.42 + -78.67 + 0 + 0 + CTP + + + WVZ050 + 480500 + Hampshire + WV + US + 39.32 + -78.66 + 0 + 0 + LWX + + + MDZ502 + 205020 + Central_and_Eastern_Allegany + MD + US + 39.58 + -78.65 + 0 + 0 + LWX + + + NCZ008 + 330080 + Granville + NC + US + 36.28 + -78.63 + 0 + 0 + RAH + + + NCZ041 + 330410 + Wake + NC + US + 35.79 + -78.63 + 0 + 0 + RAH + + + NCZ099 + 330990 + Columbus + NC + US + 34.21 + -78.61 + 0 + 0 + ILM + + + PAZ005 + 380050 + McKean + PA + US + 41.80 + -78.58 + 0 + 0 + CTP + + + VAZ027 + 460270 + Shenandoah + VA + US + 38.86 + -78.58 + 0 + 0 + LWX + + + VAZ047 + 460470 + Buckingham + VA + US + 37.56 + -78.55 + 0 + 0 + RNK + + + NCZ096 + 330960 + Bladen + NC + US + 34.61 + -78.53 + 0 + 0 + ILM + + + VAZ037 + 460370 + Albemarle + VA + US + 38.00 + -78.52 + 0 + 0 + LWX + + + PAZ034 + 380340 + Bedford + PA + US + 40.02 + -78.48 + 0 + 0 + CTP + + + VAZ029 + 460290 + Page + VA + US + 38.62 + -78.48 + 0 + 0 + LWX + + + VAZ038 + 460380 + Greene + VA + US + 38.33 + -78.47 + 0 + 0 + LWX + + + VAZ060 + 460600 + Prince_Edward + VA + US + 37.24 + -78.46 + 0 + 0 + AKQ + + + PAZ017 + 380170 + Clearfield + PA + US + 40.99 + -78.43 + 0 + 0 + CTP + + + NCZ009 + 330090 + Vance + NC + US + 36.35 + -78.40 + 0 + 0 + RAH + + + NCZ042 + 330420 + Johnston + NC + US + 35.53 + -78.39 + 0 + 0 + RAH + + + NCZ089 + 330890 + Sampson + NC + US + 34.93 + -78.39 + 0 + 0 + RAH + + + VAZ065 + 460650 + Mecklenburg + VA + US + 36.72 + -78.39 + 0 + 0 + AKQ + + + PAZ025 + 380250 + Blair + PA + US + 40.50 + -78.37 + 0 + 0 + CTP + + + NCZ100 + 331000 + Brunswick + NC + US + 34.10 + -78.30 + 0 + 0 + ILM + + + VAZ028 + 460280 + Frederick + VA + US + 39.23 + -78.29 + 0 + 0 + LWX + + + NCZ026 + 330260 + Franklin + NC + US + 36.04 + -78.28 + 0 + 0 + RAH + + + VAZ048 + 460480 + Fluvanna + VA + US + 37.85 + -78.28 + 0 + 0 + AKQ + + + VAZ061 + 460610 + Cumberland + VA + US + 37.52 + -78.28 + 0 + 0 + AKQ + + + VAZ039 + 460390 + Madison + VA + US + 38.43 + -78.27 + 0 + 0 + LWX + + + VAZ066 + 460660 + Lunenburg + VA + US + 36.95 + -78.25 + 0 + 0 + AKQ + + + WVZ051 + 480510 + Morgan + WV + US + 39.54 + -78.25 + 0 + 0 + LWX + + + NYZ002 + 320020 + Orleans + NY + US + 43.25 + -78.23 + 0 + 0 + BUF + + + NYZ012 + 320120 + Wyoming + NY + US + 42.70 + -78.22 + 0 + 0 + BUF + + + PAZ011 + 380110 + Cameron + PA + US + 41.42 + -78.21 + 0 + 0 + CTP + + + VAZ030 + 460300 + Warren + VA + US + 38.90 + -78.20 + 0 + 0 + LWX + + + NYZ011 + 320110 + Genesee + NY + US + 43.00 + -78.18 + 0 + 0 + BUF + + + VAZ040 + 460400 + Rappahannock + VA + US + 38.69 + -78.14 + 0 + 0 + LWX + + + PAZ035 + 380350 + Fulton + PA + US + 39.94 + -78.13 + 0 + 0 + CTP + + + NCZ010 + 330100 + Warren + NC + US + 36.37 + -78.11 + 0 + 0 + RAH + + + NCZ078 + 330780 + Wayne + NC + US + 35.37 + -78.06 + 0 + 0 + RAH + + + VAZ050 + 460500 + Orange + VA + US + 38.26 + -78.04 + 0 + 0 + LWX + + + VAZ067 + 460670 + Nottoway + VA + US + 37.14 + -78.03 + 0 + 0 + AKQ + + + WVZ052 + 480520 + Berkeley + WV + US + 39.44 + -78.03 + 0 + 0 + LWX + + + NYZ021 + 320210 + Allegany + NY + US + 42.26 + -78.01 + 0 + 0 + BUF + + + PAZ018 + 380180 + Northern_Centre + PA + US + 41.00 + -78.01 + 0 + 0 + CTP + + + VAZ049 + 460490 + Louisa + VA + US + 37.94 + -78.00 + 0 + 0 + AKQ + + + VAZ031 + 460310 + Clarke + VA + US + 39.12 + -77.99 + 0 + 0 + LWX + + + NCZ027 + 330270 + Nash + NC + US + 35.96 + -77.98 + 0 + 0 + RAH + + + PAZ026 + 380260 + Huntingdon + PA + US + 40.40 + -77.97 + 0 + 0 + CTP + + + VAZ068 + 460680 + Amelia + VA + US + 37.34 + -77.95 + 0 + 0 + AKQ + + + NCZ043 + 330430 + Wilson + NC + US + 35.71 + -77.93 + 0 + 0 + RAH + + + NCZ090 + 330900 + Duplin + NC + US + 34.95 + -77.93 + 0 + 0 + MHX + + + VAZ051 + 460510 + Culpeper + VA + US + 38.51 + -77.93 + 0 + 0 + LWX + + + PAZ006 + 380060 + Potter + PA + US + 41.74 + -77.91 + 0 + 0 + CTP + + + VAZ062 + 460620 + Goochland + VA + US + 37.73 + -77.90 + 0 + 0 + AKQ + + + VAZ069 + 460690 + Powhatan + VA + US + 37.55 + -77.90 + 0 + 0 + AKQ + + + NCZ097 + 330970 + Pender + NC + US + 34.51 + -77.89 + 0 + 0 + ILM + + + NCZ101 + 331010 + New_Hanover + NC + US + 34.16 + -77.88 + 0 + 0 + ILM + + + WVZ053 + 480530 + Jefferson + WV + US + 39.32 + -77.88 + 0 + 0 + LWX + + + VAZ079 + 460790 + Brunswick + VA + US + 36.79 + -77.86 + 0 + 0 + AKQ + + + VAZ041 + 460410 + Fauquier + VA + US + 38.71 + -77.84 + 0 + 0 + LWX + + + PAZ036 + 380360 + Franklin + PA + US + 40.01 + -77.78 + 0 + 0 + CTP + + + NYZ013 + 320130 + Livingston + NY + US + 42.73 + -77.77 + 0 + 0 + BUF + + + MDZ003 + 200030 + Washington + MD + US + 39.52 + -77.72 + 0 + 0 + LWX + + + PAZ012 + 380120 + Northern_Clinton + PA + US + 41.28 + -77.71 + 0 + 0 + CTP + + + PAZ019 + 380190 + Southern_Centre + PA + US + 40.89 + -77.69 + 0 + 0 + CTP + + + NYZ003 + 320030 + Monroe + NY + US + 43.16 + -77.68 + 0 + 0 + BUF + + + VAZ056 + 460560 + Spotsylvania + VA + US + 38.19 + -77.66 + 0 + 0 + LWX + + + NCZ079 + 330790 + Greene + NC + US + 35.50 + -77.65 + 0 + 0 + MHX + + + VAZ080 + 460800 + Dinwiddie + VA + US + 37.07 + -77.65 + 0 + 0 + AKQ + + + VAZ042 + 460420 + Loudoun + VA + US + 39.09 + -77.64 + 0 + 0 + LWX + + + NCZ011 + 330110 + Halifax + NC + US + 36.25 + -77.62 + 0 + 0 + RAH + + + NCZ091 + 330910 + Lenoir + NC + US + 35.21 + -77.61 + 0 + 0 + MHX + + + PAZ027 + 380270 + Mifflin + PA + US + 40.61 + -77.60 + 0 + 0 + CTP + + + NCZ028 + 330280 + Edgecombe + NC + US + 35.91 + -77.59 + 0 + 0 + RAH + + + VAZ070 + 460700 + Chesterfield + VA + US + 37.39 + -77.56 + 0 + 0 + AKQ + + + VAZ087 + 460870 + Greensville + VA + US + 36.72 + -77.56 + 0 + 0 + AKQ + + + PAZ028 + 380280 + Juniata + PA + US + 40.48 + -77.50 + 0 + 0 + CTP + + + NCZ012 + 330120 + Northampton + NC + US + 36.36 + -77.49 + 0 + 0 + AKQ + + + VAZ052 + 460520 + Pr_William/Manassas/Manassas_Pk + VA + US + 38.72 + -77.47 + 0 + 0 + LWX + + + VAZ055 + 460550 + Stafford + VA + US + 38.42 + -77.46 + 0 + 0 + LWX + + + VAZ063 + 460630 + Hanover + VA + US + 37.78 + -77.46 + 0 + 0 + AKQ + + + VAZ071 + 460710 + Henrico + VA + US + 37.53 + -77.42 + 0 + 0 + AKQ + + + MDZ004 + 200040 + Frederick + MD + US + 39.47 + -77.40 + 0 + 0 + LWX + + + NCZ044 + 330440 + Pitt + NC + US + 35.58 + -77.40 + 0 + 0 + MHX + + + NCZ092 + 330920 + Jones + NC + US + 35.01 + -77.39 + 0 + 0 + MHX + + + PAZ045 + 380450 + Southern_Clinton + PA + US + 41.09 + -77.39 + 0 + 0 + CTP + + + NYZ022 + 320220 + Steuben + NY + US + 42.29 + -77.36 + 0 + 0 + BGM + + + VAZ064 + 460640 + Caroline + VA + US + 38.01 + -77.36 + 0 + 0 + AKQ + + + NYZ014 + 320140 + Ontario + NY + US + 42.81 + -77.29 + 0 + 0 + BUF + + + PAZ056 + 380560 + Perry + PA + US + 40.41 + -77.29 + 0 + 0 + CTP + + + VAZ053 + 460530 + Fairfax + VA + US + 38.84 + -77.29 + 0 + 0 + LWX + + + VAZ088 + 460880 + Sussex + VA + US + 36.91 + -77.29 + 0 + 0 + AKQ + + + NCZ098 + 330980 + Onslow + NC + US + 34.72 + -77.26 + 0 + 0 + MHX + + + PAZ037 + 380370 + Tioga + PA + US + 41.77 + -77.25 + 0 + 0 + CTP + + + PAZ063 + 380630 + Cumberland + PA + US + 40.14 + -77.24 + 0 + 0 + CTP + + + PAZ064 + 380640 + Adams + PA + US + 39.90 + -77.22 + 0 + 0 + CTP + + + VAZ081 + 460810 + Prince_George + VA + US + 37.16 + -77.22 + 0 + 0 + AKQ + + + MDZ009 + 200090 + Montgomery + MD + US + 39.14 + -77.20 + 0 + 0 + LWX + + + VAZ057 + 460570 + King_George + VA + US + 38.28 + -77.18 + 0 + 0 + LWX + + + VAZ092 + 460920 + Southampton + VA + US + 36.78 + -77.16 + 0 + 0 + AKQ + + + NYZ015 + 320150 + Yates + NY + US + 42.61 + -77.13 + 0 + 0 + BGM + + + VAZ054 + 460540 + Arlington/Falls_Ch/Alexandria + VA + US + 38.86 + -77.12 + 0 + 0 + LWX + + + PAZ041 + 380410 + Northern_Lycoming + PA + US + 41.41 + -77.11 + 0 + 0 + CTP + + + PAZ049 + 380490 + Union + PA + US + 40.98 + -77.10 + 0 + 0 + CTP + + + NCZ029 + 330290 + Martin + NC + US + 35.86 + -77.09 + 0 + 0 + MHX + + + PAZ050 + 380500 + Snyder + PA + US + 40.76 + -77.09 + 0 + 0 + CTP + + + VAZ082 + 460820 + Charles_City + VA + US + 37.36 + -77.08 + 0 + 0 + AKQ + + + VAZ072 + 460720 + King_William + VA + US + 37.71 + -77.06 + 0 + 0 + AKQ + + + MDZ005 + 200050 + Carroll + MD + US + 39.53 + -77.05 + 0 + 0 + LWX + + + NCZ093 + 330930 + Craven + NC + US + 35.13 + -77.05 + 0 + 0 + MHX + + + NYZ004 + 320040 + Wayne + NY + US + 43.18 + -77.04 + 0 + 0 + BUF + + + DCZ001 + 510010 + District_of_Columbia + DC + US + 38.89 + -77.02 + 0 + 0 + LWX + + + NCZ030 + 330300 + Bertie + NC + US + 36.03 + -77.01 + 0 + 0 + AKQ + + + VAZ083 + 460830 + New_Kent + VA + US + 37.50 + -76.99 + 0 + 0 + AKQ + + + MDZ016 + 200160 + Charles + MD + US + 38.48 + -76.98 + 0 + 0 + LWX + + + NCZ013 + 330130 + Hertford + NC + US + 36.39 + -76.96 + 0 + 0 + AKQ + + + MDZ010 + 200100 + Howard + MD + US + 39.23 + -76.94 + 0 + 0 + LWX + + + VAZ074 + 460740 + Essex + VA + US + 37.95 + -76.93 + 0 + 0 + AKQ + + + VAZ073 + 460730 + King_and_Queen + VA + US + 37.70 + -76.92 + 0 + 0 + AKQ + + + VAZ089 + 460890 + Surry + VA + US + 37.10 + -76.91 + 0 + 0 + AKQ + + + MDZ013 + 200130 + Prince_Georges + MD + US + 38.83 + -76.88 + 0 + 0 + LWX + + + PAZ046 + 380460 + Southern_Lycoming + PA + US + 41.22 + -76.88 + 0 + 0 + CTP + + + NYZ023 + 320230 + Schuyler + NY + US + 42.40 + -76.86 + 0 + 0 + BGM + + + NCZ080 + 330800 + Beaufort + NC + US + 35.48 + -76.84 + 0 + 0 + MHX + + + VAZ075 + 460750 + Westmoreland + VA + US + 38.12 + -76.80 + 0 + 0 + AKQ + + + PAZ057 + 380570 + Dauphin + PA + US + 40.40 + -76.79 + 0 + 0 + CTP + + + NYZ016 + 320160 + Seneca + NY + US + 42.79 + -76.78 + 0 + 0 + BGM + + + NYZ024 + 320240 + Chemung + NY + US + 42.15 + -76.75 + 0 + 0 + BGM + + + VAZ090 + 460900 + James_City + VA + US + 37.32 + -76.75 + 0 + 0 + AKQ + + + VAZ076 + 460760 + Richmond + VA + US + 37.95 + -76.73 + 0 + 0 + AKQ + + + NCZ014 + 330140 + Gates + NC + US + 36.42 + -76.71 + 0 + 0 + AKQ + + + NCZ094 + 330940 + Pamlico + NC + US + 35.15 + -76.71 + 0 + 0 + MHX + + + VAZ093 + 460930 + Isle_of_Wight + VA + US + 36.89 + -76.71 + 0 + 0 + AKQ + + + PAZ065 + 380650 + York + PA + US + 39.97 + -76.69 + 0 + 0 + CTP + + + PAZ052 + 380520 + Northumberland + PA + US + 40.89 + -76.67 + 0 + 0 + CTP + + + VAZ096 + 460960 + Suffolk + VA + US + 36.74 + -76.67 + 0 + 0 + AKQ + + + NCZ031 + 330310 + Chowan + NC + US + 36.17 + -76.66 + 0 + 0 + AKQ + + + PAZ051 + 380510 + Montour + PA + US + 41.02 + -76.66 + 0 + 0 + CTP + + + MDZ006 + 200060 + Northern_Baltimore + MD + US + 39.57 + -76.64 + 0 + 0 + LWX + + + VAZ085 + 460850 + Middlesex + VA + US + 37.65 + -76.64 + 0 + 0 + AKQ + + + MDZ011 + 200110 + Southern_Baltimore + MD + US + 39.31 + -76.61 + 0 + 0 + LWX + + + MDZ014 + 200140 + Anne_Arundel + MD + US + 38.97 + -76.61 + 0 + 0 + LWX + + + NCZ045 + 330450 + Washington + NC + US + 35.84 + -76.60 + 0 + 0 + MHX + + + NCZ095 + 330950 + Carteret + NC + US + 34.85 + -76.60 + 0 + 0 + MHX + + + NYZ005 + 320050 + Northern_Cayuga + NY + US + 43.22 + -76.60 + 0 + 0 + BUF + + + MDZ017 + 200170 + St._Marys + MD + US + 38.28 + -76.59 + 0 + 0 + LWX + + + VAZ084 + 460840 + Gloucester + VA + US + 37.43 + -76.55 + 0 + 0 + AKQ + + + MDZ018 + 200180 + Calvert + MD + US + 38.54 + -76.54 + 0 + 0 + LWX + + + PAZ038 + 380380 + Bradford + PA + US + 41.77 + -76.53 + 0 + 0 + BGM + + + PAZ042 + 380420 + Sullivan + PA + US + 41.44 + -76.52 + 0 + 0 + CTP + + + VAZ091 + 460910 + York + VA + US + 37.23 + -76.51 + 0 + 0 + AKQ + + + NYZ017 + 320170 + Southern_Cayuga + NY + US + 42.82 + -76.50 + 0 + 0 + BGM + + + VAZ094 + 460940 + Newport_News/Hampton + VA + US + 37.10 + -76.50 + 0 + 0 + AKQ + + + NYZ025 + 320250 + Tompkins + NY + US + 42.45 + -76.47 + 0 + 0 + BGM + + + VAZ078 + 460780 + Lancaster + VA + US + 37.73 + -76.45 + 0 + 0 + AKQ + + + VAZ077 + 460770 + Northumberland + VA + US + 37.86 + -76.44 + 0 + 0 + AKQ + + + PAZ053 + 380530 + Columbia + PA + US + 41.04 + -76.43 + 0 + 0 + CTP + + + PAZ059 + 380590 + Lebanon + PA + US + 40.38 + -76.42 + 0 + 0 + CTP + + + NCZ032 + 330320 + Perquimans + NC + US + 36.22 + -76.40 + 0 + 0 + AKQ + + + MDZ007 + 200070 + Harford + MD + US + 39.50 + -76.32 + 0 + 0 + LWX + + + NYZ055 + 320550 + Tioga + NY + US + 42.20 + -76.32 + 0 + 0 + BGM + + + PAZ066 + 380660 + Lancaster + PA + US + 40.02 + -76.31 + 0 + 0 + CTP + + + VAZ095 + 460950 + Norfolk/Portsmouth + VA + US + 36.87 + -76.30 + 0 + 0 + AKQ + + + VAZ086 + 460860 + Mathews + VA + US + 37.42 + -76.29 + 0 + 0 + AKQ + + + NCZ015 + 330150 + Pasquotank + NC + US + 36.31 + -76.28 + 0 + 0 + AKQ + + + VAZ097 + 460970 + Chesapeake + VA + US + 36.71 + -76.28 + 0 + 0 + AKQ + + + NCZ081 + 330810 + Western_Hyde + NC + US + 35.51 + -76.26 + 0 + 0 + MHX + + + PAZ058 + 380580 + Schuylkill + PA + US + 40.72 + -76.23 + 0 + 0 + CTP + + + NCZ046 + 330460 + Tyrrell + NC + US + 35.79 + -76.21 + 0 + 0 + MHX + + + NYZ006 + 320060 + Oswego + NY + US + 43.43 + -76.19 + 0 + 0 + BUF + + + NYZ018 + 320180 + Onondaga + NY + US + 43.02 + -76.19 + 0 + 0 + BGM + + + NCZ016 + 330160 + Camden + NC + US + 36.36 + -76.17 + 0 + 0 + AKQ + + + MDZ012 + 200120 + Kent + MD + US + 39.20 + -76.15 + 0 + 0 + PHI + + + MDZ019 + 200190 + Talbot + MD + US + 38.76 + -76.15 + 0 + 0 + PHI + + + NYZ044 + 320440 + Cortland + NY + US + 42.60 + -76.07 + 0 + 0 + BGM + + + MDZ015 + 200150 + Queen_Anne's + MD + US + 39.06 + -76.06 + 0 + 0 + PHI + + + VAZ098 + 460980 + Virginia_Beach + VA + US + 36.74 + -76.05 + 0 + 0 + AKQ + + + MDZ021 + 200210 + Dorchester + MD + US + 38.41 + -76.03 + 0 + 0 + AKQ + + + PAZ043 + 380430 + Wyoming + PA + US + 41.52 + -76.01 + 0 + 0 + BGM + + + PAZ060 + 380600 + Berks + PA + US + 40.41 + -75.99 + 0 + 0 + PHI + + + PAZ047 + 380470 + Luzerne + PA + US + 41.16 + -75.96 + 0 + 0 + BGM + + + NYZ007 + 320070 + Jefferson + NY + US + 44.03 + -75.95 + 0 + 0 + BUF + + + VAZ100 + 461000 + Northampton + VA + US + 37.34 + -75.95 + 0 + 0 + AKQ + + + NCZ017 + 330170 + Western_Currituck + NC + US + 36.31 + -75.94 + 0 + 0 + AKQ + + + MDZ008 + 200080 + Cecil + MD + US + 39.55 + -75.93 + 0 + 0 + PHI + + + NCZ104 + 331040 + Eastern_Hyde + NC + US + 35.13 + -75.92 + 0 + 0 + MHX + + + NCZ047 + 330470 + Western_Dare + NC + US + 35.77 + -75.87 + 0 + 0 + MHX + + + MDZ020 + 200200 + Caroline + MD + US + 38.90 + -75.86 + 0 + 0 + PHI + + + NCZ102 + 331020 + Eastern_Currituck + NC + US + 36.37 + -75.84 + 0 + 0 + AKQ + + + PAZ039 + 380390 + Susquehanna + PA + US + 41.82 + -75.81 + 0 + 0 + BGM + + + MDZ023 + 200230 + Somerset + MD + US + 38.10 + -75.80 + 0 + 0 + AKQ + + + NYZ056 + 320560 + Broome + NY + US + 42.21 + -75.76 + 0 + 0 + BGM + + + PAZ067 + 380670 + Chester + PA + US + 39.99 + -75.76 + 0 + 0 + PHI + + + PAZ054 + 380540 + Carbon + PA + US + 40.94 + -75.74 + 0 + 0 + PHI + + + PAZ044 + 380440 + Lackawanna + PA + US + 41.40 + -75.64 + 0 + 0 + BGM + + + VAZ099 + 460990 + Accomack + VA + US + 37.74 + -75.64 + 0 + 0 + AKQ + + + MDZ022 + 200220 + Wicomico + MD + US + 38.39 + -75.62 + 0 + 0 + AKQ + + + NYZ036 + 320360 + Madison + NY + US + 42.96 + -75.62 + 0 + 0 + BGM + + + PAZ061 + 380610 + Lehigh + PA + US + 40.60 + -75.62 + 0 + 0 + PHI + + + DEZ001 + 80010 + New_Castle + DE + US + 39.57 + -75.60 + 0 + 0 + PHI + + + NYZ045 + 320450 + Chenango + NY + US + 42.47 + -75.59 + 0 + 0 + BGM + + + DEZ002 + 80020 + Kent + DE + US + 39.10 + -75.53 + 0 + 0 + PHI + + + NCZ103 + 331030 + Eastern_Dare + NC + US + 35.48 + -75.48 + 0 + 0 + MHX + + + NYZ008 + 320080 + Lewis + NY + US + 43.82 + -75.48 + 0 + 0 + BUF + + + NYZ009 + 320090 + Northern_Oneida + NY + US + 43.38 + -75.48 + 0 + 0 + BGM + + + PAZ070 + 380700 + Delaware + PA + US + 39.93 + -75.43 + 0 + 0 + PHI + + + DEZ003 + 80030 + Inland_Sussex + DE + US + 38.70 + -75.42 + 0 + 0 + PHI + + + NYZ037 + 320370 + Southern_Oneida + NY + US + 43.08 + -75.41 + 0 + 0 + BGM + + + MDZ024 + 200240 + Inland_Worcester + MD + US + 38.23 + -75.39 + 0 + 0 + AKQ + + + PAZ068 + 380680 + Montgomery + PA + US + 40.21 + -75.36 + 0 + 0 + PHI + + + PAZ062 + 380620 + Northampton + PA + US + 40.75 + -75.34 + 0 + 0 + PHI + + + NJZ016 + 300160 + Salem + NJ + US + 39.58 + -75.32 + 0 + 0 + PHI + + + PAZ055 + 380550 + Monroe + PA + US + 41.03 + -75.31 + 0 + 0 + PHI + + + PAZ072 + 380720 + Southern_Wayne + PA + US + 41.44 + -75.28 + 0 + 0 + BGM + + + PAZ040 + 380400 + Northern_Wayne + PA + US + 41.80 + -75.27 + 0 + 0 + BGM + + + NYZ087 + 320870 + Southwestern_St._Lawrence + NY + US + 44.46 + -75.23 + 0 + 0 + BTV + + + MDZ025 + 200250 + Maryland_Beaches + MD + US + 38.17 + -75.18 + 0 + 0 + AKQ + + + NJZ017 + 300170 + Gloucester + NJ + US + 39.70 + -75.16 + 0 + 0 + PHI + + + NJZ021 + 300210 + Cumberland + NJ + US + 39.37 + -75.14 + 0 + 0 + PHI + + + PAZ071 + 380710 + Philadelphia + PA + US + 39.99 + -75.13 + 0 + 0 + PHI + + + PAZ069 + 380690 + Bucks + PA + US + 40.32 + -75.11 + 0 + 0 + PHI + + + DEZ004 + 80040 + Delaware_Beaches + DE + US + 38.63 + -75.09 + 0 + 0 + PHI + + + PAZ048 + 380480 + Pike + PA + US + 41.34 + -75.03 + 0 + 0 + BGM + + + NYZ046 + 320460 + Otsego + NY + US + 42.61 + -75.02 + 0 + 0 + BGM + + + NJZ007 + 300070 + Warren + NJ + US + 40.83 + -74.99 + 0 + 0 + PHI + + + NYZ026 + 320260 + Northern_St._Lawrence + NY + US + 44.86 + -74.99 + 0 + 0 + BTV + + + NYZ032 + 320320 + Northern_Herkimer + NY + US + 43.71 + -74.97 + 0 + 0 + ALY + + + NJZ009 + 300090 + Hunterdon + NJ + US + 40.56 + -74.96 + 0 + 0 + PHI + + + NJZ018 + 300180 + Camden + NJ + US + 39.79 + -74.95 + 0 + 0 + PHI + + + NYZ038 + 320380 + Southern_Herkimer + NY + US + 43.08 + -74.95 + 0 + 0 + ALY + + + NYZ029 + 320290 + Southeastern_St._Lawrence + NY + US + 44.39 + -74.93 + 0 + 0 + BTV + + + NYZ057 + 320570 + Delaware + NY + US + 42.19 + -74.93 + 0 + 0 + BGM + + + NJZ023 + 300230 + Cape_May + NJ + US + 39.15 + -74.81 + 0 + 0 + PHI + + + NJZ019 + 300190 + Northwestern_Burlington + NJ + US + 39.97 + -74.77 + 0 + 0 + PHI + + + NJZ024 + 300240 + Atlantic_Coastal_Cape_May + NJ + US + 39.11 + -74.76 + 0 + 0 + PHI + + + NYZ062 + 320620 + Sullivan + NY + US + 41.72 + -74.76 + 0 + 0 + BGM + + + NJZ015 + 300150 + Mercer + NJ + US + 40.27 + -74.71 + 0 + 0 + PHI + + + NJZ022 + 300220 + Atlantic + NJ + US + 39.50 + -74.69 + 0 + 0 + PHI + + + NJZ001 + 300010 + Sussex + NJ + US + 41.13 + -74.68 + 0 + 0 + PHI + + + NJZ010 + 300100 + Somerset + NJ + US + 40.56 + -74.60 + 0 + 0 + PHI + + + NJZ027 + 300270 + Southeastern_Burlington + NJ + US + 39.73 + -74.60 + 0 + 0 + PHI + + + NJZ008 + 300080 + Morris + NJ + US + 40.86 + -74.58 + 0 + 0 + PHI + + + NJZ025 + 300250 + Coastal_Atlantic + NJ + US + 39.40 + -74.46 + 0 + 0 + PHI + + + NYZ033 + 320330 + Hamilton + NY + US + 43.66 + -74.46 + 0 + 0 + ALY + + + NYZ039 + 320390 + Southern_Fulton + NY + US + 43.05 + -74.44 + 0 + 0 + ALY + + + NYZ047 + 320470 + Schoharie + NY + US + 42.59 + -74.44 + 0 + 0 + ALY + + + NYZ082 + 320820 + Northern_Fulton + NY + US + 43.17 + -74.44 + 0 + 0 + ALY + + + NJZ012 + 300120 + Middlesex + NJ + US + 40.42 + -74.43 + 0 + 0 + PHI + + + NYZ040 + 320400 + Montgomery + NY + US + 42.91 + -74.43 + 0 + 0 + ALY + + + NYZ063 + 320630 + Western_Ulster + NY + US + 41.88 + -74.43 + 0 + 0 + ALY + + + NYZ027 + 320270 + Northern_Franklin + NY + US + 44.86 + -74.39 + 0 + 0 + BTV + + + NJZ002 + 300020 + Western_Passaic + NJ + US + 41.09 + -74.36 + 0 + 0 + OKX + + + NYZ067 + 320670 + Orange + NY + US + 41.39 + -74.36 + 0 + 0 + OKX + + + NJZ013 + 300130 + Western_Monmouth + NJ + US + 40.26 + -74.32 + 0 + 0 + PHI + + + NJZ020 + 300200 + Ocean + NJ + US + 39.85 + -74.32 + 0 + 0 + PHI + + + NJZ011 + 300110 + Union + NJ + US + 40.66 + -74.31 + 0 + 0 + OKX + + + NYZ058 + 320580 + Western_Greene + NY + US + 42.26 + -74.28 + 0 + 0 + ALY + + + NJZ026 + 300260 + Coastal_Ocean + NJ + US + 39.64 + -74.26 + 0 + 0 + PHI + + + NYZ030 + 320300 + Southern_Franklin + NY + US + 44.54 + -74.26 + 0 + 0 + BTV + + + NJZ005 + 300050 + Essex + NJ + US + 40.79 + -74.25 + 0 + 0 + OKX + + + NJZ004 + 300040 + Eastern_Passaic + NJ + US + 40.91 + -74.20 + 0 + 0 + OKX + + + NYZ048 + 320480 + Western_Schenectady + NY + US + 42.80 + -74.17 + 0 + 0 + ALY + + + NYZ074 + 320740 + Richmond_(Staten_Is.) + NY + US + 40.58 + -74.15 + 0 + 0 + OKX + + + NYZ051 + 320510 + Western_Albany + NY + US + 42.58 + -74.14 + 0 + 0 + ALY + + + NYZ064 + 320640 + Eastern_Ulster + NY + US + 41.88 + -74.09 + 0 + 0 + ALY + + + NJZ003 + 300030 + Bergen + NJ + US + 40.94 + -74.08 + 0 + 0 + OKX + + + NJZ006 + 300060 + Hudson + NJ + US + 40.74 + -74.07 + 0 + 0 + OKX + + + NYZ069 + 320690 + Rockland + NY + US + 41.16 + -74.07 + 0 + 0 + OKX + + + NJZ014 + 300140 + Eastern_Monmouth + NJ + US + 40.28 + -74.03 + 0 + 0 + PHI + + + NYZ049 + 320490 + Eastern_Schenectady + NY + US + 42.85 + -73.96 + 0 + 0 + ALY + + + NYZ072 + 320720 + New_York_(Manhattan) + NY + US + 40.79 + -73.96 + 0 + 0 + OKX + + + NYZ075 + 320750 + Kings_(Brooklyn) + NY + US + 40.66 + -73.94 + 0 + 0 + OKX + + + NYZ059 + 320590 + Eastern_Greene + NY + US + 42.30 + -73.91 + 0 + 0 + ALY + + + NYZ034 + 320340 + Western_Essex + NY + US + 44.10 + -73.90 + 0 + 0 + BTV + + + NYZ050 + 320500 + Southern_Saratoga + NY + US + 42.94 + -73.88 + 0 + 0 + ALY + + + NYZ041 + 320410 + Northern_Saratoga + NY + US + 43.17 + -73.87 + 0 + 0 + ALY + + + NYZ052 + 320520 + Eastern_Albany + NY + US + 42.62 + -73.86 + 0 + 0 + ALY + + + NYZ065 + 320650 + Western_Dutchess + NY + US + 41.76 + -73.85 + 0 + 0 + ALY + + + NYZ073 + 320730 + Bronx + NY + US + 40.86 + -73.85 + 0 + 0 + OKX + + + NYZ042 + 320420 + Northern_Warren + NY + US + 43.58 + -73.84 + 0 + 0 + ALY + + + NYZ076 + 320760 + Queens + NY + US + 40.68 + -73.83 + 0 + 0 + OKX + + + NYZ031 + 320310 + Western_Clinton + NY + US + 44.71 + -73.79 + 0 + 0 + BTV + + + NYZ071 + 320710 + Southern_Westchester + NY + US + 40.99 + -73.78 + 0 + 0 + OKX + + + NYZ068 + 320680 + Putnam + NY + US + 41.43 + -73.76 + 0 + 0 + OKX + + + NYZ060 + 320600 + Western_Columbia + NY + US + 42.24 + -73.75 + 0 + 0 + ALY + + + NYZ083 + 320830 + Southeast_Warren + NY + US + 43.34 + -73.74 + 0 + 0 + ALY + + + NYZ070 + 320700 + Northern_Westchester + NY + US + 41.18 + -73.73 + 0 + 0 + OKX + + + NYZ053 + 320530 + Western_Rensselaer + NY + US + 42.70 + -73.62 + 0 + 0 + ALY + + + NYZ066 + 320660 + Eastern_Dutchess + NY + US + 41.78 + -73.62 + 0 + 0 + ALY + + + NYZ077 + 320770 + Nassau + NY + US + 40.75 + -73.59 + 0 + 0 + OKX + + + NYZ028 + 320280 + Eastern_Clinton + NY + US + 44.74 + -73.57 + 0 + 0 + BTV + + + NYZ061 + 320610 + Eastern_Columbia + NY + US + 42.24 + -73.52 + 0 + 0 + ALY + + + NYZ043 + 320430 + Northern_Washington + NY + US + 43.56 + -73.44 + 0 + 0 + ALY + + + NYZ084 + 320840 + Southern_Washington + NY + US + 43.18 + -73.44 + 0 + 0 + ALY + + + NYZ035 + 320350 + Eastern_Essex + NY + US + 44.17 + -73.43 + 0 + 0 + BTV + + + NYZ054 + 320540 + Eastern_Rensselaer + NY + US + 42.72 + -73.42 + 0 + 0 + ALY + + + CTZ009 + 70090 + Southern_Fairfield + CT + US + 41.13 + -73.41 + 0 + 0 + OKX + + + CTZ005 + 70050 + Northern_Fairfield + CT + US + 41.41 + -73.31 + 0 + 0 + OKX + + + VTZ001 + 450010 + Grand_Isle + VT + US + 44.78 + -73.29 + 0 + 0 + BTV + + + MAZ025 + 210250 + Southern_Berkshire + MA + US + 42.23 + -73.25 + 0 + 0 + ALY + + + CTZ013 + 70130 + Southern_Litchfield + CT + US + 41.64 + -73.24 + 0 + 0 + ALY + + + VTZ009 + 450090 + Western_Addison + VT + US + 44.02 + -73.23 + 0 + 0 + BTV + + + CTZ001 + 70010 + Northern_Litchfield + CT + US + 41.86 + -73.20 + 0 + 0 + ALY + + + NYZ078 + 320780 + Northwest_Suffolk + NY + US + 40.88 + -73.18 + 0 + 0 + OKX + + + VTZ011 + 450110 + Western_Rutland + VT + US + 43.57 + -73.18 + 0 + 0 + BTV + + + MAZ001 + 210010 + Northern_Berkshire + MA + US + 42.56 + -73.16 + 0 + 0 + ALY + + + NYZ080 + 320800 + Southwest_Suffolk + NY + US + 40.73 + -73.15 + 0 + 0 + OKX + + + VTZ005 + 450050 + Western_Chittenden + VT + US + 44.49 + -73.13 + 0 + 0 + BTV + + + VTZ013 + 450130 + Bennington + VT + US + 43.02 + -73.06 + 0 + 0 + ALY + + + CTZ006 + 70060 + Northern_New_Haven + CT + US + 41.47 + -73.03 + 0 + 0 + OKX + + + VTZ002 + 450020 + Western_Franklin + VT + US + 44.82 + -73.03 + 0 + 0 + BTV + + + VTZ017 + 450170 + Eastern_Chittenden + VT + US + 44.40 + -72.94 + 0 + 0 + BTV + + + VTZ018 + 450180 + Eastern_Addison + VT + US + 44.05 + -72.94 + 0 + 0 + BTV + + + MAZ009 + 210090 + Western_Hampden + MA + US + 42.19 + -72.93 + 0 + 0 + BOX + + + MAZ008 + 210080 + Western_Hampshire + MA + US + 42.39 + -72.87 + 0 + 0 + BOX + + + VTZ019 + 450190 + Eastern_Rutland + VT + US + 43.57 + -72.86 + 0 + 0 + BTV + + + CTZ010 + 70100 + Southern_New_Haven + CT + US + 41.30 + -72.82 + 0 + 0 + OKX + + + MAZ002 + 210020 + Western_Franklin + MA + US + 42.59 + -72.80 + 0 + 0 + BOX + + + VTZ014 + 450140 + Western_Windham + VT + US + 43.00 + -72.78 + 0 + 0 + ALY + + + VTZ016 + 450160 + Eastern_Franklin + VT + US + 44.83 + -72.77 + 0 + 0 + BTV + + + CTZ002 + 70020 + Hartford + CT + US + 41.79 + -72.72 + 0 + 0 + BOX + + + VTZ006 + 450060 + Lamoille + VT + US + 44.60 + -72.65 + 0 + 0 + BTV + + + VTZ012 + 450120 + Windsor + VT + US + 43.59 + -72.59 + 0 + 0 + BTV + + + VTZ008 + 450080 + Washington + VT + US + 44.26 + -72.58 + 0 + 0 + BTV + + + VTZ015 + 450150 + Eastern_Windham + VT + US + 42.98 + -72.57 + 0 + 0 + ALY + + + CTZ007 + 70070 + Northern_Middlesex + CT + US + 41.48 + -72.53 + 0 + 0 + OKX + + + MAZ010 + 210100 + Eastern_Hampshire + MA + US + 42.31 + -72.51 + 0 + 0 + BOX + + + MAZ011 + 210110 + Eastern_Hampden + MA + US + 42.14 + -72.50 + 0 + 0 + BOX + + + CTZ011 + 70110 + Southern_Middlesex + CT + US + 41.33 + -72.46 + 0 + 0 + OKX + + + MAZ003 + 210030 + Eastern_Franklin + MA + US + 42.52 + -72.46 + 0 + 0 + BOX + + + NYZ079 + 320790 + Northeast_Suffolk + NY + US + 41.07 + -72.41 + 0 + 0 + OKX + + + VTZ010 + 450100 + Orange + VT + US + 43.99 + -72.41 + 0 + 0 + BTV + + + NYZ081 + 320810 + Southeast_Suffolk + NY + US + 40.90 + -72.37 + 0 + 0 + OKX + + + CTZ003 + 70030 + Tolland + CT + US + 41.81 + -72.31 + 0 + 0 + BOX + + + NHZ011 + 290110 + Cheshire + NH + US + 42.94 + -72.24 + 0 + 0 + BOX + + + VTZ003 + 450030 + Orleans + VT + US + 44.77 + -72.23 + 0 + 0 + BTV + + + NHZ007 + 290070 + Sullivan + NH + US + 43.36 + -72.20 + 0 + 0 + GYX + + + CTZ008 + 70080 + Northern_New_London + CT + US + 41.53 + -72.13 + 0 + 0 + OKX + + + VTZ007 + 450070 + Caledonia + VT + US + 44.46 + -72.13 + 0 + 0 + BTV + + + CTZ004 + 70040 + Windham + CT + US + 41.83 + -72.02 + 0 + 0 + BOX + + + CTZ012 + 70120 + Southern_New_London + CT + US + 41.36 + -71.96 + 0 + 0 + OKX + + + NHZ005 + 290050 + Southern_Grafton + NH + US + 43.71 + -71.93 + 0 + 0 + GYX + + + MAZ004 + 210040 + Northern_Worcester + MA + US + 42.43 + -71.92 + 0 + 0 + BOX + + + MAZ012 + 210120 + Southern_Worcester + MA + US + 42.18 + -71.81 + 0 + 0 + BOX + + + NHZ015 + 290150 + Wrn_And_Central_Hillsborough + NH + US + 42.95 + -71.78 + 0 + 0 + BOX + + + NHZ003 + 290030 + Northern_Grafton + NH + US + 44.13 + -71.76 + 0 + 0 + GYX + + + VTZ004 + 450040 + Essex + VT + US + 44.68 + -71.74 + 0 + 0 + BTV + + + NHZ008 + 290080 + Merrimack + NH + US + 43.31 + -71.67 + 0 + 0 + GYX + + + RIZ003 + 390030 + Western_Kent + RI + US + 41.66 + -71.66 + 0 + 0 + BOX + + + RIZ006 + 390060 + Washington + RI + US + 41.48 + -71.66 + 0 + 0 + BOX + + + MAZ026 + 210260 + Northwest_Middlesex_County + MA + US + 42.61 + -71.59 + 0 + 0 + BOX + + + RIZ001 + 390010 + Northwest_Providence + RI + US + 41.87 + -71.59 + 0 + 0 + BOX + + + RIZ008 + 390080 + Block_Island + RI + US + 41.19 + -71.57 + 0 + 0 + BOX + + + NHZ012 + 290120 + Eastern_Hillsborough + NH + US + 42.88 + -71.50 + 0 + 0 + BOX + + + RIZ004 + 390040 + Eastern_Kent + RI + US + 41.68 + -71.46 + 0 + 0 + BOX + + + NHZ009 + 290090 + Belknap + NH + US + 43.52 + -71.45 + 0 + 0 + GYX + + + RIZ002 + 390020 + Southeast_Providence + RI + US + 41.81 + -71.45 + 0 + 0 + BOX + + + NHZ002 + 290020 + Southern_Coos + NH + US + 44.41 + -71.39 + 0 + 0 + GYX + + + MAZ005 + 210050 + Central_Middlesex_County + MA + US + 42.44 + -71.33 + 0 + 0 + BOX + + + NHZ001 + 290010 + Northern_Coos + NH + US + 45.02 + -71.33 + 0 + 0 + GYX + + + RIZ005 + 390050 + Bristol + RI + US + 41.71 + -71.27 + 0 + 0 + BOX + + + NHZ006 + 290060 + Southern_Carroll + NH + US + 43.71 + -71.26 + 0 + 0 + GYX + + + RIZ007 + 390070 + Newport + RI + US + 41.56 + -71.26 + 0 + 0 + BOX + + + MAZ013 + 210130 + Western_Norfolk + MA + US + 42.15 + -71.24 + 0 + 0 + BOX + + + NHZ004 + 290040 + Northern_Carroll + NH + US + 44.10 + -71.22 + 0 + 0 + GYX + + + MAZ017 + 210170 + Northern_Bristol + MA + US + 41.93 + -71.18 + 0 + 0 + BOX + + + NHZ013 + 290130 + Interior_Rockingham + NH + US + 43.01 + -71.17 + 0 + 0 + GYX + + + MAZ014 + 210140 + Southeast_Middlesex + MA + US + 42.41 + -71.16 + 0 + 0 + BOX + + + MAZ006 + 210060 + Western_Essex + MA + US + 42.72 + -71.08 + 0 + 0 + BOX + + + MAZ015 + 210150 + Suffolk + MA + US + 42.34 + -71.07 + 0 + 0 + BOX + + + MAZ020 + 210200 + Southern_Bristol + MA + US + 41.65 + -71.07 + 0 + 0 + BOX + + + NHZ010 + 290100 + Strafford + NH + US + 43.33 + -71.03 + 0 + 0 + GYX + + + MAZ016 + 210160 + Eastern_Norfolk + MA + US + 42.22 + -71.02 + 0 + 0 + BOX + + + MAZ018 + 210180 + Western_Plymouth + MA + US + 42.00 + -70.88 + 0 + 0 + BOX + + + MAZ007 + 210070 + Eastern_Essex + MA + US + 42.65 + -70.83 + 0 + 0 + BOX + + + NHZ014 + 290140 + Coastal_Rockingham + NH + US + 42.99 + -70.82 + 0 + 0 + GYX + + + MEZ007 + 190070 + Northern_Oxford + ME + US + 44.88 + -70.80 + 0 + 0 + GYX + + + MAZ021 + 210210 + Southern_Plymouth + MA + US + 41.72 + -70.77 + 0 + 0 + BOX + + + MAZ019 + 210190 + Eastern_Plymouth + MA + US + 42.03 + -70.73 + 0 + 0 + BOX + + + MEZ018 + 190180 + Interior_York + ME + US + 43.52 + -70.73 + 0 + 0 + GYX + + + MAZ023 + 210230 + Dukes + MA + US + 41.38 + -70.70 + 0 + 0 + BOX + + + MEZ012 + 190120 + Southern_Oxford + ME + US + 44.20 + -70.63 + 0 + 0 + GYX + + + MEZ023 + 190230 + Coastal_York + ME + US + 43.34 + -70.58 + 0 + 0 + GYX + + + MEZ019 + 190190 + Interior_Cumberland + ME + US + 43.91 + -70.49 + 0 + 0 + GYX + + + MEZ008 + 190080 + Northern_Franklin + ME + US + 45.14 + -70.48 + 0 + 0 + GYX + + + MEZ024 + 190240 + Coastal_Cumberland + ME + US + 43.75 + -70.26 + 0 + 0 + GYX + + + MEZ020 + 190200 + Androscoggin + ME + US + 44.20 + -70.24 + 0 + 0 + GYX + + + MEZ013 + 190130 + Southern_Franklin + ME + US + 44.67 + -70.23 + 0 + 0 + GYX + + + MEZ009 + 190090 + Central_Somerset + ME + US + 45.42 + -70.10 + 0 + 0 + GYX + + + MEZ003 + 190030 + Northern_Somerset + ME + US + 46.27 + -70.01 + 0 + 0 + CAR + + + MAZ024 + 210240 + Nantucket + MA + US + 41.31 + -70.00 + 0 + 0 + BOX + + + MAZ022 + 210220 + Barnstable + MA + US + 41.80 + -69.99 + 0 + 0 + BOX + + + MEZ025 + 190250 + Sagadahoc + ME + US + 43.94 + -69.89 + 0 + 0 + GYX + + + MEZ021 + 190210 + Kennebec + ME + US + 44.42 + -69.75 + 0 + 0 + GYX + + + MEZ014 + 190140 + Southern_Somerset + ME + US + 44.85 + -69.67 + 0 + 0 + GYX + + + MEZ026 + 190260 + Lincoln + ME + US + 44.05 + -69.54 + 0 + 0 + GYX + + + MEZ010 + 190100 + Central_Piscataquis + ME + US + 45.55 + -69.38 + 0 + 0 + CAR + + + MEZ004 + 190040 + Northern_Piscataquis + ME + US + 46.12 + -69.27 + 0 + 0 + CAR + + + MEZ027 + 190270 + Knox + ME + US + 44.14 + -69.23 + 0 + 0 + GYX + + + MEZ031 + 190310 + Southern_Piscataquis + ME + US + 45.27 + -69.22 + 0 + 0 + CAR + + + MEZ022 + 190220 + Interior_Waldo + ME + US + 44.53 + -69.16 + 0 + 0 + GYX + + + MEZ001 + 190010 + Northwest_Aroostook + ME + US + 47.01 + -69.06 + 0 + 0 + CAR + + + MEZ028 + 190280 + Coastal_Waldo + ME + US + 44.36 + -69.04 + 0 + 0 + GYX + + + MEZ015 + 190150 + Southern_Penobscot + ME + US + 44.93 + -68.81 + 0 + 0 + CAR + + + MEZ005 + 190050 + Northern_Penobscot + ME + US + 45.95 + -68.69 + 0 + 0 + CAR + + + MEZ011 + 190110 + Central_Penobscot + ME + US + 45.39 + -68.41 + 0 + 0 + CAR + + + MEZ016 + 190160 + Interior_Hancock + ME + US + 44.88 + -68.41 + 0 + 0 + CAR + + + MEZ029 + 190290 + Coastal_Hancock + ME + US + 44.45 + -68.39 + 0 + 0 + CAR + + + MEZ002 + 190020 + Northeast_Aroostook + ME + US + 46.83 + -68.30 + 0 + 0 + CAR + + + MEZ006 + 190060 + Southeast_Aroostook + ME + US + 45.97 + -68.09 + 0 + 0 + CAR + + + MEZ032 + 190320 + Northern_Washington + ME + US + 45.48 + -67.73 + 0 + 0 + CAR + + + MEZ017 + 190170 + Central_Washington + ME + US + 45.00 + -67.57 + 0 + 0 + CAR + + + MEZ030 + 190300 + Coastal_Washington + ME + US + 44.67 + -67.49 + 0 + 0 + CAR + + + PRZ010 + 530100 + Mayaguez_and_Vicinity + PR + US + 18.26 + -67.12 + 0 + 0 + SJU + + + PRZ011 + 530110 + Southwest + PR + US + 18.05 + -67.04 + 0 + 0 + SJU + + + PRZ008 + 530080 + Northwest + PR + US + 18.42 + -66.97 + 0 + 0 + SJU + + + PRZ009 + 530090 + Western_Interior + PR + US + 18.21 + -66.82 + 0 + 0 + SJU + + + PRZ007 + 530070 + Ponce_and_Vicinity + PR + US + 18.03 + -66.63 + 0 + 0 + SJU + + + PRZ005 + 530050 + North_Central + PR + US + 18.40 + -66.48 + 0 + 0 + SJU + + + PRZ006 + 530060 + Central_Interior + PR + US + 18.20 + -66.43 + 0 + 0 + SJU + + + PRZ001 + 530010 + San_Juan_and_Vicinity + PR + US + 18.37 + -66.11 + 0 + 0 + SJU + + + PRZ003 + 530030 + Southeast + PR + US + 18.02 + -66.07 + 0 + 0 + SJU + + + PRZ004 + 530040 + Eastern_Interior + PR + US + 18.17 + -66.04 + 0 + 0 + SJU + + + PRZ002 + 530020 + Northeast + PR + US + 18.26 + -65.76 + 0 + 0 + SJU + + + PRZ013 + 530130 + Vieques + PR + US + 18.13 + -65.42 + 0 + 0 + SJU + + + PRZ012 + 530120 + Culebra + PR + US + 18.32 + -65.31 + 0 + 0 + SJU + + + VIZ001 + 520010 + St._Thomas...St._John..._and_Adj + VI + US + 18.34 + -64.87 + 0 + 0 + SJU + + + VIZ002 + 520020 + St_Croix + VI + US + 17.73 + -64.73 + 0 + 0 + SJU + + + CAZ000 + 50000 + No_name + CA + US + 32.92 + -118.48 + 0 + 0 + + + + GUZ012 + 540120 + Sonsorol + GU + US + 5.30 + 132.22 + 0 + 0 + GUM + + + GUZ011 + 540110 + Koror + GU + US + 7.53 + 134.56 + 0 + 0 + GUM + + + GUZ013 + 540130 + Kayangel + GU + US + 8.08 + 134.72 + 0 + 0 + GUM + + + GUZ022 + 540220 + Ngulu + GU + US + 8.30 + 137.51 + 0 + 0 + GUM + + + GUZ021 + 540210 + Yap + GU + US + 9.54 + 138.12 + 0 + 0 + GUM + + + GUZ023 + 540230 + Ulithi + GU + US + 10.02 + 139.79 + 0 + 0 + GUM + + + GUZ024 + 540240 + Sorol + GU + US + 8.21 + 140.70 + 0 + 0 + GUM + + + GUZ025 + 540250 + Woleai + GU + US + 7.38 + 143.92 + 0 + 0 + GUM + + + GUZ001 + 540010 + Guam + GU + US + 13.44 + 144.79 + 0 + 0 + GUM + + + GUZ002 + 540020 + Rota + GU + US + 14.15 + 145.20 + 0 + 0 + GUM + + + GUZ003 + 540030 + Tinian + GU + US + 15.01 + 145.63 + 0 + 0 + GUM + + + GUZ005 + 540050 + Agrihan + GU + US + 18.76 + 145.66 + 0 + 0 + GUM + + + GUZ004 + 540040 + Saipan + GU + US + 15.19 + 145.76 + 0 + 0 + GUM + + + GUZ026 + 540260 + Satawal + GU + US + 7.36 + 147.04 + 0 + 0 + GUM + + + GUZ032 + 540320 + Puluwat + GU + US + 7.38 + 149.18 + 0 + 0 + GUM + + + GUZ031 + 540310 + Chuuk + GU + US + 7.35 + 151.83 + 0 + 0 + GUM + + + GUZ033 + 540330 + Lukunor + GU + US + 5.50 + 153.82 + 0 + 0 + GUM + + + GUZ041 + 540410 + Pohnpei + GU + US + 6.88 + 158.22 + 0 + 0 + GUM + + + GUZ042 + 540420 + Mokil + GU + US + 6.68 + 159.79 + 0 + 0 + GUM + + + GUZ043 + 540430 + Pingelap + GU + US + 6.21 + 160.71 + 0 + 0 + GUM + + + GUZ062 + 540620 + Ujelang + GU + US + 9.76 + 160.97 + 0 + 0 + GUM + + + GUZ063 + 540630 + Enewetak + GU + US + 11.34 + 162.33 + 0 + 0 + GUM + + + GUZ051 + 540510 + Kosrae + GU + US + 5.32 + 162.97 + 0 + 0 + GUM + + + GUZ081 + 540810 + Wake_Island + GU + US + 19.30 + 166.63 + 0 + 0 + GUM + + + GUZ064 + 540640 + Ailinglaplap + GU + US + 7.29 + 168.75 + 0 + 0 + GUM + + + GUZ065 + 540650 + Jaluit + GU + US + 5.85 + 169.53 + 0 + 0 + GUM + + + GUZ066 + 540660 + Utirik + GU + US + 11.24 + 169.86 + 0 + 0 + GUM + + + GUZ067 + 540670 + Wotje + GU + US + 9.55 + 170.24 + 0 + 0 + GUM + + + GUZ061 + 540610 + Majuro + GU + US + 7.11 + 171.08 + 0 + 0 + GUM + + + GUZ068 + 540680 + Mili + GU + US + 6.04 + 171.95 + 0 + 0 + GUM + + + AKZ191 + 21910 + Western_Aleutians + AK + US + 51.51 + 179.05 + 0 + 0 + AFC + + + PKZ175 + 691750 + Adak_to_Kiska + + US + 51.71 + -178.59 + 0 + 0 + AFC + + + PKZ185 + 691850 + St_Matthew_Island_Waters + + US + 60.43 + -174.18 + 0 + 0 + AFC + + + PKZ172 + 691720 + Nikolski_to_Adak + + US + 52.26 + -173.19 + 0 + 0 + AFC + + + PSZ152 + 721520 + Coastal_waters_of_Swain's_I + + US + -11.08 + -171.03 + 0 + 0 + STU + + + PSZ150 + 721500 + Cstal_wtrs_of_Tututila_and_Aunuu + + US + -14.31 + -170.77 + 0 + 0 + STU + + + PKZ179 + 691790 + Pribilof_Is_Nearshore_Waters + + US + 56.90 + -169.97 + 0 + 0 + AFC + + + PKZ210 + 692100 + Dall_Point_to_Wales + + US + 63.31 + -169.57 + 0 + 0 + AFG + + + PSZ151 + 721510 + Coastal_waters_of_Manua + + US + -14.21 + -169.45 + 0 + 0 + STU + + + PKZ225 + 692250 + Cape_Thompson_to_Cape_Beaufort + + US + 69.01 + -167.45 + 0 + 0 + AFG + + + PKZ170 + 691700 + Cape_Sarichef_to_Nikoski + + US + 53.72 + -166.78 + 0 + 0 + AFC + + + PKZ220 + 692200 + Wales_to_Cape_Thompson + + US + 66.97 + -166.69 + 0 + 0 + AFG + + + PKZ171 + 691710 + Unalaska_Bay + + US + 53.92 + -166.59 + 0 + 0 + AFC + + + PKZ180 + 691800 + Cape_Newenham_to_Dall_Point + + US + 59.92 + -165.98 + 0 + 0 + AFC + + + PKZ200 + 692000 + Norton_Sound + + US + 63.99 + -163.30 + 0 + 0 + AFG + + + PKZ230 + 692300 + Cape_Beaufort_to_Point_Franklin + + US + 70.53 + -163.03 + 0 + 0 + AFG + + + PKZ165 + 691650 + Port_Heiden_to_Cape_Sarichef + + US + 56.01 + -162.88 + 0 + 0 + AFC + + + PKZ215 + 692150 + Kotzebue_Sound + + US + 66.65 + -162.83 + 0 + 0 + AFG + + + PKZ155 + 691550 + Castle_Cape_to_Cape_Sarichef + + US + 54.50 + -160.72 + 0 + 0 + AFC + + + PKZ160 + 691600 + Cape_Newenham_to_Port_Heiden + + US + 57.98 + -160.52 + 0 + 0 + AFC + + + PHZ110 + 701100 + Kauai_Northwest_Waters + + US + 22.44 + -159.99 + 0 + 0 + HFO + + + PHZ112 + 701120 + Kauai_Leeward_Waters + + US + 21.64 + -159.99 + 0 + 0 + HFO + + + PHZ111 + 701110 + Kauai_Windward_Waters + + US + 22.41 + -159.03 + 0 + 0 + HFO + + + PHZ113 + 701130 + Kauai_Channel + + US + 21.62 + -159.00 + 0 + 0 + HFO + + + PHZ115 + 701150 + Oahu_Leeward_Waters + + US + 21.04 + -158.18 + 0 + 0 + HFO + + + PHZ114 + 701140 + Oahu_Windward_Waters + + US + 21.88 + -157.59 + 0 + 0 + HFO + + + PHZ116 + 701160 + Kaiwi_Channel + + US + 21.22 + -157.49 + 0 + 0 + HFO + + + PHZ118 + 701180 + Maui_County_Leeward_Waters + + US + 20.70 + -157.49 + 0 + 0 + HFO + + + PHZ120 + 701200 + Pailolo_Channel + + US + 21.03 + -156.91 + 0 + 0 + HFO + + + PHZ119 + 701190 + Maalaea_Bay + + US + 20.75 + -156.53 + 0 + 0 + HFO + + + PHZ121 + 701210 + Alenuihaha_Channel + + US + 20.30 + -156.44 + 0 + 0 + HFO + + + PHZ123 + 701230 + Big_Island_Leeward_Waters + + US + 19.34 + -156.40 + 0 + 0 + HFO + + + PHZ117 + 701170 + Maui_County_Windward_Waters + + US + 21.32 + -156.39 + 0 + 0 + HFO + + + PKZ235 + 692350 + Point_Franklin_to_Cape_Halkett + + US + 71.66 + -156.01 + 0 + 0 + AFG + + + PKZ150 + 691500 + Sitkinak_to_Castle_Cape + + US + 55.91 + -155.76 + 0 + 0 + AFC + + + PHZ124 + 701240 + Big_Island_Southeast_Waters + + US + 18.71 + -155.37 + 0 + 0 + HFO + + + PHZ122 + 701220 + Big_Island_Windward_Waters + + US + 19.92 + -154.97 + 0 + 0 + HFO + + + PKZ138 + 691380 + _Shelikof_Strait + + US + 57.83 + -153.52 + 0 + 0 + AFC + + + PKZ137 + 691370 + _Marmot_Bay + + US + 58.00 + -152.62 + 0 + 0 + AFC + + + PKZ136 + 691360 + _Chiniak_Bay + + US + 57.70 + -152.37 + 0 + 0 + AFC + + + PKZ132 + 691320 + Shuyak_Island_To_Sitkinak + + US + 56.92 + -152.20 + 0 + 0 + AFC + + + PKZ140 + 691400 + Cook_Inlt_N_of_Kamishak_Bay_and_ + + US + 60.34 + -151.89 + 0 + 0 + AFC + + + PKZ141 + 691410 + Kachemak_Bay + + US + 59.56 + -151.45 + 0 + 0 + AFC + + + PKZ130 + 691300 + Barren_Is_And_Kamishak_Bay_Wtrs + + US + 58.64 + -151.33 + 0 + 0 + AFC + + + PKZ121 + 691210 + _Resurrection_Bay + + US + 60.06 + -149.39 + 0 + 0 + AFC + + + PKZ240 + 692400 + Cape_Halkett_to_Flaxman_Island + + US + 71.09 + -149.19 + 0 + 0 + AFG + + + PKZ129 + 691290 + Passage_Canal + + US + 60.81 + -148.58 + 0 + 0 + AFC + + + PKZ125 + 691250 + Prince_William_Sound + + US + 60.48 + -147.34 + 0 + 0 + AFC + + + PKZ120 + 691200 + Cape_Suckling_to_Gore_Point + + US + 59.42 + -147.01 + 0 + 0 + AFC + + + PKZ128 + 691280 + _Valdez_Arm + + US + 60.94 + -146.86 + 0 + 0 + AFC + + + PKZ127 + 691270 + _Valdez_Narrows + + US + 61.05 + -146.67 + 0 + 0 + AFC + + + PKZ126 + 691260 + _Port_of_Valdez + + US + 61.11 + -146.44 + 0 + 0 + AFC + + + PKZ245 + 692450 + Flaxman_I_to_Demarcation_Point + + US + 70.60 + -143.39 + 0 + 0 + AFG + + + PKZ052 + 690520 + Icy_Cape_to_Cape_Suckling + + US + 59.40 + -142.97 + 0 + 0 + AJK + + + PKZ051 + 690510 + Cape_Fairweather_to_Icy_Cape + + US + 58.95 + -140.30 + 0 + 0 + AJK + + + PKZ053 + 690530 + Yakutat_Bay + + US + 59.80 + -139.76 + 0 + 0 + AJK + + + PKZ043 + 690430 + SE_AK_Outside_Wtrs_From_C_Edgecu + + US + 57.59 + -137.69 + 0 + 0 + AJK + + + PKZ022 + 690220 + Cross_Sound + + US + 58.14 + -136.36 + 0 + 0 + AJK + + + PKZ011 + 690110 + _Glacier_Bay + + US + 58.72 + -136.23 + 0 + 0 + AJK + + + PKZ042 + 690420 + Cape_Decision_to_Cape_Edgecumbe + + US + 56.23 + -136.12 + 0 + 0 + AJK + + + PKZ021 + 690210 + Icy_Strait + + US + 58.27 + -135.73 + 0 + 0 + AJK + + + PKZ012 + 690120 + Northern_Lynn_Canal + + US + 59.10 + -135.30 + 0 + 0 + AJK + + + PKZ013 + 690130 + Southern_Lynn_Canal + + US + 58.59 + -135.07 + 0 + 0 + AJK + + + PKZ032 + 690320 + Northern_Chatham_Strait + + US + 57.61 + -134.77 + 0 + 0 + AJK + + + PKZ033 + 690330 + Southern_Chatham_Strait + + US + 56.54 + -134.55 + 0 + 0 + AJK + + + PKZ041 + 690410 + Dixon_Entrance_to_Cape_Decision + + US + 55.04 + -134.31 + 0 + 0 + AJK + + + PKZ031 + 690310 + Stephens_Passage + + US + 57.94 + -134.29 + 0 + 0 + AJK + + + PKZ034 + 690340 + Frederick_Sound + + US + 56.99 + -134.28 + 0 + 0 + AJK + + + PKZ035 + 690350 + Sumner_Strait + + US + 56.40 + -133.28 + 0 + 0 + AJK + + + PKZ036 + 690360 + Clarence_Strait + + US + 55.40 + -131.52 + 0 + 0 + AJK + + + PZZ170 + 611700 + Cstal_Wtrs_From_C_Flattery_To_Ja + + US + 48.22 + -125.73 + 0 + 0 + SEW + + + PZZ173 + 611730 + Wtrs_From_James_I_To_Pt_Grenvl_2 + + US + 47.57 + -125.40 + 0 + 0 + SEW + + + PZZ376 + 613760 + Wtrs_fr_C_Blanco_OR_to_Pt._St._G + + US + 42.33 + -125.39 + 0 + 0 + MFR + + + PZZ370 + 613700 + Wtrs_fr_Florence_to_C_Blanco_OR_ + + US + 43.40 + -125.19 + 0 + 0 + MFR + + + PZZ275 + 612750 + Wtrs_fr_Cascade_Hd_to_Florence_O + + US + 44.59 + -125.15 + 0 + 0 + PQR + + + PZZ470 + 614700 + Wtrs_fr_Pt._St._Geo_to_C_Mendoci + + US + 41.14 + -125.08 + 0 + 0 + EKA + + + PZZ176 + 611760 + Cstal_Wtrs_From_Pt_Grenvl_To_C_S + + US + 46.97 + -125.06 + 0 + 0 + SEW + + + PZZ153 + 611530 + Cstal_Wtrs_From_James_I_To_Pt_Gr + + US + 47.74 + -124.99 + 0 + 0 + SEW + + + PZZ270 + 612700 + Wtrs_fr_C_Shoalwtr_WA_to_Cascade + + US + 45.92 + -124.99 + 0 + 0 + PQR + + + PZZ150 + 611500 + Cstal_Wtrs_From_C_Flattery_To_Ja + + US + 48.17 + -124.89 + 0 + 0 + SEW + + + PZZ475 + 614750 + Wtrs_fr_C_Mendocino_to_Pt._Arena + + US + 39.69 + -124.74 + 0 + 0 + EKA + + + PZZ350 + 613500 + Cstal_wtrs_fr_Florence_to_C_Blan + + US + 43.47 + -124.68 + 0 + 0 + MFR + + + PZZ330 + 613300 + Chetco_River_Bar + + US + 42.31 + -124.60 + 0 + 0 + MFR + + + PZZ130 + 611300 + W_Entr_U.S._Wtrs_St_Of_Juan_De_F + + US + 48.37 + -124.48 + 0 + 0 + SEW + + + PZZ310 + 613100 + Coos_Bay_Bar + + US + 43.43 + -124.47 + 0 + 0 + MFR + + + PZZ156 + 611560 + Cstal_Wtrs_From_Pt_Grenvl_To_C_S + + US + 47.02 + -124.44 + 0 + 0 + SEW + + + PZZ356 + 613560 + Cstal_wtrs_fr_C_Blanco_OR_to_Pt. + + US + 42.24 + -124.43 + 0 + 0 + MFR + + + PZZ450 + 614500 + Cstal_wtrs_fr_Pt._St._Geo_to_C_M + + US + 41.11 + -124.33 + 0 + 0 + EKA + + + PZZ250 + 612500 + Cstal_wtrs_fr_C_Shoalwtr_WA_to_C + + US + 45.93 + -124.20 + 0 + 0 + PQR + + + PZZ410 + 614100 + Humboldt_Bay_Bar + + US + 40.77 + -124.19 + 0 + 0 + EKA + + + PZZ255 + 612550 + Cstal_wtrs_fr_Cascade_Hd_to_Flor + + US + 44.47 + -124.10 + 0 + 0 + PQR + + + PZZ110 + 611100 + Grays_Harbor_Bar + + US + 46.93 + -123.99 + 0 + 0 + SEW + + + PZZ570 + 615700 + Wtrs_fr_Pt._Arena_to_Pigeon_Pt._ + + US + 38.08 + -123.99 + 0 + 0 + MTR + + + PZZ455 + 614550 + Cstal_wtrs_fr_C_Mendocino_to_Pt. + + US + 39.69 + -123.91 + 0 + 0 + EKA + + + PZZ131 + 611310 + Ctrl_U.S._Wtrs_St_Of_Juan_De_Fuc + + US + 48.27 + -123.68 + 0 + 0 + SEW + + + PZZ210 + 612100 + Columbia_River_Bar + + US + 46.21 + -123.68 + 0 + 0 + PQR + + + PZZ540 + 615400 + Cstal_Wtrs_fr_Pt_Arena_to_Pt_Rey + + US + 38.48 + -123.53 + 0 + 0 + MTR + + + PZZ132 + 611320 + E_Entr_U.S._Wtrs_St_Of_Juan_De_F + + US + 48.21 + -122.96 + 0 + 0 + SEW + + + PZZ133 + 611330 + Nrn_Inlnd_Wtrs_Incl_The_Sn_Juan_ + + US + 48.58 + -122.78 + 0 + 0 + SEW + + + PZZ575 + 615750 + Wtrs_fr_Pigeon_Pt._to_Pt._Piedra + + US + 36.41 + -122.76 + 0 + 0 + MTR + + + PZZ545 + 615450 + Cstal_Wtrs_fr_Pt_Reyes_to_Pigeon + + US + 37.58 + -122.72 + 0 + 0 + MTR + + + PZZ134 + 611340 + Admiralty_Inlet + + US + 48.06 + -122.68 + 0 + 0 + SEW + + + PZZ560 + 615600 + Cstal_Wtrs_fr_Pigeon_Pt_to_Pt_Pi + + US + 36.99 + -122.59 + 0 + 0 + MTR + + + PZZ135 + 611350 + Puget_Sound_and_Hood_Canal + + US + 47.56 + -122.47 + 0 + 0 + SEW + + + PZZ530 + 615300 + Sn_Francisco/Sn_Pablo/Suisun_Bay + + US + 37.83 + -122.39 + 0 + 0 + MTR + + + PZZ535 + 615350 + Monterey_Bay + + US + 36.79 + -121.89 + 0 + 0 + MTR + + + PZZ565 + 615650 + Cstal_Wtrs_fr_Pt_Pinos_to_Pt_Pie + + US + 36.11 + -121.84 + 0 + 0 + MTR + + + PZZ670 + 616700 + The_Wtrs_fr_Pt._Piedras_Blancas_ + + US + 35.14 + -121.55 + 0 + 0 + LOX + + + PZZ673 + 616730 + Wtrs_fr_Pt._Arguello_to_Sta_Cruz + + US + 34.18 + -120.98 + 0 + 0 + LOX + + + PZZ650 + 616500 + E_Sta_Barbara_Chnl_fr_Pt._Concep + + US + 34.28 + -119.87 + 0 + 0 + LOX + + + PZZ676 + 616760 + Out_wtrs_fr_Sta_Cruz_I_to_Sn_Cle + + US + 33.54 + -119.79 + 0 + 0 + LOX + + + PZZ655 + 616550 + Inr_wtrs_fr_Pt_Mugu_to_Sn_Mateo_ + + US + 33.59 + -118.55 + 0 + 0 + LOX + + + PZZ775 + 617750 + Wtrs_fr_Sn_Mateo_point_to_the_Me + + US + 32.83 + -118.20 + 0 + 0 + SGX + + + PZZ750 + 617500 + Cstal_Wtrs_fr_Sn_Mateo_Pt_to_the + + US + 32.92 + -117.55 + 0 + 0 + SGX + + + GMZ135 + 681350 + Laguna_Madre_From_5_nm_N_Of_Port + + US + 26.93 + -97.44 + 0 + 0 + BRO + + + GMZ132 + 681320 + Laguna_Madre_From_The_Arroyo_Col + + US + 26.49 + -97.37 + 0 + 0 + BRO + + + GMZ230 + 682300 + Bays_and_Wtrways_fr_Baffin_Bay_t + + US + 27.54 + -97.31 + 0 + 0 + CRP + + + GMZ130 + 681300 + Laguna_Madre_From_the_Port_Of_Br + + US + 26.19 + -97.30 + 0 + 0 + BRO + + + GMZ155 + 681550 + Cstal_wtrs_fr_Baffin_Bay_to_Port + + US + 26.92 + -97.23 + 0 + 0 + BRO + + + GMZ250 + 682500 + Cstal_wtrs_fr_Baffin_Bay_to_Port + + US + 27.52 + -97.10 + 0 + 0 + CRP + + + GMZ150 + 681500 + Cstal_wtrs_fr_Port_Mansfield_TX_ + + US + 26.28 + -97.04 + 0 + 0 + BRO + + + GMZ235 + 682350 + Bays_and_Wtrways_fr_Port_Aransas + + US + 28.16 + -96.82 + 0 + 0 + CRP + + + GMZ175 + 681750 + Wtrs_fr_Baffin_Bay_to_Port_Mansf + + US + 26.87 + -96.68 + 0 + 0 + BRO + + + GMZ255 + 682550 + Cstal_wtrs_fr_Port_Aransas_to_Ma + + US + 28.06 + -96.66 + 0 + 0 + CRP + + + GMZ270 + 682700 + Wtrs_fr_Baffin_Bay_to_Port_Arans + + US + 27.35 + -96.51 + 0 + 0 + CRP + + + GMZ170 + 681700 + Wtrs_fr_Port_Mansfield_TX_to_the + + US + 26.26 + -96.50 + 0 + 0 + BRO + + + GMZ330 + 683300 + Matagorda_Bay + + US + 28.60 + -96.32 + 0 + 0 + HGX + + + GMZ275 + 682750 + Wtrs_fr_Port_Aransas_to_Matagord + + US + 27.74 + -96.12 + 0 + 0 + CRP + + + GMZ350 + 683500 + Cstal_wtrs_fr_Freeport_to_Matago + + US + 28.52 + -95.70 + 0 + 0 + HGX + + + GMZ370 + 683700 + Wtrs_fr_Freeport_to_Matagorda_Sh + + US + 28.13 + -95.38 + 0 + 0 + HGX + + + GMZ335 + 683350 + Galveston_Bay + + US + 29.41 + -94.87 + 0 + 0 + HGX + + + GMZ355 + 683550 + Cstal_wtrs_fr_Hi_I_to_Freeport_T + + US + 29.10 + -94.78 + 0 + 0 + HGX + + + GMZ375 + 683750 + Wtrs_fr_Hi_I_to_Freeport_TX_fr_2 + + US + 28.66 + -94.60 + 0 + 0 + HGX + + + GMZ450 + 684500 + Cstal_wtrs_fr_Cameron_LA_to_Hi_I + + US + 29.58 + -93.95 + 0 + 0 + LCH + + + GMZ430 + 684300 + Sabine_Lake + + US + 29.62 + -93.85 + 0 + 0 + LCH + + + GMZ470 + 684700 + Wtrs_fr_Cameron_LA_to_Hi_I_TX_fr + + US + 29.07 + -93.82 + 0 + 0 + LCH + + + GMZ432 + 684320 + Calcasieu_Lake + + US + 29.92 + -93.31 + 0 + 0 + LCH + + + GMZ452 + 684520 + Cstal_wtrs_fr_Intracoastal_Cty_t + + US + 29.48 + -92.72 + 0 + 0 + LCH + + + GMZ472 + 684720 + Wtrs_fr__Intracoastal_Cty_to_Cam + + US + 28.95 + -92.68 + 0 + 0 + LCH + + + LSZ145 + 651450 + Duluth_MN_to_Port_Wing_WI + + US + 46.76 + -91.84 + 0 + 0 + DLH + + + LSZ144 + 651440 + Two_Harbors_to_Duluth_MN + + US + 46.89 + -91.82 + 0 + 0 + DLH + + + GMZ475 + 684750 + Wtrs_fr_Lwr_Atchafalaya_Riv_to_I + + US + 28.70 + -91.72 + 0 + 0 + LCH + + + GMZ435 + 684350 + Vermillion_Bay + + US + 29.38 + -91.70 + 0 + 0 + LCH + + + GMZ455 + 684550 + Cstal_wtrs_fr_Lwr_Atchafalaya_Ri + + US + 29.32 + -91.69 + 0 + 0 + LCH + + + LSZ143 + 651430 + Silver_Bay_Hbr_to_2_Hbrs_MN + + US + 47.13 + -91.40 + 0 + 0 + DLH + + + LSZ146 + 651460 + Port_Wing_to_Sand_Island_WI + + US + 46.91 + -91.19 + 0 + 0 + DLH + + + LSZ142 + 651420 + Taconite_Hbr_to_Silver_Bay_Hbr_M + + US + 47.38 + -91.05 + 0 + 0 + DLH + + + LSZ121 + 651210 + Chequamegon_Bay-Bayfield_to_Oak_ + + US + 46.69 + -90.81 + 0 + 0 + DLH + + + LSZ147 + 651470 + Sand_Island_to_Bayfield_WI + + US + 46.91 + -90.71 + 0 + 0 + DLH + + + LSZ148 + 651480 + Oak_Point_to_Saxon_Harbor_WI + + US + 46.67 + -90.59 + 0 + 0 + DLH + + + LSZ141 + 651410 + Grand_Marais_to_Taconite_Hbr_MN + + US + 47.58 + -90.57 + 0 + 0 + DLH + + + LSZ162 + 651620 + L_Sup_W_of_a_line_fr_Saxon_Hbr_W + + US + 47.28 + -90.56 + 0 + 0 + DLH + + + LSZ240 + 652400 + Saxon_Harbor_WI_to_Black_Riv_MI + + US + 46.66 + -90.24 + 0 + 0 + MQT + + + GMZ550 + 685500 + Cstal_wtrs_fr_the_SW_pass_of_the + + US + 29.00 + -90.19 + 0 + 0 + LIX + + + GMZ570 + 685700 + Wtrs_fr_the_SW_Pass_of_the_MS_Ri + + US + 28.39 + -90.18 + 0 + 0 + LIX + + + GMZ530 + 685300 + L_Pontchartrain_and_L_Maurepas + + US + 30.17 + -90.10 + 0 + 0 + LIX + + + LSZ241 + 652410 + Black_River_To_Ontonagon_MI + + US + 46.81 + -89.91 + 0 + 0 + MQT + + + LSZ140 + 651400 + Gnd_Portage_to_Gnd_Marais_MN + + US + 47.84 + -89.85 + 0 + 0 + DLH + + + LSZ263 + 652630 + L_Sup_fr_Saxon_Hbr_WI_to_Upr_Ent + + US + 47.45 + -89.29 + 0 + 0 + MQT + + + GMZ555 + 685550 + Cstal_wtrs_fr_Pascagoula_MS_to_t + + US + 29.72 + -89.09 + 0 + 0 + LIX + + + LSZ242 + 652420 + Ontonagon_to_Upr_Entr_of_Portage + + US + 47.10 + -88.96 + 0 + 0 + MQT + + + GMZ575 + 685750 + Wtrs_fr_Pascagoula_MS_to_the_SW_ + + US + 28.86 + -88.56 + 0 + 0 + LIX + + + LSZ243 + 652430 + Upr_Entr_of_Portage_Canal_to_Eag + + US + 47.37 + -88.47 + 0 + 0 + MQT + + + LSZ247 + 652470 + Portage_L_to_Huron_I_MI_to_Lwr_E + + US + 46.90 + -88.37 + 0 + 0 + MQT + + + LSZ246 + 652460 + Pt_Isabelle_to_Lwr_Entr_of_Porta + + US + 47.15 + -88.22 + 0 + 0 + MQT + + + LSZ264 + 652640 + L_Sup_fr_Upr_Entr_to_Portage_Can + + US + 47.83 + -88.08 + 0 + 0 + MQT + + + GMZ650 + 686500 + Cstal_wtrs_fr_Pensacola_FL_to_Pa + + US + 30.19 + -88.01 + 0 + 0 + MOB + + + LSZ244 + 652440 + Eagle_River_to_Manitou_I_MI + + US + 47.49 + -87.95 + 0 + 0 + MQT + + + GMZ630 + 686300 + Mobile_Bay + + US + 30.53 + -87.93 + 0 + 0 + MOB + + + LMZ644 + 646440 + Port_Washington_to_N_Pt_Lt_WI + + US + 43.24 + -87.87 + 0 + 0 + MKX + + + LMZ522 + 645220 + Grn_Bay_S_of_line_fr__Oconto_WI_ + + US + 44.71 + -87.79 + 0 + 0 + GRB + + + LMZ645 + 646450 + N_Point_Light_to_Wind_Point_WI + + US + 42.93 + -87.77 + 0 + 0 + MKX + + + LMZ740 + 647400 + Winthrop_Hbr_to_Wilmette_Hbr_IL + + US + 42.28 + -87.77 + 0 + 0 + LOT + + + LSZ265 + 652650 + L_Sup_W_of_Line_fr_Manitou_I_to_ + + US + 47.00 + -87.73 + 0 + 0 + MQT + + + LMZ643 + 646430 + Sheboygan_to_Port_Washington_WI + + US + 43.55 + -87.72 + 0 + 0 + MKX + + + LMZ646 + 646460 + Wind_Pt_WI_to_Winthrop_Hbr_IL + + US + 42.64 + -87.72 + 0 + 0 + MKX + + + LSZ245 + 652450 + Manitou_I_to_Point_Isabelle_MI + + US + 47.32 + -87.71 + 0 + 0 + MQT + + + GMZ670 + 686700 + Wtrs_fr_Pensacola_FL_to_Pascagou + + US + 29.60 + -87.65 + 0 + 0 + MOB + + + LMZ543 + 645430 + Two_Rivers_to_Sheboygan_WI + + US + 43.95 + -87.64 + 0 + 0 + GRB + + + LMZ742 + 647420 + Nerly_I_to_Calumet_Harbor_IL + + US + 41.84 + -87.60 + 0 + 0 + LOT + + + LMZ741 + 647410 + Wilmette_Harbor_to_Nerly_I_IL + + US + 41.98 + -87.58 + 0 + 0 + LOT + + + LSZ248 + 652480 + Huron_Islands_to_Marquette_MI + + US + 46.77 + -87.52 + 0 + 0 + MQT + + + LMZ669 + 646690 + L_MI_fr_Sheboygan_to_Port_Washin + + US + 43.63 + -87.44 + 0 + 0 + MKX + + + LMZ743 + 647430 + Calumet_Harbor_IL_to_Gary_IN + + US + 41.70 + -87.42 + 0 + 0 + LOT + + + LMZ671 + 646710 + L_MI_fr_Port_Washington_to_N_Pt_ + + US + 43.20 + -87.41 + 0 + 0 + MKX + + + LMZ673 + 646730 + L_MI_fr_N_Pt_Lt_to_Wind_Pt_WI_5N + + US + 42.93 + -87.40 + 0 + 0 + MKX + + + LMZ521 + 645210 + Grn_Bay_S_of_line_fr__Cedar_Riv_ + + US + 45.11 + -87.39 + 0 + 0 + GRB + + + LMZ542 + 645420 + Sturgeon_Bay_to_Two_Rivers_WI + + US + 44.49 + -87.37 + 0 + 0 + GRB + + + LMZ777 + 647770 + L_MI_fr_Winthrop_Hbr_to_Wilmette + + US + 42.31 + -87.37 + 0 + 0 + LOT + + + LMZ567 + 645670 + L_MI_fr_2_Rivs_to_Sheboygan_WI_5 + + US + 44.05 + -87.33 + 0 + 0 + GRB + + + LMZ675 + 646750 + L_MI_fr_Wind_Pt_WI_to_Winthrop_H + + US + 42.61 + -87.32 + 0 + 0 + MKX + + + LMZ779 + 647790 + L_MI_fr_Wilmette_Hbr_to_MI_Cty_i + + US + 41.95 + -87.26 + 0 + 0 + LOT + + + LMZ744 + 647440 + Gary_to_Burns_Harbor_IN + + US + 41.67 + -87.25 + 0 + 0 + LOT + + + LMZ565 + 645650 + L_MI_fr_Sturgeon_Bay_to_2_Rivs_W + + US + 44.47 + -87.11 + 0 + 0 + GRB + + + LSZ249 + 652490 + Marquette_to_Munising_MI + + US + 46.60 + -87.05 + 0 + 0 + MQT + + + LMZ745 + 647450 + Burns_Harbor_to_MI_City_IN + + US + 41.72 + -87.04 + 0 + 0 + LOT + + + LMZ541 + 645410 + Rock_I_Passage_to_Sturgeon_Bay_W + + US + 45.07 + -86.96 + 0 + 0 + GRB + + + LMZ870 + 648700 + L_MI_fr_Whthall_to_Pentwtr_MI_5N + + US + 43.63 + -86.96 + 0 + 0 + GRR + + + LMZ221 + 642210 + Grn_Bay_N_of_line_fr_Cedar_Riv_M + + US + 45.66 + -86.94 + 0 + 0 + MQT + + + LMZ046 + 640460 + MI_City_IN_to_New_Buffalo_MI + + US + 41.80 + -86.86 + 0 + 0 + IWX + + + LSZ266 + 652660 + L_Sup_E_of_a_line_fr_Manitou_I_t + + US + 47.21 + -86.85 + 0 + 0 + MQT + + + LMZ878 + 648780 + L_MI_fr_St_Joseph_to_S_Haven_MI_ + + US + 42.36 + -86.84 + 0 + 0 + GRR + + + GMZ675 + 686750 + Wtrs_fr_Destin_to_Pensacola_FL_f + + US + 29.72 + -86.83 + 0 + 0 + MOB + + + LMZ080 + 640800 + L_MI_MI_Cty_IN_to_St._Joseph_MI_ + + US + 41.97 + -86.79 + 0 + 0 + IWX + + + LMZ872 + 648720 + L_MI_fr_Gnd_Haven_to_Whthall_MI_ + + US + 43.22 + -86.78 + 0 + 0 + GRR + + + LMZ874 + 648740 + L_MI_fr_Holland_to_Gnd_Haven_MI_ + + US + 42.95 + -86.78 + 0 + 0 + GRR + + + LMZ366 + 643660 + L_MI_fr_Pt_Betsie_to_Manistee_MI + + US + 44.53 + -86.75 + 0 + 0 + APX + + + GMZ655 + 686550 + Cstal_wtrs_fr_Destin_to_Pensacol + + US + 30.24 + -86.72 + 0 + 0 + MOB + + + LMZ043 + 640430 + New_Buffalo_MI_to_St_Joseph_MI + + US + 41.97 + -86.67 + 0 + 0 + IWX + + + LMZ563 + 645630 + L_MI_fr_Rock_I_Passage_to_Sturge + + US + 45.02 + -86.67 + 0 + 0 + GRB + + + LMZ250 + 642500 + 5NM_E_of_a_line_fr_Fairport_MI_t + + US + 45.49 + -86.66 + 0 + 0 + MQT + + + LMZ868 + 648680 + L_MI_fr_Pentwtr_to_Manistee_MI_5 + + US + 43.95 + -86.65 + 0 + 0 + GRR + + + LMZ876 + 648760 + L_MI_fr_S_Haven_to_Holland_MI_5N + + US + 42.60 + -86.65 + 0 + 0 + GRR + + + LMZ849 + 648490 + Pentwater_to_Manistee_MI + + US + 44.03 + -86.57 + 0 + 0 + GRR + + + LMZ848 + 648480 + Whitehall_to_Pentwater_MI + + US + 43.59 + -86.53 + 0 + 0 + GRR + + + LSZ250 + 652500 + Munising_to_Grand_Marais_MI + + US + 46.59 + -86.49 + 0 + 0 + MQT + + + LMZ844 + 648440 + St_Joseph_to_South_Haven_MI + + US + 42.28 + -86.46 + 0 + 0 + GRR + + + LMZ847 + 648470 + Grand_Haven_to_Whitehall_MI + + US + 43.22 + -86.36 + 0 + 0 + GRR + + + LMZ346 + 643460 + Manistee_to_Point_Betsie_MI + + US + 44.48 + -86.33 + 0 + 0 + APX + + + LMZ261 + 642610 + L_MI_fr_Seul_Choix_Pt_to_Rock_I_ + + US + 45.60 + -86.32 + 0 + 0 + MQT + + + LMZ846 + 648460 + Holland_to_Grand_Haven_MI + + US + 42.91 + -86.30 + 0 + 0 + GRR + + + LMZ845 + 648450 + South_Haven_to_Holland_MI + + US + 42.59 + -86.28 + 0 + 0 + GRR + + + LMZ248 + 642480 + Seul_Choix_Pt_to_Pt_Detour_MI + + US + 45.79 + -86.27 + 0 + 0 + MQT + + + LMZ364 + 643640 + L_MI_fr_Charlevoix_to_Pt_Betsie_ + + US + 45.02 + -86.19 + 0 + 0 + APX + + + LMZ345 + 643450 + Pt_Betsie_to_Sleeping_Bear_Pt_MI + + US + 44.82 + -86.18 + 0 + 0 + APX + + + LMZ344 + 643440 + Sleeping_Bear_Pt_to_Gnd_Traverse + + US + 45.09 + -85.79 + 0 + 0 + APX + + + GMZ770 + 687700 + Wtrs_fr_Apalachicola_to_Destin_F + + US + 29.27 + -85.76 + 0 + 0 + TAE + + + LMZ341 + 643410 + Seul_Choix_Pt_to_5NM_W_of_Mackin + + US + 45.96 + -85.71 + 0 + 0 + APX + + + GMZ750 + 687500 + Cstal_wtrs_fr_Apalachicola_to_De + + US + 29.84 + -85.65 + 0 + 0 + TAE + + + LSZ267 + 652670 + L_Sup_fr_Gnd_Marais_MI_to_Whtfis + + US + 47.00 + -85.61 + 0 + 0 + MQT + + + LMZ362 + 643620 + L_MI_S_of_a_line_fr_Seul_Choix_P + + US + 45.60 + -85.57 + 0 + 0 + APX + + + LMZ323 + 643230 + Gnd_Traverse_Bay_S_of_a_line_Gnd + + US + 44.98 + -85.56 + 0 + 0 + APX + + + LSZ251 + 652510 + Grand_Marais_to_Whitefish_Pt_MI + + US + 46.75 + -85.41 + 0 + 0 + MQT + + + LMZ342 + 643420 + Norwood_MI_to_5NM_W_of_Mackinac_ + + US + 45.53 + -85.20 + 0 + 0 + APX + + + LSZ321 + 653210 + Whtfish_Bay_(U.S._Portion)/Whtfi + + US + 46.54 + -84.77 + 0 + 0 + APX + + + LHZ345 + 743450 + Sts_of_Mackinac_within_5NM_of_Ma + + US + 45.81 + -84.71 + 0 + 0 + APX + + + GMZ755 + 687550 + Cstal_Wtrs_From__Ochlockonee_Riv + + US + 29.61 + -84.54 + 0 + 0 + TAE + + + GMZ775 + 687750 + Wtrs_fr__Suwannee_Riv_to_Apalach + + US + 29.15 + -84.35 + 0 + 0 + TAE + + + LHZ347 + 743470 + 5NM_E_of_Mackinac_Br_to_Presque_ + + US + 45.73 + -84.31 + 0 + 0 + APX + + + LHZ346 + 743460 + St_Ignace_to_False_Detour_Chnl + + US + 45.94 + -84.13 + 0 + 0 + APX + + + LSZ322 + 653220 + St._Marys_Riv_Pt_Iroquois_to_E._ + + US + 46.26 + -84.11 + 0 + 0 + APX + + + GMZ730 + 687300 + Apalachee_Bay_or_Cstal_Wtrs_From + + US + 29.90 + -83.95 + 0 + 0 + TAE + + + LHZ361 + 743610 + L_Huron_fr_5NM_E_of_Mackinac_Br_ + + US + 45.63 + -83.69 + 0 + 0 + APX + + + LHZ422 + 744220 + Inr_Saginaw_Bay_SW_of_Pt_Au_Gres + + US + 43.80 + -83.67 + 0 + 0 + DTX + + + GMZ870 + 688700 + Wtrs_fr_Tarpon_Spgs_to_Suwannee_ + + US + 28.60 + -83.54 + 0 + 0 + TBW + + + GMZ765 + 687650 + Cstal_wtrs_fr__Suwannee_Riv_to_K + + US + 29.50 + -83.53 + 0 + 0 + TAE + + + LHZ421 + 744210 + Out_Saginaw_Bay_SW_of_Alabaster_ + + US + 44.07 + -83.38 + 0 + 0 + DTX + + + GMZ873 + 688730 + Wtrs_fr_Englewood_to_Tarpon_Spgs + + US + 27.42 + -83.36 + 0 + 0 + TBW + + + LEZ142 + 631420 + Maumee_Bay_to_Reno_Beach_OH + + US + 41.74 + -83.35 + 0 + 0 + CLE + + + LHZ348 + 743480 + Presque_I_Lt_to_Sturgeon_Pt_MI_I + + US + 45.06 + -83.32 + 0 + 0 + APX + + + LEZ444 + 634440 + MI_Wtrs_of_L_Erie_fr_Detroit_Riv + + US + 41.89 + -83.29 + 0 + 0 + DTX + + + LHZ349 + 743490 + Sturgeon_Point_to_Alabaster_MI + + US + 44.45 + -83.26 + 0 + 0 + APX + + + LEZ162 + 631620 + Detroit_Riv_Lt._to_Maumee_Bay_OH + + US + 41.86 + -83.20 + 0 + 0 + CLE + + + LCZ423 + 604230 + Detroit_River + + US + 42.18 + -83.16 + 0 + 0 + DTX + + + GMZ850 + 688500 + Cstal_wtrs_fr_Tarpon_Spgs_to_Suw + + US + 28.74 + -82.94 + 0 + 0 + TBW + + + LEZ143 + 631430 + Reno_Beach_to_The_Islands_OH + + US + 41.63 + -82.94 + 0 + 0 + CLE + + + LEZ163 + 631630 + Reno_Beach_to_The_Is_OH_beyond_5 + + US + 41.73 + -82.92 + 0 + 0 + CLE + + + GMZ853 + 688530 + Cstal_wtrs_fr_Englewood_to_Tarpo + + US + 27.53 + -82.87 + 0 + 0 + TBW + + + GMZ876 + 688760 + Wtrs_fr_Bonita_Beach_to_Englewoo + + US + 26.39 + -82.86 + 0 + 0 + TBW + + + LHZ362 + 743620 + L_Huron_fr_Presque_I_Lt_to_Sturg + + US + 45.10 + -82.84 + 0 + 0 + APX + + + LCZ460 + 604600 + L_St._Clair_Open_L_(U.S._Portion + + US + 42.52 + -82.76 + 0 + 0 + DTX + + + LHZ363 + 743630 + L_Huron_fr_Sturgeon_Pt_to_Alabas + + US + 44.42 + -82.75 + 0 + 0 + APX + + + LEZ144 + 631440 + The_Islands_to_Vermilion_OH + + US + 41.48 + -82.71 + 0 + 0 + CLE + + + GMZ830 + 688300 + Tampa_Bay_waters + + US + 27.76 + -82.60 + 0 + 0 + TBW + + + LHZ441 + 744410 + Port_Austin_to_Harbor_Beach_MI + + US + 43.93 + -82.59 + 0 + 0 + DTX + + + LHZ442 + 744420 + Harbor_Beach_to_Port_Sanilac_MI + + US + 43.64 + -82.53 + 0 + 0 + DTX + + + GMZ075 + 680750 + Wtrs_fr_Key_W_to_20_NM_W_of_Dry_ + + US + 24.26 + -82.51 + 0 + 0 + KEY + + + LHZ462 + 744620 + L_Huron_fr_Port_Austin_to_Hbr_Be + + US + 44.05 + -82.51 + 0 + 0 + DTX + + + LEZ164 + 631640 + The_Is_to_Vermilion_OH_beyond_5n + + US + 41.59 + -82.48 + 0 + 0 + CLE + + + LCZ422 + 604220 + St._Clair_River + + US + 42.77 + -82.47 + 0 + 0 + DTX + + + LHZ443 + 744430 + Port_Sanilac_to_Port_Huron_MI + + US + 43.21 + -82.43 + 0 + 0 + DTX + + + GMZ676 + 686760 + Wtrs_fr_Chokoloskee_to_Bonita_Be + + US + 25.80 + -82.42 + 0 + 0 + MFL + + + LHZ463 + 744630 + L_Huron_fr_Hbr_Beach_to_Port_Sni + + US + 43.70 + -82.41 + 0 + 0 + DTX + + + LHZ464 + 744640 + L_Huron_fr_Port_Snilac_to_Port_H + + US + 43.33 + -82.40 + 0 + 0 + DTX + + + GMZ856 + 688560 + Cstal_wtrs_fr_Bonita_Beach_to_En + + US + 26.56 + -82.28 + 0 + 0 + TBW + + + LEZ145 + 631450 + Vermilion_to_Avon_Point_OH + + US + 41.51 + -82.17 + 0 + 0 + CLE + + + LEZ165 + 631650 + Vermilion_to_Avon_Pt_OH_beyond_5 + + US + 41.61 + -82.04 + 0 + 0 + CLE + + + GMZ033 + 680330 + Wtrs_fr_E_C_Sable_to_Chokoloskee + + US + 25.27 + -82.00 + 0 + 0 + KEY + + + GMZ656 + 686560 + Cstal_wtrs_fr_Chokoloskee_to_Bon + + US + 25.96 + -81.92 + 0 + 0 + MFL + + + LEZ166 + 631660 + Avon_Pt_to_Willowick_OH_beyond_5 + + US + 41.82 + -81.81 + 0 + 0 + CLE + + + LEZ146 + 631460 + Avon_Point_to_Willowick_OH + + US + 41.54 + -81.66 + 0 + 0 + CLE + + + GMZ054 + 680540 + Cstal_wtrs_fr_the_W_end_of_the_S + + US + 24.48 + -81.61 + 0 + 0 + KEY + + + GMZ032 + 680320 + Gulf_Side_of_the_Lwr_Keys_out_20 + + US + 24.86 + -81.48 + 0 + 0 + KEY + + + GMZ074 + 680740 + Wtrs_fr_the_W_end_of_the_Seven_M + + US + 23.93 + -81.44 + 0 + 0 + KEY + + + GMZ657 + 686570 + Cstal_wtrs_fr_E_C_Sable_to_Choko + + US + 25.47 + -81.41 + 0 + 0 + MFL + + + AMZ450 + 664500 + Cstal_wtrs_fr_Altamaha_Snd_to_Fe + + US + 30.99 + -81.28 + 0 + 0 + JAX + + + LEZ147 + 631470 + Willowick_to_Geneva-on-the_L_OH + + US + 41.80 + -81.22 + 0 + 0 + CLE + + + AMZ452 + 664520 + Cstal_wtrs_fr_Fernandina_Beach_t + + US + 30.28 + -81.18 + 0 + 0 + JAX + + + LEZ167 + 631670 + Willowick_to_Geneva-on-the-L_OH_ + + US + 42.00 + -81.16 + 0 + 0 + CLE + + + AMZ354 + 663540 + Cstal_wtrs_fr_Savannah_GA_to_Alt + + US + 31.67 + -81.05 + 0 + 0 + CHS + + + AMZ550 + 665500 + Flagler_Beach_to_Volusia-Brevard + + US + 29.22 + -80.97 + 0 + 0 + MLB + + + AMZ454 + 664540 + Cstal_wtrs_fr_St._Augustine_to_F + + US + 29.66 + -80.94 + 0 + 0 + JAX + + + GMZ053 + 680530 + Cstal_wtrs_fr_Craig_Key_to_the_W + + US + 24.57 + -80.90 + 0 + 0 + KEY + + + GMZ031 + 680310 + Florida_Bay + + US + 24.99 + -80.86 + 0 + 0 + KEY + + + AMZ610 + 666100 + Lake_Okeechobee + + US + 26.94 + -80.82 + 0 + 0 + MFL + + + GMZ073 + 680730 + Wtrs_fr_Craig_Key_to_the_W_end_o + + US + 24.10 + -80.79 + 0 + 0 + KEY + + + LEZ148 + 631480 + Geneva-on-the-L_to_Conneaut_OH + + US + 41.96 + -80.75 + 0 + 0 + CLE + + + AMZ472 + 664720 + Wtrs_fr_Fernandina_Beach_to_St._ + + US + 30.27 + -80.73 + 0 + 0 + JAX + + + AMZ470 + 664700 + Wtrs_fr_Altamaha_Snd_GA_to_Ferna + + US + 30.90 + -80.71 + 0 + 0 + JAX + + + LEZ168 + 631680 + Geneva-on-the-L_to_Conneaut_OH_b + + US + 42.11 + -80.69 + 0 + 0 + CLE + + + AMZ474 + 664740 + Wtrs_fr_St._Augustine_to_Flagler + + US + 29.71 + -80.54 + 0 + 0 + JAX + + + AMZ552 + 665520 + Volusia-Brevard_Cnty_Line_to_Seb + + US + 28.39 + -80.48 + 0 + 0 + MLB + + + AMZ352 + 663520 + Cstal_wtrs_fr_Edisto_Beach_SC_to + + US + 32.18 + -80.47 + 0 + 0 + CHS + + + AMZ374 + 663740 + Wtrs_fr_Savannah_GA_to_Altamaha_ + + US + 31.48 + -80.45 + 0 + 0 + CHS + + + LEZ169 + 631690 + Conneaut_OH_to_Ripley_NY_beyond_ + + US + 42.33 + -80.35 + 0 + 0 + CLE + + + GMZ052 + 680520 + Cstal_wtrs_fr_O_Reef_to_Craig_Ke + + US + 24.94 + -80.34 + 0 + 0 + KEY + + + AMZ630 + 666300 + Biscayne_Bay + + US + 25.58 + -80.28 + 0 + 0 + MFL + + + AMZ570 + 665700 + Flagler_Beach_to_Volusia-Brevard + + US + 29.20 + -80.22 + 0 + 0 + MLB + + + LEZ149 + 631490 + Conneaut_OH_to_Ripley_NY + + US + 42.15 + -80.15 + 0 + 0 + CLE + + + GMZ072 + 680720 + Wtrs_fr_O_Reef_to_Craig_Key_fr_2 + + US + 24.53 + -80.05 + 0 + 0 + KEY + + + AMZ555 + 665550 + Sebastian_Inlt_to_Jupiter_Inlt_0 + + US + 27.40 + -80.03 + 0 + 0 + MLB + + + AMZ651 + 666510 + Cstal_wtrs_fr_Deerfield_Beach_to + + US + 25.77 + -80.01 + 0 + 0 + MFL + + + AMZ330 + 663300 + Charleston_Harbor + + US + 32.78 + -79.89 + 0 + 0 + CHS + + + AMZ572 + 665720 + Volusia-Brevard_Cnty_Line_to_Seb + + US + 28.42 + -79.87 + 0 + 0 + MLB + + + AMZ650 + 666500 + Cstal_wtrs_fr_Jupiter_Inlt_to_De + + US + 26.59 + -79.74 + 0 + 0 + MFL + + + AMZ370 + 663700 + Wtrs_fr_S_Sntee_Riv_SC_to_Savann + + US + 32.35 + -79.63 + 0 + 0 + CHS + + + LEZ040 + 630400 + Ripley_to_Dunkirk_NY + + US + 42.43 + -79.56 + 0 + 0 + BUF + + + AMZ575 + 665750 + Sebastian_Inlt_to_Jupiter_Inlt_2 + + US + 27.46 + -79.52 + 0 + 0 + MLB + + + AMZ350 + 663500 + Cstal_wtrs_fr_S_Sntee_Riv_to_Edi + + US + 32.65 + -79.51 + 0 + 0 + CHS + + + AMZ671 + 666710 + Wtrs_fr_Deerfield_Beach_to_O_Ree + + US + 25.50 + -79.50 + 0 + 0 + MFL + + + LEZ061 + 630610 + Ripley_to_Buffalo_NY_extending_f + + US + 42.55 + -79.49 + 0 + 0 + BUF + + + AMZ670 + 666700 + Wtrs_fr_Jupiter_Inlt_to_Deerfiel + + US + 26.58 + -79.34 + 0 + 0 + MFL + + + LEZ041 + 630410 + Dunkirk_to_Buffalo_NY + + US + 42.69 + -79.11 + 0 + 0 + BUF + + + LEZ020 + 630200 + Buffalo_Hbr_and_the_Upr_Niagara_ + + US + 43.11 + -79.06 + 0 + 0 + BUF + + + AMZ256 + 662560 + Cstal_wtrs_fr_Murrells_Inlt_to_S + + US + 33.21 + -78.86 + 0 + 0 + ILM + + + LOZ042 + 620420 + Niagara_Riv_to_Hamlin_Beach_NY + + US + 43.36 + -78.79 + 0 + 0 + BUF + + + LOZ062 + 620620 + Niagara_Riv_to_Hamlin_Beach_NY_b + + US + 43.55 + -78.63 + 0 + 0 + BUF + + + AMZ254 + 662540 + Cstal_wtrs_fr_Ltl_Riv_Inlt_to_Mu + + US + 33.62 + -78.59 + 0 + 0 + ILM + + + AMZ252 + 662520 + Cstal_wtrs_fr_C_Fear_NC_to_Ltl_R + + US + 33.69 + -78.01 + 0 + 0 + ILM + + + AMZ270 + 662700 + Wtrs_fr_Surf_Cty_NC_to_S_Sntee_R + + US + 33.49 + -77.96 + 0 + 0 + ILM + + + AMZ250 + 662500 + Cstal_wtrs_fr_Surf_Cty_to_C_Fear + + US + 34.07 + -77.60 + 0 + 0 + ILM + + + LOZ043 + 620430 + Hamlin_Beach_to_Sodus_Bay_NY + + US + 43.33 + -77.46 + 0 + 0 + BUF + + + LOZ063 + 620630 + Hamlin_Beach_to_Sodus_Bay_NY_bey + + US + 43.47 + -77.38 + 0 + 0 + BUF + + + ANZ536 + 675360 + Tidal_Potomac_fr_Ind_Hd_to_Cobb_ + + US + 38.42 + -77.12 + 0 + 0 + LWX + + + ANZ535 + 675350 + Tidal_Potomac_fr_Key_Br_to_Ind_H + + US + 38.75 + -77.04 + 0 + 0 + LWX + + + AMZ158 + 661580 + Cstal_wtrs_fr_C_Lookout_to_Surf_ + + US + 34.52 + -76.95 + 0 + 0 + MHX + + + LOZ064 + 620640 + Sodus_Bay_to_Mex_Bay_NY_beyond_5 + + US + 43.62 + -76.75 + 0 + 0 + BUF + + + LOZ044 + 620440 + Sodus_Bay_to_Mexico_Bay_NY + + US + 43.44 + -76.62 + 0 + 0 + BUF + + + ANZ537 + 675370 + Tidal_Potomac_fr_Cobb_I_MD_to_Sm + + US + 38.15 + -76.58 + 0 + 0 + LWX + + + ANZ533 + 675330 + Chsapke_Bay_fr_N_Beach_to_Drum_P + + US + 38.56 + -76.41 + 0 + 0 + LWX + + + LOZ065 + 620650 + Mex_Bay_NY_to_the_St._Lawrence_R + + US + 43.78 + -76.39 + 0 + 0 + BUF + + + LOZ045 + 620450 + Mex_Bay_NY_to_the_St._Lawrence_R + + US + 43.86 + -76.36 + 0 + 0 + BUF + + + ANZ531 + 675310 + Chsapke_Bay_fr_Pooles_I_to_Sndy_ + + US + 39.18 + -76.35 + 0 + 0 + LWX + + + AMZ156 + 661560 + Cstal_wtrs_fr_Ocracoke_Inlt_to_C + + US + 34.80 + -76.27 + 0 + 0 + MHX + + + ANZ532 + 675320 + Chsapke_Bay_fr_Sndy_Pt_to_N_Beac + + US + 38.90 + -76.27 + 0 + 0 + LWX + + + AMZ135 + 661350 + Pamlico_Sound + + US + 35.30 + -76.13 + 0 + 0 + MHX + + + ANZ632 + 676320 + Chsapke_Bay_fr_New_Pt_Comfort_to + + US + 37.10 + -76.13 + 0 + 0 + AKQ + + + ANZ534 + 675340 + Chsapke_Bay_fr_Drum_Pt_MD_to_Smi + + US + 38.13 + -76.11 + 0 + 0 + LWX + + + AMZ130 + 661300 + Albemarle_Sound + + US + 36.00 + -76.09 + 0 + 0 + MHX + + + ANZ631 + 676310 + Chsapke_Bay_fr_Windmill_Pt_to_Ne + + US + 37.46 + -76.09 + 0 + 0 + AKQ + + + ANZ530 + 675300 + Chesapeake_Bay_N_of_Pooles_I_MD + + US + 39.46 + -76.06 + 0 + 0 + LWX + + + ANZ630 + 676300 + Chsapke_Bay_fr_Smith_Pt_to_Windm + + US + 37.80 + -76.04 + 0 + 0 + AKQ + + + ANZ633 + 676330 + Currituck_Sound + + US + 36.40 + -75.92 + 0 + 0 + AKQ + + + SLZ022 + 730220 + St._Lawrence_Riv_above_Ogdensbg_ + + US + 44.45 + -75.79 + 0 + 0 + BUF + + + ANZ656 + 676560 + Cstal_wtrs_fr_C_Charles_Lt_VA_to + + US + 36.78 + -75.68 + 0 + 0 + AKQ + + + AMZ170 + 661700 + Wtrs_fr_Currituck_Beach_Lt_to_Su + + US + 34.83 + -75.64 + 0 + 0 + MHX + + + ANZ654 + 676540 + Cstal_wtrs_fr_Parramore_I_to_C_C + + US + 37.31 + -75.62 + 0 + 0 + AKQ + + + ANZ658 + 676580 + Cstal_wtrs_fr_NC_VA_border_to_Cu + + US + 36.36 + -75.60 + 0 + 0 + AKQ + + + AMZ154 + 661540 + Cstal_wtrs_fr_C_Hatteras_to_Ocra + + US + 35.05 + -75.58 + 0 + 0 + MHX + + + AMZ150 + 661500 + Cstal_wtrs_fr_Currituck_Beach_Lt + + US + 36.02 + -75.50 + 0 + 0 + MHX + + + ANZ652 + 676520 + Cstal_wtrs_fr_Chincoteague_to_Pa + + US + 37.81 + -75.39 + 0 + 0 + AKQ + + + AMZ152 + 661520 + Cstal_wtrs_fr_Oregon_Inlt_to_C_H + + US + 35.50 + -75.38 + 0 + 0 + MHX + + + ANZ430 + 674300 + DE_Bay_wtrs_N_of_E_Pt_NJ_to_Slau + + US + 39.32 + -75.34 + 0 + 0 + PHI + + + SLZ024 + 730240 + St._Lawrence_Riv_fr_Ogdensbg_to_ + + US + 44.86 + -75.23 + 0 + 0 + BUF + + + ANZ431 + 674310 + DE_Bay_wtrs_S_of_E_Pt_NJ_to_Slau + + US + 39.00 + -75.10 + 0 + 0 + PHI + + + ANZ670 + 676700 + Wtrs_fr_Fenwick_I_DE_to_Currituc + + US + 37.28 + -75.10 + 0 + 0 + AKQ + + + ANZ650 + 676500 + Cstal_wtrs_fr_Fenwick_I_DE_to_Ch + + US + 38.23 + -75.07 + 0 + 0 + AKQ + + + ANZ454 + 674540 + Cstal_wtrs_fr_C_May_NJ_to_C_Henl + + US + 38.80 + -74.89 + 0 + 0 + PHI + + + ANZ455 + 674550 + Cstal_wtrs_fr_C_Henlopen_to_Fenw + + US + 38.48 + -74.74 + 0 + 0 + PHI + + + ANZ453 + 674530 + Cstal_wtrs_fr_Gt_Egg_Inlt_to_C_M + + US + 38.97 + -74.57 + 0 + 0 + PHI + + + ANZ452 + 674520 + Cstal_wtrs_fr_Ltl_Egg_Inlt_to_Gt + + US + 39.26 + -74.36 + 0 + 0 + PHI + + + ANZ338 + 673380 + New_York_Harbor + + US + 40.55 + -74.09 + 0 + 0 + OKX + + + ANZ470 + 674700 + Wtrs_fr_Sndy_Hook_NJ_to_Fenwick_ + + US + 39.18 + -74.02 + 0 + 0 + PHI + + + ANZ451 + 674510 + Cstal_wtrs_fr_Manasquan_Inlt_to_ + + US + 39.65 + -73.95 + 0 + 0 + PHI + + + ANZ450 + 674500 + Cstal_wtrs_fr_Sndy_Hook_to_Manas + + US + 40.16 + -73.78 + 0 + 0 + PHI + + + ANZ355 + 673550 + Sndy_Hook_NJ_to_Fire_I_Inlt_NY_o + + US + 40.41 + -73.51 + 0 + 0 + OKX + + + ANZ335 + 673350 + Long_I_Snd_W_of_New_Haven_CT/Por + + US + 41.04 + -73.36 + 0 + 0 + OKX + + + ANZ353 + 673530 + Fire_I_Inlt_NY_to_Moriches_Inlt_ + + US + 40.55 + -73.04 + 0 + 0 + OKX + + + ANZ345 + 673450 + S_Shore_Bays_fr_Jones_Inlt_throu + + US + 40.74 + -73.00 + 0 + 0 + OKX + + + ANZ370 + 673700 + Wtrs_fr_Montauk_Pt_NY_to_Sndy_Ho + + US + 40.31 + -72.48 + 0 + 0 + OKX + + + ANZ330 + 673300 + Long_I_Snd_E_of_New_Haven_CT/Por + + US + 41.15 + -72.44 + 0 + 0 + OKX + + + ANZ340 + 673400 + Peconic_and_Gardiners_Bays + + US + 41.02 + -72.33 + 0 + 0 + OKX + + + ANZ350 + 673500 + Moriches_Inlt_NY_to_Montauk_Pt_N + + US + 40.75 + -72.21 + 0 + 0 + OKX + + + ANZ237 + 672370 + Block_Island_Sound + + US + 41.21 + -71.61 + 0 + 0 + BOX + + + ANZ236 + 672360 + Narragansett_Bay + + US + 41.62 + -71.29 + 0 + 0 + BOX + + + ANZ235 + 672350 + Rhode_Island_Sound + + US + 41.32 + -71.13 + 0 + 0 + BOX + + + ANZ230 + 672300 + Boston_Harbor + + US + 42.34 + -70.94 + 0 + 0 + BOX + + + ANZ233 + 672330 + Vineyard_Sound + + US + 41.43 + -70.78 + 0 + 0 + BOX + + + ANZ234 + 672340 + Buzzards_Bay + + US + 41.52 + -70.74 + 0 + 0 + BOX + + + ANZ255 + 672550 + Cstal_wtrs_fr_Nantucket_MA_to_Ma + + US + 41.07 + -70.74 + 0 + 0 + BOX + + + ANZ250 + 672500 + Cstal_wtrs_fr_Merrimack_Riv_MA_o + + US + 42.44 + -70.37 + 0 + 0 + BOX + + + ANZ231 + 672310 + Cape_Cod_Bay + + US + 41.92 + -70.34 + 0 + 0 + BOX + + + ANZ154 + 671540 + Cstal_Wtrs_fr_C_Elizabeth,_ME_to + + US + 43.11 + -70.26 + 0 + 0 + GYX + + + ANZ232 + 672320 + Nantucket_Sound + + US + 41.48 + -70.26 + 0 + 0 + BOX + + + ANZ153 + 671530 + Casco_Bay + + US + 43.72 + -70.06 + 0 + 0 + GYX + + + ANZ254 + 672540 + Cstal_wtrs_fr_Provincetown_MA_to + + US + 41.66 + -69.75 + 0 + 0 + BOX + + + ANZ152 + 671520 + Cstal_Wtrs_fr_Port_Clyde,_ME_to_ + + US + 43.57 + -69.47 + 0 + 0 + GYX + + + ANZ170 + 671700 + Wtrs_fr_Stonington_ME_to_Merrima + + US + 43.32 + -69.31 + 0 + 0 + GYX + + + ANZ270 + 672700 + Wtrs_fr_Merrimack_Riv_MA_to_Watc + + US + 41.69 + -69.29 + 0 + 0 + BOX + + + ANZ150 + 671500 + Cstal_Wtrs_fr_Stonington,_ME_to_ + + US + 43.84 + -68.91 + 0 + 0 + GYX + + + ANZ151 + 671510 + Penobscot_Bay + + US + 44.18 + -68.77 + 0 + 0 + GYX + + + ANZ051 + 670510 + Cstal_Wtrs_fr_Schoodic_Pt,_ME_to + + US + 44.00 + -68.25 + 0 + 0 + CAR + + + ANZ052 + 670520 + Intra_Cstal_Wtrs_fr_Schoodic_Pt, + + US + 44.19 + -68.25 + 0 + 0 + CAR + + + ANZ070 + 670700 + Wtrs_fr_Eport_ME_to_Stonington_( + + US + 43.84 + -67.86 + 0 + 0 + CAR + + + AMZ741 + 667410 + Mona_Passage_Southward_to_17N + + US + 17.74 + -67.69 + 0 + 0 + SJU + + + ANZ050 + 670500 + Cstal_Wtrs_fr_Eport,_ME_to_Schoo + + US + 44.30 + -67.48 + 0 + 0 + CAR + + + AMZ742 + 667420 + Cstal_Wtrs_OF_NWrn_Puerto_Rico_o + + US + 18.34 + -67.30 + 0 + 0 + SJU + + + AMZ745 + 667450 + Cstal_Wtrs_OF_SWrn_Puerto_Rico_o + + US + 18.06 + -67.28 + 0 + 0 + SJU + + + AMZ712 + 667120 + Cstal_Wtrs_of_Nrn_Puerto_Rico_ou + + US + 18.60 + -66.63 + 0 + 0 + SJU + + + AMZ735 + 667350 + Cstal_Wtrs_of_Srn_Puerto_Rico_ou + + US + 17.84 + -66.43 + 0 + 0 + SJU + + + AMZ710 + 667100 + Atl_Wtrs_of_Puerto_Rico_AND_USVI + + US + 19.04 + -66.01 + 0 + 0 + SJU + + + AMZ732 + 667320 + Carib_Wtrs_of_Puerto_Rico_fr_10_ + + US + 17.49 + -65.58 + 0 + 0 + SJU + + + AMZ725 + 667250 + Cstal_Wtrs_of_Srn_USVI,_Vieques, + + US + 18.24 + -65.16 + 0 + 0 + SJU + + + AMZ715 + 667150 + Cstal_Wtrs_of_Nrn_USVI_and_Culeb + + US + 18.47 + -64.85 + 0 + 0 + SJU + + + AMZ722 + 667220 + Anegada_Passage_Sward_to_17N + + US + 17.75 + -64.08 + 0 + 0 + SJU + + + PMZ161 + 711610 + Koror_Palau_Coastal_Waters + + US + 7.34 + 134.48 + 0 + 0 + GUM + + + PMZ171 + 711710 + Yap_Coastal_Waters + + US + 9.48 + 138.08 + 0 + 0 + GUM + + + PMZ151 + 711510 + Guam_Coastal_Waters + + US + 13.32 + 144.66 + 0 + 0 + GUM + + + PMZ152 + 711520 + Rota_Coastal_Waters + + US + 14.18 + 145.24 + 0 + 0 + GUM + + + PMZ153 + 711530 + Tinian_Coastal_Waters + + US + 14.83 + 145.45 + 0 + 0 + GUM + + + PMZ154 + 711540 + Saipan_Coastal_Waters + + US + 15.40 + 145.81 + 0 + 0 + GUM + + + PMZ172 + 711720 + Chuuk_Coastal_Waters + + US + 7.45 + 151.83 + 0 + 0 + GUM + + + PMZ173 + 711730 + Pohnpei_Coastal_Waters + + US + 6.97 + 158.23 + 0 + 0 + GUM + + + PMZ174 + 711740 + Kosrae_Coastal_Waters + + US + 5.35 + 162.95 + 0 + 0 + GUM + + + PMZ191 + 711910 + Waters_out_to_40_Nautical_Miles + + US + 19.30 + 166.64 + 0 + 0 + GUM + + + PMZ181 + 711810 + Majuro_Coastal_Waters + + US + 7.08 + 171.38 + 0 + 0 + GUM + + + PKZ176 + 691760 + Kiska_to_Attu + + US + 52.48 + 174.46 + 0 + 0 + AFC + + diff --git a/ncep/gov.noaa.nws.ncep.edex.gempak.jna/gov.noaa.nws.ncep.edex.gempak.jna.ecl b/ncep/gov.noaa.nws.ncep.edex.gempak.jna/gov.noaa.nws.ncep.edex.gempak.jna.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.ingest.grib.util/gov.noaa.nws.ncep.edex.ingest.grib.util.ecl b/ncep/gov.noaa.nws.ncep.edex.ingest.grib.util/gov.noaa.nws.ncep.edex.ingest.grib.util.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.ingest.util/gov.noaa.nws.ncep.edex.ingest.util.ecl b/ncep/gov.noaa.nws.ncep.edex.ingest.util/gov.noaa.nws.ncep.edex.ingest.util.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/component-deploy.xml old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/gov.noaa.nws.ncep.edex.plugin.airmet.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/gov.noaa.nws.ncep.edex.plugin.airmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-common.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-common.xml old mode 100644 new mode 100755 index f0ee3212ee..6571acc876 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-common.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-common.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml old mode 100644 new mode 100755 index ee3df1d67d..8eca038a2c --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml @@ -1,72 +1,72 @@ - - - - - - - - - - - - - - - - - - - - - - - - airmet - - - - - - - - - - - - - java.lang.Throwable - - - - - - - java.lang.Throwable - - - - - + + + + + + + + + + + + + + + + + + + + + + + + airmet + + + + + + + + + + + + + java.lang.Throwable + + + + + + + java.lang.Throwable + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetDecoder.java old mode 100644 new mode 100755 index 37f7f4498c..7aad148a39 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetDecoder.java @@ -1,317 +1,317 @@ -/** - * - * Airmet Decoder - * - * This java class decodes AIRMET raw data. - * HISTORY - * - * * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 05/2009 39 L. Lin Initial creation - * 06/2009 39 L. Lin Set updateNumber before constructing dataURI. - * 07/2009 39 L. Lin Migration to TO11 - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.airmet.decoder; - -import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetRecord; -import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetReport; -import gov.noaa.nws.ncep.edex.plugin.airmet.util.AirmetParser; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.raytheon.edex.esb.Headers; -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.edex.decodertools.core.IDecoderConstants; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class AirmetDecoder extends AbstractDecoder { - - private final String pluginName; - - /** - * Constructor - * - * @param name - * The name (usually pluginName) for this decoder. - * @throws DecoderException - */ - public AirmetDecoder(String name) throws DecoderException { - pluginName = name; - } - - /** - * - * @param data - * @param headers - * @return - * @throws DecoderException - */ - public PluginDataObject[] decode(byte[] data, Headers headers) - throws DecoderException { - - String traceId = ""; - if (headers != null) { - traceId = (String) headers.get("traceId"); - } - - String sectionDelim = "OTLK|AIRMET IFR|AIRMET MTN OBSCN|AIRMET TURB|AIRMET ICE|AIRMET STG SFC WNDS|LLWS POTENTIAL]"; - String etx = IDecoderConstants.ETX; - String theBulletin = null; - - Calendar startTime = null; - byte[] messageData = null; - - AirmetRecord record = null; - // Default equal to six hours from start time if there is no valid time - // in report - final int validPeriod = 6; - - AirmetSeparator sep = AirmetSeparator.separate(data, headers); - messageData = sep.next(); - String theMessage = new String(messageData); - - /* - * May have multiple duplicate bulletins, only get the first bulletin - * and eliminate the remaining bulletins after the first bulletin. - */ - Scanner cc = new Scanner(theMessage).useDelimiter(etx); - if (cc.hasNext()) { - theBulletin = cc.next(); - } else { - theBulletin = theMessage; - } - - // record = new AirmetRecord(); - // Decode and set WMO line - record = AirmetParser.processWMO(theBulletin, headers); - - Calendar issueTime = record.getIssueTime(); - - // Decode the reportName: ZULU, TANGO, or SIERRA - String reportName = AirmetParser.getReportName(theBulletin); - - /* - * Check the Airmet record object. If not, throws exception. - */ - if (record != null) { - record.setTraceId(traceId); - record.setPluginName(pluginName); - record.setReportType(pluginName); - record.setReportName(reportName); - // Decode and set the update number - record.setUpdateNumber(AirmetParser.getUpdateNumber(theBulletin)); - try { - record.constructDataURI(); - } catch (PluginException e) { - logger.error("Error constructing dataURI", e); - } - } - - if (record != null) { - try { - // Replace special characters to a blank so that it may be - // readable - record.setBullMessage(UtilN - .removeLeadingWhiteSpaces((theBulletin.substring(5)) - .replace('\036', ' ').replace('\r', ' ') - .replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' '))); - - // Decode the starting time - startTime = AirmetParser.getStartTime(theBulletin, headers); - if (startTime == null) { - startTime = issueTime; - } - - // Decode the end time - Calendar endTime = AirmetParser - .getEndTime(theBulletin, headers); - if (endTime == null) { - /* - * if no end time available, end time will be the start time - * plus a valid period; the default is six hours for now. - */ - endTime = startTime; - endTime.add(Calendar.HOUR, validPeriod); - } - - Calendar validStartTime = TimeTools.copy(endTime); - validStartTime.add(Calendar.HOUR, -validPeriod); - - // Airmet report valid time lasts only six hours from start to - // end - if (startTime.before(validStartTime)) { - startTime = validStartTime; - } - - // Decode the correction flag and set - record.setCorrectionFlag(AirmetParser - .getCorrectionFlag(theBulletin)); - - /* - * Break the bulletin message into sections by a "OTLK" or - * "AIRMET [IFR|MTN OBSCN|TURB|ICE|STG SFC WNDS|LLWS PTENTIAL]". - */ - Scanner sc = new Scanner(theBulletin) - .useDelimiter(sectionDelim); - - ArrayList segmentList = new ArrayList(); - segmentList.clear(); - // throw away the prefix section - String segPrefix = sc.next(); - - while (sc.hasNext()) { - String segment = sc.next(); - segmentList.add(segment); - } - - if (segmentList.size() == 0) { - // This is NIL/EXPIRE AIRMET report containing header only. - record.setCorrectionFlag(4); - } else { - /* - * Process each report. - */ - Integer series = 1; - // Get forecastRegion - String forecastRegion = AirmetParser.getRegion(reportName); - // Get valid day - String validDay = AirmetParser.getValidDay(theBulletin); - - // System.out.println("Process a report=\n" + segment); - for (String segment : segmentList) { - // starts a new section - Scanner sc2 = new Scanner(segment); - String whatReport = sc2.next(); - - if (whatReport.equals("VALID")) { - segment = "OTLK".concat(segment); - - // process this section which starts with - // "OTLK VALID". - Scanner scOutlook = new Scanner(segment) - .useDelimiter("AREA "); - ArrayList outlookList = new ArrayList(); - outlookList.clear(); - - // Check if "OUTLOOK" section contains more than one - // "AREA". - while (scOutlook.hasNext()) { - String outlookSegment = scOutlook.next(); - outlookList.add(outlookSegment); - } - - if (outlookList.size() <= 1) { - // only one outlook report - AirmetReport outlook = AirmetParser - .processOutLook(segment, forecastRegion); - AirmetParser.processValidTime(segment, outlook, - validDay, headers); - record.addAirmetReport(outlook); - } else { - /* - * Here are more than one outlook areas Store - * the header section and remove it from the - * outlook list - */ - String outlookHeader = outlookList.get(0); - outlookList.remove(outlookHeader); - // process multiple outlook sections - for (String outlookReport : outlookList) { - outlookReport = outlookHeader.concat( - "AREA ").concat(outlookReport); - AirmetReport outlook = AirmetParser - .processOutLook(outlookReport, - forecastRegion); - AirmetParser.processValidTime( - outlookReport, outlook, validDay, - headers); - record.addAirmetReport(outlook); - } - } - } else { - // Regular expression AIRMET report - final String HAZARD_EXP = "(ICE|TURB|CIG BLW|VIS BLW|MTNS|LLWS|SUSTAINED) "; - - // Pattern used for extracting hazard - final Pattern hazardTypePattern = Pattern - .compile(HAZARD_EXP); - Matcher theMatcher = hazardTypePattern - .matcher(segment); - - if (theMatcher.find()) { - // prefix the report type - if (theMatcher.group(1).equals("ICE")) { - segment = "AIRMET ICE".concat(segment); - } else if (theMatcher.group(1).equals("TURB")) { - segment = "AIRMET TURB".concat(segment); - } else if (theMatcher.group(1) - .equals("CIG BLW")) { - segment = "AIRMET IFR".concat(segment); - } else if (theMatcher.group(1) - .equals("VIS BLW")) { - segment = "AIRMET IFR".concat(segment); - } else if (theMatcher.group(1).equals("MTNS")) { - segment = "AIRMET MTN OBSCN" - .concat(segment); - } else if (theMatcher.group(1).equals( - "SUSTAINED")) { - segment = "AIRMET STG SFC WNDS" - .concat(segment); - } else if (theMatcher.group(1).equals("LLWS")) { - segment = "LLWS POTENTIAL".concat(segment); - } - } - - // process this report which starts with "AIRMET" or - // "LLWS". - AirmetReport report = AirmetParser - .processReport(segment); - if (report != null) { - // Decode and set the sequenceID - report.setSequenceID(AirmetParser - .getSequenceID(theBulletin, series)); - report.setStartTime(startTime); - report.setEndTime(endTime); - record.addAirmetReport(report); - } else { - logger.error("Error decoding segment " - + segment); - } - } - series++; - } - } - - } catch (Exception e) { - logger.error("Error postprocessing airmet", e); - record = null; - } - } - - /* - * Return the AirmetRecord record object. - */ - if (record == null) { - return new PluginDataObject[0]; - } else { - return new PluginDataObject[] { record }; - } - - } - -} +/** + * + * Airmet Decoder + * + * This java class decodes AIRMET raw data. + * HISTORY + * + * * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 05/2009 39 L. Lin Initial creation + * 06/2009 39 L. Lin Set updateNumber before constructing dataURI. + * 07/2009 39 L. Lin Migration to TO11 + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.airmet.decoder; + +import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetRecord; +import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetReport; +import gov.noaa.nws.ncep.edex.plugin.airmet.util.AirmetParser; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.raytheon.edex.esb.Headers; +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.edex.decodertools.core.IDecoderConstants; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class AirmetDecoder extends AbstractDecoder { + + private final String pluginName; + + /** + * Constructor + * + * @param name + * The name (usually pluginName) for this decoder. + * @throws DecoderException + */ + public AirmetDecoder(String name) throws DecoderException { + pluginName = name; + } + + /** + * + * @param data + * @param headers + * @return + * @throws DecoderException + */ + public PluginDataObject[] decode(byte[] data, Headers headers) + throws DecoderException { + + String traceId = ""; + if (headers != null) { + traceId = (String) headers.get("traceId"); + } + + String sectionDelim = "OTLK|AIRMET IFR|AIRMET MTN OBSCN|AIRMET TURB|AIRMET ICE|AIRMET STG SFC WNDS|LLWS POTENTIAL]"; + String etx = IDecoderConstants.ETX; + String theBulletin = null; + + Calendar startTime = null; + byte[] messageData = null; + + AirmetRecord record = null; + // Default equal to six hours from start time if there is no valid time + // in report + final int validPeriod = 6; + + AirmetSeparator sep = AirmetSeparator.separate(data, headers); + messageData = sep.next(); + String theMessage = new String(messageData); + + /* + * May have multiple duplicate bulletins, only get the first bulletin + * and eliminate the remaining bulletins after the first bulletin. + */ + Scanner cc = new Scanner(theMessage).useDelimiter(etx); + if (cc.hasNext()) { + theBulletin = cc.next(); + } else { + theBulletin = theMessage; + } + + // record = new AirmetRecord(); + // Decode and set WMO line + record = AirmetParser.processWMO(theBulletin, headers); + + Calendar issueTime = record.getIssueTime(); + + // Decode the reportName: ZULU, TANGO, or SIERRA + String reportName = AirmetParser.getReportName(theBulletin); + + /* + * Check the Airmet record object. If not, throws exception. + */ + if (record != null) { + record.setTraceId(traceId); + record.setPluginName(pluginName); + record.setReportType(pluginName); + record.setReportName(reportName); + // Decode and set the update number + record.setUpdateNumber(AirmetParser.getUpdateNumber(theBulletin)); + try { + record.constructDataURI(); + } catch (PluginException e) { + logger.error("Error constructing dataURI", e); + } + } + + if (record != null) { + try { + // Replace special characters to a blank so that it may be + // readable + record.setBullMessage(UtilN + .removeLeadingWhiteSpaces((theBulletin.substring(5)) + .replace('\036', ' ').replace('\r', ' ') + .replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' '))); + + // Decode the starting time + startTime = AirmetParser.getStartTime(theBulletin, headers); + if (startTime == null) { + startTime = issueTime; + } + + // Decode the end time + Calendar endTime = AirmetParser + .getEndTime(theBulletin, headers); + if (endTime == null) { + /* + * if no end time available, end time will be the start time + * plus a valid period; the default is six hours for now. + */ + endTime = startTime; + endTime.add(Calendar.HOUR, validPeriod); + } + + Calendar validStartTime = TimeTools.copy(endTime); + validStartTime.add(Calendar.HOUR, -validPeriod); + + // Airmet report valid time lasts only six hours from start to + // end + if (startTime.before(validStartTime)) { + startTime = validStartTime; + } + + // Decode the correction flag and set + record.setCorrectionFlag(AirmetParser + .getCorrectionFlag(theBulletin)); + + /* + * Break the bulletin message into sections by a "OTLK" or + * "AIRMET [IFR|MTN OBSCN|TURB|ICE|STG SFC WNDS|LLWS PTENTIAL]". + */ + Scanner sc = new Scanner(theBulletin) + .useDelimiter(sectionDelim); + + ArrayList segmentList = new ArrayList(); + segmentList.clear(); + // throw away the prefix section + String segPrefix = sc.next(); + + while (sc.hasNext()) { + String segment = sc.next(); + segmentList.add(segment); + } + + if (segmentList.size() == 0) { + // This is NIL/EXPIRE AIRMET report containing header only. + record.setCorrectionFlag(4); + } else { + /* + * Process each report. + */ + Integer series = 1; + // Get forecastRegion + String forecastRegion = AirmetParser.getRegion(reportName); + // Get valid day + String validDay = AirmetParser.getValidDay(theBulletin); + + // System.out.println("Process a report=\n" + segment); + for (String segment : segmentList) { + // starts a new section + Scanner sc2 = new Scanner(segment); + String whatReport = sc2.next(); + + if (whatReport.equals("VALID")) { + segment = "OTLK".concat(segment); + + // process this section which starts with + // "OTLK VALID". + Scanner scOutlook = new Scanner(segment) + .useDelimiter("AREA "); + ArrayList outlookList = new ArrayList(); + outlookList.clear(); + + // Check if "OUTLOOK" section contains more than one + // "AREA". + while (scOutlook.hasNext()) { + String outlookSegment = scOutlook.next(); + outlookList.add(outlookSegment); + } + + if (outlookList.size() <= 1) { + // only one outlook report + AirmetReport outlook = AirmetParser + .processOutLook(segment, forecastRegion); + AirmetParser.processValidTime(segment, outlook, + validDay, headers); + record.addAirmetReport(outlook); + } else { + /* + * Here are more than one outlook areas Store + * the header section and remove it from the + * outlook list + */ + String outlookHeader = outlookList.get(0); + outlookList.remove(outlookHeader); + // process multiple outlook sections + for (String outlookReport : outlookList) { + outlookReport = outlookHeader.concat( + "AREA ").concat(outlookReport); + AirmetReport outlook = AirmetParser + .processOutLook(outlookReport, + forecastRegion); + AirmetParser.processValidTime( + outlookReport, outlook, validDay, + headers); + record.addAirmetReport(outlook); + } + } + } else { + // Regular expression AIRMET report + final String HAZARD_EXP = "(ICE|TURB|CIG BLW|VIS BLW|MTNS|LLWS|SUSTAINED) "; + + // Pattern used for extracting hazard + final Pattern hazardTypePattern = Pattern + .compile(HAZARD_EXP); + Matcher theMatcher = hazardTypePattern + .matcher(segment); + + if (theMatcher.find()) { + // prefix the report type + if (theMatcher.group(1).equals("ICE")) { + segment = "AIRMET ICE".concat(segment); + } else if (theMatcher.group(1).equals("TURB")) { + segment = "AIRMET TURB".concat(segment); + } else if (theMatcher.group(1) + .equals("CIG BLW")) { + segment = "AIRMET IFR".concat(segment); + } else if (theMatcher.group(1) + .equals("VIS BLW")) { + segment = "AIRMET IFR".concat(segment); + } else if (theMatcher.group(1).equals("MTNS")) { + segment = "AIRMET MTN OBSCN" + .concat(segment); + } else if (theMatcher.group(1).equals( + "SUSTAINED")) { + segment = "AIRMET STG SFC WNDS" + .concat(segment); + } else if (theMatcher.group(1).equals("LLWS")) { + segment = "LLWS POTENTIAL".concat(segment); + } + } + + // process this report which starts with "AIRMET" or + // "LLWS". + AirmetReport report = AirmetParser + .processReport(segment); + if (report != null) { + // Decode and set the sequenceID + report.setSequenceID(AirmetParser + .getSequenceID(theBulletin, series)); + report.setStartTime(startTime); + report.setEndTime(endTime); + record.addAirmetReport(report); + } else { + logger.error("Error decoding segment " + + segment); + } + } + series++; + } + } + + } catch (Exception e) { + logger.error("Error postprocessing airmet", e); + record = null; + } + } + + /* + * Return the AirmetRecord record object. + */ + if (record == null) { + return new PluginDataObject[0]; + } else { + return new PluginDataObject[] { record }; + } + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetSeparator.java index 9633eb542d..af210f86ed 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/AirmetSeparator.java @@ -1,138 +1,138 @@ -/** - * AirmetSeparator - * - * This class sets the raw data to an Arraylist, records, of - * String based on a uniquely identified separator. - * - *
    - * L. Lin                               05/2009         Creation
    - * 
    - * - * This code has been developed by the SIB for use in the AWIPS system. - */ - -package gov.noaa.nws.ncep.edex.plugin.airmet.decoder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.edex.util.Util; - -public class AirmetSeparator extends AbstractRecordSeparator { - private final Log logger = LogFactory.getLog(getClass()); - - /** Regex used for separate the bulletins */ - private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; - - /** Regex matcher */ - private Matcher matcher; - - /** Pattern object for regex search */ - private Pattern pattern; - - /** List of records contained in file */ - private List records; - - private Iterator iterator = null; - - /** - * Constructor. - * - */ - public AirmetSeparator() { - records = new ArrayList(); - } - - public static AirmetSeparator separate(byte[] data, Headers headers) { - AirmetSeparator ds = new AirmetSeparator(); - ds.setData(data, headers); - return ds; - } - - public void setData(byte[] data, Headers headers) { - doSeparate(new String(data)); - iterator = records.iterator(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() - */ - public boolean hasNext() { - if (iterator == null) { - return false; - } else { - return iterator.hasNext(); - } - } - - /** - * Get record - */ - public byte[] next() { - try { - String temp = iterator.next(); - if (Util.isEmptyString(temp)) { - return (byte[]) null; - } else { - return temp.getBytes(); - } - } catch (NoSuchElementException e) { - return (byte[]) null; - } - } - - /** - * @param message - * separate bulletins - */ - private void doSeparate(String message) { - /* Regex used for separate the bulletins */ - - try { - pattern = Pattern.compile(BULLSEPARATOR); - matcher = pattern.matcher(message); - - /* - * Set number of bulletins to records only if the bulletin separator - * is not the same. At the point, only separators are stored in - * "records" - */ - while (matcher.find()) { - if (!records.contains(matcher.group())) { - records.add(matcher.group()); - } - } - - /* - * Append the raw data file to the records. - */ - for (int i = 0; i < records.size(); i++) { - if (i < records.size() - 1) { - records.set(i, "\n" - + message.substring( - message.indexOf(records.get(i)), message - .indexOf(records.get(i + 1)))); - } else { - records - .set(i, "\n" - + message.substring(message.indexOf(records - .get(i)))); - } - } - } catch (Exception e) { - logger.warn("No valid records found!", e); - } - return; - } -} +/** + * AirmetSeparator + * + * This class sets the raw data to an Arraylist, records, of + * String based on a uniquely identified separator. + * + *
    + * L. Lin                               05/2009         Creation
    + * 
    + * + * This code has been developed by the SIB for use in the AWIPS system. + */ + +package gov.noaa.nws.ncep.edex.plugin.airmet.decoder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.edex.util.Util; + +public class AirmetSeparator extends AbstractRecordSeparator { + private final Log logger = LogFactory.getLog(getClass()); + + /** Regex used for separate the bulletins */ + private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; + + /** Regex matcher */ + private Matcher matcher; + + /** Pattern object for regex search */ + private Pattern pattern; + + /** List of records contained in file */ + private List records; + + private Iterator iterator = null; + + /** + * Constructor. + * + */ + public AirmetSeparator() { + records = new ArrayList(); + } + + public static AirmetSeparator separate(byte[] data, Headers headers) { + AirmetSeparator ds = new AirmetSeparator(); + ds.setData(data, headers); + return ds; + } + + public void setData(byte[] data, Headers headers) { + doSeparate(new String(data)); + iterator = records.iterator(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() + */ + public boolean hasNext() { + if (iterator == null) { + return false; + } else { + return iterator.hasNext(); + } + } + + /** + * Get record + */ + public byte[] next() { + try { + String temp = iterator.next(); + if (Util.isEmptyString(temp)) { + return (byte[]) null; + } else { + return temp.getBytes(); + } + } catch (NoSuchElementException e) { + return (byte[]) null; + } + } + + /** + * @param message + * separate bulletins + */ + private void doSeparate(String message) { + /* Regex used for separate the bulletins */ + + try { + pattern = Pattern.compile(BULLSEPARATOR); + matcher = pattern.matcher(message); + + /* + * Set number of bulletins to records only if the bulletin separator + * is not the same. At the point, only separators are stored in + * "records" + */ + while (matcher.find()) { + if (!records.contains(matcher.group())) { + records.add(matcher.group()); + } + } + + /* + * Append the raw data file to the records. + */ + for (int i = 0; i < records.size(); i++) { + if (i < records.size() - 1) { + records.set(i, "\n" + + message.substring( + message.indexOf(records.get(i)), message + .indexOf(records.get(i + 1)))); + } else { + records + .set(i, "\n" + + message.substring(message.indexOf(records + .get(i)))); + } + } + } catch (Exception e) { + logger.warn("No valid records found!", e); + } + return; + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/package-info.java old mode 100644 new mode 100755 index 319b08dcd8..248a770b81 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/decoder/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains decoder.java for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.airmet.decoder;; +/** +* Contains decoder.java for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.airmet.decoder;; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/AirmetParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/AirmetParser.java old mode 100644 new mode 100755 index 6ad1b03f3f..990c6c035f --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/AirmetParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/AirmetParser.java @@ -1,682 +1,682 @@ -/** - * Airmet DecoderUtil - * - * This java class intends to serve as a decoder utility for AIRMET. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 05/2009 39 L. Lin Initial coding - * 07/2009 39 L. Lin Migration to TO11 - * 09/2009 39 L. Lin Add latitude/longitude to location table - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.airmet.util; - -import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetLocation; -import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetRecord; -import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetReport; -import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.edex.decodertools.core.LatLonPoint; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class AirmetParser { - - public static final Log logger = LogFactory.getLog(AirmetParser.class); - - /** - * Constructor - */ - public AirmetParser() { - } - - /** - * Parse the WMO line and store WMO header, OfficeID, issue time, - * designatorBBB,... - * - * @param wmoline - * The bulletin message - * - * @return an AirmetRecord - */ - public static AirmetRecord processWMO(String wmoline, Headers headers) { - - AirmetRecord record = null; - // Regular expression for WMO/ICAO, station ID, and issue date (and - // maybe designator BBB) - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; - - // Pattern used for extracting WMO header, officeID, product purge time, - // and issue date and designatorBBB - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(wmoline); - - if (theMatcher.find()) { - record = new AirmetRecord(); - - record.setWmoHeader(theMatcher.group(1)); - record.setIssueOffice(theMatcher.group(2)); - record.setDesignatorBBB(theMatcher.group(5)); - - // Decode the issue time. - Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), headers); - - record.setIssueTime(issueTime); - DataTime dataTime = new DataTime(issueTime); - record.setDataTime(dataTime); - } - return record; - } - - /** - * Obtains reportName as: SIERRA, TANGO or ZULU from a bulletin. - * - * @param bullMessage - * The bulletin message - * @return a string for report type - */ - public static String getReportName(String bullMessage) { - - // Regular expression AIRMET reportName - final String REPORTNAME_EXP = "AIRMET (SIERRA|TANGO|ZULU) "; - - // Pattern used for extracting reportName - final Pattern reportNamePattern = Pattern.compile(REPORTNAME_EXP); - Matcher theMatcher = reportNamePattern.matcher(bullMessage); - - if (theMatcher.find()) { - return theMatcher.group(1); - } else { - return " "; - } - } - - /** - * Obtains updateNumber from a bulletin. - * - * @param bullMessage - * The bulletin message - * @return an integer for update number - */ - public static Integer getUpdateNumber(String bullMessage) { - // default update number - Integer retUpdate = 0; - - // Regular expression update number - final String UPDATE_EXP = "AIRMET (SIERRA|TANGO|ZULU) UPDT ([0-9]{1}) "; - - // Pattern used for extracting update number - final Pattern updatePattern = Pattern.compile(UPDATE_EXP); - Matcher theMatcher = updatePattern.matcher(bullMessage); - - if (theMatcher.find()) { - return Integer.parseInt(theMatcher.group(2).substring(0, 1).trim()); - } else { - return retUpdate; - } - } - - /** - * Obtains correctionFlag from a report - * - * @param bullMessage - * The bulletin message - * @return an integer for correctionFlag 0 for normal, 1 for COR or CC, 2 - * for AMD, 3 for TEST, and 4 for NIL/EXPIRE report - */ - public static Integer getCorrectionFlag(String bullMessage) { - - Integer retCorrection = 0; - - // Regular expression correction - final String CORRECTION_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{2}) ([0-9]{6}) ([A-Z]{3})"; - - // Pattern used for extracting correctionFlag - final Pattern correctionPattern = Pattern.compile(CORRECTION_EXP); - Matcher theMatcher = correctionPattern.matcher(bullMessage); - - if (theMatcher.find()) { - if (theMatcher.group(5).equals("COR")) { - retCorrection = 1; - } else if (theMatcher.group(5).equals("AMD")) { - retCorrection = 2; - } else if ((theMatcher.group(5).substring(0, 2)).equals("CC")) { - retCorrection = 1; - } - } - - // Regular expression TEST message - final String TEST_EXP = " TEST "; - // Pattern used for extracting TEST message - final Pattern testPattern = Pattern.compile(TEST_EXP); - Matcher testMatcher = testPattern.matcher(bullMessage); - if (testMatcher.find()) { - retCorrection = 3; - } - - return retCorrection; - } - - /** - * Obtains cancelFlag from a report - * - * @param bullMessage - * The bulletin message - * @return an integer for cancelFlag 0 for normal and 1 for cancel - */ - public static Integer getCancelFlag(String report) { - - Integer retCancel = 0; - - // Regular expression cancelFlag - final String CANCEL_EXP = "(CANCEL|CNCL) AIRMET"; - - // Pattern used for extracting cancel - final Pattern cancelPattern = Pattern.compile(CANCEL_EXP); - Matcher theMatcher = cancelPattern.matcher(report); - - if (theMatcher.find()) { - retCancel = 1; - } - return retCancel; - } - - /** - * Obtains hazardType as: IFR (instrument flight rules), MO (mountain - * obscuration), TB (turbulence), IC (icing), SW (sustained winds), or WS - * (low level wind shear) from a report. - * - * @param theReport - * Input report message. - * @return a string for class type - */ - public static String getHazardType(String theReport) { - - String retHazardType = " "; - // Regular expression AIRMET classType - final String HAZARDTYPE_EXP = "AIRMET (IFR|MTN OBSCN|TURB|ICE|STG SFC WNDS)"; - final String TYPE2_EXP = "(LLWS POTENTIAL)"; - final String TYPE3_EXP = "(ICE|TURB|CIG BLW|VIS BLW|MTNS|LLWS|SUSTAINED)"; - final String TYPE4_EXP = "(CANCEL|CNCL)"; - - // Pattern used for extracting hazardType - final Pattern classTypePattern = Pattern.compile(HAZARDTYPE_EXP); - final Pattern type2Pattern = Pattern.compile(TYPE2_EXP); - final Pattern type3Pattern = Pattern.compile(TYPE3_EXP); - final Pattern type4Pattern = Pattern.compile(TYPE4_EXP); - - Matcher theMatcher = classTypePattern.matcher(theReport); - Matcher type2Matcher = type2Pattern.matcher(theReport); - Matcher type3Matcher = type3Pattern.matcher(theReport); - Matcher type4Matcher = type4Pattern.matcher(theReport); - - if (theMatcher.find()) { - if (theMatcher.group(1).equals("IFR")) { - retHazardType = "INSTRUMENT FLIGHT RULES"; - } else if (theMatcher.group(1).equals("MTN OBSCN")) { - retHazardType = "MOUNTAIN OBSCURATION"; - } else if (theMatcher.group(1).equals("TURB")) { - retHazardType = "TURBULENCE"; - } else if (theMatcher.group(1).equals("ICE")) { - retHazardType = "ICING"; - } else if (theMatcher.group(1).equals("STG SFC WNDS")) { - retHazardType = "SUSTAINED SFC WINDS"; - } - } else if (type2Matcher.find()) { - if (type2Matcher.group(1).equals("LLWS")) { - retHazardType = "LOW LEVEL WIND SHEAR"; - } - } else if (type3Matcher.find()) { - if (type3Matcher.group(1).equals("ICE")) { - retHazardType = "ICING"; - } else if (type3Matcher.group(1).equals("TURB")) { - retHazardType = "TURBULENCE"; - } else if (type3Matcher.group(1).equals("CIG BLW")) { - retHazardType = "INSTRUMENT FLIGHT RULES"; - } else if (type3Matcher.group(1).equals("VIS BLW")) { - retHazardType = "INSTRUMENT FLIGHT RULES"; - } else if (type3Matcher.group(1).equals("MTNS")) { - retHazardType = "MOUNTAIN OBSCURATION"; - } else if (type3Matcher.group(1).equals("LLWS")) { - retHazardType = "LOW LEVEL WIND SHEAR"; - } else if (type3Matcher.group(1).equals("SUSTAINED")) { - retHazardType = "SUSTAINED SFC WINDS"; - } - } else if (type4Matcher.find()) { - retHazardType = "CANCEL"; - } - - return retHazardType; - } - - /** - * Obtains forecast region as: S for SIERRA, T for TANGO or Z for ZULU from - * an AirmetRecord. - * - * @param record - * The AirmetRecord - * @return a string for forecast region - */ - public static String getRegion(String reportName) { - - String retRegion = null; - String forecastRegion = reportName; - - if (forecastRegion.equals("SIERRA")) { - retRegion = "S"; - } else if (forecastRegion.equals("TANGO")) { - retRegion = "T"; - } else if (forecastRegion.equals("ZULU")) { - retRegion = "Z"; - } - return retRegion; - } - - /** - * process regular section of an AIRMET report - * - * @param theReport - * The reports from bulletin message - * @return an AirmetReport table - */ - public static AirmetReport processReport(String theReport) { - - // Regular expression for flight levels - final String FLIGHT_EXP = " (BTN) (FL)?(FRZLVL|[0-9]{3})( AND |-)FL([0-9]{3})"; - final String BLW_EXP = " (BLW) FL([0-9]{3})"; - - // Pattern used for extracting flight levels - final Pattern flightPattern = Pattern.compile(FLIGHT_EXP); - final Pattern blwPattern = Pattern.compile(BLW_EXP); - - Matcher flightMatcher = flightPattern.matcher(theReport); - Matcher blwMatcher = blwPattern.matcher(theReport); - - AirmetReport currentReport = new AirmetReport(); - // Find and set the flight levels. - if (flightMatcher.find()) { - if (flightMatcher.group(1).equals("BTN")) { - if ((flightMatcher.group(3).equals("FRZLVL"))) { - currentReport.setFlightLevel1("FRZLVL"); - } else { - currentReport.setFlightLevel1(flightMatcher.group(3) - .toString()); - } - currentReport - .setFlightLevel2(flightMatcher.group(5).toString()); - } - } else if (blwMatcher.find()) { - currentReport.setFlightLevel2(blwMatcher.group(2).toString()); - } - // Get and set reportType - currentReport.setHazardType(getHazardType(theReport)); - - // Set reportIndicator - currentReport.setReportIndicator("AIRMET"); - - // Get and set cancel flag - currentReport.setCancelFlag(AirmetParser.getCancelFlag(theReport)); - - // Replace the special characters - currentReport.setSegment(theReport.replace('\r', ' ') - .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - - // Decode the locations - if (!AirmetParser.processLocation(theReport, currentReport)) { - currentReport = null; - } - - return currentReport; - } - - /** - * process the outlook of an AIRMET report. - * - * @param theOutlook - * The outlook section lines from bulletin message - * @return an AirmetReport table - */ - public static AirmetReport processOutLook(String theOutlook, - String forecastRegion) { - - AirmetReport currentOutLook = new AirmetReport(); - - currentOutLook.setSegment(theOutlook.replace('\r', ' ') - .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - - // Get and set hazard type - currentOutLook.setHazardType(getHazardType(theOutlook)); - // Set report indicator. - currentOutLook.setReportIndicator("OUTLOOK"); - - // Decode locations - if (AirmetParser.processLocation(theOutlook, currentOutLook)) { - final String SID_EXP = "AREA ([0-9]{1})"; - - // Pattern used for extracting the number of sequence ID. - final Pattern sidPattern = Pattern.compile(SID_EXP); - - Matcher theMatcher = sidPattern.matcher(theOutlook); - - // Default sequenceID as: 1S, 1T, or 1Z if locations have been - // found. - String sequenceID = "1".concat(forecastRegion); - if (theMatcher.find()) { - // Multiple areas such as: "AREA 1", "AREA 2", ...etc - sequenceID = theMatcher.group(1).concat(forecastRegion); - } - currentOutLook.setSequenceID(sequenceID); - } else { - // Default sequenceID as: 0W, 0C, or 0E if outlook section is a NIL - // report. - String sequenceID = "0".concat(forecastRegion); - currentOutLook.setSequenceID(sequenceID); - } - - // Get and set cancel flag - currentOutLook.setCancelFlag(AirmetParser.getCancelFlag(theOutlook)); - - return currentOutLook; - } - - /** - * Obtains start time from input bulletin. - * - * @param theReport - * The bulletin message - * @return a calendar for start time - */ - public static Calendar getStartTime(String theBulletin, Headers headers) { - - // Regular expression for start time - final String STARTTIME_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{2}) ([0-9]{6})( [A-Z]{3})?"; - - // Pattern used for extracting the starting time - final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); - - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = starttimePattern.matcher(theBulletin); - - if (theMatcher.find()) { - // Get start time - return TimeTools.findDataTime(theMatcher.group(4), headers); - } else { - return null; - } - } - - /** - * Obtains the valid day from input bulletin. - * - * @param theBulletin - * The input bulletin - * @return a string for valid day. - */ - public static String getValidDay(String theBulletin) { - - // Regular expression for the day - final String DAY_EXP = " VALID UNTIL ([0-9]{2})([0-9]{4})"; - // Pattern used for extracting the day - final Pattern dayPattern = Pattern.compile(DAY_EXP); - Matcher theMatcher = dayPattern.matcher(theBulletin); - - String retDay; - - // Get sequence number according to 4-digit of valid time - if (theMatcher.find()) { - retDay = theMatcher.group(1); - } else { - Calendar cal = Calendar.getInstance(); - retDay = Integer.toString(cal.get(Calendar.DAY_OF_MONTH)); - } - return retDay; - } - - /** - * Obtains the sequence ID which is composed by an identifier, a sequence - * number and a series number. - * - * @param theBulletin - * The input bulletin - * @param series - * the series number of the report - * @return a string for sequence ID - */ - public static String getSequenceID(String theBulletin, Integer series) { - - // Regular expression for the sequence number - final String SEQUENCEID_EXP = " VALID UNTIL ([0-9]{2})([0-9]{4})"; - // Pattern used for extracting the sequence number - final Pattern idPattern = Pattern.compile(SEQUENCEID_EXP); - Matcher theMatcher = idPattern.matcher(theBulletin); - - Integer timeGroup; - String seqNumber; - String identifier = "???"; - // Get sequence number according to 4-digit of valid time - if (theMatcher.find()) { - timeGroup = Integer.parseInt(theMatcher.group(2)); - if (timeGroup == 800 | timeGroup == 900) { - seqNumber = "0"; - } else if (timeGroup == 1400 | timeGroup == 1500) { - seqNumber = "2"; - } else if (timeGroup == 2000 | timeGroup == 2100) { - seqNumber = "4"; - } else if (timeGroup == 200 | timeGroup == 300) { - seqNumber = "6"; - } else { - seqNumber = "8"; - } - } else { - seqNumber = "8"; - } - // System.out.println("seqNumber=" + seqNumber); - - // Regular expression for identifier - final String IDENTIFIER_EXP = "([A-Z]{3})(S|Z|T) WA ([0-9]{6})( [A-Z]{3})?"; - ; - // Pattern used for extracting the sequence number - final Pattern identifierPattern = Pattern.compile(IDENTIFIER_EXP); - Matcher idMatcher = identifierPattern.matcher(theBulletin); - // Get identifier - if (idMatcher.find()) { - identifier = idMatcher.group(1); - } - - return identifier.concat(seqNumber).concat(Integer.toString(series)); - } - - /** - * Get the end time - * - * @param theBulletin - * The bulletin which contains end time - * @return a calendar for end time - */ - public static Calendar getEndTime(String theBulletin, Headers headers) { - - // Regular expression for end time - final String ENDTIME_EXP = "VALID UNTIL ([0-9]{6})"; - - // Pattern used for extracting the end time - final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); - - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = endtimePattern.matcher(theBulletin); - - if (theMatcher.find()) { - // get the end time. - return TimeTools.findDataTime(theMatcher.group(1), headers); - } else { - return null; - } - } - - /** - * Find and set valid start time and end time for outlook report. - * - * @param theReport - * The outlook section contains the valid times group - */ - public static void processValidTime(String theReport, - AirmetReport currentOutLook, String validDay, Headers headers) { - - // Regular expression for start time - final String TIMES_EXP = "OTLK VALID ([0-9]{4})-([0-9]{4})"; - - // Pattern used for extracting the starting time and end time - final Pattern starttimePattern = Pattern.compile(TIMES_EXP); - - Calendar startTime = null; - Calendar endTime = null; - - Matcher theMatcher = starttimePattern.matcher(theReport); - - if (theMatcher.find()) { - // Decode the start time and end time; then set them. - startTime = TimeTools.findDataTime(validDay.concat(theMatcher.group(1)), - headers); - - currentOutLook.setStartTime(startTime); - endTime = TimeTools.findDataTime(validDay.concat(theMatcher.group(2)), - headers); - - if (endTime.before(startTime)) { - endTime.add(Calendar.DAY_OF_MONTH, 1); - } - currentOutLook.setEndTime(endTime); - } else { - currentOutLook.setStartTime(startTime); - currentOutLook.setEndTime(endTime); - } - - } - - /** - * Parse the location lines and add location table to the report table if - * any - * - * @param theReport - * The report from bulletin message - * @param reportTable - * The report Table - * @return true if finds any location line - */ - public static Boolean processLocation(String theReport, - AirmetReport reportTable) { - - Boolean hasLocationLine = true; - String locationDelimiter = "-| TO "; - - ArrayList terminationList = new ArrayList(); - terminationList.addAll(Arrays.asList(new String[] { "CIG", "MTNS", - "ICE", "MOD", "LLWS", "SUSTAINED", "VIS", "TURB", "CANCEL", - "CNCL" })); - - Scanner scLines = new Scanner(theReport) - .useDelimiter("FROM|BOUNDED BY"); - - LatLonPoint point = null; - - // throws away the first section which is not the "FROM" location - String locationReport = scLines.next(); - - if (scLines.hasNext()) { - locationReport = scLines.next(); - - Scanner scLocationLine = new Scanner(locationReport) - .useDelimiter("\\x0d\\x0d\\x0a"); - String lines = " "; - String curLine = null; - ArrayList locationList = new ArrayList(); - locationList.clear(); - Boolean notBreak = true; - - while (scLocationLine.hasNext() && notBreak) { - // Get next location line - curLine = scLocationLine.next(); - - Scanner scLocationToken = new Scanner(curLine); - if (scLocationToken.hasNext()) { - // Check the first token from each line - String firstToken = scLocationToken.next(); - if (terminationList.contains(firstToken)) { - // terminate - notBreak = false; - break; - } - } - lines = lines.concat(" ").concat(curLine); - } - - // Clean up the leading space - lines = UtilN.removeLeadingWhiteSpaces(lines); - // Parse the location lines by a "-" or "TO" - Scanner scLocation = new Scanner(lines) - .useDelimiter(locationDelimiter); - locationList.clear(); - // Get all locations - while (scLocation.hasNext()) { - locationList.add(scLocation.next()); - } - - // set locations to data base - Integer idxLocation = 0; - if (locationList.size() > 1) { - for (String Location : locationList) { - AirmetLocation currentLocation = new AirmetLocation(); - currentLocation.setLocationLine(lines); - currentLocation.setLocation(Location); - - // Get a latLonPoint for this station ID from "vors" - // location table - point = LatLonLocTbl.getLatLonPoint(Location, "vors"); - if (point == null) { - hasLocationLine = false; - break; - } - currentLocation.setLatitude(point - .getLatitude(LatLonPoint.INDEGREES)); - currentLocation.setLongitude(point - .getLongitude(LatLonPoint.INDEGREES)); - - currentLocation.setIndex(idxLocation + 1); - idxLocation++; - - reportTable.addAirmetLocation(currentLocation); - } - } else { - hasLocationLine = false; - } - - } else { - hasLocationLine = false; - } - - return hasLocationLine; - } -} +/** + * Airmet DecoderUtil + * + * This java class intends to serve as a decoder utility for AIRMET. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 05/2009 39 L. Lin Initial coding + * 07/2009 39 L. Lin Migration to TO11 + * 09/2009 39 L. Lin Add latitude/longitude to location table + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.airmet.util; + +import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetLocation; +import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetRecord; +import gov.noaa.nws.ncep.common.dataplugin.airmet.AirmetReport; +import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class AirmetParser { + + public static final Log logger = LogFactory.getLog(AirmetParser.class); + + /** + * Constructor + */ + public AirmetParser() { + } + + /** + * Parse the WMO line and store WMO header, OfficeID, issue time, + * designatorBBB,... + * + * @param wmoline + * The bulletin message + * + * @return an AirmetRecord + */ + public static AirmetRecord processWMO(String wmoline, Headers headers) { + + AirmetRecord record = null; + // Regular expression for WMO/ICAO, station ID, and issue date (and + // maybe designator BBB) + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; + + // Pattern used for extracting WMO header, officeID, product purge time, + // and issue date and designatorBBB + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(wmoline); + + if (theMatcher.find()) { + record = new AirmetRecord(); + + record.setWmoHeader(theMatcher.group(1)); + record.setIssueOffice(theMatcher.group(2)); + record.setDesignatorBBB(theMatcher.group(5)); + + // Decode the issue time. + Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), headers); + + record.setIssueTime(issueTime); + DataTime dataTime = new DataTime(issueTime); + record.setDataTime(dataTime); + } + return record; + } + + /** + * Obtains reportName as: SIERRA, TANGO or ZULU from a bulletin. + * + * @param bullMessage + * The bulletin message + * @return a string for report type + */ + public static String getReportName(String bullMessage) { + + // Regular expression AIRMET reportName + final String REPORTNAME_EXP = "AIRMET (SIERRA|TANGO|ZULU) "; + + // Pattern used for extracting reportName + final Pattern reportNamePattern = Pattern.compile(REPORTNAME_EXP); + Matcher theMatcher = reportNamePattern.matcher(bullMessage); + + if (theMatcher.find()) { + return theMatcher.group(1); + } else { + return " "; + } + } + + /** + * Obtains updateNumber from a bulletin. + * + * @param bullMessage + * The bulletin message + * @return an integer for update number + */ + public static Integer getUpdateNumber(String bullMessage) { + // default update number + Integer retUpdate = 0; + + // Regular expression update number + final String UPDATE_EXP = "AIRMET (SIERRA|TANGO|ZULU) UPDT ([0-9]{1}) "; + + // Pattern used for extracting update number + final Pattern updatePattern = Pattern.compile(UPDATE_EXP); + Matcher theMatcher = updatePattern.matcher(bullMessage); + + if (theMatcher.find()) { + return Integer.parseInt(theMatcher.group(2).substring(0, 1).trim()); + } else { + return retUpdate; + } + } + + /** + * Obtains correctionFlag from a report + * + * @param bullMessage + * The bulletin message + * @return an integer for correctionFlag 0 for normal, 1 for COR or CC, 2 + * for AMD, 3 for TEST, and 4 for NIL/EXPIRE report + */ + public static Integer getCorrectionFlag(String bullMessage) { + + Integer retCorrection = 0; + + // Regular expression correction + final String CORRECTION_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{2}) ([0-9]{6}) ([A-Z]{3})"; + + // Pattern used for extracting correctionFlag + final Pattern correctionPattern = Pattern.compile(CORRECTION_EXP); + Matcher theMatcher = correctionPattern.matcher(bullMessage); + + if (theMatcher.find()) { + if (theMatcher.group(5).equals("COR")) { + retCorrection = 1; + } else if (theMatcher.group(5).equals("AMD")) { + retCorrection = 2; + } else if ((theMatcher.group(5).substring(0, 2)).equals("CC")) { + retCorrection = 1; + } + } + + // Regular expression TEST message + final String TEST_EXP = " TEST "; + // Pattern used for extracting TEST message + final Pattern testPattern = Pattern.compile(TEST_EXP); + Matcher testMatcher = testPattern.matcher(bullMessage); + if (testMatcher.find()) { + retCorrection = 3; + } + + return retCorrection; + } + + /** + * Obtains cancelFlag from a report + * + * @param bullMessage + * The bulletin message + * @return an integer for cancelFlag 0 for normal and 1 for cancel + */ + public static Integer getCancelFlag(String report) { + + Integer retCancel = 0; + + // Regular expression cancelFlag + final String CANCEL_EXP = "(CANCEL|CNCL) AIRMET"; + + // Pattern used for extracting cancel + final Pattern cancelPattern = Pattern.compile(CANCEL_EXP); + Matcher theMatcher = cancelPattern.matcher(report); + + if (theMatcher.find()) { + retCancel = 1; + } + return retCancel; + } + + /** + * Obtains hazardType as: IFR (instrument flight rules), MO (mountain + * obscuration), TB (turbulence), IC (icing), SW (sustained winds), or WS + * (low level wind shear) from a report. + * + * @param theReport + * Input report message. + * @return a string for class type + */ + public static String getHazardType(String theReport) { + + String retHazardType = " "; + // Regular expression AIRMET classType + final String HAZARDTYPE_EXP = "AIRMET (IFR|MTN OBSCN|TURB|ICE|STG SFC WNDS)"; + final String TYPE2_EXP = "(LLWS POTENTIAL)"; + final String TYPE3_EXP = "(ICE|TURB|CIG BLW|VIS BLW|MTNS|LLWS|SUSTAINED)"; + final String TYPE4_EXP = "(CANCEL|CNCL)"; + + // Pattern used for extracting hazardType + final Pattern classTypePattern = Pattern.compile(HAZARDTYPE_EXP); + final Pattern type2Pattern = Pattern.compile(TYPE2_EXP); + final Pattern type3Pattern = Pattern.compile(TYPE3_EXP); + final Pattern type4Pattern = Pattern.compile(TYPE4_EXP); + + Matcher theMatcher = classTypePattern.matcher(theReport); + Matcher type2Matcher = type2Pattern.matcher(theReport); + Matcher type3Matcher = type3Pattern.matcher(theReport); + Matcher type4Matcher = type4Pattern.matcher(theReport); + + if (theMatcher.find()) { + if (theMatcher.group(1).equals("IFR")) { + retHazardType = "INSTRUMENT FLIGHT RULES"; + } else if (theMatcher.group(1).equals("MTN OBSCN")) { + retHazardType = "MOUNTAIN OBSCURATION"; + } else if (theMatcher.group(1).equals("TURB")) { + retHazardType = "TURBULENCE"; + } else if (theMatcher.group(1).equals("ICE")) { + retHazardType = "ICING"; + } else if (theMatcher.group(1).equals("STG SFC WNDS")) { + retHazardType = "SUSTAINED SFC WINDS"; + } + } else if (type2Matcher.find()) { + if (type2Matcher.group(1).equals("LLWS")) { + retHazardType = "LOW LEVEL WIND SHEAR"; + } + } else if (type3Matcher.find()) { + if (type3Matcher.group(1).equals("ICE")) { + retHazardType = "ICING"; + } else if (type3Matcher.group(1).equals("TURB")) { + retHazardType = "TURBULENCE"; + } else if (type3Matcher.group(1).equals("CIG BLW")) { + retHazardType = "INSTRUMENT FLIGHT RULES"; + } else if (type3Matcher.group(1).equals("VIS BLW")) { + retHazardType = "INSTRUMENT FLIGHT RULES"; + } else if (type3Matcher.group(1).equals("MTNS")) { + retHazardType = "MOUNTAIN OBSCURATION"; + } else if (type3Matcher.group(1).equals("LLWS")) { + retHazardType = "LOW LEVEL WIND SHEAR"; + } else if (type3Matcher.group(1).equals("SUSTAINED")) { + retHazardType = "SUSTAINED SFC WINDS"; + } + } else if (type4Matcher.find()) { + retHazardType = "CANCEL"; + } + + return retHazardType; + } + + /** + * Obtains forecast region as: S for SIERRA, T for TANGO or Z for ZULU from + * an AirmetRecord. + * + * @param record + * The AirmetRecord + * @return a string for forecast region + */ + public static String getRegion(String reportName) { + + String retRegion = null; + String forecastRegion = reportName; + + if (forecastRegion.equals("SIERRA")) { + retRegion = "S"; + } else if (forecastRegion.equals("TANGO")) { + retRegion = "T"; + } else if (forecastRegion.equals("ZULU")) { + retRegion = "Z"; + } + return retRegion; + } + + /** + * process regular section of an AIRMET report + * + * @param theReport + * The reports from bulletin message + * @return an AirmetReport table + */ + public static AirmetReport processReport(String theReport) { + + // Regular expression for flight levels + final String FLIGHT_EXP = " (BTN) (FL)?(FRZLVL|[0-9]{3})( AND |-)FL([0-9]{3})"; + final String BLW_EXP = " (BLW) FL([0-9]{3})"; + + // Pattern used for extracting flight levels + final Pattern flightPattern = Pattern.compile(FLIGHT_EXP); + final Pattern blwPattern = Pattern.compile(BLW_EXP); + + Matcher flightMatcher = flightPattern.matcher(theReport); + Matcher blwMatcher = blwPattern.matcher(theReport); + + AirmetReport currentReport = new AirmetReport(); + // Find and set the flight levels. + if (flightMatcher.find()) { + if (flightMatcher.group(1).equals("BTN")) { + if ((flightMatcher.group(3).equals("FRZLVL"))) { + currentReport.setFlightLevel1("FRZLVL"); + } else { + currentReport.setFlightLevel1(flightMatcher.group(3) + .toString()); + } + currentReport + .setFlightLevel2(flightMatcher.group(5).toString()); + } + } else if (blwMatcher.find()) { + currentReport.setFlightLevel2(blwMatcher.group(2).toString()); + } + // Get and set reportType + currentReport.setHazardType(getHazardType(theReport)); + + // Set reportIndicator + currentReport.setReportIndicator("AIRMET"); + + // Get and set cancel flag + currentReport.setCancelFlag(AirmetParser.getCancelFlag(theReport)); + + // Replace the special characters + currentReport.setSegment(theReport.replace('\r', ' ') + .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + + // Decode the locations + if (!AirmetParser.processLocation(theReport, currentReport)) { + currentReport = null; + } + + return currentReport; + } + + /** + * process the outlook of an AIRMET report. + * + * @param theOutlook + * The outlook section lines from bulletin message + * @return an AirmetReport table + */ + public static AirmetReport processOutLook(String theOutlook, + String forecastRegion) { + + AirmetReport currentOutLook = new AirmetReport(); + + currentOutLook.setSegment(theOutlook.replace('\r', ' ') + .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + + // Get and set hazard type + currentOutLook.setHazardType(getHazardType(theOutlook)); + // Set report indicator. + currentOutLook.setReportIndicator("OUTLOOK"); + + // Decode locations + if (AirmetParser.processLocation(theOutlook, currentOutLook)) { + final String SID_EXP = "AREA ([0-9]{1})"; + + // Pattern used for extracting the number of sequence ID. + final Pattern sidPattern = Pattern.compile(SID_EXP); + + Matcher theMatcher = sidPattern.matcher(theOutlook); + + // Default sequenceID as: 1S, 1T, or 1Z if locations have been + // found. + String sequenceID = "1".concat(forecastRegion); + if (theMatcher.find()) { + // Multiple areas such as: "AREA 1", "AREA 2", ...etc + sequenceID = theMatcher.group(1).concat(forecastRegion); + } + currentOutLook.setSequenceID(sequenceID); + } else { + // Default sequenceID as: 0W, 0C, or 0E if outlook section is a NIL + // report. + String sequenceID = "0".concat(forecastRegion); + currentOutLook.setSequenceID(sequenceID); + } + + // Get and set cancel flag + currentOutLook.setCancelFlag(AirmetParser.getCancelFlag(theOutlook)); + + return currentOutLook; + } + + /** + * Obtains start time from input bulletin. + * + * @param theReport + * The bulletin message + * @return a calendar for start time + */ + public static Calendar getStartTime(String theBulletin, Headers headers) { + + // Regular expression for start time + final String STARTTIME_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{2}) ([0-9]{6})( [A-Z]{3})?"; + + // Pattern used for extracting the starting time + final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); + + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = starttimePattern.matcher(theBulletin); + + if (theMatcher.find()) { + // Get start time + return TimeTools.findDataTime(theMatcher.group(4), headers); + } else { + return null; + } + } + + /** + * Obtains the valid day from input bulletin. + * + * @param theBulletin + * The input bulletin + * @return a string for valid day. + */ + public static String getValidDay(String theBulletin) { + + // Regular expression for the day + final String DAY_EXP = " VALID UNTIL ([0-9]{2})([0-9]{4})"; + // Pattern used for extracting the day + final Pattern dayPattern = Pattern.compile(DAY_EXP); + Matcher theMatcher = dayPattern.matcher(theBulletin); + + String retDay; + + // Get sequence number according to 4-digit of valid time + if (theMatcher.find()) { + retDay = theMatcher.group(1); + } else { + Calendar cal = Calendar.getInstance(); + retDay = Integer.toString(cal.get(Calendar.DAY_OF_MONTH)); + } + return retDay; + } + + /** + * Obtains the sequence ID which is composed by an identifier, a sequence + * number and a series number. + * + * @param theBulletin + * The input bulletin + * @param series + * the series number of the report + * @return a string for sequence ID + */ + public static String getSequenceID(String theBulletin, Integer series) { + + // Regular expression for the sequence number + final String SEQUENCEID_EXP = " VALID UNTIL ([0-9]{2})([0-9]{4})"; + // Pattern used for extracting the sequence number + final Pattern idPattern = Pattern.compile(SEQUENCEID_EXP); + Matcher theMatcher = idPattern.matcher(theBulletin); + + Integer timeGroup; + String seqNumber; + String identifier = "???"; + // Get sequence number according to 4-digit of valid time + if (theMatcher.find()) { + timeGroup = Integer.parseInt(theMatcher.group(2)); + if (timeGroup == 800 | timeGroup == 900) { + seqNumber = "0"; + } else if (timeGroup == 1400 | timeGroup == 1500) { + seqNumber = "2"; + } else if (timeGroup == 2000 | timeGroup == 2100) { + seqNumber = "4"; + } else if (timeGroup == 200 | timeGroup == 300) { + seqNumber = "6"; + } else { + seqNumber = "8"; + } + } else { + seqNumber = "8"; + } + // System.out.println("seqNumber=" + seqNumber); + + // Regular expression for identifier + final String IDENTIFIER_EXP = "([A-Z]{3})(S|Z|T) WA ([0-9]{6})( [A-Z]{3})?"; + ; + // Pattern used for extracting the sequence number + final Pattern identifierPattern = Pattern.compile(IDENTIFIER_EXP); + Matcher idMatcher = identifierPattern.matcher(theBulletin); + // Get identifier + if (idMatcher.find()) { + identifier = idMatcher.group(1); + } + + return identifier.concat(seqNumber).concat(Integer.toString(series)); + } + + /** + * Get the end time + * + * @param theBulletin + * The bulletin which contains end time + * @return a calendar for end time + */ + public static Calendar getEndTime(String theBulletin, Headers headers) { + + // Regular expression for end time + final String ENDTIME_EXP = "VALID UNTIL ([0-9]{6})"; + + // Pattern used for extracting the end time + final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); + + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = endtimePattern.matcher(theBulletin); + + if (theMatcher.find()) { + // get the end time. + return TimeTools.findDataTime(theMatcher.group(1), headers); + } else { + return null; + } + } + + /** + * Find and set valid start time and end time for outlook report. + * + * @param theReport + * The outlook section contains the valid times group + */ + public static void processValidTime(String theReport, + AirmetReport currentOutLook, String validDay, Headers headers) { + + // Regular expression for start time + final String TIMES_EXP = "OTLK VALID ([0-9]{4})-([0-9]{4})"; + + // Pattern used for extracting the starting time and end time + final Pattern starttimePattern = Pattern.compile(TIMES_EXP); + + Calendar startTime = null; + Calendar endTime = null; + + Matcher theMatcher = starttimePattern.matcher(theReport); + + if (theMatcher.find()) { + // Decode the start time and end time; then set them. + startTime = TimeTools.findDataTime(validDay.concat(theMatcher.group(1)), + headers); + + currentOutLook.setStartTime(startTime); + endTime = TimeTools.findDataTime(validDay.concat(theMatcher.group(2)), + headers); + + if (endTime.before(startTime)) { + endTime.add(Calendar.DAY_OF_MONTH, 1); + } + currentOutLook.setEndTime(endTime); + } else { + currentOutLook.setStartTime(startTime); + currentOutLook.setEndTime(endTime); + } + + } + + /** + * Parse the location lines and add location table to the report table if + * any + * + * @param theReport + * The report from bulletin message + * @param reportTable + * The report Table + * @return true if finds any location line + */ + public static Boolean processLocation(String theReport, + AirmetReport reportTable) { + + Boolean hasLocationLine = true; + String locationDelimiter = "-| TO "; + + ArrayList terminationList = new ArrayList(); + terminationList.addAll(Arrays.asList(new String[] { "CIG", "MTNS", + "ICE", "MOD", "LLWS", "SUSTAINED", "VIS", "TURB", "CANCEL", + "CNCL" })); + + Scanner scLines = new Scanner(theReport) + .useDelimiter("FROM|BOUNDED BY"); + + LatLonPoint point = null; + + // throws away the first section which is not the "FROM" location + String locationReport = scLines.next(); + + if (scLines.hasNext()) { + locationReport = scLines.next(); + + Scanner scLocationLine = new Scanner(locationReport) + .useDelimiter("\\x0d\\x0d\\x0a"); + String lines = " "; + String curLine = null; + ArrayList locationList = new ArrayList(); + locationList.clear(); + Boolean notBreak = true; + + while (scLocationLine.hasNext() && notBreak) { + // Get next location line + curLine = scLocationLine.next(); + + Scanner scLocationToken = new Scanner(curLine); + if (scLocationToken.hasNext()) { + // Check the first token from each line + String firstToken = scLocationToken.next(); + if (terminationList.contains(firstToken)) { + // terminate + notBreak = false; + break; + } + } + lines = lines.concat(" ").concat(curLine); + } + + // Clean up the leading space + lines = UtilN.removeLeadingWhiteSpaces(lines); + // Parse the location lines by a "-" or "TO" + Scanner scLocation = new Scanner(lines) + .useDelimiter(locationDelimiter); + locationList.clear(); + // Get all locations + while (scLocation.hasNext()) { + locationList.add(scLocation.next()); + } + + // set locations to data base + Integer idxLocation = 0; + if (locationList.size() > 1) { + for (String Location : locationList) { + AirmetLocation currentLocation = new AirmetLocation(); + currentLocation.setLocationLine(lines); + currentLocation.setLocation(Location); + + // Get a latLonPoint for this station ID from "vors" + // location table + point = LatLonLocTbl.getLatLonPoint(Location, "vors"); + if (point == null) { + hasLocationLine = false; + break; + } + currentLocation.setLatitude(point + .getLatitude(LatLonPoint.INDEGREES)); + currentLocation.setLongitude(point + .getLongitude(LatLonPoint.INDEGREES)); + + currentLocation.setIndex(idxLocation + 1); + idxLocation++; + + reportTable.addAirmetLocation(currentLocation); + } + } else { + hasLocationLine = false; + } + + } else { + hasLocationLine = false; + } + + return hasLocationLine; + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/package-info.java old mode 100644 new mode 100755 index 8610c59fa0..9e3a2d3ca7 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/src/gov/noaa/nws/ncep/edex/plugin/airmet/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.airmet.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.airmet.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.atcf/gov.noaa.nws.ncep.edex.plugin.atcf.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.atcf/gov.noaa.nws.ncep.edex.plugin.atcf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.atcf/src/gov/noaa/nws/ncep/edex/plugin/atcf/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.atcf/src/gov/noaa/nws/ncep/edex/plugin/atcf/decoder/package-info.java index 8d0596b010..af42c2466d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.atcf/src/gov/noaa/nws/ncep/edex/plugin/atcf/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.atcf/src/gov/noaa/nws/ncep/edex/plugin/atcf/decoder/package-info.java @@ -1,7 +1,7 @@ -/** - * SGWH implementation of the plugin pattern. - * - * Package includes classes to decode the ATCF message and persist the data. - * - */ +/** + * SGWH implementation of the plugin pattern. + * + * Package includes classes to decode the ATCF message and persist the data. + * + */ package gov.noaa.nws.ncep.edex.plugin.atcf.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.aww/gov.noaa.nws.ncep.edex.plugin.aww.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.aww/gov.noaa.nws.ncep.edex.plugin.aww.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/package-info.java index 19e4ac5b2d..41f6ec50f7 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/package-info.java @@ -1,7 +1,7 @@ -/** - * AWW implementation of the plugin pattern. - * - * Package includes classes to decode the AWW message and persist the data. - * - */ +/** + * AWW implementation of the plugin pattern. + * + * Package includes classes to decode the AWW message and persist the data. + * + */ package gov.noaa.nws.ncep.edex.plugin.aww.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/component-deploy.xml old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/component-deploy.xml index 777cd43ee3..ba134e3ea9 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/component-deploy.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/component-deploy.xml @@ -1,7 +1,7 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml index 4e0c093444..296212af97 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml index 57168d5fda..cc09493589 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml @@ -1,73 +1,73 @@ - - - - - - - - - - - - - - - - - - - - - - - - - convsigmet - - - - - - - - - - - - - java.lang.Throwable - - - - - - - java.lang.Throwable - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + convsigmet + + + + + + + + + + + + + java.lang.Throwable + + + + + + + java.lang.Throwable + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java index a36a91d10e..c36de12282 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java @@ -1,256 +1,256 @@ -/** - * - * Convective Sigmet Decoder - * - * This java class decodes CONVSIGMET (convective sigmet) raw data. - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 06/2009 87/114 L. Lin Increase size of locationLine and location - * and generalize method "processLocation". - * 07/2009 87/114 L. Lin Migration to TO11 - * 07/2011 87/114 F. J. Yen Fix for RTN TTR 9973--ConvSigmet Decoder Ignoring - * time range--implemented fix from Steven Harris, - * RTN to set the end time range - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; - -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; -import gov.noaa.nws.ncep.edex.plugin.convsigmet.util.ConvSigmetParser; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Scanner; - -import com.raytheon.edex.esb.Headers; -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.uf.common.time.TimeRange; -import com.raytheon.uf.edex.decodertools.core.IDecoderConstants; - -public class ConvSigmetDecoder extends AbstractDecoder { - - private final String pluginName; - - /** - * Constructor - * - * @throws DecoderException - */ - public ConvSigmetDecoder(String name) throws DecoderException { - pluginName = name; - } - - public PluginDataObject[] decode(byte[] data, Headers headers) - throws DecoderException { - - String traceId = ""; - if (headers != null) { - traceId = (String) headers.get("traceId"); - } - - String sectionDelim = "OUTLOOK|CONVECTIVE"; - String etx = IDecoderConstants.ETX; - String theBulletin = null; - - String region = null; - Calendar startTime = null; - byte[] messageData = null; - - ConvSigmetRecord record = null; - - ConvSigmetSeparator sep = ConvSigmetSeparator.separate(data, headers); - messageData = sep.next(); - String theMessage = new String(messageData); - - /* - * May have multiple duplicate bulletins, only get the first bulletin - * and eliminate the remaining bulletins after the first bulletin. - */ - Scanner cc = new Scanner(theMessage).useDelimiter(etx); - if (cc.hasNext()) { - theBulletin = cc.next(); - } else { - theBulletin = theMessage; - } - - // record = new ConvsigmetRecord(); - // Decode and set WMO line - record = ConvSigmetParser.processWMO(theBulletin, headers); - - // Decode the forecast region such as: W, C, or E - region = ConvSigmetParser.processFcstRegion(theBulletin); - String forecastRegion = "SIG".concat(region); - - /* - * Check the Convsigmet record object. If not, throws exception. - */ - if (record != null) { - record.setTraceId(traceId); - record.setPluginName(pluginName); - record.setReportType(pluginName); - record.setForecastRegion(forecastRegion); - try { - record.constructDataURI(); - } catch (PluginException e) { - logger.error("Error constructing dataURI", e); - record = null; - } - } - - if (record != null) { - try { - // Replace special characters to a blank so that it may be - // readable - record.setBullMessage(UtilN - .removeLeadingWhiteSpaces((theBulletin.substring(5)) - .replace('\036', ' ').replace('\r', ' ') - .replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' '))); - - // Decode the starting time - startTime = ConvSigmetParser.processStartTime(theBulletin, - headers); - - // Decode the correction flag and set - Boolean correctionFlag = ConvSigmetParser - .processCorrectionFlag(theBulletin); - Integer correction = 0; - if (correctionFlag) { - correction = 1; - } - record.setCorrectionFlag(correction); - - /* - * Break the bulletin message into sections by a "OUTLOOK" or - * "CONVECTIVE". - */ - Scanner sc = new Scanner(theBulletin) - .useDelimiter(sectionDelim); - - ArrayList segmentList = new ArrayList(); - segmentList.clear(); - while (sc.hasNext()) { - String segment = sc.next(); - segmentList.add(segment); - } - - Calendar issueTime = record.getIssueTime(); - /* - * process each section in a order of section and location line - */ - Calendar min = null; - Calendar max = null; - for (String segment : segmentList) { - - // starts a new section - Scanner sc2 = new Scanner(segment); - String whatSection = sc2.next(); - if (whatSection.equals("SIGMET") - || whatSection.equals("SIGMET...NONE")) { - segment = "CONVECTIVE".concat(segment); - - // process this section which starts with - // "CONVECTIVE SIGMET". - ConvSigmetSection section = ConvSigmetParser - .processSection(segment, issueTime, startTime, - region, headers); - record.addConvSigmetSection(section); - - // keep track of time range - if (min == null || min.getTime().after(section.getStartTime().getTime())) { - min = section.getStartTime(); - } - if (max == null || max.getTime().before(section.getEndTime().getTime())) { - max = section.getEndTime(); - } - } else if (whatSection.equals("VALID")) { - segment = "OUTLOOK".concat(segment); - - // process this section which starts with - // "OUTLOOK VALID". - Scanner scOutlook = new Scanner(segment) - .useDelimiter("AREA "); - ArrayList outlookList = new ArrayList(); - outlookList.clear(); - - // Check if "OUTLOOK" section contains more than one - // "AREA". - while (scOutlook.hasNext()) { - String outlookSegment = scOutlook.next(); - outlookList.add(outlookSegment); - } - - if (outlookList.size() <= 1) { - // only one "AREA" or NIL report - ConvSigmetSection outlook = ConvSigmetParser - .processOutLook(segment, region, headers); - record.addConvSigmetSection(outlook); - if (min == null || min.getTime().after(outlook.getStartTime().getTime())) { - min = outlook.getStartTime(); - } - if (max == null || max.getTime().before(outlook.getEndTime().getTime())) { - max = outlook.getEndTime(); - } - } else { - /* - * Here are more than one outlook areas Store the - * header section and remove it from the outlook - * list - */ - String outlookHeader = outlookList.get(0); - outlookList.remove(outlookHeader); - // process multiple outlook sections - for (String outlookSection : outlookList) { - outlookSection = outlookHeader.concat("AREA ") - .concat(outlookSection); - ConvSigmetSection outlook = ConvSigmetParser - .processOutLook(outlookSection, region, - headers); - record.addConvSigmetSection(outlook); - if (min == null || min.getTime().after( - outlook.getStartTime().getTime())) { - min = outlook.getStartTime(); - } - if (max == null || max.getTime().before( - outlook.getEndTime().getTime())) { - max = outlook.getEndTime(); - } - } - } - } - } - record.setDataTime(new DataTime(record.getDataTime().getRefTimeAsCalendar(), - new TimeRange(min.getTime(), - max.getTimeInMillis() - min.getTimeInMillis()))); - } catch (Exception e) { - logger.error("Error processing decoded sigmet", e); - record = null; - } - } - - /* - * Return the ConvsigmetRecord record object. - */ - if (record == null) { - return new PluginDataObject[0]; - } else { - return new PluginDataObject[] { record }; - } - - } - -} +/** + * + * Convective Sigmet Decoder + * + * This java class decodes CONVSIGMET (convective sigmet) raw data. + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2009 87/114 L. Lin Initial coding + * 06/2009 87/114 L. Lin Increase size of locationLine and location + * and generalize method "processLocation". + * 07/2009 87/114 L. Lin Migration to TO11 + * 07/2011 87/114 F. J. Yen Fix for RTN TTR 9973--ConvSigmet Decoder Ignoring + * time range--implemented fix from Steven Harris, + * RTN to set the end time range + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; + +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; +import gov.noaa.nws.ncep.edex.plugin.convsigmet.util.ConvSigmetParser; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Scanner; + +import com.raytheon.edex.esb.Headers; +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.uf.common.time.TimeRange; +import com.raytheon.uf.edex.decodertools.core.IDecoderConstants; + +public class ConvSigmetDecoder extends AbstractDecoder { + + private final String pluginName; + + /** + * Constructor + * + * @throws DecoderException + */ + public ConvSigmetDecoder(String name) throws DecoderException { + pluginName = name; + } + + public PluginDataObject[] decode(byte[] data, Headers headers) + throws DecoderException { + + String traceId = ""; + if (headers != null) { + traceId = (String) headers.get("traceId"); + } + + String sectionDelim = "OUTLOOK|CONVECTIVE"; + String etx = IDecoderConstants.ETX; + String theBulletin = null; + + String region = null; + Calendar startTime = null; + byte[] messageData = null; + + ConvSigmetRecord record = null; + + ConvSigmetSeparator sep = ConvSigmetSeparator.separate(data, headers); + messageData = sep.next(); + String theMessage = new String(messageData); + + /* + * May have multiple duplicate bulletins, only get the first bulletin + * and eliminate the remaining bulletins after the first bulletin. + */ + Scanner cc = new Scanner(theMessage).useDelimiter(etx); + if (cc.hasNext()) { + theBulletin = cc.next(); + } else { + theBulletin = theMessage; + } + + // record = new ConvsigmetRecord(); + // Decode and set WMO line + record = ConvSigmetParser.processWMO(theBulletin, headers); + + // Decode the forecast region such as: W, C, or E + region = ConvSigmetParser.processFcstRegion(theBulletin); + String forecastRegion = "SIG".concat(region); + + /* + * Check the Convsigmet record object. If not, throws exception. + */ + if (record != null) { + record.setTraceId(traceId); + record.setPluginName(pluginName); + record.setReportType(pluginName); + record.setForecastRegion(forecastRegion); + try { + record.constructDataURI(); + } catch (PluginException e) { + logger.error("Error constructing dataURI", e); + record = null; + } + } + + if (record != null) { + try { + // Replace special characters to a blank so that it may be + // readable + record.setBullMessage(UtilN + .removeLeadingWhiteSpaces((theBulletin.substring(5)) + .replace('\036', ' ').replace('\r', ' ') + .replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' '))); + + // Decode the starting time + startTime = ConvSigmetParser.processStartTime(theBulletin, + headers); + + // Decode the correction flag and set + Boolean correctionFlag = ConvSigmetParser + .processCorrectionFlag(theBulletin); + Integer correction = 0; + if (correctionFlag) { + correction = 1; + } + record.setCorrectionFlag(correction); + + /* + * Break the bulletin message into sections by a "OUTLOOK" or + * "CONVECTIVE". + */ + Scanner sc = new Scanner(theBulletin) + .useDelimiter(sectionDelim); + + ArrayList segmentList = new ArrayList(); + segmentList.clear(); + while (sc.hasNext()) { + String segment = sc.next(); + segmentList.add(segment); + } + + Calendar issueTime = record.getIssueTime(); + /* + * process each section in a order of section and location line + */ + Calendar min = null; + Calendar max = null; + for (String segment : segmentList) { + + // starts a new section + Scanner sc2 = new Scanner(segment); + String whatSection = sc2.next(); + if (whatSection.equals("SIGMET") + || whatSection.equals("SIGMET...NONE")) { + segment = "CONVECTIVE".concat(segment); + + // process this section which starts with + // "CONVECTIVE SIGMET". + ConvSigmetSection section = ConvSigmetParser + .processSection(segment, issueTime, startTime, + region, headers); + record.addConvSigmetSection(section); + + // keep track of time range + if (min == null || min.getTime().after(section.getStartTime().getTime())) { + min = section.getStartTime(); + } + if (max == null || max.getTime().before(section.getEndTime().getTime())) { + max = section.getEndTime(); + } + } else if (whatSection.equals("VALID")) { + segment = "OUTLOOK".concat(segment); + + // process this section which starts with + // "OUTLOOK VALID". + Scanner scOutlook = new Scanner(segment) + .useDelimiter("AREA "); + ArrayList outlookList = new ArrayList(); + outlookList.clear(); + + // Check if "OUTLOOK" section contains more than one + // "AREA". + while (scOutlook.hasNext()) { + String outlookSegment = scOutlook.next(); + outlookList.add(outlookSegment); + } + + if (outlookList.size() <= 1) { + // only one "AREA" or NIL report + ConvSigmetSection outlook = ConvSigmetParser + .processOutLook(segment, region, headers); + record.addConvSigmetSection(outlook); + if (min == null || min.getTime().after(outlook.getStartTime().getTime())) { + min = outlook.getStartTime(); + } + if (max == null || max.getTime().before(outlook.getEndTime().getTime())) { + max = outlook.getEndTime(); + } + } else { + /* + * Here are more than one outlook areas Store the + * header section and remove it from the outlook + * list + */ + String outlookHeader = outlookList.get(0); + outlookList.remove(outlookHeader); + // process multiple outlook sections + for (String outlookSection : outlookList) { + outlookSection = outlookHeader.concat("AREA ") + .concat(outlookSection); + ConvSigmetSection outlook = ConvSigmetParser + .processOutLook(outlookSection, region, + headers); + record.addConvSigmetSection(outlook); + if (min == null || min.getTime().after( + outlook.getStartTime().getTime())) { + min = outlook.getStartTime(); + } + if (max == null || max.getTime().before( + outlook.getEndTime().getTime())) { + max = outlook.getEndTime(); + } + } + } + } + } + record.setDataTime(new DataTime(record.getDataTime().getRefTimeAsCalendar(), + new TimeRange(min.getTime(), + max.getTimeInMillis() - min.getTimeInMillis()))); + } catch (Exception e) { + logger.error("Error processing decoded sigmet", e); + record = null; + } + } + + /* + * Return the ConvsigmetRecord record object. + */ + if (record == null) { + return new PluginDataObject[0]; + } else { + return new PluginDataObject[] { record }; + } + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java index 507e9f59cc..da0b868bd5 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java @@ -1,145 +1,145 @@ -/** - * ConvsigmetSeparator - * - * This class sets the raw data to an Arraylist, records, of - * String based on a uniquely identified separator. - * - *
    - * L. Lin                               03/2009         Creation
    - * 
    - * - * This code has been developed by the SIB for use in the AWIPS system. - */ - -package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.edex.util.Util; - -public class ConvSigmetSeparator extends AbstractRecordSeparator { - private final Log logger = LogFactory.getLog(getClass()); - - /** Regex used for separate the bulletins */ - private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; - - /** Regex matcher */ - private Matcher matcher; - - /** Pattern object for regex search */ - private Pattern pattern; - - /** List of records contained in file */ - private List records; - - private Iterator iterator = null; - - /** - * Constructor. - * - */ - public ConvSigmetSeparator() { - records = new ArrayList(); - } - - public static ConvSigmetSeparator separate(byte[] data, Headers headers) { - ConvSigmetSeparator ds = new ConvSigmetSeparator(); - ds.setData(data, headers); - return ds; - } - - public void setData(byte[] data, Headers headers) { - doSeparate(new String(data)); - iterator = records.iterator(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() - */ - public boolean hasNext() { - if (iterator == null) { - return false; - } else { - return iterator.hasNext(); - } - } - - /** - * Get record - */ - public byte[] next() { - try { - String temp = iterator.next(); - if (Util.isEmptyString(temp)) { - return (byte[]) null; - } else { - return temp.getBytes(); - } - } catch (NoSuchElementException e) { - return (byte[]) null; - } - } - - /** - * @param message - * separate bulletins - */ - private void doSeparate(String message) { - /* Regex used for separate the bulletins */ - - try { - pattern = Pattern.compile(BULLSEPARATOR); - matcher = pattern.matcher(message); - - /* - * Set number of bulletins to records only if the bulletin separator - * is not the same. At the point, only separators are stored in - * "records" - */ - while (matcher.find()) { - if (!records.contains(matcher.group())) { - records.add(matcher.group()); - } - } - - /* - * Append the raw data file to the records. - */ - for (int i = 0; i < records.size(); i++) { - if (i < records.size() - 1) { - records.set( - i, - "\n" - + message.substring( - message.indexOf(records.get(i)), - message.indexOf(records.get(i + 1)))); - } else { - records.set( - i, - "\n" - + message.substring(message.indexOf(records - .get(i)))); - } - } - } catch (Exception e) { - e.printStackTrace(); - if (logger.isInfoEnabled()) { - logger.info("No valid records found!"); - } - logger.warn("No valid records found!"); - } - return; - } -} +/** + * ConvsigmetSeparator + * + * This class sets the raw data to an Arraylist, records, of + * String based on a uniquely identified separator. + * + *
    + * L. Lin                               03/2009         Creation
    + * 
    + * + * This code has been developed by the SIB for use in the AWIPS system. + */ + +package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.edex.util.Util; + +public class ConvSigmetSeparator extends AbstractRecordSeparator { + private final Log logger = LogFactory.getLog(getClass()); + + /** Regex used for separate the bulletins */ + private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; + + /** Regex matcher */ + private Matcher matcher; + + /** Pattern object for regex search */ + private Pattern pattern; + + /** List of records contained in file */ + private List records; + + private Iterator iterator = null; + + /** + * Constructor. + * + */ + public ConvSigmetSeparator() { + records = new ArrayList(); + } + + public static ConvSigmetSeparator separate(byte[] data, Headers headers) { + ConvSigmetSeparator ds = new ConvSigmetSeparator(); + ds.setData(data, headers); + return ds; + } + + public void setData(byte[] data, Headers headers) { + doSeparate(new String(data)); + iterator = records.iterator(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() + */ + public boolean hasNext() { + if (iterator == null) { + return false; + } else { + return iterator.hasNext(); + } + } + + /** + * Get record + */ + public byte[] next() { + try { + String temp = iterator.next(); + if (Util.isEmptyString(temp)) { + return (byte[]) null; + } else { + return temp.getBytes(); + } + } catch (NoSuchElementException e) { + return (byte[]) null; + } + } + + /** + * @param message + * separate bulletins + */ + private void doSeparate(String message) { + /* Regex used for separate the bulletins */ + + try { + pattern = Pattern.compile(BULLSEPARATOR); + matcher = pattern.matcher(message); + + /* + * Set number of bulletins to records only if the bulletin separator + * is not the same. At the point, only separators are stored in + * "records" + */ + while (matcher.find()) { + if (!records.contains(matcher.group())) { + records.add(matcher.group()); + } + } + + /* + * Append the raw data file to the records. + */ + for (int i = 0; i < records.size(); i++) { + if (i < records.size() - 1) { + records.set( + i, + "\n" + + message.substring( + message.indexOf(records.get(i)), + message.indexOf(records.get(i + 1)))); + } else { + records.set( + i, + "\n" + + message.substring(message.indexOf(records + .get(i)))); + } + } + } catch (Exception e) { + e.printStackTrace(); + if (logger.isInfoEnabled()) { + logger.info("No valid records found!"); + } + logger.warn("No valid records found!"); + } + return; + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java index 428689393c..219fe9e5e6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains decoder.java for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder;; +/** +* Contains decoder.java for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder;; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java index 78fef2f955..7ee0be193e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java @@ -1,655 +1,655 @@ -/** - * Convsigmet DecoderUtil - * - * This java class intends to serve as a decoder utility for Convsigmet. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 06/2009 87/114 L. Lin Generalize the method processLocation. - * 07/2009 87/114 L. Lin Migration to TO11 - * 09/2009 87/114 L. Lin Add latitude/longitude to location table - * 07/2011 87/114 F. J. Yen Fix the day of the end time when it is - * not the same as the day of the start time. - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; - -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetLocation; -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; -import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.edex.decodertools.core.LatLonPoint; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class ConvSigmetParser { - - /** - * Constructor - */ - public ConvSigmetParser() { - } - - /** - * Parse the WMO line and store WMO header, OfficeID, issue time, - * designatorBBB,... - * - * @param wmoline - * The bulletin message - * - * @return a ConvsigmetRecord - */ - public static ConvSigmetRecord processWMO(String wmoline, Headers headers) { - - ConvSigmetRecord record = null; - // Regular expression for WMO/ICAO, station ID, and issue date (and - // maybe designator BBB) - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; - - // Pattern used for extracting WMO header, officeID, product purge time, - // and issue date and designatorBBB - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(wmoline); - - if (theMatcher.find()) { - record = new ConvSigmetRecord(); - - record.setWmoHeader(theMatcher.group(1)); - record.setIssueOffice(theMatcher.group(2)); - record.setDesignatorBBB(theMatcher.group(5)); - - // Decode the issue time. - Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), - headers); - record.setIssueTime(issueTime); - - DataTime dataTime = new DataTime(issueTime); - record.setDataTime(dataTime); - } - return record; - } - - /** - * Obtains forecast region as: SIGW, SIGC, or SIGE from a report - * - * @param bullMessage - * The bulletin message - * @return a string for forecast region - */ - public static String processFcstRegion(String bullMessage) { - - // Regular expression for "SIG" forecast region - final String FCSTREGION_EXP = "SIG([A-Z]{1}) ( )*"; - - // Pattern used for extracting forecast region - final Pattern fcstregionPattern = Pattern.compile(FCSTREGION_EXP); - Matcher theMatcher = fcstregionPattern.matcher(bullMessage); - - if (theMatcher.find()) { - return theMatcher.group(1); - } else { - return " "; - } - } - - /** - * process regular section of a convective sigmet report - * - * @param theSection - * The section lines from bulletin message - * @param issueTime - * The bulletin issue time - * @param startTime - * The start time for this section - * @param forecastRegion - * as "W", "C", or "E" - * @return a ConvsigmetSection table - */ - public static ConvSigmetSection processSection(String theSection, - Calendar issueTime, Calendar startTime, String forecastRegion, - Headers headers) { - - // Default equal to one hour if there is no valid time in report - final int validPeriod = 1; - - // Decode the phenomena description - ConvSigmetSection currentSection = ConvSigmetParser - .processPhenomena(theSection); - - // Replace the special characters - currentSection.setSegment(theSection.replace('\r', ' ') - .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - - // Decode the locations - ConvSigmetParser.processLocation(theSection, currentSection); - - // Decode the sequence ID - String sequenceID = ConvSigmetParser.processSequenceID(theSection); - if (sequenceID.equals(" ")) { - // Default as: 0W, 0C, or 0E if no sequenceID has been found. - sequenceID = "0".concat(forecastRegion); - } - currentSection.setSequenceID(sequenceID); - - // Set the starting time - if (startTime == null) { - currentSection.setStartTime(issueTime); - } else { - currentSection.setStartTime(startTime); - } - - // Decode the end time - Calendar endTime = ConvSigmetParser.processEndTime(theSection, - currentSection, headers); - if (endTime == null) { - /* - * if no end time available, end time will be the issue time plus a - * valid period; the default is one hour for now. - */ - endTime = TimeTools.copy(issueTime); - endTime.add(Calendar.HOUR, validPeriod); - currentSection.setEndTime(endTime); - } else { - currentSection.setEndTime(endTime); - } - - int startMonth = startTime.get(Calendar.MONTH); - int endMonth = endTime.get(Calendar.MONTH); - int startDay = startTime.get(Calendar.DAY_OF_MONTH); - int endDay = endTime.get(Calendar.DAY_OF_MONTH); - if ((startMonth == endMonth) && (startDay > endDay)) { - // In case the end time needs to advance one month - endTime.add(Calendar.MONTH, 1); - } - - return currentSection; - } - - /** - * process the outlook section of a convective sigmet report. - * - * @param theOutlook - * The outlook section lines from bulletin message - * @param forecastRegion - * as "W", "C", or "E" - * @return a ConvsigmetSection table - */ - public static ConvSigmetSection processOutLook(String theOutlook, - String forecastRegion, Headers headers) { - - ConvSigmetSection currentOutLook = new ConvSigmetSection(); - - currentOutLook.setSegment(theOutlook.replace('\r', ' ') - .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - currentOutLook.setClassType("OUTLOOK"); - - // Decode start time and end time - ConvSigmetParser.processValidTime(theOutlook, currentOutLook, headers); - - // Decode locations - if (ConvSigmetParser.processLocation(theOutlook, currentOutLook)) { - final String SID_EXP = "AREA ([0-9]{1})...FROM"; - - // Pattern used for extracting the number of sequence ID. - final Pattern sidPattern = Pattern.compile(SID_EXP); - - Matcher theMatcher = sidPattern.matcher(theOutlook); - - // Default sequenceID as: 1W, 1C, or 1E if locations have been - // found. - String sequenceID = "1".concat(forecastRegion); - if (theMatcher.find()) { - // Multiple areas such as: "AREA 1", "AREA 2", ...etc - sequenceID = theMatcher.group(1).concat(forecastRegion); - } - currentOutLook.setSequenceID(sequenceID); - } else { - // Default sequenceID as: 0W, 0C, or 0E if outlook section is a NIL - // report. - String sequenceID = "0".concat(forecastRegion); - currentOutLook.setSequenceID(sequenceID); - } - - return currentOutLook; - } - - /** - * Obtains start time from input report - * - * @param theSection - * The bulletin message - * @return a calendar for start time - */ - public static Calendar processStartTime(String theSection, Headers headers) { - - // Regular expression for start time - final String STARTTIME_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; - - // attern used for extracting the starting time - final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); - - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = starttimePattern.matcher(theSection); - - if (theMatcher.find()) { - // Get start time - Calendar mndTime = null; - return TimeTools.findDataTime(theMatcher.group(4), headers); - } else { - return null; - } - } - - /** - * Obtains correction flag - * - * @param theSection - * The bulletin message - * @return true if finds a correction flag - */ - public static Boolean processCorrectionFlag(String theSection) { - - Boolean correctionFlag = false; - - // Regular expression for the correction flag - final String CORFLAG_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; - - // Pattern used for extracting the correction flag - final Pattern corflagPattern = Pattern.compile(CORFLAG_EXP); - - Matcher theMatcher = corflagPattern.matcher(theSection); - - if (theMatcher.find()) { - Scanner scCorrection = new Scanner(theMatcher.group(0)); - - // check if this contains a correction flag - while (scCorrection.hasNext()) { - if (scCorrection.next().equals("COR")) { - correctionFlag = true; - } - } - - } - return correctionFlag; - } - - /** - * Obtains the sequence ID - * - * @param inSegment - * The segment which contains this sequence ID - * @return a string for sequence ID - */ - public static String processSequenceID(String inSegment) { - - // Regular expression for the sequence ID - final String SEQUENCEID_EXP = "CONVECTIVE SIGMET (([0-9]{2}|[0-9]{1})[A-Z]{1})"; - - // Pattern used for extracting the sequence ID - final Pattern sequenceidPattern = Pattern.compile(SEQUENCEID_EXP); - Matcher theMatcher = sequenceidPattern.matcher(inSegment); - - if (theMatcher.find()) { - return theMatcher.group(1); - } else { - return " "; - } - } - - /** - * Get the end time - * - * @param theSegment - * The segment which contains end time - * @param section - * The section table which contains the start time - * @return a calendar for end time - */ - public static Calendar processEndTime(String theSegment, - ConvSigmetSection section, Headers headers) { - - // Regular expression for end time - final String ENDTIME_EXP = "VALID UNTIL ([0-9]{4})Z"; - - // Pattern used for extracting the end time - final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); - - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = endtimePattern.matcher(theSegment); - - if (theMatcher.find()) { - Calendar startTime = section.getStartTime(); - - String endTimeGroup = Integer.toString( - startTime.get(Calendar.DAY_OF_MONTH)).concat( - theMatcher.group(1)); - if (startTime.get(Calendar.DAY_OF_MONTH) < 10) { - // add a "0" if the day of month less than 10 - endTimeGroup = "0".concat(endTimeGroup); - } - // Determine the end time. - Calendar endTime = TimeTools.findDataTime(endTimeGroup, headers); - int startHrMn = startTime.get(Calendar.HOUR_OF_DAY) * 100 + - startTime.get(Calendar.MINUTE); - int endHrMn = Integer.parseInt(theMatcher.group(1)); - if (endHrMn < startHrMn) { - /* Increment for the next day */ - endTime.add(Calendar.DATE,1); - } - return endTime; - } else { - return null; - } - } - - /** - * Parse the phenomena... - * - * @param theFlight - * The flight level line - * @return a section record - */ - public static ConvSigmetSection processPhenomena(String theFlight) { - - String classType = null; - - // Regular expression for the flight line - final String FL_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*FROM ([0-9]{3})?([0-9]{2})KT. ((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; - - // Pattern used for extracting the direction, speed, distance, and - // flight level - final Pattern flPattern = Pattern.compile(FL_EXP); - Matcher theMatcher = flPattern.matcher(theFlight); - - // Regular expression for the classType line - final String CLASS_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; - - // Pattern used for extracting the class type and flight level - final Pattern classPattern = Pattern.compile(CLASS_EXP); - Matcher classMatcher = classPattern.matcher(theFlight); - - ConvSigmetSection currentSection = new ConvSigmetSection(); - - if (theMatcher.find()) { - classType = theMatcher.group(3); - - int direction = Integer.parseInt(theMatcher.group(5)); - int speed = Integer.parseInt(theMatcher.group(6)); - int flightLevel = Integer.parseInt(theMatcher.group(10)); - String flightLevelTop = theMatcher.group(7); - String intensity = theMatcher.group(1); - - currentSection.setFlightLevel(flightLevel); - currentSection.setDirection(direction); - currentSection.setSpeed(speed); - currentSection.setClassType(classType); - currentSection.setIntensity(intensity); - currentSection.setCloudTop(flightLevelTop); - - if (classType.equals("LINE")) { - final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; - final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); - Matcher disMatcher = distancePattern.matcher(theFlight); - if (disMatcher.find()) { - int distance = Integer.parseInt(disMatcher.group(3)); - currentSection.setDistance(distance); - } - } else if (classType.equals("ISOL")) { - final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; - final Pattern isoldistancePattern = Pattern - .compile(ISOLDISTANCE_EXP); - Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); - if (isoldisMatcher.find()) { - int distance = Integer.parseInt(isoldisMatcher.group(2)); - currentSection.setDistance(distance); - } - // get ISOL location table - getIsolLocation(theFlight, currentSection); - } - - } else if (classMatcher.find()) { - classType = classMatcher.group(3); - - int flightLevel = Integer.parseInt(classMatcher.group(8)); - String flightLevelTop = classMatcher.group(5); - String intensity = classMatcher.group(1); - - currentSection.setFlightLevel(flightLevel); - currentSection.setClassType(classType); - currentSection.setIntensity(intensity); - currentSection.setCloudTop(flightLevelTop); - - if (classType.equals("LINE")) { - final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; - final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); - Matcher disMatcher = distancePattern.matcher(theFlight); - if (disMatcher.find()) { - int distance = Integer.parseInt(disMatcher.group(3)); - currentSection.setDistance(distance); - } - } else if (classType.equals("ISOL")) { - final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; - final Pattern isoldistancePattern = Pattern - .compile(ISOLDISTANCE_EXP); - Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); - if (isoldisMatcher.find()) { - int distance = Integer.parseInt(isoldisMatcher.group(2)); - currentSection.setDistance(distance); - } - // get ISOL location table - getIsolLocation(theFlight, currentSection); - } - - } else { - // Finds no "flight level line", "CS" as default for a NIL report. - currentSection.setClassType("CS"); - currentSection.setIntensity(null); - } - - return currentSection; - } - - /** - * Obtains the start time and end time - * - * @param theSection - * The outlook section contains the valid times group - */ - public static void processValidTime(String theSection, - ConvSigmetSection currentOutLook, Headers headers) { - - // Regular expression for start time - final String TIMES_EXP = "OUTLOOK VALID ([0-9]{6})-([0-9]{6})"; - - // Pattern used for extracting the starting time and end time - final Pattern starttimePattern = Pattern.compile(TIMES_EXP); - - Calendar startTime = null; - Calendar endTime = null; - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = starttimePattern.matcher(theSection); - - if (theMatcher.find()) { - // Decode the start time and end time; then set them. - startTime = TimeTools.findDataTime(theMatcher.group(1), headers); - currentOutLook.setStartTime(startTime); - endTime = TimeTools.findDataTime(theMatcher.group(2), headers); - - int startMonth = startTime.get(Calendar.MONTH); - int endMonth = endTime.get(Calendar.MONTH); - int startDay = startTime.get(Calendar.DAY_OF_MONTH); - int endDay = endTime.get(Calendar.DAY_OF_MONTH); - - if ((startMonth == endMonth) && (startDay > endDay)) { - // Roll over a month - endTime.add(Calendar.MONTH, 1); - } - - currentOutLook.setEndTime(endTime); - } else { - currentOutLook.setStartTime(startTime); - currentOutLook.setEndTime(endTime); - } - - } - - /** - * Obtains the location information for ISOL. - * - * @param theSection - * The section lines from bulletin message - * @param sectionTable - * The section Table - */ - public static void getIsolLocation(String theSection, - ConvSigmetSection sectionTable) { - - String line = null; - LatLonPoint point = null; - - final String ISOLLOCATION_EXP = "\\x0d\\x0d\\x0a(([0-9]{2}|[0-9]{3})([ENSW])* [A-Z]{3})\\x0d\\x0d\\x0a"; - final Pattern isollocationPattern = Pattern.compile(ISOLLOCATION_EXP); - Matcher isollocMatcher = isollocationPattern.matcher(theSection); - if (isollocMatcher.find()) { - line = isollocMatcher.group(1); - } - - if (line != null) { - ConvSigmetLocation currentLocation = new ConvSigmetLocation(); - currentLocation.setLocationLine(line); - currentLocation.setLocation(line); - currentLocation.setIndex(1); - // Get a latLonPoint for this station ID from "vors" location table - point = LatLonLocTbl.getLatLonPoint(line, "vors"); - currentLocation.setLatitude(point - .getLatitude(LatLonPoint.INDEGREES)); - currentLocation.setLongitude(point - .getLongitude(LatLonPoint.INDEGREES)); - sectionTable.addConvSigmetLocation(currentLocation); - } - } - - /** - * Parse the location lines and add location table to the section table if - * any - * - * @param theSection - * The section lines from bulletin message - * @param sectionTable - * The section Table - * @return true if finds a location line - */ - public static Boolean processLocation(String theSection, - ConvSigmetSection sectionTable) { - - Boolean hasLocationLine = true; - String locationDelimiter = "-"; - - ArrayList terminationList = new ArrayList(); - terminationList.addAll(Arrays - .asList(new String[] { "WST", "REF", "LINE", "AREA", "ISOL", - "DMSHG", "DVLPG", "DSIPTG", "INTSFYG" })); - - LatLonPoint point = null; - - Scanner sclocations = new Scanner(theSection).useDelimiter("FROM"); - - // throws away the first section which is not the "FROM" location - String locationSection = sclocations.next(); - - if (sclocations.hasNext()) { - locationSection = sclocations.next(); - - Scanner scLocationLine = new Scanner(locationSection) - .useDelimiter("\\x0d\\x0d\\x0a"); - String lines = " "; - String curLine = null; - ArrayList locationList = new ArrayList(); - locationList.clear(); - Boolean notBreak = true; - - while (scLocationLine.hasNext() && notBreak) { - // Get next location line - curLine = scLocationLine.next(); - - Scanner scLocationToken = new Scanner(curLine); - if (scLocationToken.hasNext()) { - // Check the first token from each line - String firstToken = scLocationToken.next(); - if (terminationList.contains(firstToken)) { - // terminate - notBreak = false; - break; - } - } - lines = lines.concat(" ").concat(curLine); - } - - // Clean up the leading space - lines = UtilN.removeLeadingWhiteSpaces(lines); - // Parse the location lines by a "-" - Scanner scLocation = new Scanner(lines) - .useDelimiter(locationDelimiter); - locationList.clear(); - // Get all locations - while (scLocation.hasNext()) { - locationList.add(scLocation.next()); - } - - // set locations to data base - if (locationList.size() > 1) { - Integer idxLocation = 0; - for (String Location : locationList) { - - ConvSigmetLocation currentLocation = new ConvSigmetLocation(); - currentLocation.setLocationLine(lines); - currentLocation.setLocation(Location); - - // Get a latLonPoint for this station ID from "vors" - // location table - point = LatLonLocTbl.getLatLonPoint(Location, "vors"); - currentLocation.setLatitude(point - .getLatitude(LatLonPoint.INDEGREES)); - currentLocation.setLongitude(point - .getLongitude(LatLonPoint.INDEGREES)); - - currentLocation.setIndex(idxLocation + 1); - idxLocation++; - - sectionTable.addConvSigmetLocation(currentLocation); - } - } else { - hasLocationLine = false; - } - - } else { - hasLocationLine = false; - } - - return hasLocationLine; - } - -} +/** + * Convsigmet DecoderUtil + * + * This java class intends to serve as a decoder utility for Convsigmet. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2009 87/114 L. Lin Initial coding + * 06/2009 87/114 L. Lin Generalize the method processLocation. + * 07/2009 87/114 L. Lin Migration to TO11 + * 09/2009 87/114 L. Lin Add latitude/longitude to location table + * 07/2011 87/114 F. J. Yen Fix the day of the end time when it is + * not the same as the day of the start time. + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; + +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetLocation; +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; +import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class ConvSigmetParser { + + /** + * Constructor + */ + public ConvSigmetParser() { + } + + /** + * Parse the WMO line and store WMO header, OfficeID, issue time, + * designatorBBB,... + * + * @param wmoline + * The bulletin message + * + * @return a ConvsigmetRecord + */ + public static ConvSigmetRecord processWMO(String wmoline, Headers headers) { + + ConvSigmetRecord record = null; + // Regular expression for WMO/ICAO, station ID, and issue date (and + // maybe designator BBB) + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; + + // Pattern used for extracting WMO header, officeID, product purge time, + // and issue date and designatorBBB + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(wmoline); + + if (theMatcher.find()) { + record = new ConvSigmetRecord(); + + record.setWmoHeader(theMatcher.group(1)); + record.setIssueOffice(theMatcher.group(2)); + record.setDesignatorBBB(theMatcher.group(5)); + + // Decode the issue time. + Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), + headers); + record.setIssueTime(issueTime); + + DataTime dataTime = new DataTime(issueTime); + record.setDataTime(dataTime); + } + return record; + } + + /** + * Obtains forecast region as: SIGW, SIGC, or SIGE from a report + * + * @param bullMessage + * The bulletin message + * @return a string for forecast region + */ + public static String processFcstRegion(String bullMessage) { + + // Regular expression for "SIG" forecast region + final String FCSTREGION_EXP = "SIG([A-Z]{1}) ( )*"; + + // Pattern used for extracting forecast region + final Pattern fcstregionPattern = Pattern.compile(FCSTREGION_EXP); + Matcher theMatcher = fcstregionPattern.matcher(bullMessage); + + if (theMatcher.find()) { + return theMatcher.group(1); + } else { + return " "; + } + } + + /** + * process regular section of a convective sigmet report + * + * @param theSection + * The section lines from bulletin message + * @param issueTime + * The bulletin issue time + * @param startTime + * The start time for this section + * @param forecastRegion + * as "W", "C", or "E" + * @return a ConvsigmetSection table + */ + public static ConvSigmetSection processSection(String theSection, + Calendar issueTime, Calendar startTime, String forecastRegion, + Headers headers) { + + // Default equal to one hour if there is no valid time in report + final int validPeriod = 1; + + // Decode the phenomena description + ConvSigmetSection currentSection = ConvSigmetParser + .processPhenomena(theSection); + + // Replace the special characters + currentSection.setSegment(theSection.replace('\r', ' ') + .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + + // Decode the locations + ConvSigmetParser.processLocation(theSection, currentSection); + + // Decode the sequence ID + String sequenceID = ConvSigmetParser.processSequenceID(theSection); + if (sequenceID.equals(" ")) { + // Default as: 0W, 0C, or 0E if no sequenceID has been found. + sequenceID = "0".concat(forecastRegion); + } + currentSection.setSequenceID(sequenceID); + + // Set the starting time + if (startTime == null) { + currentSection.setStartTime(issueTime); + } else { + currentSection.setStartTime(startTime); + } + + // Decode the end time + Calendar endTime = ConvSigmetParser.processEndTime(theSection, + currentSection, headers); + if (endTime == null) { + /* + * if no end time available, end time will be the issue time plus a + * valid period; the default is one hour for now. + */ + endTime = TimeTools.copy(issueTime); + endTime.add(Calendar.HOUR, validPeriod); + currentSection.setEndTime(endTime); + } else { + currentSection.setEndTime(endTime); + } + + int startMonth = startTime.get(Calendar.MONTH); + int endMonth = endTime.get(Calendar.MONTH); + int startDay = startTime.get(Calendar.DAY_OF_MONTH); + int endDay = endTime.get(Calendar.DAY_OF_MONTH); + if ((startMonth == endMonth) && (startDay > endDay)) { + // In case the end time needs to advance one month + endTime.add(Calendar.MONTH, 1); + } + + return currentSection; + } + + /** + * process the outlook section of a convective sigmet report. + * + * @param theOutlook + * The outlook section lines from bulletin message + * @param forecastRegion + * as "W", "C", or "E" + * @return a ConvsigmetSection table + */ + public static ConvSigmetSection processOutLook(String theOutlook, + String forecastRegion, Headers headers) { + + ConvSigmetSection currentOutLook = new ConvSigmetSection(); + + currentOutLook.setSegment(theOutlook.replace('\r', ' ') + .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + currentOutLook.setClassType("OUTLOOK"); + + // Decode start time and end time + ConvSigmetParser.processValidTime(theOutlook, currentOutLook, headers); + + // Decode locations + if (ConvSigmetParser.processLocation(theOutlook, currentOutLook)) { + final String SID_EXP = "AREA ([0-9]{1})...FROM"; + + // Pattern used for extracting the number of sequence ID. + final Pattern sidPattern = Pattern.compile(SID_EXP); + + Matcher theMatcher = sidPattern.matcher(theOutlook); + + // Default sequenceID as: 1W, 1C, or 1E if locations have been + // found. + String sequenceID = "1".concat(forecastRegion); + if (theMatcher.find()) { + // Multiple areas such as: "AREA 1", "AREA 2", ...etc + sequenceID = theMatcher.group(1).concat(forecastRegion); + } + currentOutLook.setSequenceID(sequenceID); + } else { + // Default sequenceID as: 0W, 0C, or 0E if outlook section is a NIL + // report. + String sequenceID = "0".concat(forecastRegion); + currentOutLook.setSequenceID(sequenceID); + } + + return currentOutLook; + } + + /** + * Obtains start time from input report + * + * @param theSection + * The bulletin message + * @return a calendar for start time + */ + public static Calendar processStartTime(String theSection, Headers headers) { + + // Regular expression for start time + final String STARTTIME_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; + + // attern used for extracting the starting time + final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); + + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = starttimePattern.matcher(theSection); + + if (theMatcher.find()) { + // Get start time + Calendar mndTime = null; + return TimeTools.findDataTime(theMatcher.group(4), headers); + } else { + return null; + } + } + + /** + * Obtains correction flag + * + * @param theSection + * The bulletin message + * @return true if finds a correction flag + */ + public static Boolean processCorrectionFlag(String theSection) { + + Boolean correctionFlag = false; + + // Regular expression for the correction flag + final String CORFLAG_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; + + // Pattern used for extracting the correction flag + final Pattern corflagPattern = Pattern.compile(CORFLAG_EXP); + + Matcher theMatcher = corflagPattern.matcher(theSection); + + if (theMatcher.find()) { + Scanner scCorrection = new Scanner(theMatcher.group(0)); + + // check if this contains a correction flag + while (scCorrection.hasNext()) { + if (scCorrection.next().equals("COR")) { + correctionFlag = true; + } + } + + } + return correctionFlag; + } + + /** + * Obtains the sequence ID + * + * @param inSegment + * The segment which contains this sequence ID + * @return a string for sequence ID + */ + public static String processSequenceID(String inSegment) { + + // Regular expression for the sequence ID + final String SEQUENCEID_EXP = "CONVECTIVE SIGMET (([0-9]{2}|[0-9]{1})[A-Z]{1})"; + + // Pattern used for extracting the sequence ID + final Pattern sequenceidPattern = Pattern.compile(SEQUENCEID_EXP); + Matcher theMatcher = sequenceidPattern.matcher(inSegment); + + if (theMatcher.find()) { + return theMatcher.group(1); + } else { + return " "; + } + } + + /** + * Get the end time + * + * @param theSegment + * The segment which contains end time + * @param section + * The section table which contains the start time + * @return a calendar for end time + */ + public static Calendar processEndTime(String theSegment, + ConvSigmetSection section, Headers headers) { + + // Regular expression for end time + final String ENDTIME_EXP = "VALID UNTIL ([0-9]{4})Z"; + + // Pattern used for extracting the end time + final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); + + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = endtimePattern.matcher(theSegment); + + if (theMatcher.find()) { + Calendar startTime = section.getStartTime(); + + String endTimeGroup = Integer.toString( + startTime.get(Calendar.DAY_OF_MONTH)).concat( + theMatcher.group(1)); + if (startTime.get(Calendar.DAY_OF_MONTH) < 10) { + // add a "0" if the day of month less than 10 + endTimeGroup = "0".concat(endTimeGroup); + } + // Determine the end time. + Calendar endTime = TimeTools.findDataTime(endTimeGroup, headers); + int startHrMn = startTime.get(Calendar.HOUR_OF_DAY) * 100 + + startTime.get(Calendar.MINUTE); + int endHrMn = Integer.parseInt(theMatcher.group(1)); + if (endHrMn < startHrMn) { + /* Increment for the next day */ + endTime.add(Calendar.DATE,1); + } + return endTime; + } else { + return null; + } + } + + /** + * Parse the phenomena... + * + * @param theFlight + * The flight level line + * @return a section record + */ + public static ConvSigmetSection processPhenomena(String theFlight) { + + String classType = null; + + // Regular expression for the flight line + final String FL_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*FROM ([0-9]{3})?([0-9]{2})KT. ((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; + + // Pattern used for extracting the direction, speed, distance, and + // flight level + final Pattern flPattern = Pattern.compile(FL_EXP); + Matcher theMatcher = flPattern.matcher(theFlight); + + // Regular expression for the classType line + final String CLASS_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; + + // Pattern used for extracting the class type and flight level + final Pattern classPattern = Pattern.compile(CLASS_EXP); + Matcher classMatcher = classPattern.matcher(theFlight); + + ConvSigmetSection currentSection = new ConvSigmetSection(); + + if (theMatcher.find()) { + classType = theMatcher.group(3); + + int direction = Integer.parseInt(theMatcher.group(5)); + int speed = Integer.parseInt(theMatcher.group(6)); + int flightLevel = Integer.parseInt(theMatcher.group(10)); + String flightLevelTop = theMatcher.group(7); + String intensity = theMatcher.group(1); + + currentSection.setFlightLevel(flightLevel); + currentSection.setDirection(direction); + currentSection.setSpeed(speed); + currentSection.setClassType(classType); + currentSection.setIntensity(intensity); + currentSection.setCloudTop(flightLevelTop); + + if (classType.equals("LINE")) { + final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; + final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); + Matcher disMatcher = distancePattern.matcher(theFlight); + if (disMatcher.find()) { + int distance = Integer.parseInt(disMatcher.group(3)); + currentSection.setDistance(distance); + } + } else if (classType.equals("ISOL")) { + final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; + final Pattern isoldistancePattern = Pattern + .compile(ISOLDISTANCE_EXP); + Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); + if (isoldisMatcher.find()) { + int distance = Integer.parseInt(isoldisMatcher.group(2)); + currentSection.setDistance(distance); + } + // get ISOL location table + getIsolLocation(theFlight, currentSection); + } + + } else if (classMatcher.find()) { + classType = classMatcher.group(3); + + int flightLevel = Integer.parseInt(classMatcher.group(8)); + String flightLevelTop = classMatcher.group(5); + String intensity = classMatcher.group(1); + + currentSection.setFlightLevel(flightLevel); + currentSection.setClassType(classType); + currentSection.setIntensity(intensity); + currentSection.setCloudTop(flightLevelTop); + + if (classType.equals("LINE")) { + final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; + final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); + Matcher disMatcher = distancePattern.matcher(theFlight); + if (disMatcher.find()) { + int distance = Integer.parseInt(disMatcher.group(3)); + currentSection.setDistance(distance); + } + } else if (classType.equals("ISOL")) { + final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; + final Pattern isoldistancePattern = Pattern + .compile(ISOLDISTANCE_EXP); + Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); + if (isoldisMatcher.find()) { + int distance = Integer.parseInt(isoldisMatcher.group(2)); + currentSection.setDistance(distance); + } + // get ISOL location table + getIsolLocation(theFlight, currentSection); + } + + } else { + // Finds no "flight level line", "CS" as default for a NIL report. + currentSection.setClassType("CS"); + currentSection.setIntensity(null); + } + + return currentSection; + } + + /** + * Obtains the start time and end time + * + * @param theSection + * The outlook section contains the valid times group + */ + public static void processValidTime(String theSection, + ConvSigmetSection currentOutLook, Headers headers) { + + // Regular expression for start time + final String TIMES_EXP = "OUTLOOK VALID ([0-9]{6})-([0-9]{6})"; + + // Pattern used for extracting the starting time and end time + final Pattern starttimePattern = Pattern.compile(TIMES_EXP); + + Calendar startTime = null; + Calendar endTime = null; + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = starttimePattern.matcher(theSection); + + if (theMatcher.find()) { + // Decode the start time and end time; then set them. + startTime = TimeTools.findDataTime(theMatcher.group(1), headers); + currentOutLook.setStartTime(startTime); + endTime = TimeTools.findDataTime(theMatcher.group(2), headers); + + int startMonth = startTime.get(Calendar.MONTH); + int endMonth = endTime.get(Calendar.MONTH); + int startDay = startTime.get(Calendar.DAY_OF_MONTH); + int endDay = endTime.get(Calendar.DAY_OF_MONTH); + + if ((startMonth == endMonth) && (startDay > endDay)) { + // Roll over a month + endTime.add(Calendar.MONTH, 1); + } + + currentOutLook.setEndTime(endTime); + } else { + currentOutLook.setStartTime(startTime); + currentOutLook.setEndTime(endTime); + } + + } + + /** + * Obtains the location information for ISOL. + * + * @param theSection + * The section lines from bulletin message + * @param sectionTable + * The section Table + */ + public static void getIsolLocation(String theSection, + ConvSigmetSection sectionTable) { + + String line = null; + LatLonPoint point = null; + + final String ISOLLOCATION_EXP = "\\x0d\\x0d\\x0a(([0-9]{2}|[0-9]{3})([ENSW])* [A-Z]{3})\\x0d\\x0d\\x0a"; + final Pattern isollocationPattern = Pattern.compile(ISOLLOCATION_EXP); + Matcher isollocMatcher = isollocationPattern.matcher(theSection); + if (isollocMatcher.find()) { + line = isollocMatcher.group(1); + } + + if (line != null) { + ConvSigmetLocation currentLocation = new ConvSigmetLocation(); + currentLocation.setLocationLine(line); + currentLocation.setLocation(line); + currentLocation.setIndex(1); + // Get a latLonPoint for this station ID from "vors" location table + point = LatLonLocTbl.getLatLonPoint(line, "vors"); + currentLocation.setLatitude(point + .getLatitude(LatLonPoint.INDEGREES)); + currentLocation.setLongitude(point + .getLongitude(LatLonPoint.INDEGREES)); + sectionTable.addConvSigmetLocation(currentLocation); + } + } + + /** + * Parse the location lines and add location table to the section table if + * any + * + * @param theSection + * The section lines from bulletin message + * @param sectionTable + * The section Table + * @return true if finds a location line + */ + public static Boolean processLocation(String theSection, + ConvSigmetSection sectionTable) { + + Boolean hasLocationLine = true; + String locationDelimiter = "-"; + + ArrayList terminationList = new ArrayList(); + terminationList.addAll(Arrays + .asList(new String[] { "WST", "REF", "LINE", "AREA", "ISOL", + "DMSHG", "DVLPG", "DSIPTG", "INTSFYG" })); + + LatLonPoint point = null; + + Scanner sclocations = new Scanner(theSection).useDelimiter("FROM"); + + // throws away the first section which is not the "FROM" location + String locationSection = sclocations.next(); + + if (sclocations.hasNext()) { + locationSection = sclocations.next(); + + Scanner scLocationLine = new Scanner(locationSection) + .useDelimiter("\\x0d\\x0d\\x0a"); + String lines = " "; + String curLine = null; + ArrayList locationList = new ArrayList(); + locationList.clear(); + Boolean notBreak = true; + + while (scLocationLine.hasNext() && notBreak) { + // Get next location line + curLine = scLocationLine.next(); + + Scanner scLocationToken = new Scanner(curLine); + if (scLocationToken.hasNext()) { + // Check the first token from each line + String firstToken = scLocationToken.next(); + if (terminationList.contains(firstToken)) { + // terminate + notBreak = false; + break; + } + } + lines = lines.concat(" ").concat(curLine); + } + + // Clean up the leading space + lines = UtilN.removeLeadingWhiteSpaces(lines); + // Parse the location lines by a "-" + Scanner scLocation = new Scanner(lines) + .useDelimiter(locationDelimiter); + locationList.clear(); + // Get all locations + while (scLocation.hasNext()) { + locationList.add(scLocation.next()); + } + + // set locations to data base + if (locationList.size() > 1) { + Integer idxLocation = 0; + for (String Location : locationList) { + + ConvSigmetLocation currentLocation = new ConvSigmetLocation(); + currentLocation.setLocationLine(lines); + currentLocation.setLocation(Location); + + // Get a latLonPoint for this station ID from "vors" + // location table + point = LatLonLocTbl.getLatLonPoint(Location, "vors"); + currentLocation.setLatitude(point + .getLatitude(LatLonPoint.INDEGREES)); + currentLocation.setLongitude(point + .getLongitude(LatLonPoint.INDEGREES)); + + currentLocation.setIndex(idxLocation + 1); + idxLocation++; + + sectionTable.addConvSigmetLocation(currentLocation); + } + } else { + hasLocationLine = false; + } + + } else { + hasLocationLine = false; + } + + return hasLocationLine; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java index 4f09986546..91040f9487 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml old mode 100644 new mode 100755 index 4e0c093444..296212af97 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-common.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml old mode 100644 new mode 100755 index 57168d5fda..cc09493589 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/res/spring/convsigmet-ingest.xml @@ -1,73 +1,73 @@ - - - - - - - - - - - - - - - - - - - - - - - - - convsigmet - - - - - - - - - - - - - java.lang.Throwable - - - - - - - java.lang.Throwable - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + convsigmet + + + + + + + + + + + + + java.lang.Throwable + + + + + + + java.lang.Throwable + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java old mode 100644 new mode 100755 index 39e26d3f2c..40ee86d5ab --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetDecoder.java @@ -1,224 +1,224 @@ -/** - * - * Convective Sigmet Decoder - * - * This java class decodes CONVSIGMET (convective sigmet) raw data. - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 06/2009 87/114 L. Lin Increase size of locationLine and location - * and generalize method "processLocation". - * 07/2009 87/114 L. Lin Migration to TO11 - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; - -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; -import gov.noaa.nws.ncep.edex.plugin.convsigmet.util.ConvSigmetParser; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Scanner; - -import com.raytheon.edex.esb.Headers; -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.edex.decodertools.core.IDecoderConstants; - -public class ConvSigmetDecoder extends AbstractDecoder { - - private final String pluginName; - - /** - * Constructor - * - * @throws DecoderException - */ - public ConvSigmetDecoder(String name) throws DecoderException { - pluginName = name; - } - - public PluginDataObject[] decode(byte[] data, Headers headers) - throws DecoderException { - - String traceId = ""; - if (headers != null) { - traceId = (String) headers.get("traceId"); - } - - String sectionDelim = "OUTLOOK|CONVECTIVE"; - String etx = IDecoderConstants.ETX; - String theBulletin = null; - - String region = null; - Calendar startTime = null; - byte[] messageData = null; - - ConvSigmetRecord record = null; - - ConvSigmetSeparator sep = ConvSigmetSeparator.separate(data, headers); - messageData = sep.next(); - String theMessage = new String(messageData); - - /* - * May have multiple duplicate bulletins, only get the first bulletin - * and eliminate the remaining bulletins after the first bulletin. - */ - Scanner cc = new Scanner(theMessage).useDelimiter(etx); - if (cc.hasNext()) { - theBulletin = cc.next(); - } else { - theBulletin = theMessage; - } - - // record = new ConvsigmetRecord(); - // Decode and set WMO line - record = ConvSigmetParser.processWMO(theBulletin, headers); - - // Decode the forecast region such as: W, C, or E - region = ConvSigmetParser.processFcstRegion(theBulletin); - String forecastRegion = "SIG".concat(region); - - /* - * Check the Convsigmet record object. If not, throws exception. - */ - if (record != null) { - record.setTraceId(traceId); - record.setPluginName(pluginName); - record.setReportType(pluginName); - record.setForecastRegion(forecastRegion); - try { - record.constructDataURI(); - } catch (PluginException e) { - logger.error("Error constructing dataURI", e); - record = null; - } - } - - if (record != null) { - try { - // Replace special characters to a blank so that it may be - // readable - record.setBullMessage(UtilN - .removeLeadingWhiteSpaces((theBulletin.substring(5)) - .replace('\036', ' ').replace('\r', ' ') - .replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' '))); - - // Decode the starting time - startTime = ConvSigmetParser.processStartTime(theBulletin, - headers); - - // Decode the correction flag and set - Boolean correctionFlag = ConvSigmetParser - .processCorrectionFlag(theBulletin); - Integer correction = 0; - if (correctionFlag) { - correction = 1; - } - record.setCorrectionFlag(correction); - - /* - * Break the bulletin message into sections by a "OUTLOOK" or - * "CONVECTIVE". - */ - Scanner sc = new Scanner(theBulletin) - .useDelimiter(sectionDelim); - - ArrayList segmentList = new ArrayList(); - segmentList.clear(); - while (sc.hasNext()) { - String segment = sc.next(); - segmentList.add(segment); - } - - Calendar issueTime = record.getIssueTime(); - /* - * process each section in a order of section and location line - */ - for (String segment : segmentList) { - - // starts a new section - Scanner sc2 = new Scanner(segment); - String whatSection = sc2.next(); - if (whatSection.equals("SIGMET") - || whatSection.equals("SIGMET...NONE")) { - segment = "CONVECTIVE".concat(segment); - - // process this section which starts with - // "CONVECTIVE SIGMET". - ConvSigmetSection section = ConvSigmetParser - .processSection(segment, issueTime, startTime, - region, headers); - record.addConvSigmetSection(section); - } else if (whatSection.equals("VALID")) { - segment = "OUTLOOK".concat(segment); - - // process this section which starts with - // "OUTLOOK VALID". - Scanner scOutlook = new Scanner(segment) - .useDelimiter("AREA "); - ArrayList outlookList = new ArrayList(); - outlookList.clear(); - - // Check if "OUTLOOK" section contains more than one - // "AREA". - while (scOutlook.hasNext()) { - String outlookSegment = scOutlook.next(); - outlookList.add(outlookSegment); - } - - if (outlookList.size() <= 1) { - // only one "AREA" or NIL report - ConvSigmetSection outlook = ConvSigmetParser - .processOutLook(segment, region, headers); - record.addConvSigmetSection(outlook); - } else { - /* - * Here are more than one outlook areas Store the - * header section and remove it from the outlook - * list - */ - String outlookHeader = outlookList.get(0); - outlookList.remove(outlookHeader); - // process multiple outlook sections - for (String outlookSection : outlookList) { - outlookSection = outlookHeader.concat("AREA ") - .concat(outlookSection); - ConvSigmetSection outlook = ConvSigmetParser - .processOutLook(outlookSection, region, - headers); - record.addConvSigmetSection(outlook); - } - } - } - } - } catch (Exception e) { - logger.error("Error processing decoded sigmet", e); - record = null; - } - } - - /* - * Return the ConvsigmetRecord record object. - */ - if (record == null) { - return new PluginDataObject[0]; - } else { - return new PluginDataObject[] { record }; - } - - } - -} +/** + * + * Convective Sigmet Decoder + * + * This java class decodes CONVSIGMET (convective sigmet) raw data. + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2009 87/114 L. Lin Initial coding + * 06/2009 87/114 L. Lin Increase size of locationLine and location + * and generalize method "processLocation". + * 07/2009 87/114 L. Lin Migration to TO11 + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; + +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; +import gov.noaa.nws.ncep.edex.plugin.convsigmet.util.ConvSigmetParser; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Scanner; + +import com.raytheon.edex.esb.Headers; +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.edex.decodertools.core.IDecoderConstants; + +public class ConvSigmetDecoder extends AbstractDecoder { + + private final String pluginName; + + /** + * Constructor + * + * @throws DecoderException + */ + public ConvSigmetDecoder(String name) throws DecoderException { + pluginName = name; + } + + public PluginDataObject[] decode(byte[] data, Headers headers) + throws DecoderException { + + String traceId = ""; + if (headers != null) { + traceId = (String) headers.get("traceId"); + } + + String sectionDelim = "OUTLOOK|CONVECTIVE"; + String etx = IDecoderConstants.ETX; + String theBulletin = null; + + String region = null; + Calendar startTime = null; + byte[] messageData = null; + + ConvSigmetRecord record = null; + + ConvSigmetSeparator sep = ConvSigmetSeparator.separate(data, headers); + messageData = sep.next(); + String theMessage = new String(messageData); + + /* + * May have multiple duplicate bulletins, only get the first bulletin + * and eliminate the remaining bulletins after the first bulletin. + */ + Scanner cc = new Scanner(theMessage).useDelimiter(etx); + if (cc.hasNext()) { + theBulletin = cc.next(); + } else { + theBulletin = theMessage; + } + + // record = new ConvsigmetRecord(); + // Decode and set WMO line + record = ConvSigmetParser.processWMO(theBulletin, headers); + + // Decode the forecast region such as: W, C, or E + region = ConvSigmetParser.processFcstRegion(theBulletin); + String forecastRegion = "SIG".concat(region); + + /* + * Check the Convsigmet record object. If not, throws exception. + */ + if (record != null) { + record.setTraceId(traceId); + record.setPluginName(pluginName); + record.setReportType(pluginName); + record.setForecastRegion(forecastRegion); + try { + record.constructDataURI(); + } catch (PluginException e) { + logger.error("Error constructing dataURI", e); + record = null; + } + } + + if (record != null) { + try { + // Replace special characters to a blank so that it may be + // readable + record.setBullMessage(UtilN + .removeLeadingWhiteSpaces((theBulletin.substring(5)) + .replace('\036', ' ').replace('\r', ' ') + .replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' '))); + + // Decode the starting time + startTime = ConvSigmetParser.processStartTime(theBulletin, + headers); + + // Decode the correction flag and set + Boolean correctionFlag = ConvSigmetParser + .processCorrectionFlag(theBulletin); + Integer correction = 0; + if (correctionFlag) { + correction = 1; + } + record.setCorrectionFlag(correction); + + /* + * Break the bulletin message into sections by a "OUTLOOK" or + * "CONVECTIVE". + */ + Scanner sc = new Scanner(theBulletin) + .useDelimiter(sectionDelim); + + ArrayList segmentList = new ArrayList(); + segmentList.clear(); + while (sc.hasNext()) { + String segment = sc.next(); + segmentList.add(segment); + } + + Calendar issueTime = record.getIssueTime(); + /* + * process each section in a order of section and location line + */ + for (String segment : segmentList) { + + // starts a new section + Scanner sc2 = new Scanner(segment); + String whatSection = sc2.next(); + if (whatSection.equals("SIGMET") + || whatSection.equals("SIGMET...NONE")) { + segment = "CONVECTIVE".concat(segment); + + // process this section which starts with + // "CONVECTIVE SIGMET". + ConvSigmetSection section = ConvSigmetParser + .processSection(segment, issueTime, startTime, + region, headers); + record.addConvSigmetSection(section); + } else if (whatSection.equals("VALID")) { + segment = "OUTLOOK".concat(segment); + + // process this section which starts with + // "OUTLOOK VALID". + Scanner scOutlook = new Scanner(segment) + .useDelimiter("AREA "); + ArrayList outlookList = new ArrayList(); + outlookList.clear(); + + // Check if "OUTLOOK" section contains more than one + // "AREA". + while (scOutlook.hasNext()) { + String outlookSegment = scOutlook.next(); + outlookList.add(outlookSegment); + } + + if (outlookList.size() <= 1) { + // only one "AREA" or NIL report + ConvSigmetSection outlook = ConvSigmetParser + .processOutLook(segment, region, headers); + record.addConvSigmetSection(outlook); + } else { + /* + * Here are more than one outlook areas Store the + * header section and remove it from the outlook + * list + */ + String outlookHeader = outlookList.get(0); + outlookList.remove(outlookHeader); + // process multiple outlook sections + for (String outlookSection : outlookList) { + outlookSection = outlookHeader.concat("AREA ") + .concat(outlookSection); + ConvSigmetSection outlook = ConvSigmetParser + .processOutLook(outlookSection, region, + headers); + record.addConvSigmetSection(outlook); + } + } + } + } + } catch (Exception e) { + logger.error("Error processing decoded sigmet", e); + record = null; + } + } + + /* + * Return the ConvsigmetRecord record object. + */ + if (record == null) { + return new PluginDataObject[0]; + } else { + return new PluginDataObject[] { record }; + } + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java old mode 100644 new mode 100755 index 507e9f59cc..da0b868bd5 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/ConvSigmetSeparator.java @@ -1,145 +1,145 @@ -/** - * ConvsigmetSeparator - * - * This class sets the raw data to an Arraylist, records, of - * String based on a uniquely identified separator. - * - *
    - * L. Lin                               03/2009         Creation
    - * 
    - * - * This code has been developed by the SIB for use in the AWIPS system. - */ - -package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.edex.util.Util; - -public class ConvSigmetSeparator extends AbstractRecordSeparator { - private final Log logger = LogFactory.getLog(getClass()); - - /** Regex used for separate the bulletins */ - private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; - - /** Regex matcher */ - private Matcher matcher; - - /** Pattern object for regex search */ - private Pattern pattern; - - /** List of records contained in file */ - private List records; - - private Iterator iterator = null; - - /** - * Constructor. - * - */ - public ConvSigmetSeparator() { - records = new ArrayList(); - } - - public static ConvSigmetSeparator separate(byte[] data, Headers headers) { - ConvSigmetSeparator ds = new ConvSigmetSeparator(); - ds.setData(data, headers); - return ds; - } - - public void setData(byte[] data, Headers headers) { - doSeparate(new String(data)); - iterator = records.iterator(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() - */ - public boolean hasNext() { - if (iterator == null) { - return false; - } else { - return iterator.hasNext(); - } - } - - /** - * Get record - */ - public byte[] next() { - try { - String temp = iterator.next(); - if (Util.isEmptyString(temp)) { - return (byte[]) null; - } else { - return temp.getBytes(); - } - } catch (NoSuchElementException e) { - return (byte[]) null; - } - } - - /** - * @param message - * separate bulletins - */ - private void doSeparate(String message) { - /* Regex used for separate the bulletins */ - - try { - pattern = Pattern.compile(BULLSEPARATOR); - matcher = pattern.matcher(message); - - /* - * Set number of bulletins to records only if the bulletin separator - * is not the same. At the point, only separators are stored in - * "records" - */ - while (matcher.find()) { - if (!records.contains(matcher.group())) { - records.add(matcher.group()); - } - } - - /* - * Append the raw data file to the records. - */ - for (int i = 0; i < records.size(); i++) { - if (i < records.size() - 1) { - records.set( - i, - "\n" - + message.substring( - message.indexOf(records.get(i)), - message.indexOf(records.get(i + 1)))); - } else { - records.set( - i, - "\n" - + message.substring(message.indexOf(records - .get(i)))); - } - } - } catch (Exception e) { - e.printStackTrace(); - if (logger.isInfoEnabled()) { - logger.info("No valid records found!"); - } - logger.warn("No valid records found!"); - } - return; - } -} +/** + * ConvsigmetSeparator + * + * This class sets the raw data to an Arraylist, records, of + * String based on a uniquely identified separator. + * + *
    + * L. Lin                               03/2009         Creation
    + * 
    + * + * This code has been developed by the SIB for use in the AWIPS system. + */ + +package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.edex.util.Util; + +public class ConvSigmetSeparator extends AbstractRecordSeparator { + private final Log logger = LogFactory.getLog(getClass()); + + /** Regex used for separate the bulletins */ + private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; + + /** Regex matcher */ + private Matcher matcher; + + /** Pattern object for regex search */ + private Pattern pattern; + + /** List of records contained in file */ + private List records; + + private Iterator iterator = null; + + /** + * Constructor. + * + */ + public ConvSigmetSeparator() { + records = new ArrayList(); + } + + public static ConvSigmetSeparator separate(byte[] data, Headers headers) { + ConvSigmetSeparator ds = new ConvSigmetSeparator(); + ds.setData(data, headers); + return ds; + } + + public void setData(byte[] data, Headers headers) { + doSeparate(new String(data)); + iterator = records.iterator(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() + */ + public boolean hasNext() { + if (iterator == null) { + return false; + } else { + return iterator.hasNext(); + } + } + + /** + * Get record + */ + public byte[] next() { + try { + String temp = iterator.next(); + if (Util.isEmptyString(temp)) { + return (byte[]) null; + } else { + return temp.getBytes(); + } + } catch (NoSuchElementException e) { + return (byte[]) null; + } + } + + /** + * @param message + * separate bulletins + */ + private void doSeparate(String message) { + /* Regex used for separate the bulletins */ + + try { + pattern = Pattern.compile(BULLSEPARATOR); + matcher = pattern.matcher(message); + + /* + * Set number of bulletins to records only if the bulletin separator + * is not the same. At the point, only separators are stored in + * "records" + */ + while (matcher.find()) { + if (!records.contains(matcher.group())) { + records.add(matcher.group()); + } + } + + /* + * Append the raw data file to the records. + */ + for (int i = 0; i < records.size(); i++) { + if (i < records.size() - 1) { + records.set( + i, + "\n" + + message.substring( + message.indexOf(records.get(i)), + message.indexOf(records.get(i + 1)))); + } else { + records.set( + i, + "\n" + + message.substring(message.indexOf(records + .get(i)))); + } + } + } catch (Exception e) { + e.printStackTrace(); + if (logger.isInfoEnabled()) { + logger.info("No valid records found!"); + } + logger.warn("No valid records found!"); + } + return; + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java old mode 100644 new mode 100755 index 428689393c..219fe9e5e6 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/decoder/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains decoder.java for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder;; +/** +* Contains decoder.java for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.convsigmet.decoder;; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java old mode 100644 new mode 100755 index 460c05d833..7f8718ae55 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/ConvSigmetParser.java @@ -1,644 +1,644 @@ -/** - * Convsigmet DecoderUtil - * - * This java class intends to serve as a decoder utility for Convsigmet. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 06/2009 87/114 L. Lin Generalize the method processLocation. - * 07/2009 87/114 L. Lin Migration to TO11 - * 09/2009 87/114 L. Lin Add latitude/longitude to location table - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; - -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetLocation; -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; -import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; -import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.edex.decodertools.core.LatLonPoint; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class ConvSigmetParser { - - /** - * Constructor - */ - public ConvSigmetParser() { - } - - /** - * Parse the WMO line and store WMO header, OfficeID, issue time, - * designatorBBB,... - * - * @param wmoline - * The bulletin message - * - * @return a ConvsigmetRecord - */ - public static ConvSigmetRecord processWMO(String wmoline, Headers headers) { - - ConvSigmetRecord record = null; - // Regular expression for WMO/ICAO, station ID, and issue date (and - // maybe designator BBB) - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; - - // Pattern used for extracting WMO header, officeID, product purge time, - // and issue date and designatorBBB - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(wmoline); - - if (theMatcher.find()) { - record = new ConvSigmetRecord(); - - record.setWmoHeader(theMatcher.group(1)); - record.setIssueOffice(theMatcher.group(2)); - record.setDesignatorBBB(theMatcher.group(5)); - - // Decode the issue time. - Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), - headers); - record.setIssueTime(issueTime); - - DataTime dataTime = new DataTime(issueTime); - record.setDataTime(dataTime); - } - return record; - } - - /** - * Obtains forecast region as: SIGW, SIGC, or SIGE from a report - * - * @param bullMessage - * The bulletin message - * @return a string for forecast region - */ - public static String processFcstRegion(String bullMessage) { - - // Regular expression for "SIG" forecast region - final String FCSTREGION_EXP = "SIG([A-Z]{1}) ( )*"; - - // Pattern used for extracting forecast region - final Pattern fcstregionPattern = Pattern.compile(FCSTREGION_EXP); - Matcher theMatcher = fcstregionPattern.matcher(bullMessage); - - if (theMatcher.find()) { - return theMatcher.group(1); - } else { - return " "; - } - } - - /** - * process regular section of a convective sigmet report - * - * @param theSection - * The section lines from bulletin message - * @param issueTime - * The bulletin issue time - * @param startTime - * The start time for this section - * @param forecastRegion - * as "W", "C", or "E" - * @return a ConvsigmetSection table - */ - public static ConvSigmetSection processSection(String theSection, - Calendar issueTime, Calendar startTime, String forecastRegion, - Headers headers) { - - // Default equal to one hour if there is no valid time in report - final int validPeriod = 1; - - // Decode the phenomena description - ConvSigmetSection currentSection = ConvSigmetParser - .processPhenomena(theSection); - - // Replace the special characters - currentSection.setSegment(theSection.replace('\r', ' ') - .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - - // Decode the locations - ConvSigmetParser.processLocation(theSection, currentSection); - - // Decode the sequence ID - String sequenceID = ConvSigmetParser.processSequenceID(theSection); - if (sequenceID.equals(" ")) { - // Default as: 0W, 0C, or 0E if no sequenceID has been found. - sequenceID = "0".concat(forecastRegion); - } - currentSection.setSequenceID(sequenceID); - - // Set the starting time - if (startTime == null) { - currentSection.setStartTime(issueTime); - } else { - currentSection.setStartTime(startTime); - } - - // Decode the end time - Calendar endTime = ConvSigmetParser.processEndTime(theSection, - currentSection, headers); - if (endTime == null) { - /* - * if no end time available, end time will be the issue time plus a - * valid period; the default is one hour for now. - */ - endTime = TimeTools.copy(issueTime); - endTime.add(Calendar.HOUR, validPeriod); - currentSection.setEndTime(endTime); - } else { - currentSection.setEndTime(endTime); - } - - int startMonth = startTime.get(Calendar.MONTH); - int endMonth = endTime.get(Calendar.MONTH); - int startDay = startTime.get(Calendar.DAY_OF_MONTH); - int endDay = endTime.get(Calendar.DAY_OF_MONTH); - if ((startMonth == endMonth) && (startDay > endDay)) { - // In case the end time needs to advance one month - endTime.add(Calendar.MONTH, 1); - } - - return currentSection; - } - - /** - * process the outlook section of a convective sigmet report. - * - * @param theOutlook - * The outlook section lines from bulletin message - * @param forecastRegion - * as "W", "C", or "E" - * @return a ConvsigmetSection table - */ - public static ConvSigmetSection processOutLook(String theOutlook, - String forecastRegion, Headers headers) { - - ConvSigmetSection currentOutLook = new ConvSigmetSection(); - - currentOutLook.setSegment(theOutlook.replace('\r', ' ') - .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - currentOutLook.setClassType("OUTLOOK"); - - // Decode start time and end time - ConvSigmetParser.processValidTime(theOutlook, currentOutLook, headers); - - // Decode locations - if (ConvSigmetParser.processLocation(theOutlook, currentOutLook)) { - final String SID_EXP = "AREA ([0-9]{1})...FROM"; - - // Pattern used for extracting the number of sequence ID. - final Pattern sidPattern = Pattern.compile(SID_EXP); - - Matcher theMatcher = sidPattern.matcher(theOutlook); - - // Default sequenceID as: 1W, 1C, or 1E if locations have been - // found. - String sequenceID = "1".concat(forecastRegion); - if (theMatcher.find()) { - // Multiple areas such as: "AREA 1", "AREA 2", ...etc - sequenceID = theMatcher.group(1).concat(forecastRegion); - } - currentOutLook.setSequenceID(sequenceID); - } else { - // Default sequenceID as: 0W, 0C, or 0E if outlook section is a NIL - // report. - String sequenceID = "0".concat(forecastRegion); - currentOutLook.setSequenceID(sequenceID); - } - - return currentOutLook; - } - - /** - * Obtains start time from input report - * - * @param theSection - * The bulletin message - * @return a calendar for start time - */ - public static Calendar processStartTime(String theSection, Headers headers) { - - // Regular expression for start time - final String STARTTIME_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; - - // attern used for extracting the starting time - final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); - - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = starttimePattern.matcher(theSection); - - if (theMatcher.find()) { - // Get start time - Calendar mndTime = null; - return TimeTools.findDataTime(theMatcher.group(4), headers); - } else { - return null; - } - } - - /** - * Obtains correction flag - * - * @param theSection - * The bulletin message - * @return true if finds a correction flag - */ - public static Boolean processCorrectionFlag(String theSection) { - - Boolean correctionFlag = false; - - // Regular expression for the correction flag - final String CORFLAG_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; - - // Pattern used for extracting the correction flag - final Pattern corflagPattern = Pattern.compile(CORFLAG_EXP); - - Matcher theMatcher = corflagPattern.matcher(theSection); - - if (theMatcher.find()) { - Scanner scCorrection = new Scanner(theMatcher.group(0)); - - // check if this contains a correction flag - while (scCorrection.hasNext()) { - if (scCorrection.next().equals("COR")) { - correctionFlag = true; - } - } - - } - return correctionFlag; - } - - /** - * Obtains the sequence ID - * - * @param inSegment - * The segment which contains this sequence ID - * @return a string for sequence ID - */ - public static String processSequenceID(String inSegment) { - - // Regular expression for the sequence ID - final String SEQUENCEID_EXP = "CONVECTIVE SIGMET (([0-9]{2}|[0-9]{1})[A-Z]{1})"; - - // Pattern used for extracting the sequence ID - final Pattern sequenceidPattern = Pattern.compile(SEQUENCEID_EXP); - Matcher theMatcher = sequenceidPattern.matcher(inSegment); - - if (theMatcher.find()) { - return theMatcher.group(1); - } else { - return " "; - } - } - - /** - * Get the end time - * - * @param theSegment - * The segment which contains end time - * @param section - * The section table which contains the start time - * @return a calendar for end time - */ - public static Calendar processEndTime(String theSegment, - ConvSigmetSection section, Headers headers) { - - // Regular expression for end time - final String ENDTIME_EXP = "VALID UNTIL ([0-9]{4})Z"; - - // Pattern used for extracting the end time - final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); - - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = endtimePattern.matcher(theSegment); - - if (theMatcher.find()) { - Calendar startTime = section.getStartTime(); - String endTimeGroup = Integer.toString( - startTime.get(Calendar.DAY_OF_MONTH)).concat( - theMatcher.group(1)); - if (startTime.get(Calendar.DAY_OF_MONTH) < 10) { - // add a "0" if the day of month less than 10 - endTimeGroup = "0".concat(endTimeGroup); - } - // get the end time. - return TimeTools.findDataTime(endTimeGroup, headers); - } else { - return null; - } - } - - /** - * Parse the phenomena... - * - * @param theFlight - * The flight level line - * @return a section record - */ - public static ConvSigmetSection processPhenomena(String theFlight) { - - String classType = null; - - // Regular expression for the flight line - final String FL_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*FROM ([0-9]{3})?([0-9]{2})KT. ((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; - - // Pattern used for extracting the direction, speed, distance, and - // flight level - final Pattern flPattern = Pattern.compile(FL_EXP); - Matcher theMatcher = flPattern.matcher(theFlight); - - // Regular expression for the classType line - final String CLASS_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; - - // Pattern used for extracting the class type and flight level - final Pattern classPattern = Pattern.compile(CLASS_EXP); - Matcher classMatcher = classPattern.matcher(theFlight); - - ConvSigmetSection currentSection = new ConvSigmetSection(); - - if (theMatcher.find()) { - classType = theMatcher.group(3); - - int direction = Integer.parseInt(theMatcher.group(5)); - int speed = Integer.parseInt(theMatcher.group(6)); - int flightLevel = Integer.parseInt(theMatcher.group(10)); - String flightLevelTop = theMatcher.group(7); - String intensity = theMatcher.group(1); - - currentSection.setFlightLevel(flightLevel); - currentSection.setDirection(direction); - currentSection.setSpeed(speed); - currentSection.setClassType(classType); - currentSection.setIntensity(intensity); - currentSection.setCloudTop(flightLevelTop); - - if (classType.equals("LINE")) { - final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; - final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); - Matcher disMatcher = distancePattern.matcher(theFlight); - if (disMatcher.find()) { - int distance = Integer.parseInt(disMatcher.group(3)); - currentSection.setDistance(distance); - } - } else if (classType.equals("ISOL")) { - final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; - final Pattern isoldistancePattern = Pattern - .compile(ISOLDISTANCE_EXP); - Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); - if (isoldisMatcher.find()) { - int distance = Integer.parseInt(isoldisMatcher.group(2)); - currentSection.setDistance(distance); - } - // get ISOL location table - getIsolLocation(theFlight, currentSection); - } - - } else if (classMatcher.find()) { - classType = classMatcher.group(3); - - int flightLevel = Integer.parseInt(classMatcher.group(8)); - String flightLevelTop = classMatcher.group(5); - String intensity = classMatcher.group(1); - - currentSection.setFlightLevel(flightLevel); - currentSection.setClassType(classType); - currentSection.setIntensity(intensity); - currentSection.setCloudTop(flightLevelTop); - - if (classType.equals("LINE")) { - final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; - final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); - Matcher disMatcher = distancePattern.matcher(theFlight); - if (disMatcher.find()) { - int distance = Integer.parseInt(disMatcher.group(3)); - currentSection.setDistance(distance); - } - } else if (classType.equals("ISOL")) { - final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; - final Pattern isoldistancePattern = Pattern - .compile(ISOLDISTANCE_EXP); - Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); - if (isoldisMatcher.find()) { - int distance = Integer.parseInt(isoldisMatcher.group(2)); - currentSection.setDistance(distance); - } - // get ISOL location table - getIsolLocation(theFlight, currentSection); - } - - } else { - // Finds no "flight level line", "CS" as default for a NIL report. - currentSection.setClassType("CS"); - currentSection.setIntensity(null); - } - - return currentSection; - } - - /** - * Obtains the start time and end time - * - * @param theSection - * The outlook section contains the valid times group - */ - public static void processValidTime(String theSection, - ConvSigmetSection currentOutLook, Headers headers) { - - // Regular expression for start time - final String TIMES_EXP = "OUTLOOK VALID ([0-9]{6})-([0-9]{6})"; - - // Pattern used for extracting the starting time and end time - final Pattern starttimePattern = Pattern.compile(TIMES_EXP); - - Calendar startTime = null; - Calendar endTime = null; - // Calendar mndTime = Calendar.getInstance(); - - Matcher theMatcher = starttimePattern.matcher(theSection); - - if (theMatcher.find()) { - // Decode the start time and end time; then set them. - startTime = TimeTools.findDataTime(theMatcher.group(1), headers); - currentOutLook.setStartTime(startTime); - endTime = TimeTools.findDataTime(theMatcher.group(2), headers); - - int startMonth = startTime.get(Calendar.MONTH); - int endMonth = endTime.get(Calendar.MONTH); - int startDay = startTime.get(Calendar.DAY_OF_MONTH); - int endDay = endTime.get(Calendar.DAY_OF_MONTH); - - if ((startMonth == endMonth) && (startDay > endDay)) { - // Roll over a month - endTime.add(Calendar.MONTH, 1); - } - - currentOutLook.setEndTime(endTime); - } else { - currentOutLook.setStartTime(startTime); - currentOutLook.setEndTime(endTime); - } - - } - - /** - * Obtains the location information for ISOL. - * - * @param theSection - * The section lines from bulletin message - * @param sectionTable - * The section Table - */ - public static void getIsolLocation(String theSection, - ConvSigmetSection sectionTable) { - - String line = null; - LatLonPoint point = null; - - final String ISOLLOCATION_EXP = "\\x0d\\x0d\\x0a(([0-9]{2}|[0-9]{3})([ENSW])* [A-Z]{3})\\x0d\\x0d\\x0a"; - final Pattern isollocationPattern = Pattern.compile(ISOLLOCATION_EXP); - Matcher isollocMatcher = isollocationPattern.matcher(theSection); - if (isollocMatcher.find()) { - line = isollocMatcher.group(1); - } - - if (line != null) { - ConvSigmetLocation currentLocation = new ConvSigmetLocation(); - currentLocation.setLocationLine(line); - currentLocation.setLocation(line); - currentLocation.setIndex(1); - // Get a latLonPoint for this station ID from "vors" location table - point = LatLonLocTbl.getLatLonPoint(line, "vors"); - currentLocation.setLatitude(point - .getLatitude(LatLonPoint.INDEGREES)); - currentLocation.setLongitude(point - .getLongitude(LatLonPoint.INDEGREES)); - sectionTable.addConvSigmetLocation(currentLocation); - } - } - - /** - * Parse the location lines and add location table to the section table if - * any - * - * @param theSection - * The section lines from bulletin message - * @param sectionTable - * The section Table - * @return true if finds a location line - */ - public static Boolean processLocation(String theSection, - ConvSigmetSection sectionTable) { - - Boolean hasLocationLine = true; - String locationDelimiter = "-"; - - ArrayList terminationList = new ArrayList(); - terminationList.addAll(Arrays - .asList(new String[] { "WST", "REF", "LINE", "AREA", "ISOL", - "DMSHG", "DVLPG", "DSIPTG", "INTSFYG" })); - - LatLonPoint point = null; - - Scanner sclocations = new Scanner(theSection).useDelimiter("FROM"); - - // throws away the first section which is not the "FROM" location - String locationSection = sclocations.next(); - - if (sclocations.hasNext()) { - locationSection = sclocations.next(); - - Scanner scLocationLine = new Scanner(locationSection) - .useDelimiter("\\x0d\\x0d\\x0a"); - String lines = " "; - String curLine = null; - ArrayList locationList = new ArrayList(); - locationList.clear(); - Boolean notBreak = true; - - while (scLocationLine.hasNext() && notBreak) { - // Get next location line - curLine = scLocationLine.next(); - - Scanner scLocationToken = new Scanner(curLine); - if (scLocationToken.hasNext()) { - // Check the first token from each line - String firstToken = scLocationToken.next(); - if (terminationList.contains(firstToken)) { - // terminate - notBreak = false; - break; - } - } - lines = lines.concat(" ").concat(curLine); - } - - // Clean up the leading space - lines = UtilN.removeLeadingWhiteSpaces(lines); - // Parse the location lines by a "-" - Scanner scLocation = new Scanner(lines) - .useDelimiter(locationDelimiter); - locationList.clear(); - // Get all locations - while (scLocation.hasNext()) { - locationList.add(scLocation.next()); - } - - // set locations to data base - if (locationList.size() > 1) { - Integer idxLocation = 0; - for (String Location : locationList) { - - ConvSigmetLocation currentLocation = new ConvSigmetLocation(); - currentLocation.setLocationLine(lines); - currentLocation.setLocation(Location); - - // Get a latLonPoint for this station ID from "vors" - // location table - point = LatLonLocTbl.getLatLonPoint(Location, "vors"); - currentLocation.setLatitude(point - .getLatitude(LatLonPoint.INDEGREES)); - currentLocation.setLongitude(point - .getLongitude(LatLonPoint.INDEGREES)); - - currentLocation.setIndex(idxLocation + 1); - idxLocation++; - - sectionTable.addConvSigmetLocation(currentLocation); - } - } else { - hasLocationLine = false; - } - - } else { - hasLocationLine = false; - } - - return hasLocationLine; - } - -} +/** + * Convsigmet DecoderUtil + * + * This java class intends to serve as a decoder utility for Convsigmet. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 03/2009 87/114 L. Lin Initial coding + * 06/2009 87/114 L. Lin Generalize the method processLocation. + * 07/2009 87/114 L. Lin Migration to TO11 + * 09/2009 87/114 L. Lin Add latitude/longitude to location table + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; + +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetLocation; +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetRecord; +import gov.noaa.nws.ncep.common.dataplugin.convsigmet.ConvSigmetSection; +import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class ConvSigmetParser { + + /** + * Constructor + */ + public ConvSigmetParser() { + } + + /** + * Parse the WMO line and store WMO header, OfficeID, issue time, + * designatorBBB,... + * + * @param wmoline + * The bulletin message + * + * @return a ConvsigmetRecord + */ + public static ConvSigmetRecord processWMO(String wmoline, Headers headers) { + + ConvSigmetRecord record = null; + // Regular expression for WMO/ICAO, station ID, and issue date (and + // maybe designator BBB) + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; + + // Pattern used for extracting WMO header, officeID, product purge time, + // and issue date and designatorBBB + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(wmoline); + + if (theMatcher.find()) { + record = new ConvSigmetRecord(); + + record.setWmoHeader(theMatcher.group(1)); + record.setIssueOffice(theMatcher.group(2)); + record.setDesignatorBBB(theMatcher.group(5)); + + // Decode the issue time. + Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), + headers); + record.setIssueTime(issueTime); + + DataTime dataTime = new DataTime(issueTime); + record.setDataTime(dataTime); + } + return record; + } + + /** + * Obtains forecast region as: SIGW, SIGC, or SIGE from a report + * + * @param bullMessage + * The bulletin message + * @return a string for forecast region + */ + public static String processFcstRegion(String bullMessage) { + + // Regular expression for "SIG" forecast region + final String FCSTREGION_EXP = "SIG([A-Z]{1}) ( )*"; + + // Pattern used for extracting forecast region + final Pattern fcstregionPattern = Pattern.compile(FCSTREGION_EXP); + Matcher theMatcher = fcstregionPattern.matcher(bullMessage); + + if (theMatcher.find()) { + return theMatcher.group(1); + } else { + return " "; + } + } + + /** + * process regular section of a convective sigmet report + * + * @param theSection + * The section lines from bulletin message + * @param issueTime + * The bulletin issue time + * @param startTime + * The start time for this section + * @param forecastRegion + * as "W", "C", or "E" + * @return a ConvsigmetSection table + */ + public static ConvSigmetSection processSection(String theSection, + Calendar issueTime, Calendar startTime, String forecastRegion, + Headers headers) { + + // Default equal to one hour if there is no valid time in report + final int validPeriod = 1; + + // Decode the phenomena description + ConvSigmetSection currentSection = ConvSigmetParser + .processPhenomena(theSection); + + // Replace the special characters + currentSection.setSegment(theSection.replace('\r', ' ') + .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + + // Decode the locations + ConvSigmetParser.processLocation(theSection, currentSection); + + // Decode the sequence ID + String sequenceID = ConvSigmetParser.processSequenceID(theSection); + if (sequenceID.equals(" ")) { + // Default as: 0W, 0C, or 0E if no sequenceID has been found. + sequenceID = "0".concat(forecastRegion); + } + currentSection.setSequenceID(sequenceID); + + // Set the starting time + if (startTime == null) { + currentSection.setStartTime(issueTime); + } else { + currentSection.setStartTime(startTime); + } + + // Decode the end time + Calendar endTime = ConvSigmetParser.processEndTime(theSection, + currentSection, headers); + if (endTime == null) { + /* + * if no end time available, end time will be the issue time plus a + * valid period; the default is one hour for now. + */ + endTime = TimeTools.copy(issueTime); + endTime.add(Calendar.HOUR, validPeriod); + currentSection.setEndTime(endTime); + } else { + currentSection.setEndTime(endTime); + } + + int startMonth = startTime.get(Calendar.MONTH); + int endMonth = endTime.get(Calendar.MONTH); + int startDay = startTime.get(Calendar.DAY_OF_MONTH); + int endDay = endTime.get(Calendar.DAY_OF_MONTH); + if ((startMonth == endMonth) && (startDay > endDay)) { + // In case the end time needs to advance one month + endTime.add(Calendar.MONTH, 1); + } + + return currentSection; + } + + /** + * process the outlook section of a convective sigmet report. + * + * @param theOutlook + * The outlook section lines from bulletin message + * @param forecastRegion + * as "W", "C", or "E" + * @return a ConvsigmetSection table + */ + public static ConvSigmetSection processOutLook(String theOutlook, + String forecastRegion, Headers headers) { + + ConvSigmetSection currentOutLook = new ConvSigmetSection(); + + currentOutLook.setSegment(theOutlook.replace('\r', ' ') + .replace('\036', ' ').replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + currentOutLook.setClassType("OUTLOOK"); + + // Decode start time and end time + ConvSigmetParser.processValidTime(theOutlook, currentOutLook, headers); + + // Decode locations + if (ConvSigmetParser.processLocation(theOutlook, currentOutLook)) { + final String SID_EXP = "AREA ([0-9]{1})...FROM"; + + // Pattern used for extracting the number of sequence ID. + final Pattern sidPattern = Pattern.compile(SID_EXP); + + Matcher theMatcher = sidPattern.matcher(theOutlook); + + // Default sequenceID as: 1W, 1C, or 1E if locations have been + // found. + String sequenceID = "1".concat(forecastRegion); + if (theMatcher.find()) { + // Multiple areas such as: "AREA 1", "AREA 2", ...etc + sequenceID = theMatcher.group(1).concat(forecastRegion); + } + currentOutLook.setSequenceID(sequenceID); + } else { + // Default sequenceID as: 0W, 0C, or 0E if outlook section is a NIL + // report. + String sequenceID = "0".concat(forecastRegion); + currentOutLook.setSequenceID(sequenceID); + } + + return currentOutLook; + } + + /** + * Obtains start time from input report + * + * @param theSection + * The bulletin message + * @return a calendar for start time + */ + public static Calendar processStartTime(String theSection, Headers headers) { + + // Regular expression for start time + final String STARTTIME_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; + + // attern used for extracting the starting time + final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); + + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = starttimePattern.matcher(theSection); + + if (theMatcher.find()) { + // Get start time + Calendar mndTime = null; + return TimeTools.findDataTime(theMatcher.group(4), headers); + } else { + return null; + } + } + + /** + * Obtains correction flag + * + * @param theSection + * The bulletin message + * @return true if finds a correction flag + */ + public static Boolean processCorrectionFlag(String theSection) { + + Boolean correctionFlag = false; + + // Regular expression for the correction flag + final String CORFLAG_EXP = "(\\x1e)([A-Z]{4}) ([A-Z]{3}) ([0-9]{6})( [A-Z]{3})?"; + + // Pattern used for extracting the correction flag + final Pattern corflagPattern = Pattern.compile(CORFLAG_EXP); + + Matcher theMatcher = corflagPattern.matcher(theSection); + + if (theMatcher.find()) { + Scanner scCorrection = new Scanner(theMatcher.group(0)); + + // check if this contains a correction flag + while (scCorrection.hasNext()) { + if (scCorrection.next().equals("COR")) { + correctionFlag = true; + } + } + + } + return correctionFlag; + } + + /** + * Obtains the sequence ID + * + * @param inSegment + * The segment which contains this sequence ID + * @return a string for sequence ID + */ + public static String processSequenceID(String inSegment) { + + // Regular expression for the sequence ID + final String SEQUENCEID_EXP = "CONVECTIVE SIGMET (([0-9]{2}|[0-9]{1})[A-Z]{1})"; + + // Pattern used for extracting the sequence ID + final Pattern sequenceidPattern = Pattern.compile(SEQUENCEID_EXP); + Matcher theMatcher = sequenceidPattern.matcher(inSegment); + + if (theMatcher.find()) { + return theMatcher.group(1); + } else { + return " "; + } + } + + /** + * Get the end time + * + * @param theSegment + * The segment which contains end time + * @param section + * The section table which contains the start time + * @return a calendar for end time + */ + public static Calendar processEndTime(String theSegment, + ConvSigmetSection section, Headers headers) { + + // Regular expression for end time + final String ENDTIME_EXP = "VALID UNTIL ([0-9]{4})Z"; + + // Pattern used for extracting the end time + final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); + + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = endtimePattern.matcher(theSegment); + + if (theMatcher.find()) { + Calendar startTime = section.getStartTime(); + String endTimeGroup = Integer.toString( + startTime.get(Calendar.DAY_OF_MONTH)).concat( + theMatcher.group(1)); + if (startTime.get(Calendar.DAY_OF_MONTH) < 10) { + // add a "0" if the day of month less than 10 + endTimeGroup = "0".concat(endTimeGroup); + } + // get the end time. + return TimeTools.findDataTime(endTimeGroup, headers); + } else { + return null; + } + } + + /** + * Parse the phenomena... + * + * @param theFlight + * The flight level line + * @return a section record + */ + public static ConvSigmetSection processPhenomena(String theFlight) { + + String classType = null; + + // Regular expression for the flight line + final String FL_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*FROM ([0-9]{3})?([0-9]{2})KT. ((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; + + // Pattern used for extracting the direction, speed, distance, and + // flight level + final Pattern flPattern = Pattern.compile(FL_EXP); + Matcher theMatcher = flPattern.matcher(theFlight); + + // Regular expression for the classType line + final String CLASS_EXP = "((DMSHG|DSIPTG|INTSFYG|DVLPG) )?(LINE|AREA|ISOL)(\\S|\\s)*((TOP|TOPS) (TO|ABV)) FL([0-9]{3})"; + + // Pattern used for extracting the class type and flight level + final Pattern classPattern = Pattern.compile(CLASS_EXP); + Matcher classMatcher = classPattern.matcher(theFlight); + + ConvSigmetSection currentSection = new ConvSigmetSection(); + + if (theMatcher.find()) { + classType = theMatcher.group(3); + + int direction = Integer.parseInt(theMatcher.group(5)); + int speed = Integer.parseInt(theMatcher.group(6)); + int flightLevel = Integer.parseInt(theMatcher.group(10)); + String flightLevelTop = theMatcher.group(7); + String intensity = theMatcher.group(1); + + currentSection.setFlightLevel(flightLevel); + currentSection.setDirection(direction); + currentSection.setSpeed(speed); + currentSection.setClassType(classType); + currentSection.setIntensity(intensity); + currentSection.setCloudTop(flightLevelTop); + + if (classType.equals("LINE")) { + final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; + final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); + Matcher disMatcher = distancePattern.matcher(theFlight); + if (disMatcher.find()) { + int distance = Integer.parseInt(disMatcher.group(3)); + currentSection.setDistance(distance); + } + } else if (classType.equals("ISOL")) { + final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; + final Pattern isoldistancePattern = Pattern + .compile(ISOLDISTANCE_EXP); + Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); + if (isoldisMatcher.find()) { + int distance = Integer.parseInt(isoldisMatcher.group(2)); + currentSection.setDistance(distance); + } + // get ISOL location table + getIsolLocation(theFlight, currentSection); + } + + } else if (classMatcher.find()) { + classType = classMatcher.group(3); + + int flightLevel = Integer.parseInt(classMatcher.group(8)); + String flightLevelTop = classMatcher.group(5); + String intensity = classMatcher.group(1); + + currentSection.setFlightLevel(flightLevel); + currentSection.setClassType(classType); + currentSection.setIntensity(intensity); + currentSection.setCloudTop(flightLevelTop); + + if (classType.equals("LINE")) { + final String DISTANCE_EXP = "LINE (EMBD )?(SEV )?TS ([0-9]{2})"; + final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); + Matcher disMatcher = distancePattern.matcher(theFlight); + if (disMatcher.find()) { + int distance = Integer.parseInt(disMatcher.group(3)); + currentSection.setDistance(distance); + } + } else if (classType.equals("ISOL")) { + final String ISOLDISTANCE_EXP = "ISOL (\\S|\\s)* TS D([0-9]{2})"; + final Pattern isoldistancePattern = Pattern + .compile(ISOLDISTANCE_EXP); + Matcher isoldisMatcher = isoldistancePattern.matcher(theFlight); + if (isoldisMatcher.find()) { + int distance = Integer.parseInt(isoldisMatcher.group(2)); + currentSection.setDistance(distance); + } + // get ISOL location table + getIsolLocation(theFlight, currentSection); + } + + } else { + // Finds no "flight level line", "CS" as default for a NIL report. + currentSection.setClassType("CS"); + currentSection.setIntensity(null); + } + + return currentSection; + } + + /** + * Obtains the start time and end time + * + * @param theSection + * The outlook section contains the valid times group + */ + public static void processValidTime(String theSection, + ConvSigmetSection currentOutLook, Headers headers) { + + // Regular expression for start time + final String TIMES_EXP = "OUTLOOK VALID ([0-9]{6})-([0-9]{6})"; + + // Pattern used for extracting the starting time and end time + final Pattern starttimePattern = Pattern.compile(TIMES_EXP); + + Calendar startTime = null; + Calendar endTime = null; + // Calendar mndTime = Calendar.getInstance(); + + Matcher theMatcher = starttimePattern.matcher(theSection); + + if (theMatcher.find()) { + // Decode the start time and end time; then set them. + startTime = TimeTools.findDataTime(theMatcher.group(1), headers); + currentOutLook.setStartTime(startTime); + endTime = TimeTools.findDataTime(theMatcher.group(2), headers); + + int startMonth = startTime.get(Calendar.MONTH); + int endMonth = endTime.get(Calendar.MONTH); + int startDay = startTime.get(Calendar.DAY_OF_MONTH); + int endDay = endTime.get(Calendar.DAY_OF_MONTH); + + if ((startMonth == endMonth) && (startDay > endDay)) { + // Roll over a month + endTime.add(Calendar.MONTH, 1); + } + + currentOutLook.setEndTime(endTime); + } else { + currentOutLook.setStartTime(startTime); + currentOutLook.setEndTime(endTime); + } + + } + + /** + * Obtains the location information for ISOL. + * + * @param theSection + * The section lines from bulletin message + * @param sectionTable + * The section Table + */ + public static void getIsolLocation(String theSection, + ConvSigmetSection sectionTable) { + + String line = null; + LatLonPoint point = null; + + final String ISOLLOCATION_EXP = "\\x0d\\x0d\\x0a(([0-9]{2}|[0-9]{3})([ENSW])* [A-Z]{3})\\x0d\\x0d\\x0a"; + final Pattern isollocationPattern = Pattern.compile(ISOLLOCATION_EXP); + Matcher isollocMatcher = isollocationPattern.matcher(theSection); + if (isollocMatcher.find()) { + line = isollocMatcher.group(1); + } + + if (line != null) { + ConvSigmetLocation currentLocation = new ConvSigmetLocation(); + currentLocation.setLocationLine(line); + currentLocation.setLocation(line); + currentLocation.setIndex(1); + // Get a latLonPoint for this station ID from "vors" location table + point = LatLonLocTbl.getLatLonPoint(line, "vors"); + currentLocation.setLatitude(point + .getLatitude(LatLonPoint.INDEGREES)); + currentLocation.setLongitude(point + .getLongitude(LatLonPoint.INDEGREES)); + sectionTable.addConvSigmetLocation(currentLocation); + } + } + + /** + * Parse the location lines and add location table to the section table if + * any + * + * @param theSection + * The section lines from bulletin message + * @param sectionTable + * The section Table + * @return true if finds a location line + */ + public static Boolean processLocation(String theSection, + ConvSigmetSection sectionTable) { + + Boolean hasLocationLine = true; + String locationDelimiter = "-"; + + ArrayList terminationList = new ArrayList(); + terminationList.addAll(Arrays + .asList(new String[] { "WST", "REF", "LINE", "AREA", "ISOL", + "DMSHG", "DVLPG", "DSIPTG", "INTSFYG" })); + + LatLonPoint point = null; + + Scanner sclocations = new Scanner(theSection).useDelimiter("FROM"); + + // throws away the first section which is not the "FROM" location + String locationSection = sclocations.next(); + + if (sclocations.hasNext()) { + locationSection = sclocations.next(); + + Scanner scLocationLine = new Scanner(locationSection) + .useDelimiter("\\x0d\\x0d\\x0a"); + String lines = " "; + String curLine = null; + ArrayList locationList = new ArrayList(); + locationList.clear(); + Boolean notBreak = true; + + while (scLocationLine.hasNext() && notBreak) { + // Get next location line + curLine = scLocationLine.next(); + + Scanner scLocationToken = new Scanner(curLine); + if (scLocationToken.hasNext()) { + // Check the first token from each line + String firstToken = scLocationToken.next(); + if (terminationList.contains(firstToken)) { + // terminate + notBreak = false; + break; + } + } + lines = lines.concat(" ").concat(curLine); + } + + // Clean up the leading space + lines = UtilN.removeLeadingWhiteSpaces(lines); + // Parse the location lines by a "-" + Scanner scLocation = new Scanner(lines) + .useDelimiter(locationDelimiter); + locationList.clear(); + // Get all locations + while (scLocation.hasNext()) { + locationList.add(scLocation.next()); + } + + // set locations to data base + if (locationList.size() > 1) { + Integer idxLocation = 0; + for (String Location : locationList) { + + ConvSigmetLocation currentLocation = new ConvSigmetLocation(); + currentLocation.setLocationLine(lines); + currentLocation.setLocation(Location); + + // Get a latLonPoint for this station ID from "vors" + // location table + point = LatLonLocTbl.getLatLonPoint(Location, "vors"); + currentLocation.setLatitude(point + .getLatitude(LatLonPoint.INDEGREES)); + currentLocation.setLongitude(point + .getLongitude(LatLonPoint.INDEGREES)); + + currentLocation.setIndex(idxLocation + 1); + idxLocation++; + + sectionTable.addConvSigmetLocation(currentLocation); + } + } else { + hasLocationLine = false; + } + + } else { + hasLocationLine = false; + } + + return hasLocationLine; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java old mode 100644 new mode 100755 index 4f09986546..91040f9487 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.convsigmet/src/gov/noaa/nws/ncep/edex/plugin/convsigmet/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.convsigmet.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ffg/gov.noaa.nws.ncep.edex.plugin.ffg.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ffg/gov.noaa.nws.ncep.edex.plugin.ffg.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.idft/gov.noaa.nws.ncep.edex.plugin.idft.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.idft/gov.noaa.nws.ncep.edex.plugin.idft.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.idft/src/gov/noaa/nws/ncep/edex/plugin/idft/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.idft/src/gov/noaa/nws/ncep/edex/plugin/idft/decoder/package-info.java index 6be47d815c..ac808192ab 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.idft/src/gov/noaa/nws/ncep/edex/plugin/idft/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.idft/src/gov/noaa/nws/ncep/edex/plugin/idft/decoder/package-info.java @@ -1,7 +1,7 @@ -/** - * IDFT implementation of the plugin pattern. - * - * Package includes classes to decode the IDFT message and persist the data. - * - */ +/** + * IDFT implementation of the plugin pattern. + * + * Package includes classes to decode the IDFT message and persist the data. + * + */ package gov.noaa.nws.ncep.edex.plugin.idft.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/component-deploy.xml old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/gov.noaa.nws.ncep.edex.plugin.intlsigmet.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/gov.noaa.nws.ncep.edex.plugin.intlsigmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-common.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-common.xml old mode 100644 new mode 100755 index 6acee491a6..b88e96a48d --- a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-common.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-common.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-ingest.xml old mode 100644 new mode 100755 index 79ce6b0e5c..8c04e35c3d --- a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/res/spring/intlsigmet-ingest.xml @@ -1,72 +1,72 @@ - - - - - - - - - - - - - - - - - - - - - - - - intlsigmet - - - - - - - - - - - - - java.lang.Throwable - - - - - - - java.lang.Throwable - - - - - + + + + + + + + + + + + + + + + + + + + + + + + intlsigmet + + + + + + + + + + + + + java.lang.Throwable + + + + + + + java.lang.Throwable + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetDecoder.java index 39648fbe79..f844f1398c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetDecoder.java @@ -1,197 +1,197 @@ -/** - * - * IntlSigmet Decoder - * - * This java class decodes INTLSIGMET raw data. - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 113 L. Lin Initial creation - * 07/2009 113 L. Lin Migration to TO11 - * 05/2010 113 L. Lin Migration to TO11DR11 - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.intlsigmet.decoder; - -import gov.noaa.nws.ncep.common.dataplugin.intlsigmet.IntlSigmetRecord; -import gov.noaa.nws.ncep.edex.plugin.intlsigmet.util.IntlSigmetParser; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.Calendar; -import java.util.Scanner; - -import com.raytheon.edex.esb.Headers; -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.edex.decodertools.core.IDecoderConstants; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class IntlSigmetDecoder extends AbstractDecoder { - - private final String pluginName; - - /** - * Constructor - * - * @throws DecoderException - */ - public IntlSigmetDecoder(String name) throws DecoderException { - pluginName = name; - } - - public PluginDataObject[] decode(byte[] data, Headers headers) - throws DecoderException { - - String traceId = ""; - if (headers != null) { - traceId = (String) headers.get("traceId"); - } - - String etx = IDecoderConstants.ETX; - String theBulletin = null; - - Calendar startTime = null; - byte[] messageData = null; - - IntlSigmetRecord record = null; - // Default equal to four hours from start time if there is no valid time - // in report - final int validPeriod = 4; - - IntlSigmetSeparator sep = IntlSigmetSeparator.separate(data, headers); - messageData = sep.next(); - String theMessage = new String(messageData); - - /* - * May have multiple duplicate bulletins, only get the first bulletin - * and eliminate the remaining bulletins after the first bulletin. - */ - Scanner cc = new Scanner(theMessage).useDelimiter(etx); - if (cc.hasNext()) { - theBulletin = cc.next(); - } else { - theBulletin = theMessage; - } - - // Decode and set WMO line - record = IntlSigmetParser.processWMO(theBulletin, headers); - - /* - * Check the IntlSigmet record object. If not, throws exception. - */ - if (record != null) { - record.setTraceId(traceId); - record.setPluginName(pluginName); - record.setReportType(pluginName); - record.setHazardType(IntlSigmetParser.getHazardType(theBulletin)); - // Decode and set the messageID - record.setMessageID(IntlSigmetParser.getMessageID(theBulletin)); - // Decode and set the sequence number - record.setSequenceNumber(IntlSigmetParser - .getSequenceNumber(theBulletin)); - try { - record.constructDataURI(); - } catch (PluginException e) { - logger.error("Error constructing dataURI", e); - record = null; - } - } - if (record != null) { - try { - // Replace special characters to a blank so that it may be - // readable - record.setBullMessage(UtilN - .removeLeadingWhiteSpaces((theBulletin.substring(5)) - .replace('\036', ' ').replace('\r', ' ') - .replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' '))); - - if (!record.getHazardType().equals("NIL")) { - - // Decode the issue time - Calendar issueTime = record.getIssueTime(); - - // Decode the starting time - startTime = IntlSigmetParser.getStartTime(theBulletin, - headers); - if (startTime == null) { - startTime = issueTime; - } - - // Decode the end time - Calendar endTime = IntlSigmetParser.getEndTime(theBulletin, - headers); - if (endTime == null) { - /* - * if no end time available, end time will be the start - * time plus a valid period; the default is four hours - * for now. - */ - endTime = TimeTools.copy(startTime); - endTime.add(Calendar.HOUR, validPeriod); - } - - // Set start time and end time - record.setStartTime(startTime); - record.setEndTime(endTime); - - // Decode and set the atsu - record.setAtsu(IntlSigmetParser.getAtsu(theBulletin)); - - // Decode and set the intensity - record.setIntensity(IntlSigmetParser - .getIntensity(theBulletin)); - - // Decode and set the flight levels - IntlSigmetParser.processFlightLevels(theBulletin, record); - - // Decode and set the omwo - record.setOmwo(IntlSigmetParser.getOmwo(theBulletin)); - - // Decode and set the direction - record.setDirection(IntlSigmetParser - .getDirection(theBulletin)); - - // Decode and set the speed - record.setSpeed(IntlSigmetParser.getSpeed(theBulletin)); - - // Decode and set distance - record.setDistance(IntlSigmetParser - .getDistance(theBulletin)); - - // Decode and set nameLocation - record.setNameLocation(IntlSigmetParser - .getNameLocation(theBulletin)); - - // Decode and set the remarks - record.setRemarks(IntlSigmetParser.getRemarks(theBulletin)); - - // Decode and set polyGonExtend - record.setPolygonExtent(IntlSigmetParser.getPolygonExtent(theBulletin)); - } - } catch (Exception e) { - logger.error("Error postprocessing " + pluginName, e); - record = null; - } - } - - /* - * Return the IntlSigmetRecord record object. - */ - if (record == null) { - return new PluginDataObject[0]; - } else { - return new PluginDataObject[] { record }; - } - - } - -} +/** + * + * IntlSigmet Decoder + * + * This java class decodes INTLSIGMET raw data. + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 113 L. Lin Initial creation + * 07/2009 113 L. Lin Migration to TO11 + * 05/2010 113 L. Lin Migration to TO11DR11 + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.intlsigmet.decoder; + +import gov.noaa.nws.ncep.common.dataplugin.intlsigmet.IntlSigmetRecord; +import gov.noaa.nws.ncep.edex.plugin.intlsigmet.util.IntlSigmetParser; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.Calendar; +import java.util.Scanner; + +import com.raytheon.edex.esb.Headers; +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.edex.decodertools.core.IDecoderConstants; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class IntlSigmetDecoder extends AbstractDecoder { + + private final String pluginName; + + /** + * Constructor + * + * @throws DecoderException + */ + public IntlSigmetDecoder(String name) throws DecoderException { + pluginName = name; + } + + public PluginDataObject[] decode(byte[] data, Headers headers) + throws DecoderException { + + String traceId = ""; + if (headers != null) { + traceId = (String) headers.get("traceId"); + } + + String etx = IDecoderConstants.ETX; + String theBulletin = null; + + Calendar startTime = null; + byte[] messageData = null; + + IntlSigmetRecord record = null; + // Default equal to four hours from start time if there is no valid time + // in report + final int validPeriod = 4; + + IntlSigmetSeparator sep = IntlSigmetSeparator.separate(data, headers); + messageData = sep.next(); + String theMessage = new String(messageData); + + /* + * May have multiple duplicate bulletins, only get the first bulletin + * and eliminate the remaining bulletins after the first bulletin. + */ + Scanner cc = new Scanner(theMessage).useDelimiter(etx); + if (cc.hasNext()) { + theBulletin = cc.next(); + } else { + theBulletin = theMessage; + } + + // Decode and set WMO line + record = IntlSigmetParser.processWMO(theBulletin, headers); + + /* + * Check the IntlSigmet record object. If not, throws exception. + */ + if (record != null) { + record.setTraceId(traceId); + record.setPluginName(pluginName); + record.setReportType(pluginName); + record.setHazardType(IntlSigmetParser.getHazardType(theBulletin)); + // Decode and set the messageID + record.setMessageID(IntlSigmetParser.getMessageID(theBulletin)); + // Decode and set the sequence number + record.setSequenceNumber(IntlSigmetParser + .getSequenceNumber(theBulletin)); + try { + record.constructDataURI(); + } catch (PluginException e) { + logger.error("Error constructing dataURI", e); + record = null; + } + } + if (record != null) { + try { + // Replace special characters to a blank so that it may be + // readable + record.setBullMessage(UtilN + .removeLeadingWhiteSpaces((theBulletin.substring(5)) + .replace('\036', ' ').replace('\r', ' ') + .replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' '))); + + if (!record.getHazardType().equals("NIL")) { + + // Decode the issue time + Calendar issueTime = record.getIssueTime(); + + // Decode the starting time + startTime = IntlSigmetParser.getStartTime(theBulletin, + headers); + if (startTime == null) { + startTime = issueTime; + } + + // Decode the end time + Calendar endTime = IntlSigmetParser.getEndTime(theBulletin, + headers); + if (endTime == null) { + /* + * if no end time available, end time will be the start + * time plus a valid period; the default is four hours + * for now. + */ + endTime = TimeTools.copy(startTime); + endTime.add(Calendar.HOUR, validPeriod); + } + + // Set start time and end time + record.setStartTime(startTime); + record.setEndTime(endTime); + + // Decode and set the atsu + record.setAtsu(IntlSigmetParser.getAtsu(theBulletin)); + + // Decode and set the intensity + record.setIntensity(IntlSigmetParser + .getIntensity(theBulletin)); + + // Decode and set the flight levels + IntlSigmetParser.processFlightLevels(theBulletin, record); + + // Decode and set the omwo + record.setOmwo(IntlSigmetParser.getOmwo(theBulletin)); + + // Decode and set the direction + record.setDirection(IntlSigmetParser + .getDirection(theBulletin)); + + // Decode and set the speed + record.setSpeed(IntlSigmetParser.getSpeed(theBulletin)); + + // Decode and set distance + record.setDistance(IntlSigmetParser + .getDistance(theBulletin)); + + // Decode and set nameLocation + record.setNameLocation(IntlSigmetParser + .getNameLocation(theBulletin)); + + // Decode and set the remarks + record.setRemarks(IntlSigmetParser.getRemarks(theBulletin)); + + // Decode and set polyGonExtend + record.setPolygonExtent(IntlSigmetParser.getPolygonExtent(theBulletin)); + } + } catch (Exception e) { + logger.error("Error postprocessing " + pluginName, e); + record = null; + } + } + + /* + * Return the IntlSigmetRecord record object. + */ + if (record == null) { + return new PluginDataObject[0]; + } else { + return new PluginDataObject[] { record }; + } + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetSeparator.java old mode 100644 new mode 100755 index 9586140291..ccb86b4310 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/IntlSigmetSeparator.java @@ -1,147 +1,147 @@ -/** - * IntlsigmetSeparator - * - * This class sets the raw data to an Arraylist, records, of - * String based on a uniquely identified separator. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 113 L. Lin Initial creation - * 07/2009 113 L. Lin Migration to TO11 - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.intlsigmet.decoder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.edex.util.Util; - -public class IntlSigmetSeparator extends AbstractRecordSeparator { - private final Log logger = LogFactory.getLog(getClass()); - - /** Regex used for separate the bulletins */ - private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; - - /** Regex matcher */ - private Matcher matcher; - - /** Pattern object for regex search */ - private Pattern pattern; - - /** List of records contained in file */ - private List records; - - private Iterator iterator = null; - - /** - * Constructor. - * - */ - public IntlSigmetSeparator() { - records = new ArrayList(); - } - - public static IntlSigmetSeparator separate(byte[] data, Headers headers) { - IntlSigmetSeparator ds = new IntlSigmetSeparator(); - ds.setData(data, headers); - return ds; - } - - public void setData(byte[] data, Headers headers) { - doSeparate(new String(data)); - iterator = records.iterator(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() - */ - public boolean hasNext() { - if (iterator == null) { - return false; - } else { - return iterator.hasNext(); - } - } - - /** - * Get record - */ - public byte[] next() { - try { - String temp = iterator.next(); - if (Util.isEmptyString(temp)) { - return (byte[]) null; - } else { - return temp.getBytes(); - } - } catch (NoSuchElementException e) { - return (byte[]) null; - } - } - - /** - * @param message - * separate bulletins - */ - private void doSeparate(String message) { - /* Regex used for separate the bulletins */ - - try { - pattern = Pattern.compile(BULLSEPARATOR); - matcher = pattern.matcher(message); - - /* - * Set number of bulletins to records only if the bulletin separator - * is not the same. At the point, only separators are stored in - * "records" - */ - while (matcher.find()) { - if (!records.contains(matcher.group())) { - records.add(matcher.group()); - } - } - - /* - * Append the raw data file to the records. - */ - for (int i = 0; i < records.size(); i++) { - if (i < records.size() - 1) { - records.set( - i, - "\n" - + message.substring( - message.indexOf(records.get(i)), - message.indexOf(records.get(i + 1)))); - } else { - records.set( - i, - "\n" - + message.substring(message.indexOf(records - .get(i)))); - } - } - } catch (Exception e) { - logger.warn("No valid records found!", e); - } - return; - } -} +/** + * IntlsigmetSeparator + * + * This class sets the raw data to an Arraylist, records, of + * String based on a uniquely identified separator. + * + * HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 113 L. Lin Initial creation + * 07/2009 113 L. Lin Migration to TO11 + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.intlsigmet.decoder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.edex.util.Util; + +public class IntlSigmetSeparator extends AbstractRecordSeparator { + private final Log logger = LogFactory.getLog(getClass()); + + /** Regex used for separate the bulletins */ + private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; + + /** Regex matcher */ + private Matcher matcher; + + /** Pattern object for regex search */ + private Pattern pattern; + + /** List of records contained in file */ + private List records; + + private Iterator iterator = null; + + /** + * Constructor. + * + */ + public IntlSigmetSeparator() { + records = new ArrayList(); + } + + public static IntlSigmetSeparator separate(byte[] data, Headers headers) { + IntlSigmetSeparator ds = new IntlSigmetSeparator(); + ds.setData(data, headers); + return ds; + } + + public void setData(byte[] data, Headers headers) { + doSeparate(new String(data)); + iterator = records.iterator(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() + */ + public boolean hasNext() { + if (iterator == null) { + return false; + } else { + return iterator.hasNext(); + } + } + + /** + * Get record + */ + public byte[] next() { + try { + String temp = iterator.next(); + if (Util.isEmptyString(temp)) { + return (byte[]) null; + } else { + return temp.getBytes(); + } + } catch (NoSuchElementException e) { + return (byte[]) null; + } + } + + /** + * @param message + * separate bulletins + */ + private void doSeparate(String message) { + /* Regex used for separate the bulletins */ + + try { + pattern = Pattern.compile(BULLSEPARATOR); + matcher = pattern.matcher(message); + + /* + * Set number of bulletins to records only if the bulletin separator + * is not the same. At the point, only separators are stored in + * "records" + */ + while (matcher.find()) { + if (!records.contains(matcher.group())) { + records.add(matcher.group()); + } + } + + /* + * Append the raw data file to the records. + */ + for (int i = 0; i < records.size(); i++) { + if (i < records.size() - 1) { + records.set( + i, + "\n" + + message.substring( + message.indexOf(records.get(i)), + message.indexOf(records.get(i + 1)))); + } else { + records.set( + i, + "\n" + + message.substring(message.indexOf(records + .get(i)))); + } + } + } catch (Exception e) { + logger.warn("No valid records found!", e); + } + return; + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/package-info.java old mode 100644 new mode 100755 index 9b5e68be59..cf944c8b08 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/decoder/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains decoder.java for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.intlsigmet.decoder;; +/** +* Contains decoder.java for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.intlsigmet.decoder;; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/IntlSigmetParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/IntlSigmetParser.java index b87da1056d..1e70d09e56 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/IntlSigmetParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/IntlSigmetParser.java @@ -1,1688 +1,1688 @@ -/** - * IntlSigmet DecoderUtil - * - * This java class intends to serve as a decoder utility for INTLSIGMET. - * - * HISTORY - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 113 L. Lin Initial coding - * 07/2009 113 L. Lin Migration to TO11 - * 09/2009 113 L. Lin Convert station ID to lat/lon - * if any exists. - * 11/2011 512 S. Gurung Fixed NullPointerException bug while processing lat/lon (from vors) - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.intlsigmet.util; - -import gov.noaa.nws.ncep.common.dataplugin.intlsigmet.IntlSigmetLocation; -import gov.noaa.nws.ncep.common.dataplugin.intlsigmet.IntlSigmetRecord; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; -import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.edex.decodertools.core.LatLonPoint; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class IntlSigmetParser { - - private static final String CONUS_EXP = "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|GOLF|HOTEL|" - + "INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|TANGO|" - + "UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; - - /** - * Constructor - */ - public IntlSigmetParser() { - } - - /** - * Parse the WMO line and store WMO header, OfficeID, issue time, ... - * - * @param wmoline - * The bulletin message - * - * @return an IntlSigmetRecord - */ - public static IntlSigmetRecord processWMO(String wmoline, Headers headers) { - - IntlSigmetRecord record = null; - // Regular expression for WMO/ICAO, station ID, and issue date. - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})"; - - // Pattern used for extracting WMO header, officeID, and issue date. - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(wmoline); - - if (theMatcher.find()) { - record = new IntlSigmetRecord(); - - record.setWmoHeader(theMatcher.group(1)); - record.setIssueOffice(theMatcher.group(2)); - - // Decode the issue time. - Calendar mndTime = null; - Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), - headers); - record.setIssueTime(issueTime); - - DataTime dataTime = new DataTime(issueTime); - record.setDataTime(dataTime); - } - return record; - } - - /** - * Obtains hazardType as: TS (thunderstorm), TB (turbulence), HU - * (hurricane), TR (tropical storm), TD (tropical depression), VA (volcanic - * ash cloud), MW (marked mountain waves), TC (tropical cyclone), SQ (squall - * line), CT (CAT), IC (icing), GR (hail), DS (duststorm), SS (sandstorm), - * CB (cumulonimbus), WS (low level wind shear), TEST, or CN (cancel), - * etc... - * - * @param theReport - * Input report message. - * @return a string for hazard type - */ - public static String getHazardType(String theReport) { - - String retHazardType = " "; - // Regular expression for hazardType - final String HAZARDTYPE_EXP = "(HURRICANE|HURCN |TROPICAL STORM|TROPICAL DEPRESSION|" - + " TD | SQL | TS | TS/|FRQ TS| TS| SH/TS |TURB| CB | VA | MTW |" - + " ICE | TR | GR | TC | CT | CAT | DS | SS | WS | TSGR |VOLCANIC ASH|HVYSS|" - + " ICG|ICING|LLWS|WATERSPOUTS|THUNDERSTORMS|WIND|TS OBS|CB/TS|TORNADO)"; - final String NIL_EXP = "(NIL)"; - final String MIS_EXP = "(TAF |METAR )"; - final String CNL_EXP = "(CANCEL| CNL | CNCL |:CNL| CNL|INVALID|DISCARDED|" - + "CNL SIGMET| CLN SIGMET|CNCLD)"; - final String TEST_EXP = "(TEST |DISREGARD)"; - - // Pattern used for extracting hazardType - final Pattern hazardTypePattern = Pattern.compile(HAZARDTYPE_EXP); - final Pattern nilPattern = Pattern.compile(NIL_EXP); - final Pattern cnlPattern = Pattern.compile(CNL_EXP); - final Pattern misPattern = Pattern.compile(MIS_EXP); - final Pattern testPattern = Pattern.compile(TEST_EXP); - - Matcher theMatcher = hazardTypePattern.matcher(theReport); - Matcher nilMatcher = nilPattern.matcher(theReport); - Matcher cnlMatcher = cnlPattern.matcher(theReport); - Matcher misMatcher = misPattern.matcher(theReport); - Matcher testMatcher = testPattern.matcher(theReport); - - if (cnlMatcher.find()) { - retHazardType = "CANCEL"; - } else if (testMatcher.find()) { - retHazardType = "TEST"; - } else if (theMatcher.find()) { - if (theMatcher.group(1).equals("HURRICANE")) { - retHazardType = "HURRICANE"; - } else if (theMatcher.group(1).equals("HURCN ")) { - retHazardType = "HURRICANE"; - } else if (theMatcher.group(1).equals(" TD ")) { - retHazardType = "TROPICAL DEPRESSION"; - } else if (theMatcher.group(1).equals("TROPICAL STORM")) { - retHazardType = "TROPICAL STORM"; - } else if (theMatcher.group(1).equals("TROPICAL DEPRESSION")) { - retHazardType = "TROPICAL DEPRESSION"; - } else if (theMatcher.group(1).equals(" SQL ")) { - retHazardType = "SQUALL LINE"; - } else if (theMatcher.group(1).equals("TURB")) { - retHazardType = "TURBULENCE"; - } else if (theMatcher.group(1).equals(" ICE ")) { - retHazardType = "ICING"; - } else if (theMatcher.group(1).equals(" ICG")) { - retHazardType = "ICING"; - } else if (theMatcher.group(1).equals("ICING")) { - retHazardType = "ICING"; - } else if (theMatcher.group(1).equals(" TS ")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals("FRQ TS")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals(" TS/")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals(" SH/TS ")) { - retHazardType = "THUNDERSTORM WIND SHEAR"; - } else if (theMatcher.group(1).equals(" CB ")) { - retHazardType = "CUMULONIMBUS"; - } else if (theMatcher.group(1).equals(" VA ")) { - retHazardType = "VOLCANIC ASH CLOUD"; - } else if (theMatcher.group(1).equals(" MTW ")) { - retHazardType = "MARKED MOUNTAIN WAVES"; - } else if (theMatcher.group(1).equals(" TR ")) { - retHazardType = "TROPICAL STORM"; - } else if (theMatcher.group(1).equals(" GR ")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals(" TC ")) { - retHazardType = "TROPICAL CYCLONE"; - } else if (theMatcher.group(1).equals(" CT ")) { - retHazardType = "CAT"; - } else if (theMatcher.group(1).equals(" CAT ")) { - retHazardType = "CAT"; - } else if (theMatcher.group(1).equals(" DS ")) { - retHazardType = "DUSTSTORM"; - } else if (theMatcher.group(1).equals(" SS ")) { - retHazardType = "SANDSTORM"; - } else if (theMatcher.group(1).equals(" WS ")) { - retHazardType = "LOW LEVEL WIND SHEAR"; - } else if (theMatcher.group(1).equals("LLWS")) { - retHazardType = "LOW LEVEL WIND SHEAR"; - } else if (theMatcher.group(1).equals(" TSGR ")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals("VOLCANIC ASH")) { - retHazardType = "VOLCANIC ASH CLOUD"; - } else if (theMatcher.group(1).equals("TS ")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals("HVYSS ")) { - retHazardType = "HEAVY SANDSTORM"; - } else if (theMatcher.group(1).equals("WATERSPOUTS")) { - retHazardType = "WATERSPOUTS"; - } else if (theMatcher.group(1).equals("THUNDERSTORMS")) { - retHazardType = "THUNDERSTORMS"; - } else if (theMatcher.group(1).equals("WIND")) { - retHazardType = "WINDS"; - } else if (theMatcher.group(1).equals("TS OBS")) { - retHazardType = "THUNDERSTORMS"; - } else if (theMatcher.group(1).equals(" TS")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals("CB/TS")) { - retHazardType = getThunderStorm(theReport); - } else if (theMatcher.group(1).equals("TORNADO")) { - retHazardType = "TORNADO"; - } - } else if (nilMatcher.find()) { - retHazardType = "NIL"; - } else if (misMatcher.find()) { - retHazardType = "NIL"; - } else { - retHazardType = "UNKNOWN ???"; - } - return retHazardType; - } - - /** - * Obtains the message ID. - * - * @param theBulletin - * The input bulletin - * @return a string for messageID - */ - public static String getMessageID(String theBulletin) { - - String messageID = " "; - - // // Regular expression for CONUS message ID - // final String CONUS_EXP = - // "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|" + - // "GOLF|HOTEL|INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|" - // + - // "ROMEO|SIERRA|TANGO|UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) " + - // "([0-9]{1}|[0-9]{2}) VALID"; - - // Pattern used for extracting the message ID - final Pattern conusPattern = Pattern.compile(CONUS_EXP); - Matcher idconusMatcher = conusPattern.matcher(theBulletin); - - // Regular expression for CANADA message ID - final String CANADA_EXP = "SIGMET ([A-Z]{1})([0-9]{1}|[0-9]{2}) (VALID " - + "([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; - // Pattern used for extracting the message ID - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher idcanadaMatcher = canadaPattern.matcher(theBulletin); - - // Regular expression for JAPAN and UK message ID - final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) (VALID )?" - + "([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; - // Pattern used for extracting the message ID - final Pattern japanPattern = Pattern.compile(JAPAN_EXP); - Matcher idjapanMatcher = japanPattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER1_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})(-)?"; - // Pattern used for extracting the message ID - final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); - Matcher idother1Matcher = other1Pattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER2_EXP = "(SIGMET) ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}|[A-Z]{1}[0-9]{2}) " - + "VALID ([0-9]{6})/([0-9]{6})"; - // Pattern used for extracting the message ID - final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); - Matcher idother2Matcher = other2Pattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER3_EXP = "([A-Z]{4}) SIGMET ([A-Z]* )?([0-9]{1}|[0-9]{2}) VALID ([0-9]{6})/([0-9]{6}) " - + "([A-Z]{4})(-)?"; - // Pattern used for extracting the message ID - final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); - Matcher idother3Matcher = other3Pattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER4_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message ID - final Pattern other4Pattern = Pattern.compile(OTHER4_EXP); - Matcher idother4Matcher = other4Pattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER5_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message ID - final Pattern other5Pattern = Pattern.compile(OTHER5_EXP); - Matcher idother5Matcher = other5Pattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER6_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{6})Z/([0-9]{6})Z( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message ID - final Pattern other6Pattern = Pattern.compile(OTHER6_EXP); - Matcher idother6Matcher = other6Pattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER7_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{4})/([0-9]{4})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message ID - final Pattern other7Pattern = Pattern.compile(OTHER7_EXP); - Matcher idother7Matcher = other7Pattern.matcher(theBulletin); - - // Regular expression for others' message ID - final String OTHER8_EXP = "([A-Z]{4}) SIGMET( |\\W)*VALID( |\\W)*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message ID - final Pattern other8Pattern = Pattern.compile(OTHER8_EXP); - Matcher idother8Matcher = other8Pattern.matcher(theBulletin); - - // Get messageID - if (idconusMatcher.find()) { - messageID = idconusMatcher.group(2); - } else if (idcanadaMatcher.find()) { - messageID = idcanadaMatcher.group(6); - } else if (idother1Matcher.find()) { - messageID = idother1Matcher.group(6); - } else if (idjapanMatcher.find()) { - messageID = idjapanMatcher.group(7); - } else if (idother2Matcher.find()) { - messageID = idother2Matcher.group(1); - } else if (idother3Matcher.find()) { - messageID = idother3Matcher.group(6); - } else if (idother4Matcher.find()) { - messageID = idother4Matcher.group(8); - } else if (idother5Matcher.find()) { - messageID = idother5Matcher.group(7); - } else if (idother6Matcher.find()) { - messageID = idother6Matcher.group(8); - } else if (idother7Matcher.find()) { - messageID = idother7Matcher.group(8); - } else if (idother8Matcher.find()) { - messageID = idother8Matcher.group(7); - } - - return messageID; - } - - /** - * Obtains the sequence number. - * - * @param theBulletin - * The input bulletin - * @return a string for sequenceNumber - */ - public static String getSequenceNumber(String theBulletin) { - - String sequenceNumber = " "; - - // // Regular expression for CONUS sequence number - // final String CONUS_EXP = - // "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|GOLF|HOTEL|" - // + - // "INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|TANGO|" - // + - // "UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; - - // Pattern used for extracting the sequence number - final Pattern conusPattern = Pattern.compile(CONUS_EXP); - Matcher seqnoconusMatcher = conusPattern.matcher(theBulletin); - - // Regular expression for CANADA sequence number - final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}|[A-Z]{1}[0-9]{2}) " - + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; - // Pattern used for extracting the sequence number - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher seqnocanadaMatcher = canadaPattern.matcher(theBulletin); - - // Regular expression for JAPAN and UK sequence number - final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " - + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; - // Pattern used for extracting the sequence number - final Pattern japanPattern = Pattern.compile(JAPAN_EXP); - Matcher seqnojapanMatcher = japanPattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})(-)?"; - // Pattern used for extracting the sequence number - final Pattern otherPattern = Pattern.compile(OTHER_EXP); - Matcher seqnootherMatcher = otherPattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER2_EXP = "SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}|A-Z]{1}[0-9]{2}) " - + "VALID ([0-9]{6})/([0-9]{6})"; - // Pattern used for extracting the sequence number - final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); - Matcher seqnoother2Matcher = other2Pattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER3_EXP = "([A-Z]{4}) SIGMET (([A-Z]* )?([0-9]{1}|[0-9]{2})) " - + "VALID ([0-9]{6})/([0-9]{6}) ([A-Z]{4})(-)?"; - // Pattern used for extracting the sequence number - final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); - Matcher seqnoother3Matcher = other3Pattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER4_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the sequence number - final Pattern other4Pattern = Pattern.compile(OTHER4_EXP); - Matcher seqnoother4Matcher = other4Pattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER5_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the sequence number - final Pattern other5Pattern = Pattern.compile(OTHER5_EXP); - Matcher seqnoother5Matcher = other5Pattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER6_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{6})Z/([0-9]{6})Z( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message sequence number - final Pattern other6Pattern = Pattern.compile(OTHER6_EXP); - Matcher seqnoother6Matcher = other6Pattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER7_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{4})/([0-9]{4})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the sequence number - final Pattern other7Pattern = Pattern.compile(OTHER7_EXP); - Matcher seqnoother7Matcher = other7Pattern.matcher(theBulletin); - - // Regular expression for others' sequence number - final String OTHER8_EXP = "([A-Z]{4}) SIGMET( |\\W)*([0-9]{1})( |\\W)*VALID"; - // Pattern used for extracting the sequence number - final Pattern other8Pattern = Pattern.compile(OTHER8_EXP); - Matcher seqnoother8Matcher = other8Pattern.matcher(theBulletin); - - // Get sequenceNumber - if (seqnoconusMatcher.find()) { - sequenceNumber = seqnoconusMatcher.group(3); - } else if (seqnocanadaMatcher.find()) { - sequenceNumber = seqnocanadaMatcher.group(1); - } else if (seqnootherMatcher.find()) { - sequenceNumber = seqnootherMatcher.group(2); - } else if (seqnojapanMatcher.find()) { - sequenceNumber = seqnojapanMatcher.group(2); - } else if (seqnoother2Matcher.find()) { - sequenceNumber = seqnoother2Matcher.group(1); - } else if (seqnoother3Matcher.find()) { - sequenceNumber = seqnoother3Matcher.group(2); - } else if (seqnoother4Matcher.find()) { - sequenceNumber = seqnoother4Matcher.group(3); - } else if (seqnoother5Matcher.find()) { - // lacking sequence number; default 0 - sequenceNumber = "0"; - } else if (seqnoother6Matcher.find()) { - sequenceNumber = seqnoother6Matcher.group(3); - } else if (seqnoother7Matcher.find()) { - sequenceNumber = seqnoother7Matcher.group(3); - } else if (seqnoother8Matcher.find()) { - sequenceNumber = seqnoother8Matcher.group(3); - } - - return sequenceNumber; - } - - /** - * Obtains the Air Traffic Service Unit. - * - * @param theBulletin - * The input bulletin - * @return a string for atsu. - */ - public static String getAtsu(String theBulletin) { - - String atsu = null; - - // // Regular expression for CONUS ATSU - // final String CONUS_EXP = - // "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|GOLF|" + - // "HOTEL|INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|" - // + - // "TANGO|UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; - - // Pattern used for extracting the ATSU - final Pattern conusPattern = Pattern.compile(CONUS_EXP); - Matcher atsuconusMatcher = conusPattern.matcher(theBulletin); - - // Regular expression for CANADA ATSU - final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}|[A-Z]{1}[0-9]{2}) " - + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; - // Pattern used for extracting the ATSU - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher atsucanadaMatcher = canadaPattern.matcher(theBulletin); - - // Regular expression for JAPAN and UK ATSU - final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " - + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; - // Pattern used for extracting the ATSU - final Pattern japanPattern = Pattern.compile(JAPAN_EXP); - Matcher atsujapanMatcher = japanPattern.matcher(theBulletin); - - // Regular expression for others' ATSU - final String OTHER1_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2})" - + "( )*VALID"; - // Pattern used for extracting the ATSU - final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); - Matcher atsuother1Matcher = other1Pattern.matcher(theBulletin); - - // Regular expression for CONUS ATSU - final String CONUS2_EXP = "([A-Z]{4} ([A-Z]{4} )*)SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|" - + "GOLF|HOTEL|INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|" - + "TANGO|UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; - // Pattern used for extracting the ATSU - final Pattern conus2Pattern = Pattern.compile(CONUS2_EXP); - Matcher atsuconus2Matcher = conus2Pattern.matcher(theBulletin); - - final String OTHER2_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the ATSU - final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); - Matcher atsuother2Matcher = other2Pattern.matcher(theBulletin); - - // Regular expression for others' ATSU - final String OTHER3_EXP = "([A-Z]{4}) SIGMET ([0-9]{1})( |\\W)*VALID( |\\W)*" - + "([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the ATSU - final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); - Matcher atsuother3Matcher = other3Pattern.matcher(theBulletin); - - // Get atsu - if (atsuconus2Matcher.find()) { - atsu = atsuconus2Matcher.group(1); - } else if (atsuconusMatcher.find()) { - atsu = atsuconusMatcher.group(1); - } else if (atsucanadaMatcher.find()) { - atsu = atsucanadaMatcher.group(5); - } else if (atsuother1Matcher.find()) { - atsu = atsuother1Matcher.group(1); - } else if (atsujapanMatcher.find()) { - atsu = atsujapanMatcher.group(1); - } else if (atsuother2Matcher.find()) { - atsu = atsuother2Matcher.group(1); - } else if (atsuother3Matcher.find()) { - atsu = atsuother3Matcher.group(1); - } - - return atsu; - } - - /** - * Obtains the location indicator of the meteorological watch office - * originating the message. - * - * @param theBulletin - * The input bulletin - * @return a string for omwo. - */ - public static String getOmwo(String theBulletin) { - - String omwo = " "; - - // Regular expression for CONUS OMWO - final String CONUS_EXP = "([A-Z]{4}) ([A-Z]{4} )?SIGMET ([A-Z])* ([0-9]{1}|[0-9]{2}) " - + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})-"; - // Pattern used for extracting the OMWO - final Pattern conusPattern = Pattern.compile(CONUS_EXP); - Matcher omwoconusMatcher = conusPattern.matcher(theBulletin); - - // Regular expression for CANADA OMWO - final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}|[A-Z]{1}[0-9]{2}) " - + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; - // Pattern used for extracting the OMWO - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher omwocanadaMatcher = canadaPattern.matcher(theBulletin); - - // Regular expression for JAPAN and UK OMWO - final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " - + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; - // Pattern used for extracting the OMWO - final Pattern japanPattern = Pattern.compile(JAPAN_EXP); - Matcher omwojapanMatcher = japanPattern.matcher(theBulletin); - - // Regular expression for other OMWO - final String OTHER_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})(-)?"; - // Pattern used for extracting the OMWO - final Pattern otherPattern = Pattern.compile(OTHER_EXP); - Matcher omwootherMatcher = otherPattern.matcher(theBulletin); - - // Regular expression for others' OMWO - final String OTHER2_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|" - + "[A-Z]{2}[0-9]{2}|[A-Z]{1}[0-9]{2}) " - + "VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message OMWO - final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); - Matcher omwoother2Matcher = other2Pattern.matcher(theBulletin); - - // Regular expression for others' OMWO - final String OTHER3_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})" - + "( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message OMWO - final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); - Matcher omwoother3Matcher = other3Pattern.matcher(theBulletin); - - // Regular expression for others' OMWO - final String OTHER4_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{4})/([0-9]{4})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message OMWO - final Pattern other4Pattern = Pattern.compile(OTHER4_EXP); - Matcher omwoother4Matcher = other4Pattern.matcher(theBulletin); - - // Regular expression for others' OMWO - final String OTHER5_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " - + "VALID( )*([0-9]{6})Z/([0-9]{6})Z( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the message OMWO - final Pattern other5Pattern = Pattern.compile(OTHER5_EXP); - Matcher omwoother5Matcher = other5Pattern.matcher(theBulletin); - - // Regular expression for others' OMWO - final String OTHER6_EXP = "([A-Z]{4}) SIGMET ([0-9]{1})( |\\W)*" - + "VALID( |\\W)*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; - // Pattern used for extracting the OMWO - final Pattern other6Pattern = Pattern.compile(OTHER6_EXP); - Matcher omwoother6Matcher = other6Pattern.matcher(theBulletin); - - // Get omwo - if (omwoconusMatcher.find()) { - omwo = omwoconusMatcher.group(8); - } else if (omwocanadaMatcher.find()) { - omwo = omwocanadaMatcher.group(5); - } else if (omwootherMatcher.find()) { - omwo = omwootherMatcher.group(6); - } else if (omwojapanMatcher.find()) { - omwo = omwojapanMatcher.group(7); - } else if (omwoother2Matcher.find()) { - omwo = omwoother2Matcher.group(8); - } else if (omwoother3Matcher.find()) { - omwo = omwoother3Matcher.group(7); - } else if (omwoother4Matcher.find()) { - omwo = omwoother4Matcher.group(8); - } else if (omwoother5Matcher.find()) { - omwo = omwoother5Matcher.group(8); - } else if (omwoother6Matcher.find()) { - omwo = omwoother6Matcher.group(8); - } - - return omwo; - } - - /** - * Obtains start time from input bulletin. - * - * @param theReport - * The bulletin message - * @return a calendar for start time - */ - public static Calendar getStartTime(String theBulletin, Headers headers) { - - String time = "???"; - - // Regular expression for general start time group - final String START_EXP = " VALID( )*([0-9]{6})/([0-9]{6})"; - // Pattern used for extracting the start time group - final Pattern startPattern = Pattern.compile(START_EXP); - Matcher timestartMatcher = startPattern.matcher(theBulletin); - - // Regular expression for CANADA start time group - final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}) VALID ([0-9]{6})/([0-9]{6}) ([A-Z]{4})-"; - // Pattern used for extracting the start time group - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher timecanadaMatcher = canadaPattern.matcher(theBulletin); - - // Regular expression for JAPAN and UK start time group - final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " - + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; - // Pattern used for extracting the start time group - final Pattern japanPattern = Pattern.compile(JAPAN_EXP); - Matcher timejapanMatcher = japanPattern.matcher(theBulletin); - - // Regular expression for others' start time - final String OTHER1_EXP = " VALID( )*([0-9]{6})(Z)?/([0-9]{6})(Z)?"; - // Pattern used for extracting the start time - final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); - Matcher time1Matcher = other1Pattern.matcher(theBulletin); - - // Regular expression for others' start time - final String OTHER2_EXP = " VALID( )*([0-9]{4})/([0-9]{4})"; - // Pattern used for extracting the start time - final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); - Matcher time2Matcher = other2Pattern.matcher(theBulletin); - - // Get time group - if (timestartMatcher.find()) { - time = timestartMatcher.group(2); - } else if (timejapanMatcher.find()) { - time = timejapanMatcher.group(4); - } else if (time1Matcher.find()) { - time = time1Matcher.group(2); - } else if (timecanadaMatcher.find()) { - time = timecanadaMatcher.group(2); - } else if (time2Matcher.find()) { - // Handle start time in special case without day - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{2})([0-9]{4})"; - // Pattern used for extracting WMO header, officeID, and issue date - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(theBulletin); - if (theMatcher.find()) { - time = time2Matcher.group(2).concat(theMatcher.group(3)); - } - } - if (time != "???") { - // Get start time - return TimeTools.findDataTime(time, headers); - } else { - return null; - } - } - - /** - * Get the end time - * - * @param theBulletin - * The bulletin which contains end time - * @return a calendar for end time - */ - public static Calendar getEndTime(String theBulletin, Headers headers) { - - String time = "???"; - - // Regular expression for CONUS end time group - final String ENDTIME_EXP = " VALID( )*([0-9]{6})/([0-9]{6})"; - // Pattern used for extracting the end time group - final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); - Matcher endtimeMatcher = endtimePattern.matcher(theBulletin); - - // Regular expression for CANADA end time group - final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}) " - + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; - // Pattern used for extracting the end time group - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher timecanadaMatcher = canadaPattern.matcher(theBulletin); - - // Regular expression for JAPAN and UK end time group - final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " - + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; - // Pattern used for extracting the end time group - final Pattern japanPattern = Pattern.compile(JAPAN_EXP); - Matcher timejapanMatcher = japanPattern.matcher(theBulletin); - - // Regular expression for others' end time - final String OTHER1_EXP = " VALID( )*([0-9]{6})(Z)?/([0-9]{6})(Z)?"; - // Pattern used for extracting the end time - final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); - Matcher time1Matcher = other1Pattern.matcher(theBulletin); - - // Regular expression for others' end time - final String OTHER2_EXP = " VALID( )*([0-9]{4})/([0-9]{4})"; - // Pattern used for extracting the end time - final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); - Matcher time2Matcher = other2Pattern.matcher(theBulletin); - - // Get time group - if (endtimeMatcher.find()) { - time = endtimeMatcher.group(3); - } else if (timejapanMatcher.find()) { - time = timejapanMatcher.group(4); - } else if (timecanadaMatcher.find()) { - time = timecanadaMatcher.group(4); - } else if (timecanadaMatcher.find()) { - time = timecanadaMatcher.group(6); - } else if (time1Matcher.find()) { - time = time1Matcher.group(4); - } else if (time2Matcher.find()) { - // Handle end time special case without day - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{2})([0-9]{4})"; - // Pattern used for extracting WMO header, officeID and issue time - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(theBulletin); - if (theMatcher.find()) { - time = time2Matcher.group(3).concat(theMatcher.group(3)); - } - } - - if (time != "???") { - // Get end time - Calendar mndTime = null; - return TimeTools.findDataTime(time, headers); - } else { - return null; - } - } - - /** - * Parse the bulletin and store flight level 1 or level 2 if any. - * - * @param theBulletin - * The bulletin message - * @param record - * The main table - */ - public static void processFlightLevels(String theBulletin, - IntlSigmetRecord record) { - - String flevel1 = " "; - String flevel2 = " "; - - // Regular expression for general one flight level - final String FLEVEL1_EXP = "(TOP|TOPS|TOPS TO) FL( )?([0-9]{3})"; - // Pattern used for extracting the flight level - final Pattern flevel1Pattern = Pattern.compile(FLEVEL1_EXP); - Matcher flevel1Matcher = flevel1Pattern.matcher(theBulletin); - - // Regular expression for flight levels in format "BETWEEN ... AND ...." - final String BETWEEN_EXP = "(BETWEEN|BTN) (FL)?([0-9]{3}|[0-9]{2}) AND " - + "(FL)?([0-9]{3}|[0-9]{2})"; - // Pattern used for extracting the flight levels - final Pattern betweenPattern = Pattern.compile(BETWEEN_EXP); - Matcher betweenMatcher = betweenPattern.matcher(theBulletin); - - // Regular expression for flight levels in format - // "TOPS ... MAX TOPS ...." for Canada - final String MAXTOPS_EXP = "TOPS( |\\x0d\\x0d\\x0a)([0-9]{3}|[0-9]{2}) " - + "MAX TOPS ([0-9]{3}|[0-9]{2})"; - // Pattern used for extracting the flight levels - final Pattern maxtopsPattern = Pattern.compile(MAXTOPS_EXP); - Matcher maxtopsMatcher = maxtopsPattern.matcher(theBulletin); - - // Regular expression for general two flight levels in "360-440" or - // "360/440" format - final String FLEVEL2_EXP = "FL([0-9]{3}|[0-9]{2})(-|/)([0-9]{3}|[0-9]{2})"; - // Pattern used for extracting the flight levels - final Pattern flevel2Pattern = Pattern.compile(FLEVEL2_EXP); - Matcher flevel2Matcher = flevel2Pattern.matcher(theBulletin); - - // Regular expression for general one flight level - final String FLEVEL3_EXP = "(TOP|TOPS|TOPS TO) (FL )?([0-9]{3})"; - // Pattern used for extracting the flight level - final Pattern flevel3Pattern = Pattern.compile(FLEVEL3_EXP); - Matcher flevel3Matcher = flevel3Pattern.matcher(theBulletin); - - final String FLEVEL4_EXP = "FL([0-9]{3})"; - // Pattern used for extracting the flight level - final Pattern flevel4Pattern = Pattern.compile(FLEVEL4_EXP); - Matcher flevel4Matcher = flevel4Pattern.matcher(theBulletin); - - // Get flight levels group - if (maxtopsMatcher.find()) { - flevel1 = maxtopsMatcher.group(3); - } else if (flevel2Matcher.find()) { - flevel1 = flevel2Matcher.group(1); - flevel2 = flevel2Matcher.group(3); - } else if (betweenMatcher.find()) { - flevel1 = betweenMatcher.group(3); - flevel2 = betweenMatcher.group(5); - } else if (flevel1Matcher.find()) { - flevel1 = flevel1Matcher.group(3); - } else if (flevel3Matcher.find()) { - flevel1 = flevel3Matcher.group(3); - } else if (flevel4Matcher.find()) { - flevel1 = flevel4Matcher.group(1); - } - - // Set flight levels to database - if (flevel1 != " ") { - record.setFlightlevel1(Integer.parseInt(flevel1)); - } - if (flevel2 != " ") { - record.setFlightlevel2(Integer.parseInt(flevel2)); - } - - // Parse the locations - processLocation(theBulletin, record); - - } - - /** - * Obtains remarks from a bulletin - * - * @param bullMessage - * The bulletin message - * @return a string for remarks - */ - public static String getRemarks(String bullMessage) { - - String retRemarks = " "; - - // Regular expression correction - final String CORR_EXP = "(COR | (CC[A-Z]{1}))"; - - // Pattern used for extracting correction - final Pattern corrPattern = Pattern.compile(CORR_EXP); - Matcher corrMatcher = corrPattern.matcher(bullMessage); - - // Regular expression amendment - final String AMD_EXP = "(AMD )"; - // Pattern used for extracting amendment - final Pattern amdPattern = Pattern.compile(AMD_EXP); - Matcher amdMatcher = amdPattern.matcher(bullMessage); - - // Regular expression for TEST - final String TEST_EXP = "TEST "; - // Pattern used for extracting test - final Pattern testPattern = Pattern.compile(TEST_EXP); - Matcher testMatcher = testPattern.matcher(bullMessage); - - if (corrMatcher.find()) { - retRemarks = corrMatcher.group(1); - } else if (amdMatcher.find()) { - retRemarks = amdMatcher.group(); - } else if (testMatcher.find()) { - retRemarks = "TEST"; - } - - return retRemarks; - } - - /** - * Obtains speed from a bulletin - * - * @param bullMessage - * The bulletin message - * @return an integer for speed - */ - public static Integer getSpeed(String bullMessage) { - - Integer retSpeed = IDecoderConstantsN.INTEGER_MISSING; - - final String SPEED_EXP = "(MOVE|MOV|MOVG) (|E|N|S|W|\006|\012)* " - + "([0-9]{1}|[0-9]{2})(-[0-9]{2})?( )?(KT)"; - // Pattern used for extracting speed for general - final Pattern speedPattern = Pattern.compile(SPEED_EXP); - Matcher theMatcher = speedPattern.matcher(bullMessage); - - final String CANADA1_EXP = "(MOVE |MOV |MOVG )?([ENSW]{1})WD " - + "([0-9]{2}|[0-9]{1})( |\\x0d\\x0d\\x0a)?KT"; - // Pattern used for extracting speed for Canada - final Pattern canada1Pattern = Pattern.compile(CANADA1_EXP); - Matcher canada1Matcher = canada1Pattern.matcher(bullMessage); - - final String CANADA2_EXP = "(MOVE |MOV |MOVG )?([ENSW]{2})WD " - + "([0-9]{2}|[0-9]{1})(\\x0d\\x0d\\x0a| )?KT"; - // Pattern used for extracting speed for Canada - final Pattern canada2Pattern = Pattern.compile(CANADA2_EXP); - Matcher canada2Matcher = canada2Pattern.matcher(bullMessage); - - final String KMH_EXP = "([0-9]{2}|[0-9]{3})(( )*|( )?\\x0d\\x0d\\x0a)KMH"; - // Pattern used for extracting speed for KMH - final Pattern kmhPattern = Pattern.compile(KMH_EXP); - Matcher kmhMatcher = kmhPattern.matcher(bullMessage); - - if (theMatcher.find()) { - retSpeed = Integer.parseInt(theMatcher.group(3)); - } else if (canada1Matcher.find()) { - retSpeed = Integer.parseInt(canada1Matcher.group(3)); - } else if (canada2Matcher.find()) { - retSpeed = Integer.parseInt(canada2Matcher.group(3)); - } else if (kmhMatcher.find()) { - Integer kmhSpeed = Integer.parseInt(kmhMatcher.group(1)); - // Convert KMH to Knots - float speed = (float) (((double) kmhSpeed * 1000.0 / 3600.0) * 1.9425); - retSpeed = (int) speed; - } - - return retSpeed; - } - - /** - * Obtains intensity from a bulletin - * - * @param bullMessage - * The bulletin message - * @return a string for intensity - */ - public static String getIntensity(String bullMessage) { - - String intensity = null; - - // Regular expression for intensity - final String INTENSITY_EXP = "( NC | INTSF| WKN | NC=|WKN=|NC.|WKNG )"; - // Pattern used for extracting intensityFlag - final Pattern intensityPattern = Pattern.compile(INTENSITY_EXP); - Matcher theMatcher = intensityPattern.matcher(bullMessage); - - if (theMatcher.find()) { - intensity = theMatcher.group(1); - intensity = UtilN.removeLeadingWhiteSpaces(intensity); - if (intensity.substring(0, 2).equals("NC")) { - intensity = "NC"; - } else if (intensity.substring(0, 3).equals("WKN")) { - intensity = "WKN"; - } - } - - return intensity; - } - - /** - * Obtains direction from a bulletin - * - * @param bullMessage - * The bulletin message - * @return a string for direction - */ - public static String getDirection(String bullMessage) { - - String direction = null; - - final String CANADA1_EXP = "(MOVE |MOV |MOVG )?([ENSW]{1})WD " - + "([0-9]{2}|[0-9]{1})( |\\x0d\\x0d\\x0a)?KT"; - // Pattern used for extracting direction for Canada - final Pattern canada1Pattern = Pattern.compile(CANADA1_EXP); - Matcher canada1Matcher = canada1Pattern.matcher(bullMessage); - - final String CANADA2_EXP = "(MOVE |MOV |MOVG )?([ENSW]{2})WD " - + "([0-9]{2}|[0-9]{1})( |\\x0d\\x0d\\x0a)?KT"; - // Pattern used for extracting direction for Canada - final Pattern canada2Pattern = Pattern.compile(CANADA2_EXP); - Matcher canada2Matcher = canada2Pattern.matcher(bullMessage); - - // Regular expression for direction - final String DIRECTION_EXP = "(MOVE|MOV|MOVG) ([ENSW]{3}|[ENSW]{2}|[ENSW]{1})"; - // Pattern used for extracting direction for general - final Pattern directionPattern = Pattern.compile(DIRECTION_EXP); - Matcher theMatcher = directionPattern.matcher(bullMessage); - - final String DIR2_EXP = "(MOVE|MOV|MOVG)(\\D)*([ENSW]{3}|[ENSW]{2}|[ENSW]{1}) "; - // Pattern used for extracting direction for Canada - final Pattern dir2Pattern = Pattern.compile(DIR2_EXP); - Matcher dir2Matcher = dir2Pattern.matcher(bullMessage); - - final String DIR3_EXP = "(MOVE|MOV|MOVG) (SOUTH|NORTH|WEST|EAST) "; - // Pattern used for extracting direction for Canada - final Pattern dir3Pattern = Pattern.compile(DIR3_EXP); - Matcher dir3Matcher = dir3Pattern.matcher(bullMessage); - - if (canada2Matcher.find()) { - direction = canada2Matcher.group(2); - } else if (canada1Matcher.find()) { - direction = canada1Matcher.group(2); - } else if (theMatcher.find()) { - direction = theMatcher.group(2); - } else if (dir2Matcher.find()) { - direction = dir2Matcher.group(3); - } else if (dir3Matcher.find()) { - direction = dir3Matcher.group(2); - if (direction.equals("SOUTH")) { - direction = "S"; - } else if (direction.equals("NORTH")) { - direction = "N"; - } else if (direction.equals("WEST")) { - direction = "W"; - } else if (direction.equals("EAST")) { - direction = "E"; - } - } - return direction; - } - - /** - * Parse the location to set Lat/Lon or location name - * - * @param theLocation - * The location with lat/lon or location name - * @param locTb - * The location table - */ - public static void processLatLon(String theLocation, - IntlSigmetLocation locTb, Integer index, IntlSigmetRecord record) { - - double flat, flon; - - final String LATLON1_EXP = "(N|S)([0-9]{2})([0-9]{2}) (E|W)([0-9]{3})([0-9]{2})"; - // Pattern used for extracting latlon - CONUS - final Pattern latlon1Pattern = Pattern.compile(LATLON1_EXP); - Matcher latlon1Matcher = latlon1Pattern.matcher(theLocation); - - final String LATLON2_EXP = "/([0-9]{2})([0-9]{2})(N|S)([0-9]{3})" - + "([0-9]{2})(E|W)/((\\S|\\s|\\D)*)"; - // Pattern used for extracting latlon - Canada - final Pattern latlon2Pattern = Pattern.compile(LATLON2_EXP); - Matcher latlon2Matcher = latlon2Pattern.matcher(theLocation); - - final String LATLON3_EXP = "(N|S)([0-9]{2})([0-9]{2})(E|W)([0-9]{3})([0-9]{2})"; - // Pattern used for extracting latlon - final Pattern latlon3Pattern = Pattern.compile(LATLON3_EXP); - Matcher latlon3Matcher = latlon3Pattern.matcher(theLocation); - - final String LATLON4_EXP = "(N|S)([0-9]{2})(E|W)([0-9]{3}|[0-9]{2})"; - // Pattern used for extracting latlon - final Pattern latlon4Pattern = Pattern.compile(LATLON4_EXP); - Matcher latlon4Matcher = latlon4Pattern.matcher(theLocation); - - final String LATLON5_EXP = "([0-9]{2})(N|S)([0-9]{3}|[0-9]{2})(E|W)"; - // Pattern used for extracting latlon - Japan - final Pattern latlon5Pattern = Pattern.compile(LATLON5_EXP); - Matcher latlon5Matcher = latlon5Pattern.matcher(theLocation); - - final String LATLON6_EXP = "([0-9]{2})([0-9]{2})(N|S)([0-9]{3})([0-9]{2})(E|W)"; - // Pattern used for extracting latlon - final Pattern latlon6Pattern = Pattern.compile(LATLON6_EXP); - Matcher latlon6Matcher = latlon6Pattern.matcher(theLocation); - - final String LATLON7_EXP = "(N|S)([0-9]{2})([0-9]{2})[\\W| ]*(E|W)" - + "([0-9]{3})([0-9]{2})"; - // Pattern used for extracting latlon - final Pattern latlon7Pattern = Pattern.compile(LATLON7_EXP); - Matcher latlon7Matcher = latlon7Pattern.matcher(theLocation); - - final String LATLON8_EXP = "(N|S)([0-9]{2})( )*(E|W)([0-9]{3}|[0-9]{2})"; - // Pattern used for extracting latlon - final Pattern latlon8Pattern = Pattern.compile(LATLON8_EXP); - Matcher latlon8Matcher = latlon8Pattern.matcher(theLocation); - - double NSFlag = 1.0; - double EWFlag = 1.0; - double seconds = 60.0; - LatLonPoint point = null; - - if (record.getWmoHeader().equals("WSMC31")) { - // WSMC31 issues lat/lon in decimals. - seconds = 100.0; - } - - if (latlon1Matcher.find()) { - // latlon format for CONUS - if (latlon1Matcher.group(1).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag - * (Integer.parseInt(latlon1Matcher.group(2)) + (Integer - .parseInt(latlon1Matcher.group(3)) / seconds)); - if (latlon1Matcher.group(4).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag - * (Integer.parseInt(latlon1Matcher.group(5)) + (Integer - .parseInt(latlon1Matcher.group(6)) / seconds)); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon1Matcher.group()); - } else if (latlon2Matcher.find()) { - // latlon format for Canada - if (latlon2Matcher.group(3).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag - * (Integer.parseInt(latlon2Matcher.group(1)) + (Integer - .parseInt(latlon2Matcher.group(2)) / seconds)); - if (latlon2Matcher.group(6).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag - * (Integer.parseInt(latlon2Matcher.group(4)) + (Integer - .parseInt(latlon2Matcher.group(5)) / seconds)); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon2Matcher.group(7)); - } else if (latlon3Matcher.find()) { - if (latlon3Matcher.group(1).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag - * (Integer.parseInt(latlon3Matcher.group(2)) + (Integer - .parseInt(latlon3Matcher.group(3)) / seconds)); - if (latlon3Matcher.group(4).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag - * (Integer.parseInt(latlon3Matcher.group(5)) + (Integer - .parseInt(latlon3Matcher.group(6)) / seconds)); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon3Matcher.group()); - } else if (latlon4Matcher.find()) { - if (latlon4Matcher.group(1).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag * (Integer.parseInt(latlon4Matcher.group(2))); - if (latlon4Matcher.group(3).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag * (Integer.parseInt(latlon4Matcher.group(4))); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon4Matcher.group()); - } else if (latlon5Matcher.find()) { - if (latlon5Matcher.group(2).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag * (Integer.parseInt(latlon5Matcher.group(1))); - if (latlon5Matcher.group(4).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag * (Integer.parseInt(latlon5Matcher.group(3))); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon5Matcher.group()); - } else if (latlon6Matcher.find()) { - // latlon6 format - if (latlon6Matcher.group(3).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag - * (Integer.parseInt(latlon6Matcher.group(1)) + (Integer - .parseInt(latlon6Matcher.group(2)) / seconds)); - if (latlon6Matcher.group(6).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag - * (Integer.parseInt(latlon6Matcher.group(4)) + (Integer - .parseInt(latlon6Matcher.group(5)) / seconds)); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon6Matcher.group()); - } else if (latlon7Matcher.find()) { - // latlon format - if (latlon7Matcher.group(1).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag - * (Integer.parseInt(latlon7Matcher.group(2)) + (Integer - .parseInt(latlon7Matcher.group(3)) / seconds)); - if (latlon7Matcher.group(4).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag - * (Integer.parseInt(latlon7Matcher.group(5)) + (Integer - .parseInt(latlon7Matcher.group(6)) / seconds)); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon7Matcher.group()); - } else if (latlon8Matcher.find()) { - if (latlon8Matcher.group(1).equals("S")) { - NSFlag = -1.0; - } - flat = NSFlag * (Integer.parseInt(latlon8Matcher.group(2))); - if (latlon8Matcher.group(4).equals("W")) { - EWFlag = -1.0; - } - flon = EWFlag * (Integer.parseInt(latlon8Matcher.group(5))); - locTb.setLatitude(flat); - locTb.setLongitude(flon); - locTb.setLocationName(latlon8Matcher.group()); - } else { - System.out.println("theLocation=" + theLocation); - if ((index == 0) - && ((theLocation.substring(0, 3).equals("IN ")) || theLocation - .substring(0, 3).equals("OF "))) { - // handle special case with "IN " or "OF " and location - String retLoc = theLocation.substring(3); - locTb.setLocationName(retLoc); - // Get a latLonPoint for this station ID from "vors" location - // table - point = LatLonLocTbl.getLatLonPoint(retLoc, "vors"); - if (point != null) { - locTb.setLatitude(point.getLatitude(LatLonPoint.INDEGREES)); - locTb.setLongitude(point.getLongitude(LatLonPoint.INDEGREES)); - } - } else { - locTb.setLocationName(theLocation); - // Get a latLonPoint for this station ID from "vors" location - // table - point = LatLonLocTbl.getLatLonPoint(theLocation, "vors"); - if (point != null) { - locTb.setLatitude(point.getLatitude(LatLonPoint.INDEGREES)); - locTb.setLongitude(point.getLongitude(LatLonPoint.INDEGREES)); - } - - } - } - } - - /** - * Obtains distance or radius from a bulletin for a "LINE" type - * - * @param bullMessage - * The bulletin message - * @return an integer of distance - */ - public static Integer getDistance(String bullMessage) { - - Integer retDistance = IDecoderConstantsN.INTEGER_MISSING; - - // Regular expression for distance - final String DISTANCE_EXP = "(WI )?([0-9]{2}|[0-9]{3})( )?NM "; - // Pattern used for extracting distance - final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); - Matcher theMatcher = distancePattern.matcher(bullMessage); - - // Regular expression distance for Canada - final String CANADA_EXP = "WTN ([0-9]{2}|[0-9]{3}) NM OF LN "; - // Pattern used for extracting distance for CANADA sigmet - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher canadaMatcher = canadaPattern.matcher(bullMessage); - - if (theMatcher.find()) { - retDistance = Integer.parseInt(theMatcher.group(2)); - } else if (canadaMatcher.find()) { - retDistance = Integer.parseInt(canadaMatcher.group(1)); - } - return retDistance; - } - - /** - * Get name location for the VA, TC, or HU.... - * - * @param bullMessage - * The bulletin message - * @return a string for nameLocation - */ - public static String getNameLocation(String bullMessage) { - - String retLocation = " "; - - final String VA_EXP = "MT (\\S)*-PEAK LOC ([NS][0-9]{4} [EW][0-9]{5}) "; - // Pattern used for extracting VA nameLocation - final Pattern vaPattern = Pattern.compile(VA_EXP); - Matcher vaMatcher = vaPattern.matcher(bullMessage); - - final String TC_EXP = " TC ((\\S)* FCST (\\S)* (\\S)*) "; - // Pattern used for extracting TC nameLocation - final Pattern tcPattern = Pattern.compile(TC_EXP); - Matcher tcMatcher = tcPattern.matcher(bullMessage); - - // final String HUR1_EXP = "(HURRICANE IRENE LOCATED AT )"; - final String HUR1_EXP = "(HURRICANE ([A-Z])* LOCATED AT ([\\w|.])* ([\\w|.])*) MOVG"; - // Pattern used for extracting Hurricane nameLocation - final Pattern hur1Pattern = Pattern.compile(HUR1_EXP); - Matcher hur1Matcher = hur1Pattern.matcher(bullMessage); - - final String HUR2_EXP = "(HURCN ([A-Z])* NEAR ([\\w|.])* ([\\w|.])*) "; - // Pattern used for extracting Hurricane nameLocation - final Pattern hur2Pattern = Pattern.compile(HUR2_EXP); - Matcher hur2Matcher = hur2Pattern.matcher(bullMessage); - - final String TS_EXP = "(TROPICAL STORM ([A-Z])* (\\w)*)"; - // Pattern used for extracting Tropical Storm nameLocation - final Pattern tsPattern = Pattern.compile(TS_EXP); - Matcher tsMatcher = tsPattern.matcher(bullMessage); - - final String TD_EXP = "(TROPICAL (DEPRESSION )?([A-Z])* (\\w)*)"; - // Pattern used for extracting Tropical Depression nameLocation - final Pattern tdPattern = Pattern.compile(TD_EXP); - Matcher tdMatcher = tdPattern.matcher(bullMessage); - - if (vaMatcher.find()) { - retLocation = vaMatcher.group(); - } else if (tcMatcher.find()) { - retLocation = tcMatcher.group(1); - } else if (hur1Matcher.find()) { - retLocation = hur1Matcher.group(1); - } else if (hur2Matcher.find()) { - retLocation = hur2Matcher.group(1); - } else if (tsMatcher.find()) { - retLocation = tsMatcher.group(1); - } else if (tdMatcher.find()) { - retLocation = tdMatcher.group(1); - } - - return retLocation; - } - - /** - * Obtains polygon extent from a bulletin for a "LINE" type - * or a polygon type - * - * @param bullMessage The bulletin message - * @return a string - */ - public static String getPolygonExtent(String bullMessage) { - - String retStr = ""; - - // Regular expression for distance - final String DISTANCE_EXP = "(WI )?([0-9]{2}|[0-9]{3})( )?NM "; - // Pattern used for extracting distance - final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); - Matcher theMatcher = distancePattern.matcher( bullMessage ); - - // Regular expression for line - final String LINE_EXP = " ([0-9]{2}|[0-9]{3})( )?NM (EITHER SIDE OF)"; - // Pattern used for extracting line information - final Pattern linePattern = Pattern.compile(LINE_EXP); - Matcher lineMatcher = linePattern.matcher( bullMessage ); - - // Regular expression distance for Canada - final String CANADA_EXP = "(WTN|WITHIN) ([0-9]{2}|[0-9]{3})( )?NM OF (LN|LINE)"; - // Pattern used for extracting distance for CANADA sigmet - final Pattern canadaPattern = Pattern.compile(CANADA_EXP); - Matcher canadaMatcher = canadaPattern.matcher( bullMessage ); - - // Regular expression for POLYGON - final String POLYGON_EXP = " ([0-9]{2}|[0-9]{3})( )?NM ([EWSN]|[EWSN]{2}|[EWSN]{3}) OF"; - // Pattern used for extracting POLYGON information - final Pattern polygonPattern = Pattern.compile(POLYGON_EXP); - Matcher polygonMatcher = polygonPattern.matcher( bullMessage ); - - if (canadaMatcher.find()) { - retStr = canadaMatcher.group(1); - } else if (lineMatcher.find()) { - retStr = lineMatcher.group(3); - } else if (polygonMatcher.find()) { - retStr = polygonMatcher.group(3).concat(" OF"); - } else if (theMatcher.find()) { - retStr = theMatcher.group(1); - } - - return retStr; - } - - /** - * Parse the location lines and add location table to the main record table - * if any - * - * @param theBulletin - * The report from bulletin message - * @param record - * The main table - * @return a boolean true if any location exists. - */ - public static boolean processLocation(String theBulletin, - IntlSigmetRecord record) { - - boolean ret = false; - - String locationDelimiter = "-"; - String retLocation = "?"; - int locPositionIndex = -1; - - ArrayList terminationList = new ArrayList(); - // Locations ends with these key words - terminationList.addAll(Arrays - .asList(new String[] { "TOP", "SEV", "BKN", "STNR", "ISOL", - "MOV", "SOLID", "TOPS", "AREA", "BTN", "STG", "SEVERE", - "INTSF=", "MAINLY", "SIGMET", "OCNL", "WKN", "PL", - "FZRA", "LLWS", "TURB", "STR", "FCST", "VA", "MDT", - "STRONG", "LN", "AT", "BASED", "OF", "SVR", "OVER", - "TS", "AND", "OBL", "TURBUL", "BLW", "TOP", "TORNADO", - "CORRECTION" })); - - final String LATLON1_EXP = "(N|S)([0-9]{4}) (E|W)([0-9]{5}) -"; - // Pattern used for extracting latlon - final Pattern latlon1Pattern = Pattern.compile(LATLON1_EXP); - Matcher latlon1Matcher = latlon1Pattern.matcher(theBulletin); - - final String LATLON2_EXP = "/([0-9]{4})(N|S)([0-9]{5})(E|W)/"; - // Pattern used for extracting latlon - final Pattern latlon2Pattern = Pattern.compile(LATLON2_EXP); - Matcher latlon2Matcher = latlon2Pattern.matcher(theBulletin); - - final String LATLON3_EXP = "(N|S)([0-9]{4})(E|W)([0-9]{5})-"; - // Pattern used for extracting latlon - final Pattern latlon3Pattern = Pattern.compile(LATLON3_EXP); - Matcher latlon3Matcher = latlon3Pattern.matcher(theBulletin); - - final String LATLON4_EXP = "(N|S)([0-9]{2})(E|W)([0-9]{3})"; - // Pattern used for extracting latlon - final Pattern latlon4Pattern = Pattern.compile(LATLON4_EXP); - Matcher latlon4Matcher = latlon4Pattern.matcher(theBulletin); - - final String LATLON5_EXP = "([0-9]{2})(N|S)([0-9]{3}|[0-9]{2})(E|W)"; - // Pattern used for extracting latlon - final Pattern latlon5Pattern = Pattern.compile(LATLON5_EXP); - Matcher latlon5Matcher = latlon5Pattern.matcher(theBulletin); - - final String LATLON6_EXP = "([0-9]{4})(N|S)([0-9]{5})(E|W)"; - // Pattern used for extracting latlon - final Pattern latlon6Pattern = Pattern.compile(LATLON6_EXP); - Matcher latlon6Matcher = latlon6Pattern.matcher(theBulletin); - - final String LATLON7_EXP = " [A-Z]*( )?-( )?[A-Z]*( )?-"; - // Pattern used for extracting latlon - final Pattern latlon7Pattern = Pattern.compile(LATLON7_EXP); - Matcher latlon7Matcher = latlon7Pattern.matcher(theBulletin); - - final String LATLON9_EXP = " [A-Z]* [A-Z]*/(\\w| )*/"; - // Pattern used for extracting latlon - final Pattern latlon9Pattern = Pattern.compile(LATLON9_EXP); - Matcher latlon9Matcher = latlon9Pattern.matcher(theBulletin); - - // Find the position of first location - if (latlon7Matcher.find()) { - retLocation = latlon7Matcher.group(); - } else if (latlon1Matcher.find()) { - retLocation = latlon1Matcher.group(); - } else if (latlon2Matcher.find()) { - retLocation = latlon2Matcher.group(); - } else if (latlon3Matcher.find()) { - retLocation = latlon3Matcher.group(); - } else if (latlon4Matcher.find()) { - retLocation = latlon4Matcher.group(); - } else if (latlon5Matcher.find()) { - retLocation = latlon5Matcher.group(); - } else if (latlon6Matcher.find()) { - retLocation = latlon6Matcher.group(); - } else if (latlon9Matcher.find()) { - retLocation = latlon9Matcher.group(); - int sigmetIndex = retLocation.indexOf("SIGMET"); - int fcstIndex = retLocation.indexOf("FCST "); - int innIndex = retLocation.indexOf("IN N/"); - int sfcIndex = retLocation.indexOf(" SFC"); - int obsIndex = retLocation.indexOf(" OBS"); - // Handle special cases and throw them away - if (sigmetIndex != -1) { - retLocation = "?"; - } else if (fcstIndex != -1) { - retLocation = "?"; - } else if (innIndex != -1) { - retLocation = "?"; - } else if (sfcIndex != -1) { - retLocation = "?"; - } else if (obsIndex != -1) { - retLocation = "?"; - } - - } - - locPositionIndex = theBulletin.indexOf(retLocation); - - if (locPositionIndex > 0) { - String secondHalf = theBulletin.substring(locPositionIndex); - Scanner scLocationLine = new Scanner(secondHalf) - .useDelimiter("\\x0d\\x0d\\x0a"); - String lines = " "; - String curLine = null; - ArrayList locationList = new ArrayList(); - locationList.clear(); - Boolean notBreak = true; - - while (scLocationLine.hasNext() && notBreak) { - // Get next location line - curLine = scLocationLine.next(); - - Scanner scLocationToken = new Scanner(curLine); - while (scLocationToken.hasNext() && notBreak) { - // Check the token from each line - String token = scLocationToken.next(); - if (terminationList.contains(token)) { - // terminate and get the locations in this line - int token_pos = curLine.indexOf(token); - lines = lines.concat(" ").concat( - curLine.substring(0, token_pos)); - notBreak = false; - break; - } - } - if (notBreak) { - lines = lines.concat(" ").concat(curLine); - } - } - - // Clean up the leading space - lines = UtilN.removeLeadingWhiteSpaces(lines); - lines = removeChar(lines, '\r'); - lines = removeChar(lines, '\n'); - - // Decide the location delimiter. - Boolean whiteDel = false; - int dashPos = lines.indexOf("-"); - int slashPos = lines.indexOf("/"); - if (dashPos != -1) { - locationDelimiter = "-"; - } else if (slashPos != -1) { - locationDelimiter = "/"; - } else { - locationDelimiter = " "; - whiteDel = true; - } - // Parse the location lines by a "-", "/", or " ". - Scanner scLocation = new Scanner(lines) - .useDelimiter(locationDelimiter); - - locationList.clear(); - // Get all locations - while (scLocation.hasNext()) { - // Clean up the leading space - String location = UtilN.removeLeadingWhiteSpaces(scLocation - .next()); - if (whiteDel) { - // white space as delimiter - int lengthOfLocation = location.length(); - if (lengthOfLocation > 2) { - if (Character.isDigit(location.toCharArray()[0]) - && (lengthOfLocation > 2)) { - locationList.add(location); - } else if (Character.isDigit(location.toCharArray()[1]) - && (lengthOfLocation > 2)) { - locationList.add(location); - } - } - } else if ((location.length() > 0) - && (!location.substring(0, 2).equals("FL"))) { - // exception handle for a "FL" false location - locationList.add(location); - } - } - - // set locations to data base - Integer idxLocation = 0; - if (locationList.size() > 1) { - for (String Location : locationList) { - IntlSigmetLocation currentLocation = new IntlSigmetLocation(); - currentLocation.setLocationLine(lines); - // currentLocation.setLocationName(Location); - processLatLon(Location, currentLocation, idxLocation, - record); - currentLocation.setIndex(idxLocation + 1); - idxLocation++; - - record.addIntlSigmetLocation(currentLocation); - } - ret = true; - } - } - return ret; - } - - /** - * Get detail information for Thunderstorm. - * - * @param theReport - * the input bulletin - * @return a string for Thunderstorm - */ - public static String getThunderStorm(String theReport) { - - String retTS = "THUNDERSTORM"; - // Regular expression for tsType - final String TSTYPE_EXP = "(SQL EMBD TS |ISOL EMBD TS |EMBD TS GR |ISOL TS |EMBD TS |" - + "FRQ TS|SQL TS |TS GR |OBSC TS|FRQ TSGR |OCNL TS |EMBD TSGR | TSGR | GR |" - + "TS/CB|CB/TS)"; - // Pattern used for extracting hazardType - final Pattern tsTypePattern = Pattern.compile(TSTYPE_EXP); - Matcher tsMatcher = tsTypePattern.matcher(theReport); - - if (tsMatcher.find()) { - if (tsMatcher.group(1).equals("EMBD TS GR ")) { - retTS = "EMBEDED THUNDERSTORMS HAIL"; - } else if (tsMatcher.group(1).equals("SQL EMBD TS ")) { - retTS = "SQUALL EMBEDED THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("ISOL EMBD TS ")) { - retTS = "ISOLATED EMBEDED THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("ISOL TS ")) { - retTS = "ISOLATED THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("EMBD TS ")) { - retTS = "EMBEDED THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("FRQ TS")) { - retTS = "FREQUENT THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("SQL TS ")) { - retTS = "SQUALL THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("TS GR ")) { - retTS = "THUNDERSTORMS HAIL"; - } else if (tsMatcher.group(1).equals("OBSC TS")) { - retTS = "OBSCURE THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("FRQ TSGR ")) { - retTS = "FREQUENT THUNDERSTORMS HAIL"; - } else if (tsMatcher.group(1).equals("OCNL TS ")) { - retTS = "OCCASIONAL THUNDERSTORMS"; - } else if (tsMatcher.group(1).equals("EMBD TSGR ")) { - retTS = "EMBEDED THUNDERSTORMS HAIL"; - } else if (tsMatcher.group(1).equals(" TSGR ")) { - retTS = "THUNDERSTORMS HAIL"; - } else if (tsMatcher.group(1).equals(" GR ")) { - retTS = "HAIL"; - } else if (tsMatcher.group(1).equals("TS/CB")) { - retTS = "THUNDERSTORMS CUMULONIMBUS"; - } else if (tsMatcher.group(1).equals("CB/TS")) { - retTS = "THUNDERSTORMS CUMULONIMBUS"; - } - } - - return retTS; - } - - /** - * Remove a character from a string and return the result. - * - * @param s - * the string - * @param c - * the character to be removed - * @return a string. - */ - public static String removeChar(String s, char c) { - - String ret = ""; - - for (int i = 0; i < s.length(); i++) { - if (s.charAt(i) != c) - ret += s.charAt(i); - } - - return ret; - } - -} +/** + * IntlSigmet DecoderUtil + * + * This java class intends to serve as a decoder utility for INTLSIGMET. + * + * HISTORY + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 113 L. Lin Initial coding + * 07/2009 113 L. Lin Migration to TO11 + * 09/2009 113 L. Lin Convert station ID to lat/lon + * if any exists. + * 11/2011 512 S. Gurung Fixed NullPointerException bug while processing lat/lon (from vors) + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.intlsigmet.util; + +import gov.noaa.nws.ncep.common.dataplugin.intlsigmet.IntlSigmetLocation; +import gov.noaa.nws.ncep.common.dataplugin.intlsigmet.IntlSigmetRecord; +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; +import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class IntlSigmetParser { + + private static final String CONUS_EXP = "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|GOLF|HOTEL|" + + "INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|TANGO|" + + "UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; + + /** + * Constructor + */ + public IntlSigmetParser() { + } + + /** + * Parse the WMO line and store WMO header, OfficeID, issue time, ... + * + * @param wmoline + * The bulletin message + * + * @return an IntlSigmetRecord + */ + public static IntlSigmetRecord processWMO(String wmoline, Headers headers) { + + IntlSigmetRecord record = null; + // Regular expression for WMO/ICAO, station ID, and issue date. + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})"; + + // Pattern used for extracting WMO header, officeID, and issue date. + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(wmoline); + + if (theMatcher.find()) { + record = new IntlSigmetRecord(); + + record.setWmoHeader(theMatcher.group(1)); + record.setIssueOffice(theMatcher.group(2)); + + // Decode the issue time. + Calendar mndTime = null; + Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), + headers); + record.setIssueTime(issueTime); + + DataTime dataTime = new DataTime(issueTime); + record.setDataTime(dataTime); + } + return record; + } + + /** + * Obtains hazardType as: TS (thunderstorm), TB (turbulence), HU + * (hurricane), TR (tropical storm), TD (tropical depression), VA (volcanic + * ash cloud), MW (marked mountain waves), TC (tropical cyclone), SQ (squall + * line), CT (CAT), IC (icing), GR (hail), DS (duststorm), SS (sandstorm), + * CB (cumulonimbus), WS (low level wind shear), TEST, or CN (cancel), + * etc... + * + * @param theReport + * Input report message. + * @return a string for hazard type + */ + public static String getHazardType(String theReport) { + + String retHazardType = " "; + // Regular expression for hazardType + final String HAZARDTYPE_EXP = "(HURRICANE|HURCN |TROPICAL STORM|TROPICAL DEPRESSION|" + + " TD | SQL | TS | TS/|FRQ TS| TS| SH/TS |TURB| CB | VA | MTW |" + + " ICE | TR | GR | TC | CT | CAT | DS | SS | WS | TSGR |VOLCANIC ASH|HVYSS|" + + " ICG|ICING|LLWS|WATERSPOUTS|THUNDERSTORMS|WIND|TS OBS|CB/TS|TORNADO)"; + final String NIL_EXP = "(NIL)"; + final String MIS_EXP = "(TAF |METAR )"; + final String CNL_EXP = "(CANCEL| CNL | CNCL |:CNL| CNL|INVALID|DISCARDED|" + + "CNL SIGMET| CLN SIGMET|CNCLD)"; + final String TEST_EXP = "(TEST |DISREGARD)"; + + // Pattern used for extracting hazardType + final Pattern hazardTypePattern = Pattern.compile(HAZARDTYPE_EXP); + final Pattern nilPattern = Pattern.compile(NIL_EXP); + final Pattern cnlPattern = Pattern.compile(CNL_EXP); + final Pattern misPattern = Pattern.compile(MIS_EXP); + final Pattern testPattern = Pattern.compile(TEST_EXP); + + Matcher theMatcher = hazardTypePattern.matcher(theReport); + Matcher nilMatcher = nilPattern.matcher(theReport); + Matcher cnlMatcher = cnlPattern.matcher(theReport); + Matcher misMatcher = misPattern.matcher(theReport); + Matcher testMatcher = testPattern.matcher(theReport); + + if (cnlMatcher.find()) { + retHazardType = "CANCEL"; + } else if (testMatcher.find()) { + retHazardType = "TEST"; + } else if (theMatcher.find()) { + if (theMatcher.group(1).equals("HURRICANE")) { + retHazardType = "HURRICANE"; + } else if (theMatcher.group(1).equals("HURCN ")) { + retHazardType = "HURRICANE"; + } else if (theMatcher.group(1).equals(" TD ")) { + retHazardType = "TROPICAL DEPRESSION"; + } else if (theMatcher.group(1).equals("TROPICAL STORM")) { + retHazardType = "TROPICAL STORM"; + } else if (theMatcher.group(1).equals("TROPICAL DEPRESSION")) { + retHazardType = "TROPICAL DEPRESSION"; + } else if (theMatcher.group(1).equals(" SQL ")) { + retHazardType = "SQUALL LINE"; + } else if (theMatcher.group(1).equals("TURB")) { + retHazardType = "TURBULENCE"; + } else if (theMatcher.group(1).equals(" ICE ")) { + retHazardType = "ICING"; + } else if (theMatcher.group(1).equals(" ICG")) { + retHazardType = "ICING"; + } else if (theMatcher.group(1).equals("ICING")) { + retHazardType = "ICING"; + } else if (theMatcher.group(1).equals(" TS ")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals("FRQ TS")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals(" TS/")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals(" SH/TS ")) { + retHazardType = "THUNDERSTORM WIND SHEAR"; + } else if (theMatcher.group(1).equals(" CB ")) { + retHazardType = "CUMULONIMBUS"; + } else if (theMatcher.group(1).equals(" VA ")) { + retHazardType = "VOLCANIC ASH CLOUD"; + } else if (theMatcher.group(1).equals(" MTW ")) { + retHazardType = "MARKED MOUNTAIN WAVES"; + } else if (theMatcher.group(1).equals(" TR ")) { + retHazardType = "TROPICAL STORM"; + } else if (theMatcher.group(1).equals(" GR ")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals(" TC ")) { + retHazardType = "TROPICAL CYCLONE"; + } else if (theMatcher.group(1).equals(" CT ")) { + retHazardType = "CAT"; + } else if (theMatcher.group(1).equals(" CAT ")) { + retHazardType = "CAT"; + } else if (theMatcher.group(1).equals(" DS ")) { + retHazardType = "DUSTSTORM"; + } else if (theMatcher.group(1).equals(" SS ")) { + retHazardType = "SANDSTORM"; + } else if (theMatcher.group(1).equals(" WS ")) { + retHazardType = "LOW LEVEL WIND SHEAR"; + } else if (theMatcher.group(1).equals("LLWS")) { + retHazardType = "LOW LEVEL WIND SHEAR"; + } else if (theMatcher.group(1).equals(" TSGR ")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals("VOLCANIC ASH")) { + retHazardType = "VOLCANIC ASH CLOUD"; + } else if (theMatcher.group(1).equals("TS ")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals("HVYSS ")) { + retHazardType = "HEAVY SANDSTORM"; + } else if (theMatcher.group(1).equals("WATERSPOUTS")) { + retHazardType = "WATERSPOUTS"; + } else if (theMatcher.group(1).equals("THUNDERSTORMS")) { + retHazardType = "THUNDERSTORMS"; + } else if (theMatcher.group(1).equals("WIND")) { + retHazardType = "WINDS"; + } else if (theMatcher.group(1).equals("TS OBS")) { + retHazardType = "THUNDERSTORMS"; + } else if (theMatcher.group(1).equals(" TS")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals("CB/TS")) { + retHazardType = getThunderStorm(theReport); + } else if (theMatcher.group(1).equals("TORNADO")) { + retHazardType = "TORNADO"; + } + } else if (nilMatcher.find()) { + retHazardType = "NIL"; + } else if (misMatcher.find()) { + retHazardType = "NIL"; + } else { + retHazardType = "UNKNOWN ???"; + } + return retHazardType; + } + + /** + * Obtains the message ID. + * + * @param theBulletin + * The input bulletin + * @return a string for messageID + */ + public static String getMessageID(String theBulletin) { + + String messageID = " "; + + // // Regular expression for CONUS message ID + // final String CONUS_EXP = + // "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|" + + // "GOLF|HOTEL|INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|" + // + + // "ROMEO|SIERRA|TANGO|UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) " + + // "([0-9]{1}|[0-9]{2}) VALID"; + + // Pattern used for extracting the message ID + final Pattern conusPattern = Pattern.compile(CONUS_EXP); + Matcher idconusMatcher = conusPattern.matcher(theBulletin); + + // Regular expression for CANADA message ID + final String CANADA_EXP = "SIGMET ([A-Z]{1})([0-9]{1}|[0-9]{2}) (VALID " + + "([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; + // Pattern used for extracting the message ID + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher idcanadaMatcher = canadaPattern.matcher(theBulletin); + + // Regular expression for JAPAN and UK message ID + final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) (VALID )?" + + "([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; + // Pattern used for extracting the message ID + final Pattern japanPattern = Pattern.compile(JAPAN_EXP); + Matcher idjapanMatcher = japanPattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER1_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})(-)?"; + // Pattern used for extracting the message ID + final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); + Matcher idother1Matcher = other1Pattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER2_EXP = "(SIGMET) ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}|[A-Z]{1}[0-9]{2}) " + + "VALID ([0-9]{6})/([0-9]{6})"; + // Pattern used for extracting the message ID + final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); + Matcher idother2Matcher = other2Pattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER3_EXP = "([A-Z]{4}) SIGMET ([A-Z]* )?([0-9]{1}|[0-9]{2}) VALID ([0-9]{6})/([0-9]{6}) " + + "([A-Z]{4})(-)?"; + // Pattern used for extracting the message ID + final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); + Matcher idother3Matcher = other3Pattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER4_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message ID + final Pattern other4Pattern = Pattern.compile(OTHER4_EXP); + Matcher idother4Matcher = other4Pattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER5_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message ID + final Pattern other5Pattern = Pattern.compile(OTHER5_EXP); + Matcher idother5Matcher = other5Pattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER6_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{6})Z/([0-9]{6})Z( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message ID + final Pattern other6Pattern = Pattern.compile(OTHER6_EXP); + Matcher idother6Matcher = other6Pattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER7_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{4})/([0-9]{4})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message ID + final Pattern other7Pattern = Pattern.compile(OTHER7_EXP); + Matcher idother7Matcher = other7Pattern.matcher(theBulletin); + + // Regular expression for others' message ID + final String OTHER8_EXP = "([A-Z]{4}) SIGMET( |\\W)*VALID( |\\W)*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message ID + final Pattern other8Pattern = Pattern.compile(OTHER8_EXP); + Matcher idother8Matcher = other8Pattern.matcher(theBulletin); + + // Get messageID + if (idconusMatcher.find()) { + messageID = idconusMatcher.group(2); + } else if (idcanadaMatcher.find()) { + messageID = idcanadaMatcher.group(6); + } else if (idother1Matcher.find()) { + messageID = idother1Matcher.group(6); + } else if (idjapanMatcher.find()) { + messageID = idjapanMatcher.group(7); + } else if (idother2Matcher.find()) { + messageID = idother2Matcher.group(1); + } else if (idother3Matcher.find()) { + messageID = idother3Matcher.group(6); + } else if (idother4Matcher.find()) { + messageID = idother4Matcher.group(8); + } else if (idother5Matcher.find()) { + messageID = idother5Matcher.group(7); + } else if (idother6Matcher.find()) { + messageID = idother6Matcher.group(8); + } else if (idother7Matcher.find()) { + messageID = idother7Matcher.group(8); + } else if (idother8Matcher.find()) { + messageID = idother8Matcher.group(7); + } + + return messageID; + } + + /** + * Obtains the sequence number. + * + * @param theBulletin + * The input bulletin + * @return a string for sequenceNumber + */ + public static String getSequenceNumber(String theBulletin) { + + String sequenceNumber = " "; + + // // Regular expression for CONUS sequence number + // final String CONUS_EXP = + // "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|GOLF|HOTEL|" + // + + // "INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|TANGO|" + // + + // "UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; + + // Pattern used for extracting the sequence number + final Pattern conusPattern = Pattern.compile(CONUS_EXP); + Matcher seqnoconusMatcher = conusPattern.matcher(theBulletin); + + // Regular expression for CANADA sequence number + final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}|[A-Z]{1}[0-9]{2}) " + + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; + // Pattern used for extracting the sequence number + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher seqnocanadaMatcher = canadaPattern.matcher(theBulletin); + + // Regular expression for JAPAN and UK sequence number + final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " + + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; + // Pattern used for extracting the sequence number + final Pattern japanPattern = Pattern.compile(JAPAN_EXP); + Matcher seqnojapanMatcher = japanPattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})(-)?"; + // Pattern used for extracting the sequence number + final Pattern otherPattern = Pattern.compile(OTHER_EXP); + Matcher seqnootherMatcher = otherPattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER2_EXP = "SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}|A-Z]{1}[0-9]{2}) " + + "VALID ([0-9]{6})/([0-9]{6})"; + // Pattern used for extracting the sequence number + final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); + Matcher seqnoother2Matcher = other2Pattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER3_EXP = "([A-Z]{4}) SIGMET (([A-Z]* )?([0-9]{1}|[0-9]{2})) " + + "VALID ([0-9]{6})/([0-9]{6}) ([A-Z]{4})(-)?"; + // Pattern used for extracting the sequence number + final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); + Matcher seqnoother3Matcher = other3Pattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER4_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the sequence number + final Pattern other4Pattern = Pattern.compile(OTHER4_EXP); + Matcher seqnoother4Matcher = other4Pattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER5_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the sequence number + final Pattern other5Pattern = Pattern.compile(OTHER5_EXP); + Matcher seqnoother5Matcher = other5Pattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER6_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{6})Z/([0-9]{6})Z( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message sequence number + final Pattern other6Pattern = Pattern.compile(OTHER6_EXP); + Matcher seqnoother6Matcher = other6Pattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER7_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{4})/([0-9]{4})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the sequence number + final Pattern other7Pattern = Pattern.compile(OTHER7_EXP); + Matcher seqnoother7Matcher = other7Pattern.matcher(theBulletin); + + // Regular expression for others' sequence number + final String OTHER8_EXP = "([A-Z]{4}) SIGMET( |\\W)*([0-9]{1})( |\\W)*VALID"; + // Pattern used for extracting the sequence number + final Pattern other8Pattern = Pattern.compile(OTHER8_EXP); + Matcher seqnoother8Matcher = other8Pattern.matcher(theBulletin); + + // Get sequenceNumber + if (seqnoconusMatcher.find()) { + sequenceNumber = seqnoconusMatcher.group(3); + } else if (seqnocanadaMatcher.find()) { + sequenceNumber = seqnocanadaMatcher.group(1); + } else if (seqnootherMatcher.find()) { + sequenceNumber = seqnootherMatcher.group(2); + } else if (seqnojapanMatcher.find()) { + sequenceNumber = seqnojapanMatcher.group(2); + } else if (seqnoother2Matcher.find()) { + sequenceNumber = seqnoother2Matcher.group(1); + } else if (seqnoother3Matcher.find()) { + sequenceNumber = seqnoother3Matcher.group(2); + } else if (seqnoother4Matcher.find()) { + sequenceNumber = seqnoother4Matcher.group(3); + } else if (seqnoother5Matcher.find()) { + // lacking sequence number; default 0 + sequenceNumber = "0"; + } else if (seqnoother6Matcher.find()) { + sequenceNumber = seqnoother6Matcher.group(3); + } else if (seqnoother7Matcher.find()) { + sequenceNumber = seqnoother7Matcher.group(3); + } else if (seqnoother8Matcher.find()) { + sequenceNumber = seqnoother8Matcher.group(3); + } + + return sequenceNumber; + } + + /** + * Obtains the Air Traffic Service Unit. + * + * @param theBulletin + * The input bulletin + * @return a string for atsu. + */ + public static String getAtsu(String theBulletin) { + + String atsu = null; + + // // Regular expression for CONUS ATSU + // final String CONUS_EXP = + // "([A-Z]{4}) SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|GOLF|" + + // "HOTEL|INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|" + // + + // "TANGO|UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; + + // Pattern used for extracting the ATSU + final Pattern conusPattern = Pattern.compile(CONUS_EXP); + Matcher atsuconusMatcher = conusPattern.matcher(theBulletin); + + // Regular expression for CANADA ATSU + final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}|[A-Z]{1}[0-9]{2}) " + + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; + // Pattern used for extracting the ATSU + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher atsucanadaMatcher = canadaPattern.matcher(theBulletin); + + // Regular expression for JAPAN and UK ATSU + final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " + + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; + // Pattern used for extracting the ATSU + final Pattern japanPattern = Pattern.compile(JAPAN_EXP); + Matcher atsujapanMatcher = japanPattern.matcher(theBulletin); + + // Regular expression for others' ATSU + final String OTHER1_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2})" + + "( )*VALID"; + // Pattern used for extracting the ATSU + final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); + Matcher atsuother1Matcher = other1Pattern.matcher(theBulletin); + + // Regular expression for CONUS ATSU + final String CONUS2_EXP = "([A-Z]{4} ([A-Z]{4} )*)SIGMET (ALFA|BRAVO|CHARLIE|DELTA|ECHO|FOXTROT|" + + "GOLF|HOTEL|INDIA|JULIETT|JULIET|KILO|LIMA|MIKE|NOVEMBER|OSCAR|PAPA|QUEBEC|ROMEO|SIERRA|" + + "TANGO|UNIFORM|VICTOR|WHISKEY|XRAY|YANKEE|ZULU) ([0-9]{1}|[0-9]{2}) VALID"; + // Pattern used for extracting the ATSU + final Pattern conus2Pattern = Pattern.compile(CONUS2_EXP); + Matcher atsuconus2Matcher = conus2Pattern.matcher(theBulletin); + + final String OTHER2_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the ATSU + final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); + Matcher atsuother2Matcher = other2Pattern.matcher(theBulletin); + + // Regular expression for others' ATSU + final String OTHER3_EXP = "([A-Z]{4}) SIGMET ([0-9]{1})( |\\W)*VALID( |\\W)*" + + "([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the ATSU + final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); + Matcher atsuother3Matcher = other3Pattern.matcher(theBulletin); + + // Get atsu + if (atsuconus2Matcher.find()) { + atsu = atsuconus2Matcher.group(1); + } else if (atsuconusMatcher.find()) { + atsu = atsuconusMatcher.group(1); + } else if (atsucanadaMatcher.find()) { + atsu = atsucanadaMatcher.group(5); + } else if (atsuother1Matcher.find()) { + atsu = atsuother1Matcher.group(1); + } else if (atsujapanMatcher.find()) { + atsu = atsujapanMatcher.group(1); + } else if (atsuother2Matcher.find()) { + atsu = atsuother2Matcher.group(1); + } else if (atsuother3Matcher.find()) { + atsu = atsuother3Matcher.group(1); + } + + return atsu; + } + + /** + * Obtains the location indicator of the meteorological watch office + * originating the message. + * + * @param theBulletin + * The input bulletin + * @return a string for omwo. + */ + public static String getOmwo(String theBulletin) { + + String omwo = " "; + + // Regular expression for CONUS OMWO + final String CONUS_EXP = "([A-Z]{4}) ([A-Z]{4} )?SIGMET ([A-Z])* ([0-9]{1}|[0-9]{2}) " + + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})-"; + // Pattern used for extracting the OMWO + final Pattern conusPattern = Pattern.compile(CONUS_EXP); + Matcher omwoconusMatcher = conusPattern.matcher(theBulletin); + + // Regular expression for CANADA OMWO + final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}|[A-Z]{1}[0-9]{2}) " + + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; + // Pattern used for extracting the OMWO + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher omwocanadaMatcher = canadaPattern.matcher(theBulletin); + + // Regular expression for JAPAN and UK OMWO + final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " + + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; + // Pattern used for extracting the OMWO + final Pattern japanPattern = Pattern.compile(JAPAN_EXP); + Matcher omwojapanMatcher = japanPattern.matcher(theBulletin); + + // Regular expression for other OMWO + final String OTHER_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID ([0-9]{6})/([0-9]{6})( UTC)? ([A-Z]{4})(-)?"; + // Pattern used for extracting the OMWO + final Pattern otherPattern = Pattern.compile(OTHER_EXP); + Matcher omwootherMatcher = otherPattern.matcher(theBulletin); + + // Regular expression for others' OMWO + final String OTHER2_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|" + + "[A-Z]{2}[0-9]{2}|[A-Z]{1}[0-9]{2}) " + + "VALID( )*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message OMWO + final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); + Matcher omwoother2Matcher = other2Pattern.matcher(theBulletin); + + // Regular expression for others' OMWO + final String OTHER3_EXP = "([A-Z]{4}) SIGMET( )*VALID( )*([0-9]{6})/([0-9]{6})" + + "( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message OMWO + final Pattern other3Pattern = Pattern.compile(OTHER3_EXP); + Matcher omwoother3Matcher = other3Pattern.matcher(theBulletin); + + // Regular expression for others' OMWO + final String OTHER4_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{4})/([0-9]{4})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message OMWO + final Pattern other4Pattern = Pattern.compile(OTHER4_EXP); + Matcher omwoother4Matcher = other4Pattern.matcher(theBulletin); + + // Regular expression for others' OMWO + final String OTHER5_EXP = "([A-Z]{4}) SIGMET( )*([0-9]{1}|[0-9]{2}|[A-Z]{1}[0-9]{1}|[A-Z]{2}[0-9]{2}) " + + "VALID( )*([0-9]{6})Z/([0-9]{6})Z( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the message OMWO + final Pattern other5Pattern = Pattern.compile(OTHER5_EXP); + Matcher omwoother5Matcher = other5Pattern.matcher(theBulletin); + + // Regular expression for others' OMWO + final String OTHER6_EXP = "([A-Z]{4}) SIGMET ([0-9]{1})( |\\W)*" + + "VALID( |\\W)*([0-9]{6})/([0-9]{6})( )*([A-Z]{4})(-)?"; + // Pattern used for extracting the OMWO + final Pattern other6Pattern = Pattern.compile(OTHER6_EXP); + Matcher omwoother6Matcher = other6Pattern.matcher(theBulletin); + + // Get omwo + if (omwoconusMatcher.find()) { + omwo = omwoconusMatcher.group(8); + } else if (omwocanadaMatcher.find()) { + omwo = omwocanadaMatcher.group(5); + } else if (omwootherMatcher.find()) { + omwo = omwootherMatcher.group(6); + } else if (omwojapanMatcher.find()) { + omwo = omwojapanMatcher.group(7); + } else if (omwoother2Matcher.find()) { + omwo = omwoother2Matcher.group(8); + } else if (omwoother3Matcher.find()) { + omwo = omwoother3Matcher.group(7); + } else if (omwoother4Matcher.find()) { + omwo = omwoother4Matcher.group(8); + } else if (omwoother5Matcher.find()) { + omwo = omwoother5Matcher.group(8); + } else if (omwoother6Matcher.find()) { + omwo = omwoother6Matcher.group(8); + } + + return omwo; + } + + /** + * Obtains start time from input bulletin. + * + * @param theReport + * The bulletin message + * @return a calendar for start time + */ + public static Calendar getStartTime(String theBulletin, Headers headers) { + + String time = "???"; + + // Regular expression for general start time group + final String START_EXP = " VALID( )*([0-9]{6})/([0-9]{6})"; + // Pattern used for extracting the start time group + final Pattern startPattern = Pattern.compile(START_EXP); + Matcher timestartMatcher = startPattern.matcher(theBulletin); + + // Regular expression for CANADA start time group + final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}) VALID ([0-9]{6})/([0-9]{6}) ([A-Z]{4})-"; + // Pattern used for extracting the start time group + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher timecanadaMatcher = canadaPattern.matcher(theBulletin); + + // Regular expression for JAPAN and UK start time group + final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " + + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; + // Pattern used for extracting the start time group + final Pattern japanPattern = Pattern.compile(JAPAN_EXP); + Matcher timejapanMatcher = japanPattern.matcher(theBulletin); + + // Regular expression for others' start time + final String OTHER1_EXP = " VALID( )*([0-9]{6})(Z)?/([0-9]{6})(Z)?"; + // Pattern used for extracting the start time + final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); + Matcher time1Matcher = other1Pattern.matcher(theBulletin); + + // Regular expression for others' start time + final String OTHER2_EXP = " VALID( )*([0-9]{4})/([0-9]{4})"; + // Pattern used for extracting the start time + final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); + Matcher time2Matcher = other2Pattern.matcher(theBulletin); + + // Get time group + if (timestartMatcher.find()) { + time = timestartMatcher.group(2); + } else if (timejapanMatcher.find()) { + time = timejapanMatcher.group(4); + } else if (time1Matcher.find()) { + time = time1Matcher.group(2); + } else if (timecanadaMatcher.find()) { + time = timecanadaMatcher.group(2); + } else if (time2Matcher.find()) { + // Handle start time in special case without day + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{2})([0-9]{4})"; + // Pattern used for extracting WMO header, officeID, and issue date + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(theBulletin); + if (theMatcher.find()) { + time = time2Matcher.group(2).concat(theMatcher.group(3)); + } + } + if (time != "???") { + // Get start time + return TimeTools.findDataTime(time, headers); + } else { + return null; + } + } + + /** + * Get the end time + * + * @param theBulletin + * The bulletin which contains end time + * @return a calendar for end time + */ + public static Calendar getEndTime(String theBulletin, Headers headers) { + + String time = "???"; + + // Regular expression for CONUS end time group + final String ENDTIME_EXP = " VALID( )*([0-9]{6})/([0-9]{6})"; + // Pattern used for extracting the end time group + final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); + Matcher endtimeMatcher = endtimePattern.matcher(theBulletin); + + // Regular expression for CANADA end time group + final String CANADA_EXP = "SIGMET ([A-Z]{1}[0-9]{1}) " + + "(VALID ([0-9]{6})/|CANCELLED AT )([0-9]{6}) ([A-Z]{4})-"; + // Pattern used for extracting the end time group + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher timecanadaMatcher = canadaPattern.matcher(theBulletin); + + // Regular expression for JAPAN and UK end time group + final String JAPAN_EXP = "([A-Z]{4}) SIGMET ([0-9]{1}|[0-9]{2}) " + + "(VALID )?([0-9]{6})/([0-9]{6})(UTC)? ([A-Z]{4})-"; + // Pattern used for extracting the end time group + final Pattern japanPattern = Pattern.compile(JAPAN_EXP); + Matcher timejapanMatcher = japanPattern.matcher(theBulletin); + + // Regular expression for others' end time + final String OTHER1_EXP = " VALID( )*([0-9]{6})(Z)?/([0-9]{6})(Z)?"; + // Pattern used for extracting the end time + final Pattern other1Pattern = Pattern.compile(OTHER1_EXP); + Matcher time1Matcher = other1Pattern.matcher(theBulletin); + + // Regular expression for others' end time + final String OTHER2_EXP = " VALID( )*([0-9]{4})/([0-9]{4})"; + // Pattern used for extracting the end time + final Pattern other2Pattern = Pattern.compile(OTHER2_EXP); + Matcher time2Matcher = other2Pattern.matcher(theBulletin); + + // Get time group + if (endtimeMatcher.find()) { + time = endtimeMatcher.group(3); + } else if (timejapanMatcher.find()) { + time = timejapanMatcher.group(4); + } else if (timecanadaMatcher.find()) { + time = timecanadaMatcher.group(4); + } else if (timecanadaMatcher.find()) { + time = timecanadaMatcher.group(6); + } else if (time1Matcher.find()) { + time = time1Matcher.group(4); + } else if (time2Matcher.find()) { + // Handle end time special case without day + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{2})([0-9]{4})"; + // Pattern used for extracting WMO header, officeID and issue time + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(theBulletin); + if (theMatcher.find()) { + time = time2Matcher.group(3).concat(theMatcher.group(3)); + } + } + + if (time != "???") { + // Get end time + Calendar mndTime = null; + return TimeTools.findDataTime(time, headers); + } else { + return null; + } + } + + /** + * Parse the bulletin and store flight level 1 or level 2 if any. + * + * @param theBulletin + * The bulletin message + * @param record + * The main table + */ + public static void processFlightLevels(String theBulletin, + IntlSigmetRecord record) { + + String flevel1 = " "; + String flevel2 = " "; + + // Regular expression for general one flight level + final String FLEVEL1_EXP = "(TOP|TOPS|TOPS TO) FL( )?([0-9]{3})"; + // Pattern used for extracting the flight level + final Pattern flevel1Pattern = Pattern.compile(FLEVEL1_EXP); + Matcher flevel1Matcher = flevel1Pattern.matcher(theBulletin); + + // Regular expression for flight levels in format "BETWEEN ... AND ...." + final String BETWEEN_EXP = "(BETWEEN|BTN) (FL)?([0-9]{3}|[0-9]{2}) AND " + + "(FL)?([0-9]{3}|[0-9]{2})"; + // Pattern used for extracting the flight levels + final Pattern betweenPattern = Pattern.compile(BETWEEN_EXP); + Matcher betweenMatcher = betweenPattern.matcher(theBulletin); + + // Regular expression for flight levels in format + // "TOPS ... MAX TOPS ...." for Canada + final String MAXTOPS_EXP = "TOPS( |\\x0d\\x0d\\x0a)([0-9]{3}|[0-9]{2}) " + + "MAX TOPS ([0-9]{3}|[0-9]{2})"; + // Pattern used for extracting the flight levels + final Pattern maxtopsPattern = Pattern.compile(MAXTOPS_EXP); + Matcher maxtopsMatcher = maxtopsPattern.matcher(theBulletin); + + // Regular expression for general two flight levels in "360-440" or + // "360/440" format + final String FLEVEL2_EXP = "FL([0-9]{3}|[0-9]{2})(-|/)([0-9]{3}|[0-9]{2})"; + // Pattern used for extracting the flight levels + final Pattern flevel2Pattern = Pattern.compile(FLEVEL2_EXP); + Matcher flevel2Matcher = flevel2Pattern.matcher(theBulletin); + + // Regular expression for general one flight level + final String FLEVEL3_EXP = "(TOP|TOPS|TOPS TO) (FL )?([0-9]{3})"; + // Pattern used for extracting the flight level + final Pattern flevel3Pattern = Pattern.compile(FLEVEL3_EXP); + Matcher flevel3Matcher = flevel3Pattern.matcher(theBulletin); + + final String FLEVEL4_EXP = "FL([0-9]{3})"; + // Pattern used for extracting the flight level + final Pattern flevel4Pattern = Pattern.compile(FLEVEL4_EXP); + Matcher flevel4Matcher = flevel4Pattern.matcher(theBulletin); + + // Get flight levels group + if (maxtopsMatcher.find()) { + flevel1 = maxtopsMatcher.group(3); + } else if (flevel2Matcher.find()) { + flevel1 = flevel2Matcher.group(1); + flevel2 = flevel2Matcher.group(3); + } else if (betweenMatcher.find()) { + flevel1 = betweenMatcher.group(3); + flevel2 = betweenMatcher.group(5); + } else if (flevel1Matcher.find()) { + flevel1 = flevel1Matcher.group(3); + } else if (flevel3Matcher.find()) { + flevel1 = flevel3Matcher.group(3); + } else if (flevel4Matcher.find()) { + flevel1 = flevel4Matcher.group(1); + } + + // Set flight levels to database + if (flevel1 != " ") { + record.setFlightlevel1(Integer.parseInt(flevel1)); + } + if (flevel2 != " ") { + record.setFlightlevel2(Integer.parseInt(flevel2)); + } + + // Parse the locations + processLocation(theBulletin, record); + + } + + /** + * Obtains remarks from a bulletin + * + * @param bullMessage + * The bulletin message + * @return a string for remarks + */ + public static String getRemarks(String bullMessage) { + + String retRemarks = " "; + + // Regular expression correction + final String CORR_EXP = "(COR | (CC[A-Z]{1}))"; + + // Pattern used for extracting correction + final Pattern corrPattern = Pattern.compile(CORR_EXP); + Matcher corrMatcher = corrPattern.matcher(bullMessage); + + // Regular expression amendment + final String AMD_EXP = "(AMD )"; + // Pattern used for extracting amendment + final Pattern amdPattern = Pattern.compile(AMD_EXP); + Matcher amdMatcher = amdPattern.matcher(bullMessage); + + // Regular expression for TEST + final String TEST_EXP = "TEST "; + // Pattern used for extracting test + final Pattern testPattern = Pattern.compile(TEST_EXP); + Matcher testMatcher = testPattern.matcher(bullMessage); + + if (corrMatcher.find()) { + retRemarks = corrMatcher.group(1); + } else if (amdMatcher.find()) { + retRemarks = amdMatcher.group(); + } else if (testMatcher.find()) { + retRemarks = "TEST"; + } + + return retRemarks; + } + + /** + * Obtains speed from a bulletin + * + * @param bullMessage + * The bulletin message + * @return an integer for speed + */ + public static Integer getSpeed(String bullMessage) { + + Integer retSpeed = IDecoderConstantsN.INTEGER_MISSING; + + final String SPEED_EXP = "(MOVE|MOV|MOVG) (|E|N|S|W|\006|\012)* " + + "([0-9]{1}|[0-9]{2})(-[0-9]{2})?( )?(KT)"; + // Pattern used for extracting speed for general + final Pattern speedPattern = Pattern.compile(SPEED_EXP); + Matcher theMatcher = speedPattern.matcher(bullMessage); + + final String CANADA1_EXP = "(MOVE |MOV |MOVG )?([ENSW]{1})WD " + + "([0-9]{2}|[0-9]{1})( |\\x0d\\x0d\\x0a)?KT"; + // Pattern used for extracting speed for Canada + final Pattern canada1Pattern = Pattern.compile(CANADA1_EXP); + Matcher canada1Matcher = canada1Pattern.matcher(bullMessage); + + final String CANADA2_EXP = "(MOVE |MOV |MOVG )?([ENSW]{2})WD " + + "([0-9]{2}|[0-9]{1})(\\x0d\\x0d\\x0a| )?KT"; + // Pattern used for extracting speed for Canada + final Pattern canada2Pattern = Pattern.compile(CANADA2_EXP); + Matcher canada2Matcher = canada2Pattern.matcher(bullMessage); + + final String KMH_EXP = "([0-9]{2}|[0-9]{3})(( )*|( )?\\x0d\\x0d\\x0a)KMH"; + // Pattern used for extracting speed for KMH + final Pattern kmhPattern = Pattern.compile(KMH_EXP); + Matcher kmhMatcher = kmhPattern.matcher(bullMessage); + + if (theMatcher.find()) { + retSpeed = Integer.parseInt(theMatcher.group(3)); + } else if (canada1Matcher.find()) { + retSpeed = Integer.parseInt(canada1Matcher.group(3)); + } else if (canada2Matcher.find()) { + retSpeed = Integer.parseInt(canada2Matcher.group(3)); + } else if (kmhMatcher.find()) { + Integer kmhSpeed = Integer.parseInt(kmhMatcher.group(1)); + // Convert KMH to Knots + float speed = (float) (((double) kmhSpeed * 1000.0 / 3600.0) * 1.9425); + retSpeed = (int) speed; + } + + return retSpeed; + } + + /** + * Obtains intensity from a bulletin + * + * @param bullMessage + * The bulletin message + * @return a string for intensity + */ + public static String getIntensity(String bullMessage) { + + String intensity = null; + + // Regular expression for intensity + final String INTENSITY_EXP = "( NC | INTSF| WKN | NC=|WKN=|NC.|WKNG )"; + // Pattern used for extracting intensityFlag + final Pattern intensityPattern = Pattern.compile(INTENSITY_EXP); + Matcher theMatcher = intensityPattern.matcher(bullMessage); + + if (theMatcher.find()) { + intensity = theMatcher.group(1); + intensity = UtilN.removeLeadingWhiteSpaces(intensity); + if (intensity.substring(0, 2).equals("NC")) { + intensity = "NC"; + } else if (intensity.substring(0, 3).equals("WKN")) { + intensity = "WKN"; + } + } + + return intensity; + } + + /** + * Obtains direction from a bulletin + * + * @param bullMessage + * The bulletin message + * @return a string for direction + */ + public static String getDirection(String bullMessage) { + + String direction = null; + + final String CANADA1_EXP = "(MOVE |MOV |MOVG )?([ENSW]{1})WD " + + "([0-9]{2}|[0-9]{1})( |\\x0d\\x0d\\x0a)?KT"; + // Pattern used for extracting direction for Canada + final Pattern canada1Pattern = Pattern.compile(CANADA1_EXP); + Matcher canada1Matcher = canada1Pattern.matcher(bullMessage); + + final String CANADA2_EXP = "(MOVE |MOV |MOVG )?([ENSW]{2})WD " + + "([0-9]{2}|[0-9]{1})( |\\x0d\\x0d\\x0a)?KT"; + // Pattern used for extracting direction for Canada + final Pattern canada2Pattern = Pattern.compile(CANADA2_EXP); + Matcher canada2Matcher = canada2Pattern.matcher(bullMessage); + + // Regular expression for direction + final String DIRECTION_EXP = "(MOVE|MOV|MOVG) ([ENSW]{3}|[ENSW]{2}|[ENSW]{1})"; + // Pattern used for extracting direction for general + final Pattern directionPattern = Pattern.compile(DIRECTION_EXP); + Matcher theMatcher = directionPattern.matcher(bullMessage); + + final String DIR2_EXP = "(MOVE|MOV|MOVG)(\\D)*([ENSW]{3}|[ENSW]{2}|[ENSW]{1}) "; + // Pattern used for extracting direction for Canada + final Pattern dir2Pattern = Pattern.compile(DIR2_EXP); + Matcher dir2Matcher = dir2Pattern.matcher(bullMessage); + + final String DIR3_EXP = "(MOVE|MOV|MOVG) (SOUTH|NORTH|WEST|EAST) "; + // Pattern used for extracting direction for Canada + final Pattern dir3Pattern = Pattern.compile(DIR3_EXP); + Matcher dir3Matcher = dir3Pattern.matcher(bullMessage); + + if (canada2Matcher.find()) { + direction = canada2Matcher.group(2); + } else if (canada1Matcher.find()) { + direction = canada1Matcher.group(2); + } else if (theMatcher.find()) { + direction = theMatcher.group(2); + } else if (dir2Matcher.find()) { + direction = dir2Matcher.group(3); + } else if (dir3Matcher.find()) { + direction = dir3Matcher.group(2); + if (direction.equals("SOUTH")) { + direction = "S"; + } else if (direction.equals("NORTH")) { + direction = "N"; + } else if (direction.equals("WEST")) { + direction = "W"; + } else if (direction.equals("EAST")) { + direction = "E"; + } + } + return direction; + } + + /** + * Parse the location to set Lat/Lon or location name + * + * @param theLocation + * The location with lat/lon or location name + * @param locTb + * The location table + */ + public static void processLatLon(String theLocation, + IntlSigmetLocation locTb, Integer index, IntlSigmetRecord record) { + + double flat, flon; + + final String LATLON1_EXP = "(N|S)([0-9]{2})([0-9]{2}) (E|W)([0-9]{3})([0-9]{2})"; + // Pattern used for extracting latlon - CONUS + final Pattern latlon1Pattern = Pattern.compile(LATLON1_EXP); + Matcher latlon1Matcher = latlon1Pattern.matcher(theLocation); + + final String LATLON2_EXP = "/([0-9]{2})([0-9]{2})(N|S)([0-9]{3})" + + "([0-9]{2})(E|W)/((\\S|\\s|\\D)*)"; + // Pattern used for extracting latlon - Canada + final Pattern latlon2Pattern = Pattern.compile(LATLON2_EXP); + Matcher latlon2Matcher = latlon2Pattern.matcher(theLocation); + + final String LATLON3_EXP = "(N|S)([0-9]{2})([0-9]{2})(E|W)([0-9]{3})([0-9]{2})"; + // Pattern used for extracting latlon + final Pattern latlon3Pattern = Pattern.compile(LATLON3_EXP); + Matcher latlon3Matcher = latlon3Pattern.matcher(theLocation); + + final String LATLON4_EXP = "(N|S)([0-9]{2})(E|W)([0-9]{3}|[0-9]{2})"; + // Pattern used for extracting latlon + final Pattern latlon4Pattern = Pattern.compile(LATLON4_EXP); + Matcher latlon4Matcher = latlon4Pattern.matcher(theLocation); + + final String LATLON5_EXP = "([0-9]{2})(N|S)([0-9]{3}|[0-9]{2})(E|W)"; + // Pattern used for extracting latlon - Japan + final Pattern latlon5Pattern = Pattern.compile(LATLON5_EXP); + Matcher latlon5Matcher = latlon5Pattern.matcher(theLocation); + + final String LATLON6_EXP = "([0-9]{2})([0-9]{2})(N|S)([0-9]{3})([0-9]{2})(E|W)"; + // Pattern used for extracting latlon + final Pattern latlon6Pattern = Pattern.compile(LATLON6_EXP); + Matcher latlon6Matcher = latlon6Pattern.matcher(theLocation); + + final String LATLON7_EXP = "(N|S)([0-9]{2})([0-9]{2})[\\W| ]*(E|W)" + + "([0-9]{3})([0-9]{2})"; + // Pattern used for extracting latlon + final Pattern latlon7Pattern = Pattern.compile(LATLON7_EXP); + Matcher latlon7Matcher = latlon7Pattern.matcher(theLocation); + + final String LATLON8_EXP = "(N|S)([0-9]{2})( )*(E|W)([0-9]{3}|[0-9]{2})"; + // Pattern used for extracting latlon + final Pattern latlon8Pattern = Pattern.compile(LATLON8_EXP); + Matcher latlon8Matcher = latlon8Pattern.matcher(theLocation); + + double NSFlag = 1.0; + double EWFlag = 1.0; + double seconds = 60.0; + LatLonPoint point = null; + + if (record.getWmoHeader().equals("WSMC31")) { + // WSMC31 issues lat/lon in decimals. + seconds = 100.0; + } + + if (latlon1Matcher.find()) { + // latlon format for CONUS + if (latlon1Matcher.group(1).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag + * (Integer.parseInt(latlon1Matcher.group(2)) + (Integer + .parseInt(latlon1Matcher.group(3)) / seconds)); + if (latlon1Matcher.group(4).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag + * (Integer.parseInt(latlon1Matcher.group(5)) + (Integer + .parseInt(latlon1Matcher.group(6)) / seconds)); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon1Matcher.group()); + } else if (latlon2Matcher.find()) { + // latlon format for Canada + if (latlon2Matcher.group(3).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag + * (Integer.parseInt(latlon2Matcher.group(1)) + (Integer + .parseInt(latlon2Matcher.group(2)) / seconds)); + if (latlon2Matcher.group(6).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag + * (Integer.parseInt(latlon2Matcher.group(4)) + (Integer + .parseInt(latlon2Matcher.group(5)) / seconds)); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon2Matcher.group(7)); + } else if (latlon3Matcher.find()) { + if (latlon3Matcher.group(1).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag + * (Integer.parseInt(latlon3Matcher.group(2)) + (Integer + .parseInt(latlon3Matcher.group(3)) / seconds)); + if (latlon3Matcher.group(4).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag + * (Integer.parseInt(latlon3Matcher.group(5)) + (Integer + .parseInt(latlon3Matcher.group(6)) / seconds)); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon3Matcher.group()); + } else if (latlon4Matcher.find()) { + if (latlon4Matcher.group(1).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag * (Integer.parseInt(latlon4Matcher.group(2))); + if (latlon4Matcher.group(3).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag * (Integer.parseInt(latlon4Matcher.group(4))); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon4Matcher.group()); + } else if (latlon5Matcher.find()) { + if (latlon5Matcher.group(2).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag * (Integer.parseInt(latlon5Matcher.group(1))); + if (latlon5Matcher.group(4).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag * (Integer.parseInt(latlon5Matcher.group(3))); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon5Matcher.group()); + } else if (latlon6Matcher.find()) { + // latlon6 format + if (latlon6Matcher.group(3).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag + * (Integer.parseInt(latlon6Matcher.group(1)) + (Integer + .parseInt(latlon6Matcher.group(2)) / seconds)); + if (latlon6Matcher.group(6).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag + * (Integer.parseInt(latlon6Matcher.group(4)) + (Integer + .parseInt(latlon6Matcher.group(5)) / seconds)); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon6Matcher.group()); + } else if (latlon7Matcher.find()) { + // latlon format + if (latlon7Matcher.group(1).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag + * (Integer.parseInt(latlon7Matcher.group(2)) + (Integer + .parseInt(latlon7Matcher.group(3)) / seconds)); + if (latlon7Matcher.group(4).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag + * (Integer.parseInt(latlon7Matcher.group(5)) + (Integer + .parseInt(latlon7Matcher.group(6)) / seconds)); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon7Matcher.group()); + } else if (latlon8Matcher.find()) { + if (latlon8Matcher.group(1).equals("S")) { + NSFlag = -1.0; + } + flat = NSFlag * (Integer.parseInt(latlon8Matcher.group(2))); + if (latlon8Matcher.group(4).equals("W")) { + EWFlag = -1.0; + } + flon = EWFlag * (Integer.parseInt(latlon8Matcher.group(5))); + locTb.setLatitude(flat); + locTb.setLongitude(flon); + locTb.setLocationName(latlon8Matcher.group()); + } else { + System.out.println("theLocation=" + theLocation); + if ((index == 0) + && ((theLocation.substring(0, 3).equals("IN ")) || theLocation + .substring(0, 3).equals("OF "))) { + // handle special case with "IN " or "OF " and location + String retLoc = theLocation.substring(3); + locTb.setLocationName(retLoc); + // Get a latLonPoint for this station ID from "vors" location + // table + point = LatLonLocTbl.getLatLonPoint(retLoc, "vors"); + if (point != null) { + locTb.setLatitude(point.getLatitude(LatLonPoint.INDEGREES)); + locTb.setLongitude(point.getLongitude(LatLonPoint.INDEGREES)); + } + } else { + locTb.setLocationName(theLocation); + // Get a latLonPoint for this station ID from "vors" location + // table + point = LatLonLocTbl.getLatLonPoint(theLocation, "vors"); + if (point != null) { + locTb.setLatitude(point.getLatitude(LatLonPoint.INDEGREES)); + locTb.setLongitude(point.getLongitude(LatLonPoint.INDEGREES)); + } + + } + } + } + + /** + * Obtains distance or radius from a bulletin for a "LINE" type + * + * @param bullMessage + * The bulletin message + * @return an integer of distance + */ + public static Integer getDistance(String bullMessage) { + + Integer retDistance = IDecoderConstantsN.INTEGER_MISSING; + + // Regular expression for distance + final String DISTANCE_EXP = "(WI )?([0-9]{2}|[0-9]{3})( )?NM "; + // Pattern used for extracting distance + final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); + Matcher theMatcher = distancePattern.matcher(bullMessage); + + // Regular expression distance for Canada + final String CANADA_EXP = "WTN ([0-9]{2}|[0-9]{3}) NM OF LN "; + // Pattern used for extracting distance for CANADA sigmet + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher canadaMatcher = canadaPattern.matcher(bullMessage); + + if (theMatcher.find()) { + retDistance = Integer.parseInt(theMatcher.group(2)); + } else if (canadaMatcher.find()) { + retDistance = Integer.parseInt(canadaMatcher.group(1)); + } + return retDistance; + } + + /** + * Get name location for the VA, TC, or HU.... + * + * @param bullMessage + * The bulletin message + * @return a string for nameLocation + */ + public static String getNameLocation(String bullMessage) { + + String retLocation = " "; + + final String VA_EXP = "MT (\\S)*-PEAK LOC ([NS][0-9]{4} [EW][0-9]{5}) "; + // Pattern used for extracting VA nameLocation + final Pattern vaPattern = Pattern.compile(VA_EXP); + Matcher vaMatcher = vaPattern.matcher(bullMessage); + + final String TC_EXP = " TC ((\\S)* FCST (\\S)* (\\S)*) "; + // Pattern used for extracting TC nameLocation + final Pattern tcPattern = Pattern.compile(TC_EXP); + Matcher tcMatcher = tcPattern.matcher(bullMessage); + + // final String HUR1_EXP = "(HURRICANE IRENE LOCATED AT )"; + final String HUR1_EXP = "(HURRICANE ([A-Z])* LOCATED AT ([\\w|.])* ([\\w|.])*) MOVG"; + // Pattern used for extracting Hurricane nameLocation + final Pattern hur1Pattern = Pattern.compile(HUR1_EXP); + Matcher hur1Matcher = hur1Pattern.matcher(bullMessage); + + final String HUR2_EXP = "(HURCN ([A-Z])* NEAR ([\\w|.])* ([\\w|.])*) "; + // Pattern used for extracting Hurricane nameLocation + final Pattern hur2Pattern = Pattern.compile(HUR2_EXP); + Matcher hur2Matcher = hur2Pattern.matcher(bullMessage); + + final String TS_EXP = "(TROPICAL STORM ([A-Z])* (\\w)*)"; + // Pattern used for extracting Tropical Storm nameLocation + final Pattern tsPattern = Pattern.compile(TS_EXP); + Matcher tsMatcher = tsPattern.matcher(bullMessage); + + final String TD_EXP = "(TROPICAL (DEPRESSION )?([A-Z])* (\\w)*)"; + // Pattern used for extracting Tropical Depression nameLocation + final Pattern tdPattern = Pattern.compile(TD_EXP); + Matcher tdMatcher = tdPattern.matcher(bullMessage); + + if (vaMatcher.find()) { + retLocation = vaMatcher.group(); + } else if (tcMatcher.find()) { + retLocation = tcMatcher.group(1); + } else if (hur1Matcher.find()) { + retLocation = hur1Matcher.group(1); + } else if (hur2Matcher.find()) { + retLocation = hur2Matcher.group(1); + } else if (tsMatcher.find()) { + retLocation = tsMatcher.group(1); + } else if (tdMatcher.find()) { + retLocation = tdMatcher.group(1); + } + + return retLocation; + } + + /** + * Obtains polygon extent from a bulletin for a "LINE" type + * or a polygon type + * + * @param bullMessage The bulletin message + * @return a string + */ + public static String getPolygonExtent(String bullMessage) { + + String retStr = ""; + + // Regular expression for distance + final String DISTANCE_EXP = "(WI )?([0-9]{2}|[0-9]{3})( )?NM "; + // Pattern used for extracting distance + final Pattern distancePattern = Pattern.compile(DISTANCE_EXP); + Matcher theMatcher = distancePattern.matcher( bullMessage ); + + // Regular expression for line + final String LINE_EXP = " ([0-9]{2}|[0-9]{3})( )?NM (EITHER SIDE OF)"; + // Pattern used for extracting line information + final Pattern linePattern = Pattern.compile(LINE_EXP); + Matcher lineMatcher = linePattern.matcher( bullMessage ); + + // Regular expression distance for Canada + final String CANADA_EXP = "(WTN|WITHIN) ([0-9]{2}|[0-9]{3})( )?NM OF (LN|LINE)"; + // Pattern used for extracting distance for CANADA sigmet + final Pattern canadaPattern = Pattern.compile(CANADA_EXP); + Matcher canadaMatcher = canadaPattern.matcher( bullMessage ); + + // Regular expression for POLYGON + final String POLYGON_EXP = " ([0-9]{2}|[0-9]{3})( )?NM ([EWSN]|[EWSN]{2}|[EWSN]{3}) OF"; + // Pattern used for extracting POLYGON information + final Pattern polygonPattern = Pattern.compile(POLYGON_EXP); + Matcher polygonMatcher = polygonPattern.matcher( bullMessage ); + + if (canadaMatcher.find()) { + retStr = canadaMatcher.group(1); + } else if (lineMatcher.find()) { + retStr = lineMatcher.group(3); + } else if (polygonMatcher.find()) { + retStr = polygonMatcher.group(3).concat(" OF"); + } else if (theMatcher.find()) { + retStr = theMatcher.group(1); + } + + return retStr; + } + + /** + * Parse the location lines and add location table to the main record table + * if any + * + * @param theBulletin + * The report from bulletin message + * @param record + * The main table + * @return a boolean true if any location exists. + */ + public static boolean processLocation(String theBulletin, + IntlSigmetRecord record) { + + boolean ret = false; + + String locationDelimiter = "-"; + String retLocation = "?"; + int locPositionIndex = -1; + + ArrayList terminationList = new ArrayList(); + // Locations ends with these key words + terminationList.addAll(Arrays + .asList(new String[] { "TOP", "SEV", "BKN", "STNR", "ISOL", + "MOV", "SOLID", "TOPS", "AREA", "BTN", "STG", "SEVERE", + "INTSF=", "MAINLY", "SIGMET", "OCNL", "WKN", "PL", + "FZRA", "LLWS", "TURB", "STR", "FCST", "VA", "MDT", + "STRONG", "LN", "AT", "BASED", "OF", "SVR", "OVER", + "TS", "AND", "OBL", "TURBUL", "BLW", "TOP", "TORNADO", + "CORRECTION" })); + + final String LATLON1_EXP = "(N|S)([0-9]{4}) (E|W)([0-9]{5}) -"; + // Pattern used for extracting latlon + final Pattern latlon1Pattern = Pattern.compile(LATLON1_EXP); + Matcher latlon1Matcher = latlon1Pattern.matcher(theBulletin); + + final String LATLON2_EXP = "/([0-9]{4})(N|S)([0-9]{5})(E|W)/"; + // Pattern used for extracting latlon + final Pattern latlon2Pattern = Pattern.compile(LATLON2_EXP); + Matcher latlon2Matcher = latlon2Pattern.matcher(theBulletin); + + final String LATLON3_EXP = "(N|S)([0-9]{4})(E|W)([0-9]{5})-"; + // Pattern used for extracting latlon + final Pattern latlon3Pattern = Pattern.compile(LATLON3_EXP); + Matcher latlon3Matcher = latlon3Pattern.matcher(theBulletin); + + final String LATLON4_EXP = "(N|S)([0-9]{2})(E|W)([0-9]{3})"; + // Pattern used for extracting latlon + final Pattern latlon4Pattern = Pattern.compile(LATLON4_EXP); + Matcher latlon4Matcher = latlon4Pattern.matcher(theBulletin); + + final String LATLON5_EXP = "([0-9]{2})(N|S)([0-9]{3}|[0-9]{2})(E|W)"; + // Pattern used for extracting latlon + final Pattern latlon5Pattern = Pattern.compile(LATLON5_EXP); + Matcher latlon5Matcher = latlon5Pattern.matcher(theBulletin); + + final String LATLON6_EXP = "([0-9]{4})(N|S)([0-9]{5})(E|W)"; + // Pattern used for extracting latlon + final Pattern latlon6Pattern = Pattern.compile(LATLON6_EXP); + Matcher latlon6Matcher = latlon6Pattern.matcher(theBulletin); + + final String LATLON7_EXP = " [A-Z]*( )?-( )?[A-Z]*( )?-"; + // Pattern used for extracting latlon + final Pattern latlon7Pattern = Pattern.compile(LATLON7_EXP); + Matcher latlon7Matcher = latlon7Pattern.matcher(theBulletin); + + final String LATLON9_EXP = " [A-Z]* [A-Z]*/(\\w| )*/"; + // Pattern used for extracting latlon + final Pattern latlon9Pattern = Pattern.compile(LATLON9_EXP); + Matcher latlon9Matcher = latlon9Pattern.matcher(theBulletin); + + // Find the position of first location + if (latlon7Matcher.find()) { + retLocation = latlon7Matcher.group(); + } else if (latlon1Matcher.find()) { + retLocation = latlon1Matcher.group(); + } else if (latlon2Matcher.find()) { + retLocation = latlon2Matcher.group(); + } else if (latlon3Matcher.find()) { + retLocation = latlon3Matcher.group(); + } else if (latlon4Matcher.find()) { + retLocation = latlon4Matcher.group(); + } else if (latlon5Matcher.find()) { + retLocation = latlon5Matcher.group(); + } else if (latlon6Matcher.find()) { + retLocation = latlon6Matcher.group(); + } else if (latlon9Matcher.find()) { + retLocation = latlon9Matcher.group(); + int sigmetIndex = retLocation.indexOf("SIGMET"); + int fcstIndex = retLocation.indexOf("FCST "); + int innIndex = retLocation.indexOf("IN N/"); + int sfcIndex = retLocation.indexOf(" SFC"); + int obsIndex = retLocation.indexOf(" OBS"); + // Handle special cases and throw them away + if (sigmetIndex != -1) { + retLocation = "?"; + } else if (fcstIndex != -1) { + retLocation = "?"; + } else if (innIndex != -1) { + retLocation = "?"; + } else if (sfcIndex != -1) { + retLocation = "?"; + } else if (obsIndex != -1) { + retLocation = "?"; + } + + } + + locPositionIndex = theBulletin.indexOf(retLocation); + + if (locPositionIndex > 0) { + String secondHalf = theBulletin.substring(locPositionIndex); + Scanner scLocationLine = new Scanner(secondHalf) + .useDelimiter("\\x0d\\x0d\\x0a"); + String lines = " "; + String curLine = null; + ArrayList locationList = new ArrayList(); + locationList.clear(); + Boolean notBreak = true; + + while (scLocationLine.hasNext() && notBreak) { + // Get next location line + curLine = scLocationLine.next(); + + Scanner scLocationToken = new Scanner(curLine); + while (scLocationToken.hasNext() && notBreak) { + // Check the token from each line + String token = scLocationToken.next(); + if (terminationList.contains(token)) { + // terminate and get the locations in this line + int token_pos = curLine.indexOf(token); + lines = lines.concat(" ").concat( + curLine.substring(0, token_pos)); + notBreak = false; + break; + } + } + if (notBreak) { + lines = lines.concat(" ").concat(curLine); + } + } + + // Clean up the leading space + lines = UtilN.removeLeadingWhiteSpaces(lines); + lines = removeChar(lines, '\r'); + lines = removeChar(lines, '\n'); + + // Decide the location delimiter. + Boolean whiteDel = false; + int dashPos = lines.indexOf("-"); + int slashPos = lines.indexOf("/"); + if (dashPos != -1) { + locationDelimiter = "-"; + } else if (slashPos != -1) { + locationDelimiter = "/"; + } else { + locationDelimiter = " "; + whiteDel = true; + } + // Parse the location lines by a "-", "/", or " ". + Scanner scLocation = new Scanner(lines) + .useDelimiter(locationDelimiter); + + locationList.clear(); + // Get all locations + while (scLocation.hasNext()) { + // Clean up the leading space + String location = UtilN.removeLeadingWhiteSpaces(scLocation + .next()); + if (whiteDel) { + // white space as delimiter + int lengthOfLocation = location.length(); + if (lengthOfLocation > 2) { + if (Character.isDigit(location.toCharArray()[0]) + && (lengthOfLocation > 2)) { + locationList.add(location); + } else if (Character.isDigit(location.toCharArray()[1]) + && (lengthOfLocation > 2)) { + locationList.add(location); + } + } + } else if ((location.length() > 0) + && (!location.substring(0, 2).equals("FL"))) { + // exception handle for a "FL" false location + locationList.add(location); + } + } + + // set locations to data base + Integer idxLocation = 0; + if (locationList.size() > 1) { + for (String Location : locationList) { + IntlSigmetLocation currentLocation = new IntlSigmetLocation(); + currentLocation.setLocationLine(lines); + // currentLocation.setLocationName(Location); + processLatLon(Location, currentLocation, idxLocation, + record); + currentLocation.setIndex(idxLocation + 1); + idxLocation++; + + record.addIntlSigmetLocation(currentLocation); + } + ret = true; + } + } + return ret; + } + + /** + * Get detail information for Thunderstorm. + * + * @param theReport + * the input bulletin + * @return a string for Thunderstorm + */ + public static String getThunderStorm(String theReport) { + + String retTS = "THUNDERSTORM"; + // Regular expression for tsType + final String TSTYPE_EXP = "(SQL EMBD TS |ISOL EMBD TS |EMBD TS GR |ISOL TS |EMBD TS |" + + "FRQ TS|SQL TS |TS GR |OBSC TS|FRQ TSGR |OCNL TS |EMBD TSGR | TSGR | GR |" + + "TS/CB|CB/TS)"; + // Pattern used for extracting hazardType + final Pattern tsTypePattern = Pattern.compile(TSTYPE_EXP); + Matcher tsMatcher = tsTypePattern.matcher(theReport); + + if (tsMatcher.find()) { + if (tsMatcher.group(1).equals("EMBD TS GR ")) { + retTS = "EMBEDED THUNDERSTORMS HAIL"; + } else if (tsMatcher.group(1).equals("SQL EMBD TS ")) { + retTS = "SQUALL EMBEDED THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("ISOL EMBD TS ")) { + retTS = "ISOLATED EMBEDED THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("ISOL TS ")) { + retTS = "ISOLATED THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("EMBD TS ")) { + retTS = "EMBEDED THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("FRQ TS")) { + retTS = "FREQUENT THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("SQL TS ")) { + retTS = "SQUALL THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("TS GR ")) { + retTS = "THUNDERSTORMS HAIL"; + } else if (tsMatcher.group(1).equals("OBSC TS")) { + retTS = "OBSCURE THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("FRQ TSGR ")) { + retTS = "FREQUENT THUNDERSTORMS HAIL"; + } else if (tsMatcher.group(1).equals("OCNL TS ")) { + retTS = "OCCASIONAL THUNDERSTORMS"; + } else if (tsMatcher.group(1).equals("EMBD TSGR ")) { + retTS = "EMBEDED THUNDERSTORMS HAIL"; + } else if (tsMatcher.group(1).equals(" TSGR ")) { + retTS = "THUNDERSTORMS HAIL"; + } else if (tsMatcher.group(1).equals(" GR ")) { + retTS = "HAIL"; + } else if (tsMatcher.group(1).equals("TS/CB")) { + retTS = "THUNDERSTORMS CUMULONIMBUS"; + } else if (tsMatcher.group(1).equals("CB/TS")) { + retTS = "THUNDERSTORMS CUMULONIMBUS"; + } + } + + return retTS; + } + + /** + * Remove a character from a string and return the result. + * + * @param s + * the string + * @param c + * the character to be removed + * @return a string. + */ + public static String removeChar(String s, char c) { + + String ret = ""; + + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) != c) + ret += s.charAt(i); + } + + return ret; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/package-info.java old mode 100644 new mode 100755 index d6c1a45bcd..91e3452c24 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.intlsigmet/src/gov/noaa/nws/ncep/edex/plugin/intlsigmet/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.intlsigmet.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.intlsigmet.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mcidas/gov.noaa.nws.ncep.edex.plugin.mcidas.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.mcidas/gov.noaa.nws.ncep.edex.plugin.mcidas.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mcidas/utility/edex_static/base/distribution/mcidas.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.mcidas/utility/edex_static/base/distribution/mcidas.xml index 9902240fa0..5f0521d94a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mcidas/utility/edex_static/base/distribution/mcidas.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mcidas/utility/edex_static/base/distribution/mcidas.xml @@ -1,4 +1,5 @@ - ^MANUAL INGEST.* + ^MCIDAS.* + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/gov.noaa.nws.ncep.edex.plugin.mosaic.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/gov.noaa.nws.ncep.edex.plugin.mosaic.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/res/endpoints/mosaic-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/res/endpoints/mosaic-ingest.xml index ac42373d24..e89c4f1a52 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/res/endpoints/mosaic-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/res/endpoints/mosaic-ingest.xml @@ -1,32 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -43,25 +43,25 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/common/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/common/package-info.java index c6d66da4ab..41a4d5fb8e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/common/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/common/package-info.java @@ -1,4 +1,4 @@ -/** - * Core classes for radar plugin. Core files include the decoder, record, separator, and writer implementations - */ +/** + * Core classes for radar plugin. Core files include the decoder, record, separator, and writer implementations + */ package gov.noaa.nws.ncep.edex.plugin.mosaic.common; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/decoder/package-info.java index 5d85283f76..605caf019e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/decoder/package-info.java @@ -1,4 +1,4 @@ -/** - * Core classes for radar plugin. Core files include the decoder, record, separator, and writer implementations - */ +/** + * Core classes for radar plugin. Core files include the decoder, record, separator, and writer implementations + */ package gov.noaa.nws.ncep.edex.plugin.mosaic.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/uengine/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/uengine/package-info.java index 1d3d23fe73..65aaf17643 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/uengine/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/uengine/package-info.java @@ -1,5 +1,5 @@ -/** - * Contains JavaScript oriented μEngine tasks specific to mosaic - * - */ +/** + * Contains JavaScript oriented μEngine tasks specific to mosaic + * + */ package gov.noaa.nws.ncep.edex.plugin.mosaic.uengine; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/Level3Parser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/Level3Parser.java index 944dedae95..9ad37f9859 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/Level3Parser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/Level3Parser.java @@ -1,21 +1,21 @@ -package gov.noaa.nws.ncep.edex.plugin.mosaic.util.level3; - +package gov.noaa.nws.ncep.edex.plugin.mosaic.util.level3; + import gov.noaa.nws.ncep.edex.plugin.mosaic.util.MosaicUtil; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Calendar; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Calendar; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.DataFormatException; +import java.util.zip.Inflater; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * Level3Parser is a class that will allow the user to do the following: @@ -32,147 +32,147 @@ import org.apache.commons.logging.LogFactory; * This code has been developed by the SIB for use in the AWIPS2 system. * @author L. Lin * @version 1.0 - */ - -public class Level3Parser { - - private static final int Z_DEFLATED = 8; - - private static final int DEF_WBITS = 15; - - private static final Pattern WMO_PATTERN = Pattern - .compile("([A-Z]{4}[0-9]{2} [A-Z]{4} [0-9]{6})\\x0D\\x0D\\x0A(\\w{6})\\x0D\\x0D\\x0A"); - - /** The logger */ - private final transient Log logger = LogFactory.getLog(getClass()); - - protected DataInputStream theMosaicData = null; - - private ByteArrayInputStream theRawMosaicData = null; - - protected byte[] theRawMosaicByteArray = null; - - // message header - private int theMessageCode; - - private Calendar theMsgTimestamp; - - private int theMsgLength; - - private int theSourceId; - - private int theDestinationId; - - private int numberOfBlocks; - - // product description block - private double theLatitude; - - private double theLongitude; - - private int theHeight; - - private int theProductCode; - - private int theOperationalMode; - - private int theVolumeCoveragePattern; - - private int theSequenceNumber; - - private int theVolumeScanNumber; - - private Calendar theVolScanTime; - - private Calendar theProdGenTime; - - private static short[] productDependentValues; - - private int elevationNumber; - + */ + +public class Level3Parser { + + private static final int Z_DEFLATED = 8; + + private static final int DEF_WBITS = 15; + + private static final Pattern WMO_PATTERN = Pattern + .compile("([A-Z]{4}[0-9]{2} [A-Z]{4} [0-9]{6})\\x0D\\x0D\\x0A(\\w{6})\\x0D\\x0D\\x0A"); + + /** The logger */ + private final transient Log logger = LogFactory.getLog(getClass()); + + protected DataInputStream theMosaicData = null; + + private ByteArrayInputStream theRawMosaicData = null; + + protected byte[] theRawMosaicByteArray = null; + + // message header + private int theMessageCode; + + private Calendar theMsgTimestamp; + + private int theMsgLength; + + private int theSourceId; + + private int theDestinationId; + + private int numberOfBlocks; + + // product description block + private double theLatitude; + + private double theLongitude; + + private int theHeight; + + private int theProductCode; + + private int theOperationalMode; + + private int theVolumeCoveragePattern; + + private int theSequenceNumber; + + private int theVolumeScanNumber; + + private Calendar theVolScanTime; + + private Calendar theProdGenTime; + + private static short[] productDependentValues; + + private int elevationNumber; + private short[] dataLevelThresholds; private int maximumDataLevel; // Use for raster display! - private static int numberOfColumns; - - private SymbologyBlock symbologyBlock; - - private int numberOfMaps; - - /** - * This level3Parser constructor accepts a mosaic file contained within a - * java.io.File object. - * - * @param aMosaic - * A java.io.File object containing a raw mosaic file - * @throws IOException - * If the mosaic head parsing fails, an IO exception is thrown - */ - public Level3Parser(File aMosaic) throws IOException { - int fileSize = (int) aMosaic.length(); - byte[] tempRawMosaicByteArray = new byte[fileSize]; - - FileInputStream mosaicFile = null; - - try { - mosaicFile = new FileInputStream(aMosaic); + private static int numberOfColumns; + + private SymbologyBlock symbologyBlock; + + private int numberOfMaps; + + /** + * This level3Parser constructor accepts a mosaic file contained within a + * java.io.File object. + * + * @param aMosaic + * A java.io.File object containing a raw mosaic file + * @throws IOException + * If the mosaic head parsing fails, an IO exception is thrown + */ + public Level3Parser(File aMosaic) throws IOException { + int fileSize = (int) aMosaic.length(); + byte[] tempRawMosaicByteArray = new byte[fileSize]; + + FileInputStream mosaicFile = null; + + try { + mosaicFile = new FileInputStream(aMosaic); mosaicFile.read(tempRawMosaicByteArray); - } finally { - if (mosaicFile != null) { - mosaicFile.close(); - } - } - init(tempRawMosaicByteArray); - } - - /** - * This level3Parser constructor accepts a mosaic file already converted to a - * byte array. - * - * @param aMosaic - * A byte array containing a raw mosaic file - * @throws IOException - * If the mosaic head parsing fails, an IO exception is thrown - */ + } finally { + if (mosaicFile != null) { + mosaicFile.close(); + } + } + init(tempRawMosaicByteArray); + } + + /** + * This level3Parser constructor accepts a mosaic file already converted to a + * byte array. + * + * @param aMosaic + * A byte array containing a raw mosaic file + * @throws IOException + * If the mosaic head parsing fails, an IO exception is thrown + */ public Level3Parser(byte[] aMosaic) throws IOException { - init(aMosaic); - } - - /** - * @param aMosaic - * @throws IOException - */ - private void init(byte[] aMosaic) throws IOException { - // skip the WMO header if any + init(aMosaic); + } + + /** + * @param aMosaic + * @throws IOException + */ + private void init(byte[] aMosaic) throws IOException { + // skip the WMO header if any String headerSearch = new String(aMosaic, 0, 80); - // decide where the mosaic starts + // decide where the mosaic starts int wmoHeaderSize = findStartMosaicData(headerSearch); - //check if mosaic file compressed or not compressed + //check if mosaic file compressed or not compressed if (isCompressed(aMosaic, wmoHeaderSize)) { - theRawMosaicByteArray = decompressMosaic(aMosaic, wmoHeaderSize); + theRawMosaicByteArray = decompressMosaic(aMosaic, wmoHeaderSize); } else { - theRawMosaicByteArray = new byte[aMosaic.length - wmoHeaderSize]; - System.arraycopy(aMosaic, wmoHeaderSize, theRawMosaicByteArray, 0, - theRawMosaicByteArray.length); - } + theRawMosaicByteArray = new byte[aMosaic.length - wmoHeaderSize]; + System.arraycopy(aMosaic, wmoHeaderSize, theRawMosaicByteArray, 0, + theRawMosaicByteArray.length); + } - //allocate the same length of buf + //allocate the same length of buf theRawMosaicData = new ByteArrayInputStream(theRawMosaicByteArray); //create DataInputStream so that it may be accessible - //to read by the object "theMosaicData" in parseMosaicHeader - theMosaicData = new DataInputStream(theRawMosaicData); - - // parse the header to get constants in message header block - this.parseMosaicHeader(); - if (this.theMessageCode != 2) { - this.parseMosaicMessage(); + //to read by the object "theMosaicData" in parseMosaicHeader + theMosaicData = new DataInputStream(theRawMosaicData); + + // parse the header to get constants in message header block + this.parseMosaicHeader(); + if (this.theMessageCode != 2) { + this.parseMosaicMessage(); } - } - + } + public int getNumberOfMaps() { return numberOfMaps; } @@ -181,433 +181,433 @@ public class Level3Parser { this.numberOfMaps = numberOfMaps; } - /** - * Returns the NEXRAD message code from the level 3 header - * - * @return An integer that can range from -131 to -16 and 0 to 211 - */ - public int getMessageCode() { - return theMessageCode; - } - - /** - * Returns a Date object which represents the time of the message. This is - * for the time of the message only and does not reflect the time of the - * scan or the time the product was generated. - * - * @return A Date object for the time the NEXRAD message was generated - */ - public Calendar getMessageTimestamp() { - return theMsgTimestamp; - } - - /** - * Returns the total length of the message. This is the number of bytes for - * the entire message including this header information being parsed right - * now. - * - * @return A long which will be from 18 to 409586 - */ - public long getMessageLength() { - return theMsgLength; - } - - /** - * Returns an integer reflecting the the sender of the message. - * - * @return A number from 0 to 999 - */ - public int getSourceId() { - return theSourceId; - } - - /** - * Returns an integer reflecting the the destination of the message. - * - * @return A number from 0 to 999 - */ - public int getDestinationId() { - return theDestinationId; - } - - /** - * Returns the latitude of the mosaic site. Positive indicates north, - * negative will indicate south. - * - * @return A latitude in decimal degree between -90.0 to 90.0 - */ - public double getLatitude() { - return theLatitude; - } - - /** - * Returns the longitude of the mosaic site. Positive indicates east, - * negative will indicate west. - * - * @return A longitude in decimal degrees between -180.0 to 180.0 - */ - public double getLongitude() { - return theLongitude; - } - - /** - * Returns the height of the mosaic. This will be in the units feet. - * - * @return An integer from -100 to 11,000 - */ - public int getHeight() { - return theHeight; - } - - /** - * Returns the internal NEXRAD product code of the weather product being - * transmitted. - * - * @return A product code from -131 to -16 and 16 to 131 - */ - public int getProductCode() { - return theProductCode; - } - - /** - * Returns the operational mode the mosaic is currently running in. - * - * @return A operational mode number from 0 to 2 - */ - public int getOperationalMode() { - return theOperationalMode; - } - - /** - * Returns the RDA volum coverage pattern. This indicates the scan strategy - * being used. Not entirely sure what this means in an operational setting. - * - * @return A number 1 to 767 for the volume coverage pattern - */ - public int getVolumeCoveragePattern() { - return theVolumeCoveragePattern; - } - - /** - * Returns the sequence number of the request that generated the NEXRAD - * product. In case the product was requested by an alert condition, it will - * return a -13. - * - * @return A sequence number either -13 or 0 to 32767 - */ - public int getSequenceNumber() { - return theSequenceNumber; - } - - /** - * Returns the mosaic site's internal counter entry. This will start at 1 and - * go to 80. - * - * @return A counter number 1 to 80 - */ - public int getVolumeScanNumber() { - return theVolumeScanNumber; - } - - /** - * Returns a Date object which represents the time the scan was done. This - * is for the time of the volume scan only and does not reflect the time of - * the message or the time the product was generated. - * - * @return A Date object for the time of the volume scan - */ - public Calendar getVolumeScanTime() { - return theVolScanTime; - } - - /** - * Returns a Date object which represents the time the product was - * generated. This is for the time of product generation only and does not - * reflect the time of the message or the time the scan was done. - * - * @return A Date object for the time the product was generated - */ - public Calendar getProductGenerationTime() { - return theProdGenTime; - } - - /** - * Returns the entire raw mosaic message. - * - * @return The mosaic message - */ - public byte[] getRawMosaicData() { - return theRawMosaicByteArray; - } - - public static short getProductDependentValue(int value) { - return productDependentValues[value]; - } - - public short[] getProductDependentValue() { - return productDependentValues; - } - - public short getDataLevelThreshold(int code) { - return dataLevelThresholds[code]; - } - + /** + * Returns the NEXRAD message code from the level 3 header + * + * @return An integer that can range from -131 to -16 and 0 to 211 + */ + public int getMessageCode() { + return theMessageCode; + } + + /** + * Returns a Date object which represents the time of the message. This is + * for the time of the message only and does not reflect the time of the + * scan or the time the product was generated. + * + * @return A Date object for the time the NEXRAD message was generated + */ + public Calendar getMessageTimestamp() { + return theMsgTimestamp; + } + + /** + * Returns the total length of the message. This is the number of bytes for + * the entire message including this header information being parsed right + * now. + * + * @return A long which will be from 18 to 409586 + */ + public long getMessageLength() { + return theMsgLength; + } + + /** + * Returns an integer reflecting the the sender of the message. + * + * @return A number from 0 to 999 + */ + public int getSourceId() { + return theSourceId; + } + + /** + * Returns an integer reflecting the the destination of the message. + * + * @return A number from 0 to 999 + */ + public int getDestinationId() { + return theDestinationId; + } + + /** + * Returns the latitude of the mosaic site. Positive indicates north, + * negative will indicate south. + * + * @return A latitude in decimal degree between -90.0 to 90.0 + */ + public double getLatitude() { + return theLatitude; + } + + /** + * Returns the longitude of the mosaic site. Positive indicates east, + * negative will indicate west. + * + * @return A longitude in decimal degrees between -180.0 to 180.0 + */ + public double getLongitude() { + return theLongitude; + } + + /** + * Returns the height of the mosaic. This will be in the units feet. + * + * @return An integer from -100 to 11,000 + */ + public int getHeight() { + return theHeight; + } + + /** + * Returns the internal NEXRAD product code of the weather product being + * transmitted. + * + * @return A product code from -131 to -16 and 16 to 131 + */ + public int getProductCode() { + return theProductCode; + } + + /** + * Returns the operational mode the mosaic is currently running in. + * + * @return A operational mode number from 0 to 2 + */ + public int getOperationalMode() { + return theOperationalMode; + } + + /** + * Returns the RDA volum coverage pattern. This indicates the scan strategy + * being used. Not entirely sure what this means in an operational setting. + * + * @return A number 1 to 767 for the volume coverage pattern + */ + public int getVolumeCoveragePattern() { + return theVolumeCoveragePattern; + } + + /** + * Returns the sequence number of the request that generated the NEXRAD + * product. In case the product was requested by an alert condition, it will + * return a -13. + * + * @return A sequence number either -13 or 0 to 32767 + */ + public int getSequenceNumber() { + return theSequenceNumber; + } + + /** + * Returns the mosaic site's internal counter entry. This will start at 1 and + * go to 80. + * + * @return A counter number 1 to 80 + */ + public int getVolumeScanNumber() { + return theVolumeScanNumber; + } + + /** + * Returns a Date object which represents the time the scan was done. This + * is for the time of the volume scan only and does not reflect the time of + * the message or the time the product was generated. + * + * @return A Date object for the time of the volume scan + */ + public Calendar getVolumeScanTime() { + return theVolScanTime; + } + + /** + * Returns a Date object which represents the time the product was + * generated. This is for the time of product generation only and does not + * reflect the time of the message or the time the scan was done. + * + * @return A Date object for the time the product was generated + */ + public Calendar getProductGenerationTime() { + return theProdGenTime; + } + + /** + * Returns the entire raw mosaic message. + * + * @return The mosaic message + */ + public byte[] getRawMosaicData() { + return theRawMosaicByteArray; + } + + public static short getProductDependentValue(int value) { + return productDependentValues[value]; + } + + public short[] getProductDependentValue() { + return productDependentValues; + } + + public short getDataLevelThreshold(int code) { + return dataLevelThresholds[code]; + } + private SymbologyBlock readSymbologyBlock(int offset) throws IOException { - - SymbologyBlock symBlock = null; - if (offset != 0) { + + SymbologyBlock symBlock = null; + if (offset != 0) { theMosaicData.reset(); - theMosaicData.skip(offset); + theMosaicData.skip(offset); int divider = theMosaicData.readShort(); int blockId = theMosaicData.readUnsignedShort(); - if ((divider != -1) || (blockId != SymbologyBlock.getBlockId())) { - throw new IOException( - "This does not appear to be a symbology block"); - } + if ((divider != -1) || (blockId != SymbologyBlock.getBlockId())) { + throw new IOException( + "This does not appear to be a symbology block"); + } int blockLen = theMosaicData.readInt(); - byte[] buf = MosaicUtil.subArray(theRawMosaicByteArray, offset, - blockLen); - DataInputStream in = new DataInputStream(new ByteArrayInputStream( - buf)); - - // Skipping the number of layers, layer divider, - // and data layer length + byte[] buf = MosaicUtil.subArray(theRawMosaicByteArray, offset, + blockLen); + DataInputStream in = new DataInputStream(new ByteArrayInputStream( + buf)); + + // Skipping the number of layers, layer divider, + // and data layer length in.skip(8); - symBlock = new SymbologyBlock(in); - } - return symBlock; - } - - /** - * Goes through the mosaic header and reads in all the important fields. - * - * @throws IOException - */ + symBlock = new SymbologyBlock(in); + } + return symBlock; + } + + /** + * Goes through the mosaic header and reads in all the important fields. + * + * @throws IOException + */ private void parseMosaicHeader() throws IOException { - - // Message Header Block + + // Message Header Block theMessageCode = theMosaicData.readUnsignedShort(); - - theMsgTimestamp = Calendar.getInstance(); - theMsgTimestamp.setTimeInMillis(this.createTimestamp(theMosaicData + + theMsgTimestamp = Calendar.getInstance(); + theMsgTimestamp.setTimeInMillis(this.createTimestamp(theMosaicData .readUnsignedShort(), theMosaicData.readInt())); - + theMsgLength = theMosaicData.readInt(); - - // TODO: validate message length here and not everywhere else - + + // TODO: validate message length here and not everywhere else + theSourceId = theMosaicData.readShort(); - + theDestinationId = theMosaicData.readShort(); - + numberOfBlocks = theMosaicData.readShort(); - } - + } + private void parseMosaicMessage() throws IOException { - + // Product Description Block - // skip two bytes for the "BLock Divider" - always equals to -1 + // skip two bytes for the "BLock Divider" - always equals to -1 theMosaicData.skip(2); - - theLatitude = theMosaicData.readInt() * 0.001; + + theLatitude = theMosaicData.readInt() * 0.001; theLongitude = theMosaicData.readInt() * 0.001; - - theHeight = theMosaicData.readShort(); + + theHeight = theMosaicData.readShort(); theProductCode = theMosaicData.readShort(); - - theOperationalMode = theMosaicData.readUnsignedShort(); - theVolumeCoveragePattern = theMosaicData.readUnsignedShort(); - theSequenceNumber = theMosaicData.readShort(); - theVolumeScanNumber = theMosaicData.readUnsignedShort(); - theVolScanTime = Calendar.getInstance(); - theVolScanTime.setTimeInMillis(this.createTimestamp(theMosaicData - .readUnsignedShort(), theMosaicData.readInt())); - theProdGenTime = Calendar.getInstance(); - theProdGenTime.setTimeInMillis(this.createTimestamp(theMosaicData - .readUnsignedShort(), theMosaicData.readInt())); - - productDependentValues = new short[10]; - productDependentValues[0] = theMosaicData.readShort(); + + theOperationalMode = theMosaicData.readUnsignedShort(); + theVolumeCoveragePattern = theMosaicData.readUnsignedShort(); + theSequenceNumber = theMosaicData.readShort(); + theVolumeScanNumber = theMosaicData.readUnsignedShort(); + theVolScanTime = Calendar.getInstance(); + theVolScanTime.setTimeInMillis(this.createTimestamp(theMosaicData + .readUnsignedShort(), theMosaicData.readInt())); + theProdGenTime = Calendar.getInstance(); + theProdGenTime.setTimeInMillis(this.createTimestamp(theMosaicData + .readUnsignedShort(), theMosaicData.readInt())); + + productDependentValues = new short[10]; + productDependentValues[0] = theMosaicData.readShort(); productDependentValues[1] = theMosaicData.readShort(); - - elevationNumber = theMosaicData.readUnsignedShort(); + + elevationNumber = theMosaicData.readUnsignedShort(); productDependentValues[2] = theMosaicData.readShort(); - - dataLevelThresholds = new short[16]; - for (int i = 0; i < dataLevelThresholds.length; i++) { + + dataLevelThresholds = new short[16]; + for (int i = 0; i < dataLevelThresholds.length; i++) { dataLevelThresholds[i] = theMosaicData.readShort(); - } + } maximumDataLevel = theMosaicData.readShort(); - + //for (int i = 3; i < productDependentValues.length; i++) { //In Mosaic, there are only 8 product dependent values - for (int i = 3; i < productDependentValues.length -2; i++) { + for (int i = 3; i < productDependentValues.length -2; i++) { productDependentValues[i] = theMosaicData.readShort(); } - //Use for raster display! + //Use for raster display! numberOfColumns = theMosaicData.readShort(); //Use for raster display! numberOfMaps = theMosaicData.readShort(); - int symbologyBlockOffset = theMosaicData.readInt() * 2; - symbologyBlock = readSymbologyBlock(symbologyBlockOffset); - } - - /** - * Takes the various time and date fields from the mosaic data and creates - * and Date object. - * - * @param aDayCount - * @param aSecondCount - * @return - */ - private long createTimestamp(long aDayCount, long aSecondCount) { - aDayCount--; - long timeStamp = ((aDayCount * 60 * 60 * 24) + aSecondCount) * 1000; - return timeStamp; - } - - /** - * Takes a string from the beginning of the file and determines if the WMO - * header is there. - * - * @param headerInfo - * The string from the beginning of the file that might contain a - * wmo header - * @return The count from the beginning of the file to the actual mosaic data - */ - private int findStartMosaicData(String headerInfo) { - int startOfMosaicData = 0; - Matcher matcher = WMO_PATTERN.matcher(headerInfo); - boolean foundHeader = matcher.find(); - String wmoHeader = ""; + int symbologyBlockOffset = theMosaicData.readInt() * 2; + symbologyBlock = readSymbologyBlock(symbologyBlockOffset); + } + + /** + * Takes the various time and date fields from the mosaic data and creates + * and Date object. + * + * @param aDayCount + * @param aSecondCount + * @return + */ + private long createTimestamp(long aDayCount, long aSecondCount) { + aDayCount--; + long timeStamp = ((aDayCount * 60 * 60 * 24) + aSecondCount) * 1000; + return timeStamp; + } + + /** + * Takes a string from the beginning of the file and determines if the WMO + * header is there. + * + * @param headerInfo + * The string from the beginning of the file that might contain a + * wmo header + * @return The count from the beginning of the file to the actual mosaic data + */ + private int findStartMosaicData(String headerInfo) { + int startOfMosaicData = 0; + Matcher matcher = WMO_PATTERN.matcher(headerInfo); + boolean foundHeader = matcher.find(); + String wmoHeader = ""; String awipsID = ""; - - if (foundHeader) { - wmoHeader = matcher.group(1); - awipsID = matcher.group(2); - startOfMosaicData = matcher.end(); - } - - return startOfMosaicData; - } - - /** - * Checks to see if data at the specified offset of the buffer is the start - * of a compressed block - * - * @param inBuf - * the data buffer - * @param inOff - * the offset into the buffer - * @return true if data is compressed - */ - private boolean isCompressed(byte[] inBuf, int inOff) { - int b0 = inBuf[inOff] & 0xFF; - int b1 = inBuf[inOff + 1] & 0xFF; - if ((b0 & 0xf) == Z_DEFLATED) { - if ((b0 >> 4) + 8 <= DEF_WBITS) { - if ((((b0 << 8) + b1) % 31) == 0) { - return true; - } - } - } - - return false; - } - - /** - * Method to handle compressed mosaic data. If data is not compressed it is - * just copied to the output buffer. - * - * @return The decompressed byte array for the mosaic data - */ - private byte[] decompressMosaic(byte[] inBuf, int offset) { - byte[] outBuf = new byte[4000]; - int inOff = offset; - int outOff = 0; - Inflater decompressor = new Inflater(); + + if (foundHeader) { + wmoHeader = matcher.group(1); + awipsID = matcher.group(2); + startOfMosaicData = matcher.end(); + } + + return startOfMosaicData; + } + + /** + * Checks to see if data at the specified offset of the buffer is the start + * of a compressed block + * + * @param inBuf + * the data buffer + * @param inOff + * the offset into the buffer + * @return true if data is compressed + */ + private boolean isCompressed(byte[] inBuf, int inOff) { + int b0 = inBuf[inOff] & 0xFF; + int b1 = inBuf[inOff + 1] & 0xFF; + if ((b0 & 0xf) == Z_DEFLATED) { + if ((b0 >> 4) + 8 <= DEF_WBITS) { + if ((((b0 << 8) + b1) % 31) == 0) { + return true; + } + } + } + + return false; + } + + /** + * Method to handle compressed mosaic data. If data is not compressed it is + * just copied to the output buffer. + * + * @return The decompressed byte array for the mosaic data + */ + private byte[] decompressMosaic(byte[] inBuf, int offset) { + byte[] outBuf = new byte[4000]; + int inOff = offset; + int outOff = 0; + Inflater decompressor = new Inflater(); int decompressedLen = 0; - - try { - do { - if (inBuf.length - inOff <= 0) { - logger - .error("An error occurred. Apparently, the mosaic product expects more data. Aborting decompress."); - break; - } - - // if compressed then decompress this block - if (isCompressed(inBuf, inOff)) { - decompressor.reset(); - decompressor.setInput(inBuf, inOff, inBuf.length - inOff); - decompressor - .inflate(outBuf, outOff, outBuf.length - outOff); - - inOff += decompressor.getTotalIn(); - outOff += decompressor.getTotalOut(); - - // else just copy the remainder of the data - } else { - int len = inBuf.length - inOff; - len = Math.min(len, outBuf.length - outOff); - System.arraycopy(inBuf, inOff, outBuf, outOff, len); - inOff += len; - outOff += len; - } - - if (decompressedLen == 0) { - decompressedLen = (outBuf[62] << 24 & 0xFF000000) - | (outBuf[63] << 16 & 0x00FF0000) - | (outBuf[64] << 8 & 0x0000FF00) - | (outBuf[65] & 0x000000FF); - - byte[] tmpBuf = outBuf; - outBuf = new byte[decompressedLen]; - outOff = Math.min(decompressedLen, outOff - 54); - System.arraycopy(tmpBuf, 54, outBuf, 0, outOff); - } - - } while (outOff < outBuf.length); - - } catch (DataFormatException e) { - logger - .error("Invalid data format encountered during decompression"); - } finally { - decompressor.end(); - } - - return outBuf; - } - - public int getNumberOfBlocks() { - return numberOfBlocks; - } - - public int getElevationNumber() { - return elevationNumber; - } - - public int getTheSourceId() { - return theSourceId; - } - - public void setTheSourceId(int theSourceId) { - this.theSourceId = theSourceId; - } - - public int getTheDestinationId() { - return theDestinationId; - } - - public void setTheDestinationId(int theDestinationId) { - this.theDestinationId = theDestinationId; - } - - public SymbologyBlock getSymbologyBlock() { - return symbologyBlock; + + try { + do { + if (inBuf.length - inOff <= 0) { + logger + .error("An error occurred. Apparently, the mosaic product expects more data. Aborting decompress."); + break; + } + + // if compressed then decompress this block + if (isCompressed(inBuf, inOff)) { + decompressor.reset(); + decompressor.setInput(inBuf, inOff, inBuf.length - inOff); + decompressor + .inflate(outBuf, outOff, outBuf.length - outOff); + + inOff += decompressor.getTotalIn(); + outOff += decompressor.getTotalOut(); + + // else just copy the remainder of the data + } else { + int len = inBuf.length - inOff; + len = Math.min(len, outBuf.length - outOff); + System.arraycopy(inBuf, inOff, outBuf, outOff, len); + inOff += len; + outOff += len; + } + + if (decompressedLen == 0) { + decompressedLen = (outBuf[62] << 24 & 0xFF000000) + | (outBuf[63] << 16 & 0x00FF0000) + | (outBuf[64] << 8 & 0x0000FF00) + | (outBuf[65] & 0x000000FF); + + byte[] tmpBuf = outBuf; + outBuf = new byte[decompressedLen]; + outOff = Math.min(decompressedLen, outOff - 54); + System.arraycopy(tmpBuf, 54, outBuf, 0, outOff); + } + + } while (outOff < outBuf.length); + + } catch (DataFormatException e) { + logger + .error("Invalid data format encountered during decompression"); + } finally { + decompressor.end(); + } + + return outBuf; + } + + public int getNumberOfBlocks() { + return numberOfBlocks; + } + + public int getElevationNumber() { + return elevationNumber; + } + + public int getTheSourceId() { + return theSourceId; + } + + public void setTheSourceId(int theSourceId) { + this.theSourceId = theSourceId; + } + + public int getTheDestinationId() { + return theDestinationId; + } + + public void setTheDestinationId(int theDestinationId) { + this.theDestinationId = theDestinationId; + } + + public SymbologyBlock getSymbologyBlock() { + return symbologyBlock; } public int getMaximumDataLevel() { @@ -625,6 +625,6 @@ public class Level3Parser { @SuppressWarnings("static-access") public void setNumberOfColumns(int numberOfColumns) { this.numberOfColumns = numberOfColumns; - } - -} + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyBlock.java b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyBlock.java index 55782faa69..0ef60ba2fc 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyBlock.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyBlock.java @@ -1,14 +1,14 @@ -package gov.noaa.nws.ncep.edex.plugin.mosaic.util.level3; - -import java.io.DataInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +package gov.noaa.nws.ncep.edex.plugin.mosaic.util.level3; + +import java.io.DataInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; /** * SymbologyBlock creates an object that will allow the iteration over 1 to 15 @@ -22,160 +22,160 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * This code has been developed by the SIB for use in the AWIPS2 system. * @author L. Lin * @version 1.0 - */ - -@DynamicSerialize -public class SymbologyBlock extends AbstractBlock implements - ISerializableObject { - - private static final int BLOCK_ID = 1; - - public static int getBlockId() { - return BLOCK_ID; - } - - @DynamicSerializeElement - private Layer[] layers; - - /** - * @param in - * @throws IOException - */ - public SymbologyBlock(DataInputStream in) throws IOException { - super(in); - } - - public SymbologyBlock() { - - } - - /** - * @return the layers - */ - public Layer[] getLayers() { - return layers; - } - - /** - * @param layers - * the layers to set - */ - public void setLayers(Layer[] layers) { - this.layers = layers; - } - - /** - * Parses the symbology block header for all the important information. - * - * @throws IOException - */ - @Override + */ + +@DynamicSerialize +public class SymbologyBlock extends AbstractBlock implements + ISerializableObject { + + private static final int BLOCK_ID = 1; + + public static int getBlockId() { + return BLOCK_ID; + } + + @DynamicSerializeElement + private Layer[] layers; + + /** + * @param in + * @throws IOException + */ + public SymbologyBlock(DataInputStream in) throws IOException { + super(in); + } + + public SymbologyBlock() { + + } + + /** + * @return the layers + */ + public Layer[] getLayers() { + return layers; + } + + /** + * @param layers + * the layers to set + */ + public void setLayers(Layer[] layers) { + this.layers = layers; + } + + /** + * Parses the symbology block header for all the important information. + * + * @throws IOException + */ + @Override protected void init(DataInputStream in) throws IOException { - //numLayers starts at 65th half-word + //numLayers starts at 65th half-word int numLayers = in.readShort(); - List layerList = new ArrayList(); - + List layerList = new ArrayList(); + in.skip(2); // skip first layer divider - NEXT_LAYER: for (int i = 0; i < 1; i++) { - Layer layer = new Layer(); - layer.setLayerId(i); + NEXT_LAYER: for (int i = 0; i < 1; i++) { + Layer layer = new Layer(); + layer.setLayerId(i); List packet = new ArrayList(); int layerSize = in.readInt(); - in.mark(layerSize); - - int packetId; + in.mark(layerSize); + + int packetId; do { - //Raster Opcode at 69th half-word - packetId is the Opcode + //Raster Opcode at 69th half-word - packetId is the Opcode packetId = in.readUnsignedShort(); - if (packetId == 0xFFFF || packetId == 0x0000) { - break; // found layer divider break out of packet loop + if (packetId == 0xFFFF || packetId == 0x0000) { + break; // found layer divider break out of packet loop } - - SymbologyPacket symPacket = PacketFactory.createPacket( - packetId, in); - + + SymbologyPacket symPacket = PacketFactory.createPacket( + packetId, in); + if (symPacket != null) { - packet.add(symPacket); - } else { - in.reset(); - in.skip(layerSize); - if (in.available() >= 2) { - in.skip(2); // skip next layer divider - } - continue NEXT_LAYER; - } + packet.add(symPacket); + } else { + in.reset(); + in.skip(layerSize); + if (in.available() >= 2) { + in.skip(2); // skip next layer divider + } + continue NEXT_LAYER; + } } while (in.available() >= 2); - - layer.setPackets(packet.toArray(new SymbologyPacket[packet - .size()])); - layerList.add(layer); - } - - this.layers = layerList.toArray(new Layer[layerList.size()]); - } - - /** - * This method will return an object representing the layer number passed - * in. This method will examine the layer and create and instance of its - * actual type (i.e. Radial) and return that layer.
    - *
    - * Important Presently, only radial data is supported. All others - * will return null. - * - * @return An object for that layer - * @throws IOException - */ - public SymbologyPacket getSymbologyLayerContent(int layerNumber) - throws IOException { - SymbologyPacket symLayer = null; - return symLayer; - } - - /** - * Returns the number of symbology layers contained with the block. Most - * likely, this will be 1, but in case a file contains more, they can be - * iterated through. - * - * @return An integer of the number of layers, 1 to 15 - */ - public int getNumLayers() { - if (layers != null) { - return layers.length; - } - return 0; - } - - public int getNumPackets(int l) { - if (layers != null) { - SymbologyPacket[] layer = layers[l].packets; - if (layer != null) { - return layer.length; - } - } - return 0; - } - - public SymbologyPacket[] getPackets(int layer) { - return layers[layer].packets; - } - - public SymbologyPacket getPacket(int layer, int packet) { - return layers[layer].packets[packet]; - } - - @Override - public String toString() { - String s = ""; - if (layers != null) { - for (int l = 0; l < layers.length; l++) { - s += "\nLayer " + (l + 1); - for (SymbologyPacket packet : layers[l].packets) { - s += "\n" + packet; - } - } - } - return s; - } - -} + + layer.setPackets(packet.toArray(new SymbologyPacket[packet + .size()])); + layerList.add(layer); + } + + this.layers = layerList.toArray(new Layer[layerList.size()]); + } + + /** + * This method will return an object representing the layer number passed + * in. This method will examine the layer and create and instance of its + * actual type (i.e. Radial) and return that layer.
    + *
    + * Important Presently, only radial data is supported. All others + * will return null. + * + * @return An object for that layer + * @throws IOException + */ + public SymbologyPacket getSymbologyLayerContent(int layerNumber) + throws IOException { + SymbologyPacket symLayer = null; + return symLayer; + } + + /** + * Returns the number of symbology layers contained with the block. Most + * likely, this will be 1, but in case a file contains more, they can be + * iterated through. + * + * @return An integer of the number of layers, 1 to 15 + */ + public int getNumLayers() { + if (layers != null) { + return layers.length; + } + return 0; + } + + public int getNumPackets(int l) { + if (layers != null) { + SymbologyPacket[] layer = layers[l].packets; + if (layer != null) { + return layer.length; + } + } + return 0; + } + + public SymbologyPacket[] getPackets(int layer) { + return layers[layer].packets; + } + + public SymbologyPacket getPacket(int layer, int packet) { + return layers[layer].packets[packet]; + } + + @Override + public String toString() { + String s = ""; + if (layers != null) { + for (int l = 0; l < layers.length; l++) { + s += "\nLayer " + (l + 1); + for (SymbologyPacket packet : layers[l].packets) { + s += "\n" + packet; + } + } + } + return s; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyPacket.java b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyPacket.java index 0e141a523e..e9b9a65959 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyPacket.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/level3/SymbologyPacket.java @@ -1,10 +1,10 @@ -package gov.noaa.nws.ncep.edex.plugin.mosaic.util.level3; - -import java.io.DataInputStream; -import java.io.IOException; - -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +package gov.noaa.nws.ncep.edex.plugin.mosaic.util.level3; + +import java.io.DataInputStream; +import java.io.IOException; + +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; /** * Abstract class that defines the binary values for the various symbology @@ -18,43 +18,43 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * This code has been developed by the SIB for use in the AWIPS2 system. * @author L. Lin * @version 1.0 - */ - -public abstract class SymbologyPacket { - - @DynamicSerializeElement - protected int packetId; - - public SymbologyPacket(int packetId, DataInputStream in) throws IOException { - this.packetId = packetId; - init(in); - } - - protected SymbologyPacket() { - - } - - protected abstract void init(DataInputStream in) throws IOException; - - /** - * @return the packetId - */ - public int getPacketId() { - return packetId; - } - - /** - * @param packetId - * the packetId to set - */ - public void setPacketId(int packetId) { - this.packetId = packetId; - } - - @Override - public String toString() { - String s = String.format("\tPacket ID: 0x%04X", packetId); - return s; - } - -} + */ + +public abstract class SymbologyPacket { + + @DynamicSerializeElement + protected int packetId; + + public SymbologyPacket(int packetId, DataInputStream in) throws IOException { + this.packetId = packetId; + init(in); + } + + protected SymbologyPacket() { + + } + + protected abstract void init(DataInputStream in) throws IOException; + + /** + * @return the packetId + */ + public int getPacketId() { + return packetId; + } + + /** + * @param packetId + * the packetId to set + */ + public void setPacketId(int packetId) { + this.packetId = packetId; + } + + @Override + public String toString() { + String s = String.format("\tPacket ID: 0x%04X", packetId); + return s; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/package-info.java index fa41f0fba5..f45b2ee224 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.mosaic/src/gov/noaa/nws/ncep/edex/plugin/mosaic/util/package-info.java @@ -1,4 +1,4 @@ -/** - * Contains utility classes for the mosaic plugin. - */ -package gov.noaa.nws.ncep.edex.plugin.mosaic.util; +/** + * Contains utility classes for the mosaic plugin. + */ +package gov.noaa.nws.ncep.edex.plugin.mosaic.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject new file mode 100644 index 0000000000..c865cb3c8c --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -0,0 +1 @@ +gov.noaa.nws.ncep.common.dataplugin.ncairep.NcAirepRecord \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/gov.noaa.nws.ncep.edex.plugin.ncairep.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/gov.noaa.nws.ncep.edex.plugin.ncairep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepDecoder.java index d6300210d0..a79f0c4912 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepDecoder.java @@ -1,161 +1,161 @@ /** * This software was modified from Raytheon's airep plugin by * NOAA/NWS/NCEP/NCO to order to output point data in HDF5. - **/ -package gov.noaa.nws.ncep.edex.plugin.ncairep; - -import java.util.Calendar; -import java.util.Map; + **/ +package gov.noaa.nws.ncep.edex.plugin.ncairep; -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 java.util.Calendar; +import java.util.Map; + +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.pointdata.spatial.AircraftObsLocation; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.edex.decodertools.time.TimeTools; -import com.raytheon.uf.edex.wmo.message.WMOHeader; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.decodertools.time.TimeTools; +import com.raytheon.uf.edex.wmo.message.WMOHeader; import gov.noaa.nws.ncep.common.dataplugin.ncairep.NcAirepRecord; import gov.noaa.nws.ncep.edex.plugin.ncairep.decoder.NcAIREPWeather; import gov.noaa.nws.ncep.edex.plugin.ncairep.decoder.NcAirepParser; - -/** - * Decoder strategy for Aicraft Report (AIREP) observation data. Most common - * usage is as follows. - * NcAIREPDecoder dec = new NcAIREPDecoder(); - * dec.setMessage(messageData); - * while(dec.hasNext()) - * { - * PluginDataObject r = dec.decode(); - * // do something with record. - * } - * - * - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    +
    +/**
    + * Decoder strategy for Aicraft Report (AIREP) observation data. Most common
    + * usage is as follows. 
    + *   NcAIREPDecoder dec = new NcAIREPDecoder();
    + *   dec.setMessage(messageData);
    + *   while(dec.hasNext())
    + *   {
    + *      PluginDataObject r = dec.decode();
    + *      // do something with record.
    + *   }
    + * 
    + * 
    + * 
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
      * 04/27/2011              F.J.Yen       Initial creation from airep.
    - * 09/19/2011    286       Q.Zhou      Modified populateRecord to add 8 new fields for TB, IC and SK.
    - * 
    - * - * @author F. J. Yen - * @version 1.0 - */ -public class NcAirepDecoder extends AbstractDecoder { - // Name of the plugin controlling this decoder. - private final String PLUGIN_NAME; - - public static class NcAirepDecoderInput { - public WMOHeader wmoHeader; - - public String report; - } - - /** - * @param pluginName - * Name that identifies this decoder. - * @throws DecoderException - */ - public NcAirepDecoder(String pluginName) throws DecoderException { - PLUGIN_NAME = pluginName; - } - - /** - * Get the next decoded data record. - * - * @param input - * the decoder input - * @return One record of decoded data. - * @throws DecoderException - * Thrown if no data is available. - */ - public PluginDataObject[] decode(NcAirepDecoderInput input) + * 09/19/2011 286 Q.Zhou Modified populateRecord to add 8 new fields for TB, IC and SK. + *
    + * + * @author F. J. Yen + * @version 1.0 + */ +public class NcAirepDecoder extends AbstractDecoder { + // Name of the plugin controlling this decoder. + private final String PLUGIN_NAME; + + public static class NcAirepDecoderInput { + public WMOHeader wmoHeader; + + public String report; + } + + /** + * @param pluginName + * Name that identifies this decoder. + * @throws DecoderException + */ + public NcAirepDecoder(String pluginName) throws DecoderException { + PLUGIN_NAME = pluginName; + } + + /** + * Get the next decoded data record. + * + * @param input + * the decoder input + * @return One record of decoded data. + * @throws DecoderException + * Thrown if no data is available. + */ + public PluginDataObject[] decode(NcAirepDecoderInput input) throws DecoderException { - - PluginDataObject[] reports = null; - - NcAirepRecord report = null; + + PluginDataObject[] reports = null; + + NcAirepRecord report = null; String traceId = null; System.out.println("====" +new String(input.report)); //input.report ); - - try { - // traceId = getTraceId(hdrMap); - logger.debug(traceId + "- NcAirepDecoder.decode()"); + + try { + // traceId = getTraceId(hdrMap); + logger.debug(traceId + "- NcAirepDecoder.decode()"); report = populateRecord(new NcAirepParser(input.report)); - - if (report != null) { - report.setTraceId(traceId); + + if (report != null) { + report.setTraceId(traceId); report.setPluginName(PLUGIN_NAME); - - try { - report.constructDataURI(); - } catch (PluginException e) { - throw new DecoderException("Error constructing dataURI", e); + + try { + report.constructDataURI(); + } catch (PluginException e) { + throw new DecoderException("Error constructing dataURI", e); } - - reports = new PluginDataObject[] { report }; - } - - } catch (Exception e) { - logger.error(traceId + "- Error in NcAirepDecoder", e); - } finally { - if (reports == null) { - reports = new PluginDataObject[0]; - } + + reports = new PluginDataObject[] { report }; + } + + } catch (Exception e) { + logger.error(traceId + "- Error in NcAirepDecoder", e); + } finally { + if (reports == null) { + reports = new PluginDataObject[0]; + } } - - return reports; - - } - - /** - * @param parser - * The reccon parser that contains the decoded data. - * @return The populated record. - */ - private NcAirepRecord populateRecord(NcAirepParser parser) { - - NcAirepRecord record = null; + + return reports; + + } + + /** + * @param parser + * The reccon parser that contains the decoded data. + * @return The populated record. + */ + private NcAirepRecord populateRecord(NcAirepParser parser) { + + NcAirepRecord record = null; AircraftObsLocation location = null; - - if (parser != null) { - // If there is no obstime, don't bother going further. + + if (parser != null) { + // If there is no obstime, don't bother going further. Calendar oTime = parser.getObservationTime(); - + if (oTime != null) { - - record = new NcAirepRecord(); - location = new AircraftObsLocation(); - - record.setTimeObs(oTime); - record.setRefHour(TimeTools.copyToNearestHour(oTime)); - DataTime dataTime = new DataTime(oTime); - record.setDataTime(dataTime); - - record.setReportData(parser.getReportData()); - location.setStationId(parser.getAircraftId()); - record.setReportType(parser.getReportType()); - location.setLatitude(parser.getLatitude()); - location.setLongitude(parser.getLongitude()); - location.setFlightLevel(parser.getFlightLevel()); - location.setLocation(parser.getLatitude(), parser - .getLongitude()); + + record = new NcAirepRecord(); + location = new AircraftObsLocation(); + + record.setTimeObs(oTime); + record.setRefHour(TimeTools.copyToNearestHour(oTime)); + DataTime dataTime = new DataTime(oTime); + record.setDataTime(dataTime); + + record.setReportData(parser.getReportData()); + location.setStationId(parser.getAircraftId()); + record.setReportType(parser.getReportType()); + location.setLatitude(parser.getLatitude()); + location.setLongitude(parser.getLongitude()); + location.setFlightLevel(parser.getFlightLevel()); + location.setLocation(parser.getLatitude(), parser + .getLongitude()); record.setTemp(parser.getTemperature()); record.setWindDirection(parser.getWindDirection()); - record.setWindSpeed(parser.getWindSpeed()); - record.setLocation(location); - - NcAIREPWeather wx = parser.getWeatherGroup(); - if (wx != null) { - record.setFlightConditions(wx.getFlightConditions()); - record.setFlightHazard(wx.getHazard()); - record.setFlightWeather(wx.getWeather()); + record.setWindSpeed(parser.getWindSpeed()); + record.setLocation(location); + + NcAIREPWeather wx = parser.getWeatherGroup(); + if (wx != null) { + record.setFlightConditions(wx.getFlightConditions()); + record.setFlightHazard(wx.getHazard()); + record.setFlightWeather(wx.getWeather()); } //record.setWeatherCondition(parser.getWeatherCondition()); @@ -168,26 +168,26 @@ public class NcAirepDecoder extends AbstractDecoder { record.setSkyBaseHeight(parser.getSkyBaseHeight()); record.setSkyTopHeight(parser.getSkyTopHeight()); record.setSuspectTimeFlag(parser.getSuspectTimeFlag()); - - } - } - return record; - } - - /** - * - * @param hdrMap - * @return - */ - String getTraceId(Map hdrMap) { - String traceId = null; - if (hdrMap != null) { - Object o = hdrMap.get("CamelFileName"); - if (o != null) { - traceId = (String) o; - } - } - return traceId; - } - -} + + } + } + return record; + } + + /** + * + * @param hdrMap + * @return + */ + String getTraceId(Map hdrMap) { + String traceId = null; + if (hdrMap != null) { + Object o = hdrMap.get("CamelFileName"); + if (o != null) { + traceId = (String) o; + } + } + return traceId; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepSeparator.java index f5b9369236..3cae3698a3 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/NcAirepSeparator.java @@ -1,149 +1,149 @@ /** * This software was modified from Raytheon's airep plugin by * NOAA/NWS/NCEP/NCO to order to output point data in HDF5. - **/ -package gov.noaa.nws.ncep.edex.plugin.ncairep; - + **/ +package gov.noaa.nws.ncep.edex.plugin.ncairep; + import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import com.raytheon.edex.esb.Headers; import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.uf.edex.wmo.message.WMOHeader; +import com.raytheon.uf.edex.wmo.message.WMOHeader; import gov.noaa.nws.ncep.edex.plugin.ncairep.NcAirepDecoder.NcAirepDecoderInput; - -/** - * The NcAirepSeparator takes a potential weather message and attempts to - * determine the WMO header and data type of the enclosed data. Normal usage is - * to create an instance and set the message data using the setData method. When - * complete the separator contains the WMO header, the message data with all - * leading data up to and including the WMO header removed. In addition all - * extraneous spaces and carriage control has been removed. The message reports - * are available using hasNext to determine if data is available, and the - * getRecord method to retrieve the actual report data. Note that this separator - * implementation should not be used on mixed text/binary weather messages. - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    +
    +/**
    + * The NcAirepSeparator takes a potential weather message and attempts to
    + * determine the WMO header and data type of the enclosed data. Normal usage is
    + * to create an instance and set the message data using the setData method. When
    + * complete the separator contains the WMO header, the message data with all
    + * leading data up to and including the WMO header removed. In addition all
    + * extraneous spaces and carriage control has been removed. The message reports
    + * are available using hasNext to determine if data is available, and the
    + * getRecord method to retrieve the actual report data. Note that this separator
    + * implementation should not be used on mixed text/binary weather messages.
    + * 
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
      * 04/27/2011              F.J.Yen       Initial creation from airep.
      * 09/19/2011    286       Q.Zhou      Put new regex pattern. Separate message according to new patterns.
      * 									   Modified separate(), separateNcAIREP() and separateARPARS().
      * 									   Added addDayInTime(). 
      * 									   Removed DecoderTools.cleanData(), stripHeader().
      * 									   Handle amdar in the airep separator.		
    - * 10/04/2011    286       Q.Zhou      Move addDayInTime() to the parser	
    - * 
    - * - * @author F. J. Yen - * @version 1.0 - */ -public class NcAirepSeparator extends AbstractRecordSeparator { - /** The logger */ - private Log logger = LogFactory.getLog(getClass()); - -// private static final String SPLITCHARS = "[=;$][^\\r\\n]*[\\r\\n]+"; -// private static final String AIREP_HDR = "AIREP[\\r\\n]+"; + * 10/04/2011 286 Q.Zhou Move addDayInTime() to the parser + *
    + * + * @author F. J. Yen + * @version 1.0 + */ +public class NcAirepSeparator extends AbstractRecordSeparator { + /** The logger */ + private Log logger = LogFactory.getLog(getClass()); + +// private static final String SPLITCHARS = "[=;$][^\\r\\n]*[\\r\\n]+"; +// private static final String AIREP_HDR = "AIREP[\\r\\n]+"; private static final String SPLITMSG = "\\r\\n\\x03"; // \\x03 - private static final String AIREP_MSG_LINE = "(ARP|ARS)"; + private static final String AIREP_MSG_LINE = "(ARP|ARS)"; private static final String HEADER_TIME = "[0-9]{6}"; - - private WMOHeader wmoHeader = null; - - private byte[] messageData = null; - - private List reports = null; - - private int currentReport = -1; - + + private WMOHeader wmoHeader = null; + + private byte[] messageData = null; + + private List reports = null; + + private int currentReport = -1; + public static NcAirepSeparator separate(byte[] data, Headers headers) { - NcAirepSeparator ncAirepSeparator = new NcAirepSeparator(); - ncAirepSeparator.setData(data, headers); - return ncAirepSeparator; - } - - /** - * Get the next record. This implementation returns the record as a String. - * - * @return The next observation record as a String. - */ - public NcAirepDecoderInput next() { - NcAirepDecoderInput data = null; - if (hasNext()) { - data = new NcAirepDecoderInput(); - data.report = reports.get(currentReport++); - data.wmoHeader = wmoHeader; - } - return data; - } - - /** - * Is there another record available? - * - * @return Is there another record available? - */ - @Override - public boolean hasNext() { - return ((reports != null) && (reports.size() > 0) && (currentReport < reports - .size())); - } - - /** - * Set the raw message data and invoke the internal message separation - * process. - * - * @param rawMessage - * The raw weather text message. - */ - @Override - public void setData(byte[] rawMessage, Headers headers) { - currentReport = -1; + NcAirepSeparator ncAirepSeparator = new NcAirepSeparator(); + ncAirepSeparator.setData(data, headers); + return ncAirepSeparator; + } + + /** + * Get the next record. This implementation returns the record as a String. + * + * @return The next observation record as a String. + */ + public NcAirepDecoderInput next() { + NcAirepDecoderInput data = null; + if (hasNext()) { + data = new NcAirepDecoderInput(); + data.report = reports.get(currentReport++); + data.wmoHeader = wmoHeader; + } + return data; + } + + /** + * Is there another record available? + * + * @return Is there another record available? + */ + @Override + public boolean hasNext() { + return ((reports != null) && (reports.size() > 0) && (currentReport < reports + .size())); + } + + /** + * Set the raw message data and invoke the internal message separation + * process. + * + * @param rawMessage + * The raw weather text message. + */ + @Override + public void setData(byte[] rawMessage, Headers headers) { + currentReport = -1; reports = null; - //rawMessage = DecoderTools.cleanData(rawMessage); - if (rawMessage != null) { - wmoHeader = new WMOHeader(rawMessage); + //rawMessage = DecoderTools.cleanData(rawMessage); + if (rawMessage != null) { + wmoHeader = new WMOHeader(rawMessage); if (wmoHeader.isValid()) { - //messageData = DecoderTools.stripWMOHeader(rawMessage, IDecoderConstants.WMO_HEADER); - - separate(new String(rawMessage)); - } - } - - if ((reports != null) && (reports.size() > 0)) { - currentReport = 0; - } else { - logger.info("No reports found in data"); - } - } - - /** - * Get the message data. - * - * @return The cleaned message data. - */ - public byte[] getMessage() { - return messageData; - } - - /** - * Get the WMO header associated with the message data. - * - * @return The WMO header. - */ - public WMOHeader getWmoHeader() { - return wmoHeader; - } - - private void separate(String message) { + //messageData = DecoderTools.stripWMOHeader(rawMessage, IDecoderConstants.WMO_HEADER); + + separate(new String(rawMessage)); + } + } + + if ((reports != null) && (reports.size() > 0)) { + currentReport = 0; + } else { + logger.info("No reports found in data"); + } + } + + /** + * Get the message data. + * + * @return The cleaned message data. + */ + public byte[] getMessage() { + return messageData; + } + + /** + * Get the WMO header associated with the message data. + * + * @return The WMO header. + */ + public WMOHeader getWmoHeader() { + return wmoHeader; + } + + private void separate(String message) { reports = new ArrayList(); int start = 0; @@ -166,27 +166,27 @@ public class NcAirepSeparator extends AbstractRecordSeparator { separateARPARS(subMsg); //amdar also goes to here } start = matcher.end(); - } - } - - /** + } + } + + /** * Separate amdar data that comes in with AMDAR header line. * 097 ^M * UDAS02 BABJ 190113^M * AMDAR 1901^M - * LVR CNFNXL 3315N 11850E 190113 F226 MS123 278/038 TB/ S//1=^M - */ + * LVR CNFNXL 3315N 11850E 190113 F226 MS123 278/038 TB/ S//1=^M + */ private void separateNcAMDAR(String message) { // find header time. Later append it to observation String headerTime = findHeaderTime(message); - // find body msg - Pattern pattern = Pattern.compile("="); - Matcher matcher = pattern.matcher(message); - - int start = 0; - int stop = message.length(); - while (matcher.find()) { + // find body msg + Pattern pattern = Pattern.compile("="); + Matcher matcher = pattern.matcher(message); + + int start = 0; + int stop = message.length(); + while (matcher.find()) { stop = matcher.start() + 1; String observation = message.substring(start, stop); @@ -195,12 +195,12 @@ public class NcAirepSeparator extends AbstractRecordSeparator { int iAir = observation.indexOf("AMDAR"); observation = observation.substring(iAir + 10); } - + reports.add( headerTime + " AMDAR " +observation); - - start = matcher.end(); - } - } + + start = matcher.end(); + } + } /** * Separate airep data that comes in with AIREP header line. @@ -234,41 +234,41 @@ public class NcAirepSeparator extends AbstractRecordSeparator { start = matcher.end(); } } - - /** - * Separate airep data that does not have the AIREP header line. This data + + /** + * Separate airep data that does not have the AIREP header line. This data * is checked to ensure that it contains ARP/ARS report start data. * The ending of the ARP/ARS report could be "=", or only has one ARP/ARS report. * 706 ^M * UAPA01 KWBC 200000^M - * ARP UAL559 3401N 13421W 2351 F360 MS52 260/025KT= - */ - private void separateARPARS(String message) { + * ARP UAL559 3401N 13421W 2351 F360 MS52 260/025KT= + */ + private void separateARPARS(String message) { // find header time. Later append it to observation String headerTime = findHeaderTime(message); // find body msg - ArrayList bodyRecords = new ArrayList(); - Pattern pattern = Pattern.compile(AIREP_MSG_LINE); - Matcher matcher = pattern.matcher(message); + ArrayList bodyRecords = new ArrayList(); + Pattern pattern = Pattern.compile(AIREP_MSG_LINE); + Matcher matcher = pattern.matcher(message); - while (matcher.find()) { - bodyRecords.add(matcher.start()); - } - - for (int i = 0; i < bodyRecords.size(); i++) { - String observation = null; - if (i < bodyRecords.size() - 1) { - observation = message.substring(bodyRecords.get(i), - bodyRecords.get(i + 1)).trim(); - } else { - observation = message.substring(bodyRecords.get(i)).trim(); + while (matcher.find()) { + bodyRecords.add(matcher.start()); + } + + for (int i = 0; i < bodyRecords.size(); i++) { + String observation = null; + if (i < bodyRecords.size() - 1) { + observation = message.substring(bodyRecords.get(i), + bodyRecords.get(i + 1)).trim(); + } else { + observation = message.substring(bodyRecords.get(i)).trim(); } - - reports.add( headerTime +" " +observation); - } - bodyRecords = null; - } + + reports.add( headerTime +" " +observation); + } + bodyRecords = null; + } /* * find header time for each report @@ -284,6 +284,6 @@ public class NcAirepSeparator extends AbstractRecordSeparator { return headerTime; } - -} + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPObsType.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPObsType.java index 57fbbe894e..1f3c135e06 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPObsType.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPObsType.java @@ -1,66 +1,66 @@ /** * This software was modified from Raytheon's airep plugin by * NOAA/NWS/NCEP/NCO to order to output point data in HDF5. - **/ -package gov.noaa.nws.ncep.edex.plugin.ncairep.decoder; - -import java.util.HashMap; - -import com.raytheon.uf.edex.decodertools.core.IDecoderConstants; - -/** - * TODO Change this to a Java 1.5 enum. - * - *
    - * SOFTWARE HISTORY
    - * Date           PTR#     Engineer      Description
    - * ------------   -------- ------------- -------------------------------------
    - * 04/27/2011              F. J. Yen     Initial creation from airep
    - * 
    - */ -public class NcAIREPObsType -{ - private static final HashMap AIREP_TYPES = - new HashMap(); - static { - AIREP_TYPES.put("ARP",IDecoderConstants.AIREP_NORMAL); - AIREP_TYPES.put("AIREP",IDecoderConstants.AIREP_NORMAL); - AIREP_TYPES.put("ARS",IDecoderConstants.AIREP_SPECIAL); - } - - private final String obsType; - - /** - * - * @param aType - */ - private NcAIREPObsType(String aType) { - obsType = aType; - } // NcAIREPObsType() - - /** - * - * @param anObsType - * @return - */ - public static NcAIREPObsType obsTypeFactory(String anObsType) { - NcAIREPObsType obsTypeInstance = null; - - if(AIREP_TYPES.containsKey(anObsType)) { - obsTypeInstance = new NcAIREPObsType(anObsType); - } - return obsTypeInstance; - } // obsTypeFactory() - - /** - * - * @return - */ - public Integer getValue() { - return AIREP_TYPES.get(obsType); - } // getValue() - - public String getType() { - return obsType; - } -} + **/ +package gov.noaa.nws.ncep.edex.plugin.ncairep.decoder; + +import java.util.HashMap; + +import com.raytheon.uf.edex.decodertools.core.IDecoderConstants; + +/** + * TODO Change this to a Java 1.5 enum. + * + *
    + * SOFTWARE HISTORY
    + * Date           PTR#     Engineer      Description
    + * ------------   -------- ------------- -------------------------------------
    + * 04/27/2011              F. J. Yen     Initial creation from airep
    + * 
    + */ +public class NcAIREPObsType +{ + private static final HashMap AIREP_TYPES = + new HashMap(); + static { + AIREP_TYPES.put("ARP",IDecoderConstants.AIREP_NORMAL); + AIREP_TYPES.put("AIREP",IDecoderConstants.AIREP_NORMAL); + AIREP_TYPES.put("ARS",IDecoderConstants.AIREP_SPECIAL); + } + + private final String obsType; + + /** + * + * @param aType + */ + private NcAIREPObsType(String aType) { + obsType = aType; + } // NcAIREPObsType() + + /** + * + * @param anObsType + * @return + */ + public static NcAIREPObsType obsTypeFactory(String anObsType) { + NcAIREPObsType obsTypeInstance = null; + + if(AIREP_TYPES.containsKey(anObsType)) { + obsTypeInstance = new NcAIREPObsType(anObsType); + } + return obsTypeInstance; + } // obsTypeFactory() + + /** + * + * @return + */ + public Integer getValue() { + return AIREP_TYPES.get(obsType); + } // getValue() + + public String getType() { + return obsType; + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPWeather.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPWeather.java index b9a9e55762..72fc3e79c4 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPWeather.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAIREPWeather.java @@ -1,143 +1,143 @@ /** * This software was modified from Raytheon's airep plugin by * NOAA/NWS/NCEP/NCO to order to output point data in HDF5. - **/ -package gov.noaa.nws.ncep.edex.plugin.ncairep.decoder; + **/ +package gov.noaa.nws.ncep.edex.plugin.ncairep.decoder; import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -/*a - * TODO Enter a description here. - * - *
    - * SOFTWARE HISTORY
    - * Date           PTR#     Engineer      Description
    +
    +/*a
    + * TODO Enter a description here.
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * Date           PTR#     Engineer      Description
      * ------------   -------- ------------- -------------------------------------
    - * 04/27/2011              F.J.Yen       Initial creation from airep.
    + * 04/27/2011              F.J.Yen       Initial creation from airep.
      * 
    * * * @author F. J. Yen - * @version 1.0 - */ -public class NcAIREPWeather -{ - private static final String VALID_CHARS = "/0123456789"; - private static final int WX_LENGTH = 3; - - private static final int WX_HAZARD = 0; - private static final int WX_WEATHER = 1; + * @version 1.0 + */ +public class NcAIREPWeather +{ + private static final String VALID_CHARS = "/0123456789"; + private static final int WX_LENGTH = 3; + + private static final int WX_HAZARD = 0; + private static final int WX_WEATHER = 1; private static final int WX_FLIGHT = 2; - private static final int IMISSD = IDecoderConstantsN.INTEGER_MISSING; - - private final String theRawData; - - // Decoded flight hazards - See table 3.3 + private static final int IMISSD = IDecoderConstantsN.INTEGER_MISSING; + + private final String theRawData; + + // Decoded flight hazards - See table 3.3 // private Integer theHazard = null; - private Integer theHazard = IMISSD; + private Integer theHazard = IMISSD; // private Integer theWeather = null; - private Integer theWeather = IMISSD; + private Integer theWeather = IMISSD; // private Integer theFlightConditions = null; - private Integer theFlightConditions = IMISSD; - - /** - * - * @param aType - */ - public NcAIREPWeather(String aWeatherGroup) - { - theRawData = aWeatherGroup; - decodeElement(); - } // NcAIREPWeather() - - public Integer getHazard() - { - return theHazard; - } // getHazard() - - public Integer getWeather() - { - return theWeather; - } // getWeather() - - public Integer getFlightConditions() - { - return theFlightConditions; - } // getFlightConditions() - - - //*********************************************** - // Table 3.3. AIREP Hazards (H). - // Code Figure Explanation - // 0 None - // 1 Light Turbulence - // 2 Moderate Turbulence - // 3 Severe Turbulence - // 4 Extreme Turbulence - // 5 Trace of Icing - // 6 Light Icing - // 7 Moderate Icing - // 8 Severe Icing - // 9 Hail - // - // Table 3.4. AIREP Weather (W). - // Code Figure Explanation - // 0 Clear - // 1 Scattered Clouds - // 2 Broken Clouds - // 3 Continuous Layers - // 4 Lightning - // 5 Drizzle - // 6 Continuous Rain - // 7 Continuous Snow - // 8 Rain or Snow Showers - // 9 Thunderstorms - // - // - // Table 3.5. AIREP Flight Conditions (FC). - // Code Figure Explanation - // 0 Clear - // 1 Above Clouds (tops less than 10,000 ft) - // 2 Above Clouds (tops 10,000 to 18,000 ft) - // 3 Above Clouds (tops over 18,000 ft) - // 4 Below Clouds (bases less than 10,000 ft) - // 5 Below Clouds (bases 10,000 to 18,000 ft) - // 6 Below Clouds (bases above 18,000 ft) - // 7 Between Broken or Overcast Layers - // 8 In Clouds - // 9 In and Out of Clouds - //*********************************************** - - private void decodeElement() - { - if(theRawData.length() == WX_LENGTH) - { - int pos = VALID_CHARS.indexOf(theRawData.charAt(WX_HAZARD)); - if(pos >= 0) - { - theHazard = pos-1; - } - pos = VALID_CHARS.indexOf(theRawData.charAt(WX_WEATHER)); - if(pos >= 0) - { - theWeather = pos-1; - } - pos = VALID_CHARS.indexOf(theRawData.charAt(WX_FLIGHT)); - if(pos >= 0) - { - theFlightConditions = pos-1; - } - } - } // decodeElement() - - public String toString() - { - StringBuffer retData = new StringBuffer(); - retData.append((theHazard >= 0) ? String.valueOf(theHazard) : "/"); - retData.append((theWeather >= 0) ? String.valueOf(theWeather) : "/"); - retData.append((theFlightConditions >= 0) ? String.valueOf(theFlightConditions) : "/"); - - - return retData.toString(); - } // toString() -} + private Integer theFlightConditions = IMISSD; + + /** + * + * @param aType + */ + public NcAIREPWeather(String aWeatherGroup) + { + theRawData = aWeatherGroup; + decodeElement(); + } // NcAIREPWeather() + + public Integer getHazard() + { + return theHazard; + } // getHazard() + + public Integer getWeather() + { + return theWeather; + } // getWeather() + + public Integer getFlightConditions() + { + return theFlightConditions; + } // getFlightConditions() + + + //*********************************************** + // Table 3.3. AIREP Hazards (H). + // Code Figure Explanation + // 0 None + // 1 Light Turbulence + // 2 Moderate Turbulence + // 3 Severe Turbulence + // 4 Extreme Turbulence + // 5 Trace of Icing + // 6 Light Icing + // 7 Moderate Icing + // 8 Severe Icing + // 9 Hail + // + // Table 3.4. AIREP Weather (W). + // Code Figure Explanation + // 0 Clear + // 1 Scattered Clouds + // 2 Broken Clouds + // 3 Continuous Layers + // 4 Lightning + // 5 Drizzle + // 6 Continuous Rain + // 7 Continuous Snow + // 8 Rain or Snow Showers + // 9 Thunderstorms + // + // + // Table 3.5. AIREP Flight Conditions (FC). + // Code Figure Explanation + // 0 Clear + // 1 Above Clouds (tops less than 10,000 ft) + // 2 Above Clouds (tops 10,000 to 18,000 ft) + // 3 Above Clouds (tops over 18,000 ft) + // 4 Below Clouds (bases less than 10,000 ft) + // 5 Below Clouds (bases 10,000 to 18,000 ft) + // 6 Below Clouds (bases above 18,000 ft) + // 7 Between Broken or Overcast Layers + // 8 In Clouds + // 9 In and Out of Clouds + //*********************************************** + + private void decodeElement() + { + if(theRawData.length() == WX_LENGTH) + { + int pos = VALID_CHARS.indexOf(theRawData.charAt(WX_HAZARD)); + if(pos >= 0) + { + theHazard = pos-1; + } + pos = VALID_CHARS.indexOf(theRawData.charAt(WX_WEATHER)); + if(pos >= 0) + { + theWeather = pos-1; + } + pos = VALID_CHARS.indexOf(theRawData.charAt(WX_FLIGHT)); + if(pos >= 0) + { + theFlightConditions = pos-1; + } + } + } // decodeElement() + + public String toString() + { + StringBuffer retData = new StringBuffer(); + retData.append((theHazard >= 0) ? String.valueOf(theHazard) : "/"); + retData.append((theWeather >= 0) ? String.valueOf(theWeather) : "/"); + retData.append((theFlightConditions >= 0) ? String.valueOf(theFlightConditions) : "/"); + + + return retData.toString(); + } // toString() +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAirepParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAirepParser.java index 1798b37175..966741420e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAirepParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncairep/src/gov/noaa/nws/ncep/edex/plugin/ncairep/decoder/NcAirepParser.java @@ -1,36 +1,36 @@ /** * This software was modified from Raytheon's airep plugin by * NOAA/NWS/NCEP/NCO to order to output point data in HDF5. - **/ -package gov.noaa.nws.ncep.edex.plugin.ncairep.decoder; + **/ +package gov.noaa.nws.ncep.edex.plugin.ncairep.decoder; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.Map; -import java.util.StringTokenizer; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.uf.edex.decodertools.aircraft.AircraftFlightLevel; -import com.raytheon.uf.edex.decodertools.aircraft.AircraftLatitude; -import com.raytheon.uf.edex.decodertools.aircraft.AircraftLongitude; -import com.raytheon.uf.edex.decodertools.aircraft.AircraftRemarks; -import com.raytheon.uf.edex.decodertools.core.BasePoint; -import com.raytheon.uf.edex.decodertools.core.PlatformLocationProxy; +import java.util.StringTokenizer; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.uf.edex.decodertools.aircraft.AircraftFlightLevel; +import com.raytheon.uf.edex.decodertools.aircraft.AircraftLatitude; +import com.raytheon.uf.edex.decodertools.aircraft.AircraftLongitude; +import com.raytheon.uf.edex.decodertools.aircraft.AircraftRemarks; +import com.raytheon.uf.edex.decodertools.core.BasePoint; +import com.raytheon.uf.edex.decodertools.core.PlatformLocationProxy; import com.raytheon.uf.edex.decodertools.time.TimeTools; -import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; - -/** - * The NcAirepParser takes a String that should contain a single AIREP observation - * and parses the individual elements of the observation, and performs a decode - * of those elements. The data is made available to clients through a set of get - * methods for each data item. - *
    - * SOFTWARE HISTORY
    - * Date           PTR#     Engineer      Description
    +import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN;
    +
    +/**
    + * The NcAirepParser takes a String that should contain a single AIREP observation
    + * and parses the individual elements of the observation, and performs a decode
    + * of those elements. The data is made available to clients through a set of get
    + * methods for each data item.
    + * 
    + * SOFTWARE HISTORY
    + * Date           PTR#     Engineer      Description
      * ------------   -------- ------------- -------------------------------------
      * 04/27/2011              F.J.Yen       Initial creation from airep.  Change
      * 										 temperature and windSpeed from Double to
    @@ -45,22 +45,23 @@ import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN;
      * 09/29/2011    286       Q.Zhou        Modified decodeTempreture to work for both amdar and airep.
      * 10/04/2011    286       Q.Zhou        Removed wmoHeader parameter. Modified splitLatLon() to solve 3606S 15942E
      * 10/17/2011    286       Q.Zhou        Added WX_COND_WORDS and checking.
    - * 11/01/2011    286       Q.Zhou        Added month and year to decodetime
    - * 
    - */ -public class NcAirepParser -{ - /** The logger */ - private Log logger = LogFactory.getLog(getClass()); - - private static final boolean WANT_DELIMITERS = false; - // Only going to delimit aireps with spaces and carriage control. - private static final String DELIMITER = " ;$=\r\n"; - - private static final int MAX_WIND_SPEED = 500; - - // Once set the obs data cannot be changed! - private final String reportData; + * 11/01/2011 286 Q.Zhou Added month and year to decodetime + * 02/15/2012 Q.Zhou Added in decodeHazard() to ice type for possible icing type input + *
    + */ +public class NcAirepParser +{ + /** The logger */ + private Log logger = LogFactory.getLog(getClass()); + + private static final boolean WANT_DELIMITERS = false; + // Only going to delimit aireps with spaces and carriage control. + private static final String DELIMITER = " ;$=\r\n"; + + private static final int MAX_WIND_SPEED = 500; + + // Once set the obs data cannot be changed! + private final String reportData; private static final float RMISSD = IDecoderConstantsN.UAIR_FLOAT_MISSING; private static final int IMISSD = IDecoderConstantsN.INTEGER_MISSING; @@ -115,49 +116,49 @@ public class NcAirepParser WX_COND_WORDS.put("UNKN", "UNKN"); WX_COND_WORDS.put("UNKNOWN", "UNKN"); } - - // - // Determine if the input data corresponds to a hour minute time - // - // i.e. 0000 to 2359 - // - // "^([0..1]{1}[0..9]{1})|(2[0..3]{1})[0..5]{1}[0..9]{1}" - // - // Start of token "^" - // 0 or 1 followed by 0 to 9 or - // 2 followed by 0 to 3 - // - // 0 to 5 followed by 0 to 9 - // End of token "$" - // - final Pattern TIME_Airep = Pattern.compile("[0-9]{4}"); - final Pattern TIME_Amdar = Pattern.compile("[0-9]{6}"); - //Pattern.compile("^(([0-1]{1}[0-9]{1})|(2[0-3]{1}))([0-5]{1}[0-9]{1})$"); - - final Pattern WX_GROUP = Pattern.compile("^[0-9/]{3}$"); - // Two different flight level patterns - final Pattern FL_SHORT = Pattern.compile("F\\d{3}"); - final Pattern FL_LONG = Pattern.compile("FL\\d{3}"); - - final Pattern TEMP_SHORT = Pattern.compile("^(M|P)\\d{2}"); - final Pattern TEMP_LONG = Pattern.compile("^(MS|PS)\\d{2}"); + + // + // Determine if the input data corresponds to a hour minute time + // + // i.e. 0000 to 2359 + // + // "^([0..1]{1}[0..9]{1})|(2[0..3]{1})[0..5]{1}[0..9]{1}" + // + // Start of token "^" + // 0 or 1 followed by 0 to 9 or + // 2 followed by 0 to 3 + // + // 0 to 5 followed by 0 to 9 + // End of token "$" + // + final Pattern TIME_Airep = Pattern.compile("[0-9]{4}"); + final Pattern TIME_Amdar = Pattern.compile("[0-9]{6}"); + //Pattern.compile("^(([0-1]{1}[0-9]{1})|(2[0-3]{1}))([0-5]{1}[0-9]{1})$"); + + final Pattern WX_GROUP = Pattern.compile("^[0-9/]{3}$"); + // Two different flight level patterns + final Pattern FL_SHORT = Pattern.compile("F\\d{3}"); + final Pattern FL_LONG = Pattern.compile("FL\\d{3}"); + + final Pattern TEMP_SHORT = Pattern.compile("^(M|P)\\d{2}"); + final Pattern TEMP_LONG = Pattern.compile("^(MS|PS)\\d{2}"); final Pattern TEMP_SHORT2 = Pattern.compile("^(M|P)\\d{3}"); final Pattern TEMP_LONG2 = Pattern.compile("^(MS|PS)\\d{3}"); - - // Parsed and/or decoded observation elements. - private ArrayList theElements = new ArrayList(); - - private String aircraftId = null; - private String reportType = null; - private Double latitude = null; - private Double longitude = null; - private Calendar observationTime = null; + + // Parsed and/or decoded observation elements. + private ArrayList theElements = new ArrayList(); + + private String aircraftId = null; + private String reportType = null; + private Double latitude = null; + private Double longitude = null; + private Calendar observationTime = null; private AircraftFlightLevel flightLevel = null; - private Float temperature = RMISSD; + private Float temperature = RMISSD; private NcAIREPWeather weatherGroup = null; private Float windDirection = RMISSD; - private Float windSpeed = RMISSD; - private AircraftRemarks rptRemarks = null; + private Float windSpeed = RMISSD; + private AircraftRemarks rptRemarks = null; private String turbInten; private String turbType; @@ -169,45 +170,45 @@ public class NcAirepParser private int skyTopHeight; private String suspectTimeFlag; private String headerTime; - - /** - * Create the parser for and decode an observation from a String. - * @param anObservation A string containing the observation. - */ + + /** + * Create the parser for and decode an observation from a String. + * @param anObservation A string containing the observation. + */ public NcAirepParser(String anObservation) { reportData = anObservation; - parseElements(); - } - - /** - * Create the parser for and decode an observation from a String. - * @param anObservation A string containing the observation. - */ - public NcAirepParser(byte [] anObservation) { + parseElements(); + } + + /** + * Create the parser for and decode an observation from a String. + * @param anObservation A string containing the observation. + */ + public NcAirepParser(byte [] anObservation) { reportData = new String(anObservation); - parseElements(); - } - - /** - * Expose the internal parsed elements for testing. - * @return A collection of the parsed elements. - */ - ArrayList parseElementsTestPoint() { - ArrayList retElements = new ArrayList(); - retElements.addAll(theElements); - return retElements; - } - - /** - * Parse the AIREP observation into individual elements. - * Note that during parse or decode the order of the elements does not - * change. The only exception to this rule is that all elements identified - * as comments/remarks are placed at the end of the observation elements. - */ + parseElements(); + } + + /** + * Expose the internal parsed elements for testing. + * @return A collection of the parsed elements. + */ + ArrayList parseElementsTestPoint() { + ArrayList retElements = new ArrayList(); + retElements.addAll(theElements); + return retElements; + } + + /** + * Parse the AIREP observation into individual elements. + * Note that during parse or decode the order of the elements does not + * change. The only exception to this rule is that all elements identified + * as comments/remarks are placed at the end of the observation elements. + */ private void parseElements() { - - StringTokenizer st = - new StringTokenizer(reportData,DELIMITER,WANT_DELIMITERS); + + StringTokenizer st = + new StringTokenizer(reportData,DELIMITER,WANT_DELIMITERS); // parse first record in st --headerTime if (st.hasMoreTokens()) @@ -221,73 +222,73 @@ public class NcAirepParser if (temp.equalsIgnoreCase("AMDAR") && st.hasMoreTokens()) st.nextToken(); } - - // Now get the elements - while(st.hasMoreTokens()) { + + // Now get the elements + while(st.hasMoreTokens()) { String s = st.nextToken(); if (s!= null ) theElements.add(s); //System.out.println("**********theElements "+s); - -// if(!DELIMITER.equals(s)) { -// Object o = NcAIREPObsType.obsTypeFactory(s); -// if((o != null)&&(reportType == null)) { -// reportType = ((NcAIREPObsType) o).getValue(); -// } else { -// theElements.add(s); -// } -// } + +// if(!DELIMITER.equals(s)) { +// Object o = NcAIREPObsType.obsTypeFactory(s); +// if((o != null)&&(reportType == null)) { +// reportType = ((NcAIREPObsType) o).getValue(); +// } else { +// theElements.add(s); +// } +// } } decodeReportType(); - decodeHazard(); - decodeMID(); - splitLatLon(); - decodeLatitude(); - decodeLongitude(); + decodeHazard(); + decodeMID(); + splitLatLon(); + decodeLatitude(); + decodeLongitude(); decodeTime(); - - // By now we should have found lat lon information. If not then - // run back through the data to see if there is a waypoint. If we - // get to the time information, quit, it's not there. - if((latitude == null)&&(longitude == null)) - { - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o instanceof String) - { - BasePoint wayPoint = PlatformLocationProxy.lookup((String)o,null); - // found a waypoint - if(wayPoint != null) - { - latitude = AircraftLatitude.createLatitude(wayPoint); + + // By now we should have found lat lon information. If not then + // run back through the data to see if there is a waypoint. If we + // get to the time information, quit, it's not there. + if((latitude == null)&&(longitude == null)) + { + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o instanceof String) + { + BasePoint wayPoint = PlatformLocationProxy.lookup((String)o,null); + // found a waypoint + if(wayPoint != null) + { + latitude = AircraftLatitude.createLatitude(wayPoint); longitude = AircraftLongitude.createLongitude(wayPoint); - - theElements.set(i,latitude); - theElements.add(i+1,longitude); - break; - } - } - else if(o instanceof Calendar) - { - break; - } - } - } - // Need to have lat / lon data - if((latitude == null)||(longitude == null)) { - observationTime = null; - return; - } - decodeFlightLevel(); - decodeTemperature(); - decodeWeatherGroup(); - decodeWinds(); - collectRemarks(); - determineAircraftId(); - } // parseElements() + + theElements.set(i,latitude); + theElements.add(i+1,longitude); + break; + } + } + else if(o instanceof Calendar) + { + break; + } + } + } + // Need to have lat / lon data + if((latitude == null)||(longitude == null)) { + observationTime = null; + return; + } + decodeFlightLevel(); + decodeTemperature(); + decodeWeatherGroup(); + decodeWinds(); + collectRemarks(); + determineAircraftId(); + } // parseElements() /* * get ReportType @@ -298,44 +299,44 @@ public class NcAirepParser reportType = "AIREP"; else if (reportData.contains("AMDAR")) reportType = "AMDAR"; - } - /** - * When the primary decode is complete the aircraft ID should be the only - * data left prior to the latitude/longitude data. If found then set this - * data as the id. - */ - private void determineAircraftId() - { - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o instanceof Double) - { - break; - } - if(o instanceof String) - { - aircraftId = (String) o; - break; - } - } - } // determineAircraftId() - - /** - * Determine if a latitude/longitude group is run-together or may be a - * navigation waypoint. As an example - *
    5802N02015W
    - * is split into 2 groups - *
    5802N 02015W
    - * which is then processed normally. - */ - private void splitLatLon() + } + /** + * When the primary decode is complete the aircraft ID should be the only + * data left prior to the latitude/longitude data. If found then set this + * data as the id. + */ + private void determineAircraftId() { - int latlonCnt =0; - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o !=null && o instanceof String) + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o instanceof Double) + { + break; + } + if(o instanceof String) + { + aircraftId = (String) o; + break; + } + } + } // determineAircraftId() + + /** + * Determine if a latitude/longitude group is run-together or may be a + * navigation waypoint. As an example + *
    5802N02015W
    + * is split into 2 groups + *
    5802N 02015W
    + * which is then processed normally. + */ + private void splitLatLon() + { + int latlonCnt =0; + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o !=null && o instanceof String) { String s = theElements.get(i).toString().trim(); //e.g. UAE412 3606S 15942E 1150 F410 MS47 281/75= @@ -364,71 +365,71 @@ public class NcAirepParser } } } - } - } + } + } } // for - - } // splitLatLon() - - /** - * Attempt to locate and decode the latitude information within this - * AIREP observation. The decode object replaces the string data within - * the observation elements collection. - */ - private void decodeLatitude() - { - if(latitude == null) - { - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o instanceof String) - { - AircraftLatitude lat = AircraftLatitude.aircraftLatitudeFactory((String) o); - if(lat != null) - { - theElements.set(i,lat); - latitude = lat.decodeLatitude(); - break; - } - } - } - } - } // decodeLatitude() - - /** - * Attempt to locate and decode the longitude information within this - * AIREP observation. The decode object replaces the string data within - * the observation elements collection. - */ - private void decodeLongitude() - { - if(longitude == null) - { - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o instanceof String) - { - AircraftLongitude lon = AircraftLongitude.aircraftLongitudeFactory((String) o); - if(lon != null) - { - theElements.set(i,lon); - longitude = lon.decodeLongitude(); - break; - } - } - } - } - } // decodeLongitude() + + } // splitLatLon() - - /** - * Attempt to locate and decode the time information within this - * AIREP observation. The decode object replaces the string data within - * the observation elements collection. - */ - private void decodeTime() + /** + * Attempt to locate and decode the latitude information within this + * AIREP observation. The decode object replaces the string data within + * the observation elements collection. + */ + private void decodeLatitude() + { + if(latitude == null) + { + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o instanceof String) + { + AircraftLatitude lat = AircraftLatitude.aircraftLatitudeFactory((String) o); + if(lat != null) + { + theElements.set(i,lat); + latitude = lat.decodeLatitude(); + break; + } + } + } + } + } // decodeLatitude() + + /** + * Attempt to locate and decode the longitude information within this + * AIREP observation. The decode object replaces the string data within + * the observation elements collection. + */ + private void decodeLongitude() + { + if(longitude == null) + { + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o instanceof String) + { + AircraftLongitude lon = AircraftLongitude.aircraftLongitudeFactory((String) o); + if(lon != null) + { + theElements.set(i,lon); + longitude = lon.decodeLongitude(); + break; + } + } + } + } + } // decodeLongitude() + + + /** + * Attempt to locate and decode the time information within this + * AIREP observation. The decode object replaces the string data within + * the observation elements collection. + */ + private void decodeTime() { Calendar oTime = TimeTools.getSystemCalendar(); @@ -456,14 +457,14 @@ public class NcAirepParser issuTime.set(Calendar.MINUTE,minute); issuTime.set(Calendar.SECOND,0); issuTime.set(Calendar.MILLISECOND,0); - - for(int i = 1; i < theElements.size();i++) //start from second record - { - Object o = theElements.get(i); - if(o instanceof String) - { - String s = (String) o; - if(TIME_Airep.matcher(s).matches()) + + for(int i = 1; i < theElements.size();i++) //start from second record + { + Object o = theElements.get(i); + if(o instanceof String) + { + String s = (String) o; + if(TIME_Airep.matcher(s).matches()) { hour = Integer.parseInt(s.substring(0, 2)); minute = Integer.parseInt(s.substring(2, 4)); @@ -501,13 +502,13 @@ public class NcAirepParser observationTime.add(Calendar.DAY_OF_MONTH,-1); } //System.out.println("***********time2 "+observationTime.getTime()); - - theElements.set(i,observationTime); - break; - - } - } - } + + theElements.set(i,observationTime); + break; + + } + } + } private Calendar checkDayInTime (Calendar obs, Calendar issue) { @@ -538,190 +539,190 @@ public class NcAirepParser return obs; } - - private void decodeFlightLevel() { - for(int i = 0;i < theElements.size();i++) { - Object o = theElements.get(i); - if(o instanceof String) { - String s = (String) o; - if(FL_SHORT.matcher(s).matches()) { - double fLevel = Integer.parseInt(s.substring(1))*100; - - flightLevel = new AircraftFlightLevel(fLevel); - theElements.set(i,flightLevel); - break; - } else if(FL_LONG.matcher(s).matches()) { - double fLevel = Integer.parseInt(s.substring(1))*100; - - flightLevel = new AircraftFlightLevel(fLevel); - theElements.set(i,flightLevel); - break; - } - } - } - } - - /** + + private void decodeFlightLevel() { + for(int i = 0;i < theElements.size();i++) { + Object o = theElements.get(i); + if(o instanceof String) { + String s = (String) o; + if(FL_SHORT.matcher(s).matches()) { + double fLevel = Integer.parseInt(s.substring(1))*100; + + flightLevel = new AircraftFlightLevel(fLevel); + theElements.set(i,flightLevel); + break; + } else if(FL_LONG.matcher(s).matches()) { + double fLevel = Integer.parseInt(s.substring(1))*100; + + flightLevel = new AircraftFlightLevel(fLevel); + theElements.set(i,flightLevel); + break; + } + } + } + } + + /** * Decode the temperature information in this observation. - * e.g. Airep MS45, AMDAR MS456 - */ - private void decodeTemperature() - { - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o instanceof String) + * e.g. Airep MS45, AMDAR MS456 + */ + private void decodeTemperature() + { + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o instanceof String) { float temp = RMISSD; - temperature = RMISSD; + temperature = RMISSD; String s = (String) o; - - if(TEMP_LONG.matcher(s).matches() ||TEMP_LONG2.matcher(s).matches()) - { + + if(TEMP_LONG.matcher(s).matches() ||TEMP_LONG2.matcher(s).matches()) + { String ss = s.substring(2); - - if(!"//".equals(ss)) + + if(!"//".equals(ss)) { if (ss.length()>2) ss = ss.substring(0, 2) + "." + ss.substring(2); - temp = Float.parseFloat(ss); - - if("MS".equals(s.substring(0,2))) - { - temp *= -1; + temp = Float.parseFloat(ss); + + if("MS".equals(s.substring(0,2))) + { + temp *= -1; } - temperature = new Float(temp); - theElements.set(i,temperature); - } - break; - } - else if(TEMP_SHORT.matcher(s).matches() ||TEMP_SHORT2.matcher(s).matches()) - { - String ss = s.substring(1); - if(!"//".equals(ss)) + temperature = new Float(temp); + theElements.set(i,temperature); + } + break; + } + else if(TEMP_SHORT.matcher(s).matches() ||TEMP_SHORT2.matcher(s).matches()) + { + String ss = s.substring(1); + if(!"//".equals(ss)) { if (ss.length()>2) ss = ss.substring(0, 2) + "." + ss.substring(2); - temp = Float.parseFloat(ss); - - if("M".equals(s.substring(0,1))) - { - temp *= -1; + temp = Float.parseFloat(ss); + + if("M".equals(s.substring(0,1))) + { + temp *= -1; } - temperature = new Float(temp); - theElements.set(i,temperature); - } - break; - } - } - } - } - - /** - * Attempt to locate and decode the 3 digit hazards and weather group. - */ - private void decodeWeatherGroup() - { - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o instanceof String) - { - String s = (String) o; - if(s.length() == 3) - { - if(WX_GROUP.matcher(s).find()) - { - weatherGroup = new NcAIREPWeather(s); - theElements.set(i,weatherGroup); - break; - } - } - } - } - } // decodeWeatherGroup() - - /** - * Decode the wind data group in the following forms. - * 16080 - * 160080 - * 163/080 - * 163/080KT - * @throws DecodeException if winds are bad - */ + temperature = new Float(temp); + theElements.set(i,temperature); + } + break; + } + } + } + } + + /** + * Attempt to locate and decode the 3 digit hazards and weather group. + */ + private void decodeWeatherGroup() + { + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o instanceof String) + { + String s = (String) o; + if(s.length() == 3) + { + if(WX_GROUP.matcher(s).find()) + { + weatherGroup = new NcAIREPWeather(s); + theElements.set(i,weatherGroup); + break; + } + } + } + } + } // decodeWeatherGroup() + + /** + * Decode the wind data group in the following forms. + * 16080 + * 160080 + * 163/080 + * 163/080KT + * @throws DecodeException if winds are bad + */ private void decodeWinds() { - - // By now we should have found the flight level data. - int i = 0; - for(;i < theElements.size();i++) { - if(theElements.get(i) instanceof AircraftFlightLevel) { - i++; - break; - } - } // for() + + // By now we should have found the flight level data. + int i = 0; + for(;i < theElements.size();i++) { + if(theElements.get(i) instanceof AircraftFlightLevel) { + i++; + break; + } + } // for() - - for(;i < theElements.size();i++) { + + for(;i < theElements.size();i++) { Object o = theElements.get(i); windSpeed = RMISSD; - windDirection = RMISSD; - if(o instanceof String) { - String s = (String) o; - if(s != null) { - if(s.startsWith("M") || s.startsWith("P") || s.startsWith("/")) { - // These are temperatures. Some temps are - // being reported as 5 digits (MS513 which is -51.3) - continue; - } else if(s.endsWith("KT")) { - s = s.substring(0,s.length() - 2); - } else if(s.endsWith("KTS")) { - s = s.substring(0,s.length() - 3); - } - int solidusPos = s.indexOf("/"); - + windDirection = RMISSD; + if(o instanceof String) { + String s = (String) o; + if(s != null) { + if(s.startsWith("M") || s.startsWith("P") || s.startsWith("/")) { + // These are temperatures. Some temps are + // being reported as 5 digits (MS513 which is -51.3) + continue; + } else if(s.endsWith("KT")) { + s = s.substring(0,s.length() - 2); + } else if(s.endsWith("KTS")) { + s = s.substring(0,s.length() - 3); + } + int solidusPos = s.indexOf("/"); + String windDir = null; - String windSpd = null; - if(solidusPos > 0) { - windDir = s.substring(0,solidusPos); - windSpd = s.substring(solidusPos+1); - } else if(s.length() == 5) { - windDir = s.substring(0,2) + "0"; - windSpd = s.substring(2); - } else if(s.length() == 6) { - windDir = s.substring(0,3); - windSpd = s.substring(3); - } - if((windSpd != null)&&(windDir != null)) { + String windSpd = null; + if(solidusPos > 0) { + windDir = s.substring(0,solidusPos); + windSpd = s.substring(solidusPos+1); + } else if(s.length() == 5) { + windDir = s.substring(0,2) + "0"; + windSpd = s.substring(2); + } else if(s.length() == 6) { + windDir = s.substring(0,3); + windSpd = s.substring(3); + } + if((windSpd != null)&&(windDir != null)) { try { - float value = Float.parseFloat(windSpd); - if((value >= 0)&&(value < MAX_WIND_SPEED)) { - windSpeed = value; - } else { - windSpeed = RMISSD; + float value = Float.parseFloat(windSpd); + if((value >= 0)&&(value < MAX_WIND_SPEED)) { + windSpeed = value; + } else { + windSpeed = RMISSD; } - + - value = Float.parseFloat(windDir); - // Database constraint is 1 - 360. - if (value == 0) - { - value = 360; - } + value = Float.parseFloat(windDir); + // Database constraint is 1 - 360. + if (value == 0) + { + value = 360; + } windDirection = value; // windDirection.fromDegree(value); - // Database constraint is 1 - 360. - - theElements.set(i,windDirection); - theElements.add(i+1,windSpeed); - } - catch(Exception nothing) { - String msg = String.format("Error decoding winds: [%s] [%s]",windSpd,windDir); - - logger.info(msg); - } - break; + // Database constraint is 1 - 360. + + theElements.set(i,windDirection); + theElements.add(i+1,windSpeed); + } + catch(Exception nothing) { + String msg = String.format("Error decoding winds: [%s] [%s]",windSpd,windDir); + + logger.info(msg); + } + break; } if (windDir ==null) { windDirection = RMISSD; @@ -730,16 +731,16 @@ public class NcAirepParser if (windSpeed ==null) { windSpeed = RMISSD; theElements.set(i,windSpeed); - } - } + } + } } if (windDirection ==null) { windDirection = RMISSD; theElements.set(i,windDirection); - } - } - } + } + } + } /* Observed hazard in TB, SK, IC order in Airep. Observed appear once at most for each. * e.g. airep: ARP ASA858 3948N 13807W 2354 F370 MS53 263/046KT TB SMTH= @@ -846,14 +847,40 @@ public class NcAirepParser if ( !theElements.get(iIc).toString().equalsIgnoreCase("RM") && !theElements.get(iIc).toString().equalsIgnoreCase("SK")) { //didn't see, in case... - iceInten = theElements.get(iIc).toString(); - if (WX_COND_WORDS.get(iceInten) != null) - iceInten = WX_COND_WORDS.get(iceInten); - // handle iceInten number value - iceInten = checkIceNumAirep(iceInten); + String temp = theElements.get(iIc).toString(); + if (WX_COND_WORDS.get(temp) != null) + temp = WX_COND_WORDS.get(temp); + + if (temp.startsWith("RIM") || temp.startsWith("CL") || temp.startsWith("MX")) + iceType = temp; + else + iceInten = temp; + + iIc++; } } + if (iIc !=0 && iIc < size) { + + if ( !theElements.get(iIc).toString().equalsIgnoreCase("RM") + && !theElements.get(iIc).toString().equalsIgnoreCase("SK")) { //didn't see, in case... + + String temp = theElements.get(iIc).toString(); + if (WX_COND_WORDS.get(temp) != null) + temp = WX_COND_WORDS.get(temp); + + if (temp.startsWith("RIM") || temp.startsWith("CL") || temp.startsWith("MX")) + iceType = temp; + + iIc++; + } + } + + + // handle iceInten number value + if (iIc !=0 && iceInten != null) + iceInten = checkIceNumAirep(iceInten); + // Airep: handle iceInten with "-". e.g. LGT-MOD => LGTMOD if (iIc !=0 ) { String[] s = iceInten.split("-"); @@ -873,172 +900,172 @@ public class NcAirepParser } } - - /** - * The "MID" section only occurs in the AIREP remarks section. So if we find - * a "MID" token we create a remarks object using all data from the MID token - * to the end of the data. - */ - private void decodeMID() - { - for(int i = 0;i < theElements.size();i++) - { - Object o = theElements.get(i); - if(o instanceof String) - { - String s = (String) o; - if("MID".equals(s)) - { - AircraftRemarks remarks = new AircraftRemarks(s); - for(i++;i < theElements.size();) - { - remarks.addRemarks(" "); - remarks.addRemarks((String) theElements.get(i)); - theElements.remove(i); - } - rptRemarks = remarks; - } - } - } - } - - /** - * Iterate over any remaining data left in the observation that is AFTER - * the time information. These data are bundled together as a remarks - * string that will be appended to the end of the observation data. - */ - private void collectRemarks() { - boolean timeFound = false; - int i = 0; - for(;i < theElements.size();i++) { - Object o = theElements.get(i); - if(timeFound = (o instanceof Calendar)) { - break; - } - } // for - if(timeFound) { - StringBuffer remarksBuffer = new StringBuffer(); - for(;i < theElements.size();i++) { - Object o = theElements.get(i); - if(o instanceof String) { - theElements.remove(i); - i--; - remarksBuffer.append(o); - remarksBuffer.append(" "); - } - } // for - if(remarksBuffer.length() > 0) { - if(rptRemarks != null) { - remarksBuffer.insert(0," "); - remarksBuffer.insert(0,rptRemarks.getValue()); - } - rptRemarks = new AircraftRemarks(remarksBuffer.toString()); - } - } - } // collectRemarks() - - - /** - * @return the reportData - */ - public String getReportData() { - return reportData; - } - - /** - * @return the reportType - */ - public String getReportType() { - return reportType; - } - - /** - * @param reportType the reportType to set - */ - public void setReportType(String reportType) { - this.reportType = reportType; - } - - /** - * Get the decoded Aircraft id. - * @return The decoded Aircraft id. - */ - public String getAircraftId() - { - return aircraftId; - } // getAircraftId() - - /** - * Get the decoded Latitude instance. - * @return The decoded Latitude - */ - public Double getLatitude() - { - return latitude; - } // getLatitude() - - /** - * Get the decoded Longitude instance. - * @return The decoded Longitude. - */ - public Double getLongitude() - { - return longitude; - } // getLongitude() - - /** - * Get the AIREP observation time. - * @return The AIREP observation time. - */ - public Calendar getObservationTime() - { - return observationTime; - } // getObservationTime() - - /** - * Get the decoded aircraft flight level data. - * @return The decoded aircraft flight level data. - */ - public Integer getFlightLevel() { + + /** + * The "MID" section only occurs in the AIREP remarks section. So if we find + * a "MID" token we create a remarks object using all data from the MID token + * to the end of the data. + */ + private void decodeMID() + { + for(int i = 0;i < theElements.size();i++) + { + Object o = theElements.get(i); + if(o instanceof String) + { + String s = (String) o; + if("MID".equals(s)) + { + AircraftRemarks remarks = new AircraftRemarks(s); + for(i++;i < theElements.size();) + { + remarks.addRemarks(" "); + remarks.addRemarks((String) theElements.get(i)); + theElements.remove(i); + } + rptRemarks = remarks; + } + } + } + } + + /** + * Iterate over any remaining data left in the observation that is AFTER + * the time information. These data are bundled together as a remarks + * string that will be appended to the end of the observation data. + */ + private void collectRemarks() { + boolean timeFound = false; + int i = 0; + for(;i < theElements.size();i++) { + Object o = theElements.get(i); + if(timeFound = (o instanceof Calendar)) { + break; + } + } // for + if(timeFound) { + StringBuffer remarksBuffer = new StringBuffer(); + for(;i < theElements.size();i++) { + Object o = theElements.get(i); + if(o instanceof String) { + theElements.remove(i); + i--; + remarksBuffer.append(o); + remarksBuffer.append(" "); + } + } // for + if(remarksBuffer.length() > 0) { + if(rptRemarks != null) { + remarksBuffer.insert(0," "); + remarksBuffer.insert(0,rptRemarks.getValue()); + } + rptRemarks = new AircraftRemarks(remarksBuffer.toString()); + } + } + } // collectRemarks() + + + /** + * @return the reportData + */ + public String getReportData() { + return reportData; + } + + /** + * @return the reportType + */ + public String getReportType() { + return reportType; + } + + /** + * @param reportType the reportType to set + */ + public void setReportType(String reportType) { + this.reportType = reportType; + } + + /** + * Get the decoded Aircraft id. + * @return The decoded Aircraft id. + */ + public String getAircraftId() + { + return aircraftId; + } // getAircraftId() + + /** + * Get the decoded Latitude instance. + * @return The decoded Latitude + */ + public Double getLatitude() + { + return latitude; + } // getLatitude() + + /** + * Get the decoded Longitude instance. + * @return The decoded Longitude. + */ + public Double getLongitude() + { + return longitude; + } // getLongitude() + + /** + * Get the AIREP observation time. + * @return The AIREP observation time. + */ + public Calendar getObservationTime() + { + return observationTime; + } // getObservationTime() + + /** + * Get the decoded aircraft flight level data. + * @return The decoded aircraft flight level data. + */ + public Integer getFlightLevel() { // Integer retValue = null; - Integer retValue = IMISSD; - if(flightLevel != null) { - retValue = flightLevel.getFlightLevel(); - } - return retValue; - } // getFlightLevel() - - /** - * Get the decoded temperature data. - * @return The decoded temperature. + Integer retValue = IMISSD; + if(flightLevel != null) { + retValue = flightLevel.getFlightLevel(); + } + return retValue; + } // getFlightLevel() + + /** + * Get the decoded temperature data. + * @return The decoded temperature. */ - public Float getTemperature() - { - return temperature; - } // getAirTemperature() - - public NcAIREPWeather getWeatherGroup() - { - return weatherGroup; - } // getWeatherGroup() - - /** - * Get the decoded wind direction data. - * @return The decoded wind direction data. + public Float getTemperature() + { + return temperature; + } // getAirTemperature() + + public NcAIREPWeather getWeatherGroup() + { + return weatherGroup; + } // getWeatherGroup() + + /** + * Get the decoded wind direction data. + * @return The decoded wind direction data. */ - public Float getWindDirection() - { - return windDirection; - } // getWindDirection() - - /** - * Get the decoded wind speed data. - * @return The decoded wind speed data. + public Float getWindDirection() + { + return windDirection; + } // getWindDirection() + + /** + * Get the decoded wind speed data. + * @return The decoded wind speed data. */ - public Float getWindSpeed() - { - return windSpeed; - } // getWindSpeed() + public Float getWindSpeed() + { + return windSpeed; + } // getWindSpeed() public String getTurbInten() { return turbInten; @@ -1067,15 +1094,15 @@ public class NcAirepParser public String getSuspectTimeFlag() { return suspectTimeFlag; } - - /** - * Get any remarks information found. - * @return The remarks information. An empty string is returned if no - * remarks data was found. - */ - public String getRemarks() - { - return (rptRemarks != null) ? rptRemarks.toString() : ""; + + /** + * Get any remarks information found. + * @return The remarks information. An empty string is returned if no + * remarks data was found. + */ + public String getRemarks() + { + return (rptRemarks != null) ? rptRemarks.toString() : ""; } // getRemarks() /* @@ -1242,5 +1269,5 @@ public class NcAirepParser } } - } + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncccfp/gov.noaa.nws.ncep.edex.plugin.ncccfp.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncccfp/gov.noaa.nws.ncep.edex.plugin.ncccfp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index 8e9151a9ee..ecfd786b78 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -1,3 +1,5 @@ gov.noaa.nws.ncep.edex.util.ncgrib.NcgridLevels gov.noaa.nws.ncep.edex.util.ncgrib.Ncgrib1TableMap gov.noaa.nws.ncep.edex.util.ncgrib.NccompositeModel +gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd +gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdList \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/NcgribDecoder.py b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/NcgribDecoder.py index 0249543fb6..e9aa8e274f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/NcgribDecoder.py +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/NcgribDecoder.py @@ -701,8 +701,26 @@ class NcgribDecoder(): # Special case handling for specific PDS Templates if pdsTemplateNumber == 1 or pdsTemplateNumber == 11: - model.setTypeEnsemble(Integer(pdsTemplate[15])) - model.setPerturbationNumber(Integer(pdsTemplate[16])) + pdst15 = pdsTemplate[15] + model.setTypeEnsemble(Integer(pdst15)) + + # Use the following codes with correct grib headers + # print "Type of Ensemble Forecast: ", pdst15, " perturbation number: ", pdsTemplate[16] + #if ( pdst15 == 0 or self.fileName.find ('ctl1') != -1 ): + # self.derived = 'ctl1' + #elif ( pdst15 == 1 or self.fileName.find ('ctl2') != -1 ): + # self.derived = 'ctl2' + #elif pdst15 == 2: + # self.derived = 'n' + # to do + #elif pdst15 == 3: + # self.derived = 'p' + # To do + # set perturbation number when code value = 2/3/192 to avoid 0 + + if pdst15 == 2 or pdst15 == 3 or pdst15 == 192: + model.setPerturbationNumber(str(pdsTemplate[16])) + model.setNumForecasts(Integer(pdsTemplate[17])) if pdsTemplateNumber == 11: @@ -716,14 +734,25 @@ class NcgribDecoder(): derivedForecast = pdsTemplate[15] if (derivedForecast == 0 or derivedForecast == 1 or derivedForecast == 6): - parameterAbbreviation= parameterAbbreviation+"mean" + # parameterAbbreviation= parameterAbbreviation+"mean" self.derived = 'mean' - elif (derivedForecast >= 2 and derivedForecast <= 5 ): - parameterAbbreviation= parameterAbbreviation+"sprd" + elif (derivedForecast == 2 or derivedForecast == 3 ): + # parameterAbbreviation= parameterAbbreviation+"sprd" self.derived = 'sprd' elif (derivedForecast >= 193 and derivedForecast <= 195 ): - parameterAbbreviation= parameterAbbreviation+"prob" + # parameterAbbreviation= parameterAbbreviation+"prob" self.derived = 'prob' + + # Use the following codes with correct grib headers + # if (derivedForecast >= 192 and derivedForecast <= 195 ): + #if ( derivedForecast == 193 or self.fileName.find ('10p') != -1): + # self.derived = '10p' + #elif ( derivedForecast == 194 or self.fileName.find ('50p') != -1): + # self.derived = '50p' + #elif ( derivedForecast == 195 or self.fileName.find ('90p') != -1): + # self.derived = '90p' + #elif ( derivedForecast == 192 or self.fileName.find ('mode') != -1): + # self.derived = 'mode' model.setTypeEnsemble(Integer(pdsTemplate[15])) model.setNumForecasts(Integer(pdsTemplate[16])) @@ -1412,7 +1441,7 @@ class NcgribDecoder(): gridid = model.getGridid() process = model.getGenprocess() - gridModel = NcgribModelLookup.getInstance().getModel(center, subcenter, gridid, process) + gridModel = NcgribModelLookup.getInstance().getModel(center, subcenter, gridid, process, fileName, model) if gridModel is None: name = "NewGrid:" + str(center) + ":" + str(subcenter) + ":" + str(process) + ":" + gridid @@ -1420,33 +1449,31 @@ class NcgribDecoder(): hurricane = tokens[0] basin = hurricane[-1] trackno = hurricane[-3:-1] - if trackno.isdigit() or tokens[2] =="firewxnest": + if trackno.isdigit() or tokens[2] =="firewxnest" or tokens[2] == "hysplit": if trackno.isdigit(): basins = "lewcs" if basin in basins: #name = "GHM:" + str(center) + ":" + str(subcenter) + ":" + str(process) + ":" + gridid #hurricaneName = hurricane[:len(hurricane)-3] - name = "GHM" + name = "ghm" if tokens[2] == "gribn3": - name = "GHMNEST" + name = "ghmNest" elif tokens[2] == "grib6th": - name = "GHM6TH" + name = "ghm6th" elif tokens[2] == "hwrfprs_n": - name = "HWRFNEST" + name = "hwrfNest" elif tokens[2] == "hwrfprs_p": - name = "HWRF" - else: - name = "NAMFIREWX" + name = "hwrf" + elif tokens[2] == "firewxnest": + name = "fireWxNest" + + else: + name = "hysplit" NcgribModelLookup.getInstance().setModel(center, subcenter, gridid, process, name) - gridModel = NcgribModelLookup.getInstance().getModel(center, subcenter, gridid, process) + gridModel = NcgribModelLookup.getInstance().getModel(center, subcenter, gridid, process, filename) #name = gridModel.getName() else: name = gridModel.getName() - if name == "GEFS" : - tokens = fileName.split(".") - gefc = tokens[0] - if gefc[:3] == "gec": - name = "GEFC" model.setModelName(name) @@ -1527,18 +1554,35 @@ class NcgribDecoder(): if g2varsId > 0 : parm = Grib2VarsTableLookup.getVarGnam(discipline, category, parameterId, pdt) modelName = record.getModelName() - if self.derived == 'mean': - parm = parm + "ENMW" - if modelName.find('MEAN') == -1: - modelName = modelName +"MEAN" - elif self.derived == 'sprd': - parm = parm + "ENSA" - if modelName.find('SPREAD') == -1 : - modelName = modelName +"SPREAD" - elif self.derived == 'prob': - parm = parm + "PROB" - if modelName.find ('PROB') == -1: - modelName = modelName +"PROB" + #if self.derived == 'mean': + # parm = parm + "ENMW" + # if modelName.find('Mean') == -1: + # modelName = modelName +"Mean" + #if self.derived == 'sprd': + # parm = parm + "ENSA" + # if modelName.find('Spread') == -1 : + # modelName = modelName +"Spread" + #elif self.derived == 'prob': + # if modelName.find('PROB') == -1 : + # modelName = modelName +"PROB" + #elif self.derived == 'mode': + #parm = parm + "ENMO" + # if modelName.find('MODE') == -1 : + # modelName = modelName +"MODE" + #elif self.derived == '10p': + # parm = parm + "PROB" + # if modelName.find ('10P') == -1: + # modelName = modelName +"10P" + #elif self.derived == '50p': + # if modelName.find ('50P') == -1: + # modelName = modelName + "50P" + #elif self.derived == '90p': + # if modelName.find ('90P') == -1: + # modelName = modelName + "90P" + #elif self.derived == 'ctl1' or self.derived == 'ctl2': + # if modelName.find ('CTL') == -1: + # modelName = modelName + self.derived + record.setModelName(modelName) record.getModelInfo().setModelName(modelName) diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/gov.noaa.nws.ncep.edex.plugin.ncgrib.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/gov.noaa.nws.ncep.edex.plugin.ncgrib.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/Ncgrib1Decoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/Ncgrib1Decoder.java index 6205dd9227..6554978af6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/Ncgrib1Decoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/Ncgrib1Decoder.java @@ -62,9 +62,9 @@ import gov.noaa.nws.ncep.common.dataplugin.ncgrib.spatial.projections.MercatorNc import gov.noaa.nws.ncep.common.dataplugin.ncgrib.spatial.projections.PolarStereoNcgridCoverage; import gov.noaa.nws.ncep.common.dataplugin.ncgrib.subgrid.SubNcgrid; import gov.noaa.nws.ncep.common.dataplugin.ncgrib.util.NcgridModel; -import gov.noaa.nws.ncep.edex.util.grib2vcrd.Grib2VcrdTableLookup; +import gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd; +import gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable; import gov.noaa.nws.ncep.edex.util.grib2vars.Grib2VarsTableLookup; -import gov.noaa.nws.ncep.edex.util.grib2vcrd.Grib2Vcrd; import com.raytheon.edex.util.Util; import com.raytheon.uf.common.comm.CommunicationException; @@ -97,6 +97,7 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory; * 3/11/10 4758 bphillip Initial Creation * 9/08/10 X. Guo Add new column * 11/02/11 X. Guo Check octet size for isEnsmble() + * 3/2012 T. Lee Changed perturbation number to String * * * @@ -113,7 +114,7 @@ public class Ncgrib1Decoder extends AbstractDecoder { /** Set of Time range types for accumulations and averages */ private static final Set AVG_ACCUM_LIST = new HashSet(); - private String traceId = ""; + //private String traceId = ""; private NcgribDao dao; private String fileName=""; @@ -126,8 +127,8 @@ public class Ncgrib1Decoder extends AbstractDecoder { private static final int[] fourtyTwo = new int[] { 1, 2, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 }; - private static final int[] perturbation = new int[] { 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12 }; + private static final String[] perturbation = new String[] { "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10", "11", "12" }; static { AVG_ACCUM_LIST.add(3); @@ -262,8 +263,7 @@ public class Ncgrib1Decoder extends AbstractDecoder { /* * Decodes the parameter information from the record. An attempt is - * first made to map the gribimport gov.noaa.nws.ncep.common.dataplugin.ncgrib.subgrid.SubNcgrid; - 1 parameter to the equivalent grib 2 + * first made to map the grib 1 parameter to the equivalent grib 2 * parameter. If this cannot be successfully executed, the grib 1 * parameter will be used from the parameter tables contained in the * unidata decoder. @@ -329,7 +329,7 @@ public class Ncgrib1Decoder extends AbstractDecoder { // rcg: added code to get perturbation int pos41 = pdsVars.getOctet(41); int pos42 = pdsVars.getOctet(42); - int pert = pdsVars.getID(); + String pert = String.valueOf(pdsVars.getID()); for (int i = 0; i < perturbation.length; i++) { if (pos41 == fourtyOne[i] && pos42 == fourtyTwo[i]) { pert = perturbation[i]; @@ -348,6 +348,11 @@ public class Ncgrib1Decoder extends AbstractDecoder { createModelName(model); // Get the level information + float glevel1 = (float) pdsVars.getLevelValue1(); + float glevel2 = (float) pdsVars.getLevelValue2(); + if ( vcrdid == 117 ) { + if ( glevel1 >= 32768 ) glevel1 = 32768 - glevel1; + } float[] levelMetadata = this.convertGrib1LevelInfo(pdsVars .getLevelType1(), (float) pdsVars .getLevelValue1(), pdsVars @@ -356,6 +361,8 @@ public class Ncgrib1Decoder extends AbstractDecoder { getLevelInfo(model, centerid, subcenterid, levelMetadata[0], levelMetadata[1], levelMetadata[2], levelMetadata[3], levelMetadata[4], levelMetadata[5]); + //int vcrd1 = (int)levelMetadata[0]; + int vcrd2 = (int)levelMetadata[3]; // Construct the DataTime GregorianCalendar refTime = new GregorianCalendar(); @@ -478,42 +485,40 @@ public class Ncgrib1Decoder extends AbstractDecoder { retVal.setCategory(category); retVal.setParameterId(pid); retVal.setProcessedDataType(pdsVars.getGenProcessId()); - retVal.setDecodedLevel1( (float)model.getLevel().getLevelonevalue()); - retVal.setDecodedLevel2((float)model.getLevel().getLeveltwovalue()); + retVal.setDecodedLevel1((float)pdsVars.getLevelValue1()); + retVal.setDecodedLevel2((float)pdsVars.getLevelValue2()); retVal.setVcrdId1(vcrdid); retVal.setVcrdId2(vcrdid); retVal.setGridVersion(1); String vcord = "NONE"; - String scale = ""; - //TODO need to change this call to read the GRIB1 version of the vcrd table - // instead of the GRIB2 version... - Grib2Vcrd grib2Vcrd = Grib2VcrdTableLookup.getGrib2VcrdByGrib1VcrdId (vcrdid); - if ( grib2Vcrd != null ) { - vcord = grib2Vcrd.getGnam(); - scale = grib2Vcrd.getScale(); + + Grib1Vcrd grib1Vcrd = Grib1VcrdTable.getGrib1VcrdById(vcrdid); + if ( grib1Vcrd != null ) { + + vcord = grib1Vcrd.getGnam(); + double scale = Double.parseDouble( grib1Vcrd.getScale() ); + scale = Math.pow( 10., scale); - float dscale = (float)Math.pow ( 10, Double.parseDouble(scale)); - float glevel1 = retVal.getDecodedLevel1(); - if (glevel1 != 0 && dscale != 1 ) { - retVal.setGlevel1(Math.round(glevel1 * dscale)); + if (glevel1 != 0 && scale != 1 ) { + retVal.setGlevel1((int)Math.round(glevel1 * scale)); } else { retVal.setGlevel1(Math.round(glevel1)); } - float glevel2 = retVal.getDecodedLevel2(); - if ( glevel2 == -999999. ) { + if ( vcrd2 == 255 ) { retVal.setGlevel2(-9999); } else { - if (glevel2 != 0 && dscale != 1 ) { - retVal.setGlevel2(Math.round(glevel2 * dscale)); + if (glevel2 != 0 && scale != 1 ) { + retVal.setGlevel2((int)Math.round(glevel2 * scale)); } else { retVal.setGlevel2( Math.round(glevel2) ); } } + } else { retVal.setGlevel1((int)model.getLevel().getLevelonevalue()); @@ -907,8 +912,9 @@ public class Ncgrib1Decoder extends AbstractDecoder { String gridid = model.getGridid(); int process = model.getGenprocess(); + String template = model.getTemplate(); NcgridModel gridModel = NcgribModelLookup.getInstance().getModel(center, - subcenter, gridid, process); + subcenter, gridid, process, template, model); String name = null; if (gridModel == null) { name = "UnknownModel:" + String.valueOf(center) + ":" @@ -1194,7 +1200,7 @@ public class Ncgrib1Decoder extends AbstractDecoder { * The level two scale factor * @param value2 * The level two value - * @throws GribException + * @throws GribException */ private void getLevelInfo(NcgribModel model, int centerID, int subcenterID, float levelOneNumber, float scaleFactor1, float value1, @@ -1249,12 +1255,13 @@ public class Ncgrib1Decoder extends AbstractDecoder { } } try { - Level level = LevelFactory.getInstance().getLevel(levelName, - levelOneValue, levelTwoValue, levelUnit); - model.setLevel(level); + Level level = LevelFactory.getInstance().getLevel(levelName, + levelOneValue, levelTwoValue, levelUnit); + model.setLevel(level); } catch (CommunicationException e) { throw new GribException("Error loading level.", e); } + } /** diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/NcgribDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/NcgribDecoder.java index 219a3986d5..a7d003422a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/NcgribDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/NcgribDecoder.java @@ -21,13 +21,23 @@ package gov.noaa.nws.ncep.edex.plugin.ncgrib; import java.io.File; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import ucar.grib.GribChecker; +import ucar.grib.grib1.Grib1Input; +import ucar.grib.grib1.Grib1Record; +import ucar.grib.grib2.Grib2Input; +import ucar.grib.grib2.Grib2Record; import ucar.unidata.io.RandomAccessFile; -import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +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.edex.python.decoder.PythonDecoder; import gov.noaa.nws.ncep.common.dataplugin.ncgrib.NcgribRecord; @@ -43,6 +53,7 @@ import gov.noaa.nws.ncep.edex.plugin.ncgrib.util.TableTimeStamp; * ------------ ---------- ----------- -------------------------- * 3/12/10 4758 bphillip Initial creation * 10/13/10 276 llin Modified for NC GRIB. + * 01/19/12 xguo Split large files * * * @author njensen @@ -51,6 +62,12 @@ import gov.noaa.nws.ncep.edex.plugin.ncgrib.util.TableTimeStamp; public class NcgribDecoder { + private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(NcgribDecoder.class); + + private static final long TEN_MEGABYTES = 10485760; + + private static final long FIVE_MEGABYTES = 5242880; + public NcgribDecoder() { } @@ -60,15 +77,81 @@ public class NcgribDecoder { NcgribRecord[] records = null; RandomAccessFile raf = null; int edition = 0; + List recordLengths = new ArrayList(); try { - raf = new RandomAccessFile(file.getAbsolutePath(), "r"); - if (raf == null){ - throw new FileNotFoundException("Grib file does not exist ["+file.getAbsolutePath()+"]"); - } + raf = new RandomAccessFile(file.getAbsolutePath(), "r"); raf.order(RandomAccessFile.BIG_ENDIAN); edition = GribChecker.getEdition(raf); - } catch (IOException e) { - throw new GribException("Error checking ncgrib version", e); + + // If the file is greater than ten megs, split it + if (file.length() > TEN_MEGABYTES) { + raf.seek(0); + if (edition == 1) { + Grib1Input g1i = new Grib1Input(raf); + g1i.scan(false, false); + List gribRecords = g1i.getRecords(); + for (int i = 0; i < gribRecords.size(); i++) { + recordLengths.add(gribRecords.get(i).getIs() + .getGribLength()); + } + } else if (edition == 2) { + Grib2Input g2i = new Grib2Input(raf); + try { + g2i.scan(false, false); + } catch (Exception e) { + throw new Exception( + "Error determining grib record count.", e); + } + List gribRecords = g2i.getRecords(); + + for (int i = 0; i < gribRecords.size(); i++) { + recordLengths.add(gribRecords.get(i).getIs() + .getGribLength()); + } + } + + if (recordLengths.size() > 1) { + raf.seek(0); + splitFile(file.getName(), raf, recordLengths); + try { + if (raf != null) { + raf.close(); + } + } catch (IOException e) { + throw new GribException("", e); + } + return new NcgribRecord[] {}; + } + } + if (edition == 1) { + records = new Ncgrib1Decoder().decode(file.getAbsolutePath()); + } else if (edition == 2) { + //System.out.println("In decoder class edition 2, to update xml tables if necessary..."); + TableTimeStamp.updateXmlTables(); + PythonDecoder pythonDecoder = new PythonDecoder(); + pythonDecoder.setPluginName("ncgrib"); + pythonDecoder.setPluginFQN("gov.noaa.nws.ncep.edex.plugin.ncgrib"); + pythonDecoder.setModuleName("NcgribDecoder"); + pythonDecoder.setRecordClassname(NcgribRecord.class.toString()); + pythonDecoder.setCache(true); + try { + PluginDataObject[] ncpdos = pythonDecoder.decode(file); + records = new NcgribRecord[ncpdos.length]; + for (int i = 0; i < ncpdos.length; i++) { + records[i] = (NcgribRecord) ncpdos[i]; + } + } catch (Exception e) { + throw new GribException("Error decoding ncgrib file!", e); + } + + } else { + statusHandler.handle(Priority.ERROR,"Unknown ncgrib version detected [" + edition + + "]"); + } + } catch (Exception e) { + statusHandler.handle(Priority.ERROR, "Failed to decode file: [" + + file.getAbsolutePath() + "]", e); + records = new NcgribRecord[0]; } finally { try { if (raf != null) { @@ -78,33 +161,104 @@ public class NcgribDecoder { throw new GribException("", e); } } - - if (edition == 1) { - records = new Ncgrib1Decoder().decode(file.getAbsolutePath()); - } else if (edition == 2) { - //System.out.println("In decoder class edition 2, to update xml tables if necessary..."); - TableTimeStamp.updateXmlTables(); - PythonDecoder pythonDecoder = new PythonDecoder(); - pythonDecoder.setPluginName("ncgrib"); - pythonDecoder.setPluginFQN("gov.noaa.nws.ncep.edex.plugin.ncgrib"); - pythonDecoder.setModuleName("NcgribDecoder"); - pythonDecoder.setRecordClassname(NcgribRecord.class.toString()); - pythonDecoder.setCache(true); - try { - PluginDataObject[] ncpdos = pythonDecoder.decode(file); - records = new NcgribRecord[ncpdos.length]; - for (int i = 0; i < ncpdos.length; i++) { - records[i] = (NcgribRecord) ncpdos[i]; - } - } catch (Exception e) { - throw new GribException("Error decoding ncgrib file!", e); - } - } else { - throw new GribException("Unknown ncgrib version detected [" + edition - + "]"); - } - + return records; } + + /** + * Splits a collective file into individual records. + * + * @param fileName + * The name of the file being split + * @param raf + * The Random Access File object + * @param sizes + * The sizes of the individual records inside the collection + * @throws IOException + */ + private void splitFile(String fileName, RandomAccessFile raf, + List sizes) throws IOException { + FileOutputStream out = null; + byte[] transfer = null; + long fileSize = 0,seekLoc; + int num = 0; + for (int i = 0; i < sizes.size(); i++) { + fileSize += sizes.get(i).longValue(); + if ( (i < sizes.size() -1 ) && + ((fileSize + sizes.get(i+1).longValue())>FIVE_MEGABYTES)) { + num ++; + seekLoc = seekRecordStart(raf, raf.length()); + if ( seekLoc < 0 ) return; + transfer = new byte[(int) fileSize]; + raf.seek(seekLoc); + raf.read(transfer); + + try { + out = new FileOutputStream(System.getProperty("edex.home") + + "/data/sbn/ncgrib/" + fileName + "_" + num); + out.write(transfer); + out.close(); + } finally { + if (out != null) { + out.close(); + } + } + fileSize = 0; + } + } + if ( fileSize > 0 ) { + num ++; + seekLoc = seekRecordStart(raf, raf.length()); + if ( seekLoc < 0 ) return; + transfer = new byte[(int) fileSize]; + raf.seek(seekLoc); + raf.read(transfer); + + try { + out = new FileOutputStream(System.getProperty("edex.home") + + "/data/sbn/ncgrib/" + fileName + "_" + num); + out.write(transfer); + out.close(); + } finally { + if (out != null) { + out.close(); + } + } + } + } + /** + * Moves the filepointer on the random access file to the beginning of the + * next grib record in the file + * + * @param raf + * The random access file + * @param fileLength + * The total length of the file + * @return The index to the next grib record in the collection. -1 is + * returned if there are no more records in the file + * @throws IOException + */ + private long seekRecordStart(RandomAccessFile raf, long fileLength) + throws IOException { + int matches = 0; + while (raf.getFilePointer() < fileLength) { + char c = (char) raf.readByte(); + if (c == 'G') { + matches = 1; + } else if ((c == 'R') && (matches == 1)) { + matches = 2; + } else if ((c == 'I') && (matches == 2)) { + matches = 3; + } else if ((c == 'B') && (matches == 3)) { + matches = 4; + // Subtract 4 because we want the absolute beginning of the grib + // file + return raf.getFilePointer() - 4; + } else { + matches = 0; + } + } + return -1; + } } diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcMercatorDao.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcMercatorDao.java index c06d742572..4377d6d5cc 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcMercatorDao.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcMercatorDao.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcPolarStereoDao.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcPolarStereoDao.java index a344c3a679..4c92e5c75c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcPolarStereoDao.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcPolarStereoDao.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcgribDao.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcgribDao.java index 048078a59b..adedb0bf82 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcgribDao.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/dao/NcgribDao.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ @@ -112,70 +112,70 @@ public class NcgribDao extends NcepDefaultPluginDao { this("ncgrib"); } - public void purgeExpiredData() { - QueryResult models = null; - try { - models = (QueryResult) executeNativeSql(MODEL_QUERY); - } catch (DataAccessLayerException e) { - logger.error("Error purging ncgrib data. Unable to get models", e); - } - - String currentModel = null; - for (int i = 0; i < models.getResultCount(); i++) { - currentModel = (String) models.getRowColumnValue(i, 0); - QueryResult refTimes = null; - try { - refTimes = (QueryResult) executeNativeSql(REFTIME_QUERY - .replace("?", currentModel)); - } catch (DataAccessLayerException e) { - logger - .error("Error purging ncgrib data. Unable to get reference times for model [" - + currentModel + "]"); - continue; - } - - // FIXME: Add rules for purging here instead of just keeping 2 - // runs - List filesKept = new ArrayList(); - File modelDirectory = new File(PLUGIN_HDF5_DIR + File.separator - + currentModel); - - for (int j = 0; j < refTimes.getResultCount(); j++) { - Date time = (Date) refTimes.getRowColumnValue(j, 0); - File hdf5File = new File(modelDirectory.getAbsolutePath() - + File.separator - + ((NcgribPathProvider) pathProvider).formatTime(time) - + ".h5"); - - if (j < MODELCOUNT) { - filesKept.add(hdf5File.getAbsolutePath()); - continue; - } - - try { - purgeDb(time, currentModel); - } catch (DataAccessLayerException e) { - logger.error("Error purging database for ncgrib model [" - + currentModel + "]"); - } - } - - List files = FileUtil.listFiles(modelDirectory, fileFilter, - false); - - for (File file : files) { - if (!filesKept.contains(file.getAbsolutePath())) { - if (!file.delete()) { - logger - .error("Error purging HDF5 files for ncgrib model [" - + currentModel + "]"); - } - } - } - - } - - } +// public void purgeExpiredData() { +// QueryResult models = null; +// try { +// models = (QueryResult) executeNativeSql(MODEL_QUERY); +// } catch (DataAccessLayerException e) { +// logger.error("Error purging ncgrib data. Unable to get models", e); +// } +// +// String currentModel = null; +// for (int i = 0; i < models.getResultCount(); i++) { +// currentModel = (String) models.getRowColumnValue(i, 0); +// QueryResult refTimes = null; +// try { +// refTimes = (QueryResult) executeNativeSql(REFTIME_QUERY +// .replace("?", currentModel)); +// } catch (DataAccessLayerException e) { +// logger +// .error("Error purging ncgrib data. Unable to get reference times for model [" +// + currentModel + "]"); +// continue; +// } +// +// // FIXME: Add rules for purging here instead of just keeping 2 +// // runs +// List filesKept = new ArrayList(); +// File modelDirectory = new File(PLUGIN_HDF5_DIR + File.separator +// + currentModel); +// +// for (int j = 0; j < refTimes.getResultCount(); j++) { +// Date time = (Date) refTimes.getRowColumnValue(j, 0); +// File hdf5File = new File(modelDirectory.getAbsolutePath() +// + File.separator +// + ((NcgribPathProvider) pathProvider).formatTime(time) +// + ".h5"); +// +// if (j < MODELCOUNT) { +// filesKept.add(hdf5File.getAbsolutePath()); +// continue; +// } +// +// try { +// purgeDb(time, currentModel); +// } catch (DataAccessLayerException e) { +// logger.error("Error purging database for ncgrib model [" +// + currentModel + "]"); +// } +// } +// +// List files = FileUtil.listFiles(modelDirectory, fileFilter, +// false); +// +// for (File file : files) { +// if (!filesKept.contains(file.getAbsolutePath())) { +// if (!file.delete()) { +// logger +// .error("Error purging HDF5 files for ncgrib model [" +// + currentModel + "]"); +// } +// } +// } +// +// } +// +// } private int purgeDb(final Date date, String modelName) throws DataAccessLayerException { diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/handler/GetNcCoverageHandler.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/handler/GetNcCoverageHandler.java index 59d2349d4f..433a72e364 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/handler/GetNcCoverageHandler.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/handler/GetNcCoverageHandler.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/notify/NcgribNotifyTransform.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/notify/NcgribNotifyTransform.java index 25f39e1908..b228e65bfe 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/notify/NcgribNotifyTransform.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/notify/NcgribNotifyTransform.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/spatial/NcgribSpatialCache.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/spatial/NcgribSpatialCache.java index 989e19ea7d..0b417ebc06 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/spatial/NcgribSpatialCache.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/spatial/NcgribSpatialCache.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/NcgribModelCache.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/NcgribModelCache.java index 329c43375b..286d5e836d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/NcgribModelCache.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/NcgribModelCache.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/TableTimeStamp.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/TableTimeStamp.java index 9a25c2c05c..98bb3d41f6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/TableTimeStamp.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/plugin/ncgrib/util/TableTimeStamp.java @@ -1,166 +1,166 @@ -/** - * TableTimeStamp - A Java class to update some known - * ncep grib2 vars.xml and vcrd.xml and ncgribmodel.xml. - * - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 10/2010 276 L. Lin Initial creation - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.ncgrib.util; - -import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; -import gov.noaa.nws.ncep.edex.util.grib2vars.Grib2VarsTableLookup; -import gov.noaa.nws.ncep.edex.util.grib2vcrd.Grib2VcrdTableLookup; -import gov.noaa.nws.ncep.edex.util.ncgrib.NcgribModelLookup; - -import java.io.File; - -import com.raytheon.uf.common.localization.IPathManager; -import com.raytheon.uf.common.localization.LocalizationContext; -import com.raytheon.uf.common.localization.PathManagerFactory; - -public class TableTimeStamp { - - private static long ncepVarsTimeStamp; - - private static long ncepVcrdTimeStamp; - - private static long ncepNcgribModelTimeStamp; - - public TableTimeStamp() { - } - - public static synchronized void updateXmlTables() throws GribException { - - long ncepVarsFileTime = 0; - long ncepVcrdFileTime = 0; - long ncepGribModelFileTime = 0; - - /* - * Gets all predefined found in the utility directory - */ - IPathManager pathMgr = PathManagerFactory.getPathManager(); - LocalizationContext commonStaticBase = pathMgr.getContext( - LocalizationContext.LocalizationType.COMMON_STATIC, - LocalizationContext.LocalizationLevel.BASE); - - /* check NCEP VARS control file */ - String ncepVarsPath = ""; - - try { - ncepVarsPath = pathMgr.getFile(commonStaticBase, - "ncgrid" + File.separator + "grib2vars.xml") - .getCanonicalPath(); - - } catch (Exception e) { - throw new GribException( - "Unable to unmarshal ncep grib2vars.xml file"); - } - - File ncepVarsTable = new File(ncepVarsPath); - try { - if (ncepVarsTable.exists()) { - ncepVarsFileTime = ncepVarsTable.lastModified(); - if (ncepVarsFileTime != getNcepVarsTimeStamp()) { - System.out - .println("NCEP grib2vars.xml has been modified or the first time, so load it ..."); - Grib2VarsTableLookup.readG2varsTable(); - setNcepVarsTimeStamp(ncepVarsFileTime); - } - } - } catch (Exception e) { - throw new GribException("Unable to read ncep grib2vars file"); - } - - /* check NCEP VCRD control file */ - String ncepVcrdPath = ""; - - try { - ncepVcrdPath = pathMgr.getFile(commonStaticBase, - "ncgrid" + File.separator + "grib2vcrd.xml") - .getCanonicalPath(); - - } catch (Exception e) { - throw new GribException( - "Unable to unmarshal ncep grib2vcrd.xml file"); - } - - File ncepVcrdTable = new File(ncepVcrdPath); - try { - if (ncepVcrdTable.exists()) { - ncepVcrdFileTime = ncepVcrdTable.lastModified(); - if (ncepVcrdFileTime != getNcepVcrdTimeStamp()) { - System.out - .println("NCEP grib2vcrd.xml has been modified or the first time, so load it ..."); - Grib2VcrdTableLookup.readG2vcrdTable(); - setNcepVcrdTimeStamp(ncepVcrdFileTime); - } - } - } catch (Exception e) { - throw new GribException("Unable to read ncep grib2vcrd file"); - } - - /* check NCEP Grib Model control file */ - String ncepGridModelPath = ""; - - try { - ncepGridModelPath = pathMgr.getFile(commonStaticBase, - "ncgrid" + File.separator + "ncgribModels.xml") - .getCanonicalPath(); - - } catch (Exception e) { - throw new GribException( - "Unable to unmarshal ncep ncgribModels.xml file"); - } - - File ncepGribModelTable = new File(ncepGridModelPath); - try { - if (ncepGribModelTable.exists()) { - ncepGribModelFileTime = ncepGribModelTable.lastModified(); - if (ncepGribModelFileTime != getNcepNcgribModelTimeStamp()) { - System.out - .println("NCEP ncgribModels.xml has been modified or the first time, so load it ..."); - NcgribModelLookup.ReloadInstance(); - setNcepNcgribModelTimeStamp(ncepGribModelFileTime); - } - } - } catch (Exception e) { - throw new GribException("Unable to read ncep grib2vcrd file"); - } - - } - - public static long getNcepVarsTimeStamp() { - return ncepVarsTimeStamp; - } - - public static void setNcepVarsTimeStamp(long ncepVarsTimeStamp) { - TableTimeStamp.ncepVarsTimeStamp = ncepVarsTimeStamp; - } - - public static long getNcepVcrdTimeStamp() { - return ncepVcrdTimeStamp; - } - - public static void setNcepVcrdTimeStamp(long ncepVcrdTimeStamp) { - TableTimeStamp.ncepVcrdTimeStamp = ncepVcrdTimeStamp; - } - - public static long getNcepNcgribModelTimeStamp() { - return ncepNcgribModelTimeStamp; - } - - public static void setNcepNcgribModelTimeStamp(long ncepNcgribModelTimeStamp) { - TableTimeStamp.ncepNcgribModelTimeStamp = ncepNcgribModelTimeStamp; - } - -} +/** + * TableTimeStamp - A Java class to update some known + * ncep grib2 vars.xml and vcrd.xml and ncgribmodel.xml. + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 10/2010 276 L. Lin Initial creation + * + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.ncgrib.util; + +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; +import gov.noaa.nws.ncep.edex.util.grib2vars.Grib2VarsTableLookup; +import gov.noaa.nws.ncep.edex.util.grib2vcrd.Grib2VcrdTableLookup; +import gov.noaa.nws.ncep.edex.util.ncgrib.NcgribModelLookup; + +import java.io.File; + +import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.PathManagerFactory; + +public class TableTimeStamp { + + private static long ncepVarsTimeStamp; + + private static long ncepVcrdTimeStamp; + + private static long ncepNcgribModelTimeStamp; + + public TableTimeStamp() { + } + + public static synchronized void updateXmlTables() throws GribException { + + long ncepVarsFileTime = 0; + long ncepVcrdFileTime = 0; + long ncepGribModelFileTime = 0; + + /* + * Gets all predefined found in the utility directory + */ + IPathManager pathMgr = PathManagerFactory.getPathManager(); + LocalizationContext commonStaticBase = pathMgr.getContext( + LocalizationContext.LocalizationType.COMMON_STATIC, + LocalizationContext.LocalizationLevel.BASE); + + /* check NCEP VARS control file */ + String ncepVarsPath = ""; + + try { + ncepVarsPath = pathMgr.getFile(commonStaticBase, + "ncgrid" + File.separator + "grib2vars.xml") + .getCanonicalPath(); + + } catch (Exception e) { + throw new GribException( + "Unable to unmarshal ncep grib2vars.xml file"); + } + + File ncepVarsTable = new File(ncepVarsPath); + try { + if (ncepVarsTable.exists()) { + ncepVarsFileTime = ncepVarsTable.lastModified(); + if (ncepVarsFileTime != getNcepVarsTimeStamp()) { + System.out + .println("NCEP grib2vars.xml has been modified or the first time, so load it ..."); + Grib2VarsTableLookup.readG2varsTable(); + setNcepVarsTimeStamp(ncepVarsFileTime); + } + } + } catch (Exception e) { + throw new GribException("Unable to read ncep grib2vars file"); + } + + /* check NCEP VCRD control file */ + String ncepVcrdPath = ""; + + try { + ncepVcrdPath = pathMgr.getFile(commonStaticBase, + "ncgrid" + File.separator + "grib2vcrd.xml") + .getCanonicalPath(); + + } catch (Exception e) { + throw new GribException( + "Unable to unmarshal ncep grib2vcrd.xml file"); + } + + File ncepVcrdTable = new File(ncepVcrdPath); + try { + if (ncepVcrdTable.exists()) { + ncepVcrdFileTime = ncepVcrdTable.lastModified(); + if (ncepVcrdFileTime != getNcepVcrdTimeStamp()) { + System.out + .println("NCEP grib2vcrd.xml has been modified or the first time, so load it ..."); + Grib2VcrdTableLookup.readG2vcrdTable(); + setNcepVcrdTimeStamp(ncepVcrdFileTime); + } + } + } catch (Exception e) { + throw new GribException("Unable to read ncep grib2vcrd file"); + } + + /* check NCEP Grib Model control file */ + String ncepGridModelPath = ""; + + try { + ncepGridModelPath = pathMgr.getFile(commonStaticBase, + "ncgrid" + File.separator + "ncgribModels.xml") + .getCanonicalPath(); + + } catch (Exception e) { + throw new GribException( + "Unable to unmarshal ncep ncgribModels.xml file"); + } + + File ncepGribModelTable = new File(ncepGridModelPath); + try { + if (ncepGribModelTable.exists()) { + ncepGribModelFileTime = ncepGribModelTable.lastModified(); + if (ncepGribModelFileTime != getNcepNcgribModelTimeStamp()) { + System.out + .println("NCEP ncgribModels.xml has been modified or the first time, so load it ..."); + NcgribModelLookup.ReloadInstance(); + setNcepNcgribModelTimeStamp(ncepGribModelFileTime); + } + } + } catch (Exception e) { + throw new GribException("Unable to read ncep grib2vcrd file"); + } + + } + + public static long getNcepVarsTimeStamp() { + return ncepVarsTimeStamp; + } + + public static void setNcepVarsTimeStamp(long ncepVarsTimeStamp) { + TableTimeStamp.ncepVarsTimeStamp = ncepVarsTimeStamp; + } + + public static long getNcepVcrdTimeStamp() { + return ncepVcrdTimeStamp; + } + + public static void setNcepVcrdTimeStamp(long ncepVcrdTimeStamp) { + TableTimeStamp.ncepVcrdTimeStamp = ncepVcrdTimeStamp; + } + + public static long getNcepNcgribModelTimeStamp() { + return ncepNcgribModelTimeStamp; + } + + public static void setNcepNcgribModelTimeStamp(long ncepNcgribModelTimeStamp) { + TableTimeStamp.ncepNcgribModelTimeStamp = ncepNcgribModelTimeStamp; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/uengine/tasks/ncgrib/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/uengine/tasks/ncgrib/package-info.java index c80ab35d77..41b91513e7 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/uengine/tasks/ncgrib/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/uengine/tasks/ncgrib/package-info.java @@ -1,4 +1,4 @@ -/** - * Contains JavaScript oriented μEngine tasks specific to gribs - */ +/** + * Contains JavaScript oriented μEngine tasks specific to gribs + */ package gov.noaa.nws.ncep.edex.uengine.tasks.ncgrib; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1Vcrd.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1Vcrd.java new file mode 100644 index 0000000000..dd7084af12 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1Vcrd.java @@ -0,0 +1,191 @@ +/** + * This file was generated by the JavaTM Architecture for XML Binding(JAXB) + * Reference Implementation, vJAXB 2.1.10 in JDK 6 + * See http://java.sun.com/xml/jaxb + * any modifications to this file will be lost upon recompilation of the source schema + * Generated on: 2010.09.10 at 11:48:39 AM EDT + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 10/2010 276 L. Lin Initial creation + * + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.util.grib1vcrd; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +import com.raytheon.uf.common.serialization.ISerializableObject; + + +/** + *

    Java class for anonymous complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType>
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element ref="{}vcrdid1" minOccurs="0"/>
    + *         <element ref="{}name" minOccurs="0"/>
    + *         <element ref="{}units" minOccurs="0"/>
    + *         <element ref="{}gnam" minOccurs="0"/>
    + *         <element ref="{}scale" minOccurs="0"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "vcrdid", + "name", + "units", + "gnam", + "scale" +}) +@XmlRootElement(name = "grib1vcrd") +public class Grib1Vcrd implements ISerializableObject { + + protected Integer vcrdid; + protected String name; + protected String units; + protected String gnam; + protected String scale; + + /** + * Gets the value of the vcrdid property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public Integer getVcrdid() { + return vcrdid; + } + + /** + * Sets the value of the vcrdid property. + * + * @param value + * allowed object is + * {@link Integer } + * + public void setVcrdid(Integer value) { + this.vcrdid = value; + } + */ + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + public void setName(String value) { + this.name = value; + } + */ + + /** + * Gets the value of the units property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUnits() { + return units; + } + + /** + * Sets the value of the units property. + * + * @param value + * allowed object is + * {@link String } + * + public void setUnits(String value) { + this.units = value; + } + */ + + /** + * Gets the value of the gnam property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGnam() { + return gnam; + } + + /** + * Sets the value of the gnam property. + * + * @param value + * allowed object is + * {@link String } + * + public void setGnam(String value) { + this.gnam = value; + } + */ + + /** + * Gets the value of the scale property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getScale() { + return scale; + } + + /** + * Sets the value of the scale property. + * + * @param value + * allowed object is + * {@link String } + * + public void setScale(String value) { + this.scale = value; + } + */ + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1VcrdList.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1VcrdList.java new file mode 100644 index 0000000000..2ae1f70f1d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1VcrdList.java @@ -0,0 +1,76 @@ +/** + * This file was generated by the JavaTM Architecture for XML Binding(JAXB) + * Reference Implementation, vJAXB 2.1.10 in JDK 6 + * See http://java.sun.com/xml/jaxb + * any modifications to this file will be lost upon recompilation of the source schema + * Generated on: 2010.09.10 at 11:48:39 AM EDT + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 10/2010 276 L. Lin Initial creation + * + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.util.grib1vcrd; + +import java.util.ArrayList; +import java.util.List; +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.XmlType; + +import com.raytheon.uf.common.serialization.ISerializableObject; + + +/** + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "grib1Vcrd" +}) +@XmlRootElement(name = "grib1vcrdList") +public class Grib1VcrdList implements ISerializableObject { + + @XmlElement(name = "grib1vcrd") + protected List grib1Vcrd; + + /** + * Gets the value of the grib1Vcrd property. + * + *

    + * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the grib1Vcrd property. + * + *

    + * For example, to add a new item, do as follows: + *

    +     *    getGrib1Vcrd().add(newItem);
    +     * 
    + * + * + *

    + * Objects of the following type(s) are allowed in the list + * {@link Grib1Vcrd } + * + * + */ + public List getGrib1Vcrd() { + if (grib1Vcrd == null) { + grib1Vcrd = new ArrayList(); + } + return this.grib1Vcrd; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1VcrdTable.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1VcrdTable.java new file mode 100644 index 0000000000..8e4e023e35 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib1vcrd/Grib1VcrdTable.java @@ -0,0 +1,85 @@ +package gov.noaa.nws.ncep.edex.util.grib1vcrd; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.PathManagerFactory; +import com.raytheon.uf.common.serialization.SerializationException; +import com.raytheon.uf.common.serialization.SerializationUtil; + +/** + */ + +public class Grib1VcrdTable { + + private static final String file = "ncgrid" + File.separator + "grib1vcrd.xml"; + + private static Grib1VcrdList g1VcrdList; + + private static Map vcordMap = null; + + private static void readGrib1VcrdTable( String xmlFilename ) throws SerializationException{ + + g1VcrdList = (Grib1VcrdList)SerializationUtil.jaxbUnmarshalFromXmlFile(xmlFilename); + + } + + /** + * Search a g2Vcrd given a field, and search key value. + * + * @param sf + * @param key + * @return Grib2Vcrd + */ + public static Grib1Vcrd getGrib1VcrdById (int vcrdid ) { + + + synchronized (Grib1VcrdTable.class) { + if (g1VcrdList == null) { + System.out.println("INITIALIZINGVCRD!!!!!!"); + try { + String filename = findVcrdTable(); + readGrib1VcrdTable(filename); + createMapOfTable(); + } catch (Exception e) { + e.printStackTrace(); + g1VcrdList = null; + return null; + } + } + } + + if ( vcordMap.containsKey(vcrdid) ) + return vcordMap.get(vcrdid); + else + return null; + } + + private static void createMapOfTable() { + + vcordMap = new HashMap(); + + for ( Grib1Vcrd vcord : g1VcrdList.getGrib1Vcrd() ) { + vcordMap.put(vcord.getVcrdid(), vcord); + } + + } + + private static String findVcrdTable() throws IOException{ + String filename = null; + + IPathManager pathMgr = PathManagerFactory.getPathManager(); + LocalizationContext commonStaticBase = pathMgr.getContext( + LocalizationContext.LocalizationType.COMMON_STATIC, + LocalizationContext.LocalizationLevel.BASE); + + filename = pathMgr.getFile( commonStaticBase, Grib1VcrdTable.file).getCanonicalPath(); + + return filename; + } + +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsComparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsComparator.java index 24b49ef02e..7d495a6552 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsComparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsComparator.java @@ -1,56 +1,56 @@ -package gov.noaa.nws.ncep.edex.util.grib2vars; - -import java.util.Comparator; - -/** - * Comparator for Grib2Vars fields. - *

    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 10/10		276  		L. Lin	   Initial Creation
    - *                       
    - * 
    - * - * @author llin - * @version 1 - */ - -public class Grib2VarsComparator implements Comparator, IGrib2VarsField { - - private Grib2VarsField field; - - public Grib2VarsComparator(Grib2VarsField f) { - this.field = f; - } - - public int compare(Grib2Vars o1, Grib2Vars o2) { - switch (field) { - case G2VARSID: - return o1.getG2Varsid() - o2.getG2Varsid(); - case DISCIPLINE: - return o1.getDiscipline() - o2.getDiscipline(); - case CATEGORY: - return o1.getCategory() - o2.getCategory(); - case PID: - return o1.getPid() - o2.getPid(); - case PDT: - return o1.getPdt() - o2.getPdt(); - case NAME: - return o1.getName().compareToIgnoreCase(o2.getName()); - case UNITS: - return o1.getUnits().compareToIgnoreCase(o2.getUnits()); - case GNAM: - return o1.getGnam().compareToIgnoreCase(o2.getGnam()); - case SCALE: - return o1.getScale() - o2.getScale(); - case MISSING: - return o1.getMissing().compareTo(o2.getMissing()); - default: - return 0; - } - - } +package gov.noaa.nws.ncep.edex.util.grib2vars; + +import java.util.Comparator; + +/** + * Comparator for Grib2Vars fields. + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 10/10		276  		L. Lin	   Initial Creation
    + *                       
    + * 
    + * + * @author llin + * @version 1 + */ + +public class Grib2VarsComparator implements Comparator, IGrib2VarsField { + + private Grib2VarsField field; + + public Grib2VarsComparator(Grib2VarsField f) { + this.field = f; + } + + public int compare(Grib2Vars o1, Grib2Vars o2) { + switch (field) { + case G2VARSID: + return o1.getG2Varsid() - o2.getG2Varsid(); + case DISCIPLINE: + return o1.getDiscipline() - o2.getDiscipline(); + case CATEGORY: + return o1.getCategory() - o2.getCategory(); + case PID: + return o1.getPid() - o2.getPid(); + case PDT: + return o1.getPdt() - o2.getPdt(); + case NAME: + return o1.getName().compareToIgnoreCase(o2.getName()); + case UNITS: + return o1.getUnits().compareToIgnoreCase(o2.getUnits()); + case GNAM: + return o1.getGnam().compareToIgnoreCase(o2.getGnam()); + case SCALE: + return o1.getScale() - o2.getScale(); + case MISSING: + return o1.getMissing().compareTo(o2.getMissing()); + default: + return 0; + } + + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTable.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTable.java index 77827218d6..87d0c0bcd5 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTable.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTable.java @@ -1,185 +1,185 @@ -package gov.noaa.nws.ncep.edex.util.grib2vars; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - -/** - * This class reads a g2Vars table from an xml file and contains a list of g2Varss. - * This class also provide general g2Vars search functions given g2Vars field, and - * field value. - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 10/10  		276   	   	L. Lin	   Initial Creation
    - * 07/11                    X. Guo     Added getGrib2Vars4Grib1()
    - *                       
    - * 
    - * - * @author llin - * @version 1 - */ - -public class Grib2VarsTable implements IGrib2VarsField { - - private final String PACKAGE = "gov.noaa.nws.ncep.edex.util.grib2vars"; - - private List g2VarsList; - - private static Grib2VarsField last = null; - - /** - * Constructor. - * @param tableFileName - full path of the xml table file - */ - public Grib2VarsTable( String tableFileName ) { - - try{ - g2VarsList = readGrib2VarsTable( tableFileName ); - } - catch ( JAXBException exp ){ - g2VarsList = null; - exp.printStackTrace(); - } - - } - - /** - * Reads the contents of the input g2Vars table file - * @param xmlFilename - full path of the xml table name - * @return - a list of g2Varss - * @throws JAXBException - */ - private List readGrib2VarsTable( String xmlFilename ) throws JAXBException{ - - File xmlFile = new File(xmlFilename); - - JAXBContext context = JAXBContext.newInstance( - PACKAGE); - Unmarshaller unmarshaller = context.createUnmarshaller(); - Grib2VarsList g2Varslist = null; - - try { - g2Varslist = (Grib2VarsList)unmarshaller.unmarshal( - new FileReader(xmlFile)); - List listOfItems = g2Varslist.getGrib2Vars(); - return listOfItems; - - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - - } catch (NullPointerException e2) { - e2.printStackTrace(); - } - - return null; - - } - - /** - * Gets the list of the g2Varss - * @return - the list of g2Varss - */ - public List getGrib2VarsList(){ - - return g2VarsList; - - } - - /** - * Search a g2Vars given a field, and search key value. - * - * @param sf - * @param key - * @return Grib2Vars - */ - public Grib2Vars getGrib2Vars(int discipline, int category, int pid, int pdt) { - - if (g2VarsList == null || g2VarsList.isEmpty()) return null; - - for (Grib2Vars g2Vars : g2VarsList) { - if (g2Vars.discipline == discipline && - g2Vars.category == category && - g2Vars.pid == pid && - g2Vars.pdt == pdt ) { - return g2Vars; - } - } - return null; - } - - public Grib2Vars getGrib2Vars4Grib1(int discipline, int category, int pid) { - - if (g2VarsList == null || g2VarsList.isEmpty()) return null; - - for (Grib2Vars g2Vars : g2VarsList) { - if (g2Vars.discipline == discipline && - g2Vars.category == category && - g2Vars.pid == pid ) { - return g2Vars; - } - } - return null; - } - /** - * Search g2Vars list given a field, and search key value. - * - * @param sf - * @param key - * @return Grib2Vars - */ - public List getGrib2Varss(Grib2VarsField sf, Integer key) { - if (g2VarsList == null || g2VarsList.isEmpty()) return null; - - Grib2VarsComparator comparator = new Grib2VarsComparator(sf); - if (last == null || (last != null && last != sf )) { - Collections.sort(g2VarsList, comparator); - last = sf; - } - - List list = new ArrayList(); - - Grib2Vars s = getComparedGrib2Vars(sf, key); - int index; - while ((index = Collections.binarySearch(g2VarsList, s, comparator)) >= 0) { - list.add(g2VarsList.get(index)); - g2VarsList.remove(index); - } - - if (list.size() > 0) { - for (Grib2Vars st : list) { - g2VarsList.add(st); - } - - last = null; - return list; - } - else { - return null; - } - } - - - private Grib2Vars getComparedGrib2Vars(Grib2VarsField sf, Integer key){ - Grib2Vars g2Vars = new Grib2Vars(); - switch (sf) { - case G2VARSID: - g2Vars.setG2Varsid((Integer)key); - break; - } - - return g2Vars; - } - +package gov.noaa.nws.ncep.edex.util.grib2vars; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + +/** + * This class reads a g2Vars table from an xml file and contains a list of g2Varss. + * This class also provide general g2Vars search functions given g2Vars field, and + * field value. + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 10/10  		276   	   	L. Lin	   Initial Creation
    + * 07/11                    X. Guo     Added getGrib2Vars4Grib1()
    + *                       
    + * 
    + * + * @author llin + * @version 1 + */ + +public class Grib2VarsTable implements IGrib2VarsField { + + private final String PACKAGE = "gov.noaa.nws.ncep.edex.util.grib2vars"; + + private List g2VarsList; + + private static Grib2VarsField last = null; + + /** + * Constructor. + * @param tableFileName - full path of the xml table file + */ + public Grib2VarsTable( String tableFileName ) { + + try{ + g2VarsList = readGrib2VarsTable( tableFileName ); + } + catch ( JAXBException exp ){ + g2VarsList = null; + exp.printStackTrace(); + } + + } + + /** + * Reads the contents of the input g2Vars table file + * @param xmlFilename - full path of the xml table name + * @return - a list of g2Varss + * @throws JAXBException + */ + private List readGrib2VarsTable( String xmlFilename ) throws JAXBException{ + + File xmlFile = new File(xmlFilename); + + JAXBContext context = JAXBContext.newInstance( + PACKAGE); + Unmarshaller unmarshaller = context.createUnmarshaller(); + Grib2VarsList g2Varslist = null; + + try { + g2Varslist = (Grib2VarsList)unmarshaller.unmarshal( + new FileReader(xmlFile)); + List listOfItems = g2Varslist.getGrib2Vars(); + return listOfItems; + + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + + } catch (NullPointerException e2) { + e2.printStackTrace(); + } + + return null; + + } + + /** + * Gets the list of the g2Varss + * @return - the list of g2Varss + */ + public List getGrib2VarsList(){ + + return g2VarsList; + + } + + /** + * Search a g2Vars given a field, and search key value. + * + * @param sf + * @param key + * @return Grib2Vars + */ + public Grib2Vars getGrib2Vars(int discipline, int category, int pid, int pdt) { + + if (g2VarsList == null || g2VarsList.isEmpty()) return null; + + for (Grib2Vars g2Vars : g2VarsList) { + if (g2Vars.discipline == discipline && + g2Vars.category == category && + g2Vars.pid == pid && + g2Vars.pdt == pdt ) { + return g2Vars; + } + } + return null; + } + + public Grib2Vars getGrib2Vars4Grib1(int discipline, int category, int pid) { + + if (g2VarsList == null || g2VarsList.isEmpty()) return null; + + for (Grib2Vars g2Vars : g2VarsList) { + if (g2Vars.discipline == discipline && + g2Vars.category == category && + g2Vars.pid == pid ) { + return g2Vars; + } + } + return null; + } + /** + * Search g2Vars list given a field, and search key value. + * + * @param sf + * @param key + * @return Grib2Vars + */ + public List getGrib2Varss(Grib2VarsField sf, Integer key) { + if (g2VarsList == null || g2VarsList.isEmpty()) return null; + + Grib2VarsComparator comparator = new Grib2VarsComparator(sf); + if (last == null || (last != null && last != sf )) { + Collections.sort(g2VarsList, comparator); + last = sf; + } + + List list = new ArrayList(); + + Grib2Vars s = getComparedGrib2Vars(sf, key); + int index; + while ((index = Collections.binarySearch(g2VarsList, s, comparator)) >= 0) { + list.add(g2VarsList.get(index)); + g2VarsList.remove(index); + } + + if (list.size() > 0) { + for (Grib2Vars st : list) { + g2VarsList.add(st); + } + + last = null; + return list; + } + else { + return null; + } + } + + + private Grib2Vars getComparedGrib2Vars(Grib2VarsField sf, Integer key){ + Grib2Vars g2Vars = new Grib2Vars(); + switch (sf) { + case G2VARSID: + g2Vars.setG2Varsid((Integer)key); + break; + } + + return g2Vars; + } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTableLookup.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTableLookup.java index 15a9b47fe5..cb0ac3d252 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTableLookup.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/Grib2VarsTableLookup.java @@ -1,282 +1,282 @@ -/** - * Grib2varsTableLookup - A Java class to define some known - * both g2varsncep1.tbl and g2varswmo2.tbl. - * - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 10/2010 276 L. Lin Initial creation - * 06/2011 X. Guo Added getVarGnam() - * 07/2011 X. Guo Added getVarGnam4Grib1() - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ -package gov.noaa.nws.ncep.edex.util.grib2vars; - -import java.io.File; - -import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; - -import com.raytheon.uf.common.localization.IPathManager; -import com.raytheon.uf.common.localization.LocalizationContext; -import com.raytheon.uf.common.localization.PathManagerFactory; - -public class Grib2VarsTableLookup { - - private static Grib2VarsTable grib2varsTbl = null; - private static String name; - private static String units; - private static Integer scale; - private static String gnam; - private static float missing; - - public Grib2VarsTableLookup() { - } - - public static synchronized String readG2varsTable() throws GribException { - - Grib2VarsTable myTbl = null; - - /* - * Gets all predefined found in the utility directory - */ - IPathManager pathMgr = PathManagerFactory.getPathManager(); - LocalizationContext commonStaticBase = pathMgr.getContext( - LocalizationContext.LocalizationType.COMMON_STATIC, - LocalizationContext.LocalizationLevel.BASE); - - String path = ""; - - try { - path = pathMgr.getFile(commonStaticBase, - "ncgrid" + File.separator + "grib2vars.xml") - .getCanonicalPath(); - - // System.out.println (" grib2 vars table lookup path=" + path); - } catch (Exception e) { - throw new GribException( - "Unable to unmarshal ncep grib2vars.xml file"); - } - - File varsFile = new File(path); - try { - if (varsFile.exists()) { - myTbl = new Grib2VarsTable(path); - setG2varsTable(myTbl); - // System.out.println("Grib2varsTableLookup- read grib2vars.xml file=" - // + path); - } - } catch (Exception e) { - throw new GribException("Unable to read ncep grib2vars file"); - } - return path; - } - - /** - * Given discipline, category, pid, and pdt, find g2vars entry in - * "grib2vars.xml" and set g2varsid, name, units, scale, gnam, and missing - * fields. . - * - * @param discipline - * , category, pid and pdt are integers. - * @return - * @throws GribException - * - */ - public static int getG2varsId(int discipline, int category, int pid, int pdt) - throws GribException { - Grib2Vars g2vars = null; - int g2varsid = -1; - // Wrap decoding in a try block, in case of exception on xml. - try { - // Read in the stationNumber table XML if not exists - if (grib2varsTbl == null) { - readG2varsTable(); - } - - // Search station ID and return whole station record - if (grib2varsTbl != null) { - g2vars = grib2varsTbl.getGrib2Vars(discipline, category, pid, - pdt); - } - - if (g2vars != null) { - g2varsid = g2vars.g2Varsid; - name = g2vars.name; - units = g2vars.units; - gnam = g2vars.gnam; - scale = g2vars.scale; - missing = g2vars.missing; - } - } catch (Exception e) { - // TODO: Use central error logging if this code is kept - throw new GribException( - "Error occurs while finding g2vars entry from g2vars.xml table"); - } - - return g2varsid; - } - - /** - * Given discipline, category, pid, and pdt, find g2vars entry in - * "grib2vars.xml" and set g2varsid, name, units, g2varsscale, gnam, and - * missing fields. . - * - * @param discipline - * , category, pid and pdt are integers. - * @return - * @throws GribException - * - */ - public static int getG2varsScale(int discipline, int category, int pid, - int pdt) throws GribException { - Grib2Vars g2vars = null; - int g2scale = 0; - // Wrap decoding in a try block, in case of exception on xml. - try { - // Read in the stationNumber table XML if not exists - if (grib2varsTbl == null) { - readG2varsTable(); - } - - // Search station ID and return whole station record - if (grib2varsTbl != null) { - g2vars = grib2varsTbl.getGrib2Vars(discipline, category, pid, - pdt); - } - - if (g2vars != null) { - // g2Varsid = g2vars.g2Varsid; - name = g2vars.name; - units = g2vars.units; - gnam = g2vars.gnam; - g2scale = g2vars.scale; - missing = g2vars.missing; - } - } catch (Exception e) { - // TODO: Use central error logging if this code is kept - throw new GribException( - "Error occurs while finding g2vars entry from g2vars.xml table"); - } - - return g2scale; - } - - /** - * @return the grib2varsTbl - */ - public static Grib2VarsTable getG2varsTable() { - return grib2varsTbl; - } - - /** - * @param Grib2VarsTable - * the grib2varsTbl to set - */ - public static void setG2varsTable(Grib2VarsTable grib2varsTbl) { - Grib2VarsTableLookup.grib2varsTbl = grib2varsTbl; - } - - public static String getName() { - return name; - } - - public static void setName(String name) { - Grib2VarsTableLookup.name = name; - } - - public static String getVarGnam( int discipline, int category, int pid, int pdt) throws GribException { - Grib2Vars g2vars = null; - String varName="NONE"; - // Wrap decoding in a try block, in case of exception on xml. - try { - // Read in the stationNumber table XML if not exists - if (grib2varsTbl == null) { - readG2varsTable(); - } - - // Search station ID and return whole station record - if (grib2varsTbl != null) { - g2vars = grib2varsTbl.getGrib2Vars(discipline, category, pid, - pdt); - } - - if (g2vars != null) { - // g2Varsid = g2vars.g2Varsid; - varName = g2vars.gnam; - } - } catch (Exception e) { - // TODO: Use central error logging if this code is kept - throw new GribException( - "Error occurs while finding g2vars entry from g2vars.xml table"); - } - - return varName; - } - - public static String getVarGnam4Grib1( int discipline, int category, int pid) throws GribException { - Grib2Vars g2vars = null; - String varName="NONE"; - // Wrap decoding in a try block, in case of exception on xml. - try { - // Read in the stationNumber table XML if not exists - if (grib2varsTbl == null) { - readG2varsTable(); - } - - // Search station ID and return whole station record - if (grib2varsTbl != null) { - g2vars = grib2varsTbl.getGrib2Vars4Grib1(discipline, category, pid ); - } - - if (g2vars != null) { - // g2Varsid = g2vars.g2Varsid; - varName = g2vars.gnam; - } - } catch (Exception e) { - // TODO: Use central error logging if this code is kept - throw new GribException( - "Error occurs while finding g2vars entry from g2vars.xml table"); - } - - return varName; - } - - public static String getUnits() { - return units; - } - - public static void setUnits(String units) { - Grib2VarsTableLookup.units = units; - } - - public static Integer getScale() { - return scale; - } - - public static void setScale(Integer scale) { - Grib2VarsTableLookup.scale = scale; - } - - public static String getGnam() { - return gnam; - } - - public static void setGnam(String gnam) { - Grib2VarsTableLookup.gnam = gnam; - } - - public static float getMissing() { - return missing; - } - - public static void setMissing(float missing) { - Grib2VarsTableLookup.missing = missing; - } - -} +/** + * Grib2varsTableLookup - A Java class to define some known + * both g2varsncep1.tbl and g2varswmo2.tbl. + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 10/2010 276 L. Lin Initial creation + * 06/2011 X. Guo Added getVarGnam() + * 07/2011 X. Guo Added getVarGnam4Grib1() + * + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ +package gov.noaa.nws.ncep.edex.util.grib2vars; + +import java.io.File; + +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; + +import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.PathManagerFactory; + +public class Grib2VarsTableLookup { + + private static Grib2VarsTable grib2varsTbl = null; + private static String name; + private static String units; + private static Integer scale; + private static String gnam; + private static float missing; + + public Grib2VarsTableLookup() { + } + + public static synchronized String readG2varsTable() throws GribException { + + Grib2VarsTable myTbl = null; + + /* + * Gets all predefined found in the utility directory + */ + IPathManager pathMgr = PathManagerFactory.getPathManager(); + LocalizationContext commonStaticBase = pathMgr.getContext( + LocalizationContext.LocalizationType.COMMON_STATIC, + LocalizationContext.LocalizationLevel.BASE); + + String path = ""; + + try { + path = pathMgr.getFile(commonStaticBase, + "ncgrid" + File.separator + "grib2vars.xml") + .getCanonicalPath(); + + // System.out.println (" grib2 vars table lookup path=" + path); + } catch (Exception e) { + throw new GribException( + "Unable to unmarshal ncep grib2vars.xml file"); + } + + File varsFile = new File(path); + try { + if (varsFile.exists()) { + myTbl = new Grib2VarsTable(path); + setG2varsTable(myTbl); + // System.out.println("Grib2varsTableLookup- read grib2vars.xml file=" + // + path); + } + } catch (Exception e) { + throw new GribException("Unable to read ncep grib2vars file"); + } + return path; + } + + /** + * Given discipline, category, pid, and pdt, find g2vars entry in + * "grib2vars.xml" and set g2varsid, name, units, scale, gnam, and missing + * fields. . + * + * @param discipline + * , category, pid and pdt are integers. + * @return + * @throws GribException + * + */ + public static int getG2varsId(int discipline, int category, int pid, int pdt) + throws GribException { + Grib2Vars g2vars = null; + int g2varsid = -1; + // Wrap decoding in a try block, in case of exception on xml. + try { + // Read in the stationNumber table XML if not exists + if (grib2varsTbl == null) { + readG2varsTable(); + } + + // Search station ID and return whole station record + if (grib2varsTbl != null) { + g2vars = grib2varsTbl.getGrib2Vars(discipline, category, pid, + pdt); + } + + if (g2vars != null) { + g2varsid = g2vars.g2Varsid; + name = g2vars.name; + units = g2vars.units; + gnam = g2vars.gnam; + scale = g2vars.scale; + missing = g2vars.missing; + } + } catch (Exception e) { + // TODO: Use central error logging if this code is kept + throw new GribException( + "Error occurs while finding g2vars entry from g2vars.xml table"); + } + + return g2varsid; + } + + /** + * Given discipline, category, pid, and pdt, find g2vars entry in + * "grib2vars.xml" and set g2varsid, name, units, g2varsscale, gnam, and + * missing fields. . + * + * @param discipline + * , category, pid and pdt are integers. + * @return + * @throws GribException + * + */ + public static int getG2varsScale(int discipline, int category, int pid, + int pdt) throws GribException { + Grib2Vars g2vars = null; + int g2scale = 0; + // Wrap decoding in a try block, in case of exception on xml. + try { + // Read in the stationNumber table XML if not exists + if (grib2varsTbl == null) { + readG2varsTable(); + } + + // Search station ID and return whole station record + if (grib2varsTbl != null) { + g2vars = grib2varsTbl.getGrib2Vars(discipline, category, pid, + pdt); + } + + if (g2vars != null) { + // g2Varsid = g2vars.g2Varsid; + name = g2vars.name; + units = g2vars.units; + gnam = g2vars.gnam; + g2scale = g2vars.scale; + missing = g2vars.missing; + } + } catch (Exception e) { + // TODO: Use central error logging if this code is kept + throw new GribException( + "Error occurs while finding g2vars entry from g2vars.xml table"); + } + + return g2scale; + } + + /** + * @return the grib2varsTbl + */ + public static Grib2VarsTable getG2varsTable() { + return grib2varsTbl; + } + + /** + * @param Grib2VarsTable + * the grib2varsTbl to set + */ + public static void setG2varsTable(Grib2VarsTable grib2varsTbl) { + Grib2VarsTableLookup.grib2varsTbl = grib2varsTbl; + } + + public static String getName() { + return name; + } + + public static void setName(String name) { + Grib2VarsTableLookup.name = name; + } + + public static String getVarGnam( int discipline, int category, int pid, int pdt) throws GribException { + Grib2Vars g2vars = null; + String varName="NONE"; + // Wrap decoding in a try block, in case of exception on xml. + try { + // Read in the stationNumber table XML if not exists + if (grib2varsTbl == null) { + readG2varsTable(); + } + + // Search station ID and return whole station record + if (grib2varsTbl != null) { + g2vars = grib2varsTbl.getGrib2Vars(discipline, category, pid, + pdt); + } + + if (g2vars != null) { + // g2Varsid = g2vars.g2Varsid; + varName = g2vars.gnam; + } + } catch (Exception e) { + // TODO: Use central error logging if this code is kept + throw new GribException( + "Error occurs while finding g2vars entry from g2vars.xml table"); + } + + return varName; + } + + public static String getVarGnam4Grib1( int discipline, int category, int pid) throws GribException { + Grib2Vars g2vars = null; + String varName="NONE"; + // Wrap decoding in a try block, in case of exception on xml. + try { + // Read in the stationNumber table XML if not exists + if (grib2varsTbl == null) { + readG2varsTable(); + } + + // Search station ID and return whole station record + if (grib2varsTbl != null) { + g2vars = grib2varsTbl.getGrib2Vars4Grib1(discipline, category, pid ); + } + + if (g2vars != null) { + // g2Varsid = g2vars.g2Varsid; + varName = g2vars.gnam; + } + } catch (Exception e) { + // TODO: Use central error logging if this code is kept + throw new GribException( + "Error occurs while finding g2vars entry from g2vars.xml table"); + } + + return varName; + } + + public static String getUnits() { + return units; + } + + public static void setUnits(String units) { + Grib2VarsTableLookup.units = units; + } + + public static Integer getScale() { + return scale; + } + + public static void setScale(Integer scale) { + Grib2VarsTableLookup.scale = scale; + } + + public static String getGnam() { + return gnam; + } + + public static void setGnam(String gnam) { + Grib2VarsTableLookup.gnam = gnam; + } + + public static float getMissing() { + return missing; + } + + public static void setMissing(float missing) { + Grib2VarsTableLookup.missing = missing; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/IGrib2VarsField.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/IGrib2VarsField.java index 8f20bfac2e..54803378a7 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/IGrib2VarsField.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vars/IGrib2VarsField.java @@ -1,18 +1,18 @@ -package gov.noaa.nws.ncep.edex.util.grib2vars; - -public interface IGrib2VarsField { - - public static enum Grib2VarsField { - G2VARSID, // g2vars id - DISCIPLINE, // The discipline - CATEGORY, // The category - PID, // The parameter id - PDT, // The product definition template - NAME, // description of this g2vars - UNITS, // units - GNAM, // gnam - SCALE, // scale - MISSING // The missing value - } - -} +package gov.noaa.nws.ncep.edex.util.grib2vars; + +public interface IGrib2VarsField { + + public static enum Grib2VarsField { + G2VARSID, // g2vars id + DISCIPLINE, // The discipline + CATEGORY, // The category + PID, // The parameter id + PDT, // The product definition template + NAME, // description of this g2vars + UNITS, // units + GNAM, // gnam + SCALE, // scale + MISSING // The missing value + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdComparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdComparator.java index e81e58c04f..e541ee6b73 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdComparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdComparator.java @@ -1,50 +1,50 @@ -package gov.noaa.nws.ncep.edex.util.grib2vcrd; - -import java.util.Comparator; - -/** - * Comparator for Grib2Vcrd fields. - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 10/10		276  		L. Lin	   Initial Creation
    - *                       
    - * 
    - * - * @author llin - * @version 1 - */ - -public class Grib2VcrdComparator implements Comparator, IGrib2VcrdField { - - private Grib2VcrdField field; - - public Grib2VcrdComparator(Grib2VcrdField f) { - this.field = f; - } - - public int compare(Grib2Vcrd o1, Grib2Vcrd o2) { - switch (field) { - case G2VCRDID: - return o1.getG2Vcrdid() - o2.getG2Vcrdid(); - case VCRDID1: - return o1.getVcrdid1() - o2.getVcrdid1(); - case VCRDID2: - return o1.getVcrdid2() - o2.getVcrdid2(); - case NAME: - return o1.getName().compareToIgnoreCase(o2.getName()); - case UNITS: - return o1.getUnits().compareToIgnoreCase(o2.getUnits()); - case GNAM: - return o1.getGnam().compareToIgnoreCase(o2.getGnam()); - case SCALE: - return o1.getScale().compareToIgnoreCase(o2.getScale()); - default: - return 0; - } - - } +package gov.noaa.nws.ncep.edex.util.grib2vcrd; + +import java.util.Comparator; + +/** + * Comparator for Grib2Vcrd fields. + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 10/10		276  		L. Lin	   Initial Creation
    + *                       
    + * 
    + * + * @author llin + * @version 1 + */ + +public class Grib2VcrdComparator implements Comparator, IGrib2VcrdField { + + private Grib2VcrdField field; + + public Grib2VcrdComparator(Grib2VcrdField f) { + this.field = f; + } + + public int compare(Grib2Vcrd o1, Grib2Vcrd o2) { + switch (field) { + case G2VCRDID: + return o1.getG2Vcrdid() - o2.getG2Vcrdid(); + case VCRDID1: + return o1.getVcrdid1() - o2.getVcrdid1(); + case VCRDID2: + return o1.getVcrdid2() - o2.getVcrdid2(); + case NAME: + return o1.getName().compareToIgnoreCase(o2.getName()); + case UNITS: + return o1.getUnits().compareToIgnoreCase(o2.getUnits()); + case GNAM: + return o1.getGnam().compareToIgnoreCase(o2.getGnam()); + case SCALE: + return o1.getScale().compareToIgnoreCase(o2.getScale()); + default: + return 0; + } + + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTable.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTable.java index b040812981..eebe6743ab 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTable.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTable.java @@ -1,189 +1,189 @@ -package gov.noaa.nws.ncep.edex.util.grib2vcrd; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; - -/** - * This class reads a g2Vcrd table from an xml file and contains a list of g2Vcrds. - * This class also provide general g2Vcrd search functions given g2Vcrd field, and - * field value. - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 10/10  		276   	   	L. Lin	   Initial Creation
    - * 07/11                    X. Guo     Added getGrib2VcrdByVcrd1()
    - *                       
    - * 
    - * - * @author llin - * @version 1 - */ - -public class Grib2VcrdTable implements IGrib2VcrdField { - - private final String PACKAGE = "gov.noaa.nws.ncep.edex.util.grib2vcrd"; - - private List g2VcrdList; - - private static Grib2VcrdField last = null; - - /** - * Constructor. - * @param tableFileName - full path of the xml table file - */ - public Grib2VcrdTable( String tableFileName ) { - - try{ - g2VcrdList = readGrib2VcrdTable( tableFileName ); - } - catch ( JAXBException exp ){ - g2VcrdList = null; - exp.printStackTrace(); - } - - } - - /** - * Reads the contents of the input g2Vcrd table file - * @param xmlFilename - full path of the xml table name - * @return - a list of g2Vcrds - * @throws JAXBException - */ - private List readGrib2VcrdTable( String xmlFilename ) throws JAXBException{ - - File xmlFile = new File(xmlFilename); - - JAXBContext context = JAXBContext.newInstance( - PACKAGE); - Unmarshaller unmarshaller = context.createUnmarshaller(); - Grib2VcrdList g2Vcrdlist = null; - - try { - g2Vcrdlist = (Grib2VcrdList)unmarshaller.unmarshal( - new FileReader(xmlFile)); - List listOfItems = g2Vcrdlist.getGrib2Vcrd(); - return listOfItems; - - } catch (FileNotFoundException e1) { - e1.printStackTrace(); - - } catch (NullPointerException e2) { - e2.printStackTrace(); - } - - return null; - - } - - /** - * Gets the list of the g2Vcrds - * @return - the list of g2Vcrds - */ - public List getGrib2VcrdList(){ - - return g2VcrdList; - - } - - /** - * Search a g2Vcrd given a field, and search key value. - * - * @param sf - * @param key - * @return Grib2Vcrd - */ - public Grib2Vcrd getGrib2Vcrd(int vcrdid1, int vcrdid2) { - - if (g2VcrdList == null || g2VcrdList.isEmpty()) return null; - - for (Grib2Vcrd g2Vcrd : g2VcrdList) { - if (g2Vcrd.vcrdid1 == vcrdid1 && - g2Vcrd.vcrdid2 == vcrdid2 ) { - return g2Vcrd; - } - } - return null; - } - - /** - * Search a g2Vcrd given a field, and search key value. - * - * @param sf - * @param key - * @return Grib2Vcrd - */ - public Grib2Vcrd getGrib2VcrdByVcrd1 (int vcrdid1 ) { - - if (g2VcrdList == null || g2VcrdList.isEmpty()) return null; - - for (Grib2Vcrd g2Vcrd : g2VcrdList) { - if (g2Vcrd.vcrdid1 == vcrdid1 ) { - return g2Vcrd; - } - } - return null; - } - - /** - * Search g2Vcrd list given a field, and search key value. - * - * @param sf - * @param key - * @return Grib2Vcrd - */ - public List getGrib2Vcrds(Grib2VcrdField sf, Integer key) { - if (g2VcrdList == null || g2VcrdList.isEmpty()) return null; - - Grib2VcrdComparator comparator = new Grib2VcrdComparator(sf); - if (last == null || (last != null && last != sf )) { - Collections.sort(g2VcrdList, comparator); - last = sf; - } - - List list = new ArrayList(); - - Grib2Vcrd s = getComparedGrib2Vcrd(sf, key); - int index; - while ((index = Collections.binarySearch(g2VcrdList, s, comparator)) >= 0) { - list.add(g2VcrdList.get(index)); - g2VcrdList.remove(index); - } - - if (list.size() > 0) { - for (Grib2Vcrd st : list) { - g2VcrdList.add(st); - } - - last = null; - return list; - } - else { - return null; - } - } - - - private Grib2Vcrd getComparedGrib2Vcrd(Grib2VcrdField sf, Integer key){ - Grib2Vcrd g2Vcrd = new Grib2Vcrd(); - switch (sf) { - case G2VCRDID: - g2Vcrd.setG2Vcrdid((Integer)key); - break; - } - - return g2Vcrd; - } - +package gov.noaa.nws.ncep.edex.util.grib2vcrd; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + +/** + * This class reads a g2Vcrd table from an xml file and contains a list of g2Vcrds. + * This class also provide general g2Vcrd search functions given g2Vcrd field, and + * field value. + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 10/10  		276   	   	L. Lin	   Initial Creation
    + * 07/11                    X. Guo     Added getGrib2VcrdByVcrd1()
    + *                       
    + * 
    + * + * @author llin + * @version 1 + */ + +public class Grib2VcrdTable implements IGrib2VcrdField { + + private final String PACKAGE = "gov.noaa.nws.ncep.edex.util.grib2vcrd"; + + private List g2VcrdList; + + private static Grib2VcrdField last = null; + + /** + * Constructor. + * @param tableFileName - full path of the xml table file + */ + public Grib2VcrdTable( String tableFileName ) { + + try{ + g2VcrdList = readGrib2VcrdTable( tableFileName ); + } + catch ( JAXBException exp ){ + g2VcrdList = null; + exp.printStackTrace(); + } + + } + + /** + * Reads the contents of the input g2Vcrd table file + * @param xmlFilename - full path of the xml table name + * @return - a list of g2Vcrds + * @throws JAXBException + */ + private List readGrib2VcrdTable( String xmlFilename ) throws JAXBException{ + + File xmlFile = new File(xmlFilename); + + JAXBContext context = JAXBContext.newInstance( + PACKAGE); + Unmarshaller unmarshaller = context.createUnmarshaller(); + Grib2VcrdList g2Vcrdlist = null; + + try { + g2Vcrdlist = (Grib2VcrdList)unmarshaller.unmarshal( + new FileReader(xmlFile)); + List listOfItems = g2Vcrdlist.getGrib2Vcrd(); + return listOfItems; + + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + + } catch (NullPointerException e2) { + e2.printStackTrace(); + } + + return null; + + } + + /** + * Gets the list of the g2Vcrds + * @return - the list of g2Vcrds + */ + public List getGrib2VcrdList(){ + + return g2VcrdList; + + } + + /** + * Search a g2Vcrd given a field, and search key value. + * + * @param sf + * @param key + * @return Grib2Vcrd + */ + public Grib2Vcrd getGrib2Vcrd(int vcrdid1, int vcrdid2) { + + if (g2VcrdList == null || g2VcrdList.isEmpty()) return null; + + for (Grib2Vcrd g2Vcrd : g2VcrdList) { + if (g2Vcrd.vcrdid1 == vcrdid1 && + g2Vcrd.vcrdid2 == vcrdid2 ) { + return g2Vcrd; + } + } + return null; + } + + /** + * Search a g2Vcrd given a field, and search key value. + * + * @param sf + * @param key + * @return Grib2Vcrd + */ + public Grib2Vcrd getGrib2VcrdByVcrd1 (int vcrdid1 ) { + + if (g2VcrdList == null || g2VcrdList.isEmpty()) return null; + + for (Grib2Vcrd g2Vcrd : g2VcrdList) { + if (g2Vcrd.vcrdid1 == vcrdid1 ) { + return g2Vcrd; + } + } + return null; + } + + /** + * Search g2Vcrd list given a field, and search key value. + * + * @param sf + * @param key + * @return Grib2Vcrd + */ + public List getGrib2Vcrds(Grib2VcrdField sf, Integer key) { + if (g2VcrdList == null || g2VcrdList.isEmpty()) return null; + + Grib2VcrdComparator comparator = new Grib2VcrdComparator(sf); + if (last == null || (last != null && last != sf )) { + Collections.sort(g2VcrdList, comparator); + last = sf; + } + + List list = new ArrayList(); + + Grib2Vcrd s = getComparedGrib2Vcrd(sf, key); + int index; + while ((index = Collections.binarySearch(g2VcrdList, s, comparator)) >= 0) { + list.add(g2VcrdList.get(index)); + g2VcrdList.remove(index); + } + + if (list.size() > 0) { + for (Grib2Vcrd st : list) { + g2VcrdList.add(st); + } + + last = null; + return list; + } + else { + return null; + } + } + + + private Grib2Vcrd getComparedGrib2Vcrd(Grib2VcrdField sf, Integer key){ + Grib2Vcrd g2Vcrd = new Grib2Vcrd(); + switch (sf) { + case G2VCRDID: + g2Vcrd.setG2Vcrdid((Integer)key); + break; + } + + return g2Vcrd; + } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTableLookup.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTableLookup.java index 30c293f20f..d7993d15c9 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTableLookup.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/Grib2VcrdTableLookup.java @@ -1,260 +1,260 @@ -/** - * Grib2vcrdTableLookup - A Java class to define some known - * both g2vcrdncep1.tbl and g2vcrdwmo2.tbl. - * - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 10/2010 276 L. Lin Initial creation - * 06/2011 X. Guo Added getGnamByVcrdId(() - * getScaleByVcrdId() - * 07/2011 X. Guo Added getGrib2VcrdByGrib1VcrdId() - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ -package gov.noaa.nws.ncep.edex.util.grib2vcrd; - -import java.io.File; - -import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; - -import com.raytheon.uf.common.localization.IPathManager; -import com.raytheon.uf.common.localization.LocalizationContext; -import com.raytheon.uf.common.localization.PathManagerFactory; -import com.raytheon.uf.edex.core.props.PropertiesFactory; - -public class Grib2VcrdTableLookup { - - private static Grib2VcrdTable grib2vcrdTbl=null; - private static String name; - private static String units; - private static String scale; - private static String gnam; - - public static synchronized String readG2vcrdTable () throws GribException{ - - Grib2VcrdTable myTbl = null; - - /* - * Gets all predefined found in the utility directory - */ - IPathManager pathMgr = PathManagerFactory.getPathManager(); - LocalizationContext commonStaticBase = pathMgr.getContext( - LocalizationContext.LocalizationType.COMMON_STATIC, - LocalizationContext.LocalizationLevel.BASE); - - LocalizationContext commonStaticSite = pathMgr.getContext( - LocalizationContext.LocalizationType.COMMON_STATIC, - LocalizationContext.LocalizationLevel.SITE); - - String path = ""; - String sitePath = ""; - - try { - path = pathMgr.getFile( - commonStaticBase, - "ncgrid" + File.separator + "grib2vcrd.xml") - .getCanonicalPath(); - - //System.out.println (" grib2 vcrd table lookup path=" + path); - - sitePath = pathMgr.getFile( - commonStaticSite, - PropertiesFactory.getInstance().getEnvProperties() - .getEnvValue("SITENAME") - + File.separator - + "ncgrid" - + File.separator - + "g2vcrd.xml").getCanonicalPath(); - //System.out.println (" grib2 vcrd table lookup sitepath=" + sitePath); - } catch (Exception e) { - throw new GribException("Unable to unmarshal ncep grib2vcrd.xml file"); - } - - File modelFile = new File(path); - try { - if (modelFile.exists()) { - myTbl = new Grib2VcrdTable(path); - setG2vcrdTable(myTbl); - //System.out.println("Grib2varsTableLookup- read grib2vars.xml file=" + path); - } - } catch (Exception e) { - throw new GribException("Unable to read ncep grib2vcrd file"); - } - return path; - } - - /** - * Given discipline, category, pid, and pdt, find g2vcrd entry in "grib2vcrd.xml" - * and set g2vcrdid, name, units, scale, gnam, and missing fields. - * . - * - * @param discipline, category, pid and pdt are integers. - * @return - * @throws GribException - * - */ - public static int getG2vcrdId(int vcrdid1, int vcrdid2) throws GribException { - Grib2Vcrd g2vcrd=null; - int g2vcrdid = -1; - // Wrap decoding in a try block, in case of exception on xml. - try { - - - // Read in the stationNumber table XML if not exists - if (grib2vcrdTbl == null) { - readG2vcrdTable(); - } - // Search station ID and return whole station record - if (grib2vcrdTbl != null) { - g2vcrd = grib2vcrdTbl.getGrib2Vcrd(vcrdid1, vcrdid2); - } - - if ( g2vcrd != null) { - g2vcrdid = g2vcrd.g2Vcrdid; - name = g2vcrd.name; - units = g2vcrd.units; - gnam = g2vcrd.gnam; - scale = g2vcrd.scale; - } - } - catch (Exception e) { - //TODO: Use central error logging if this code is kept - throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); - } - - return g2vcrdid; - } - - /** - * @return the grib2vcrdTbl - */ - public static Grib2VcrdTable getG2vcrdTable() { - return grib2vcrdTbl; - } - - /** - * @param Grib2VcrdTable - * the grib2vcrdTbl to set - */ - public static void setG2vcrdTable(Grib2VcrdTable grib2vcrdTbl) { - Grib2VcrdTableLookup.grib2vcrdTbl = grib2vcrdTbl; - } - - public static String getName() { - return name; - } - - public static void setName(String name) { - Grib2VcrdTableLookup.name = name; - } - - public static String getGnamByVcrdId ( int vcrdid1, int vcrdid2) throws GribException { - Grib2Vcrd g2vcrd=null; - String gvrdName = "NONE"; - // Wrap decoding in a try block, in case of exception on xml. - try { - - - // Read in the stationNumber table XML if not exists - if (grib2vcrdTbl == null) { - readG2vcrdTable(); - } - // Search station ID and return whole station record - if (grib2vcrdTbl != null) { - g2vcrd = grib2vcrdTbl.getGrib2Vcrd(vcrdid1, vcrdid2); - } - - if ( g2vcrd != null) { - gvrdName = g2vcrd.gnam; - scale = g2vcrd.scale; - } - } - catch (Exception e) { - //TODO: Use central error logging if this code is kept - throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); - } - - return gvrdName; - } - - public static Grib2Vcrd getGrib2VcrdByGrib1VcrdId ( int vcrdid ) throws GribException { - Grib2Vcrd g2vcrd=null; - // Wrap decoding in a try block, in case of exception on xml. - try { - - - // Read in the stationNumber table XML if not exists - if (grib2vcrdTbl == null) { - readG2vcrdTable(); - } - // Search station ID and return whole station record - if (grib2vcrdTbl != null) { - g2vcrd = grib2vcrdTbl.getGrib2VcrdByVcrd1(vcrdid); - } - } - catch (Exception e) { - //TODO: Use central error logging if this code is kept - throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); - } - - return g2vcrd; - } - - public static String getScaleByVcrdId ( int vcrdid1, int vcrdid2) throws GribException { - Grib2Vcrd g2vcrd=null; - // Wrap decoding in a try block, in case of exception on xml. - try { - - - // Read in the stationNumber table XML if not exists - if (grib2vcrdTbl == null) { - readG2vcrdTable(); - } - // Search station ID and return whole station record - if (grib2vcrdTbl != null) { - g2vcrd = grib2vcrdTbl.getGrib2Vcrd(vcrdid1, vcrdid2); - } - - if ( g2vcrd != null) { - scale = g2vcrd.scale; - } - } - catch (Exception e) { - //TODO: Use central error logging if this code is kept - throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); - } - - return scale; - } - - public static String getUnits() { - return units; - } - - public static void setUnits(String units) { - Grib2VcrdTableLookup.units = units; - } - - public static String getScale() { - return scale; - } - - public static void setScale(String scale) { - Grib2VcrdTableLookup.scale = scale; - } - - public static String getGnam() { - return gnam; - } - - public static void setGnam(String gnam) { - Grib2VcrdTableLookup.gnam = gnam; - } - -} +/** + * Grib2vcrdTableLookup - A Java class to define some known + * both g2vcrdncep1.tbl and g2vcrdwmo2.tbl. + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 10/2010 276 L. Lin Initial creation + * 06/2011 X. Guo Added getGnamByVcrdId(() + * getScaleByVcrdId() + * 07/2011 X. Guo Added getGrib2VcrdByGrib1VcrdId() + * + * + * + * This code has been developed by the SIB for use in the AWIPS2 system. + * @author L. Lin + * @version 1.0 + */ +package gov.noaa.nws.ncep.edex.util.grib2vcrd; + +import java.io.File; + +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; + +import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.PathManagerFactory; +import com.raytheon.uf.edex.core.props.PropertiesFactory; + +public class Grib2VcrdTableLookup { + + private static Grib2VcrdTable grib2vcrdTbl=null; + private static String name; + private static String units; + private static String scale; + private static String gnam; + + public static synchronized String readG2vcrdTable () throws GribException{ + + Grib2VcrdTable myTbl = null; + + /* + * Gets all predefined found in the utility directory + */ + IPathManager pathMgr = PathManagerFactory.getPathManager(); + LocalizationContext commonStaticBase = pathMgr.getContext( + LocalizationContext.LocalizationType.COMMON_STATIC, + LocalizationContext.LocalizationLevel.BASE); + + LocalizationContext commonStaticSite = pathMgr.getContext( + LocalizationContext.LocalizationType.COMMON_STATIC, + LocalizationContext.LocalizationLevel.SITE); + + String path = ""; + String sitePath = ""; + + try { + path = pathMgr.getFile( + commonStaticBase, + "ncgrid" + File.separator + "grib2vcrd.xml") + .getCanonicalPath(); + + //System.out.println (" grib2 vcrd table lookup path=" + path); + + sitePath = pathMgr.getFile( + commonStaticSite, + PropertiesFactory.getInstance().getEnvProperties() + .getEnvValue("SITENAME") + + File.separator + + "ncgrid" + + File.separator + + "g2vcrd.xml").getCanonicalPath(); + //System.out.println (" grib2 vcrd table lookup sitepath=" + sitePath); + } catch (Exception e) { + throw new GribException("Unable to unmarshal ncep grib2vcrd.xml file"); + } + + File modelFile = new File(path); + try { + if (modelFile.exists()) { + myTbl = new Grib2VcrdTable(path); + setG2vcrdTable(myTbl); + //System.out.println("Grib2varsTableLookup- read grib2vars.xml file=" + path); + } + } catch (Exception e) { + throw new GribException("Unable to read ncep grib2vcrd file"); + } + return path; + } + + /** + * Given discipline, category, pid, and pdt, find g2vcrd entry in "grib2vcrd.xml" + * and set g2vcrdid, name, units, scale, gnam, and missing fields. + * . + * + * @param discipline, category, pid and pdt are integers. + * @return + * @throws GribException + * + */ + public static int getG2vcrdId(int vcrdid1, int vcrdid2) throws GribException { + Grib2Vcrd g2vcrd=null; + int g2vcrdid = -1; + // Wrap decoding in a try block, in case of exception on xml. + try { + + + // Read in the stationNumber table XML if not exists + if (grib2vcrdTbl == null) { + readG2vcrdTable(); + } + // Search station ID and return whole station record + if (grib2vcrdTbl != null) { + g2vcrd = grib2vcrdTbl.getGrib2Vcrd(vcrdid1, vcrdid2); + } + + if ( g2vcrd != null) { + g2vcrdid = g2vcrd.g2Vcrdid; + name = g2vcrd.name; + units = g2vcrd.units; + gnam = g2vcrd.gnam; + scale = g2vcrd.scale; + } + } + catch (Exception e) { + //TODO: Use central error logging if this code is kept + throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); + } + + return g2vcrdid; + } + + /** + * @return the grib2vcrdTbl + */ + public static Grib2VcrdTable getG2vcrdTable() { + return grib2vcrdTbl; + } + + /** + * @param Grib2VcrdTable + * the grib2vcrdTbl to set + */ + public static void setG2vcrdTable(Grib2VcrdTable grib2vcrdTbl) { + Grib2VcrdTableLookup.grib2vcrdTbl = grib2vcrdTbl; + } + + public static String getName() { + return name; + } + + public static void setName(String name) { + Grib2VcrdTableLookup.name = name; + } + + public static String getGnamByVcrdId ( int vcrdid1, int vcrdid2) throws GribException { + Grib2Vcrd g2vcrd=null; + String gvrdName = "NONE"; + // Wrap decoding in a try block, in case of exception on xml. + try { + + + // Read in the stationNumber table XML if not exists + if (grib2vcrdTbl == null) { + readG2vcrdTable(); + } + // Search station ID and return whole station record + if (grib2vcrdTbl != null) { + g2vcrd = grib2vcrdTbl.getGrib2Vcrd(vcrdid1, vcrdid2); + } + + if ( g2vcrd != null) { + gvrdName = g2vcrd.gnam; + scale = g2vcrd.scale; + } + } + catch (Exception e) { + //TODO: Use central error logging if this code is kept + throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); + } + + return gvrdName; + } + + public static Grib2Vcrd getGrib2VcrdByGrib1VcrdId ( int vcrdid ) throws GribException { + Grib2Vcrd g2vcrd=null; + // Wrap decoding in a try block, in case of exception on xml. + try { + + + // Read in the stationNumber table XML if not exists + if (grib2vcrdTbl == null) { + readG2vcrdTable(); + } + // Search station ID and return whole station record + if (grib2vcrdTbl != null) { + g2vcrd = grib2vcrdTbl.getGrib2VcrdByVcrd1(vcrdid); + } + } + catch (Exception e) { + //TODO: Use central error logging if this code is kept + throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); + } + + return g2vcrd; + } + + public static String getScaleByVcrdId ( int vcrdid1, int vcrdid2) throws GribException { + Grib2Vcrd g2vcrd=null; + // Wrap decoding in a try block, in case of exception on xml. + try { + + + // Read in the stationNumber table XML if not exists + if (grib2vcrdTbl == null) { + readG2vcrdTable(); + } + // Search station ID and return whole station record + if (grib2vcrdTbl != null) { + g2vcrd = grib2vcrdTbl.getGrib2Vcrd(vcrdid1, vcrdid2); + } + + if ( g2vcrd != null) { + scale = g2vcrd.scale; + } + } + catch (Exception e) { + //TODO: Use central error logging if this code is kept + throw new GribException("Error occurs while finding g2vcrd entry from g2vcrd.xml table"); + } + + return scale; + } + + public static String getUnits() { + return units; + } + + public static void setUnits(String units) { + Grib2VcrdTableLookup.units = units; + } + + public static String getScale() { + return scale; + } + + public static void setScale(String scale) { + Grib2VcrdTableLookup.scale = scale; + } + + public static String getGnam() { + return gnam; + } + + public static void setGnam(String gnam) { + Grib2VcrdTableLookup.gnam = gnam; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/IGrib2VcrdField.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/IGrib2VcrdField.java index be73da436f..26fcb158bf 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/IGrib2VcrdField.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/grib2vcrd/IGrib2VcrdField.java @@ -1,15 +1,15 @@ -package gov.noaa.nws.ncep.edex.util.grib2vcrd; - -public interface IGrib2VcrdField { - - public static enum Grib2VcrdField { - G2VCRDID, // g2vars id - VCRDID1, // The vertical coordination 1 - VCRDID2, // The vertical coordination 2 - NAME, // description of this g2vars - UNITS, // units - GNAM, // gnam - SCALE, // scale - } - -} +package gov.noaa.nws.ncep.edex.util.grib2vcrd; + +public interface IGrib2VcrdField { + + public static enum Grib2VcrdField { + G2VCRDID, // g2vars id + VCRDID1, // The vertical coordination 1 + VCRDID2, // The vertical coordination 2 + NAME, // description of this g2vars + UNITS, // units + GNAM, // gnam + SCALE, // scale + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribModelLookup.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribModelLookup.java index a640067c3f..6c8dd51966 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribModelLookup.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribModelLookup.java @@ -19,6 +19,7 @@ **/ package gov.noaa.nws.ncep.edex.util.ncgrib; +import gov.noaa.nws.ncep.common.dataplugin.ncgrib.NcgribModel; import gov.noaa.nws.ncep.common.dataplugin.ncgrib.exception.GribException; import gov.noaa.nws.ncep.common.dataplugin.ncgrib.util.NcgridModel; import gov.noaa.nws.ncep.common.dataplugin.ncgrib.util.NcgridModelSet; @@ -29,6 +30,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -43,11 +45,12 @@ import com.raytheon.uf.common.serialization.SerializationUtil; * *
      * SOFTWARE HISTORY
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 3/12/10      4758       bphillip     Initial creation
    - * 10/13/10     276        llin                 Modified for NC GRIB.
    - * 11/02/11                xguo          Updated gridid
    + * Date         Ticket#    	Engineer    Description
    + * ------------ ---------- 	----------- --------------------------
    + * 3/12/10      4758       	bphillip    Initial creation
    + * 10/13/10     276        	llin     	Modified for NC GRIB.
    + * 11/02/11                	xguo		Updated gridid
    + * 3/2012					T. Lee		Get ensemble modelName via template 
      * 
    * * @author njensen @@ -99,8 +102,85 @@ public class NcgribModelLookup { } public NcgridModel getModel(int center, int subcenter, String grid, - int process) { - return models.get(toHash(center, subcenter, grid, process)); + int process, String filename, NcgribModel nbm) { + NcgridModel model = new NcgridModel (); + model = models.get(toHash(center, subcenter, grid, process)); + if ( model == null ) { + return model; + } + String template = model.getTemplate(); + + //System.out.println ( " Center: "+ center + " subCenter: "+ subcenter + " gridID: " + grid + // + " modelID: "+ process + " modelName: " + model.getName() ); + + if ( !template.equals("NONE")) { + /* + * Using Template to get ModelName + */ + String[] tokens = template.replaceAll("\\s","").split(";"); + + // CMC ensemble + if ( Pattern.matches("cmc.*", filename)){ + //System.out.println ( " CMC ensemble " + "!!!\n"); + for ( String token : tokens ) { + String[] alias = token.split("\\|"); + if ( Pattern.matches(alias[0], filename) ) { + model.setName(alias[1]); + break; + } + } + + // SREF ensemble + } else if ( Pattern.matches("sref.*", filename)) { + for ( String token : tokens ) { + String[] alias = token.split("\\|"); + if ( Pattern.matches(alias[0], filename)) { + model.setName(alias[1]); + + // perturbation number + String[] pert = filename.split("\\."); + if ( pert[3].startsWith("p") || pert[3].startsWith("n")) { + nbm.setPerturbationNumber(pert[3]); + } + break; + } + } + + // NAEFS ensemble + } else if ( Pattern.matches("naefs.*", filename)) { + for ( String token : tokens ) { + String[] alias = token.split("\\|"); + if ( Pattern.matches(alias[0], filename)) { + model.setName(alias[1]); + break; + } + } + + // GEFS ensemble + } else if ( Pattern.matches("ge.*", filename)) { + for ( String token : tokens ) { + String[] alias = token.split("\\|"); + if ( Pattern.matches(alias[0], filename)) { + model.setName(alias[1]); + break; + } + } + + // GWW derived data + } else if ( Pattern.matches("mean.*", filename) || + Pattern.matches("probab.*", filename) || + Pattern.matches("spread.*", filename)) { + for ( String token : tokens ) { + String[] alias = token.split("\\|"); + if ( Pattern.matches(alias[0], filename)) { + model.setName(alias[1]); + break; + } + } + } + + } + return model; } public synchronized void setModel(int center, int subcenter, String grid, @@ -120,8 +200,8 @@ public class NcgribModelLookup { } public NcgridModel getModel(int center, int subcenter, int gridid, - int process) { - return getModel(center, subcenter, String.valueOf(gridid), process); + int process, String filename, NcgribModel model) { + return getModel(center, subcenter, String.valueOf(gridid), process, filename, model); } public NcgridModel getModelByName(String name) { diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib1vcrd.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib1vcrd.xml index cd12809288..5d88314769 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib1vcrd.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib1vcrd.xml @@ -105,7 +105,7 @@ Layer between two spec alts (msl) hm HGHT - 2 + 0
    105 @@ -119,21 +119,21 @@ Layer between two height levels (gnd) hm HGHT - 2 + 0 107 Sigma level 1/10000 sigma value SGMA - 0 + 4 108 Layer between two sigma levels 1/100 sigma values SGMA - 2 + 4 109 @@ -203,7 +203,7 @@ ETA level 1/10000 ELVL - 0 + 4 120 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib2vars.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib2vars.xml index de38d7b957..78db99be66 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib2vars.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/grib2vars.xml @@ -4191,6 +4191,18 @@ 0 -9999.00 + + 888 + 0 + 19 + 232 + 0 + Volcanic Ash Forecast Transport and Dispersion + log10(kg m**-3) + VAFTAD + 0 + -9999.00 + 888 0 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/ncgribModels.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/ncgribModels.xml index f30703e2b6..5fc2e6acec 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/ncgribModels.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/common_static/base/ncgrid/ncgribModels.xml @@ -19,40 +19,505 @@ further_licensing_information. --> - + + CMC ensemble + cmce +
    54
    + 2 + 401 + + 70 + + +
    3
    +
    - - GFS PGRB 0.5 degree - GFS0.5 -
    7
    - 0 - 4 - - 96 - 77 - 81 - -
    3
    + + Canadian Global 1x1 Degree + cmc +
    54
    + 0 + 374 + + 47 + +
    3
    +
    + + + Candian Global 1x1 Degree + cmc +
    54
    + 0 + 401 + + 47 + +
    3
    +
    + + + + Global Ensemble Forecast System 1x1 Degree + gefs +
    7
    + 2 + 3 + + 107 + + +
    3
    +
    + + + Global Ensemble Forecast System 1x1 Degree + gefs +
    7
    + 2 + 229 + + 107 + + +
    3
    +
    + + + Global Ensemble Forecast System 2.5x2.5 Degree + gefs +
    7
    + 2 + 2 + + 107 + + +
    3
    +
    + + + Global Wind-Wave Forecast Model + gww +
    7
    + 0 + 3 + + 10 + + +
    6
    +
    + + + Global Wind-Wave Forecast Model + gww +
    7
    + 0 + 229 + + 10 + +
    6
    +
    + + + NAEFS ensemble BC + naefsBC +
    7
    + 2 + 375 + + 114 + + +
    3
    +
    + + + NAEFS ensemble BC + naefsBC +
    7
    + 2 + 3 + + 114 + + +
    3
    +
    + + + NAEFS US + naefsUS +
    7
    + 2 + 197 + + 114 + + +
    3
    +
    + + + NAEFS Alaska + naefsAK +
    7
    + 2 + 198 + + 114 + + +
    3
    +
    + + + North America Ensemble Forecast 1.0 Degree (No data yet) + naefs +
    7
    + 2 + 229 + + 114 + +
    3
    +
    + + + SREF ensemble with NAM40 navigation + sref +
    7
    + 0 + 212 + + 84 + + +
    3
    +
    + + + ECMWF Global 1x1 Degree + ecmwf +
    98
    + 0 + 3 + + 141 + +
    3
    +
    + + + + ECMWF Global 2.5x2.5 Degrees + ecmwfg +
    98
    + 0 + 228 + + 141 + +
    3
    +
    + + + ECMWF Tropical 2.5x2.5 Degrees + ecmwft +
    98
    + 0 + 14529 + + 141 + +
    3
    +
    + + + + ECMWF Global Wave Model 1x1 Degree + ecmwfWave +
    98
    + 0 + 403 + + 108 + +
    3
    +
    + + + ECMWF Global 1x1 Degree + ecmwf +
    98
    + 0 + 372 + + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + +
    24
    +
    + + + Hybrid Single-Particle Lagrangian Integrated Trajectory Model + hysplit +
    7
    + 3 + 36928220 + + 3 + +
    1
    +
    + + + GFS PGRB 0.5 degree + gfsP5 +
    7
    + 0 + 4 + + 96 + 77 + 81 + +
    3
    +
    + + + GFS PGRB 0.5 degree + gfsP5 +
    7
    + 0 + 230 + + 96 + 77 + 81 + +
    3
    GFS PGRB 0.5 degree - GFS0.5 -
    7
    - 0 - 230 - - 96 - 77 - 81 - -
    3
    -
    - - - GFS PGRB 0.5 degree - GFS0.5 + gfsP5
    7
    0 408 @@ -64,7 +529,7 @@ GFS PGRB 1.0 DEGREE - GFS + gfs
    7
    0 229 @@ -74,48 +539,48 @@ 81 255 -
    4
    +
    3
    ECMWF Analysis from Global Data Assimilation System 1.0 DEGREE - GDAS + gdas
    7
    0 375 82 -
    4
    +
    3
    Analysis from Global Data Assimilation System 1.0 DEGREE - GDAS + gdas
    7
    0 3 82 -
    4
    +
    3
    Analysis from Global Data Assimilation System 1.0 DEGREE - GDAS + gdas
    7
    0 229 82 -
    4
    +
    3
    GFS PGRB 1.0 DEGREE - GFS + gfs
    7
    0 3 @@ -124,36 +589,36 @@ 77 81 -
    4
    +
    3
    NOGAPS 361X181 Lat/Lon 1.0 DEGREE - nogaps*/wave_* - NOGAPS + nogaps
    58
    0 401 58 -
    4
    +
    3
    - NOGAPS 361X181 Lat/Lon 1.0 DEGREE - NAM Model 15km version - NOGAPS110 + NOGAPS Global 1x1 Degree + fnmocWave
    58
    0 401 110 -
    4
    +
    6
    GFS PGRB 2.5 DEGREE - GFS + gfs
    7
    0 2 @@ -167,7 +632,7 @@ North American Regional Reanalysis GFS PGRB 2.5 DEGREE - NARR + narr
    98
    0 14529 @@ -179,7 +644,7 @@ North American Regional Reanalysis GFS PGRB 2.5 DEGREE - NARR + narr
    98
    0 2 @@ -191,7 +656,7 @@ North American Regional Reanalysis GFS PGRB 2.5 DEGREE - NARR + narr
    98
    0 228 @@ -203,7 +668,7 @@ GFS PGRB 2.5 DEGREE - GFS + gfs
    7
    0 228 @@ -216,68 +681,68 @@
    - NAM Arakawa E-Grid - NAM99 + Arakawa Staggered E-Grid for extended NAM12 + nam12E
    7
    0 99 89 -
    4
    +
    3
    - NGM Super C Grid - NAM + NAM 90.75464km at 60N + nam
    7
    0 104 84 -
    4
    +
    1
    NGM Big C-Grid - NGM101 + nam91
    7
    0 101 84 -
    4
    +
    3
    - NAM151 32-KM EXPANDED DOMAIN - NAM151 + NAM 32km Expanded Domain (STR) + nam32E
    7
    0 151 84 -
    4
    +
    3
    - NAM32 32-KM NOAMHI - NAM221 + NAM 32km LCC + nam32
    7
    0 221 84 -
    4
    +
    3
    NAM Eastern North Pacific - NAM243 + namP5ENP
    7
    0 243 @@ -289,31 +754,31 @@ LFM Analysis - LFM + lfm
    7
    0 5 84 -
    9
    +
    6
    LFM Forecast - LFM + lfm
    7
    0 6 84 -
    9
    +
    6
    RUC20 - RUC20 + ruc20
    7
    0 252 @@ -325,128 +790,31 @@ SFC RUC 212 - SRUC212 + ruc40
    7
    0 212 100 -
    5
    +
    3
    SFC RUC 88 - SRUC88 + ruc15
    7
    0 88 100 -
    5
    -
    - - - NAEFS 16X Resolution(5 km) - NAEFS197 -
    7
    - 2 - 197 - - 114 - -
    3
    -
    - - - NAEFS Grid over Alaska(Polar Stereographic) - AKNAEFS -
    7
    - 2 - 198 - - 114 - -
    3
    -
    - - - Global Ensemble Forecast 1.0 Degree - NAEFS -
    7
    - 2 - 3 - - 114 - -
    3
    -
    - - - North America Ensemble Forecast 1.0 Degree - NAEFS -
    7
    - 2 - 229 - - 114 - -
    3
    -
    - - - ECMWF North America Ensemble Forecast 1.0 Degree - NAEFS -
    7
    - 2 - 375 - - 114 -
    3
    - - GFSensemble 1.0 Degree - GEFS -
    7
    - 2 - 3 - - 107 - 255 - -
    3
    -
    - - - GFSensemble 1.0 Degree - GEFS -
    7
    - 2 - 229 - - 107 - -
    3
    -
    - - - GFSensemble 2.5 Degree - GEFS -
    7
    - 2 - 2 - - 107 - -
    3
    -
    - GFSensemble 5KM - GEFSNDGD + gefsNdgd
    7
    2 197 @@ -456,21 +824,9 @@
    3
    - - ECMWF Global Ensemble 1.0 Degree - ECENS -
    7
    - 2 - 375 - - 107 - -
    3
    -
    - World wide ECMWF - ECMWF25 + ecmwfg
    98
    0 2 @@ -479,18 +835,6 @@
    3
    - - - World wide ECMWF 1 degree LAMP - ECMWF -
    98
    - 0 - 403 - - 108 - -
    3
    -
    World wide ECMWF 1 degree WAVE @@ -576,7 +920,7 @@ NAM80 - NAM80 + nam80
    7
    0 211 @@ -588,7 +932,7 @@ RUC80 - RUC80 + ruc80
    7
    0 211 @@ -653,8 +997,8 @@
    - GFS-NOAMHI-High Resolution North American Master Grid(Lambert Conformal) - GFSNOAMHI + GFS North American High Resolution (32km) + gfs32
    7
    0 221 @@ -667,7 +1011,7 @@ GFS in the ECMWF grid navigation - GFS + gfs
    7
    0 375 @@ -747,21 +1091,8 @@
    - NAM40 - mesoNam212 -
    7
    - 0 - 212 - - 84 - -
    3
    -
    - - - NAM20 - mesoNam215 - mesoNam212 + NAM 20km + nam20
    7
    0 215 @@ -1013,7 +1344,7 @@ Coastal Ocean Circulation - RTOFSATL + ofsGmex
    7
    0 15058391 @@ -1025,7 +1356,7 @@ Coastal Ocean Circulation Short Term Forecast - RTOFSATLSTF + ofsWatl
    7
    0 -26535243 @@ -1164,7 +1495,7 @@ UKMET - UKMET + ukmet
    74
    0 45 @@ -1302,30 +1633,6 @@
    6
    - - Global Wind-Wave Forecast Model - GWW -
    7
    - 0 - 3 - - 10 - -
    6
    -
    - - - Global Wind-Wave Forecast Model - GWW -
    7
    - 0 - 229 - - 10 - -
    6
    -
    - GWW GWW233 @@ -1353,7 +1660,7 @@ NWW3 - NWWIII233 + nww3
    7
    0 233 @@ -1365,7 +1672,7 @@ Southern Hemisphere High Resolution Sea Ice - SeaIceSouthernHemisphere + iceSouth
    7
    0 400 @@ -1374,10 +1681,10 @@
    1
    - - - Southern Hemisphere High Resolution Sea Ice 0.5 degree - SeaIceSouthernHemisphere0.5 + + + Sea Ice Concentration 0.5x0.5 Degree Southern Hemisphere + iceSHP5
    7
    0 405 @@ -1386,10 +1693,23 @@
    1
    + + + Sea Ice Concentration 12.7km by 12.7km Southern Hemisphere + + iceSH12 +
    7
    + 0 + 172 + + 120 + +
    1
    +
    - Northern Hemisphere High Resolution Sea Ice - SeaIceNorthernHemisphere + Sea Ice Concentration 12.7km by 12.7km Northern Hemisphere + iceNH12
    7
    0 171 @@ -1400,8 +1720,8 @@
    - Global 1/12 degree Lat/Lon grid Sea Ice - SeaIce173 + Sea Ice Concentration 1/12 by 1/12 Degree Global + ice12th
    7
    0 173 @@ -1410,10 +1730,23 @@
    1
    - + - SeaIce - SeaIce + Sea Ice Concentration 25.4km by 25.4km Southern Hemisphere + + iceSH +
    7
    + 0 + 220 + + 120 + +
    1
    +
    + + + Sea Ice Concentration 25.4km by 25.4km Northern Hemisphere + iceNH
    7
    0 219 @@ -1423,9 +1756,9 @@
    1
    - - SeaIce - SeaIce235 + + Sea Ice Concentration 0.5x0.5 Degrees Global + iceP5
    7
    0 235 @@ -1475,7 +1808,7 @@ AKWAVE - WAVEAK + waveAK
    7
    0 239 @@ -1487,7 +1820,7 @@ WNAwave - WAVEWNA + wave15mAtl
    7
    0 238 @@ -1524,8 +1857,8 @@
    - NAM12 - NAM218 + NAM 12km and NAM GOES 12km + nam12
    7
    0 218 @@ -1549,7 +1882,7 @@ NAM Hawaii - NAMHI + namNestHI
    7
    0 406 @@ -1742,7 +2075,7 @@ Global 1/12 degree Lat/Lon -SST-Analysis - SSTA173 + sst12th
    7
    4 173 @@ -1814,7 +2147,7 @@ Global 0.5 degree Lat/Lon -SST-Analysis - SSTA235 + sstP5
    7
    4 235 @@ -1849,8 +2182,8 @@
    - DGEX - DGEX185 + Downscaled GFS with Eta Extension over US + dgexConus
    7
    0 185 @@ -1861,8 +2194,8 @@
    - DGEX - DGEX186 + Downscaled GFS with Eta Extension over Alaska + dgexAK
    7
    0 186 @@ -2016,7 +2349,7 @@ RUC13 - RUC13 + ruc13
    7
    0 130 @@ -2064,7 +2397,7 @@ RTMA Grid over - Guam(Mercator) - RTMAGUAM + rtmaGuam
    7
    4 199 @@ -2076,7 +2409,7 @@ RTMA - RTMA + rtma
    7
    4 197 @@ -2088,7 +2421,7 @@ RTMA-AK - RTMAAK + rtmaAK
    7
    0 198 @@ -2100,7 +2433,7 @@ RTMA-AK - RTMAAK + rtmaAK
    7
    4 198 @@ -2461,152 +2794,7 @@
    12
    - - ECMWF-LowRes - ECMWFNorthernHemisphere -
    98
    - 0 - 372 - - 120 - 121 - 122 - 123 - 124 - 125 - 126 - 127 - 128 - 129 - 130 - 131 - 132 - 133 - 134 - 135 - 136 - 137 - 138 - 139 - 140 - 141 - 142 - 143 - 144 - 145 - 146 - 147 - 148 - 149 - 150 - 151 - 152 - 153 - 154 - 155 - 156 - 157 - 158 - 159 - 160 - 161 - 162 - 163 - 164 - 165 - 166 - 167 - 168 - 169 - 170 - 171 - 172 - 173 - 174 - 175 - 176 - 177 - 178 - 179 - 180 - 181 - 182 - 183 - 184 - 185 - 186 - 187 - 188 - 189 - 190 - 191 - 192 - 193 - 194 - 195 - 196 - 197 - 198 - 199 - 200 - 201 - 202 - 203 - 204 - 205 - 206 - 207 - 208 - 209 - 210 - 211 - 212 - 213 - 214 - 215 - 216 - 217 - 218 - 219 - 220 - 221 - 222 - 223 - 224 - 225 - 226 - 227 - 228 - 229 - 230 - 231 - 232 - 233 - 234 - 235 - 236 - 237 - 238 - 239 - 240 - 241 - 242 - 243 - 244 - 245 - 246 - 247 - 248 - 249 - 250 - 251 - 252 - 253 - 254 - 255 - -
    24
    -
    + ECMWF-LowRes ECMWF1 @@ -3905,7 +4093,7 @@ AKwave 0.25X0.167 degree Lan/Lon grid - Alaska - WAVEAK0.25 + wave10mAK
    7
    0 15 @@ -3917,7 +4105,7 @@ AKwave 0.25X0.167 degree Lan/Lon grid - Alaska - WAVEAK0.25 + wave10mAK
    7
    0 15 @@ -3929,7 +4117,7 @@ AKwave 0.133X0.067 degree Lan/Lon grid - Alaska - WAVEAK0.133 + wave4mAK
    7
    0 16 @@ -3953,7 +4141,7 @@ Wave 0.167 degree Lan/Lon grid - US Weste Coast - WAVEWC + wave10mWC
    7
    0 13 @@ -3965,7 +4153,7 @@ Wave 0.167 degree Lan/Lon grid - US Weste Coast - WAVEWC + wave10mWC
    7
    0 13 @@ -3977,7 +4165,7 @@ Wave 0.067 degree Lan/Lon grid - US Weste Coast - WAVEWCHI + wave4mWC
    7
    0 17 @@ -4084,15 +4272,26 @@
    1
    - + - Aviation - AVIATION + Aviation-Icing + AWCICING
    7
    8 255202 191 + +
    1
    +
    + + + Aviation-Turb + AWCTURB +
    7
    + 8 + 255202 + 105
    1
    @@ -4210,7 +4409,7 @@ HiResW-ARW-East - HiResWARWEast + hireswArwE
    7
    0 255001 @@ -4222,7 +4421,7 @@ HiResW-ARW-West - HiResWARWWest + hireswArwW
    7
    0 255002 @@ -4234,7 +4433,7 @@ HiResW-ARW-AK - HiResWARWAK + hireswArwAK
    7
    0 255003 @@ -4246,7 +4445,7 @@ HiResW-ARW-PR - HiResWARWPR + hireswArwPR
    7
    0 255004 @@ -4258,7 +4457,7 @@ HiResW-ARW-HI - HiResWARWHI + hireswArwHI
    7
    0 255005 @@ -4270,7 +4469,7 @@ NMM-GUAM - NMMGUAM + hireswNmmGuam
    7
    0 11731129 @@ -4282,7 +4481,7 @@ NMM-PR - NMMPR + hireswNmmPR
    7
    0 13560489 @@ -4294,7 +4493,7 @@ HiResW-NMM-East - EASTNMM + hireswNmmE
    7
    0 255001 @@ -4307,7 +4506,7 @@ HiResW-NMM-West - WESTNMM + hireswNmmW
    7
    0 255002 @@ -4319,7 +4518,7 @@ HiResW-NMM-AK - AKNMM + hireswNmmAK
    7
    0 255003 @@ -4331,7 +4530,7 @@ HiResW-NMM-PR - PRNMM + hireswNmmPR
    7
    0 255004 @@ -4343,7 +4542,7 @@ HiResW-NMM-HI - HINMM + hireswNmmHI
    7
    0 255005 @@ -4356,7 +4555,7 @@ GRLKwave - GRLKwave + waveGL
    7
    0 176 @@ -4813,7 +5012,7 @@
    1
    - + NOGAPS - Ice Concentration Analysis NOGAPSWAVE @@ -4826,76 +5025,52 @@
    1
    - - AQM - AQM196 -
    7
    - 0 - 196 - - 211 - -
    8
    -
    + + AQM + AQM196 +
    7
    + 0 + 196 + + 211 + +
    8
    +
    - - AQM - AQM198 -
    7
    - 0 - 198 - - 211 - -
    8
    -
    + + AQM + AQM198 +
    7
    + 0 + 198 + + 211 + +
    8
    +
    - - AQM - AQM227 -
    7
    - 0 - 227 - - 211 - -
    8
    + + AQM + AQM227 +
    7
    + 0 + 227 + + 211 + +
    8
    +
    + + + + CMC-QLM + CMCQLM +
    54
    + 2 + -90045000 + + 70 + +
    3
    - - - CMC-HYCOM - North Pacific basin - CMC -
    54
    - 0 - 374 - - 47 - -
    3
    -
    - - - CMC-QLM - CMCQLM -
    54
    - 2 - -90045000 - - 70 - -
    3
    -
    - - - CMC-GEFS - CMCENS -
    54
    - 2 - 401 - - 70 - -
    3
    -
    -
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid1.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid1.xml index f2ff332fc0..730e78197d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid1.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid1.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid2.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid2.xml index 39d95053df..108a53de8c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid2.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid2.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid3.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid3.xml index 9fbe47920a..c6495c9896 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid3.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/Aviation-Grid3.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid1.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid1.xml index 89d417237a..db4d4a5c2c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid1.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid1.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid10.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid10.xml index f64d85205e..9ffee4353c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid10.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid10.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid11.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid11.xml index a19b66eae1..10765f610b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid11.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid11.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid12.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid12.xml index 4b18634754..7697a65ec5 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid12.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid12.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid2.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid2.xml index 3923951a11..5f1548fc7c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid2.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid2.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid3.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid3.xml index 7abe63bc28..2903565f4c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid3.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid3.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid4.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid4.xml index c57670c840..f3b42af1a1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid4.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid4.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid5.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid5.xml index 57fcfaf827..f471d9db33 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid5.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid5.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid6.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid6.xml index 1a06e4d8cc..f039f81e9d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid6.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid6.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid7.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid7.xml index 939d86033f..0becf592b7 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid7.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid7.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid8.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid8.xml index 6bda7e6344..9801e22670 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid8.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid8.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid9.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid9.xml index 4ddf0033cb..a869ab89af 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid9.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF-Grid9.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF_HR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF_HR.xml new file mode 100644 index 0000000000..4eff6f9015 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ECMWF_HR.xml @@ -0,0 +1,33 @@ + + + + 372 + Global ECMWF 361X181 Latitude/Longitude 1 deg Resolution + 361 + 181 + 90 + 0 + -90 + 360 + 1 + 1 + degree + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HYSPLIT.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HYSPLIT.xml new file mode 100644 index 0000000000..e47e39e4e0 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HYSPLIT.xml @@ -0,0 +1,33 @@ + + + + 36928220 + HYSPLIT + 314 + 83 + 36.9 + -77.1 + 45.1 + -45.8 + 0.1 + 0.1 + degree + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResAK.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResAK.xml index f4f197dc7c..3930903acb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResAK.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResAK.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResHI.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResHI.xml index 4a0e9c0888..66f2c113bb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResHI.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResHI.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResPR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResPR.xml index 734694e7a7..dd79ce984f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResPR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResPR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResWest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResWest.xml index e64a95cca4..63e2174c0f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResWest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiResWest.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiresEast.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiresEast.xml index 86bb808dd1..4117ffea45 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiresEast.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/HiresEast.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/NOGAPS_Gride.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/NOGAPS_Gride.xml new file mode 100644 index 0000000000..f7ac0c6cdd --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/NOGAPS_Gride.xml @@ -0,0 +1,33 @@ + + + + 401 + Global 360X181 Latitude/Longitude 1 deg Resolution + 360 + 181 + -90 + 0 + 90 + 359 + 1 + 1 + degree + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/RTMA-Grid197.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/RTMA-Grid197.xml index 58c86f48ec..4c4b0e1a8f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/RTMA-Grid197.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/RTMA-Grid197.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid1.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid1.xml index 53b78bd6ac..1106c34bb3 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid1.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid1.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10.xml index 6b3e78c9bc..219594e981 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid101.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid101.xml index a93a4bd3ec..5380885ca1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid101.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid101.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid104.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid104.xml index baf81530f0..b7ef7ff0c3 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid104.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid104.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10c.xml index b140cfdb3c..1a13df0bc6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid10c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11.xml index c5bb7080b7..c569302f02 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid110.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid110.xml index b4f95e5efb..9405c5902d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid110.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid110.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11c.xml index e2c068845c..eb139145a6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid11c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid12.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid12.xml index 39dac6d314..4d97d31a39 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid12.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid12.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126.xml index 74511c1d0f..8b0f2041a1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126c.xml index 72b6b7871c..7306e952c1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid126c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127.xml index a3a9b3cc2a..e045471862 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127c.xml index dd96ba8211..9321e31c7f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid127c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128.xml index 03310ffac9..50a7b23acc 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128c.xml index cfd497511b..d2612c2b29 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid128c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129.xml index f957915ea6..0a259fd9af 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129c.xml index 626e06bafc..b37eb43820 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid129c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid13.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid13.xml index d750b0db03..59e14ac32e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid13.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid13.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid130.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid130.xml index 285d553ca9..17f76b70fc 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid130.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid130.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid138.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid138.xml index 2d2b88b8e3..4ff0093571 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid138.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid138.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid14.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid14.xml index 909eb7e63b..bac3aac5db 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid14.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid14.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid145.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid145.xml index d293837977..5fe2120e67 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid145.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid145.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid146.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid146.xml index 6ba234dcea..a49ca24e97 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid146.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid146.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid147.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid147.xml index 291eb75c2f..4b812a8f6c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid147.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid147.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid148.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid148.xml index 31e6d40b86..5f781dc24a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid148.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid148.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid15.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid15.xml index d02a602c84..294c03f4be 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid15.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid15.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid150.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid150.xml index 6ca4e1af28..5b2b656460 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid150.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid150.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid151.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid151.xml index c94feadb49..c8f25bdb44 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid151.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid151.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid16.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid16.xml index 0cd61689f5..2ad72d561f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid16.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid16.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid160.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid160.xml index 713012cde3..afc4e6fe80 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid160.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid160.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid161.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid161.xml index 2b41137e63..727c56f81e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid161.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid161.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid163.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid163.xml index 0432212fde..518f6635ea 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid163.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid163.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid17.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid17.xml index 9773ab010e..0bfa2e96e1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid17.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid17.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170.xml index d07ce68baa..701e31d722 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170c.xml index 16761a797e..5cccf210ed 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid170c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid171.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid171.xml index 79e6d35f0a..998e2b7d2f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid171.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid171.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid172.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid172.xml index caa214c40d..0071a1050e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid172.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid172.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid172c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid172c.xml new file mode 100644 index 0000000000..d38bb0f568 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid172c.xml @@ -0,0 +1,35 @@ + + + + 172 + Southern Hemisphere High Resolution Sea Ice Grid + (polar stereographic) + 6371229.0 + 6371229.0 + 690 + 710 + -36.899599 + 139.805573 + 100 + 12.7 + 12.7 + km + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173.xml index bbe75d6e62..a8ccd7dc4b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173c.xml index ef99d3860f..89c10b6997 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid173c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174.xml index dff9db595e..6bc649734e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174c.xml index fcac138d34..654068356c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid174c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid175.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid175.xml index b0a90760e1..7778031cc3 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid175.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid175.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid176.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid176.xml index 91858c87af..ed6f4be3cb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid176.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid176.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid18.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid18.xml index c08f14fd55..e843601f16 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid18.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid18.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid180.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid180.xml index bb6e7cb954..c0bf7c4d82 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid180.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid180.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid181.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid181.xml index 14483d839b..18f51e6416 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid181.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid181.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid182.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid182.xml index 8a0013334a..4452eecff8 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid182.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid182.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid183.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid183.xml index 6d07eba8f0..2a4b8d6d69 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid183.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid183.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid185.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid185.xml index a6f1cc6eec..12629a3365 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid185.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid185.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid186.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid186.xml index 03dc917f58..5c86473dbf 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid186.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid186.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid195.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid195.xml index c520c25d85..c6401c89dd 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid195.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid195.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid196.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid196.xml index c2bd7a2311..eb9c9335c1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid196.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid196.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid197.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid197.xml index 4eddaed640..6fc53c8061 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid197.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid197.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid198.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid198.xml index 2fbb46bc3f..cf5d160a6e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid198.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid198.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid199.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid199.xml index 52e9fbe1c5..0d47d82f25 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid199.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid199.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid2.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid2.xml index 6a8832552f..9c4111f4fb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid2.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid2.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid201.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid201.xml index 82c1f46eeb..d36d268940 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid201.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid201.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid202.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid202.xml index 73230b5827..a7718ca46a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid202.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid202.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid203.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid203.xml index 9dddc1b004..293e6c63b8 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid203.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid203.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid204.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid204.xml index 309c5e0855..bb65377895 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid204.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid204.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid205.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid205.xml index 28dd9c5d77..0715dbac6b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid205.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid205.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid206.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid206.xml index 9c15a57fdf..784405382b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid206.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid206.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid207.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid207.xml index 2a187da017..5f243cbbdf 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid207.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid207.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid208.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid208.xml index 7c749bc7c3..456c697dd2 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid208.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid208.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid209.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid209.xml index f7faa71d97..ce25faacf2 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid209.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid209.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid210.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid210.xml index b4a5f96271..8d6bc2be1c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid210.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid210.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid211.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid211.xml index 07aee483b4..b72b88a6dd 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid211.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid211.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid212.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid212.xml index e1d9e5ebb5..0c52c2dd8b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid212.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid212.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid213.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid213.xml index 9da391cfe8..213be5ca89 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid213.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid213.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid214.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid214.xml index 5f89e13fc6..40ce8ce810 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid214.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid214.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid215.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid215.xml index 3448bece8d..17d81e4935 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid215.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid215.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid216.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid216.xml index a0c50adb81..59ae519f97 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid216.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid216.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid217.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid217.xml index 0e39a70732..acdc4f556f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid217.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid217.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid218.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid218.xml index 04187460bd..2ed2d27782 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid218.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid218.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid219.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid219.xml index 34194d92c8..ad02e8886e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid219.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid219.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid220.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid220.xml index 225d2e7f91..62e700fd50 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid220.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid220.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid221.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid221.xml index 3f722029c7..9084126583 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid221.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid221.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid222.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid222.xml index bd76ed9f5d..88d803a4a3 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid222.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid222.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid223.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid223.xml index 681244e8d5..d39d5c5227 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid223.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid223.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid224.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid224.xml index ef170ea6d6..be10580224 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid224.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid224.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid225.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid225.xml index 6a2227476a..12f162f92a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid225.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid225.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid226.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid226.xml index 7b1e0e1515..90ed196d91 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid226.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid226.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid227.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid227.xml index cd65b1a611..69feb42d43 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid227.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid227.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228.xml index 4a1ade36e4..f798817545 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228.xml @@ -1,20 +1,20 @@ @@ -22,7 +22,7 @@ 228 Global (longitude/latitude grid) 144 - 83 + 73 90 0 -90 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228c.xml index ee765c70eb..468b353a43 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid228c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229.xml index ee30882d0e..839cf1765c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229c.xml index c1a5b8dac4..9078031485 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid229c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230.xml index bfbe351c75..4918afe41d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230c.xml index 91ed96e648..5157e0b49c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid230c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231.xml index c7b0c54c06..696d73d2fd 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231c.xml index ccb4298994..136e4dc2cb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid231c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232.xml index d5d9219bb5..1e0bc33471 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232c.xml index 79b34c4c0f..8a4444b0b3 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid232c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233.xml index 97cdb2aabf..939732e719 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233c.xml index 89c02f7254..ca9ba4ac38 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid233c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid234.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid234.xml index e5120632be..b32567cacf 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid234.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid234.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235.xml index 92391509b7..9822207f8e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235c.xml index f05469bf7d..3797ffeafa 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid235c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid236.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid236.xml index 251257092c..c62a1d7dbd 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid236.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid236.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid237.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid237.xml index c47874d3df..c2964e5438 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid237.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid237.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid238.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid238.xml index e5fbce468a..a2907270c6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid238.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid238.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid239.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid239.xml index 439883c513..72a1f1b83e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid239.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid239.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240.xml index 2fe4759509..788d073103 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ALR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ALR.xml index 2cf4014b4a..d0b574008e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ALR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ALR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240FWR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240FWR.xml index 79f89251bb..57b3ae3849 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240FWR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240FWR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240KRF.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240KRF.xml index 1c5f011274..8903fee0bc 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240KRF.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240KRF.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240MSR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240MSR.xml index f8272b6789..5a3a383a71 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240MSR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240MSR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ORN.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ORN.xml index 8b001ae2cb..7454134c87 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ORN.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240ORN.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240PTR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240PTR.xml index ac79f1a147..e03020f108 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240PTR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240PTR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RHA.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RHA.xml index 22c9b11c4b..fc6403abdd 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RHA.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RHA.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RSA.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RSA.xml index ed87a56ca4..640d1bd4cb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RSA.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240RSA.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240STR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240STR.xml index 86a91e3bfd..cf1f554c30 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240STR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240STR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TAR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TAR.xml index 7c96d93c91..424c8d52c6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TAR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TAR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TIR.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TIR.xml index 7b3ffdb7df..658172817b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TIR.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TIR.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TUA.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TUA.xml index 75f16f44aa..c7de95fc07 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TUA.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid240TUA.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid241.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid241.xml index d89cb69354..10a5859728 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid241.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid241.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid242.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid242.xml index ebc21427a6..3fabbff6eb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid242.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid242.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid243.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid243.xml index 7951ec7abc..f8a32619cc 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid243.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid243.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid244.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid244.xml index a6786e4e82..491475cac9 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid244.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid244.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid245.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid245.xml index f4414d30cd..d8aa08981b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid245.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid245.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid246.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid246.xml index bdde6ae84b..0498faa6a4 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid246.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid246.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid247.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid247.xml index 594acd5d9a..0f2d7ea64c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid247.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid247.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid248.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid248.xml index 082fbc42ee..7424eef426 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid248.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid248.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid249.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid249.xml index 53df2c92f9..3ab1cb3666 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid249.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid249.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid250.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid250.xml index 906c8af4f3..700526bcb0 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid250.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid250.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid251.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid251.xml index 0b9d230059..682d68d515 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid251.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid251.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid252.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid252.xml index f28aea370d..b8f990fde5 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid252.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid252.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid253.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid253.xml index 375ebf0fd4..69fcd3cf83 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid253.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid253.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid254.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid254.xml index 432a9dcaaa..ecd3cd80be 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid254.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid254.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid29.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid29.xml index 2a1c366d33..e3259b96e1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid29.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid29.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3.xml index ba25f59021..91c51f8468 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid30.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid30.xml index a651418b35..1e264de235 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid30.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid30.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid33.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid33.xml index 17f94ee888..ddc537d997 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid33.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid33.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid34.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid34.xml index 745605676e..6989b1c8d1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid34.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid34.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid37.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid37.xml index 9df87b19c8..cf4d82b219 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid37.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid37.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid38.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid38.xml index 3e2711c508..53e597c4f7 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid38.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid38.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid39.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid39.xml index 42ac7626c5..987868386e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid39.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid39.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3c.xml index 5c6ea1f907..f5c23c4f93 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid3c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid4.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid4.xml index 5592137a04..a25b3e4483 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid4.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid4.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid40.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid40.xml index 88dc11163e..11586b6c4a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid40.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid40.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid41.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid41.xml index 8d074bf3ba..6996dc5d9f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid41.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid41.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid42.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid42.xml index fdff18959c..cf5554b58a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid42.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid42.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid43.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid43.xml index 056caa1d9a..80419ceabc 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid43.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid43.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid44.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid44.xml index 9fcd8dc9c6..cc20c7396d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid44.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid44.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45.xml index fb105922d2..54db8b6a93 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45c.xml index ecfdca1223..d1fecd32a1 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid45c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid5.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid5.xml index f2148a663d..497e073ae6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid5.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid5.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid6.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid6.xml index 8f8c1c5b27..a075bac54b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid6.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid6.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid720.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid720.xml new file mode 100644 index 0000000000..e22eac19a8 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid720.xml @@ -0,0 +1,33 @@ + + + + 72051 + 0.167 degree Latitude/Longitude for the US East Coast grid + 720 + 51 + 90 + 65 + 0 + 359.5 + 0.5 + 0.5 + degree + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid85.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid85.xml index dd11ed9c78..b76a6e0530 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid85.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid85.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid86.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid86.xml index aa4ba9703f..06bab8c018 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid86.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid86.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid87.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid87.xml index 52dcb5ab88..a92248bd80 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid87.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid87.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid88.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid88.xml index 41d75ea19e..5dd087a168 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid88.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid88.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98.xml index 850d1aa45f..cadda74556 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98c.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98c.xml index f147cae649..d2aaf4d111 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98c.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid98c.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid99.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid99.xml index 8e8abadd0b..588488ba11 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid99.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/grid99.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ncwf.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ncwf.xml index e95a174066..9985a9899d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ncwf.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/ncwf.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/rcm.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/rcm.xml index 97d866f338..73ddf80a0b 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/rcm.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/ncgrids/rcm.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/tables/7/0/4.2.0.19.table b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/tables/7/0/4.2.0.19.table index 8779d5ed5d..657a14e166 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/tables/7/0/4.2.0.19.table +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/utility/edex_static/base/ncgrib/tables/7/0/4.2.0.19.table @@ -1,4 +1,28 @@ # Product Discipline 0: Meteorological products, Parameter Category 19: Physical atmospheric properties +0:0:Visibility:m:VIS +1:1:Albedo:%:ALBDO +2:2:Thunderstorm Probability:%:TSTM +3:3:Mixed Layer Depth:m:MIXHT +4:4:Volcanic Ash:See Table 4.206:VOLASH +5:5:Icing Top:m:ICIT +6:6:Icing Base:m:ICIB +7:7:Icing:See Table 4.207:ICI +8:8:Turbulence Top:m:TURBT +9:9:Turbulence Base:m:TURBB +10:10:Turbulence:See Table 4.208:TURB +11:11:Turbulent Kinetic Energy:J kg-1:TKE +12:12:Planetary Boundary Layer Regime:See Table 4.209:PBLREG +13:13:Contrail Intensity:See Table 4.210:CONTI +14:14:Contrail Engine Type:See Table 4.211:CONTET +15:15:Contrail Top:m:CONTT +16:16:Contrail Base:m:CONTB +17:17:Maximum Snow Albedo*:%:MXSALB +18:18:Snow-Free Albedo:%:SNFALB +19:19:Snow Albedo:%:SALBD +20:20:Icing:%:ICIP +21:21:In-Cloud Turbulence:%:CTP +22:22:Clear Air Turbulence (CAT):%:CAT +23:23:Supercooled Large Droplet (SLD) Probabilitysee note 1:%:SLDP #192-254 Reserved for local use 192:192:Maximum Snow Albedo:%:MXSALB 193:193:Snow-Free Albedo:%:SNFALB diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/gov.noaa.nws.ncep.edex.plugin.ncpafm.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/gov.noaa.nws.ncep.edex.plugin.ncpafm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/src/gov/noaa/nws/ncep/edex/plugin/ncpafm/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/src/gov/noaa/nws/ncep/edex/plugin/ncpafm/decoder/package-info.java index a93ee98c6c..944968dc41 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/src/gov/noaa/nws/ncep/edex/plugin/ncpafm/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/src/gov/noaa/nws/ncep/edex/plugin/ncpafm/decoder/package-info.java @@ -1,7 +1,7 @@ -/** - * PAFM implementation of the plugin pattern. - * - * Package includes classes to decode the PAFM message and persist the data. - * - */ +/** + * PAFM implementation of the plugin pattern. + * + * Package includes classes to decode the PAFM message and persist the data. + * + */ package gov.noaa.nws.ncep.edex.plugin.ncpafm.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/gov.noaa.nws.ncep.edex.plugin.ncpirep.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/gov.noaa.nws.ncep.edex.plugin.ncpirep.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepDecoder.java index 0023a89bad..4487a3a081 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepDecoder.java @@ -1,138 +1,138 @@ /** * This software was modified from Raytheon's airep plugin by * NOAA/NWS/NCEP/NCO to order to output point data in HDF5. - **/ -package gov.noaa.nws.ncep.edex.plugin.ncpirep; - -import java.util.Calendar; + **/ +package gov.noaa.nws.ncep.edex.plugin.ncpirep; + +import java.util.Calendar; import java.util.List; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.exception.DecoderException; -import com.raytheon.edex.plugin.AbstractDecoder; -import com.raytheon.uf.common.dataplugin.PluginDataObject; + +import com.raytheon.edex.esb.Headers; +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.pointdata.spatial.AircraftObsLocation; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.edex.decodertools.aircraft.AircraftCloudLayer; -import com.raytheon.uf.edex.decodertools.aircraft.AircraftFlightCondition; -import com.raytheon.uf.edex.decodertools.core.BasePoint; -import com.raytheon.uf.edex.decodertools.core.DecoderTools; -import com.raytheon.uf.edex.decodertools.core.IDecoderInput; -import com.raytheon.uf.edex.decodertools.time.TimeTools; -import com.raytheon.uf.edex.wmo.message.WMOHeader; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.decodertools.aircraft.AircraftCloudLayer; +import com.raytheon.uf.edex.decodertools.aircraft.AircraftFlightCondition; +import com.raytheon.uf.edex.decodertools.core.BasePoint; +import com.raytheon.uf.edex.decodertools.core.DecoderTools; +import com.raytheon.uf.edex.decodertools.core.IDecoderInput; +import com.raytheon.uf.edex.decodertools.time.TimeTools; +import com.raytheon.uf.edex.wmo.message.WMOHeader; import gov.noaa.nws.ncep.common.dataplugin.ncpirep.NcPirepLayerData; import gov.noaa.nws.ncep.common.dataplugin.ncpirep.NcPirepRecord; -import gov.noaa.nws.ncep.edex.plugin.ncpirep.decoder.NcPirepParser; -/** - * Decoder strategy for text PIREP observation data. Most common usage is as - * follows. - * NcPirepDecoder dec = new NcPirepDecoder(); - * dec.setMessage(msgData); - * while(dec.hasNext()) - * { - * PluginDataObject r = dec.decode(); - * // do something with record. - * } - * - * - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    +import gov.noaa.nws.ncep.edex.plugin.ncpirep.decoder.NcPirepParser;
    +/**
    + * Decoder strategy for text PIREP observation data. Most common usage is as
    + * follows. 
    + *   NcPirepDecoder dec = new NcPirepDecoder();
    + *   dec.setMessage(msgData);
    + *   while(dec.hasNext())
    + *   {
    + *      PluginDataObject r = dec.decode();
    + *      // do something with record.
    + *   }
    + * 
    + * 
    + * 
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
      * 04/28/2011              F.J.Yen     Initial creation from pirep.
      * 20110830     286        qzhou       Fixed report time
    - * 09/26/2011   286        qzhou       Changed reportType from int to string
    - * 
    - * - * @author F. J. Yen - * @version 1.0 - */ -public class NcPirepDecoder extends AbstractDecoder { - // Name of the plugin controlling this decoder. - private final String PLUGIN_NAME; - - /** - * Construct this decoder using supplied plugin name. - * - * @throws DecoderException - */ - public NcPirepDecoder(String pluginName) throws DecoderException { - PLUGIN_NAME = pluginName; - } - - /** - * Get the next decoded data record. - * - * @param input - * the input - * @return One record of decoded data. - * @throws DecoderException - * Thrown if no data is available. - */ - public PluginDataObject[] decode(IDecoderInput input, Headers headers) + * 09/26/2011 286 qzhou Changed reportType from int to string + *
    + * + * @author F. J. Yen + * @version 1.0 + */ +public class NcPirepDecoder extends AbstractDecoder { + // Name of the plugin controlling this decoder. + private final String PLUGIN_NAME; + + /** + * Construct this decoder using supplied plugin name. + * + * @throws DecoderException + */ + public NcPirepDecoder(String pluginName) throws DecoderException { + PLUGIN_NAME = pluginName; + } + + /** + * Get the next decoded data record. + * + * @param input + * the input + * @return One record of decoded data. + * @throws DecoderException + * Thrown if no data is available. + */ + public PluginDataObject[] decode(IDecoderInput input, Headers headers) throws DecoderException { - - PluginDataObject[] reports = null; - - String traceId = ""; - if (headers != null) { - traceId = (String) headers.get("traceId"); - } - try { - logger.debug(traceId + "- NcPirepDecoder.decode()"); + + PluginDataObject[] reports = null; + + String traceId = ""; + if (headers != null) { + traceId = (String) headers.get("traceId"); + } + try { + logger.debug(traceId + "- NcPirepDecoder.decode()"); System.out.println("****"+input.getReport() ); - - NcPirepRecord report = populateRecord(new NcPirepParser(input - .getReport(), traceId), input.getWmoHeader()); - - if (report != null) { - report.setTraceId(traceId); - report.setPluginName(PLUGIN_NAME); - try { - report.constructDataURI(); - } catch (PluginException e) { - fixTrace(e); - logger.error(traceId + "- Unable to construct dataURI", e); - } - reports = new PluginDataObject[] { report }; - } - - } catch (Exception e) { - fixTrace(e); - logger.error(traceId + "- Error in NcPirepDecoder", e); - } finally { - if (reports == null) { - reports = new PluginDataObject[0]; - } - } - return reports; - } - - /** - * Populate a NcPirepRecord with data that was decoded from a single PIREP - * report. - * - * @param parser - * The NcPIREP parser that contains the decoded data. - * @param wmoHeader - * the wmo header - * @return The populated record. This method returns a null reference if - * either the observation time or location data is unavailable. - */ - private NcPirepRecord populateRecord(NcPirepParser parser, WMOHeader wmoHeader) { - - NcPirepRecord record = null; + + NcPirepRecord report = populateRecord(new NcPirepParser(input + .getReport(), traceId), input.getWmoHeader()); + + if (report != null) { + report.setTraceId(traceId); + report.setPluginName(PLUGIN_NAME); + try { + report.constructDataURI(); + } catch (PluginException e) { + fixTrace(e); + logger.error(traceId + "- Unable to construct dataURI", e); + } + reports = new PluginDataObject[] { report }; + } + + } catch (Exception e) { + fixTrace(e); + logger.error(traceId + "- Error in NcPirepDecoder", e); + } finally { + if (reports == null) { + reports = new PluginDataObject[0]; + } + } + return reports; + } + + /** + * Populate a NcPirepRecord with data that was decoded from a single PIREP + * report. + * + * @param parser + * The NcPIREP parser that contains the decoded data. + * @param wmoHeader + * the wmo header + * @return The populated record. This method returns a null reference if + * either the observation time or location data is unavailable. + */ + private NcPirepRecord populateRecord(NcPirepParser parser, WMOHeader wmoHeader) { + + NcPirepRecord record = null; AircraftObsLocation location = null; - - if (parser != null) { - // If there is no observation time or location, don't bother going further. + + if (parser != null) { + // If there is no observation time or location, don't bother going further. - // parser.getObservationTime() get the current day of month. Need to set wmoHeader day. + // parser.getObservationTime() get the current day of month. Need to set wmoHeader day. Calendar oTime = parser.getObservationTime(); if (oTime != null) { // try { @@ -143,125 +143,125 @@ public class NcPirepDecoder extends AbstractDecoder { // catch (ArrayIndexOutOfBoundsException e) { // } // } - - BasePoint p = parser.getLocation(); - - if ((oTime != null) && (p != null)) { - record = new NcPirepRecord(); - location = new AircraftObsLocation(); - - record.setTimeObs(oTime); - record.setRefHour(TimeTools.copyToNearestHour(oTime)); - DataTime dataTime = new DataTime(oTime); - record.setDataTime(dataTime); - - record.setWmoHeader(wmoHeader.getWmoHeader()); - record.setObsText(DecoderTools.normalizeObs(parser - .getReportData(), wmoHeader.getWmoHeader())); - - location.setLatitude(p.getLatitude()); - location.setLongitude(p.getLongitude()); + + BasePoint p = parser.getLocation(); + + if ((oTime != null) && (p != null)) { + record = new NcPirepRecord(); + location = new AircraftObsLocation(); + + record.setTimeObs(oTime); + record.setRefHour(TimeTools.copyToNearestHour(oTime)); + DataTime dataTime = new DataTime(oTime); + record.setDataTime(dataTime); + + record.setWmoHeader(wmoHeader.getWmoHeader()); + record.setObsText(DecoderTools.normalizeObs(parser + .getReportData(), wmoHeader.getWmoHeader())); + + location.setLatitude(p.getLatitude()); + location.setLongitude(p.getLongitude()); location.setLocation(p.getLatitude(), p.getLongitude()); location.setStationId(parser.getReportingStationId()); - - record.setReportData(parser.getReportData()); + + record.setReportData(parser.getReportData()); record.setReportType("PIREP"); //parser.getReportType()); - - location.setFlightLevel(parser.getFlightLevel()); + + location.setFlightLevel(parser.getFlightLevel()); record.setAircraftType(parser.getAircraftType()); - + record.setTemp(parser.getTemperature()); - - record.setWindDirection(parser.getWindDirection()); - record.setWindSpeed(parser.getWindSpeed()); - - record.setLocation(location); - - record.setHorzVisibility(parser.getHorzVisibility()); + + record.setWindDirection(parser.getWindDirection()); + record.setWindSpeed(parser.getWindSpeed()); + + record.setLocation(location); + + record.setHorzVisibility(parser.getHorzVisibility()); record.setSuspectTimeFlag(parser.getSuspectTimeFlag()); - - // Collect the decoded icing flight conditions data - List icing = parser + + // Collect the decoded icing flight conditions data + List icing = parser .getIcingLayers(); - if (icing != null) { + if (icing != null) { for (AircraftFlightCondition layer : icing) { - - NcPirepLayerData iceLayer = NcPirepLayerData.getIceLayerData(layer); - if (iceLayer != null) { - - record.addLayer(iceLayer); - } - } // for - } - // Collect the decoded turbulence flight conditions data + + NcPirepLayerData iceLayer = NcPirepLayerData.getIceLayerData(layer); + if (iceLayer != null) { + + record.addLayer(iceLayer); + } + } // for + } + // Collect the decoded turbulence flight conditions data List turbc = parser.getTurbulenceLayers(); - if (turbc != null) { + if (turbc != null) { for (AircraftFlightCondition layer : turbc) { - NcPirepLayerData turbLayer = NcPirepLayerData + NcPirepLayerData turbLayer = NcPirepLayerData .getTurbLayerData(layer); - - if (turbLayer != null) { - + + if (turbLayer != null) { + record.addLayer(turbLayer); - //record.getAncPirepData(). - } - } // for - } - + //record.getAncPirepData(). + } + } // for + } + List clouds = parser.getCloudLayers(); - if (clouds != null) { + if (clouds != null) { for (AircraftCloudLayer layer : clouds) { - NcPirepLayerData cloudLayer = NcPirepLayerData + NcPirepLayerData cloudLayer = NcPirepLayerData .getCloudLayerData(layer); - - if (cloudLayer != null) { + + if (cloudLayer != null) { record.addLayer(cloudLayer); - - } - } // for - } - - String[] weatherCodes = parser.getWeatherCodes(); - if (weatherCodes != null) { - StringBuilder sb = new StringBuilder(); - for (String code : weatherCodes) { - sb.append(code); - sb.append(" "); - } - record.setWeatherGroup(sb.toString().trim()); - } + + } + } // for + } + + String[] weatherCodes = parser.getWeatherCodes(); + if (weatherCodes != null) { + StringBuilder sb = new StringBuilder(); + for (String code : weatherCodes) { + sb.append(code); + sb.append(" "); + } + record.setWeatherGroup(sb.toString().trim()); + } } - } - } - return record; - } - - /** - * - * @param e - * @return - */ - private Throwable fixTrace(Throwable e) { - StackTraceElement[] trace = e.getStackTrace(); - - StackTraceElement[] newTrace = null; - - int traceIdx = trace.length - 1; - for (; traceIdx >= 0; traceIdx--) { - StackTraceElement element = trace[traceIdx]; - if (element.getClassName().indexOf("com.raytheon") >= 0) { - break; - } - } - if (traceIdx >= 0) { - newTrace = new StackTraceElement[traceIdx + 1]; - for (int j = 0; j < traceIdx + 1; j++) { - newTrace[j] = trace[j]; - } - e.setStackTrace(newTrace); - } - return e; - } + } + } + return record; + } + + /** + * + * @param e + * @return + */ + private Throwable fixTrace(Throwable e) { + StackTraceElement[] trace = e.getStackTrace(); + + StackTraceElement[] newTrace = null; + + int traceIdx = trace.length - 1; + for (; traceIdx >= 0; traceIdx--) { + StackTraceElement element = trace[traceIdx]; + if (element.getClassName().indexOf("com.raytheon") >= 0) { + break; + } + } + if (traceIdx >= 0) { + newTrace = new StackTraceElement[traceIdx + 1]; + for (int j = 0; j < traceIdx + 1; j++) { + newTrace[j] = trace[j]; + } + e.setStackTrace(newTrace); + } + return e; + } public static final void main(String [] args) { @@ -290,5 +290,5 @@ public static final void main(String [] args) { if((data != null) && (data.length > 0)) { System.out.println(data[0]); } - } -} + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepSeparator.java index 4125d5bada..8f68c9365f 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/NcPirepSeparator.java @@ -1,159 +1,159 @@ /** * This software was modified from Raytheon's pirep plugin by * NOAA/NWS/NCEP/NCO to order to output point data in HDF5. - **/ -package gov.noaa.nws.ncep.edex.plugin.ncpirep; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - + **/ +package gov.noaa.nws.ncep.edex.plugin.ncpirep; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.uf.edex.decodertools.core.DecoderInput; -import com.raytheon.uf.edex.decodertools.core.IDecoderInput; -import com.raytheon.uf.edex.wmo.message.WMOHeader; - -/** - * The NcPirepSeparator takes a potential weather message and attempts to - * determine the WMO header and data type of the enclosed data. Normal usage is - * to create an instance and set the message data using the setData method. When - * complete the separator contains the WMO header, the message data with all - * leading data up to and including the WMO header removed. In addition all - * extraneous spaces and carriage control has been removed. The message reports - * are available using hasNext to determine if data is available, and the - * getRecord method to retrieve the actual report data. Note that this separator - * implementation should not be used on mixed text/binary weather messages. - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    +import com.raytheon.edex.plugin.AbstractRecordSeparator;
    +import com.raytheon.uf.edex.decodertools.core.DecoderInput;
    +import com.raytheon.uf.edex.decodertools.core.IDecoderInput;
    +import com.raytheon.uf.edex.wmo.message.WMOHeader;
    +
    +/**
    + * The NcPirepSeparator takes a potential weather message and attempts to
    + * determine the WMO header and data type of the enclosed data. Normal usage is
    + * to create an instance and set the message data using the setData method. When
    + * complete the separator contains the WMO header, the message data with all
    + * leading data up to and including the WMO header removed. In addition all
    + * extraneous spaces and carriage control has been removed. The message reports
    + * are available using hasNext to determine if data is available, and the
    + * getRecord method to retrieve the actual report data. Note that this separator
    + * implementation should not be used on mixed text/binary weather messages.
    + * 
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
      * 04/28/2011              F.J.Yen       Initial creation from pirep.
      * 09/22/2011   286        qzhou       Put new regex pattern to get header time. Do separate message accordingly.
    - * 									   Modified doSeparate and added separate()
    - * 
    - * - * @author jkorman - * @version 1.0 - */ -public class NcPirepSeparator extends AbstractRecordSeparator { - /** The logger */ - private Log logger = LogFactory.getLog(getClass()); - - //private static final String PIREP_HDR = "[\\r\\n]*.*(UA|UUA) +/OV"; + * Modified doSeparate and added separate() + *
    + * + * @author jkorman + * @version 1.0 + */ +public class NcPirepSeparator extends AbstractRecordSeparator { + /** The logger */ + private Log logger = LogFactory.getLog(getClass()); + + //private static final String PIREP_HDR = "[\\r\\n]*.*(UA|UUA) +/OV"; private static final String SPLITMSG = "\\r\\n\\x03"; private static final String PIREP = "[A-Z]{3}[ ](UA|UUA)"; private static final String HEADER_TIME = "[0-9]{6}"; - - private WMOHeader wmoHeader = null; - - private byte[] messageData = null; - - private List reports = new ArrayList();; - - private int currentReport = -1; - - public static NcPirepSeparator separate(byte[] data, Headers headers) { - NcPirepSeparator ncPirepSeparator = new NcPirepSeparator(); - ncPirepSeparator.setData(data, headers); - return ncPirepSeparator; - } - - /** - * Get the next record. This implementation returns the record as a String. - * - * @return The next observation record as a String. - */ - @Override - public IDecoderInput next() { - - IDecoderInput data = null; - if (hasNext()) { - data = new DecoderInput(wmoHeader,reports.get(currentReport++)); - } - return data; - } - - /** - * Is there another record available? - * - * @return Is there another record available? - */ - @Override - public boolean hasNext() { - return ((reports != null) && (reports.size() > 0) && (currentReport < reports - .size())); - } - - /** - * Set the raw message data and invoke the internal message separation - * process. - * - * @param rawMessage - * The raw weather text message. - */ - @Override - public void setData(byte[] rawMessage, Headers headers) { - currentReport = -1; + + private WMOHeader wmoHeader = null; + + private byte[] messageData = null; + + private List reports = new ArrayList();; + + private int currentReport = -1; + + public static NcPirepSeparator separate(byte[] data, Headers headers) { + NcPirepSeparator ncPirepSeparator = new NcPirepSeparator(); + ncPirepSeparator.setData(data, headers); + return ncPirepSeparator; + } + + /** + * Get the next record. This implementation returns the record as a String. + * + * @return The next observation record as a String. + */ + @Override + public IDecoderInput next() { + + IDecoderInput data = null; + if (hasNext()) { + data = new DecoderInput(wmoHeader,reports.get(currentReport++)); + } + return data; + } + + /** + * Is there another record available? + * + * @return Is there another record available? + */ + @Override + public boolean hasNext() { + return ((reports != null) && (reports.size() > 0) && (currentReport < reports + .size())); + } + + /** + * Set the raw message data and invoke the internal message separation + * process. + * + * @param rawMessage + * The raw weather text message. + */ + @Override + public void setData(byte[] rawMessage, Headers headers) { + currentReport = -1; reports = null; - System.out.println("========== Begin =============== "); - //rawMessage = DecoderTools.cleanData(rawMessage); - if (rawMessage != null) { - wmoHeader = new WMOHeader(rawMessage); - if (wmoHeader.isValid()) { -// messageData = DecoderTools.stripWMOHeader(rawMessage, -// WMO_HEADER); + System.out.println("========== Begin =============== "); + //rawMessage = DecoderTools.cleanData(rawMessage); + if (rawMessage != null) { + wmoHeader = new WMOHeader(rawMessage); + if (wmoHeader.isValid()) { +// messageData = DecoderTools.stripWMOHeader(rawMessage, +// WMO_HEADER); // doSeparate(new String(messageData)); - doSeparate(new String(rawMessage)); - } - } - - if ((reports != null) && (reports.size() > 0)) { - currentReport = 0; + doSeparate(new String(rawMessage)); + } + } + + if ((reports != null) && (reports.size() > 0)) { + currentReport = 0; } else { String msg = (wmoHeader != null) ? wmoHeader.getWmoHeader() : ""; - - logger.info("No reports in data in " + msg); - } - } - - /** - * Get the message data. - * - * @return The cleaned message data. - */ - public byte[] getMessage() { - return messageData; - } - - /** - * Get the WMO header associated with the message data. - * - * @return The WMO header. - */ - public WMOHeader getWmoHeader() { - return wmoHeader; - } - - /** - * Separate the candidate message into individual pirep reports based on the - * report header . - * - * @param message - * The message data to separate. - */ + + logger.info("No reports in data in " + msg); + } + } + + /** + * Get the message data. + * + * @return The cleaned message data. + */ + public byte[] getMessage() { + return messageData; + } + + /** + * Get the WMO header associated with the message data. + * + * @return The WMO header. + */ + public WMOHeader getWmoHeader() { + return wmoHeader; + } + + /** + * Separate the candidate message into individual pirep reports based on the + * report header . + * + * @param message + * The message data to separate. + */ private void doSeparate(String message) { reports = new ArrayList(); int start = 0; - int stop = message.length(); + int stop = message.length(); Pattern pattern = Pattern.compile(SPLITMSG); Matcher matcher = pattern.matcher(message); @@ -165,8 +165,8 @@ public class NcPirepSeparator extends AbstractRecordSeparator { separate( subMsg); start = matcher.end(); - } - } + } + } /* * 046 ^M @@ -209,5 +209,5 @@ public class NcPirepSeparator extends AbstractRecordSeparator { String message = "ENA UA /OV PDN288051/TM 2348/FL340/TP B737/TA M56/WV 218035/TB CONT LGHT OCNL MOD/RM CONT CHOP FL350 ZAN ="; //doSeparate(message); - } -} + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/decoder/NcPirepParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/decoder/NcPirepParser.java index 74cf034429..ab649156d6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/decoder/NcPirepParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/src/gov/noaa/nws/ncep/edex/plugin/ncpirep/decoder/NcPirepParser.java @@ -1,19 +1,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 + * 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 - * + * 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. **/ @@ -44,16 +44,16 @@ import com.raytheon.uf.edex.decodertools.core.LatLonPoint; import com.raytheon.uf.edex.decodertools.time.TimeTools; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Point; - -/** - * This class parses Pirep reports. Some of the parsing is ported from the NCEP - * NWS decoder, and other parts use regular expressions based on information in - * AFMAN 15-124 and FMH No. 12. - * - *
    - * SOFTWARE HISTORY
    - * Date         PR#         Engineer    Description
    - * -----------  ---------- ------------ --------------------------
    +
    +/**
    + * This class parses Pirep reports. Some of the parsing is ported from the NCEP
    + * NWS decoder, and other parts use regular expressions based on information in
    + * AFMAN 15-124 and FMH No. 12.
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * Date         PR#         Engineer    Description
    + * -----------  ---------- ------------ --------------------------
      * 05/26/2011				F.J.Yen		Initial creation from pirep.  Change
      * 										temperature and windSpeed from Double to
      * 										Float; windDirection from Integer to Float.
    @@ -70,33 +70,33 @@ import com.vividsolutions.jts.geom.Point;
      * 10/13/2011   286        qzhou        Remove \r \n \s in the reportData in parse().
      *                                      Handle abnormal location. /OV TBE 265040... Modified decodeLocationData() and parseLatLon()								
      * 10/20/2011   472        qzhou        Added WX_COND_WORDS. Removed SKY_SKC, SKY_CLR and other _COND_WORDS
    - * 11/01/2011   286       Q.Zhou        Added month and year to decodetime
    - * 
    - * - * @author jkorman - * @version Dec. 27, 2007 - */ -public class NcPirepParser { - private static final double ONE_NM_RADIANS = (2.0 * Math.PI) / 21637.5; - - // Allowable future time in milliseconds (15 minutes). + * 11/01/2011 286 Q.Zhou Added month and year to decodetime + *
    + * + * @author jkorman + * @version Dec. 27, 2007 + */ +public class NcPirepParser { + private static final double ONE_NM_RADIANS = (2.0 * Math.PI) / 21637.5; + + // Allowable future time in milliseconds (15 minutes). private static final int ALLOWABLE_TIME = 15; private static final float RMISSD = IDecoderConstantsN.UAIR_FLOAT_MISSING; - private static final int IMISSD = IDecoderConstantsN.UAIR_INTEGER_MISSING; - - private static final String[] RPIDS = { "UUA", "UA" }; - - /** - * Note that there are intentionally spaces after some of the teis. - */ - private static final String[] TEIS = { "/OV ", "/TM", "/FL", "/TP", "/SK ", - "/WX", "/TA", "/WV", "/TB", "/IC", "/RM" }; - - private static final String BLO_HGT = "BLO"; - private static final String ABV_HGT = "ABV"; - private static final String NEG_ENTRY = "NEG"; + private static final int IMISSD = IDecoderConstantsN.UAIR_INTEGER_MISSING; + + private static final String[] RPIDS = { "UUA", "UA" }; + + /** + * Note that there are intentionally spaces after some of the teis. + */ + private static final String[] TEIS = { "/OV ", "/TM", "/FL", "/TP", "/SK ", + "/WX", "/TA", "/WV", "/TB", "/IC", "/RM" }; + + private static final String BLO_HGT = "BLO"; + private static final String ABV_HGT = "ABV"; + private static final String NEG_ENTRY = "NEG"; private static final String NULL_ENTRY = "---"; private static final Map WX_COND_WORDS = new HashMap(); @@ -154,294 +154,294 @@ public class NcPirepParser { WX_COND_WORDS.put("UNKNOWN", "UNKN"); } - - private static final Map DIR_POINTS = new HashMap(); - static { - DIR_POINTS.put("N", 0); - DIR_POINTS.put("NNE", 22); - DIR_POINTS.put("NE", 45); - DIR_POINTS.put("ENE", 67); - DIR_POINTS.put("E", 90); - DIR_POINTS.put("ESE", 112); - DIR_POINTS.put("SE", 135); - DIR_POINTS.put("SSE", 157); - DIR_POINTS.put("S", 180); - DIR_POINTS.put("SSW", 202); - DIR_POINTS.put("SW", 225); - DIR_POINTS.put("WSW", 247); - DIR_POINTS.put("W", 270); - DIR_POINTS.put("WNW", 292); - DIR_POINTS.put("NW", 315); - DIR_POINTS.put("NNW", 337); - } - - private static final String ICE_TURB_PREFIX = "([A-Z]{3,5})(?:((?:-)([A-Z]{3,5})))?"; - - private static final String ABV_BLO = BLO_HGT + "|" + ABV_HGT; - private static final String ICE_TURB_SUFFIX = "(?: )?(((" + ABV_BLO + ")(?: )(\\d{3}))|((\\d{3})(?:(-(\\d{3}))?)))?(?:/)?()"; - - private static final String ICE_REGEX = ICE_TURB_PREFIX + "((?: )(RIME|MXD|CLR))" + ICE_TURB_SUFFIX;//? - - private static final String TRB_REGEX = ICE_TURB_PREFIX + "((?: )(CHOP|CAT))?" + ICE_TURB_SUFFIX; - - - // 3901N 08446W - private static final String LATLON_PTRN = "((([0-8]\\d[0-5]\\d)|(9000))[NS]((0\\d{2}[0-5]\\d)|([1][0-7]\\d[0-5]\\d)|(18000))[EW])"; - - /** The logger */ - private Log logger = LogFactory.getLog(getClass()); - - // Codes used in groupLikeTypes() - // Was the character whitespace? - private static final int NONE = 0; - - // Was character a digit? - private static final int DIGIT = 1; - - // Was character a letter? - private static final int LETTER = 2; - - // Was character non-alphanumeric but not whitespace? - private static final int NONALPHANUMERIC = 3; - - // The last search position when looking for TEIs - private int theSearchPos = -1; - - // Where was the Token found - private int theTokenPos; - - private String reportData = null; - - private String theReportingStationId = null; - - private BasePoint location = null; - - private LatLonPoint interLocation = null; - - private Calendar observationTime = null; - + + private static final Map DIR_POINTS = new HashMap(); + static { + DIR_POINTS.put("N", 0); + DIR_POINTS.put("NNE", 22); + DIR_POINTS.put("NE", 45); + DIR_POINTS.put("ENE", 67); + DIR_POINTS.put("E", 90); + DIR_POINTS.put("ESE", 112); + DIR_POINTS.put("SE", 135); + DIR_POINTS.put("SSE", 157); + DIR_POINTS.put("S", 180); + DIR_POINTS.put("SSW", 202); + DIR_POINTS.put("SW", 225); + DIR_POINTS.put("WSW", 247); + DIR_POINTS.put("W", 270); + DIR_POINTS.put("WNW", 292); + DIR_POINTS.put("NW", 315); + DIR_POINTS.put("NNW", 337); + } + + private static final String ICE_TURB_PREFIX = "([A-Z]{3,5})(?:((?:-)([A-Z]{3,5})))?"; + + private static final String ABV_BLO = BLO_HGT + "|" + ABV_HGT; + private static final String ICE_TURB_SUFFIX = "(?: )?(((" + ABV_BLO + ")(?: )(\\d{3}))|((\\d{3})(?:(-(\\d{3}))?)))?(?:/)?()"; + + private static final String ICE_REGEX = ICE_TURB_PREFIX + "((?: )(RIME|MXD|CLR))" + ICE_TURB_SUFFIX;//? + + private static final String TRB_REGEX = ICE_TURB_PREFIX + "((?: )(CHOP|CAT))?" + ICE_TURB_SUFFIX; + + + // 3901N 08446W + private static final String LATLON_PTRN = "((([0-8]\\d[0-5]\\d)|(9000))[NS]((0\\d{2}[0-5]\\d)|([1][0-7]\\d[0-5]\\d)|(18000))[EW])"; + + /** The logger */ + private Log logger = LogFactory.getLog(getClass()); + + // Codes used in groupLikeTypes() + // Was the character whitespace? + private static final int NONE = 0; + + // Was character a digit? + private static final int DIGIT = 1; + + // Was character a letter? + private static final int LETTER = 2; + + // Was character non-alphanumeric but not whitespace? + private static final int NONALPHANUMERIC = 3; + + // The last search position when looking for TEIs + private int theSearchPos = -1; + + // Where was the Token found + private int theTokenPos; + + private String reportData = null; + + private String theReportingStationId = null; + + private BasePoint location = null; + + private LatLonPoint interLocation = null; + + private Calendar observationTime = null; + private AircraftFlightLevel flightLevel = null; - - private String aircraftType = "UNKN"; - + + private String aircraftType = "UNKN"; + // private Double temperature = null; - private Float temperature = RMISSD; - + private Float temperature = RMISSD; + // private Integer windDirection = null; - private Float windDirection = RMISSD; - + private Float windDirection = RMISSD; + // private Double windSpeed = null; - private Float windSpeed = RMISSD; - - private Integer horzVisibility = IMISSD; - - private List cloudLayers = null; - - private AircraftRemarks theRemarks = null; - - private List theTurbulenceLayers = null; - - private List theIcingLayers = null; - - private String[] theWeatherCodes = null; + private Float windSpeed = RMISSD; + + private Integer horzVisibility = IMISSD; + + private List cloudLayers = null; + + private AircraftRemarks theRemarks = null; + + private List theTurbulenceLayers = null; + + private List theIcingLayers = null; + + private String[] theWeatherCodes = null; private String suspectTimeFlag = null; private String headerTime = ""; - - // these values are only populated if the pirep contained explicit lat/lon; - // theLocation holds the location of the pirep; values in radians -// private double latitude = Double.NaN; -// -// private double longitude = Double.NaN; - - private String traceId; - - /** - * Construct a NcPirepParser from given String data. The report is completely - * parsed and decoded upon success. - * - * @param report - * String data containing the possible PIREP. - * @throws DecodeException - * An error occurred within the parser. - */ - public NcPirepParser(String report, String traceId) { - reportData = report; - this.traceId = traceId; - parse(); - } - - /** - * Construct a NcPirepParser from given byte array data. The report is - * completely parsed and decoded upon success. - * - * @param report - * Byte array data containing the possible PIREP. - * @throws DecodeException - * An error occurred within the parser. - */ - public NcPirepParser(byte[] report, String traceId) { - this(new String(report),traceId); - } - - /** - * @return the reportData - */ - public String getReportData() { - return reportData; - } - - public String getReportType() { - return "PIREP"; + + // these values are only populated if the pirep contained explicit lat/lon; + // theLocation holds the location of the pirep; values in radians +// private double latitude = Double.NaN; +// +// private double longitude = Double.NaN; + + private String traceId; + + /** + * Construct a NcPirepParser from given String data. The report is completely + * parsed and decoded upon success. + * + * @param report + * String data containing the possible PIREP. + * @throws DecodeException + * An error occurred within the parser. + */ + public NcPirepParser(String report, String traceId) { + reportData = report; + this.traceId = traceId; + parse(); } - + + /** + * Construct a NcPirepParser from given byte array data. The report is + * completely parsed and decoded upon success. + * + * @param report + * Byte array data containing the possible PIREP. + * @throws DecodeException + * An error occurred within the parser. + */ + public NcPirepParser(byte[] report, String traceId) { + this(new String(report),traceId); + } + + /** + * @return the reportData + */ + public String getReportData() { + return reportData; + } + + public String getReportType() { + return "PIREP"; + } + public String getSuspectTimeFlag() { return suspectTimeFlag; } - - /** - * Get the station reporting id. - * - * @return Returns the theReportingStationId. - */ - public String getReportingStationId() { - return theReportingStationId; - } - - /** - * Get the reporting aircraft type. - * - * @return The aircraft type. - */ - public String getAircraftType() { - return aircraftType; - } - - /** - * Get the decoded flight level information. - * - * @return The decoded flight level in feet. - */ - public Integer getFlightLevel() { - //Integer retValue = null; - Integer retValue = IDecoderConstantsN.UAIR_INTEGER_MISSING; //-9999; - if (flightLevel != null) { - retValue = flightLevel.getFlightLevel(); - } - return retValue; - } // getFlightLevel() - - /** - * Get the aircraft location or midpoint location. - * - * @return Returns the aircraft location. - */ - public BasePoint getLocation() { - return location; - } - - /** - * Get the PIREP observation time. - * - * @return Returns the observation time. - */ - public Calendar getObservationTime() { - return observationTime; - } - - - /** - * Get the air temperature at altitude. - * - * @return Returns the air temperature. (May return null) - */ -// public Double getTemperature() { - public Float getTemperature() { - return temperature; - } - - /** - * Get the reported wind direction. - * - * @return Returns the wind direction. (May return null) + + /** + * Get the station reporting id. + * + * @return Returns the theReportingStationId. + */ + public String getReportingStationId() { + return theReportingStationId; + } + + /** + * Get the reporting aircraft type. + * + * @return The aircraft type. + */ + public String getAircraftType() { + return aircraftType; + } + + /** + * Get the decoded flight level information. + * + * @return The decoded flight level in feet. + */ + public Integer getFlightLevel() { + //Integer retValue = null; + Integer retValue = IDecoderConstantsN.UAIR_INTEGER_MISSING; //-9999; + if (flightLevel != null) { + retValue = flightLevel.getFlightLevel(); + } + return retValue; + } // getFlightLevel() + + /** + * Get the aircraft location or midpoint location. + * + * @return Returns the aircraft location. + */ + public BasePoint getLocation() { + return location; + } + + /** + * Get the PIREP observation time. + * + * @return Returns the observation time. + */ + public Calendar getObservationTime() { + return observationTime; + } + + + /** + * Get the air temperature at altitude. + * + * @return Returns the air temperature. (May return null) + */ +// public Double getTemperature() { + public Float getTemperature() { + return temperature; + } + + /** + * Get the reported wind direction. + * + * @return Returns the wind direction. (May return null) + */ +// public Integer getWindDirection() { + public Float getWindDirection() { + return windDirection; + } + + /** + * Get the reported wind speed. + * + * @return Returns the wind speed. (May return null) */ -// public Integer getWindDirection() { - public Float getWindDirection() { - return windDirection; - } - - /** - * Get the reported wind speed. - * - * @return Returns the wind speed. (May return null) - */ // public Double getWindSpeed() { - public Float getWindSpeed() { - return windSpeed; - } - - /** - * Get any remarks found in the report. - * - * @return Returns the remarks. (May return null) - */ - public String getRemarks() { - return (theRemarks != null) ? theRemarks.toString() : ""; - } - - /** - * Get the cloud layer information. - * - * @return Returns the decoded cloud layers. (May return null) - */ - public List getCloudLayers() { - return cloudLayers; - } - - /** - * Get the turbulence layer information. - * - * @return Returns the turbulence layers. (May return null) - */ - public List getTurbulenceLayers() { - return theTurbulenceLayers; - } - - /** - * Get the icing layer information. - * - * @return Returns the icing layers. (May return null) - */ - public List getIcingLayers() { - return theIcingLayers; - } - - /** - * Get the flight visibility if decoded. - * - * @return Returns the flight visibility. (May return null) - */ - public Integer getHorzVisibility() { - return horzVisibility; - } - - /** - * Get the decoded weather information. - * - * @return Returns the weather codes. (May return null) - */ - public String[] getWeatherCodes() { - return theWeatherCodes; - } - - /** - * This method parses the pirep based on TEIs and delegates the data for - * each to a different method. This method ported from NCEP decoder. - * "HJO UA /OV AUN-CRO /TM 2351 /FL075 /TP M20P /WX FV30SM HZ FU /WV 15015KT /TB NEG /RM SMTH=" - * @throws DecodeException - * An error occurred within this method. - */ - protected void parse() { - int pirepIndex = 0; + public Float getWindSpeed() { + return windSpeed; + } + + /** + * Get any remarks found in the report. + * + * @return Returns the remarks. (May return null) + */ + public String getRemarks() { + return (theRemarks != null) ? theRemarks.toString() : ""; + } + + /** + * Get the cloud layer information. + * + * @return Returns the decoded cloud layers. (May return null) + */ + public List getCloudLayers() { + return cloudLayers; + } + + /** + * Get the turbulence layer information. + * + * @return Returns the turbulence layers. (May return null) + */ + public List getTurbulenceLayers() { + return theTurbulenceLayers; + } + + /** + * Get the icing layer information. + * + * @return Returns the icing layers. (May return null) + */ + public List getIcingLayers() { + return theIcingLayers; + } + + /** + * Get the flight visibility if decoded. + * + * @return Returns the flight visibility. (May return null) + */ + public Integer getHorzVisibility() { + return horzVisibility; + } + + /** + * Get the decoded weather information. + * + * @return Returns the weather codes. (May return null) + */ + public String[] getWeatherCodes() { + return theWeatherCodes; + } + + /** + * This method parses the pirep based on TEIs and delegates the data for + * each to a different method. This method ported from NCEP decoder. + * "HJO UA /OV AUN-CRO /TM 2351 /FL075 /TP M20P /WX FV30SM HZ FU /WV 15015KT /TB NEG /RM SMTH=" + * @throws DecodeException + * An error occurred within this method. + */ + protected void parse() { + int pirepIndex = 0; int endTimeId = 6; // remove \r \n white space @@ -457,352 +457,352 @@ public class NcPirepParser { String theStationId = reportData.substring(stationStartIndex, stationStartIndex +3); decodeReportingStationId(theStationId); - // Look for a 'UUA' or 'UA' indicator to denote the start of - // the report. - if (!nextString(reportData, ( stationStartIndex + 3 + 1 ), reportData.length(), RPIDS)) { - return; - } - - // if failed to decode reporting station id, this must be Canadian pirep - // TODO convert! - - // Find the first TEI within the report. - if (!nextString(reportData, pirepIndex, reportData.length(), TEIS)) { - return; + // Look for a 'UUA' or 'UA' indicator to denote the start of + // the report. + if (!nextString(reportData, ( stationStartIndex + 3 + 1 ), reportData.length(), RPIDS)) { + return; } - - int pos1 = this.theSearchPos; + + // if failed to decode reporting station id, this must be Canadian pirep + // TODO convert! + + // Find the first TEI within the report. + if (!nextString(reportData, pirepIndex, reportData.length(), TEIS)) { + return; + } + + int pos1 = this.theSearchPos; int tei1 = this.theTokenPos; - - int teiIndex = pos1 + TEIS[tei1].length(); - int pos2, tei2; - + + int teiIndex = pos1 + TEIS[tei1].length(); + int pos2, tei2; + while (teiIndex < reportData.length()) { - - // Find the end of the data for this TEI by finding the next - // TEI within the report. - int endTeiIndex; - boolean lastTei = !nextString(reportData, teiIndex, reportData - .length(), TEIS); - pos2 = this.theSearchPos; + + // Find the end of the data for this TEI by finding the next + // TEI within the report. + int endTeiIndex; + boolean lastTei = !nextString(reportData, teiIndex, reportData + .length(), TEIS); + pos2 = this.theSearchPos; tei2 = this.theTokenPos; - //System.out.println("%%%%%%%%%tei2 "+tei1 +" "+pos1 +" "+teiIndex); - if (lastTei) { - // This is the last TEI within the report, so set the end - // of the data for this TEI equal to the end of the report. - endTeiIndex = reportData.length(); - } else { - endTeiIndex = pos2; - } - - boolean success = false; - switch (tei1) { - case 0: - // Decode and store the "/OV" (i.e. location) data. - success = decodeLocationData(reportData.substring(teiIndex, - endTeiIndex)); - break; - case 1: - // Decode and store the "/TM" (i.e. time) data. - success = decodeTimeData(reportData.substring(teiIndex, - endTeiIndex)); - break; - case 2: - // Decode and store the "/FL" (i.e. flight level) data. - success = decodeFlightLevelData(reportData.substring( - teiIndex, endTeiIndex)); - break; - case 3: + //System.out.println("%%%%%%%%%tei2 "+tei1 +" "+pos1 +" "+teiIndex); + if (lastTei) { + // This is the last TEI within the report, so set the end + // of the data for this TEI equal to the end of the report. + endTeiIndex = reportData.length(); + } else { + endTeiIndex = pos2; + } + + boolean success = false; + switch (tei1) { + case 0: + // Decode and store the "/OV" (i.e. location) data. + success = decodeLocationData(reportData.substring(teiIndex, + endTeiIndex)); + break; + case 1: + // Decode and store the "/TM" (i.e. time) data. + success = decodeTimeData(reportData.substring(teiIndex, + endTeiIndex)); + break; + case 2: + // Decode and store the "/FL" (i.e. flight level) data. + success = decodeFlightLevelData(reportData.substring( + teiIndex, endTeiIndex)); + break; + case 3: // Decode and store the "/TP" (i.e. aircraft type) data. - success = decodeAircraftTypeData(reportData.substring( - teiIndex, endTeiIndex)); - break; - case 4: + success = decodeAircraftTypeData(reportData.substring( + teiIndex, endTeiIndex)); + break; + case 4: // Decode and store the "/SK" (i.e. sky cover) data. success = decodeSkyCoverData(reportData.substring( - teiIndex, endTeiIndex)); - break; - case 5: - // Decode and store the "/WX" (i.e. weather) data. - success = decodeWeatherData(reportData.substring(teiIndex, - endTeiIndex)); - break; - case 6: - // Decode and store the "/TA" (i.e. temperature) data. - success = decodeTemperatureData(reportData.substring( - teiIndex, endTeiIndex)); - break; - case 7: - // Decode and store the "/WV" (i.e. wind) data. - success = decodeWindData(reportData.substring(teiIndex, - endTeiIndex)); - break; - case 8: - // Decode and store the "/TB" (i.e. turbulence) data. - success = decodeTurbulenceData(reportData.substring( - teiIndex, endTeiIndex)); - break; - case 9: - // Decode and store the "/IC" (i.e. icing) data. - success = decodeIcingData(reportData.substring(teiIndex, + teiIndex, endTeiIndex)); + break; + case 5: + // Decode and store the "/WX" (i.e. weather) data. + success = decodeWeatherData(reportData.substring(teiIndex, endTeiIndex)); - break; - case 10: - // Decode and store the "/RM" (i.e. remarks) data. - success = decodeRemarksData(reportData.substring(teiIndex, - endTeiIndex)); - break; - } // switch() - - // discontinue if processing of any data fails - if (!success) { - // TODO: add logging - } - - if (lastTei) { - teiIndex = reportData.length(); - } else { - pos1 = pos2; - tei1 = tei2; - teiIndex = pos1 + TEIS[tei1].length(); - } - } // while() - } // parse() - - /** - * This method gets the reporting station id for a PIREP. The reporting - * station id is the station id which immediately precedes the characters UA - * or UUA. This method ported from NCEP decoder. - * - * @param str - * String preceding UA or UUA - * @return success or failure - */ - protected boolean decodeReportingStationId(String str) { - //String id = str.trim(); - - this.theReportingStationId = str; - return true; - } // decodeReportingStationId() - - /** - * This method decodes and stores the location data from within a PIREP - * report. The location data may be a set of one or two "location points" - * (i.e. a "location point" is a navaid or a navaid/bearing/distance), or it - * may be a latitude/longitude combination such as is found in AIREP - * reports. - * - * @param locData - * All data located in the PIREP report "OV" section. - * @return Decode success or failure status. - * @throws DecodeException - * If a decode error occured. - */ - protected boolean decodeLocationData(String locData) { - boolean decodeStatus = false; - final int maxOVParts = 2; + break; + case 6: + // Decode and store the "/TA" (i.e. temperature) data. + success = decodeTemperatureData(reportData.substring( + teiIndex, endTeiIndex)); + break; + case 7: + // Decode and store the "/WV" (i.e. wind) data. + success = decodeWindData(reportData.substring(teiIndex, + endTeiIndex)); + break; + case 8: + // Decode and store the "/TB" (i.e. turbulence) data. + success = decodeTurbulenceData(reportData.substring( + teiIndex, endTeiIndex)); + break; + case 9: + // Decode and store the "/IC" (i.e. icing) data. + success = decodeIcingData(reportData.substring(teiIndex, + endTeiIndex)); + break; + case 10: + // Decode and store the "/RM" (i.e. remarks) data. + success = decodeRemarksData(reportData.substring(teiIndex, + endTeiIndex)); + break; + } // switch() + + // discontinue if processing of any data fails + if (!success) { + // TODO: add logging + } + + if (lastTei) { + teiIndex = reportData.length(); + } else { + pos1 = pos2; + tei1 = tei2; + teiIndex = pos1 + TEIS[tei1].length(); + } + } // while() + } // parse() + + /** + * This method gets the reporting station id for a PIREP. The reporting + * station id is the station id which immediately precedes the characters UA + * or UUA. This method ported from NCEP decoder. + * + * @param str + * String preceding UA or UUA + * @return success or failure + */ + protected boolean decodeReportingStationId(String str) { + //String id = str.trim(); + + this.theReportingStationId = str; + return true; + } // decodeReportingStationId() + + /** + * This method decodes and stores the location data from within a PIREP + * report. The location data may be a set of one or two "location points" + * (i.e. a "location point" is a navaid or a navaid/bearing/distance), or it + * may be a latitude/longitude combination such as is found in AIREP + * reports. + * + * @param locData + * All data located in the PIREP report "OV" section. + * @return Decode success or failure status. + * @throws DecodeException + * If a decode error occured. + */ + protected boolean decodeLocationData(String locData) { + boolean decodeStatus = false; + final int maxOVParts = 2; // Remove space in locData. handle abormal input. e.g. 9000N 18000E, /OV AEF 200067 String[] split = locData.split(" "); if (split != null && split.length ==2) locData = split[0] + split[1]; - - Pattern p = Pattern.compile(LATLON_PTRN); - Matcher m = p.matcher(locData); - if(m.find()) { - location = parseLatLon(m.group()); - decodeStatus = (location != null); + + Pattern p = Pattern.compile(LATLON_PTRN); + Matcher m = p.matcher(locData); + if(m.find()) { + location = parseLatLon(m.group()); + decodeStatus = (location != null); } - else { - ArrayList ovParts = new ArrayList(); - - StringTokenizer st = new StringTokenizer(locData, "-", false); - while (st.hasMoreTokens()) { - String s = st.nextToken(); - ovParts.add(s.toUpperCase()); - } - // If there are more than 2 parts, this location data is in error BUT - // we will use the first two points and ignore trailing! - if (ovParts.size() == 1) { - decodeStatus = decodeLocation(ovParts.get(0).trim()); - } else if (ovParts.size() >= maxOVParts) { - // If valid, this will leave the first location in theLocation. - if (decodeLocation(ovParts.get(0).trim())) { - // Make sure to save the previous location. decodeLocation - // will trash it. - LatLonPoint firstPoint = interLocation; - // now get the second point. - if (decodeLocation(ovParts.get(1).trim())) { - LatLonPoint secondPoint = interLocation; - - // Now we have two valid points. - // get the midpoint distance from point 1 to point 2. - double dist = firstPoint.distanceTo(secondPoint) / 2; - // and use the bearing between the points to construct the - // midpoint location. - secondPoint = firstPoint.positionOf(firstPoint - .bearingTo(secondPoint), dist); - location = new BasePoint(secondPoint - .getLatitude(LatLonPoint.INDEGREES), secondPoint - .getLongitude(LatLonPoint.INDEGREES)); - decodeStatus = true; - if(ovParts.size() > maxOVParts) { - logger.info(traceId + "- More than 2 locations reported, first 2 used"); - } - } else { - logger.error(traceId + "- Could not decode location " + ovParts.get(1).trim()); - } - } else { - logger.error(traceId + "- Could not decode location " + ovParts.get(0).trim()); - } - } - } - return decodeStatus; - } // decodeLocationData() - - /** - * Decode the individual location points found in an "OV" section. - * - * @param aLocation - * A possible location point. - * @return Was the decode successful (true|false). - */ - private boolean decodeLocation(String aLocation) { - final String navaidPattern = "^[A-Z,0-9]{3,4}$"; - final String bearingDistPattern = "^[A-Z,0-9]{3,4}\\d{6}$"; - - Pattern p = Pattern.compile(navaidPattern); - location = null; - boolean decodeStatus = false; - Matcher m = p.matcher(aLocation); - if (m.find()) { - BasePoint navaidLoc = getNavaidLocation(aLocation); - if (navaidLoc != null) { - location = navaidLoc; - - interLocation = new LatLonPoint(navaidLoc - .getLatitude(), navaidLoc.getLongitude(), - LatLonPoint.INDEGREES); - - decodeStatus = true; - } - } else { - // try bearing and distance. - p = Pattern.compile(bearingDistPattern); - m = p.matcher(aLocation); - if (m.find()) { - String staId = aLocation.substring(0, aLocation.length() - 6); - - BasePoint navaidLoc = getNavaidLocation(staId); - if (navaidLoc != null) { - int len = aLocation.length(); - - String s = aLocation.substring(len - 6, len - 3); - Double bearing = Math.toRadians(parseInteger(s)); - - s = aLocation.substring(len - 3); - Double dist = ONE_NM_RADIANS * parseInteger(s); - - - LatLonPoint point1 = new LatLonPoint(navaidLoc - .getLatitude(), navaidLoc.getLongitude(), - LatLonPoint.INDEGREES); - - LatLonPoint point2 = point1.positionOf(-bearing, dist); - interLocation = point2; - - location = new BasePoint(point2 - .getLatitude(LatLonPoint.INDEGREES), point2 - .getLongitude(LatLonPoint.INDEGREES)); - - decodeStatus = true; - } else { - decodeStatus = false; - } - } else { - } - } - return decodeStatus; - } // decodeLocation() - - /** - * Attempt to convert a string to an integer value. - * - * @param aNumber - * A possible integer value. - * @return The converted number or null if conversion failed. - */ - private static Integer parseInteger(String aNumber) { - Integer retValue = null; - try { - retValue = new Integer(aNumber.trim()); - } - catch (NumberFormatException nfe) { - retValue = null; - } - return retValue; - } // parseInteger() - - /** - * Get the latitude/longitude pair for a given navigation point. - * - * @param aNavaid - * A possible navaid to look up. - * @return The location of the navaid or null if not found. - */ - private BasePoint getNavaidLocation(String navaid) { - BasePoint navaidLocation = null; - - ObStationDao obSta = null; - ObStation stationInfo = null; - if ((navaid != null) && (navaid.length() >= 0)) { - logger.debug(traceId + " - Processing Navaid [" + navaid + "]"); - try { - obSta = new ObStationDao(); + else { + ArrayList ovParts = new ArrayList(); + + StringTokenizer st = new StringTokenizer(locData, "-", false); + while (st.hasMoreTokens()) { + String s = st.nextToken(); + ovParts.add(s.toUpperCase()); + } + // If there are more than 2 parts, this location data is in error BUT + // we will use the first two points and ignore trailing! + if (ovParts.size() == 1) { + decodeStatus = decodeLocation(ovParts.get(0).trim()); + } else if (ovParts.size() >= maxOVParts) { + // If valid, this will leave the first location in theLocation. + if (decodeLocation(ovParts.get(0).trim())) { + // Make sure to save the previous location. decodeLocation + // will trash it. + LatLonPoint firstPoint = interLocation; + // now get the second point. + if (decodeLocation(ovParts.get(1).trim())) { + LatLonPoint secondPoint = interLocation; + + // Now we have two valid points. + // get the midpoint distance from point 1 to point 2. + double dist = firstPoint.distanceTo(secondPoint) / 2; + // and use the bearing between the points to construct the + // midpoint location. + secondPoint = firstPoint.positionOf(firstPoint + .bearingTo(secondPoint), dist); + location = new BasePoint(secondPoint + .getLatitude(LatLonPoint.INDEGREES), secondPoint + .getLongitude(LatLonPoint.INDEGREES)); + decodeStatus = true; + if(ovParts.size() > maxOVParts) { + logger.info(traceId + "- More than 2 locations reported, first 2 used"); + } + } else { + logger.error(traceId + "- Could not decode location " + ovParts.get(1).trim()); + } + } else { + logger.error(traceId + "- Could not decode location " + ovParts.get(0).trim()); + } + } + } + return decodeStatus; + } // decodeLocationData() + + /** + * Decode the individual location points found in an "OV" section. + * + * @param aLocation + * A possible location point. + * @return Was the decode successful (true|false). + */ + private boolean decodeLocation(String aLocation) { + final String navaidPattern = "^[A-Z,0-9]{3,4}$"; + final String bearingDistPattern = "^[A-Z,0-9]{3,4}\\d{6}$"; + + Pattern p = Pattern.compile(navaidPattern); + location = null; + boolean decodeStatus = false; + Matcher m = p.matcher(aLocation); + if (m.find()) { + BasePoint navaidLoc = getNavaidLocation(aLocation); + if (navaidLoc != null) { + location = navaidLoc; + + interLocation = new LatLonPoint(navaidLoc + .getLatitude(), navaidLoc.getLongitude(), + LatLonPoint.INDEGREES); + + decodeStatus = true; + } + } else { + // try bearing and distance. + p = Pattern.compile(bearingDistPattern); + m = p.matcher(aLocation); + if (m.find()) { + String staId = aLocation.substring(0, aLocation.length() - 6); + + BasePoint navaidLoc = getNavaidLocation(staId); + if (navaidLoc != null) { + int len = aLocation.length(); + + String s = aLocation.substring(len - 6, len - 3); + Double bearing = Math.toRadians(parseInteger(s)); + + s = aLocation.substring(len - 3); + Double dist = ONE_NM_RADIANS * parseInteger(s); + + + LatLonPoint point1 = new LatLonPoint(navaidLoc + .getLatitude(), navaidLoc.getLongitude(), + LatLonPoint.INDEGREES); + + LatLonPoint point2 = point1.positionOf(-bearing, dist); + interLocation = point2; + + location = new BasePoint(point2 + .getLatitude(LatLonPoint.INDEGREES), point2 + .getLongitude(LatLonPoint.INDEGREES)); + + decodeStatus = true; + } else { + decodeStatus = false; + } + } else { + } + } + return decodeStatus; + } // decodeLocation() + + /** + * Attempt to convert a string to an integer value. + * + * @param aNumber + * A possible integer value. + * @return The converted number or null if conversion failed. + */ + private static Integer parseInteger(String aNumber) { + Integer retValue = null; + try { + retValue = new Integer(aNumber.trim()); + } + catch (NumberFormatException nfe) { + retValue = null; + } + return retValue; + } // parseInteger() + + /** + * Get the latitude/longitude pair for a given navigation point. + * + * @param aNavaid + * A possible navaid to look up. + * @return The location of the navaid or null if not found. + */ + private BasePoint getNavaidLocation(String navaid) { + BasePoint navaidLocation = null; + + ObStationDao obSta = null; + ObStation stationInfo = null; + if ((navaid != null) && (navaid.length() >= 0)) { + logger.debug(traceId + " - Processing Navaid [" + navaid + "]"); + try { + obSta = new ObStationDao(); if(navaid.length() == 3) { String gid = ObStation.createGID(ObStation.CAT_TYPE_ACFT_PIREP, navaid); - - stationInfo = obSta.queryByGid(gid); - } else if (navaid.length() == 4) { + + stationInfo = obSta.queryByGid(gid); + } else if (navaid.length() == 4) { String gid = ObStation.createGID(ObStation.CAT_TYPE_ICAO, navaid); - stationInfo = obSta.queryByGid(gid); - } - } catch(DataAccessLayerException e){ - logger.error(traceId + " - Unable to retrieve station info",e); - } - } else { - logger.info(traceId + " - Invalid navaid [" + navaid + "]"); - } - - if (stationInfo != null) { - Geometry g = stationInfo.getGeometry(); - if(g instanceof Point) { - Point p = (Point) g; - navaidLocation = new BasePoint(p.getY(),p.getX()); - } - } else { - logger.info(traceId + " - Station id not found [" + navaid + "]"); - } - return navaidLocation; - } // getNavaidLocation() - - /** - * - */ - private static BasePoint parseLatLon(String latlon) { - BasePoint point = null; - - // 012345678901 - // lldds llldds - - Integer lat_dd = parseInteger(latlon.substring(0,2)); + stationInfo = obSta.queryByGid(gid); + } + } catch(DataAccessLayerException e){ + logger.error(traceId + " - Unable to retrieve station info",e); + } + } else { + logger.info(traceId + " - Invalid navaid [" + navaid + "]"); + } + + if (stationInfo != null) { + Geometry g = stationInfo.getGeometry(); + if(g instanceof Point) { + Point p = (Point) g; + navaidLocation = new BasePoint(p.getY(),p.getX()); + } + } else { + logger.info(traceId + " - Station id not found [" + navaid + "]"); + } + return navaidLocation; + } // getNavaidLocation() + + /** + * + */ + private static BasePoint parseLatLon(String latlon) { + BasePoint point = null; + + // 012345678901 + // lldds llldds + + Integer lat_dd = parseInteger(latlon.substring(0,2)); Integer lat_mm = parseInteger(latlon.substring(2,4)); Integer lon_dd = 0; Integer lon_mm = 0; int lastLetterIdx = 0; - if (latlon.split(" ").length ==2) { - lon_dd = parseInteger(latlon.substring(6,9)); + if (latlon.split(" ").length ==2) { + lon_dd = parseInteger(latlon.substring(6,9)); lon_mm = parseInteger(latlon.substring(9,11)); lastLetterIdx = 11; } @@ -810,211 +810,211 @@ public class NcPirepParser { lon_dd = parseInteger(latlon.substring(5,8)); lon_mm = parseInteger(latlon.substring(8,10)); lastLetterIdx = 10; - } - - if((lat_dd != null)&&(lat_mm) != null) { - if((lon_dd != null)&&(lon_mm) != null) { - - Double lat = lat_dd + (lat_mm / 60.0d); - Double lon = lon_dd + (lon_mm / 60.0d); - if(lat_dd.equals(0)&&(lat_mm.equals(0))) { - lat = 0.0; - } else { - switch(latlon.charAt(4)) { - case 'N' : { - break; - } - case 'S' : { - lat = lat * -1; - break; - } - default : { - lat = null; - } - } - } - if(lon_dd.equals(0)&&(lon_mm.equals(0))) { - lon = 0.0; - } else { - switch(latlon.charAt(lastLetterIdx)) { - case 'E' : { - break; - } - case 'W' : { - lon = lon * -1; - break; - } - default : { - lon = null; - } - } - } - if(lat != null && lon != null) { - point = new BasePoint(lat,lon); - } - } - } - return point; - } - - /** - * This method decodes a location point (i.e. a "location point" is either a - * navaid or a navaid/bearing/distance) from within the location data of a - * PIREP report. This method ported from NCEP decoder. - * - * @param fields - * "like-type" fields which contain location data - * @param startIndex - * Index of "like-type" group which contains start of location - * point - * @param aLoc - * latitude and longitude of location - * @return Index of "like-type" group which contains end of location point, - * -1 on failure - * @throws DecodeException - * If a decode error occured. - */ - protected int decodeLocationPoint(String[] fields, int startIndex, - BasePoint aLoc) { - boolean offset = false; - boolean other = false; - boolean bad = false; - int endIndex = -1; - - // LatLonPoint point1Loc = null; - - // The "like-type" group should be a 3-letter or 4-letter navaid - // identifier. - BasePoint navaidLoc = null; - int i = startIndex; - if ((Character.isLetter(fields[i].charAt(0)) && ((fields[i].length() == 3) || (fields[i] - .length() == 4))) - || (Character.isDigit(fields[i].charAt(0)) && (fields[i].length() <= 2))) { - // Setting conditions if the navaid came after the reported - // distance and range. - if (Character.isDigit(fields[i].charAt(0))) { - if ((i + 2) < fields.length) { - i += 2; - endIndex = i; - other = true; - if (fields[i].length() <= 2) { - bad = true; - } - } else { - bad = true; - } - } - - // Locate the entry for this navaid in the PIREP navaids table - if (!bad) { - navaidLoc = getNavaidLocation(fields[i]); - if (navaidLoc == null) { - // LOG.error("Could not find " + fields[i] + " in Pirep - // Navaids table."); - return -1; - } - - // store the first location navaid as the platform station - if (navaidLoc == null) { - // thePlatformStation = platformStation; - } - - // create location for the navaid -// point1Loc = new LatLonPoint(navaidLoc.getLatitude(), -// navaidLoc.getLongitude(), -// LatLonPoint.INDEGREES); - } - } else { - bad = true; - } - - if (bad) { - // throw new DecodeException("Invalid Navaid in Pirep Location: " - // + fields[i]); - } - - // Looking for the bearing and distance offset, if there is one. - int bearingDegrees = -1; - int distanceNm = -1; - if (!other && ((i + 1) < fields.length) - && Character.isDigit(fields[i + 1].charAt(0)) - && (fields[i + 1].length() == 6)) { - endIndex = i + 1; - bearingDegrees = Integer.parseInt(fields[i + 1].substring(0, 3)); - distanceNm = Integer.parseInt(fields[i + 1].substring(3, 6)); - offset = true; - if ((bearingDegrees < 0) || (bearingDegrees > 360) - || (distanceNm < 0)) { - // throw new DecodeException("Invalid bearing / distance: " - // + bearingDegrees + " / " + distanceNm + " data: " - // + fields[i + 1]); - } - } else if (other) { - // getting bearing and distance of aircraft - distanceNm = Integer.parseInt(fields[i - 2]); - bearingDegrees = decodeLocationDirection(fields[i - 1]); - offset = true; - } - - BasePoint loc = null; - if (offset) { - // // convert distance from nautical miles to kilometers - // Length distance = distanceNm; - // // convert bearing from degrees to radians - // AngularMeasure bearing = new AngularMeasure() - // .fromDegree(bearingDegrees); - // - // // Compute the latitude and longitude of the location - // // point by applying the bearing and distance offsets - // // to the navaid latitude and longitude. - // // (assume spherical earth) - // double distanceRad = distance.getKilometers() - // / PhysPar.EARTH_RADIUS_KM; - // loc = LatLonPoint.positionOf(navaidLoc.getLatitude(), navaidLoc - // .getLongitude(), bearing.getRadians(), distanceRad); - // } else { - // // The location point is simply the navaid itself, so the - // // latitude and longitude of the location point are equal - // // to the latitude and longitude of the navaid. - // endIndex = i; - // loc = navaidLoc; - } - aLoc.setLatitude(loc.getLatitude()); - aLoc.setLongitude(loc.getLongitude()); - - return endIndex; - } - - /** - * This method decodes a location direction from a given compass point from - * within the location data of a PIREP report. This method ported from NCEP - * decoder. - * - * @param aField - * A possible location direction to decode. - * @return location direction in degrees, -1 on failure - */ - protected int decodeLocationDirection(String aField) { - int bearingDegrees = -1; - if(DIR_POINTS.containsKey(aField)) { - bearingDegrees = DIR_POINTS.get(aField).intValue(); - } - return bearingDegrees; - } - - /** - * This subroutine decodes and stores the time (i.e. report hour and report - * minutes) from AMDAR, AIREP, PIREP, and RECCO reports. This method ported - * from NCEP decoder. - * - * @param str - * time data - * @return true on success - * @throws DecodeException - * If a decode error occured. - */ + } + + if((lat_dd != null)&&(lat_mm) != null) { + if((lon_dd != null)&&(lon_mm) != null) { + + Double lat = lat_dd + (lat_mm / 60.0d); + Double lon = lon_dd + (lon_mm / 60.0d); + if(lat_dd.equals(0)&&(lat_mm.equals(0))) { + lat = 0.0; + } else { + switch(latlon.charAt(4)) { + case 'N' : { + break; + } + case 'S' : { + lat = lat * -1; + break; + } + default : { + lat = null; + } + } + } + if(lon_dd.equals(0)&&(lon_mm.equals(0))) { + lon = 0.0; + } else { + switch(latlon.charAt(lastLetterIdx)) { + case 'E' : { + break; + } + case 'W' : { + lon = lon * -1; + break; + } + default : { + lon = null; + } + } + } + if(lat != null && lon != null) { + point = new BasePoint(lat,lon); + } + } + } + return point; + } + + /** + * This method decodes a location point (i.e. a "location point" is either a + * navaid or a navaid/bearing/distance) from within the location data of a + * PIREP report. This method ported from NCEP decoder. + * + * @param fields + * "like-type" fields which contain location data + * @param startIndex + * Index of "like-type" group which contains start of location + * point + * @param aLoc + * latitude and longitude of location + * @return Index of "like-type" group which contains end of location point, + * -1 on failure + * @throws DecodeException + * If a decode error occured. + */ + protected int decodeLocationPoint(String[] fields, int startIndex, + BasePoint aLoc) { + boolean offset = false; + boolean other = false; + boolean bad = false; + int endIndex = -1; + + // LatLonPoint point1Loc = null; + + // The "like-type" group should be a 3-letter or 4-letter navaid + // identifier. + BasePoint navaidLoc = null; + int i = startIndex; + if ((Character.isLetter(fields[i].charAt(0)) && ((fields[i].length() == 3) || (fields[i] + .length() == 4))) + || (Character.isDigit(fields[i].charAt(0)) && (fields[i].length() <= 2))) { + // Setting conditions if the navaid came after the reported + // distance and range. + if (Character.isDigit(fields[i].charAt(0))) { + if ((i + 2) < fields.length) { + i += 2; + endIndex = i; + other = true; + if (fields[i].length() <= 2) { + bad = true; + } + } else { + bad = true; + } + } + + // Locate the entry for this navaid in the PIREP navaids table + if (!bad) { + navaidLoc = getNavaidLocation(fields[i]); + if (navaidLoc == null) { + // LOG.error("Could not find " + fields[i] + " in Pirep + // Navaids table."); + return -1; + } + + // store the first location navaid as the platform station + if (navaidLoc == null) { + // thePlatformStation = platformStation; + } + + // create location for the navaid +// point1Loc = new LatLonPoint(navaidLoc.getLatitude(), +// navaidLoc.getLongitude(), +// LatLonPoint.INDEGREES); + } + } else { + bad = true; + } + + if (bad) { + // throw new DecodeException("Invalid Navaid in Pirep Location: " + // + fields[i]); + } + + // Looking for the bearing and distance offset, if there is one. + int bearingDegrees = -1; + int distanceNm = -1; + if (!other && ((i + 1) < fields.length) + && Character.isDigit(fields[i + 1].charAt(0)) + && (fields[i + 1].length() == 6)) { + endIndex = i + 1; + bearingDegrees = Integer.parseInt(fields[i + 1].substring(0, 3)); + distanceNm = Integer.parseInt(fields[i + 1].substring(3, 6)); + offset = true; + if ((bearingDegrees < 0) || (bearingDegrees > 360) + || (distanceNm < 0)) { + // throw new DecodeException("Invalid bearing / distance: " + // + bearingDegrees + " / " + distanceNm + " data: " + // + fields[i + 1]); + } + } else if (other) { + // getting bearing and distance of aircraft + distanceNm = Integer.parseInt(fields[i - 2]); + bearingDegrees = decodeLocationDirection(fields[i - 1]); + offset = true; + } + + BasePoint loc = null; + if (offset) { + // // convert distance from nautical miles to kilometers + // Length distance = distanceNm; + // // convert bearing from degrees to radians + // AngularMeasure bearing = new AngularMeasure() + // .fromDegree(bearingDegrees); + // + // // Compute the latitude and longitude of the location + // // point by applying the bearing and distance offsets + // // to the navaid latitude and longitude. + // // (assume spherical earth) + // double distanceRad = distance.getKilometers() + // / PhysPar.EARTH_RADIUS_KM; + // loc = LatLonPoint.positionOf(navaidLoc.getLatitude(), navaidLoc + // .getLongitude(), bearing.getRadians(), distanceRad); + // } else { + // // The location point is simply the navaid itself, so the + // // latitude and longitude of the location point are equal + // // to the latitude and longitude of the navaid. + // endIndex = i; + // loc = navaidLoc; + } + aLoc.setLatitude(loc.getLatitude()); + aLoc.setLongitude(loc.getLongitude()); + + return endIndex; + } + + /** + * This method decodes a location direction from a given compass point from + * within the location data of a PIREP report. This method ported from NCEP + * decoder. + * + * @param aField + * A possible location direction to decode. + * @return location direction in degrees, -1 on failure + */ + protected int decodeLocationDirection(String aField) { + int bearingDegrees = -1; + if(DIR_POINTS.containsKey(aField)) { + bearingDegrees = DIR_POINTS.get(aField).intValue(); + } + return bearingDegrees; + } + + /** + * This subroutine decodes and stores the time (i.e. report hour and report + * minutes) from AMDAR, AIREP, PIREP, and RECCO reports. This method ported + * from NCEP decoder. + * + * @param str + * time data + * @return true on success + * @throws DecodeException + * If a decode error occured. + */ protected boolean decodeTimeData(String str) { - //get current calendar and set day, hour and minute + //get current calendar and set day, hour and minute str = str.trim(); Calendar oTime = TimeTools.getSystemCalendar(); @@ -1042,28 +1042,28 @@ public class NcPirepParser { issuTime.set(Calendar.MINUTE,minute); issuTime.set(Calendar.SECOND,0); issuTime.set(Calendar.MILLISECOND,0); - + if (str.length() == 4) { hour = Integer.parseInt(str.substring(0, 2)); minute = Integer.parseInt(str.substring(2, 4)); - + observationTime = TimeTools.copy(oTime); observationTime.set(Calendar.YEAR, year); observationTime.set(Calendar.MONTH, month); - observationTime.set(Calendar.DAY_OF_MONTH, day); - observationTime.set(Calendar.HOUR_OF_DAY,hour); - observationTime.set(Calendar.MINUTE,minute); - observationTime.set(Calendar.SECOND,0); - observationTime.set(Calendar.MILLISECOND,0); + observationTime.set(Calendar.DAY_OF_MONTH, day); + observationTime.set(Calendar.HOUR_OF_DAY,hour); + observationTime.set(Calendar.MINUTE,minute); + observationTime.set(Calendar.SECOND,0); + observationTime.set(Calendar.MILLISECOND,0); if (observationTime.getTime() != issuTime.getTime()) observationTime = checkDayInTime (observationTime, issuTime); - //System.out.println("***********time2 "+observationTime.getTime()); - oTime.add(Calendar.MINUTE, ALLOWABLE_TIME); - if(observationTime.compareTo(oTime) > 0) { - observationTime.add(Calendar.DAY_OF_MONTH,-1); - } - + //System.out.println("***********time2 "+observationTime.getTime()); + oTime.add(Calendar.MINUTE, ALLOWABLE_TIME); + if(observationTime.compareTo(oTime) > 0) { + observationTime.add(Calendar.DAY_OF_MONTH,-1); + } + return true; } else if (str.length() == 6) { @@ -1088,8 +1088,8 @@ public class NcPirepParser { return true; } else - return false; - } + return false; + } /* * In 'ENA UA /OV PDN288051/TM 2348/FL340/TP B737/TA M56/WV 218035/TB CONT LGHT OCNL MOD/RM CONT CHOP FL350 ZAN =', 'TM 2348' is the obs time. * Get the day from wmoHeader and add to front of '2348' @@ -1124,218 +1124,218 @@ public class NcPirepParser { return obs; } - - /** - * This method decodes PIREP flight level. - * - * @param str - * Flight Level Data - * @return true on success - */ - protected boolean decodeFlightLevelData(String str) { - String regex = "([0-9]{3})(?:-([0-9]{3}))?"; - Pattern pattern = Pattern.compile(regex); - - // Get a Matcher based on the target string. - Matcher matcher = pattern.matcher(str); - if (matcher.find()) { - Integer fltLevel = decodeHeight(matcher.group(1)); - - if (matcher.group(2) != null) { - Integer upperLevel = decodeHeight(matcher.group(2)); - - fltLevel = (fltLevel + upperLevel) / 2; - } - flightLevel = new AircraftFlightLevel(fltLevel); - } - - // if the flight level has anything non-numeric such as UNK, UNKN, DURC, - // DURD, VFR, etc. - // the flight level will be left null and stored by the decoder as - // unknown - - return true; - } - - /** - * This method decodes a 3-digit string containing a height value in units - * of hundreds-of-feet into a real height value in units of feet. This - * method ported from NCEP decoder. - * - * @param aHeight - * Height data to decode. - * @return The aircraft height information or null if the decode failed. - */ - protected static Integer decodeHeight(String aHeight) { - Integer altHundredsFeet = null; - if (aHeight.length() == 3) { - if(!"UNKN".equals(aHeight)) { - // unknown heights - if ((aHeight.indexOf("UNK") != -1) || (aHeight.indexOf("ABV") != -1) - || (aHeight.indexOf("BLO") != -1)) { - altHundredsFeet = null; - } else { - altHundredsFeet = Integer.parseInt(aHeight) * 100; - } - } - } - return altHundredsFeet; - } - - /** - * This method decodes and stores the aircraft type data from within a PIREP - * report. This method ported from NCEP decoder. - * - * @param aType - * Aircraft type data - * @return Was the aircraft type decoded. (always true) - */ - protected boolean decodeAircraftTypeData(String aType) { - aType = aType.trim(); - - // truncate at 8 characters - if (aType.length() <= 8) { - aircraftType = new String(aType); - } else { - aircraftType = new String(aType.substring(0, 8)); - } - - return true; - } - - /** - * This method decodes and stores the temperature data from within a PIREP - * report. This method ported from NCEP decoder. - * - * @param aTemperature - * A possible temperature to be decoded. - * @return Was the temperature data decoded. - * @throws DecodeException - * If a decode error occured. - */ - protected boolean decodeTemperatureData(String aTemperature) { - // Break up the input string into groups of "like-type" in order - // to facilitate decoding. - String[] fields = groupLikeTypes(aTemperature); - if (fields.length == 0) { - return false; - } - - // Locate, decode, and store the temperature data from within - // the first 3 "like-type" groups. It is identifiable as a - // numeric "like-type" group of at least 1 digit, possibly - // preceded by a "like-type" group containing the sign of - // the temperature. - int numGroups = Math.min(3, fields.length); - for (int i = 0; i < numGroups; i++) { - if ((fields[i].length() >= 1) - && (Character.isDigit(fields[i].charAt(0)))) { + + /** + * This method decodes PIREP flight level. + * + * @param str + * Flight Level Data + * @return true on success + */ + protected boolean decodeFlightLevelData(String str) { + String regex = "([0-9]{3})(?:-([0-9]{3}))?"; + Pattern pattern = Pattern.compile(regex); + + // Get a Matcher based on the target string. + Matcher matcher = pattern.matcher(str); + if (matcher.find()) { + Integer fltLevel = decodeHeight(matcher.group(1)); + + if (matcher.group(2) != null) { + Integer upperLevel = decodeHeight(matcher.group(2)); + + fltLevel = (fltLevel + upperLevel) / 2; + } + flightLevel = new AircraftFlightLevel(fltLevel); + } + + // if the flight level has anything non-numeric such as UNK, UNKN, DURC, + // DURD, VFR, etc. + // the flight level will be left null and stored by the decoder as + // unknown + + return true; + } + + /** + * This method decodes a 3-digit string containing a height value in units + * of hundreds-of-feet into a real height value in units of feet. This + * method ported from NCEP decoder. + * + * @param aHeight + * Height data to decode. + * @return The aircraft height information or null if the decode failed. + */ + protected static Integer decodeHeight(String aHeight) { + Integer altHundredsFeet = null; + if (aHeight.length() == 3) { + if(!"UNKN".equals(aHeight)) { + // unknown heights + if ((aHeight.indexOf("UNK") != -1) || (aHeight.indexOf("ABV") != -1) + || (aHeight.indexOf("BLO") != -1)) { + altHundredsFeet = null; + } else { + altHundredsFeet = Integer.parseInt(aHeight) * 100; + } + } + } + return altHundredsFeet; + } + + /** + * This method decodes and stores the aircraft type data from within a PIREP + * report. This method ported from NCEP decoder. + * + * @param aType + * Aircraft type data + * @return Was the aircraft type decoded. (always true) + */ + protected boolean decodeAircraftTypeData(String aType) { + aType = aType.trim(); + + // truncate at 8 characters + if (aType.length() <= 8) { + aircraftType = new String(aType); + } else { + aircraftType = new String(aType.substring(0, 8)); + } + + return true; + } + + /** + * This method decodes and stores the temperature data from within a PIREP + * report. This method ported from NCEP decoder. + * + * @param aTemperature + * A possible temperature to be decoded. + * @return Was the temperature data decoded. + * @throws DecodeException + * If a decode error occured. + */ + protected boolean decodeTemperatureData(String aTemperature) { + // Break up the input string into groups of "like-type" in order + // to facilitate decoding. + String[] fields = groupLikeTypes(aTemperature); + if (fields.length == 0) { + return false; + } + + // Locate, decode, and store the temperature data from within + // the first 3 "like-type" groups. It is identifiable as a + // numeric "like-type" group of at least 1 digit, possibly + // preceded by a "like-type" group containing the sign of + // the temperature. + int numGroups = Math.min(3, fields.length); + for (int i = 0; i < numGroups; i++) { + if ((fields[i].length() >= 1) + && (Character.isDigit(fields[i].charAt(0)))) { // double temp; - float temp = RMISSD; - if (i == 0) { - // This is the first "like-type" group, so assume + float temp = RMISSD; + if (i == 0) { + // This is the first "like-type" group, so assume // that the sign of the temperature is positive. -// temp = decodeTemperatureData("+", fields[i]; - temp = (float)decodeTemperatureData("+", fields[i]); - } else { - // Assume that the previous "like-type" group - // contains the sign of the temperature. +// temp = decodeTemperatureData("+", fields[i]; + temp = (float)decodeTemperatureData("+", fields[i]); + } else { + // Assume that the previous "like-type" group + // contains the sign of the temperature. // temp = decodeTemperatureData(fields[i - 1], fields[i]); - temp = (float)decodeTemperatureData(fields[i - 1], fields[i]); - } - + temp = (float)decodeTemperatureData(fields[i - 1], fields[i]); + } + //qu if (Double.isNaN(temp)) { // /* 8888888888888888888 */ // temp = RMISSD; // System.out.println(" temp is NaN So set to RMISSD???"); -// /* 888 */ -// return false; -// } - - // Check if temperature was reported in Fahrenheit. - if ((i < (fields.length - 1)) - && ((fields[i + 1].length() == 1) && (fields[i + 1] - .charAt(0) == 'F'))) { - // temperature = new Temperature().fromFahrenheit(temp); +// /* 888 */ +// return false; +// } + + // Check if temperature was reported in Fahrenheit. + if ((i < (fields.length - 1)) + && ((fields[i + 1].length() == 1) && (fields[i + 1] + .charAt(0) == 'F'))) { + // temperature = new Temperature().fromFahrenheit(temp); } else { - temperature = temp; - } - break; - } - } - - return true; - } - - /** - * Helper method to decode temperature in PIREP. This method was ported from - * NCEP decoder. - * - * @param sign - * Sign of the data i.e. {"PS, P, +, MS, M, -}. - * @param temp - * Candidate temperature value. - * @return temperature on success, NaN on failure - * @throws DecodeException - * If a decode error occured. - */ - protected double decodeTemperatureData(String sign, String temp) { - double rmult = Double.NaN; - double rdiv = Double.NaN; - - // validate length - if ((temp.length() < 1) || (temp.length() > 3) || (sign.length() < 1) - || (sign.length() > 2)) { - // throw new DecodeException("Unrecognized temperature data format - // in Pirep: " + sign + temp); - } - - // Determine divisor based on the length of the input temperature - // string. - if (temp.length() == 3) { - rdiv = 10.0; - } else { - rdiv = 1.0; - } - - // Determine the length of the input temperature sign string, - // and then decode the sign of the temperature accordingly. - if (sign.length() == 2) { - if ("PS".equals(sign)) { - rmult = 1.0; - } else if ("MS".equals(sign)) { - rmult = -1.0; - } - } else { - if ("P".equals(sign) || "+".equals(sign)) { - rmult = 1.0; - } else if ("M".equals(sign) || "-".equals(sign)) { - rmult = -1.0; - } - } - if (Double.isNaN(rmult)) { - // throw new DecodeException("Unrecognized temperature sign data - // format in Pirep: " + sign); - } - - double t = (double) Integer.parseInt(temp) * rmult / rdiv; - return t; - } - - /** - * This method decodes the sky cover data. - * - * @param str - * Sky cover data to be decoded. - * @return Was the sky cover correctly decoded? - * @throws DecodeException - * If a decode error occured. - */ - protected boolean decodeSkyCoverData(String sky) { - // Format is NNN(-NNN)bbb(-TOPttt)/NNN(-NNN)bbb, etc. - // NNN is the three-letter contraction for the amount of cloud cover - // bbb is the height of the base of a layer of clouds in hundreds of - // feet + temperature = temp; + } + break; + } + } + + return true; + } + + /** + * Helper method to decode temperature in PIREP. This method was ported from + * NCEP decoder. + * + * @param sign + * Sign of the data i.e. {"PS, P, +, MS, M, -}. + * @param temp + * Candidate temperature value. + * @return temperature on success, NaN on failure + * @throws DecodeException + * If a decode error occured. + */ + protected double decodeTemperatureData(String sign, String temp) { + double rmult = Double.NaN; + double rdiv = Double.NaN; + + // validate length + if ((temp.length() < 1) || (temp.length() > 3) || (sign.length() < 1) + || (sign.length() > 2)) { + // throw new DecodeException("Unrecognized temperature data format + // in Pirep: " + sign + temp); + } + + // Determine divisor based on the length of the input temperature + // string. + if (temp.length() == 3) { + rdiv = 10.0; + } else { + rdiv = 1.0; + } + + // Determine the length of the input temperature sign string, + // and then decode the sign of the temperature accordingly. + if (sign.length() == 2) { + if ("PS".equals(sign)) { + rmult = 1.0; + } else if ("MS".equals(sign)) { + rmult = -1.0; + } + } else { + if ("P".equals(sign) || "+".equals(sign)) { + rmult = 1.0; + } else if ("M".equals(sign) || "-".equals(sign)) { + rmult = -1.0; + } + } + if (Double.isNaN(rmult)) { + // throw new DecodeException("Unrecognized temperature sign data + // format in Pirep: " + sign); + } + + double t = (double) Integer.parseInt(temp) * rmult / rdiv; + return t; + } + + /** + * This method decodes the sky cover data. + * + * @param str + * Sky cover data to be decoded. + * @return Was the sky cover correctly decoded? + * @throws DecodeException + * If a decode error occured. + */ + protected boolean decodeSkyCoverData(String sky) { + // Format is NNN(-NNN)bbb(-TOPttt)/NNN(-NNN)bbb, etc. + // NNN is the three-letter contraction for the amount of cloud cover + // bbb is the height of the base of a layer of clouds in hundreds of + // feet // ttt is the top of the layer in hundreds of feet String[] str2 = sky.split("/"); @@ -1386,7 +1386,7 @@ public class NcPirepParser { AircraftCloudLayer layer = new AircraftCloudLayer(); - //Separate following regex to 2 part to fix all cases + //Separate following regex to 2 part to fix all cases //String regex = "([A-Z]{3}|UNKN?)(?:-([A-Z]{3}))?([0-9]{3}|UNKN?)(?:-TOP([0-9]{3}|UNKN?))?/?"; String regex = "([A-Z]{3}|UNKN?)(?:-([A-Z]{3}))?"; @@ -1434,152 +1434,153 @@ public class NcPirepParser { } if (cloudLayers != null) - cloudLayers.add(layer); - - // TODO alternate sky cover format and separator of cloud cover can be - // other than - - // also other possibilities in afpsky.f - // also TOP can be TPS, and can be second top height - } - return true; - } - - /** - * This method decodes the wind data. - * - * @param str - * Wind data to be decoded. - * @return Was the wind data properly decoded? - * @throws DecodeException - * If a decode error occured. - */ - protected boolean decodeWindData(String str) { - // Format is dddff(f)KT - // ddd is three digit true direction in whole degrees from - // which the wind is blowing - // ff(f) is the wind speed in knots, followed by KT - String regex = "([0-9]{3})([0-9]{2,3})(?:KT)?"; - Pattern pattern = Pattern.compile(regex); - // Get a Matcher based on the target string. - Matcher matcher = pattern.matcher(str); - if (matcher.find()) { + cloudLayers.add(layer); + + // TODO alternate sky cover format and separator of cloud cover can be + // other than - + // also other possibilities in afpsky.f + // also TOP can be TPS, and can be second top height + } + return true; + } + + /** + * This method decodes the wind data. + * + * @param str + * Wind data to be decoded. + * @return Was the wind data properly decoded? + * @throws DecodeException + * If a decode error occured. + */ + protected boolean decodeWindData(String str) { + // Format is dddff(f)KT + // ddd is three digit true direction in whole degrees from + // which the wind is blowing + // ff(f) is the wind speed in knots, followed by KT + String regex = "([0-9]{3})([0-9]{2,3})(?:KT)?"; + Pattern pattern = Pattern.compile(regex); + // Get a Matcher based on the target string. + Matcher matcher = pattern.matcher(str); + if (matcher.find()) { // windDirection = Integer.parseInt(matcher.group(1)); - windDirection = Float.parseFloat(matcher.group(1)); - - int windSpeedKnots = Integer.parseInt(matcher.group(2)); + windDirection = Float.parseFloat(matcher.group(1)); + + int windSpeedKnots = Integer.parseInt(matcher.group(2)); // windSpeed = new Double(windSpeedKnots); // Speed().fromKnots(windSpeedKnots); - windSpeed = new Float(windSpeedKnots); // Speed().fromKnots(windSpeedKnots); - } else { - // throw new DecodeException("Unrecognized wind data format in - // Pirep: " + str); - } - - return true; - } - - /** - * This method decodes the turbulence data. - * - * @param str - * Turbulence data to be decoded. - * @return Was the turbulence properly decoded? - * @throws DecodeException - * If a decode error occured. - */ - protected boolean decodeTurbulenceData(String turbLayers) { - // Format is III(-III)( CAT or CHOP ) (bbb-ttt)/III(-III) etc. - // III is the intensity of the turbulence - // CAT or CHOP is the type of turbulence - // bbb is the height of the base of a layer of clouds in hundreds of - // feet - // ttt is the top of the layer in hundreds of feet -// String regex = "([A-Z]{3,5})(?:((?:-)([A-Z]{3,5})))?((?: )" -// + "(CHOP|CAT))?(?: )?(((ABV|BLO)(?: )(\\d{3}))|((\\d{3})" + windSpeed = new Float(windSpeedKnots); // Speed().fromKnots(windSpeedKnots); + } else { + // throw new DecodeException("Unrecognized wind data format in + // Pirep: " + str); + } + + return true; + } + + /** + * This method decodes the turbulence data. + * + * @param str + * Turbulence data to be decoded. + * @return Was the turbulence properly decoded? + * @throws DecodeException + * If a decode error occured. + */ + protected boolean decodeTurbulenceData(String turbLayers) { + // Format is III(-III)( CAT or CHOP ) (bbb-ttt)/III(-III) etc. + // III is the intensity of the turbulence + // CAT or CHOP is the type of turbulence + // bbb is the height of the base of a layer of clouds in hundreds of + // feet + // ttt is the top of the layer in hundreds of feet +// String regex = "([A-Z]{3,5})(?:((?:-)([A-Z]{3,5})))?((?: )" +// + "(CHOP|CAT))?(?: )?(((ABV|BLO)(?: )(\\d{3}))|((\\d{3})" // + "(?:(-(\\d{3}))?)))?(?:/)?()"; - + // String[] str2 = turbLayers.split("/"); -// for (String str :str2) { -// theTurbulenceLayers = new ArrayList(); -// -// if (str.indexOf(NEG_ENTRY) > 0) { -// AircraftFlightCondition at = new AircraftFlightCondition(); -// -// // NEG should be the only value! Used to indicate forecasted but -// // not observed! -// at.setIntensity1(NEG_ENTRY); -// if (flightLevel != null) { -// at.setBaseHeight(flightLevel.getFlightLevel()); -// theTurbulenceLayers.add(at); -// } -// } else { -// Pattern pattern = Pattern.compile(TRB_REGEX); -// // Get a Matcher based on the target string. -// Matcher matcher = pattern.matcher(str); -// // add each turbulence -// while (matcher.find()) { -// addFlightCondition(matcher, theTurbulenceLayers); -// } +// for (String str :str2) { +// theTurbulenceLayers = new ArrayList(); +// +// if (str.indexOf(NEG_ENTRY) > 0) { +// AircraftFlightCondition at = new AircraftFlightCondition(); +// +// // NEG should be the only value! Used to indicate forecasted but +// // not observed! +// at.setIntensity1(NEG_ENTRY); +// if (flightLevel != null) { +// at.setBaseHeight(flightLevel.getFlightLevel()); +// theTurbulenceLayers.add(at); +// } +// } else { +// Pattern pattern = Pattern.compile(TRB_REGEX); +// // Get a Matcher based on the target string. +// Matcher matcher = pattern.matcher(str); +// // add each turbulence +// while (matcher.find()) { +// addFlightCondition(matcher, theTurbulenceLayers); +// } // } //turbLayers = turbLayers.trim(); - + PirepTools tools = new PirepTools(turbLayers); theTurbulenceLayers = tools.decodeTurbulenceData(); - - if (theTurbulenceLayers.size() == 0) { - theTurbulenceLayers = null; - } - - return true; - } - - /** - * This method decodes the icing data. - * - * @param str - * Icing data to be decoded. - * @return Was the icing data decoded? - * @throws DecodeException - * If a decode error occurred. - */ - protected boolean decodeIcingData(String icing) { - // Format is III(-III) (type) (bbb-ttt)/III(-III) etc. - // III is the intesity of the icing - // type is the type of icing - // bbb is the height of the base of a layer of clouds in hundreds of - // feet - // ttt is the top of the layer in hundreds of feet -// String regex = "([A-Z]{3,5})(?:((?:-)([A-Z]{3,5})))?((?: )" -// + "(RIME|MXD|CLR))(?: )?(((ABV|BLO)(?: )(\\d{3}))|((\\d{3})" -// + "(?:(-(\\d{3}))?)))?(?:/)?()"; + + if (theTurbulenceLayers.size() == 0) { + theTurbulenceLayers = null; + } + + return true; + } + + /** + * This method decodes the icing data. + * + * @param str + * Icing data to be decoded. + * @return Was the icing data decoded? + * @throws DecodeException + * If a decode error occurred. + */ + protected boolean decodeIcingData(String icing) { + // Format is III(-III) (type) (bbb-ttt)/III(-III) etc. + // III is the intesity of the icing + // type is the type of icing + // bbb is the height of the base of a layer of clouds in hundreds of + // feet + // ttt is the top of the layer in hundreds of feet +// String regex = "([A-Z]{3,5})(?:((?:-)([A-Z]{3,5})))?((?: )" +// + "(RIME|MXD|CLR))(?: )?(((ABV|BLO)(?: )(\\d{3}))|((\\d{3})" +// + "(?:(-(\\d{3}))?)))?(?:/)?()"; String[] str2 = icing.split("/"); - for (String str :str2) { - theIcingLayers = new ArrayList(); - - if (str.indexOf(NEG_ENTRY) > 0) { - AircraftFlightCondition at = new AircraftFlightCondition(); - - // NEG should be the only value! Used to indicate forecasted but - // not observed! - at.setIntensity1(NEG_ENTRY); - if (flightLevel != null) { - at.setBaseHeight(flightLevel.getFlightLevel()); - theIcingLayers.add(at); - } - } else { - Pattern pattern = Pattern.compile(ICE_REGEX); + for (String str :str2) { + theIcingLayers = new ArrayList(); + + if (str.indexOf(NEG_ENTRY) > 0) { + AircraftFlightCondition at = new AircraftFlightCondition(); + + // NEG should be the only value! Used to indicate forecasted but + // not observed! + at.setIntensity1(NEG_ENTRY); + if (flightLevel != null) { + at.setBaseHeight(flightLevel.getFlightLevel()); + theIcingLayers.add(at); + } + } else { + Pattern pattern = Pattern.compile(ICE_REGEX); Matcher matcher = pattern.matcher(str); if (matcher.find()) { - matcher = pattern.matcher(str); //need to re-match - while (matcher.find()) { - addFlightCondition(matcher, theIcingLayers); - } + matcher = pattern.matcher(str); //need to re-match. LGT RIME 014-083 + while (matcher.find()) { + //System.out.println("***str "+str); + addFlightCondition(matcher, theIcingLayers); + } } else { - Pattern pattern2 = Pattern.compile("([A-Z]{3,5})"); //only intensity + Pattern pattern2 = Pattern.compile("([A-Z]{3,5})"); //only intensity. LGT Matcher matcher2 = pattern2.matcher(str); while (matcher2.find()) { @@ -1606,292 +1607,292 @@ public class NcPirepParser { theIcingLayers.add(at); } - } - } - - if (theIcingLayers.size() == 0) { - theIcingLayers = null; - } - } - return true; - } - - /** - * This method decodes the weather data. - * - * @param str - * Weather data to be decoded. - * @return Was the weather information decoded? - */ - protected boolean decodeWeatherData(String str) { - // Format is (FVvvSM )ww( ww)( ww) - // FVvvSM is flight visibility; vv is the value, SM indicates statute - // miles (km otherwise) - // type is the type of icing - // bbb is the height of the base of a layer of clouds in hundreds of - // feet - // ttt is the top of the layer in hundreds of feet - String regex = "^ ?(?:(FV)([0-9]{2})(SM)?)? ?(.*)"; - Pattern pattern = Pattern.compile(regex); - // Get a Matcher based on the target string. - Matcher matcher = pattern.matcher(str); - matcher.find(); - - if (matcher.group(1) != null) { - // parse flight visibility - if (matcher.group(3) != null) { - horzVisibility = Integer.parseInt(matcher.group(2)); - } else { - // theFlightVisibility = new - // Length().fromKilometers(Integer.parseInt(matcher.group(2))); - } - } - - // parse weather codes - regex = "([+|-]?[A-Z]{2,4})([0-9]{3}|UNKN?)?(?:-TOP([0-9]{3}|UNKN?))? ?"; - pattern = Pattern.compile(regex); - matcher = pattern.matcher(matcher.group(4)); - ArrayList codes = new ArrayList(); - while (matcher.find()) { - codes.add(matcher.group(1)); - // the level information is in groups 2 and 3 when provided, - // but the metoc model does not store this data - } - theWeatherCodes = codes.toArray(new String[0]); - - return true; - } - - /** - * This method decodes data in remarks section. - * - * @param str - * Remarks data to be decoded. - * @return Was the remarks data decoded? (Always returns true!) - */ - protected boolean decodeRemarksData(String str) { - theRemarks = new AircraftRemarks(str); - return true; - } - - /** - * Utility method for decoding flight level information for turbulence and - * icing layers. - * - * @param matcher - * A Matcher instance for the specific source data. - * @param layers - * The decoded layer information. - * @throws DecodeException - * If a decode error occured. - */ - protected void addFlightCondition(Matcher matcher, List layers) { - - if(matcher.groupCount() >= 13) { - String s1 = matcher.group(1); - String s2 = matcher.group(3); - - // Some words that may show up in group 1 or 3 that need to be - // thrown away! - s1 = WX_COND_WORDS.get(s1); - if((s1 == null) || (NULL_ENTRY.equals(s1))) { - return; - } - // Need to allow s2 to be null, - if(s2 != null) { - // but not null after lookup! - s2 = WX_COND_WORDS.get(s2); - if((s2 == null) || (NULL_ENTRY.equals(s2))) { - return; - } - } - //****************************************************************** - - AircraftFlightCondition at = new AircraftFlightCondition(); - - // NEG should be the only value! Used to indicate forecasted but - // not observed! - if(NEG_ENTRY.equals(s1)) { - at.setIntensity1(s1); - if(flightLevel != null) { - at.setBaseHeight(flightLevel.getFlightLevel()); - } - } else { - at.setIntensity1(s1); - at.setIntensity2(s2); - - s1 = matcher.group(5); - s1 = WX_COND_WORDS.get(s1); - if((s1 != null) && (!s1.equals(NULL_ENTRY))) { - at.setType(s1); - } - - s1 = matcher.group(8); - s2 = matcher.group(9); - if(BLO_HGT.equals(s1)) { - at.setBaseHeight(IDecoderConstantsN.UAIR_INTEGER_MISSING); - at.setTopHeight(decodeHeight(s2)); - - } else if (ABV_HGT.equals(s1)) { - at.setBaseHeight(decodeHeight(s2)); - at.setTopHeight(IDecoderConstantsN.UAIR_INTEGER_MISSING); - } else { - // Check for one or more levels - s1 = matcher.group(11); - s2 = matcher.group(13); - if(s1 != null) { - at.setBaseHeight(decodeHeight(s1)); - } - if(s2 != null) { - at.setTopHeight(decodeHeight(s2)); - } - if((s1 != null)&&(s2 != null)) { - Integer base = at.getBaseHeight(); - Integer top = at.getTopHeight(); - if(base != IDecoderConstantsN.UAIR_INTEGER_MISSING) { - if(top != IDecoderConstantsN.UAIR_INTEGER_MISSING) { - if(base > top) { - logger.debug(traceId + "- BASE-TOP inversion fixed"); - at.setBaseHeight(top); - at.setTopHeight(base); - } - } - } - } - if((s1 == null)&&(s2 == null)) { - // Use the flight level if heights are not specified. - if(flightLevel != null) { - at.setBaseHeight(flightLevel.getFlightLevel()); - } - } - } } - - layers.add(at); - } - } - - /** - * The nextString method determines the position of the first occurrence of - * any of a list of substrings within the input string. This method provides - * equivalent functionality to the routine ST_NXTS in the ported code. The - * outputs are provided in member variables. - * - * @param str - * Input string - * @param firstPos - * First position to check - * @param lastPos - * Last position to check - * @param subStrings - * List of substrings - * @return success or failure - */ - protected boolean nextString(String str, int firstPos, int lastPos, - String subStrings[]) { - this.theTokenPos = -1; - String tstr = str.substring(0, lastPos); - for (int i = 0; i < subStrings.length; i++) { - if ((this.theSearchPos = tstr.indexOf(subStrings[i], firstPos)) != -1) { - this.theTokenPos = i; - return true; - } - } - - return false; - } - - /** - * This method finds a string in a string array and returns its index. - * - * @param str - * String to find - * @param strs - * Strings to compare - * @return index of matching string or -1 on failure - */ - protected int findString(String str, String[] strs) { - for (int i = 0; i < strs.length; i++) { - if (strs[i].equals(str)) { - return i; - } - } - return -1; - } // findString() - - /** - * This method groups "like-types" of characters to facilitate decoding. - * This method provides equivalent functionality to the UT_BKGP subroutine - * in the ported code. - * - * @param str - * String data to check. - * @return An array of "like type" strings. - */ - protected String[] groupLikeTypes(String str) { - char[] chars = str.toCharArray(); - ArrayList strs = new ArrayList(); - int prevGroup = NONE; - int curGroup = NONE; - String group = new String(); - for (int i = 0; i < chars.length; i++) { - if (Character.isWhitespace(chars[i])) { - curGroup = NONE; - } else if (Character.isDigit(chars[i])) { - curGroup = DIGIT; - } else if (Character.isLetter(chars[i])) { - curGroup = LETTER; - } else { // non-alphanumeric - curGroup = NONALPHANUMERIC; - } - - if (prevGroup != curGroup) { - if (prevGroup != NONE) { - strs.add(group); - group = new String(); - } - } - if (curGroup != NONE) { - group = group.concat(String.valueOf(chars[i])); - } - prevGroup = curGroup; - } - - if (group.length() > 0) { - strs.add(group); - } - - return strs.toArray(new String[0]); - } - - public static final void main(String [] args) { - //test1: latlon format - String [] latlons = { - "0000N 00000W", - "0000S 00000E", - "9000S 00000W", - "9000N 00000W", - "0000N 09000W", - "9000S 09000W", - "9000N 09000W", - - "0000N 09000W", - "4500S 09000W", - "9000N 09000W", - - "9000N 09959W", - "0000N 10000W", - - "4500S 09000W", - "9000N 09000W", - - "90N 18000E", // no match - "9000S 18000E", - "9000N 18000W", - "9000S 18000W", - "90N 179W", - "9000S 17959W", - }; + } + + if (theIcingLayers.size() == 0) { + theIcingLayers = null; + } + } + return true; + } + + /** + * This method decodes the weather data. + * + * @param str + * Weather data to be decoded. + * @return Was the weather information decoded? + */ + protected boolean decodeWeatherData(String str) { + // Format is (FVvvSM )ww( ww)( ww) + // FVvvSM is flight visibility; vv is the value, SM indicates statute + // miles (km otherwise) + // type is the type of icing + // bbb is the height of the base of a layer of clouds in hundreds of + // feet + // ttt is the top of the layer in hundreds of feet + String regex = "^ ?(?:(FV)([0-9]{2})(SM)?)? ?(.*)"; + Pattern pattern = Pattern.compile(regex); + // Get a Matcher based on the target string. + Matcher matcher = pattern.matcher(str); + matcher.find(); + + if (matcher.group(1) != null) { + // parse flight visibility + if (matcher.group(3) != null) { + horzVisibility = Integer.parseInt(matcher.group(2)); + } else { + // theFlightVisibility = new + // Length().fromKilometers(Integer.parseInt(matcher.group(2))); + } + } + + // parse weather codes + regex = "([+|-]?[A-Z]{2,4})([0-9]{3}|UNKN?)?(?:-TOP([0-9]{3}|UNKN?))? ?"; + pattern = Pattern.compile(regex); + matcher = pattern.matcher(matcher.group(4)); + ArrayList codes = new ArrayList(); + while (matcher.find()) { + codes.add(matcher.group(1)); + // the level information is in groups 2 and 3 when provided, + // but the metoc model does not store this data + } + theWeatherCodes = codes.toArray(new String[0]); + + return true; + } + + /** + * This method decodes data in remarks section. + * + * @param str + * Remarks data to be decoded. + * @return Was the remarks data decoded? (Always returns true!) + */ + protected boolean decodeRemarksData(String str) { + theRemarks = new AircraftRemarks(str); + return true; + } + + /** + * Utility method for decoding flight level information for turbulence and + * icing layers. + * + * @param matcher + * A Matcher instance for the specific source data. + * @param layers + * The decoded layer information. + * @throws DecodeException + * If a decode error occured. + */ + protected void addFlightCondition(Matcher matcher, List layers) { + + if(matcher.groupCount() >= 13) { + String s1 = matcher.group(1); + String s2 = matcher.group(3); + //System.out.println("***matcher "+matcher.group(0)); //MOD null null RIME RIME null null null + // Some words that may show up in group 1 or 3 that need to be + // thrown away! + s1 = WX_COND_WORDS.get(s1); + if((s1 == null) || (NULL_ENTRY.equals(s1))) { + return; + } + // Need to allow s2 to be null, + if(s2 != null) { + // but not null after lookup! + s2 = WX_COND_WORDS.get(s2); + if((s2 == null) || (NULL_ENTRY.equals(s2))) { + return; + } + } + //****************************************************************** + + AircraftFlightCondition at = new AircraftFlightCondition(); + + // NEG should be the only value! Used to indicate forecasted but + // not observed! + if(NEG_ENTRY.equals(s1)) { + at.setIntensity1(s1); + if(flightLevel != null) { + at.setBaseHeight(flightLevel.getFlightLevel()); + } + } else { + at.setIntensity1(s1); + at.setIntensity2(s2); + + s1 = matcher.group(5); + s1 = WX_COND_WORDS.get(s1); + if((s1 != null) && (!s1.equals(NULL_ENTRY))) { + at.setType(s1); + } + + s1 = matcher.group(8); + s2 = matcher.group(9); + if(BLO_HGT.equals(s1)) { + at.setBaseHeight(IDecoderConstantsN.UAIR_INTEGER_MISSING); + at.setTopHeight(decodeHeight(s2)); + + } else if (ABV_HGT.equals(s1)) { + at.setBaseHeight(decodeHeight(s2)); + at.setTopHeight(IDecoderConstantsN.UAIR_INTEGER_MISSING); + } else { + // Check for one or more levels + s1 = matcher.group(11); + s2 = matcher.group(13); + if(s1 != null) { + at.setBaseHeight(decodeHeight(s1)); + } + if(s2 != null) { + at.setTopHeight(decodeHeight(s2)); + } + if((s1 != null)&&(s2 != null)) { + Integer base = at.getBaseHeight(); + Integer top = at.getTopHeight(); + if(base != IDecoderConstantsN.UAIR_INTEGER_MISSING) { + if(top != IDecoderConstantsN.UAIR_INTEGER_MISSING) { + if(base > top) { + logger.debug(traceId + "- BASE-TOP inversion fixed"); + at.setBaseHeight(top); + at.setTopHeight(base); + } + } + } + } + if((s1 == null)&&(s2 == null)) { + // Use the flight level if heights are not specified. + if(flightLevel != null) { + at.setBaseHeight(flightLevel.getFlightLevel()); + } + } + } + } + + layers.add(at); + } + } + + /** + * The nextString method determines the position of the first occurrence of + * any of a list of substrings within the input string. This method provides + * equivalent functionality to the routine ST_NXTS in the ported code. The + * outputs are provided in member variables. + * + * @param str + * Input string + * @param firstPos + * First position to check + * @param lastPos + * Last position to check + * @param subStrings + * List of substrings + * @return success or failure + */ + protected boolean nextString(String str, int firstPos, int lastPos, + String subStrings[]) { + this.theTokenPos = -1; + String tstr = str.substring(0, lastPos); + for (int i = 0; i < subStrings.length; i++) { + if ((this.theSearchPos = tstr.indexOf(subStrings[i], firstPos)) != -1) { + this.theTokenPos = i; + return true; + } + } + + return false; + } + + /** + * This method finds a string in a string array and returns its index. + * + * @param str + * String to find + * @param strs + * Strings to compare + * @return index of matching string or -1 on failure + */ + protected int findString(String str, String[] strs) { + for (int i = 0; i < strs.length; i++) { + if (strs[i].equals(str)) { + return i; + } + } + return -1; + } // findString() + + /** + * This method groups "like-types" of characters to facilitate decoding. + * This method provides equivalent functionality to the UT_BKGP subroutine + * in the ported code. + * + * @param str + * String data to check. + * @return An array of "like type" strings. + */ + protected String[] groupLikeTypes(String str) { + char[] chars = str.toCharArray(); + ArrayList strs = new ArrayList(); + int prevGroup = NONE; + int curGroup = NONE; + String group = new String(); + for (int i = 0; i < chars.length; i++) { + if (Character.isWhitespace(chars[i])) { + curGroup = NONE; + } else if (Character.isDigit(chars[i])) { + curGroup = DIGIT; + } else if (Character.isLetter(chars[i])) { + curGroup = LETTER; + } else { // non-alphanumeric + curGroup = NONALPHANUMERIC; + } + + if (prevGroup != curGroup) { + if (prevGroup != NONE) { + strs.add(group); + group = new String(); + } + } + if (curGroup != NONE) { + group = group.concat(String.valueOf(chars[i])); + } + prevGroup = curGroup; + } + + if (group.length() > 0) { + strs.add(group); + } + + return strs.toArray(new String[0]); + } + + public static final void main(String [] args) { + //test1: latlon format + String [] latlons = { + "0000N 00000W", + "0000S 00000E", + "9000S 00000W", + "9000N 00000W", + "0000N 09000W", + "9000S 09000W", + "9000N 09000W", + + "0000N 09000W", + "4500S 09000W", + "9000N 09000W", + + "9000N 09959W", + "0000N 10000W", + + "4500S 09000W", + "9000N 09000W", + + "90N 18000E", // no match + "9000S 18000E", + "9000N 18000W", + "9000S 18000W", + "90N 179W", + "9000S 17959W", + }; for (int i=0; i * * @author jkorman @@ -129,8 +129,8 @@ public class PirepTools { TURBC_WORDS.enter("EXTRE", "EXTRM", false, TURBC_INT_EXTRM, INT_ID); TURBC_WORDS.enter("XTRM", "EXTRM", false, TURBC_INT_EXTRM, INT_ID); - TURBC_WORDS.enter("CHOP", "CHOP", false, TURBC_TYP_CAT, TYP_ID); - TURBC_WORDS.enter("CAT", "CAT", false, TURBC_TYP_CHOP, TYP_ID); + TURBC_WORDS.enter("CAT", "CAT", false, TURBC_TYP_CAT, TYP_ID); + TURBC_WORDS.enter("CHOP", "CHOP", false, TURBC_TYP_CHOP, TYP_ID); TURBC_WORDS.enter("LLWS", "LLWS", false, TURBC_TYP_LLWS, TYP_ID); TURBC_WORDS.enter("ABV", "ABV", false, MOD_ID_ABV, MOD_ID); diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/utility/edex_static/base/distribution/ncpirep.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/utility/edex_static/base/distribution/ncpirep.xml index 470c06a39d..683f9e18a6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/utility/edex_static/base/distribution/ncpirep.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpirep/utility/edex_static/base/distribution/ncpirep.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncscat/gov.noaa.nws.ncep.edex.plugin.ncscat.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncscat/gov.noaa.nws.ncep.edex.plugin.ncscat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncscat/src/gov/noaa/nws/ncep/edex/plugin/ncscat/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncscat/src/gov/noaa/nws/ncep/edex/plugin/ncscat/util/package-info.java index 62235cfcd6..df085bc36d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncscat/src/gov/noaa/nws/ncep/edex/plugin/ncscat/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncscat/src/gov/noaa/nws/ncep/edex/plugin/ncscat/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.ncscat.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.ncscat.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncscd/gov.noaa.nws.ncep.edex.plugin.ncscd.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncscd/gov.noaa.nws.ncep.edex.plugin.ncscd.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/gov.noaa.nws.ncep.edex.plugin.nctaf.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/gov.noaa.nws.ncep.edex.plugin.nctaf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/conf/attributes.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/conf/attributes.xml index 83e5be2bc4..73ad91cafb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/conf/attributes.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/conf/attributes.xml @@ -1,29 +1,29 @@ - - - ATTRIBUTE_NAMES - - - NCTAF - NCTAF - + + + ATTRIBUTE_NAMES + + + NCTAF + NCTAF + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/endpoints/nctaf-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/endpoints/nctaf-ingest.xml index 0e6f3b7e72..4367839e01 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/endpoints/nctaf-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/endpoints/nctaf-ingest.xml @@ -1,32 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -43,25 +43,25 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/scripts/tafIndices.sql b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/scripts/tafIndices.sql index b0f22dec6e..4c6eb6a73e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/scripts/tafIndices.sql +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/res/scripts/tafIndices.sql @@ -1,19 +1,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 + * 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 - * + * 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. **/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/src/gov/noaa/nws/ncep/edex/plugin/nctaf/decoder/NcTafDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/src/gov/noaa/nws/ncep/edex/plugin/nctaf/decoder/NcTafDecoder.java index 8d68d8c261..bfb2bc2fdf 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/src/gov/noaa/nws/ncep/edex/plugin/nctaf/decoder/NcTafDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctaf/src/gov/noaa/nws/ncep/edex/plugin/nctaf/decoder/NcTafDecoder.java @@ -2,29 +2,29 @@ * This software was modified from Raytheon's taf plugin by * NOAA/NWS/NCEP/NCO in order to output point data in HDF5. **/ - -package gov.noaa.nws.ncep.edex.plugin.nctaf.decoder; -import com.raytheon.edex.exception.DecoderException; -import com.raytheon.edex.plugin.AbstractDecoder; +package gov.noaa.nws.ncep.edex.plugin.nctaf.decoder; + +import com.raytheon.edex.exception.DecoderException; +import com.raytheon.edex.plugin.AbstractDecoder; import gov.noaa.nws.ncep.common.dataplugin.nctaf.NcTafRecord; -import gov.noaa.nws.ncep.common.dataplugin.nctaf.NcTafBulletinRecord; -import gov.noaa.nws.ncep.edex.plugin.nctaf.decoder.NcTafParser; -import gov.noaa.nws.ncep.edex.plugin.nctaf.decoder.NcTafParts; -import com.raytheon.uf.common.dataplugin.PluginDataObject; +import gov.noaa.nws.ncep.common.dataplugin.nctaf.NcTafBulletinRecord; +import gov.noaa.nws.ncep.edex.plugin.nctaf.decoder.NcTafParser; +import gov.noaa.nws.ncep.edex.plugin.nctaf.decoder.NcTafParts; +import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.PluginException; -import com.raytheon.uf.edex.wmo.message.WMOHeader; - -/** - * - * Decoder implementation for nctaf plugin - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date       	Ticket#		Engineer	Description
    +import com.raytheon.uf.edex.wmo.message.WMOHeader;
    +
    +/**
    + * 
    + * Decoder implementation for nctaf plugin
    + * 
    + * 
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date       	Ticket#		Engineer	Description
      * ------------	----------	-----------	--------------------------
      * 09/09/2011   458		    sgurung	    Initial Creation from Raytheon's taf plugin
      * 09/23/2011   458			sgurung	    Converted to HDF5
    @@ -33,29 +33,29 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader;
      * 
      * @author sgurung
      * @version 1.0
    - */
    -
    -public class NcTafDecoder extends AbstractDecoder {
    -    // Name of the plugin controlling this decoder.
    -    public static final String PLUGIN_NAME = "nctaf";
    -
    -    private String traceId = "";
    -
    -    /**
    -     * Constructor.
    -     * 
    -     * @param productType
    -     * @throws DecoderException
    -     */
    -    public NcTafDecoder() {
    -
    -    }
    -
    -    public static class NcTafDecoderInput {
    -        public WMOHeader wmoHeader;
    -
    -        public NcTafParts tafParts;
    -    }
    + */
    +
    +public class NcTafDecoder extends AbstractDecoder {
    +    // Name of the plugin controlling this decoder.
    +    public static final String PLUGIN_NAME = "nctaf";
    +
    +    private String traceId = "";
    +
    +    /**
    +     * Constructor.
    +     * 
    +     * @param productType
    +     * @throws DecoderException
    +     */
    +    public NcTafDecoder() {
    +
    +    }
    +
    +    public static class NcTafDecoderInput {
    +        public WMOHeader wmoHeader;
    +
    +        public NcTafParts tafParts;
    +    }
        
         /**
          * 
    @@ -99,6 +99,6 @@ public class NcTafDecoder extends AbstractDecoder {
         	}
     		
     		return pdos; 
    -	}    
    -   
    -}
    +	}    
    +   
    +}
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/gov.noaa.nws.ncep.edex.plugin.nctext.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/gov.noaa.nws.ncep.edex.plugin.nctext.ecl
    new file mode 100644
    index 0000000000..e69de29bb2
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextFileNameGenerator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextFileNameGenerator.java
    index c411b5bcfd..bd4975e2c8 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextFileNameGenerator.java
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextFileNameGenerator.java
    @@ -84,7 +84,7 @@ public class NctextFileNameGenerator {
     	 */
     	public synchronized PluginDataObject[] renameAndDecodeFile(File fileToRename) throws IOException{
     		//logger.debug("renameAndDecodeFile() called...");
    -		System.out.println("renameAndDecodeFile() invoked");
    +		//System.out.println("renameAndDecodeFile() invoked");
     		PluginDataObject[] srcArray = new PluginDataObject[0];
     		List dynamicDestArray = new ArrayList(0);
     		this.formattedFileNameList = new ArrayList(0); 		
    @@ -94,9 +94,9 @@ public class NctextFileNameGenerator {
     		String[] linesOfFileHeader = fileHeader.split(System.getProperty("line.separator"));
     		if(linesOfFileHeader != null && linesOfFileHeader.length > 1){
     			//			System.out.println("Date of file creation: "+ this.fileCreatedCalendar.getTime().toString());
    -			for(int k =0; k < linesOfFileHeader.length; k++){
    -				System.out.println("Line "+ k + " ="+ linesOfFileHeader[k]);
    -			}
    +			//for(int k =0; k < linesOfFileHeader.length; k++){
    +			//	System.out.println("Line "+ k + " ="+ linesOfFileHeader[k]);
    +			//}
     			
     			int i=0;
     			 while( i < linesOfFileHeader.length - 1){
    @@ -121,9 +121,9 @@ public class NctextFileNameGenerator {
     		if (this.formattedFileNameList.size() > 0) {
     			//			System.out.println("The final list of formatted file names: "+ this.formattedFileNameList);
     			boolean isFileRenamedInPostProcess = false;
    -			for(int p =0; p < formattedFileNameList.size(); p++){
    -				System.out.println("File name "+p+ " ="+formattedFileNameList.get(p));
    -			}
    +			//for(int p =0; p < formattedFileNameList.size(); p++){
    +			//	System.out.println("File name "+p+ " ="+formattedFileNameList.get(p));
    +			//}
     			int index = 0;
     			int listSize = this.formattedFileNameList.size();
     			while(index <  listSize && !isFileRenamedInPostProcess){
    @@ -143,21 +143,21 @@ public class NctextFileNameGenerator {
     					isFileRenamedInPostProcess = true;
     				}
     
    -				System.out.println("New name for file: "+ outFilePath);
    +				//System.out.println("New name for file: "+ outFilePath);
     				srcArray = decodeFile(fileToRename, outFilePath);
     				pdoList =   new ArrayList(Arrays.asList(srcArray));
     				dynamicDestArray.addAll(pdoList);
     				index++;
     			}
     		}else{
    -			 System.out.println("No match found with any regular expression- file= "+ fileToRename.getName());
    -			 //Chin:TESTING 
    -			 //srcArray = decodeFile(fileToRename, fileToRename.getName()); 
    +			//System.out.println("No match found with any regular expression- file= "+ fileToRename.getName());
    +			//Chin:TESTING 
    +			//srcArray = decodeFile(fileToRename, fileToRename.getName()); 
     			// pdoList =   new ArrayList(Arrays.asList(srcArray));
    -    		 //dynamicDestArray.addAll(pdoList);
    +			//dynamicDestArray.addAll(pdoList);
     		}
     		
    -		System.out.println("The final array length : " + dynamicDestArray.size());
    +		//System.out.println("The final array length : " + dynamicDestArray.size());
     		PluginDataObject[] returnArray = new PluginDataObject[0];
     		
     		return dynamicDestArray.toArray(returnArray);
    @@ -282,6 +282,8 @@ public class NctextFileNameGenerator {
     	  				this.formattedFileNameList.add( DATE_WITH_HOUR.format(tempCal.getTime()) + "." + fileExtension);
     	  			}
     	  		}
    +	  		//else
    +	  		//	System.out.println("product size =0");
     		}
     		
     		return (this.formattedFileNameList.size() > 0 ? true: false );
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextRegexMatcher.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextRegexMatcher.java
    index 675f123bfe..77d57c5942 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextRegexMatcher.java
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/src/gov/noaa/nws/ncep/edex/plugin/nctext/decoder/NctextRegexMatcher.java
    @@ -85,27 +85,37 @@ public final class NctextRegexMatcher {
     //					System.out.println("Current line in file is: " + fileContent);
     					//retrieve the matching product type for the regular expression
     					String prodType =  new String(NCTEXT_PRODUCT_REGEX_MAP.get(thisPattern));
    +					//System.out.println("Product type is " + prodType);
    +					//System.out.println("Matching pattern is: " + thisPattern.pattern());
     					//If the product type is not already in the list...
     					if(!isNctextProductAlreadyInList(prodType)){
     					  //add it to the list	
     					  strNctextProductType.add(prodType);
    -						System.out.println("Product type is " + prodType);
    -						System.out.println("Matching pattern is: " + thisPattern.pattern());
    +						
     					}
    -					
    +					//System.out.println("matchFileRegex group count =" + thisMatcher.groupCount() );
    +					//for(int i=0; i< thisMatcher.groupCount();i++){
    +					//	System.out.println("matchFileRegex group " + i+ "= "+thisMatcher.group(i));
    +					//}
     					if(thisMatcher.groupCount() > 1){
     					//get the data captured from the groups of the matcher
     						String dateFromMatchedPattern = new String(thisMatcher.group(1)); 
     						String hourFromMatchedPattern = new String(thisMatcher.group(2));
     						String minuteFromMatchedPattern = new String(thisMatcher.group(3));
    -						parsedDate = new Integer(Integer.parseInt(dateFromMatchedPattern));
    -						parsedHour =  new Integer(Integer.parseInt(hourFromMatchedPattern)); 	
    -						parsedMinute = new Integer(Integer.parseInt(minuteFromMatchedPattern));
    +						try{
    +							parsedDate = new Integer(Integer.parseInt(dateFromMatchedPattern));
    +							parsedHour =  new Integer(Integer.parseInt(hourFromMatchedPattern)); 	
    +							parsedMinute = new Integer(Integer.parseInt(minuteFromMatchedPattern));
    +						} catch (NumberFormatException e){
    +							System.out.println("matchFileRegex(): NumberFormatException event: for product type "+prodType);
    +							continue;
    +						}
     					}
     					isMatchFound =  true;
     				}
     				thisMatcher.reset();
     			}
    +			//System.out.println("matchFileRegex returning "+ isMatchFound);
     			return isMatchFound;
     	}
     	/***
    @@ -149,7 +159,12 @@ public final class NctextRegexMatcher {
     		thisMap.put(Pattern.compile("^FXUS[67][1-6] .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area");
     		thisMap.put(Pattern.compile("^FPAK20 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area");//no data to test
     		thisMap.put(Pattern.compile("^FPHW03 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area");//no data to test
    -		thisMap.put(Pattern.compile("^FX(HW|PN|PS)60 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area"); 
    +		//thisMap.put(Pattern.compile("^FX(HW|PN|PS)60 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area"); 
    +		//split above pattern to the following 3 patterns so matchFileRegex() can be coded in a generic way.
    +		thisMap.put(Pattern.compile("^FXHW60 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area"); 
    +		thisMap.put(Pattern.compile("^FXPN60 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area"); 
    +		thisMap.put(Pattern.compile("^FXPS60 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "area"); 
    +		
     		thisMap.put(Pattern.compile("^...... .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).*(\n|\r)FA[0-9].*"), "area");	//aviation forecasts
     		thisMap.put(Pattern.compile("^WWUS30 KWNS (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"),"wtch2");
     		thisMap.put(Pattern.compile("^FNUS21 KWNS (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"),"fwddy1");
    @@ -190,7 +205,7 @@ public final class NctextRegexMatcher {
     		thisMap.put(Pattern.compile("^FAAK2[1-6] KZAN (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "cwa");	
     		thisMap.put(Pattern.compile("^FAUS2[1-6] KZ.. (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "cwa");
     		thisMap.put(Pattern.compile("^WCUS2[1-6] KZ.. (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "cwa");			
    -		thisMap.put(Pattern.compile("^FAUS20 (KZ..|PANC) (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "mis");	
    +		thisMap.put(Pattern.compile("^FAUS20 PANC (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "mis");
     		thisMap.put(Pattern.compile("^FOUS14 KWNO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "ngmmos");	
     		thisMap.put(Pattern.compile("^FOAK2[5-9] KWNO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "ngmmos");	
     		thisMap.put(Pattern.compile("^FOPA20 KWNO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "gfsmos");	
    @@ -310,7 +325,23 @@ public final class NctextRegexMatcher {
     		thisMap.put(Pattern.compile("^SXUS86 .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "cgr");//regexes clash for cgr and OMR
     		thisMap.put(Pattern.compile("^WV.... .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "vlcw");             //might clash with regex for inl and sgmt
     		thisMap.put(Pattern.compile("^W[CSV].... [^KP]... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    -		thisMap.put(Pattern.compile("^W[CSV](NT|PN|PA|AK)[01][0-9] (KKCI|PHFO|PAWU)  (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		//thisMap.put(Pattern.compile("^W[CSV](NT|PN|PA|AK)[01][0-9] (KKCI|PHFO|PAWU) (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		//split above pattern to the following 12 patterns so matchFileRegex() can be coded in a generic way.
    +		thisMap.put(Pattern.compile("^W[CSV](NT|PN|PA|AK)[01][0-9] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]NT[01][0-9] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]NT[01][0-9] PHFO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]NT[01][0-9] PAWU (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]PN[01][0-9] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]PN[01][0-9] PHFO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]PN[01][0-9] PAWU (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]PA[01][0-9] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]PA[01][0-9] PHFO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]PA[01][0-9] PAWU (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]AK[01][0-9] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]AK[01][0-9] PHFO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		thisMap.put(Pattern.compile("^W[CSV]AK[01][0-9] PAWU (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "intl"); //regexes clash for intl and sgmt	
    +		
    +		
     		thisMap.put(Pattern.compile("^WSUS4[012] .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "conv");
     		thisMap.put(Pattern.compile("^W[CSV]US0[1-6] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "sgmt");	
     		thisMap.put(Pattern.compile("^WSUK.. .... (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])(.|\r|\n)+"), "sgmt");	
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml
    index 38b37da8cd..093691eb6b 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml
    @@ -40,9 +40,9 @@
     	^WWJP25 RJTD (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+
     	^WCPA3[1-5] PHFO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 
     	^WSUS3[1-3] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 
    -	^W[CSV][NT|PN|PA|AK][01][0-9] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 
    -	^W[CSV][NT|PN|PA|AK][01][0-9] PHFO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 	
    -	^W[CSV][NT|PN|PA|AK][01][0-9] PAWU (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+	
    +	^W[CSV](NT|PN|PA|AK)[01][0-9] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 
    +	^W[CSV](NT|PN|PA|AK)[01][0-9] PHFO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 	
    +	^W[CSV](NT|PN|PA|AK)[01][0-9] PAWU (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+	
     	^W[CSV]US0[1-6] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).* 
     	^WAUS4[1-6] KKCI (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 
     	^WAAK4[7-9] PAWU (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ 
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject
    new file mode 100644
    index 0000000000..d574213dc8
    --- /dev/null
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject
    @@ -0,0 +1 @@
    +gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairRecord
    \ No newline at end of file
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/gov.noaa.nws.ncep.edex.plugin.ncuair.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/gov.noaa.nws.ncep.edex.plugin.ncuair.ecl
    new file mode 100644
    index 0000000000..e69de29bb2
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/component-deploy.xml
    old mode 100755
    new mode 100644
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.ecl
    new file mode 100644
    index 0000000000..e69de29bb2
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/component-deploy.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/component-deploy.xml
    index a71fed23b4..db8e9b5fbb 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/component-deploy.xml
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/component-deploy.xml
    @@ -1,7 +1,7 @@
    -
    -	
    -	
    -
    -	
    -
    +
    +	
    +	
    +
    +	
    +
     
    \ No newline at end of file
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml
    index d5927f1699..b47ebc7901 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml
    @@ -1,26 +1,26 @@
    -
    -
    -    
    -        
    -    
    -
    -    
    -        
    -		
    -        
    -        
    -    
    -
    -    
    -        
    -        
    -    
    -    
    +
    +
    +    
    +        
    +    
    +
    +    
    +        
    +		
    +        
    +        
    +    
    +
    +    
    +        
    +        
    +    
    +    
     
    \ No newline at end of file
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml
    index f6ac80cb6a..e9b2d3798a 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml
    @@ -1,73 +1,73 @@
    -
    -       
    -    
    -        
    -    
    -    
    -    
    -
    -    
    -		
    -		
    -	
    -
    -    
    -		
    -  	 
    -    
    -    
    -        
    -        
    -        
    -        
    -            
    -            
    -                nonconvsigmet
    -            
    -            
    -                
    -		            
    -    		        
    -        		        
    -           		    	
    -                	       	
    -                    	   		
    -                       			
    -	                   		
    -    	               	 	
    -        	               		java.lang.Throwable
    -            	           		
    -                	   		
    -               			
    -	            	
    -           		
    -           	 	
    -               		java.lang.Throwable
    -              		
    -           		
    -       		
    -        
    -	
    +
    +       
    +    
    +        
    +    
    +    
    +    
    +
    +    
    +		
    +		
    +	
    +
    +    
    +		
    +  	 
    +    
    +    
    +        
    +        
    +        
    +        
    +            
    +            
    +                nonconvsigmet
    +            
    +            
    +                
    +		            
    +    		        
    +        		        
    +           		    	
    +                	       	
    +                    	   		
    +                       			
    +	                   		
    +    	               	 	
    +        	               		java.lang.Throwable
    +            	           		
    +                	   		
    +               			
    +	            	
    +           		
    +           	 	
    +               		java.lang.Throwable
    +              		
    +           		
    +       		
    +        
    +	
     
    \ No newline at end of file
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java
    index d19198d409..3003ac8bca 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java
    @@ -1,108 +1,108 @@
    -/**
    - * 
    - * Non-Convective Sigmet Decoder
    - * 
    - * This java class decodes NONCONVSIGMET (non-convective sigmet) raw data. 
    - * HISTORY
    - *
    - * Date     	Author		Description
    - * ------------	----------	-----------	--------------------------
    - * 06/2009		Uma Josyula		Initial creation	
    - * 
    - * This code has been developed by the SIB for use in the AWIPS2 system.
    - */
    -
    -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder;
    -
    -import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord;
    -import gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util.NonConvSigmetParser;
    -import gov.noaa.nws.ncep.edex.util.UtilN;
    -
    -import java.util.Scanner;
    -
    -import com.raytheon.edex.esb.Headers;
    -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.edex.decodertools.core.IDecoderConstants;
    -
    -public class NonConvSigmetDecoder extends AbstractDecoder {
    -
    -    private final String pluginName;
    -
    -    /**
    -     * Constructor
    -     * 
    -     * @throws DecoderException
    -     */
    -    public NonConvSigmetDecoder(String name) throws DecoderException {
    -        pluginName = name;
    -    }
    -
    -    public PluginDataObject[] decode(byte[] data, Headers headers)
    -            throws DecoderException {
    -
    -        String traceId = "";
    -        if (headers != null) {
    -            traceId = (String) headers.get("traceId");
    -        }
    -
    -        String etx = IDecoderConstants.ETX;
    -        String theBulletin = null;
    -        byte[] messageData = null;
    -        NonConvSigmetRecord currentRecord = null;
    -        NonConvSigmetSeparator sep = NonConvSigmetSeparator.separate(data,
    -                headers);
    -        messageData = sep.next();
    -        String theMessage = new String(messageData);
    -
    -        /*
    -         * May have multiple duplicate bulletins, only get the first bulletin
    -         * and eliminate the remaining bulletins after the first bulletin.
    -         */
    -        Scanner cc = new Scanner(theMessage).useDelimiter(etx);
    -        if (cc.hasNext()) {
    -            theBulletin = cc.next();
    -        } else {
    -            theBulletin = theMessage;
    -        }
    -        /*
    -         * Decode by calling the NonconvSigmetParser method processRecord
    -         */
    -        currentRecord = NonConvSigmetParser.processRecord(theBulletin, headers);
    -        if (currentRecord != null) {
    -            currentRecord.setReportType(pluginName);
    -            /*
    -             * Replace special characters to a blank so that it may be readable
    -             */
    -            currentRecord.setBullMessage(UtilN
    -                    .removeLeadingWhiteSpaces((theBulletin.substring(5))
    -                            .replace('\036', ' ').replace('\r', ' ')
    -                            .replace('\003', ' ').replace('\000', ' ')
    -                            .replace('\001', ' ')));
    -            /*
    -             * Check the NonConvsigmet record object. If not, throws exception.
    -             */
    -            currentRecord.setTraceId(traceId);
    -            currentRecord.setPluginName(pluginName);
    -            try {
    -                currentRecord.constructDataURI();
    -
    -            } catch (PluginException e) {
    -                logger.error(traceId + "- Unable to construct dataURI", e);
    -                currentRecord = null;
    -            }
    -        }
    -        /*
    -         * Return the NonConvsigmetRecord record object.
    -         */
    -        if (currentRecord == null) {
    -            return new PluginDataObject[0];
    -        } else {
    -            return new PluginDataObject[] { currentRecord };
    -        }
    -
    -    }
    -
    +/**
    + * 
    + * Non-Convective Sigmet Decoder
    + * 
    + * This java class decodes NONCONVSIGMET (non-convective sigmet) raw data. 
    + * HISTORY
    + *
    + * Date     	Author		Description
    + * ------------	----------	-----------	--------------------------
    + * 06/2009		Uma Josyula		Initial creation	
    + * 
    + * This code has been developed by the SIB for use in the AWIPS2 system.
    + */
    +
    +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder;
    +
    +import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord;
    +import gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util.NonConvSigmetParser;
    +import gov.noaa.nws.ncep.edex.util.UtilN;
    +
    +import java.util.Scanner;
    +
    +import com.raytheon.edex.esb.Headers;
    +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.edex.decodertools.core.IDecoderConstants;
    +
    +public class NonConvSigmetDecoder extends AbstractDecoder {
    +
    +    private final String pluginName;
    +
    +    /**
    +     * Constructor
    +     * 
    +     * @throws DecoderException
    +     */
    +    public NonConvSigmetDecoder(String name) throws DecoderException {
    +        pluginName = name;
    +    }
    +
    +    public PluginDataObject[] decode(byte[] data, Headers headers)
    +            throws DecoderException {
    +
    +        String traceId = "";
    +        if (headers != null) {
    +            traceId = (String) headers.get("traceId");
    +        }
    +
    +        String etx = IDecoderConstants.ETX;
    +        String theBulletin = null;
    +        byte[] messageData = null;
    +        NonConvSigmetRecord currentRecord = null;
    +        NonConvSigmetSeparator sep = NonConvSigmetSeparator.separate(data,
    +                headers);
    +        messageData = sep.next();
    +        String theMessage = new String(messageData);
    +
    +        /*
    +         * May have multiple duplicate bulletins, only get the first bulletin
    +         * and eliminate the remaining bulletins after the first bulletin.
    +         */
    +        Scanner cc = new Scanner(theMessage).useDelimiter(etx);
    +        if (cc.hasNext()) {
    +            theBulletin = cc.next();
    +        } else {
    +            theBulletin = theMessage;
    +        }
    +        /*
    +         * Decode by calling the NonconvSigmetParser method processRecord
    +         */
    +        currentRecord = NonConvSigmetParser.processRecord(theBulletin, headers);
    +        if (currentRecord != null) {
    +            currentRecord.setReportType(pluginName);
    +            /*
    +             * Replace special characters to a blank so that it may be readable
    +             */
    +            currentRecord.setBullMessage(UtilN
    +                    .removeLeadingWhiteSpaces((theBulletin.substring(5))
    +                            .replace('\036', ' ').replace('\r', ' ')
    +                            .replace('\003', ' ').replace('\000', ' ')
    +                            .replace('\001', ' ')));
    +            /*
    +             * Check the NonConvsigmet record object. If not, throws exception.
    +             */
    +            currentRecord.setTraceId(traceId);
    +            currentRecord.setPluginName(pluginName);
    +            try {
    +                currentRecord.constructDataURI();
    +
    +            } catch (PluginException e) {
    +                logger.error(traceId + "- Unable to construct dataURI", e);
    +                currentRecord = null;
    +            }
    +        }
    +        /*
    +         * Return the NonConvsigmetRecord record object.
    +         */
    +        if (currentRecord == null) {
    +            return new PluginDataObject[0];
    +        } else {
    +            return new PluginDataObject[] { currentRecord };
    +        }
    +
    +    }
    +
     }
    \ No newline at end of file
    diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java
    index 83f579ee48..f97498b404 100644
    --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java
    +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java
    @@ -1,147 +1,147 @@
    -/**
    - * NonConvsigmetSeparator
    - *
    - * This class sets the raw data to an Arraylist, records, of
    - * String based on a uniquely identified separator.
    - *
    - * 
    - * Uma Josyula                               06/2009         Creation
    - * 
    - * - * This code has been developed by the SIB for use in the AWIPS system. - */ - -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.edex.util.Util; - -public class NonConvSigmetSeparator extends AbstractRecordSeparator { - private final Log logger = LogFactory.getLog(getClass()); - - /** Regex used for separate the bulletins */ - private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; - - /** Regex matcher */ - private Matcher matcher; - - /** Pattern object for regex search */ - private Pattern pattern; - - /** List of records contained in file */ - private List records; - - private Iterator iterator = null; - - /** - * Constructor. - * - */ - public NonConvSigmetSeparator() { - records = new ArrayList(); - } - - public static NonConvSigmetSeparator separate(byte[] data, Headers headers) { - NonConvSigmetSeparator ds = new NonConvSigmetSeparator(); - ds.setData(data, headers); - return ds; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.AbstractRecordSeparator#setData(byte[], - * com.raytheon.edex.esb.Headers) - */ - public void setData(byte[] data, Headers headers) { - doSeparate(new String(data)); - iterator = records.iterator(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() - */ - public boolean hasNext() { - if (iterator == null) { - return false; - } else { - return iterator.hasNext(); - } - } - - /** - * Get record - */ - public byte[] next() { - try { - String temp = iterator.next(); - if (Util.isEmptyString(temp)) { - return (byte[]) null; - } else { - return temp.getBytes(); - } - } catch (NoSuchElementException e) { - return (byte[]) null; - } - } - - /** - * @param message - * separate bulletins - */ - private void doSeparate(String message) { - /* Regex used for separate the bulletins */ - - try { - pattern = Pattern.compile(BULLSEPARATOR); - matcher = pattern.matcher(message); - - /* - * Set number of bulletins to records only if the bulletin separator - * is not the same. At the point, only separators are stored in - * "records" - */ - while (matcher.find()) { - if (!records.contains(matcher.group())) { - records.add(matcher.group()); - } - } - - /* - * Append the raw data file to the records. - */ - for (int i = 0; i < records.size(); i++) { - if (i < records.size() - 1) { - records.set( - i, - "\n" - + message.substring( - message.indexOf(records.get(i)), - message.indexOf(records.get(i + 1)))); - } else { - records.set( - i, - "\n" - + message.substring(message.indexOf(records - .get(i)))); - } - } - } catch (Exception e) { - logger.warn("No valid records found!", e); - } - return; - } +/** + * NonConvsigmetSeparator + * + * This class sets the raw data to an Arraylist, records, of + * String based on a uniquely identified separator. + * + *
    + * Uma Josyula                               06/2009         Creation
    + * 
    + * + * This code has been developed by the SIB for use in the AWIPS system. + */ + +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.edex.util.Util; + +public class NonConvSigmetSeparator extends AbstractRecordSeparator { + private final Log logger = LogFactory.getLog(getClass()); + + /** Regex used for separate the bulletins */ + private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; + + /** Regex matcher */ + private Matcher matcher; + + /** Pattern object for regex search */ + private Pattern pattern; + + /** List of records contained in file */ + private List records; + + private Iterator iterator = null; + + /** + * Constructor. + * + */ + public NonConvSigmetSeparator() { + records = new ArrayList(); + } + + public static NonConvSigmetSeparator separate(byte[] data, Headers headers) { + NonConvSigmetSeparator ds = new NonConvSigmetSeparator(); + ds.setData(data, headers); + return ds; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.AbstractRecordSeparator#setData(byte[], + * com.raytheon.edex.esb.Headers) + */ + public void setData(byte[] data, Headers headers) { + doSeparate(new String(data)); + iterator = records.iterator(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() + */ + public boolean hasNext() { + if (iterator == null) { + return false; + } else { + return iterator.hasNext(); + } + } + + /** + * Get record + */ + public byte[] next() { + try { + String temp = iterator.next(); + if (Util.isEmptyString(temp)) { + return (byte[]) null; + } else { + return temp.getBytes(); + } + } catch (NoSuchElementException e) { + return (byte[]) null; + } + } + + /** + * @param message + * separate bulletins + */ + private void doSeparate(String message) { + /* Regex used for separate the bulletins */ + + try { + pattern = Pattern.compile(BULLSEPARATOR); + matcher = pattern.matcher(message); + + /* + * Set number of bulletins to records only if the bulletin separator + * is not the same. At the point, only separators are stored in + * "records" + */ + while (matcher.find()) { + if (!records.contains(matcher.group())) { + records.add(matcher.group()); + } + } + + /* + * Append the raw data file to the records. + */ + for (int i = 0; i < records.size(); i++) { + if (i < records.size() - 1) { + records.set( + i, + "\n" + + message.substring( + message.indexOf(records.get(i)), + message.indexOf(records.get(i + 1)))); + } else { + records.set( + i, + "\n" + + message.substring(message.indexOf(records + .get(i)))); + } + } + } catch (Exception e) { + logger.warn("No valid records found!", e); + } + return; + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java index 5913d39c3b..505c4ab822 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains decoder.java for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder;; +/** +* Contains decoder.java for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder;; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java index 5b4b74731e..bff1495944 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java @@ -1,409 +1,409 @@ -/* - * NonConvsigmet DecoderUtil - * - * This java class intends to serve as a decoder utility for NonConvsigmet. - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 Uma Josyula Initial creation - * 07/2011 F. J. Yen Fix for RTN TTR 9973--ConvSigment Decoder Ignoring - * time range (NonConvsigmet, too). Set the rangeEnd - * time to the endTime - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; - -import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetLocation; -import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord; -import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.common.time.TimeRange; -import com.raytheon.uf.edex.decodertools.core.LatLonPoint; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class NonConvSigmetParser { - - /** - * Constructor - */ - public NonConvSigmetParser() { - } - - /** - * Parse the WMO line and store WMO header, OfficeID, issue time, - * designatorBBB,... - * - * @param wmoline - * The bulletin message - * - * @return a NonConvsigmetRecord - */ - public static NonConvSigmetRecord processWMO(String wmoline, Headers headers) { - - NonConvSigmetRecord currentRecord = null; - // Regular expression for WMO/ICAO, station ID, and issue date (and - // maybe designator BBB) - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; - - // Pattern used for extracting WMO header,issue office and issue date - // and designatorBBB - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(wmoline); - - if (theMatcher.find()) { - currentRecord = new NonConvSigmetRecord(); - - currentRecord.setWmoHeader(theMatcher.group(1)); - currentRecord.setIssueOffice(theMatcher.group(2)); - currentRecord.setDesignatorBBB(theMatcher.group(5)); - - // Decode the issue time. - Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), - headers); - currentRecord.setIssueTime(issueTime); - - /* 999999999999999999999999999999 - DataTime dataTime = new DataTime(issueTime); - currentRecord.setDataTime(dataTime); - 999 */ - } - return currentRecord; - } - - /** - * Obtains start time and end time and forecast Region from input report - * - * @param theBullMsg - * The bulletin message which contains start time and end time. - * - * @param NonConvSigmetRecord - * - * @return a NonConvsigmetRecord - */ - - public static NonConvSigmetRecord processStartEndTime(String theBullMsg, - NonConvSigmetRecord nconvRecord, Headers headers) { - final String STARTTIME_EXP = "([A-Z]{4}) WS ([0-9]{6})( [A-Z]{3})?"; - final String ENDTIME_EXP = "VALID UNTIL ([0-9]{6})"; - - final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); - final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); - - Calendar stTime = null; - Calendar endTime = null; - /* - * Default equal to one hour if there is no valid time in report - */ - - NonConvSigmetRecord currentRecord = nconvRecord; - - // Calculate the startTime - Matcher theMatcher = starttimePattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setForecastRegion(theMatcher.group(1)); - stTime = TimeTools.findDataTime(theMatcher.group(2), headers); - } - if (stTime == null) { - currentRecord.setStartTime(currentRecord.getIssueTime()); - } else { - currentRecord.setStartTime(stTime); - } - - // Calculate the endTime - theMatcher = endtimePattern.matcher(theBullMsg); - - if (theMatcher.find()) { - endTime = TimeTools.findDataTime(theMatcher.group(1), headers); - } - if (endTime == null) { - endTime = currentRecord.getIssueTime(); - currentRecord.setEndTime(endTime); - } else { - currentRecord.setEndTime(endTime); - } - - /* 9999999999999999999999999999999 */ - DataTime dataTime = new DataTime(stTime, new TimeRange (stTime.getTime(), - endTime.getTimeInMillis() - stTime.getTimeInMillis()) ); - currentRecord.setDataTime(dataTime); - /* 999 */ - return currentRecord; - } - - /** - * Obtains SigmetId from input report - * - * @param theBullMsg - * The bulletin message. - * - * @param NonConvSigmetRecord - * - * @return a NonConvsigmetRecord - */ - public static NonConvSigmetRecord processSigmetId(String theBullMsg, - NonConvSigmetRecord nconvRecord) { - final String SIGMETID_EXP = "SIGMET ([A-Z]{2,} [0-9]{1})"; - final Pattern sigPattern = Pattern.compile(SIGMETID_EXP); - NonConvSigmetRecord currentRecord = nconvRecord; - // Parse sigmetId - Matcher theMatcher = sigPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setSigmetId(theMatcher.group(1)); - } - - return currentRecord; - } - - /** - * Parse the phenomena... Hazard Type,Hazard Intensity,Hazard Cause,Hazard - * Condition,FlightLevel1,FlightLevel2,SigmetId,AWIPSId,CorAmdTest,StateList - * - * @param theBullMsg - * from bulletin message - * - * @param a - * NonConvsigmetRecord - * - * @return a NonConvsigmetRecord - */ - public static NonConvSigmetRecord processPhenomena(String theBullMsg, - NonConvSigmetRecord nconvRecord) { - - final String FL_EXP1 = "BTN (FL)?([0-9]{3}) AND (FL)?([0-9]{3})"; - - final String FL_EXP2 = "BLW (FL)?([0-9]{3})"; - - final String HAZARDTYPE_EXP = " (TURB|ICGICIP|ICE) "; - - final String HAZARDINTS_EXP = "(OCNL [A-Z0-9]{2,})(BLW (FL)?([0-9]{3}).|BTN|TURB|ICGICIP|ICE|ICGIC|VA|DU)?"; - - final String HAZARDCAUS_EXP = "OCNL ([\\w| ])*(.|DUE TO)?([\\w| ]*). CONDS"; - - final String HAZARDCOND_EXP = "(CONDS [\\w| ]*)(\\x0d\\x0d\\x0a)?([\\w| ]*)([0-9]{4})Z"; - - final String STATELIST_EXP = "(([A-Z]{2})( [A-Z]{2})*)\\x0d\\x0d\\x0a"; - - final String AWIPSID_EXP = "([A-Z]{2}[0-9]{1}[A-Z]{1})( )*\\x0d\\x0d\\x0a"; - - final String CORREMARK_EXP = "(COR|AMD|TEST)"; - - final Pattern flPattern1 = Pattern.compile(FL_EXP1); - - final Pattern flPattern2 = Pattern.compile(FL_EXP2); - - final Pattern hzTypePattern = Pattern.compile(HAZARDTYPE_EXP); - - final Pattern hzIntsPattern = Pattern.compile(HAZARDINTS_EXP); - - final Pattern hzCausPattern = Pattern.compile(HAZARDCAUS_EXP); - - final Pattern hzCondPattern = Pattern.compile(HAZARDCOND_EXP); - - final Pattern stPattern = Pattern.compile(STATELIST_EXP); - - final Pattern awipsPattern = Pattern.compile(AWIPSID_EXP); - - final Pattern corRemarkPattern = Pattern.compile(CORREMARK_EXP); - - NonConvSigmetRecord currentRecord = nconvRecord; - - Matcher theMatcher = flPattern1.matcher(theBullMsg); - - if (theMatcher.find()) { - currentRecord - .setFlightLevel2(Integer.parseInt(theMatcher.group(4))); - currentRecord - .setFlightLevel1(Integer.parseInt(theMatcher.group(2))); - } else { - theMatcher = flPattern2.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setFlightLevel1(Integer.parseInt(theMatcher - .group(2))); - } - } - theMatcher = hzCausPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setHazardCause(theMatcher.group(3)); - } - theMatcher = hzCondPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setHazardCondition(theMatcher.group(0)); - } - theMatcher = hzIntsPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setHazardIntensity(theMatcher.group(1)); - } - theMatcher = hzTypePattern.matcher(theBullMsg); - if (theMatcher.find()) { - if ("TURB".equals(theMatcher.group(1))) { - currentRecord.setHazardType("TURBULENCE"); - } else { - currentRecord.setHazardType(theMatcher.group(1)); - } - } - theMatcher = stPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setStateList(theMatcher.group(1)); - } - theMatcher = awipsPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setAwipsId(theMatcher.group(1)); - } - theMatcher = corRemarkPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setCorrectionRemarks(theMatcher.group(0)); - } - - return currentRecord; - - } - - /** - * Parse the location lines... Add location table to the section table if - * any - * - * @param theBullMsg - * from bulletin message - * - * @param recordTable - * The record Table - * - * @return true if finds a location line - */ - public static Boolean processLocation(String theBullMsg, - NonConvSigmetRecord recordTable) { - - Boolean hasLocationLine = true; - String locationDelimiter = "-| TO "; - ArrayList terminationList = new ArrayList(); - terminationList.addAll(Arrays.asList(new String[] { "OCNL", "SEV" })); - Scanner sclocations = new Scanner(theBullMsg).useDelimiter("FROM"); - - /* - * throws away the first section which is not the "FROM" location - */ - LatLonPoint point; - String locationRecord = sclocations.next(); - - if (sclocations.hasNext()) { - locationRecord = sclocations.next(); - - Scanner scLocationLine = new Scanner(locationRecord) - .useDelimiter("\\x0d\\x0d\\x0a"); - String lines = " "; - String curLine = null; - ArrayList locationList = new ArrayList(); - locationList.clear(); - Boolean notBreak = true; - - while (scLocationLine.hasNext() && notBreak) { - curLine = scLocationLine.next();// Get next location line - Scanner scLocationToken = new Scanner(curLine); - if (scLocationToken.hasNext()) { - // Check the first token from each line - String firstToken = scLocationToken.next(); - if (terminationList.contains(firstToken)) { - notBreak = false;// terminate - break; - } - } - lines = lines.concat(" ").concat(curLine); - } - - // Clean up the leading space - lines = UtilN.removeLeadingWhiteSpaces(lines); - // Parse the location lines by a "-" or "TO" - Scanner scLocation = new Scanner(lines) - .useDelimiter(locationDelimiter); - locationList.clear(); - // Get all locations - while (scLocation.hasNext()) { - locationList.add(scLocation.next()); - } - - // set locations to data base - if (locationList.size() > 1) { - Integer idxLocation = 0; - for (String location : locationList) { - NonConvSigmetLocation currentLocation = new NonConvSigmetLocation(); - currentLocation.setLocationLine(lines); - currentLocation.setLocation(location); - point = LatLonLocTbl.getLatLonPoint(location, "vors"); - currentLocation.setIndex(idxLocation + 1); - idxLocation++; - currentLocation.setLatitude(point - .getLatitude(LatLonPoint.INDEGREES)); - currentLocation.setLongitude(point - .getLongitude(LatLonPoint.INDEGREES)); - recordTable.addNonConvSigmetLocation(currentLocation); - } - } else { - hasLocationLine = false; - } - - } else { - hasLocationLine = false; - } - - return hasLocationLine; - } - - /** - * process regular section of a non-convective sigmet report - * - * @return a NonConvsigmetRecord table - */ - public static NonConvSigmetRecord processRecord(String theBullMsg, - Headers headers) { - final String CANCELSIGMET_EXP = "(CANCEL SIGMET|TEST)"; - final Pattern cancelSigPattern = Pattern.compile(CANCELSIGMET_EXP); - Matcher theMatcher = cancelSigPattern.matcher(theBullMsg); - // Decode the WMO Header - NonConvSigmetRecord currentRecord = NonConvSigmetParser.processWMO( - theBullMsg, headers); - // Decode the sigmetId - currentRecord = NonConvSigmetParser.processSigmetId(theBullMsg, - currentRecord); - // Decode the Start Time,End Time,ForecastRegion - currentRecord = NonConvSigmetParser.processStartEndTime(theBullMsg, - currentRecord, headers); - // Decode the phenomena description - currentRecord = NonConvSigmetParser.processPhenomena(theBullMsg, - currentRecord); - // Replace the special characters - currentRecord - .setBullMessage(theBullMsg.replace('\r', ' ') - .replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - - if (theMatcher.find()) { - if ("UNKNOWN".equals(currentRecord.getHazardType())) { - if ("TEST".equals(theMatcher.group(0))) { - currentRecord.setHazardType("TEST"); - } else { - currentRecord.setHazardType("CANCEL"); - } - } - } else { - // Decode the locations - NonConvSigmetParser.processLocation(theBullMsg, currentRecord); - } - return currentRecord; - } - +/* + * NonConvsigmet DecoderUtil + * + * This java class intends to serve as a decoder utility for NonConvsigmet. + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 Uma Josyula Initial creation + * 07/2011 F. J. Yen Fix for RTN TTR 9973--ConvSigment Decoder Ignoring + * time range (NonConvsigmet, too). Set the rangeEnd + * time to the endTime + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; + +import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetLocation; +import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord; +import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.common.time.TimeRange; +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class NonConvSigmetParser { + + /** + * Constructor + */ + public NonConvSigmetParser() { + } + + /** + * Parse the WMO line and store WMO header, OfficeID, issue time, + * designatorBBB,... + * + * @param wmoline + * The bulletin message + * + * @return a NonConvsigmetRecord + */ + public static NonConvSigmetRecord processWMO(String wmoline, Headers headers) { + + NonConvSigmetRecord currentRecord = null; + // Regular expression for WMO/ICAO, station ID, and issue date (and + // maybe designator BBB) + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; + + // Pattern used for extracting WMO header,issue office and issue date + // and designatorBBB + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(wmoline); + + if (theMatcher.find()) { + currentRecord = new NonConvSigmetRecord(); + + currentRecord.setWmoHeader(theMatcher.group(1)); + currentRecord.setIssueOffice(theMatcher.group(2)); + currentRecord.setDesignatorBBB(theMatcher.group(5)); + + // Decode the issue time. + Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), + headers); + currentRecord.setIssueTime(issueTime); + + /* 999999999999999999999999999999 + DataTime dataTime = new DataTime(issueTime); + currentRecord.setDataTime(dataTime); + 999 */ + } + return currentRecord; + } + + /** + * Obtains start time and end time and forecast Region from input report + * + * @param theBullMsg + * The bulletin message which contains start time and end time. + * + * @param NonConvSigmetRecord + * + * @return a NonConvsigmetRecord + */ + + public static NonConvSigmetRecord processStartEndTime(String theBullMsg, + NonConvSigmetRecord nconvRecord, Headers headers) { + final String STARTTIME_EXP = "([A-Z]{4}) WS ([0-9]{6})( [A-Z]{3})?"; + final String ENDTIME_EXP = "VALID UNTIL ([0-9]{6})"; + + final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); + final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); + + Calendar stTime = null; + Calendar endTime = null; + /* + * Default equal to one hour if there is no valid time in report + */ + + NonConvSigmetRecord currentRecord = nconvRecord; + + // Calculate the startTime + Matcher theMatcher = starttimePattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setForecastRegion(theMatcher.group(1)); + stTime = TimeTools.findDataTime(theMatcher.group(2), headers); + } + if (stTime == null) { + currentRecord.setStartTime(currentRecord.getIssueTime()); + } else { + currentRecord.setStartTime(stTime); + } + + // Calculate the endTime + theMatcher = endtimePattern.matcher(theBullMsg); + + if (theMatcher.find()) { + endTime = TimeTools.findDataTime(theMatcher.group(1), headers); + } + if (endTime == null) { + endTime = currentRecord.getIssueTime(); + currentRecord.setEndTime(endTime); + } else { + currentRecord.setEndTime(endTime); + } + + /* 9999999999999999999999999999999 */ + DataTime dataTime = new DataTime(stTime, new TimeRange (stTime.getTime(), + endTime.getTimeInMillis() - stTime.getTimeInMillis()) ); + currentRecord.setDataTime(dataTime); + /* 999 */ + return currentRecord; + } + + /** + * Obtains SigmetId from input report + * + * @param theBullMsg + * The bulletin message. + * + * @param NonConvSigmetRecord + * + * @return a NonConvsigmetRecord + */ + public static NonConvSigmetRecord processSigmetId(String theBullMsg, + NonConvSigmetRecord nconvRecord) { + final String SIGMETID_EXP = "SIGMET ([A-Z]{2,} [0-9]{1})"; + final Pattern sigPattern = Pattern.compile(SIGMETID_EXP); + NonConvSigmetRecord currentRecord = nconvRecord; + // Parse sigmetId + Matcher theMatcher = sigPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setSigmetId(theMatcher.group(1)); + } + + return currentRecord; + } + + /** + * Parse the phenomena... Hazard Type,Hazard Intensity,Hazard Cause,Hazard + * Condition,FlightLevel1,FlightLevel2,SigmetId,AWIPSId,CorAmdTest,StateList + * + * @param theBullMsg + * from bulletin message + * + * @param a + * NonConvsigmetRecord + * + * @return a NonConvsigmetRecord + */ + public static NonConvSigmetRecord processPhenomena(String theBullMsg, + NonConvSigmetRecord nconvRecord) { + + final String FL_EXP1 = "BTN (FL)?([0-9]{3}) AND (FL)?([0-9]{3})"; + + final String FL_EXP2 = "BLW (FL)?([0-9]{3})"; + + final String HAZARDTYPE_EXP = " (TURB|ICGICIP|ICE) "; + + final String HAZARDINTS_EXP = "(OCNL [A-Z0-9]{2,})(BLW (FL)?([0-9]{3}).|BTN|TURB|ICGICIP|ICE|ICGIC|VA|DU)?"; + + final String HAZARDCAUS_EXP = "OCNL ([\\w| ])*(.|DUE TO)?([\\w| ]*). CONDS"; + + final String HAZARDCOND_EXP = "(CONDS [\\w| ]*)(\\x0d\\x0d\\x0a)?([\\w| ]*)([0-9]{4})Z"; + + final String STATELIST_EXP = "(([A-Z]{2})( [A-Z]{2})*)\\x0d\\x0d\\x0a"; + + final String AWIPSID_EXP = "([A-Z]{2}[0-9]{1}[A-Z]{1})( )*\\x0d\\x0d\\x0a"; + + final String CORREMARK_EXP = "(COR|AMD|TEST)"; + + final Pattern flPattern1 = Pattern.compile(FL_EXP1); + + final Pattern flPattern2 = Pattern.compile(FL_EXP2); + + final Pattern hzTypePattern = Pattern.compile(HAZARDTYPE_EXP); + + final Pattern hzIntsPattern = Pattern.compile(HAZARDINTS_EXP); + + final Pattern hzCausPattern = Pattern.compile(HAZARDCAUS_EXP); + + final Pattern hzCondPattern = Pattern.compile(HAZARDCOND_EXP); + + final Pattern stPattern = Pattern.compile(STATELIST_EXP); + + final Pattern awipsPattern = Pattern.compile(AWIPSID_EXP); + + final Pattern corRemarkPattern = Pattern.compile(CORREMARK_EXP); + + NonConvSigmetRecord currentRecord = nconvRecord; + + Matcher theMatcher = flPattern1.matcher(theBullMsg); + + if (theMatcher.find()) { + currentRecord + .setFlightLevel2(Integer.parseInt(theMatcher.group(4))); + currentRecord + .setFlightLevel1(Integer.parseInt(theMatcher.group(2))); + } else { + theMatcher = flPattern2.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setFlightLevel1(Integer.parseInt(theMatcher + .group(2))); + } + } + theMatcher = hzCausPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setHazardCause(theMatcher.group(3)); + } + theMatcher = hzCondPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setHazardCondition(theMatcher.group(0)); + } + theMatcher = hzIntsPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setHazardIntensity(theMatcher.group(1)); + } + theMatcher = hzTypePattern.matcher(theBullMsg); + if (theMatcher.find()) { + if ("TURB".equals(theMatcher.group(1))) { + currentRecord.setHazardType("TURBULENCE"); + } else { + currentRecord.setHazardType(theMatcher.group(1)); + } + } + theMatcher = stPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setStateList(theMatcher.group(1)); + } + theMatcher = awipsPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setAwipsId(theMatcher.group(1)); + } + theMatcher = corRemarkPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setCorrectionRemarks(theMatcher.group(0)); + } + + return currentRecord; + + } + + /** + * Parse the location lines... Add location table to the section table if + * any + * + * @param theBullMsg + * from bulletin message + * + * @param recordTable + * The record Table + * + * @return true if finds a location line + */ + public static Boolean processLocation(String theBullMsg, + NonConvSigmetRecord recordTable) { + + Boolean hasLocationLine = true; + String locationDelimiter = "-| TO "; + ArrayList terminationList = new ArrayList(); + terminationList.addAll(Arrays.asList(new String[] { "OCNL", "SEV" })); + Scanner sclocations = new Scanner(theBullMsg).useDelimiter("FROM"); + + /* + * throws away the first section which is not the "FROM" location + */ + LatLonPoint point; + String locationRecord = sclocations.next(); + + if (sclocations.hasNext()) { + locationRecord = sclocations.next(); + + Scanner scLocationLine = new Scanner(locationRecord) + .useDelimiter("\\x0d\\x0d\\x0a"); + String lines = " "; + String curLine = null; + ArrayList locationList = new ArrayList(); + locationList.clear(); + Boolean notBreak = true; + + while (scLocationLine.hasNext() && notBreak) { + curLine = scLocationLine.next();// Get next location line + Scanner scLocationToken = new Scanner(curLine); + if (scLocationToken.hasNext()) { + // Check the first token from each line + String firstToken = scLocationToken.next(); + if (terminationList.contains(firstToken)) { + notBreak = false;// terminate + break; + } + } + lines = lines.concat(" ").concat(curLine); + } + + // Clean up the leading space + lines = UtilN.removeLeadingWhiteSpaces(lines); + // Parse the location lines by a "-" or "TO" + Scanner scLocation = new Scanner(lines) + .useDelimiter(locationDelimiter); + locationList.clear(); + // Get all locations + while (scLocation.hasNext()) { + locationList.add(scLocation.next()); + } + + // set locations to data base + if (locationList.size() > 1) { + Integer idxLocation = 0; + for (String location : locationList) { + NonConvSigmetLocation currentLocation = new NonConvSigmetLocation(); + currentLocation.setLocationLine(lines); + currentLocation.setLocation(location); + point = LatLonLocTbl.getLatLonPoint(location, "vors"); + currentLocation.setIndex(idxLocation + 1); + idxLocation++; + currentLocation.setLatitude(point + .getLatitude(LatLonPoint.INDEGREES)); + currentLocation.setLongitude(point + .getLongitude(LatLonPoint.INDEGREES)); + recordTable.addNonConvSigmetLocation(currentLocation); + } + } else { + hasLocationLine = false; + } + + } else { + hasLocationLine = false; + } + + return hasLocationLine; + } + + /** + * process regular section of a non-convective sigmet report + * + * @return a NonConvsigmetRecord table + */ + public static NonConvSigmetRecord processRecord(String theBullMsg, + Headers headers) { + final String CANCELSIGMET_EXP = "(CANCEL SIGMET|TEST)"; + final Pattern cancelSigPattern = Pattern.compile(CANCELSIGMET_EXP); + Matcher theMatcher = cancelSigPattern.matcher(theBullMsg); + // Decode the WMO Header + NonConvSigmetRecord currentRecord = NonConvSigmetParser.processWMO( + theBullMsg, headers); + // Decode the sigmetId + currentRecord = NonConvSigmetParser.processSigmetId(theBullMsg, + currentRecord); + // Decode the Start Time,End Time,ForecastRegion + currentRecord = NonConvSigmetParser.processStartEndTime(theBullMsg, + currentRecord, headers); + // Decode the phenomena description + currentRecord = NonConvSigmetParser.processPhenomena(theBullMsg, + currentRecord); + // Replace the special characters + currentRecord + .setBullMessage(theBullMsg.replace('\r', ' ') + .replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + + if (theMatcher.find()) { + if ("UNKNOWN".equals(currentRecord.getHazardType())) { + if ("TEST".equals(theMatcher.group(0))) { + currentRecord.setHazardType("TEST"); + } else { + currentRecord.setHazardType("CANCEL"); + } + } + } else { + // Decode the locations + NonConvSigmetParser.processLocation(theBullMsg, currentRecord); + } + return currentRecord; + } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java index 09e93d1a71..a0947a6f6d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml old mode 100644 new mode 100755 index d5927f1699..b47ebc7901 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-common.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml old mode 100644 new mode 100755 index f6ac80cb6a..e9b2d3798a --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/res/spring/nonconvsigmet-ingest.xml @@ -1,73 +1,73 @@ - - - - - - - - - - - - - - - - - - - - - - - - - nonconvsigmet - - - - - - - - - - - - - java.lang.Throwable - - - - - - - java.lang.Throwable - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + nonconvsigmet + + + + + + + + + + + + + java.lang.Throwable + + + + + + + java.lang.Throwable + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java old mode 100644 new mode 100755 index 689b177f00..e47ebce5d2 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetDecoder.java @@ -1,111 +1,111 @@ -/** - * - * Non-Convective Sigmet Decoder - * - * This java class decodes NONCONVSIGMET (non-convective sigmet) raw data. - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 Uma Josyula Initial creation - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder; - -import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord; -import gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util.NonConvSigmetParser; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.Scanner; - -import com.raytheon.edex.esb.Headers; -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.edex.decodertools.core.IDecoderConstants; - -public class NonConvSigmetDecoder extends AbstractDecoder { - - private final String pluginName; - - /** - * Constructor - * - * @throws DecoderException - */ - public NonConvSigmetDecoder(String name) throws DecoderException { - pluginName = name; - } - - public PluginDataObject[] decode(byte[] data, Headers headers) - throws DecoderException { - - PluginDataObject [] recs = null; - NonConvSigmetRecord currentRecord = null; - String traceId = ""; - if (headers != null) { - traceId = (String) headers.get("traceId"); - } - if((data != null) && (data.length > 0)) { - String etx = IDecoderConstants.ETX; - String theBulletin = null; - byte[] messageData = null; - NonConvSigmetSeparator sep = NonConvSigmetSeparator.separate(data, - headers); - messageData = sep.next(); - String theMessage = new String(messageData); - - /* - * May have multiple duplicate bulletins, only get the first bulletin - * and eliminate the remaining bulletins after the first bulletin. - */ - Scanner cc = new Scanner(theMessage).useDelimiter(etx); - if (cc.hasNext()) { - theBulletin = cc.next(); - } else { - theBulletin = theMessage; - } - /* - * Decode by calling the NonconvSigmetParser method processRecord - */ - currentRecord = NonConvSigmetParser.processRecord(theBulletin, headers); - if (currentRecord != null) { - currentRecord.setReportType(pluginName); - /* - * Replace special characters to a blank so that it may be readable - */ - currentRecord.setBullMessage(UtilN - .removeLeadingWhiteSpaces((theBulletin.substring(5)) - .replace('\036', ' ').replace('\r', ' ') - .replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' '))); - /* - * Check the NonConvsigmet record object. If not, throws exception. - */ - currentRecord.setTraceId(traceId); - currentRecord.setPluginName(pluginName); - try { - currentRecord.constructDataURI(); - - } catch (PluginException e) { - logger.error(traceId + "- Unable to construct dataURI", e); - currentRecord = null; - } - } - } - - /* - * Return the NonConvsigmetRecord record object. - */ - if (currentRecord == null) { - recs = new PluginDataObject[0]; - } else { - recs = new PluginDataObject[] { currentRecord }; - } - return recs; - } - +/** + * + * Non-Convective Sigmet Decoder + * + * This java class decodes NONCONVSIGMET (non-convective sigmet) raw data. + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 Uma Josyula Initial creation + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder; + +import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord; +import gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util.NonConvSigmetParser; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.Scanner; + +import com.raytheon.edex.esb.Headers; +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.edex.decodertools.core.IDecoderConstants; + +public class NonConvSigmetDecoder extends AbstractDecoder { + + private final String pluginName; + + /** + * Constructor + * + * @throws DecoderException + */ + public NonConvSigmetDecoder(String name) throws DecoderException { + pluginName = name; + } + + public PluginDataObject[] decode(byte[] data, Headers headers) + throws DecoderException { + + PluginDataObject [] recs = null; + NonConvSigmetRecord currentRecord = null; + String traceId = ""; + if (headers != null) { + traceId = (String) headers.get("traceId"); + } + if((data != null) && (data.length > 0)) { + String etx = IDecoderConstants.ETX; + String theBulletin = null; + byte[] messageData = null; + NonConvSigmetSeparator sep = NonConvSigmetSeparator.separate(data, + headers); + messageData = sep.next(); + String theMessage = new String(messageData); + + /* + * May have multiple duplicate bulletins, only get the first bulletin + * and eliminate the remaining bulletins after the first bulletin. + */ + Scanner cc = new Scanner(theMessage).useDelimiter(etx); + if (cc.hasNext()) { + theBulletin = cc.next(); + } else { + theBulletin = theMessage; + } + /* + * Decode by calling the NonconvSigmetParser method processRecord + */ + currentRecord = NonConvSigmetParser.processRecord(theBulletin, headers); + if (currentRecord != null) { + currentRecord.setReportType(pluginName); + /* + * Replace special characters to a blank so that it may be readable + */ + currentRecord.setBullMessage(UtilN + .removeLeadingWhiteSpaces((theBulletin.substring(5)) + .replace('\036', ' ').replace('\r', ' ') + .replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' '))); + /* + * Check the NonConvsigmet record object. If not, throws exception. + */ + currentRecord.setTraceId(traceId); + currentRecord.setPluginName(pluginName); + try { + currentRecord.constructDataURI(); + + } catch (PluginException e) { + logger.error(traceId + "- Unable to construct dataURI", e); + currentRecord = null; + } + } + } + + /* + * Return the NonConvsigmetRecord record object. + */ + if (currentRecord == null) { + recs = new PluginDataObject[0]; + } else { + recs = new PluginDataObject[] { currentRecord }; + } + return recs; + } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java old mode 100644 new mode 100755 index d91836dc4f..a25c682b04 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/NonConvSigmetSeparator.java @@ -1,137 +1,137 @@ -/** - * NonConvsigmetSeparator - * - * This class sets the raw data to an Arraylist, records, of - * String based on a uniquely identified separator. - * - *
    - * Uma Josyula                               06/2009         Creation
    - * 
    - * - * This code has been developed by the SIB for use in the AWIPS system. - */ - -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.edex.util.Util; -import com.raytheon.uf.edex.wmo.message.WMOHeader; - -public class NonConvSigmetSeparator extends AbstractRecordSeparator { - private final Log logger = LogFactory.getLog(getClass()); - - /** Regex used for separate the bulletins */ - private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; - - /** Regex matcher */ - private Matcher matcher; - - /** Pattern object for regex search */ - private Pattern pattern; - - /** List of records contained in file */ - private List records; - - private Iterator iterator = null; - - /** - * Constructor. - * - */ - public NonConvSigmetSeparator() { - records = new ArrayList(); - } - - public static NonConvSigmetSeparator separate(byte[] data, Headers headers) { - NonConvSigmetSeparator ds = new NonConvSigmetSeparator(); - ds.setData(data, headers); - return ds; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.AbstractRecordSeparator#setData(byte[], - * com.raytheon.edex.esb.Headers) - */ - public void setData(byte[] data, Headers headers) { - try { - doSeparate(new String(data)); - } catch (Exception e) { - logger.warn("No valid records found!", e); - } finally { - iterator = records.iterator(); - } - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() - */ - public boolean hasNext() { - if (iterator == null) { - return false; - } else { - return iterator.hasNext(); - } - } - - /** - * Get record - */ - public byte[] next() { - try { - String temp = iterator.next(); - if (Util.isEmptyString(temp)) { - return new byte [0]; - } else { - return temp.getBytes(); - } - } catch (NoSuchElementException e) { - return (byte[]) null; - } - } - - /** - * @param message - * separate bulletins - */ - private void doSeparate(String message) { - /* Regex used for separate the bulletins */ - - String data = message; - - WMOHeader h1 = new WMOHeader(data.getBytes()); - boolean done = false; - while (!done) { - if((h1 != null)&&(h1.isValid())) { - String body = data.substring(h1.getMessageDataStart()); - WMOHeader h2 = new WMOHeader(body.getBytes()); - if((h2 != null)&&(h2.isValid())) { - int endPos = h2.getWmoHeaderStart(); - records.add(h1.getWmoHeader() + "\n" + body.substring(0,endPos)); - data = body.substring(endPos); - h1 = new WMOHeader(data.getBytes()); - } else { - records.add(data); - done = true; - } - } else { - records.add(data); - done = true; - } - } - } +/** + * NonConvsigmetSeparator + * + * This class sets the raw data to an Arraylist, records, of + * String based on a uniquely identified separator. + * + *
    + * Uma Josyula                               06/2009         Creation
    + * 
    + * + * This code has been developed by the SIB for use in the AWIPS system. + */ + +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.edex.util.Util; +import com.raytheon.uf.edex.wmo.message.WMOHeader; + +public class NonConvSigmetSeparator extends AbstractRecordSeparator { + private final Log logger = LogFactory.getLog(getClass()); + + /** Regex used for separate the bulletins */ + private static final String BULLSEPARATOR = "([0-9]{3})( )*\\x0d\\x0d\\x0a([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( [A-Z]{3})?\\x0d\\x0d\\x0a"; + + /** Regex matcher */ + private Matcher matcher; + + /** Pattern object for regex search */ + private Pattern pattern; + + /** List of records contained in file */ + private List records; + + private Iterator iterator = null; + + /** + * Constructor. + * + */ + public NonConvSigmetSeparator() { + records = new ArrayList(); + } + + public static NonConvSigmetSeparator separate(byte[] data, Headers headers) { + NonConvSigmetSeparator ds = new NonConvSigmetSeparator(); + ds.setData(data, headers); + return ds; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.AbstractRecordSeparator#setData(byte[], + * com.raytheon.edex.esb.Headers) + */ + public void setData(byte[] data, Headers headers) { + try { + doSeparate(new String(data)); + } catch (Exception e) { + logger.warn("No valid records found!", e); + } finally { + iterator = records.iterator(); + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.edex.plugin.IRecordSeparator#hasNext() + */ + public boolean hasNext() { + if (iterator == null) { + return false; + } else { + return iterator.hasNext(); + } + } + + /** + * Get record + */ + public byte[] next() { + try { + String temp = iterator.next(); + if (Util.isEmptyString(temp)) { + return new byte [0]; + } else { + return temp.getBytes(); + } + } catch (NoSuchElementException e) { + return (byte[]) null; + } + } + + /** + * @param message + * separate bulletins + */ + private void doSeparate(String message) { + /* Regex used for separate the bulletins */ + + String data = message; + + WMOHeader h1 = new WMOHeader(data.getBytes()); + boolean done = false; + while (!done) { + if((h1 != null)&&(h1.isValid())) { + String body = data.substring(h1.getMessageDataStart()); + WMOHeader h2 = new WMOHeader(body.getBytes()); + if((h2 != null)&&(h2.isValid())) { + int endPos = h2.getWmoHeaderStart(); + records.add(h1.getWmoHeader() + "\n" + body.substring(0,endPos)); + data = body.substring(endPos); + h1 = new WMOHeader(data.getBytes()); + } else { + records.add(data); + done = true; + } + } else { + records.add(data); + done = true; + } + } + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java old mode 100644 new mode 100755 index 5913d39c3b..505c4ab822 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/decoder/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains decoder.java for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder;; +/** +* Contains decoder.java for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.decoder;; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java old mode 100644 new mode 100755 index 1ff5b0523b..28d4c7b6f1 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/NonConvSigmetParser.java @@ -1,397 +1,397 @@ -/* - * NonConvsigmet DecoderUtil - * - * This java class intends to serve as a decoder utility for NonConvsigmet. - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 Uma Josyula Initial creation - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; - -import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetLocation; -import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord; -import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; -import gov.noaa.nws.ncep.edex.util.UtilN; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.edex.decodertools.core.LatLonPoint; -import com.raytheon.uf.edex.decodertools.time.TimeTools; - -public class NonConvSigmetParser { - - /** - * Constructor - */ - public NonConvSigmetParser() { - } - - /** - * Parse the WMO line and store WMO header, OfficeID, issue time, - * designatorBBB,... - * - * @param wmoline - * The bulletin message - * - * @return a NonConvsigmetRecord - */ - public static NonConvSigmetRecord processWMO(String wmoline, Headers headers) { - - NonConvSigmetRecord currentRecord = null; - // Regular expression for WMO/ICAO, station ID, and issue date (and - // maybe designator BBB) - final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; - - // Pattern used for extracting WMO header,issue office and issue date - // and designatorBBB - final Pattern wmoPattern = Pattern.compile(WMO_EXP); - Matcher theMatcher = wmoPattern.matcher(wmoline); - - if (theMatcher.find()) { - currentRecord = new NonConvSigmetRecord(); - - currentRecord.setWmoHeader(theMatcher.group(1)); - currentRecord.setIssueOffice(theMatcher.group(2)); - currentRecord.setDesignatorBBB(theMatcher.group(5)); - - // Decode the issue time. - Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), - headers); - currentRecord.setIssueTime(issueTime); - - DataTime dataTime = new DataTime(issueTime); - currentRecord.setDataTime(dataTime); - } - return currentRecord; - } - - /** - * Obtains start time and end time and forecast Region from input report - * - * @param theBullMsg - * The bulletin message which contains start time and end time. - * - * @param NonConvSigmetRecord - * - * @return a NonConvsigmetRecord - */ - - public static NonConvSigmetRecord processStartEndTime(String theBullMsg, - NonConvSigmetRecord nconvRecord, Headers headers) { - final String STARTTIME_EXP = "([A-Z]{4}) WS ([0-9]{6})( [A-Z]{3})?"; - final String ENDTIME_EXP = "VALID UNTIL ([0-9]{6})"; - - final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); - final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); - - Calendar stTime = null; - Calendar endTime = null; - /* - * Default equal to one hour if there is no valid time in report - */ - - NonConvSigmetRecord currentRecord = nconvRecord; - - // Calculate the startTime - Matcher theMatcher = starttimePattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setForecastRegion(theMatcher.group(1)); - stTime = TimeTools.findDataTime(theMatcher.group(2), headers); - } - if (stTime == null) { - currentRecord.setStartTime(currentRecord.getIssueTime()); - } else { - currentRecord.setStartTime(stTime); - } - - // Calculate the endTime - theMatcher = endtimePattern.matcher(theBullMsg); - - if (theMatcher.find()) { - endTime = TimeTools.findDataTime(theMatcher.group(1), headers); - } - if (endTime == null) { - endTime = currentRecord.getIssueTime(); - currentRecord.setEndTime(endTime); - } else { - currentRecord.setEndTime(endTime); - } - - return currentRecord; - } - - /** - * Obtains SigmetId from input report - * - * @param theBullMsg - * The bulletin message. - * - * @param NonConvSigmetRecord - * - * @return a NonConvsigmetRecord - */ - public static NonConvSigmetRecord processSigmetId(String theBullMsg, - NonConvSigmetRecord nconvRecord) { - final String SIGMETID_EXP = "SIGMET ([A-Z]{2,} [0-9]{1})"; - final Pattern sigPattern = Pattern.compile(SIGMETID_EXP); - NonConvSigmetRecord currentRecord = nconvRecord; - // Parse sigmetId - Matcher theMatcher = sigPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setSigmetId(theMatcher.group(1)); - } - - return currentRecord; - } - - /** - * Parse the phenomena... Hazard Type,Hazard Intensity,Hazard Cause,Hazard - * Condition,FlightLevel1,FlightLevel2,SigmetId,AWIPSId,CorAmdTest,StateList - * - * @param theBullMsg - * from bulletin message - * - * @param a - * NonConvsigmetRecord - * - * @return a NonConvsigmetRecord - */ - public static NonConvSigmetRecord processPhenomena(String theBullMsg, - NonConvSigmetRecord nconvRecord) { - - final String FL_EXP1 = "BTN (FL)?([0-9]{3}) AND (FL)?([0-9]{3})"; - - final String FL_EXP2 = "BLW (FL)?([0-9]{3})"; - - final String HAZARDTYPE_EXP = " (TURB|ICGICIP|ICE) "; - - final String HAZARDINTS_EXP = "(OCNL [A-Z0-9]{2,})(BLW (FL)?([0-9]{3}).|BTN|TURB|ICGICIP|ICE|ICGIC|VA|DU)?"; - - final String HAZARDCAUS_EXP = "OCNL ([\\w| ])*(.|DUE TO)?([\\w| ]*). CONDS"; - - final String HAZARDCOND_EXP = "(CONDS [\\w| ]*)(\\x0d\\x0d\\x0a)?([\\w| ]*)([0-9]{4})Z"; - - final String STATELIST_EXP = "(([A-Z]{2})( [A-Z]{2})*)[\\r\\n]+"; - - final String AWIPSID_EXP = "([A-Z]{2}[0-9]{1}[A-Z]{1})( )*[\\r\\n]+"; - - final String CORREMARK_EXP = "(COR|AMD|TEST)"; - - final Pattern flPattern1 = Pattern.compile(FL_EXP1); - - final Pattern flPattern2 = Pattern.compile(FL_EXP2); - - final Pattern hzTypePattern = Pattern.compile(HAZARDTYPE_EXP); - - final Pattern hzIntsPattern = Pattern.compile(HAZARDINTS_EXP); - - final Pattern hzCausPattern = Pattern.compile(HAZARDCAUS_EXP); - - final Pattern hzCondPattern = Pattern.compile(HAZARDCOND_EXP); - - final Pattern stPattern = Pattern.compile(STATELIST_EXP); - - final Pattern awipsPattern = Pattern.compile(AWIPSID_EXP); - - final Pattern corRemarkPattern = Pattern.compile(CORREMARK_EXP); - - NonConvSigmetRecord currentRecord = nconvRecord; - - Matcher theMatcher = flPattern1.matcher(theBullMsg); - - if (theMatcher.find()) { - currentRecord - .setFlightLevel2(Integer.parseInt(theMatcher.group(4))); - currentRecord - .setFlightLevel1(Integer.parseInt(theMatcher.group(2))); - } else { - theMatcher = flPattern2.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setFlightLevel1(Integer.parseInt(theMatcher - .group(2))); - } - } - theMatcher = hzCausPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setHazardCause(theMatcher.group(3)); - } - theMatcher = hzCondPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setHazardCondition(theMatcher.group(0)); - } - theMatcher = hzIntsPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setHazardIntensity(theMatcher.group(1)); - } - theMatcher = hzTypePattern.matcher(theBullMsg); - if (theMatcher.find()) { - if ("TURB".equals(theMatcher.group(1))) { - currentRecord.setHazardType("TURBULENCE"); - } else { - currentRecord.setHazardType(theMatcher.group(1)); - } - } - theMatcher = stPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setStateList(theMatcher.group(1)); - } - theMatcher = awipsPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setAwipsId(theMatcher.group(1)); - } - theMatcher = corRemarkPattern.matcher(theBullMsg); - if (theMatcher.find()) { - currentRecord.setCorrectionRemarks(theMatcher.group(0)); - } - - return currentRecord; - - } - - /** - * Parse the location lines... Add location table to the section table if - * any - * - * @param theBullMsg - * from bulletin message - * - * @param recordTable - * The record Table - * - * @return true if finds a location line - */ - public static Boolean processLocation(String theBullMsg, - NonConvSigmetRecord recordTable) { - - Boolean hasLocationLine = true; - String locationDelimiter = "-| TO "; - ArrayList terminationList = new ArrayList(); - terminationList.addAll(Arrays.asList(new String[] { "OCNL", "SEV" })); - Scanner sclocations = new Scanner(theBullMsg).useDelimiter("FROM"); - - /* - * throws away the first section which is not the "FROM" location - */ - LatLonPoint point; - String locationRecord = sclocations.next(); - - if (sclocations.hasNext()) { - locationRecord = sclocations.next(); - - Scanner scLocationLine = new Scanner(locationRecord) - .useDelimiter("[\\r\\n]+"); - String lines = " "; - String curLine = null; - ArrayList locationList = new ArrayList(); - locationList.clear(); - Boolean notBreak = true; - - while (scLocationLine.hasNext() && notBreak) { - curLine = scLocationLine.next();// Get next location line - Scanner scLocationToken = new Scanner(curLine); - if (scLocationToken.hasNext()) { - // Check the first token from each line - String firstToken = scLocationToken.next(); - if (terminationList.contains(firstToken)) { - notBreak = false;// terminate - break; - } - } - lines = lines.concat(" ").concat(curLine); - } - - // Clean up the leading space - lines = UtilN.removeLeadingWhiteSpaces(lines); - // Parse the location lines by a "-" or "TO" - Scanner scLocation = new Scanner(lines) - .useDelimiter(locationDelimiter); - locationList.clear(); - // Get all locations - while (scLocation.hasNext()) { - locationList.add(scLocation.next()); - } - - // set locations to data base - if (locationList.size() > 1) { - Integer idxLocation = 0; - for (String location : locationList) { - NonConvSigmetLocation currentLocation = new NonConvSigmetLocation(); - currentLocation.setLocationLine(lines); - currentLocation.setLocation(location); - point = LatLonLocTbl.getLatLonPoint(location, "vors"); - currentLocation.setIndex(idxLocation + 1); - idxLocation++; - currentLocation.setLatitude(point - .getLatitude(LatLonPoint.INDEGREES)); - currentLocation.setLongitude(point - .getLongitude(LatLonPoint.INDEGREES)); - recordTable.addNonConvSigmetLocation(currentLocation); - } - } else { - hasLocationLine = false; - } - - } else { - hasLocationLine = false; - } - - return hasLocationLine; - } - - /** - * process regular section of a non-convective sigmet report - * - * @return a NonConvsigmetRecord table - */ - public static NonConvSigmetRecord processRecord(String theBullMsg, - Headers headers) { - final String CANCELSIGMET_EXP = "(CANCEL SIGMET|TEST)"; - final Pattern cancelSigPattern = Pattern.compile(CANCELSIGMET_EXP); - Matcher theMatcher = cancelSigPattern.matcher(theBullMsg); - // Decode the WMO Header - NonConvSigmetRecord currentRecord = NonConvSigmetParser.processWMO( - theBullMsg, headers); - // Decode the sigmetId - currentRecord = NonConvSigmetParser.processSigmetId(theBullMsg, - currentRecord); - // Decode the Start Time,End Time,ForecastRegion - currentRecord = NonConvSigmetParser.processStartEndTime(theBullMsg, - currentRecord, headers); - // Decode the phenomena description - currentRecord = NonConvSigmetParser.processPhenomena(theBullMsg, - currentRecord); - // Replace the special characters - currentRecord - .setBullMessage(theBullMsg.replace('\r', ' ') - .replace('\003', ' ').replace('\000', ' ') - .replace('\001', ' ')); - - if (theMatcher.find()) { - if ("UNKNOWN".equals(currentRecord.getHazardType())) { - if ("TEST".equals(theMatcher.group(0))) { - currentRecord.setHazardType("TEST"); - } else { - currentRecord.setHazardType("CANCEL"); - } - } - } else { - // Decode the locations - NonConvSigmetParser.processLocation(theBullMsg, currentRecord); - } - return currentRecord; - } - +/* + * NonConvsigmet DecoderUtil + * + * This java class intends to serve as a decoder utility for NonConvsigmet. + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 06/2009 Uma Josyula Initial creation + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; + +import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetLocation; +import gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet.NonConvSigmetRecord; +import gov.noaa.nws.ncep.edex.tools.decoder.LatLonLocTbl; +import gov.noaa.nws.ncep.edex.util.UtilN; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.decodertools.core.LatLonPoint; +import com.raytheon.uf.edex.decodertools.time.TimeTools; + +public class NonConvSigmetParser { + + /** + * Constructor + */ + public NonConvSigmetParser() { + } + + /** + * Parse the WMO line and store WMO header, OfficeID, issue time, + * designatorBBB,... + * + * @param wmoline + * The bulletin message + * + * @return a NonConvsigmetRecord + */ + public static NonConvSigmetRecord processWMO(String wmoline, Headers headers) { + + NonConvSigmetRecord currentRecord = null; + // Regular expression for WMO/ICAO, station ID, and issue date (and + // maybe designator BBB) + final String WMO_EXP = "([A-Z]{4}[0-9]{2}) ([A-Z]{4}) ([0-9]{6})( ([A-Z]{3}))?"; + + // Pattern used for extracting WMO header,issue office and issue date + // and designatorBBB + final Pattern wmoPattern = Pattern.compile(WMO_EXP); + Matcher theMatcher = wmoPattern.matcher(wmoline); + + if (theMatcher.find()) { + currentRecord = new NonConvSigmetRecord(); + + currentRecord.setWmoHeader(theMatcher.group(1)); + currentRecord.setIssueOffice(theMatcher.group(2)); + currentRecord.setDesignatorBBB(theMatcher.group(5)); + + // Decode the issue time. + Calendar issueTime = TimeTools.findDataTime(theMatcher.group(3), + headers); + currentRecord.setIssueTime(issueTime); + + DataTime dataTime = new DataTime(issueTime); + currentRecord.setDataTime(dataTime); + } + return currentRecord; + } + + /** + * Obtains start time and end time and forecast Region from input report + * + * @param theBullMsg + * The bulletin message which contains start time and end time. + * + * @param NonConvSigmetRecord + * + * @return a NonConvsigmetRecord + */ + + public static NonConvSigmetRecord processStartEndTime(String theBullMsg, + NonConvSigmetRecord nconvRecord, Headers headers) { + final String STARTTIME_EXP = "([A-Z]{4}) WS ([0-9]{6})( [A-Z]{3})?"; + final String ENDTIME_EXP = "VALID UNTIL ([0-9]{6})"; + + final Pattern starttimePattern = Pattern.compile(STARTTIME_EXP); + final Pattern endtimePattern = Pattern.compile(ENDTIME_EXP); + + Calendar stTime = null; + Calendar endTime = null; + /* + * Default equal to one hour if there is no valid time in report + */ + + NonConvSigmetRecord currentRecord = nconvRecord; + + // Calculate the startTime + Matcher theMatcher = starttimePattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setForecastRegion(theMatcher.group(1)); + stTime = TimeTools.findDataTime(theMatcher.group(2), headers); + } + if (stTime == null) { + currentRecord.setStartTime(currentRecord.getIssueTime()); + } else { + currentRecord.setStartTime(stTime); + } + + // Calculate the endTime + theMatcher = endtimePattern.matcher(theBullMsg); + + if (theMatcher.find()) { + endTime = TimeTools.findDataTime(theMatcher.group(1), headers); + } + if (endTime == null) { + endTime = currentRecord.getIssueTime(); + currentRecord.setEndTime(endTime); + } else { + currentRecord.setEndTime(endTime); + } + + return currentRecord; + } + + /** + * Obtains SigmetId from input report + * + * @param theBullMsg + * The bulletin message. + * + * @param NonConvSigmetRecord + * + * @return a NonConvsigmetRecord + */ + public static NonConvSigmetRecord processSigmetId(String theBullMsg, + NonConvSigmetRecord nconvRecord) { + final String SIGMETID_EXP = "SIGMET ([A-Z]{2,} [0-9]{1})"; + final Pattern sigPattern = Pattern.compile(SIGMETID_EXP); + NonConvSigmetRecord currentRecord = nconvRecord; + // Parse sigmetId + Matcher theMatcher = sigPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setSigmetId(theMatcher.group(1)); + } + + return currentRecord; + } + + /** + * Parse the phenomena... Hazard Type,Hazard Intensity,Hazard Cause,Hazard + * Condition,FlightLevel1,FlightLevel2,SigmetId,AWIPSId,CorAmdTest,StateList + * + * @param theBullMsg + * from bulletin message + * + * @param a + * NonConvsigmetRecord + * + * @return a NonConvsigmetRecord + */ + public static NonConvSigmetRecord processPhenomena(String theBullMsg, + NonConvSigmetRecord nconvRecord) { + + final String FL_EXP1 = "BTN (FL)?([0-9]{3}) AND (FL)?([0-9]{3})"; + + final String FL_EXP2 = "BLW (FL)?([0-9]{3})"; + + final String HAZARDTYPE_EXP = " (TURB|ICGICIP|ICE) "; + + final String HAZARDINTS_EXP = "(OCNL [A-Z0-9]{2,})(BLW (FL)?([0-9]{3}).|BTN|TURB|ICGICIP|ICE|ICGIC|VA|DU)?"; + + final String HAZARDCAUS_EXP = "OCNL ([\\w| ])*(.|DUE TO)?([\\w| ]*). CONDS"; + + final String HAZARDCOND_EXP = "(CONDS [\\w| ]*)(\\x0d\\x0d\\x0a)?([\\w| ]*)([0-9]{4})Z"; + + final String STATELIST_EXP = "(([A-Z]{2})( [A-Z]{2})*)[\\r\\n]+"; + + final String AWIPSID_EXP = "([A-Z]{2}[0-9]{1}[A-Z]{1})( )*[\\r\\n]+"; + + final String CORREMARK_EXP = "(COR|AMD|TEST)"; + + final Pattern flPattern1 = Pattern.compile(FL_EXP1); + + final Pattern flPattern2 = Pattern.compile(FL_EXP2); + + final Pattern hzTypePattern = Pattern.compile(HAZARDTYPE_EXP); + + final Pattern hzIntsPattern = Pattern.compile(HAZARDINTS_EXP); + + final Pattern hzCausPattern = Pattern.compile(HAZARDCAUS_EXP); + + final Pattern hzCondPattern = Pattern.compile(HAZARDCOND_EXP); + + final Pattern stPattern = Pattern.compile(STATELIST_EXP); + + final Pattern awipsPattern = Pattern.compile(AWIPSID_EXP); + + final Pattern corRemarkPattern = Pattern.compile(CORREMARK_EXP); + + NonConvSigmetRecord currentRecord = nconvRecord; + + Matcher theMatcher = flPattern1.matcher(theBullMsg); + + if (theMatcher.find()) { + currentRecord + .setFlightLevel2(Integer.parseInt(theMatcher.group(4))); + currentRecord + .setFlightLevel1(Integer.parseInt(theMatcher.group(2))); + } else { + theMatcher = flPattern2.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setFlightLevel1(Integer.parseInt(theMatcher + .group(2))); + } + } + theMatcher = hzCausPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setHazardCause(theMatcher.group(3)); + } + theMatcher = hzCondPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setHazardCondition(theMatcher.group(0)); + } + theMatcher = hzIntsPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setHazardIntensity(theMatcher.group(1)); + } + theMatcher = hzTypePattern.matcher(theBullMsg); + if (theMatcher.find()) { + if ("TURB".equals(theMatcher.group(1))) { + currentRecord.setHazardType("TURBULENCE"); + } else { + currentRecord.setHazardType(theMatcher.group(1)); + } + } + theMatcher = stPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setStateList(theMatcher.group(1)); + } + theMatcher = awipsPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setAwipsId(theMatcher.group(1)); + } + theMatcher = corRemarkPattern.matcher(theBullMsg); + if (theMatcher.find()) { + currentRecord.setCorrectionRemarks(theMatcher.group(0)); + } + + return currentRecord; + + } + + /** + * Parse the location lines... Add location table to the section table if + * any + * + * @param theBullMsg + * from bulletin message + * + * @param recordTable + * The record Table + * + * @return true if finds a location line + */ + public static Boolean processLocation(String theBullMsg, + NonConvSigmetRecord recordTable) { + + Boolean hasLocationLine = true; + String locationDelimiter = "-| TO "; + ArrayList terminationList = new ArrayList(); + terminationList.addAll(Arrays.asList(new String[] { "OCNL", "SEV" })); + Scanner sclocations = new Scanner(theBullMsg).useDelimiter("FROM"); + + /* + * throws away the first section which is not the "FROM" location + */ + LatLonPoint point; + String locationRecord = sclocations.next(); + + if (sclocations.hasNext()) { + locationRecord = sclocations.next(); + + Scanner scLocationLine = new Scanner(locationRecord) + .useDelimiter("[\\r\\n]+"); + String lines = " "; + String curLine = null; + ArrayList locationList = new ArrayList(); + locationList.clear(); + Boolean notBreak = true; + + while (scLocationLine.hasNext() && notBreak) { + curLine = scLocationLine.next();// Get next location line + Scanner scLocationToken = new Scanner(curLine); + if (scLocationToken.hasNext()) { + // Check the first token from each line + String firstToken = scLocationToken.next(); + if (terminationList.contains(firstToken)) { + notBreak = false;// terminate + break; + } + } + lines = lines.concat(" ").concat(curLine); + } + + // Clean up the leading space + lines = UtilN.removeLeadingWhiteSpaces(lines); + // Parse the location lines by a "-" or "TO" + Scanner scLocation = new Scanner(lines) + .useDelimiter(locationDelimiter); + locationList.clear(); + // Get all locations + while (scLocation.hasNext()) { + locationList.add(scLocation.next()); + } + + // set locations to data base + if (locationList.size() > 1) { + Integer idxLocation = 0; + for (String location : locationList) { + NonConvSigmetLocation currentLocation = new NonConvSigmetLocation(); + currentLocation.setLocationLine(lines); + currentLocation.setLocation(location); + point = LatLonLocTbl.getLatLonPoint(location, "vors"); + currentLocation.setIndex(idxLocation + 1); + idxLocation++; + currentLocation.setLatitude(point + .getLatitude(LatLonPoint.INDEGREES)); + currentLocation.setLongitude(point + .getLongitude(LatLonPoint.INDEGREES)); + recordTable.addNonConvSigmetLocation(currentLocation); + } + } else { + hasLocationLine = false; + } + + } else { + hasLocationLine = false; + } + + return hasLocationLine; + } + + /** + * process regular section of a non-convective sigmet report + * + * @return a NonConvsigmetRecord table + */ + public static NonConvSigmetRecord processRecord(String theBullMsg, + Headers headers) { + final String CANCELSIGMET_EXP = "(CANCEL SIGMET|TEST)"; + final Pattern cancelSigPattern = Pattern.compile(CANCELSIGMET_EXP); + Matcher theMatcher = cancelSigPattern.matcher(theBullMsg); + // Decode the WMO Header + NonConvSigmetRecord currentRecord = NonConvSigmetParser.processWMO( + theBullMsg, headers); + // Decode the sigmetId + currentRecord = NonConvSigmetParser.processSigmetId(theBullMsg, + currentRecord); + // Decode the Start Time,End Time,ForecastRegion + currentRecord = NonConvSigmetParser.processStartEndTime(theBullMsg, + currentRecord, headers); + // Decode the phenomena description + currentRecord = NonConvSigmetParser.processPhenomena(theBullMsg, + currentRecord); + // Replace the special characters + currentRecord + .setBullMessage(theBullMsg.replace('\r', ' ') + .replace('\003', ' ').replace('\000', ' ') + .replace('\001', ' ')); + + if (theMatcher.find()) { + if ("UNKNOWN".equals(currentRecord.getHazardType())) { + if ("TEST".equals(theMatcher.group(0))) { + currentRecord.setHazardType("TEST"); + } else { + currentRecord.setHazardType("CANCEL"); + } + } + } else { + // Decode the locations + NonConvSigmetParser.processLocation(theBullMsg, currentRecord); + } + return currentRecord; + } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java old mode 100644 new mode 100755 index 09e93d1a71..a0947a6f6d --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nonconvsigmet/src/gov/noaa/nws/ncep/edex/plugin/nonconvsigmet/util/package-info.java @@ -1,4 +1,4 @@ -/** -* Contains tools for decoder plug-ins -*/ -package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; +/** +* Contains tools for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.nonconvsigmet.util; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwh/gov.noaa.nws.ncep.edex.plugin.sgwh.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwh/gov.noaa.nws.ncep.edex.plugin.sgwh.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/gov.noaa.nws.ncep.edex.plugin.sgwhv.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/gov.noaa.nws.ncep.edex.plugin.sgwhv.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvDecoder.java index 882ebe8612..c0ff6edb1e 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvDecoder.java @@ -1,100 +1,100 @@ -/** - * SgwhvDecoder - * - * This java class decodes SGWHV (Significant Wave Height from Various satellites) BUFR data - * from NAVOCEANO including Env and Jason 2. - * - **
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#     Engineer    Description
    - * -------		-------		--------	-----------
    - * 08/23/11					Chin J Chen   Initial coding from BufrSgwhvDecoder
    - * 
    - * - * @author Chin J. Chen - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.sgwhv.decoder; - -import gov.noaa.nws.ncep.common.dataplugin.sgwhv.SgwhvRecord; -import gov.noaa.nws.ncep.edex.plugin.sgwhv.util.SgwhvParser; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.exception.DecoderException; -import com.raytheon.edex.plugin.AbstractDecoder; -import com.raytheon.edex.plugin.IBinaryDecoder; -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.PluginException; - -public class SgwhvDecoder extends AbstractDecoder implements IBinaryDecoder { - private static String pluginName; - - private Log logger = LogFactory.getLog(getClass()); - - /** - * Empty constructor required by DecoderFactory. - * - * @throws DecoderException - */ - public SgwhvDecoder(String name) throws DecoderException { - pluginName = name; - } - - /** - * Decode the next SGWHV BUFR record. - * - * @return One record of decoded data. - * @throws DecoderException - * Thrown if no data is available. - */ - public PluginDataObject[] decode(byte[] bufrData) throws DecoderException { - SgwhvRecord sgwhvRec; - SgwhvSeparator sep = new SgwhvSeparator(); - - try { - if (bufrData != null) { - sep.setData(bufrData, null); - } else { - logger.info("No data to decode while creating SgwhvSeparator"); - } - } catch (Exception e) { - // need to catch any number of exceptions. Report them here - // instead of letting them kill the PluginDataProxy. - if (sep != null) { - logger.error("Error in " + sep.getWmoHeader().getWmoHeader()); - } - logger.error("Exception while creating SgwhvSeparator", e); - } - - /* - * Process BUFR SGWHV and add to the database. - */ - List pdoList = new ArrayList(); - int subsetNum = 0; - while (sep.hasNext()) { - subsetNum++; - sgwhvRec = SgwhvParser.processSgwhv(sep, subsetNum); - if (sgwhvRec != null) { - try { - sgwhvRec.setPluginName(pluginName); - sgwhvRec.constructDataURI(); - sgwhvRec.setReportType("SGWHV"); - } catch (PluginException e) { - logger.error("Error constructing dataURI", e); - } - } - if (!pdoList.contains(sgwhvRec)) { - pdoList.add(sgwhvRec); - } - } - logger.info("Processed " + subsetNum + " subsets"); - return pdoList.toArray(new PluginDataObject[pdoList.size()]); - } -} +/** + * SgwhvDecoder + * + * This java class decodes SGWHV (Significant Wave Height from Various satellites) BUFR data + * from NAVOCEANO including Env and Jason 2. + * + **
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#     Engineer    Description
    + * -------		-------		--------	-----------
    + * 08/23/11					Chin J Chen   Initial coding from BufrSgwhvDecoder
    + * 
    + * + * @author Chin J. Chen + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.sgwhv.decoder; + +import gov.noaa.nws.ncep.common.dataplugin.sgwhv.SgwhvRecord; +import gov.noaa.nws.ncep.edex.plugin.sgwhv.util.SgwhvParser; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.exception.DecoderException; +import com.raytheon.edex.plugin.AbstractDecoder; +import com.raytheon.edex.plugin.IBinaryDecoder; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.PluginException; + +public class SgwhvDecoder extends AbstractDecoder implements IBinaryDecoder { + private static String pluginName; + + private Log logger = LogFactory.getLog(getClass()); + + /** + * Empty constructor required by DecoderFactory. + * + * @throws DecoderException + */ + public SgwhvDecoder(String name) throws DecoderException { + pluginName = name; + } + + /** + * Decode the next SGWHV BUFR record. + * + * @return One record of decoded data. + * @throws DecoderException + * Thrown if no data is available. + */ + public PluginDataObject[] decode(byte[] bufrData) throws DecoderException { + SgwhvRecord sgwhvRec; + SgwhvSeparator sep = new SgwhvSeparator(); + + try { + if (bufrData != null) { + sep.setData(bufrData, null); + } else { + logger.info("No data to decode while creating SgwhvSeparator"); + } + } catch (Exception e) { + // need to catch any number of exceptions. Report them here + // instead of letting them kill the PluginDataProxy. + if (sep != null) { + logger.error("Error in " + sep.getWmoHeader().getWmoHeader()); + } + logger.error("Exception while creating SgwhvSeparator", e); + } + + /* + * Process BUFR SGWHV and add to the database. + */ + List pdoList = new ArrayList(); + int subsetNum = 0; + while (sep.hasNext()) { + subsetNum++; + sgwhvRec = SgwhvParser.processSgwhv(sep, subsetNum); + if (sgwhvRec != null) { + try { + sgwhvRec.setPluginName(pluginName); + sgwhvRec.constructDataURI(); + sgwhvRec.setReportType("SGWHV"); + } catch (PluginException e) { + logger.error("Error constructing dataURI", e); + } + } + if (!pdoList.contains(sgwhvRec)) { + pdoList.add(sgwhvRec); + } + } + logger.info("Processed " + subsetNum + " subsets"); + return pdoList.toArray(new PluginDataObject[pdoList.size()]); + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvSeparator.java index 8f35791d65..ed1a6aeeca 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/decoder/SgwhvSeparator.java @@ -1,165 +1,165 @@ -/** - * This class sets the BUFR Sgwhv section 4 data in an array for parsing. - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#     Engineer    Description
    - * -------		-------		--------	-----------
    - * 08/23/11					Chin J Chen	Initial coding from BufrSgwhvSeparator
    - * 
    - * - * @author Chin J. Chen - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.sgwhv.decoder; - -import gov.noaa.nws.ncep.edex.plugin.sgwhv.util.SgwhvDescriptorDelegate; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.uf.edex.decodertools.bufr.BUFRDataDocument; -import com.raytheon.uf.edex.decodertools.bufr.BUFRDocument; -import com.raytheon.uf.edex.decodertools.bufr.BUFRFile; -import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; -import com.raytheon.uf.edex.decodertools.bufr.packets.BUFRSublistPacket; -import com.raytheon.uf.edex.decodertools.bufr.packets.IBUFRDataPacket; -import com.raytheon.uf.edex.wmo.message.WMOHeader; - -public class SgwhvSeparator extends AbstractRecordSeparator implements - IDescriptorFactorySelector { - - private Log logger = LogFactory.getLog(getClass()); - - private WMOHeader wmoHeader = null; - - // Raw message data - private byte[] messageData = null; - - // List of BUFR documents created from the physical message - private List records = null; - - // Pointer to the current BUFR document to be processed. - private int currentRecord = -1; - - /* - * - * (non-Javadoc) - * - * @see java.util.Iterator#next() - */ - public Object next() { - BUFRDataDocument data = null; - if (hasNext()) { - data = records.get(currentRecord); - currentRecord++; - } - return data; - } - - /** - * Is there another record available? - * - * @return Is there another record available? - */ - @Override - public boolean hasNext() { - boolean hasMore = (records != null); - hasMore = hasMore && (records.size() > 0); - hasMore = hasMore && (currentRecord < records.size()); - return hasMore; - } - - /** - * Set the raw BUFR data and invoke the internal message separation process. - * - * @param bufrData - * The Sgwhv BUFR data. - */ - @Override - public void setData(byte[] bufrData, Headers headers) { - currentRecord = -1; - try { - if (bufrData != null) { - wmoHeader = new WMOHeader(bufrData); - int start = 0; - int len = bufrData.length - start; - messageData = new byte[len]; - System.arraycopy(bufrData, start, messageData, 0, len); - decodeBUFRData(); - } - } finally { - if ((records != null) && (records.size() > 0)) { - currentRecord = 0; - } - } - } - - /** - * Get the WMO header associated with the message data. - * - * @return The WMO header. - */ - public WMOHeader getWmoHeader() { - return wmoHeader; - } - - /** - * Decode the entire physical file that was used to create this separator. - */ - @SuppressWarnings("unchecked") - private void decodeBUFRData() { - BUFRFile bfile = new BUFRFile(messageData, - new SgwhvDescriptorDelegate(this)); - records = new ArrayList(); - int bulletinNumber = 1; - - /* - * Create an arrayList which stores all the binary records of the - * Sgwhv data. - * - * bulletin: a block of SgwhvSgwhv data, including Sections 0 to 5, - * which starts with WMO header and an indicator key word "BUFR". A BUFR - * file may contain multiple bulletins. sgwhvData: Section 4 - * SGWHV data (BUFRDataDocument) in one bulletin which may contain - * multiple Bufrs records. record: one SGWHV record which contains - * multiple parameters, e.g., TMPK, RELH, etc. - */ - for (BUFRDocument bulletin : bfile) { - logger.debug("Executing bulletin " + bulletinNumber); - BUFRDataDocument bufrsgwhvData = bulletin.execute(); - List idps = bufrsgwhvData.getList(); - logger.debug("Number of records = " + idps.size() + " in bulletin " - + bulletinNumber); - bulletinNumber++; - for (IBUFRDataPacket record : idps) { - if (record != null) { - if (record instanceof BUFRSublistPacket) { - List idps2 = (List) record - .getValue(); - BUFRDataDocument dd = new BUFRDataDocument(idps2); - records.add(dd); - } - } - } - } - } - - /** - * Get the selector value associated with this separator. - * - * @return The selector associated with this separator. - */ - @Override - public String getSelector() { - return null; - } +/** + * This class sets the BUFR Sgwhv section 4 data in an array for parsing. + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#     Engineer    Description
    + * -------		-------		--------	-----------
    + * 08/23/11					Chin J Chen	Initial coding from BufrSgwhvSeparator
    + * 
    + * + * @author Chin J. Chen + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.sgwhv.decoder; + +import gov.noaa.nws.ncep.edex.plugin.sgwhv.util.SgwhvDescriptorDelegate; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.uf.edex.decodertools.bufr.BUFRDataDocument; +import com.raytheon.uf.edex.decodertools.bufr.BUFRDocument; +import com.raytheon.uf.edex.decodertools.bufr.BUFRFile; +import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; +import com.raytheon.uf.edex.decodertools.bufr.packets.BUFRSublistPacket; +import com.raytheon.uf.edex.decodertools.bufr.packets.IBUFRDataPacket; +import com.raytheon.uf.edex.wmo.message.WMOHeader; + +public class SgwhvSeparator extends AbstractRecordSeparator implements + IDescriptorFactorySelector { + + private Log logger = LogFactory.getLog(getClass()); + + private WMOHeader wmoHeader = null; + + // Raw message data + private byte[] messageData = null; + + // List of BUFR documents created from the physical message + private List records = null; + + // Pointer to the current BUFR document to be processed. + private int currentRecord = -1; + + /* + * + * (non-Javadoc) + * + * @see java.util.Iterator#next() + */ + public Object next() { + BUFRDataDocument data = null; + if (hasNext()) { + data = records.get(currentRecord); + currentRecord++; + } + return data; + } + + /** + * Is there another record available? + * + * @return Is there another record available? + */ + @Override + public boolean hasNext() { + boolean hasMore = (records != null); + hasMore = hasMore && (records.size() > 0); + hasMore = hasMore && (currentRecord < records.size()); + return hasMore; + } + + /** + * Set the raw BUFR data and invoke the internal message separation process. + * + * @param bufrData + * The Sgwhv BUFR data. + */ + @Override + public void setData(byte[] bufrData, Headers headers) { + currentRecord = -1; + try { + if (bufrData != null) { + wmoHeader = new WMOHeader(bufrData); + int start = 0; + int len = bufrData.length - start; + messageData = new byte[len]; + System.arraycopy(bufrData, start, messageData, 0, len); + decodeBUFRData(); + } + } finally { + if ((records != null) && (records.size() > 0)) { + currentRecord = 0; + } + } + } + + /** + * Get the WMO header associated with the message data. + * + * @return The WMO header. + */ + public WMOHeader getWmoHeader() { + return wmoHeader; + } + + /** + * Decode the entire physical file that was used to create this separator. + */ + @SuppressWarnings("unchecked") + private void decodeBUFRData() { + BUFRFile bfile = new BUFRFile(messageData, + new SgwhvDescriptorDelegate(this)); + records = new ArrayList(); + int bulletinNumber = 1; + + /* + * Create an arrayList which stores all the binary records of the + * Sgwhv data. + * + * bulletin: a block of SgwhvSgwhv data, including Sections 0 to 5, + * which starts with WMO header and an indicator key word "BUFR". A BUFR + * file may contain multiple bulletins. sgwhvData: Section 4 + * SGWHV data (BUFRDataDocument) in one bulletin which may contain + * multiple Bufrs records. record: one SGWHV record which contains + * multiple parameters, e.g., TMPK, RELH, etc. + */ + for (BUFRDocument bulletin : bfile) { + logger.debug("Executing bulletin " + bulletinNumber); + BUFRDataDocument bufrsgwhvData = bulletin.execute(); + List idps = bufrsgwhvData.getList(); + logger.debug("Number of records = " + idps.size() + " in bulletin " + + bulletinNumber); + bulletinNumber++; + for (IBUFRDataPacket record : idps) { + if (record != null) { + if (record instanceof BUFRSublistPacket) { + List idps2 = (List) record + .getValue(); + BUFRDataDocument dd = new BUFRDataDocument(idps2); + records.add(dd); + } + } + } + } + } + + /** + * Get the selector value associated with this separator. + * + * @return The selector associated with this separator. + */ + @Override + public String getSelector() { + return null; + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/util/SgwhvDescriptorDelegate.java b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/util/SgwhvDescriptorDelegate.java index a5f0e0c911..fd3dce36f6 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/util/SgwhvDescriptorDelegate.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.sgwhv/src/gov/noaa/nws/ncep/edex/plugin/sgwhv/util/SgwhvDescriptorDelegate.java @@ -1,42 +1,42 @@ -/** - * - * SgwhvDescriptorDelegate - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#     Engineer    Description
    - * -------		-------		--------	-----------
    - * 08/23/11					Chin J Chen	Initial coding from BufrSgwhvDescriptorDelegate
    - * 
    - * - * @author Chin J. Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.edex.plugin.sgwhv.util; - -import com.raytheon.uf.edex.decodertools.bufr.descriptors.DescriptorFactory; -import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactoryDelegate; -import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; - -public class SgwhvDescriptorDelegate implements IDescriptorFactoryDelegate { - - private DescriptorFactory factory = new DescriptorFactory(); - IDescriptorFactorySelector factorySelector = null; - - public SgwhvDescriptorDelegate(IDescriptorFactorySelector selector) { - factorySelector = selector; - } - - @Override - public DescriptorFactory getInstance() { - return factory; - } - - @Override - public void setDescriptorFactorySelector(IDescriptorFactorySelector selector) { - factorySelector = selector; - } - -} +/** + * + * SgwhvDescriptorDelegate + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#     Engineer    Description
    + * -------		-------		--------	-----------
    + * 08/23/11					Chin J Chen	Initial coding from BufrSgwhvDescriptorDelegate
    + * 
    + * + * @author Chin J. Chen + * @version 1.0 + */ +package gov.noaa.nws.ncep.edex.plugin.sgwhv.util; + +import com.raytheon.uf.edex.decodertools.bufr.descriptors.DescriptorFactory; +import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactoryDelegate; +import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; + +public class SgwhvDescriptorDelegate implements IDescriptorFactoryDelegate { + + private DescriptorFactory factory = new DescriptorFactory(); + IDescriptorFactorySelector factorySelector = null; + + public SgwhvDescriptorDelegate(IDescriptorFactorySelector selector) { + factorySelector = selector; + } + + @Override + public DescriptorFactory getInstance() { + return factory; + } + + @Override + public void setDescriptorFactorySelector(IDescriptorFactorySelector selector) { + factorySelector = selector; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/gov.noaa.nws.ncep.edex.plugin.ssha.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/gov.noaa.nws.ncep.edex.plugin.ssha.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaDecoder.java index 818469c7d5..cd1fc904d2 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaDecoder.java @@ -1,99 +1,99 @@ -/** - * BufrSshaDecoder - * - * This java class decodes SSHA (Sea Surface Height Anomaly) BUFR data. - * - **
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#     Engineer    Description
    - * -------		-------		--------	-----------
    - * 09/11					Chin J Chen   Initial coding from BufrSshaDecoder
    - * 
    - * - * @author Chin J. Chen - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.ssha.decoder; - -import gov.noaa.nws.ncep.common.dataplugin.ssha.SshaRecord; -import gov.noaa.nws.ncep.edex.plugin.ssha.util.SshaParser; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.exception.DecoderException; -import com.raytheon.edex.plugin.AbstractDecoder; -import com.raytheon.edex.plugin.IBinaryDecoder; -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.PluginException; - -public class SshaDecoder extends AbstractDecoder implements IBinaryDecoder { - private static String pluginName; - - private Log logger = LogFactory.getLog(getClass()); - - /** - * Empty constructor required by DecoderFactory. - * - * @throws DecoderException - */ - public SshaDecoder(String name) throws DecoderException { - pluginName = name; - } - - /** - * Decode the next SSHA BUFR record. - * - * @return One record of decoded data. - * @throws DecoderException - * Thrown if no data is available. - */ - public PluginDataObject[] decode(byte[] bufrData) throws DecoderException { - SshaRecord sshaRec; - SshaSeparator sep = new SshaSeparator(); - - try { - if (bufrData != null) { - sep.setData(bufrData, null); - } else { - logger.info("No data to decode while creating SshaSeparator"); - } - } catch (Exception e) { - // need to catch any number of exceptions. Report them here - // instead of letting them kill the PluginDataProxy. - if (sep != null) { - logger.error("Error in " + sep); - } - logger.error("Exception while creating SshaSeparator", e); - } - - /* - * Process BufrSsha raw data and add to the database. - */ - List pdoList = new ArrayList(); - int subsetNum = 0; - while (sep.hasNext()) { - subsetNum++; - sshaRec = SshaParser.processSsha(sep, subsetNum); - if (sshaRec != null) { - try { - sshaRec.setPluginName(pluginName); - sshaRec.constructDataURI(); - sshaRec.setReportType("BUFRSSHA"); - } catch (PluginException e) { - logger.error("Error constructing dataURI", e); - } - } - if (!pdoList.contains(sshaRec)) { - pdoList.add(sshaRec); - } - } - logger.info("Processed " + subsetNum + " subsets"); - return pdoList.toArray(new PluginDataObject[pdoList.size()]); - } -} +/** + * BufrSshaDecoder + * + * This java class decodes SSHA (Sea Surface Height Anomaly) BUFR data. + * + **
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#     Engineer    Description
    + * -------		-------		--------	-----------
    + * 09/11					Chin J Chen   Initial coding from BufrSshaDecoder
    + * 
    + * + * @author Chin J. Chen + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.ssha.decoder; + +import gov.noaa.nws.ncep.common.dataplugin.ssha.SshaRecord; +import gov.noaa.nws.ncep.edex.plugin.ssha.util.SshaParser; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.exception.DecoderException; +import com.raytheon.edex.plugin.AbstractDecoder; +import com.raytheon.edex.plugin.IBinaryDecoder; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.PluginException; + +public class SshaDecoder extends AbstractDecoder implements IBinaryDecoder { + private static String pluginName; + + private Log logger = LogFactory.getLog(getClass()); + + /** + * Empty constructor required by DecoderFactory. + * + * @throws DecoderException + */ + public SshaDecoder(String name) throws DecoderException { + pluginName = name; + } + + /** + * Decode the next SSHA BUFR record. + * + * @return One record of decoded data. + * @throws DecoderException + * Thrown if no data is available. + */ + public PluginDataObject[] decode(byte[] bufrData) throws DecoderException { + SshaRecord sshaRec; + SshaSeparator sep = new SshaSeparator(); + + try { + if (bufrData != null) { + sep.setData(bufrData, null); + } else { + logger.info("No data to decode while creating SshaSeparator"); + } + } catch (Exception e) { + // need to catch any number of exceptions. Report them here + // instead of letting them kill the PluginDataProxy. + if (sep != null) { + logger.error("Error in " + sep); + } + logger.error("Exception while creating SshaSeparator", e); + } + + /* + * Process BufrSsha raw data and add to the database. + */ + List pdoList = new ArrayList(); + int subsetNum = 0; + while (sep.hasNext()) { + subsetNum++; + sshaRec = SshaParser.processSsha(sep, subsetNum); + if (sshaRec != null) { + try { + sshaRec.setPluginName(pluginName); + sshaRec.constructDataURI(); + sshaRec.setReportType("BUFRSSHA"); + } catch (PluginException e) { + logger.error("Error constructing dataURI", e); + } + } + if (!pdoList.contains(sshaRec)) { + pdoList.add(sshaRec); + } + } + logger.info("Processed " + subsetNum + " subsets"); + return pdoList.toArray(new PluginDataObject[pdoList.size()]); + } +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaSeparator.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaSeparator.java index 0a35f55f2f..8599496a0d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaSeparator.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/SshaSeparator.java @@ -1,154 +1,154 @@ -/** - * This class sets the BUFR Ssha section 4 data in an array for parsing. - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#     Engineer    Description
    - * -------		-------		--------	-----------
    - * 09/11					Chin J Chen	Initial coding from BufrSshaSeparator
    - * 
    - * - * @author Chin J. Chen - * @version 1.0 - */ - -package gov.noaa.nws.ncep.edex.plugin.ssha.decoder; - -import gov.noaa.nws.ncep.edex.plugin.ssha.util.SshaDescriptorDelegate; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.edex.esb.Headers; -import com.raytheon.edex.plugin.AbstractRecordSeparator; -import com.raytheon.uf.edex.decodertools.bufr.BUFRDataDocument; -import com.raytheon.uf.edex.decodertools.bufr.BUFRDocument; -import com.raytheon.uf.edex.decodertools.bufr.BUFRFile; -import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; -import com.raytheon.uf.edex.decodertools.bufr.packets.BUFRSublistPacket; -import com.raytheon.uf.edex.decodertools.bufr.packets.IBUFRDataPacket; - -public class SshaSeparator extends AbstractRecordSeparator implements - IDescriptorFactorySelector { - - private Log logger = LogFactory.getLog(getClass()); - - // Raw message data - private byte[] messageData = null; - - // List of BUFR documents created from the physical message - private List records = null; - - // Pointer to the current BUFR document to be processed. - private int currentRecord = -1; - - /* - * - * (non-Javadoc) - * - * @see java.util.Iterator#next() - */ - public Object next() { - BUFRDataDocument data = null; - if (hasNext()) { - data = records.get(currentRecord); - currentRecord++; - } - return data; - } - - /** - * Is there another record available? - * - * @return Is there another record available? - */ - @Override - public boolean hasNext() { - boolean hasMore = (records != null); - hasMore = hasMore && (records.size() > 0); - hasMore = hasMore && (currentRecord < records.size()); - return hasMore; - } - - /** - * Set the raw BUFR data and invoke the internal message separation process. - * - * @param bufrData - * The BufrSsha BUFR data. - */ - @Override - public void setData(byte[] bufrData, Headers headers) { - currentRecord = -1; - try { - if (bufrData != null) { - ; - int start = 0; - int len = bufrData.length - start; - messageData = new byte[len]; - System.arraycopy(bufrData, start, messageData, 0, len); - decodeBUFRData(); - } - } finally { - if ((records != null) && (records.size() > 0)) { - currentRecord = 0; - } - } - } - - /** - * Decode the entire physical file that was used to create this separator. - */ - @SuppressWarnings("unchecked") - private void decodeBUFRData() { - BUFRFile bfile = new BUFRFile(messageData, - new SshaDescriptorDelegate(this)); - records = new ArrayList(); - int bulletinNumber = 1; - - /* - * Create an arrayList which stores all the binary records of the - * BufrSsha data. - * - * bulletin: a block of BufrSsha data, including Sections 0 to 5, which - * starts with WMO header and an indicator key word "BUFR". A BUFR file - * may contain multiple bulletins. bufrsshaData: Section 4 BufrSsha data - * (BUFRDataDocument) in one bulletin which may contain multiple Bufr - * records. record: one BufrSsha record which contains multiple - * parameters, e.g., MSSH, TMBRST, SSHA. etc. - */ - for (BUFRDocument bulletin : bfile) { - logger.debug("Executing bulletin " + bulletinNumber); - BUFRDataDocument bufrsshaData = bulletin.execute(); - List idps = bufrsshaData.getList(); - logger.debug("Number of records = " + idps.size() + " in bulletin " - + bulletinNumber); - bulletinNumber++; - for (IBUFRDataPacket record : idps) { - if (record != null) { - if (record instanceof BUFRSublistPacket) { - List idps2 = (List) record - .getValue(); - BUFRDataDocument dd = new BUFRDataDocument(idps2); - records.add(dd); - } - } - } - } - } - - /** - * Get the selector value associated with this separator. - * - * @return The selector associated with this separator. - */ - @Override - public String getSelector() { - String retValue = "SSHA"; - return retValue; - } +/** + * This class sets the BUFR Ssha section 4 data in an array for parsing. + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#     Engineer    Description
    + * -------		-------		--------	-----------
    + * 09/11					Chin J Chen	Initial coding from BufrSshaSeparator
    + * 
    + * + * @author Chin J. Chen + * @version 1.0 + */ + +package gov.noaa.nws.ncep.edex.plugin.ssha.decoder; + +import gov.noaa.nws.ncep.edex.plugin.ssha.util.SshaDescriptorDelegate; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.edex.esb.Headers; +import com.raytheon.edex.plugin.AbstractRecordSeparator; +import com.raytheon.uf.edex.decodertools.bufr.BUFRDataDocument; +import com.raytheon.uf.edex.decodertools.bufr.BUFRDocument; +import com.raytheon.uf.edex.decodertools.bufr.BUFRFile; +import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; +import com.raytheon.uf.edex.decodertools.bufr.packets.BUFRSublistPacket; +import com.raytheon.uf.edex.decodertools.bufr.packets.IBUFRDataPacket; + +public class SshaSeparator extends AbstractRecordSeparator implements + IDescriptorFactorySelector { + + private Log logger = LogFactory.getLog(getClass()); + + // Raw message data + private byte[] messageData = null; + + // List of BUFR documents created from the physical message + private List records = null; + + // Pointer to the current BUFR document to be processed. + private int currentRecord = -1; + + /* + * + * (non-Javadoc) + * + * @see java.util.Iterator#next() + */ + public Object next() { + BUFRDataDocument data = null; + if (hasNext()) { + data = records.get(currentRecord); + currentRecord++; + } + return data; + } + + /** + * Is there another record available? + * + * @return Is there another record available? + */ + @Override + public boolean hasNext() { + boolean hasMore = (records != null); + hasMore = hasMore && (records.size() > 0); + hasMore = hasMore && (currentRecord < records.size()); + return hasMore; + } + + /** + * Set the raw BUFR data and invoke the internal message separation process. + * + * @param bufrData + * The BufrSsha BUFR data. + */ + @Override + public void setData(byte[] bufrData, Headers headers) { + currentRecord = -1; + try { + if (bufrData != null) { + ; + int start = 0; + int len = bufrData.length - start; + messageData = new byte[len]; + System.arraycopy(bufrData, start, messageData, 0, len); + decodeBUFRData(); + } + } finally { + if ((records != null) && (records.size() > 0)) { + currentRecord = 0; + } + } + } + + /** + * Decode the entire physical file that was used to create this separator. + */ + @SuppressWarnings("unchecked") + private void decodeBUFRData() { + BUFRFile bfile = new BUFRFile(messageData, + new SshaDescriptorDelegate(this)); + records = new ArrayList(); + int bulletinNumber = 1; + + /* + * Create an arrayList which stores all the binary records of the + * BufrSsha data. + * + * bulletin: a block of BufrSsha data, including Sections 0 to 5, which + * starts with WMO header and an indicator key word "BUFR". A BUFR file + * may contain multiple bulletins. bufrsshaData: Section 4 BufrSsha data + * (BUFRDataDocument) in one bulletin which may contain multiple Bufr + * records. record: one BufrSsha record which contains multiple + * parameters, e.g., MSSH, TMBRST, SSHA. etc. + */ + for (BUFRDocument bulletin : bfile) { + logger.debug("Executing bulletin " + bulletinNumber); + BUFRDataDocument bufrsshaData = bulletin.execute(); + List idps = bufrsshaData.getList(); + logger.debug("Number of records = " + idps.size() + " in bulletin " + + bulletinNumber); + bulletinNumber++; + for (IBUFRDataPacket record : idps) { + if (record != null) { + if (record instanceof BUFRSublistPacket) { + List idps2 = (List) record + .getValue(); + BUFRDataDocument dd = new BUFRDataDocument(idps2); + records.add(dd); + } + } + } + } + } + + /** + * Get the selector value associated with this separator. + * + * @return The selector associated with this separator. + */ + @Override + public String getSelector() { + String retValue = "SSHA"; + return retValue; + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/package-info.java index 924278a562..84ced98d3c 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/decoder/package-info.java @@ -1,7 +1,7 @@ -/** - * SSHA implementation of the plugin pattern. - * - * Package includes classes to decode the SSHA message and persist the data. - * - */ +/** + * SSHA implementation of the plugin pattern. + * + * Package includes classes to decode the SSHA message and persist the data. + * + */ package gov.noaa.nws.ncep.edex.plugin.ssha.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/util/SshaDescriptorDelegate.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/util/SshaDescriptorDelegate.java index f9d4cd8c78..3a15a543c7 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/util/SshaDescriptorDelegate.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ssha/src/gov/noaa/nws/ncep/edex/plugin/ssha/util/SshaDescriptorDelegate.java @@ -1,87 +1,87 @@ -/** - * - * SshaDescriptorDelegate - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#     Engineer    Description
    - * -------		-------		--------	-----------
    - * 08/23/11					Chin J Chen	Initial coding from BufrSshaDescriptorDelegate
    - * 
    - * - * @author Chin J. Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.edex.plugin.ssha.util; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.uf.edex.decodertools.bufr.descriptors.DescriptorFactory; -import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactoryDelegate; -import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; - -public class SshaDescriptorDelegate implements IDescriptorFactoryDelegate { - - private static Log logger = LogFactory.getLog(SshaDescriptorDelegate.class); - IDescriptorFactorySelector factorySelector = null; - - private static Map factories; - static { - factories = new HashMap(); - factories.put("SSHA", createFactory("SSHABufrTable_B", "SSHABufrTable_D")); - } - - public SshaDescriptorDelegate(IDescriptorFactorySelector selector) { - factorySelector = selector; - } - - @Override - public DescriptorFactory getInstance() { - DescriptorFactory factory = null; // defaultFactory; - - String selector = null; - if (factorySelector != null) { - selector = factorySelector.getSelector(); - } - logger.debug ("Getting DescriptorFactory for type " + selector); - - factory = factories.get(selector); - if (factory == null) { - factory = new DescriptorFactory(); - } - return factory; - } - - @Override - public void setDescriptorFactorySelector(IDescriptorFactorySelector selector) { - factorySelector = selector; - } - - /** - * - * @param resourceClassReference - * Class reference table resources will be loaded from. - * @param tableB - * Name of BUFR table B. - * @param tableD - * Name of BUFR table D. - * @return - */ - private static final DescriptorFactory createFactory(String tableB, - String tableD) { - DescriptorFactory factory = null; - logger.debug ("Creating table " + tableB + " " + tableD); - factory = new DescriptorFactory(SshaDescriptorDelegate.class, tableB, - tableD); - logger.debug ("Table created = [" + (factory != null) + "]"); - return factory; - } - - -} +/** + * + * SshaDescriptorDelegate + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#     Engineer    Description
    + * -------		-------		--------	-----------
    + * 08/23/11					Chin J Chen	Initial coding from BufrSshaDescriptorDelegate
    + * 
    + * + * @author Chin J. Chen + * @version 1.0 + */ +package gov.noaa.nws.ncep.edex.plugin.ssha.util; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.raytheon.uf.edex.decodertools.bufr.descriptors.DescriptorFactory; +import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactoryDelegate; +import com.raytheon.uf.edex.decodertools.bufr.descriptors.IDescriptorFactorySelector; + +public class SshaDescriptorDelegate implements IDescriptorFactoryDelegate { + + private static Log logger = LogFactory.getLog(SshaDescriptorDelegate.class); + IDescriptorFactorySelector factorySelector = null; + + private static Map factories; + static { + factories = new HashMap(); + factories.put("SSHA", createFactory("SSHABufrTable_B", "SSHABufrTable_D")); + } + + public SshaDescriptorDelegate(IDescriptorFactorySelector selector) { + factorySelector = selector; + } + + @Override + public DescriptorFactory getInstance() { + DescriptorFactory factory = null; // defaultFactory; + + String selector = null; + if (factorySelector != null) { + selector = factorySelector.getSelector(); + } + logger.debug ("Getting DescriptorFactory for type " + selector); + + factory = factories.get(selector); + if (factory == null) { + factory = new DescriptorFactory(); + } + return factory; + } + + @Override + public void setDescriptorFactorySelector(IDescriptorFactorySelector selector) { + factorySelector = selector; + } + + /** + * + * @param resourceClassReference + * Class reference table resources will be loaded from. + * @param tableB + * Name of BUFR table B. + * @param tableD + * Name of BUFR table D. + * @return + */ + private static final DescriptorFactory createFactory(String tableB, + String tableD) { + DescriptorFactory factory = null; + logger.debug ("Creating table " + tableB + " " + tableD); + factory = new DescriptorFactory(SshaDescriptorDelegate.class, tableB, + tableD); + logger.debug ("Table created = [" + (factory != null) + "]"); + return factory; + } + + +} diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.stormtrack/gov.noaa.nws.ncep.edex.plugin.stormtrack.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.stormtrack/gov.noaa.nws.ncep.edex.plugin.stormtrack.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.stormtrack/src/gov/noaa/nws/ncep/edex/plugin/stormtrack/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.stormtrack/src/gov/noaa/nws/ncep/edex/plugin/stormtrack/decoder/package-info.java index 6b5a489ea7..73994f1ba4 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.stormtrack/src/gov/noaa/nws/ncep/edex/plugin/stormtrack/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.stormtrack/src/gov/noaa/nws/ncep/edex/plugin/stormtrack/decoder/package-info.java @@ -1,7 +1,7 @@ -/** - * SGWH implementation of the plugin pattern. - * - * Package includes classes to decode the StormTrack message and persist the data. - * - */ +/** + * SGWH implementation of the plugin pattern. + * + * Package includes classes to decode the StormTrack message and persist the data. + * + */ package gov.noaa.nws.ncep.edex.plugin.stormtrack.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.tcm/gov.noaa.nws.ncep.edex.plugin.tcm.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.tcm/gov.noaa.nws.ncep.edex.plugin.tcm.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.wcp/gov.noaa.nws.ncep.edex.plugin.wcp.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.wcp/gov.noaa.nws.ncep.edex.plugin.wcp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.wcp/src/gov/noaa/nws/ncep/edex/plugin/wcp/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.wcp/src/gov/noaa/nws/ncep/edex/plugin/wcp/decoder/package-info.java index f52fb89e82..f3fea73665 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.wcp/src/gov/noaa/nws/ncep/edex/plugin/wcp/decoder/package-info.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.wcp/src/gov/noaa/nws/ncep/edex/plugin/wcp/decoder/package-info.java @@ -1,7 +1,7 @@ -/** - * WCP implementation of the plugin pattern. - * - * Package includes classes to decode the WCP message and persist the data. - * - */ +/** + * WCP implementation of the plugin pattern. + * + * Package includes classes to decode the WCP message and persist the data. + * + */ package gov.noaa.nws.ncep.edex.plugin.wcp.decoder; \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.purgeutil/gov.noaa.nws.ncep.edex.purgeutil.ecl b/ncep/gov.noaa.nws.ncep.edex.purgeutil/gov.noaa.nws.ncep.edex.purgeutil.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.edex.uengine/META-INF/MANIFEST.MF index 16c2d33264..23980f3bf8 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/META-INF/MANIFEST.MF +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/META-INF/MANIFEST.MF @@ -31,14 +31,15 @@ Export-Package: gov.noaa.nws.ncep.edex.uengine.output, gov.noaa.nws.ncep.edex.uengine.utility Import-Package: com.raytheon.edex.plugin.modelsounding.common, com.raytheon.uf.common.dataplugin.bufrua, + com.raytheon.uf.common.dataplugin.bufrua.dao, com.raytheon.uf.common.dataplugin.level, com.raytheon.uf.common.pointdata, com.raytheon.uf.common.pointdata.spatial, com.raytheon.uf.edex.pointdata, gov.noaa.nws.ncep.common.tools, + gov.noaa.nws.ncep.edex.common.metparameters, gov.noaa.nws.ncep.edex.common.metparameters.parameterconversion, gov.noaa.nws.ncep.edex.plugin.ncgrib.dao, - gov.noaa.nws.ncep.edex.common.metparameters, javax.measure.converter, javax.measure.unit, org.apache.commons.logging, diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/gov.noaa.nws.ncep.edex.uengine.ecl b/ncep/gov.noaa.nws.ncep.edex.uengine/gov.noaa.nws.ncep.edex.uengine.ecl new file mode 100644 index 0000000000..e69de29bb2 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 051e98c149..a9cf65cb20 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 @@ -13,6 +13,9 @@ package gov.noaa.nws.ncep.edex.uengine.tasks.profile; * Date Ticket# Engineer Description * ------- ------- -------- ----------- * 04/04/2011 301 Chin Chen Initial coding + * 02/28/2012 Chin Chen modify several sounding query algorithms for better performance + * 03/28/2012 Chin Chen Add new API to support query multiple Points at one shoot and using + * dataStore.retrieveGroups() * *
    * @@ -24,11 +27,13 @@ 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.common.dataplugin.ncgrib.NcgribModel; import gov.noaa.nws.ncep.common.dataplugin.ncgrib.NcgribRecord; import java.util.ArrayList; import java.util.List; import javax.measure.converter.UnitConverter; +import javax.measure.unit.NonSI; import javax.measure.unit.SI; import com.raytheon.edex.plugin.modelsounding.common.SoundingSite; import com.raytheon.uf.edex.database.DataAccessLayerException; @@ -67,7 +72,8 @@ public class MdlSoundingQuery { private static final String NCGRIB_TBL_NAME = "ncgrib"; private static final String D2DGRIB_TBL_NAME = "grib"; - private static String NC_PARMS = "HGHT, UREL, VREL, TMPK, DWPK, SPFH, OMEG, RELH"; + private static String NC_PARMS = "HGHT, UREL, VREL, TMPK, OMEG, RELH"; + //private static String NC_PARMS = "HGHT, UREL, VREL, TMPK, DWPK, SPFH, OMEG, RELH"; private static String D2D_PARMS = "GH, uW, vW,T, DWPK, SPFH,OMEG, RH"; private enum NcParmNames { HGHT, UREL, VREL, TMPK, DWPK, SPFH, OMEG, RELH @@ -80,6 +86,7 @@ public class MdlSoundingQuery { public static UnitConverter kelvinToCelsius = SI.KELVIN .getConverterTo(SI.CELSIUS); + private static final UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND.getConverterTo(NonSI.KNOT); public static NcSoundingTimeLines getMdlSndTimeLine(String mdlType, String currentDBTblName) { @@ -127,7 +134,7 @@ public class MdlSoundingQuery { String queryStr = new String("Select Distinct rangestart FROM " + currentDBTblName + " where modelname='" + mdlType + "' AND " + "reftime='" + refTimeStr + ":00:00'" - + " ORDER BY rangestart DESC"); + + " ORDER BY rangestart"); System.out.println("queryStr " + queryStr); CoreDao dao = new CoreDao(DaoConfig.forClass(SoundingSite.class)); @@ -141,7 +148,7 @@ public class MdlSoundingQuery { query.setDistinctField("dataTime.validPeriod.start"); query.addParameter("modelInfo.modelName", mdlType); query.addParameter("dataTime.refTime", refTimeStr + ":00:00"); - query.setSortBy("dataTime.validPeriod.start", false); + query.setSortBy("dataTime.validPeriod.start", true); @SuppressWarnings("unchecked") List recList = (List) query.execute(); tl.setTimeLines(recList.toArray()); @@ -169,6 +176,96 @@ public class MdlSoundingQuery { // mdlName); // } + /** + * Returns a list of profile for location (lat,lon) array, time, and model for + * grib or ncgrib data. + * + * @param double[][] latLonArray, e.g. at nth element, lat=[n][0], lon=[n][1] + * @param refTimeCal + * data record reference time + * @param validTimeCal + * data record valid time + * @param pluginName + * the name of the data table ('grib' or 'ncgrib') + * @param mdlName + * the name of the model + * @return the profile + * created @ 3/28/2012 + */ + public static List getMdlSndDataProfileList(double[][] latLonArray, + String refTime, String validTime, String pluginName, String mdlName) { + double lat, lon; + //System.out.println("getMdlSndData lat=" + lat + " lon="+lon); + long t01 = System.currentTimeMillis(); + NcSoundingProfile pf = new NcSoundingProfile(); + //NcSoundingCube cube = new NcSoundingCube(); + List soundingProfileList = new ArrayList(); + List levels = getModelLevels(refTime, validTime, pluginName, mdlName); + if (levels.size() == 0) { + System.out.println("getModelLevels return 0; file=" + refTime+ " stime="+validTime + " gribtype="+ pluginName + " modeltype="+mdlName); + return soundingProfileList; + } + //System.out.println("getModelLevels = "+ levels.size()+" levels, took "+ (System.currentTimeMillis()-t01) + " ms"); + + List points = new ArrayList(); + for(int k =0; k< latLonArray.length; k++){ + lat=latLonArray[k][0]; + lon=latLonArray[k][1] ; + Point pnt = getLatLonIndices(lat, lon, refTime, validTime, levels.get(0).toString(), + pluginName, mdlName); + if (pnt == null) { + System.out.println("getLatLonIndices return 0; lat=" + lat + " lon="+lon+" stime="+validTime + " gribtype="+ pluginName + " modeltype="+mdlName); + } + else{ + points.add(pnt); + } + } + if(points.size()==0){ + return soundingProfileList; + } + long t011 = System.currentTimeMillis(); + soundingProfileList = queryProfileListByPointGroup(points, + refTime, validTime, pluginName, mdlName, levels); + System.out.println("queryProfileListByPointGroup took "+ (System.currentTimeMillis()-t011) + " ms"); + + return soundingProfileList; + /* The floowing should be done in queryProfileListByPointGroup() + //System.out.println("getModelSoundingLayerList= "+ layerList.size()+ " layers, took "+ (System.currentTimeMillis()-t012) + " ms"); + //pf.setStationLatitude( lat); + //pf.setStationLongitude( lon); + //Float sfcPressure = getModelSfcPressure(pnt, refTime, validTime, + // pluginName, mdlName); + //System.out.println("getModelSfcPressure took "+ (System.currentTimeMillis()-t013) + " ms"); + //if (sfcPressure == null) { + // pf.setSfcPress(-9999.f); + //} + //else { + // if (pluginName.equalsIgnoreCase(D2DGRIB_TBL_NAME)) + // pf.setSfcPress(sfcPressure/100F); + // else + // pf.setSfcPress(sfcPressure); + //} + //System.out.println("surface pressure ="+pf.getSfcPress()+ " lat= "+lat+ " lon="+lon); + //calculate dew point if necessary + long t014 = System.currentTimeMillis(); + MergeSounding ms = new MergeSounding(); + //ms.spfhToDewpoint(layerList); + ms.rhToDewpoint(layerList); + System.out.println("MergeSounding took "+ (System.currentTimeMillis()-t014) + " ms"); + + + pf.setSoundingLyLst(layerList); + + + soundingProfileList.add(pf); + //cube.setSoundingProfileList(soundingProfileList); + //cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + long t02 = System.currentTimeMillis(); + System.out.println("MDL cube retreival took " + (t02 - t01)); + return pf; + */ + + } /** * Returns a profile for a specified location (lat,lon), time, and model for * grib or ncgrib data. @@ -186,20 +283,20 @@ public class MdlSoundingQuery { * @param mdlName * the name of the model * @return the profile - */ + * public static NcSoundingProfile getMdlSndData(double lat, double lon, String refTime, String validTime, String pluginName, String mdlName) { + System.out.println("getMdlSndData lat=" + lat + " lon="+lon); long t01 = System.currentTimeMillis(); NcSoundingProfile pf = new NcSoundingProfile(); - //NcSoundingCube cube = new NcSoundingCube(); - List soundingProfileList = new ArrayList(); List levels = getModelLevels(refTime, validTime, pluginName, mdlName); if (levels.size() == 0) { System.out.println("getModelLevels return 0; file=" + refTime+ " stime="+validTime + " gribtype="+ pluginName + " modeltype="+mdlName); pf.setRtnStatus(NcSoundingCube.QueryStatus.FAILED); return pf; } - + System.out.println("getModelLevels = "+ levels.size()+" levels, took "+ (System.currentTimeMillis()-t01) + " ms"); + long t011 = System.currentTimeMillis(); Point pnt = getLatLonIndices(lat, lon, refTime, validTime, levels.get(0).toString(), pluginName, mdlName); if (pnt == null) { @@ -209,7 +306,8 @@ public class MdlSoundingQuery { return pf; } - + System.out.println("getLatLonIndices pntX=" + pnt.getX()+ " pntY=" + pnt.getY()+ " took "+ (System.currentTimeMillis()-t011) + " ms"); + long t012 = System.currentTimeMillis(); List layerList = getModelSoundingLayerList(pnt, refTime, validTime, pluginName, mdlName, levels); if (layerList.size() == 0) { @@ -220,10 +318,13 @@ public class MdlSoundingQuery { return pf; } - pf.setStationLatitude((float) lat); - pf.setStationLongitude((float) lon); + System.out.println("getModelSoundingLayerList= "+ layerList.size()+ " layers, took "+ (System.currentTimeMillis()-t012) + " ms"); + + pf.setStationLatitude( lat); + pf.setStationLongitude( lon); Float sfcPressure = getModelSfcPressure(pnt, refTime, validTime, pluginName, mdlName); + //System.out.println("getModelSfcPressure took "+ (System.currentTimeMillis()-t013) + " ms"); if (sfcPressure == null) { pf.setSfcPress(-9999.f); } @@ -235,27 +336,41 @@ public class MdlSoundingQuery { } //System.out.println("surface pressure ="+pf.getSfcPress()+ " lat= "+lat+ " lon="+lon); //calculate dew point if necessary + long t014 = System.currentTimeMillis(); MergeSounding ms = new MergeSounding(); - ms.spfhToDewpoint(layerList); + //ms.spfhToDewpoint(layerList); ms.rhToDewpoint(layerList); + System.out.println("MergeSounding took "+ (System.currentTimeMillis()-t014) + " ms"); pf.setSoundingLyLst(layerList); - - soundingProfileList.add(pf); - //cube.setSoundingProfileList(soundingProfileList); - //cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); long t02 = System.currentTimeMillis(); System.out.println("MDL cube retreival took " + (t02 - t01)); return pf; - } + }*/ - public static NcSoundingModel getMdls(String perspectiveName) { - // TO do by M. G. + public static NcSoundingModel getMdls(String pluginName) { NcSoundingModel mdls = new NcSoundingModel(); - + Object[] mdlName = null; + if (pluginName.equalsIgnoreCase(NCGRIB_TBL_NAME)) { + CoreDao dao = new CoreDao(DaoConfig.forClass(NcgribModel.class)); + String queryStr = new String("Select Distinct modelname FROM ncgrib_models ORDER BY modelname"); + mdlName = (Object[]) dao.executeSQLQuery(queryStr); + } + else if (pluginName.equalsIgnoreCase(D2DGRIB_TBL_NAME)) { + CoreDao dao = new CoreDao(DaoConfig.forClass(NcgribModel.class)); + String queryStr = new String("Select Distinct modelname FROM grib_models ORDER BY modelname"); + mdlName = (Object[]) dao.executeSQLQuery(queryStr); + } + if(mdlName!=null && mdlName.length>0){ + List mdlList = new ArrayList(); + for(Object mn : mdlName){ + mdlList.add((String)mn); + } + mdls.setMdlList(mdlList); + } return mdls; } @@ -551,6 +666,263 @@ public class MdlSoundingQuery { } + /** + * Returns a list of NcSoundingProfile for a group of Point with specific ref and range time, and + * model for grib or ncgrib data. + * + * @param pnt + * location + * @param pluginName + * the name of the data table ('grib' or 'ncgrib') + * @param modelName + * the name of the model + * @param levels + * list of vertical levels + * @return list of NcSoundingLayer objects + * + * Created @ 3/28/2012 + */ + + private static List queryProfileListByPointGroup(List points, + String refTime, String validTime, String pluginName, + String modelName, List levels) { + + List soundingProfileList = new ArrayList(); + List fdataArrayList = new ArrayList(); + //long t01 = System.currentTimeMillis(); + if (pluginName.equalsIgnoreCase(NCGRIB_TBL_NAME)) { + List recList = new ArrayList(); ; + TableQuery query; + try { + query = new TableQuery("metadata", + NcgribRecord.class.getName()); + query.addParameter("vcord", "PRES"); + query.addParameter("modelName", modelName); + query.addList("parm",NC_PARMS);//parmList.toString()); // + query.addParameter("dataTime.refTime", refTime); + query.addParameter("dataTime.validPeriod.start", validTime); + //query.addParameter("glevel1", level.toString()); + query.setSortBy("glevel1", false); + recList = (List) query.execute(); + //System.out.println("Ncgrib group query0 result size ="+ recList.size()); + + if (recList.size() != 0) { + + PointIn pointIn = new PointIn(pluginName, recList.get(0)); + //Chin note: + // We query multiple points, and for each point, query all levels (pressure) and all parameters + //(at that level) with one shot. + // The return array list (fdataArrayList) are listed in the same order as querying list "points" + // Each element (float[]) of the returned array list, represent a Point data, contains the same number of + // parameters and listed in the same order as querying rec array (recList.toArray()) + //However, returned element (float[]) does not tell you which parameter itself is. + //Therefore, we have to use information in query rec array to find out returned value's type (which parameter it is) + // Further, we have to sort and store returned values to NcSoundingLayer based on its level (pressure) + // Parameters in same level should be stored in one same NcSoundingLayer, + // NcSoundingLayers for same Point should be stored in same NcSoundingProfile. + fdataArrayList = pointIn.getHDF5GroupDataPoints(recList.toArray(),points); + } + }catch (DataAccessLayerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + int index=0; + GridGeometry2D geom = MapUtil.getGridGeometry(spatialArea); + CoordinateReferenceSystem crs = geom.getCoordinateReferenceSystem(); + Coordinate coord= new Coordinate(45,45); + + for(float[] fdataArray: fdataArrayList ){ + //one fdataArray is for one Point or say one profile + NcSoundingProfile pf = new NcSoundingProfile(); + List soundLyList = new ArrayList(); + Point pnt = points.get(index); + Object[] recArray = recList.toArray(); + for (Object level : levels){ + NcSoundingLayer soundingLy = new NcSoundingLayer(); + int pressure= (Integer)level; + soundingLy.setPressure( pressure); + + for (int i=0; i < recArray.length; i++) { + NcgribRecord rec1 = (NcgribRecord)recArray[i]; + float fdata = fdataArray[i]; + if(rec1.getGlevel1() == pressure){ + String prm = rec1.getParm(); + + //long t01 = System.currentTimeMillis(); + switch (NcParmNames.valueOf(prm)) { + case HGHT: + soundingLy.setGeoHeight(fdata); + break; + case UREL: + // HDF5 data in unit of m/s, convert to Knots 4/12/2012 + soundingLy.setWindU((float)metersPerSecondToKnots.convert(fdata)); + break; + case VREL: + // HDF5 data in unit of m/s, convert to Knots 4/12/2012 + soundingLy.setWindV((float)metersPerSecondToKnots.convert(fdata)); + break; + case TMPK: + soundingLy.setTemperature((float) kelvinToCelsius + .convert(fdata)); + break; + case DWPK: + soundingLy.setDewpoint((float) kelvinToCelsius + .convert(fdata)); + break; + case SPFH: + soundingLy.setSpecHumidity(fdata); + break; + case OMEG: + soundingLy.setOmega(fdata); + break; + case RELH: + soundingLy.setRelativeHumidity(fdata); + break; + } + } + } + soundLyList.add(soundingLy); + } + try { + coord = PointUtil.determineLatLon(pnt, crs, geom); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //System.out.println(" point coord.y="+coord.y+ " coord.x="+ coord.x); + pf.setStationLatitude(coord.y); + pf.setStationLongitude( coord.x); + //Float sfcPressure = getModelSfcPressure(pnt, refTime, validTime, + // pluginName, modelName); + //System.out.println("getModelSfcPressure took "+ (System.currentTimeMillis()-t013) + " ms"); + //if (sfcPressure == null) { + pf.setSfcPress(-9999.f); + //} + //else { + // pf.setSfcPress(sfcPressure); + //} + //System.out.println("surface pressure ="+pf.getSfcPress()); + //calculate dew point if necessary + MergeSounding ms = new MergeSounding(); + //ms.spfhToDewpoint(layerList); + ms.rhToDewpoint(soundLyList); + //System.out.println("MergeSounding took "+ (System.currentTimeMillis()-t014) + " ms"); + pf.setSoundingLyLst(soundLyList); + soundingProfileList.add(pf); + index++; + } + } + else if (pluginName.equalsIgnoreCase(D2DGRIB_TBL_NAME)) { + List recList = new ArrayList(); ; + TableQuery query; + try { + query = new TableQuery("metadata", + GribRecord.class.getName()); + query.addParameter("modelInfo.level.masterLevel.name", "MB"); + query.addParameter("modelInfo.modelName", modelName); + query.addList("modelInfo.parameterAbbreviation", + D2D_PARMS); + query.addParameter("dataTime.refTime", refTime); + query.addParameter("dataTime.validPeriod.start", validTime); + query.setSortBy("modelInfo.level.levelonevalue", false); + recList = (List) query.execute(); + if (recList.size() != 0) { + PointIn pointIn = new PointIn(pluginName, recList.get(0)); + fdataArrayList = pointIn.getHDF5GroupDataPoints(recList.toArray(),points); + } + }catch (DataAccessLayerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + int index=0; + GridGeometry2D geom = MapUtil.getGridGeometry(spatialArea); + CoordinateReferenceSystem crs = geom.getCoordinateReferenceSystem(); + Coordinate coord= new Coordinate(45,45); + + for(float[] fdataArray: fdataArrayList ){ + //one fdataArray is for one Point or say one profile + NcSoundingProfile pf = new NcSoundingProfile(); + List soundLyList = new ArrayList(); + Point pnt = points.get(index); + Object[] recArray = recList.toArray(); + for (Object level : levels){ + NcSoundingLayer soundingLy = new NcSoundingLayer(); + double pressure= (Double)level; + soundingLy.setPressure( (float)pressure); + for (int i=0; i < recArray.length; i++) { + GribRecord rec1 = (GribRecord)recArray[i]; + float fdata = fdataArray[i]; + if(rec1.getModelInfo().getLevelOneValue() == pressure){ + String prm = rec1.getModelInfo().getParameterAbbreviation(); + switch (D2DParmNames.valueOf(prm)) { + case GH: + soundingLy.setGeoHeight(fdata); + break; + case uW: + // HDF5 data in unit of m/s, convert to Knots 4/12/2012 + soundingLy.setWindU((float)metersPerSecondToKnots.convert(fdata)); + break; + case vW: + // HDF5 data in unit of m/s, convert to Knots 4/12/2012 + soundingLy.setWindV((float)metersPerSecondToKnots.convert(fdata)); + break; + case T: + soundingLy.setTemperature((float) kelvinToCelsius + .convert(fdata)); + break; + case DWPK: + soundingLy.setDewpoint((float) kelvinToCelsius + .convert(fdata)); + break; + case OMEG: + soundingLy.setOmega(fdata); + break; + case RH: + soundingLy.setRelativeHumidity(fdata); + break; + } + } + } + soundLyList.add(soundingLy); + } + try { + coord = PointUtil.determineLatLon(pnt, crs, geom); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //System.out.println(" point coord.y="+coord.y+ " coord.x="+ coord.x); + pf.setStationLatitude(coord.y); + pf.setStationLongitude( coord.x); + //Float sfcPressure = getModelSfcPressure(pnt, refTime, validTime, + // pluginName, modelName); + //System.out.println("getModelSfcPressure took "+ (System.currentTimeMillis()-t013) + " ms"); + ///if (sfcPressure == null) { + pf.setSfcPress(-9999.f); + //} + //else { + // pf.setSfcPress(sfcPressure/100F); + //} + //System.out.println("surface pressure ="+pf.getSfcPress()+ " lat= "+lat+ " lon="+lon); + //calculate dew point if necessary + MergeSounding ms = new MergeSounding(); + //ms.spfhToDewpoint(layerList); + ms.rhToDewpoint(soundLyList); + pf.setSoundingLyLst(soundLyList); + soundingProfileList.add(pf); + index++; + } + } + return soundingProfileList; + } /** * Returns a list of NcSoundingLayer for a specified location, time, and * model for grib or ncgrib data. @@ -564,136 +936,89 @@ public class MdlSoundingQuery { * @param levels * list of vertical levels * @return list of NcSoundingLayer objects - */ + * private static List getModelSoundingLayerList(Point pnt, String refTime, String validTime, String pluginName, String modelName, List levels) { - // CoreDao dao = new CoreDao(DaoConfig.forClass(NcgribRecord.class)); - List soundLyList = new ArrayList(); - long t01 = System.currentTimeMillis(); - StringBuilder parmList = new StringBuilder(); - boolean ht, ur, vr, t, d,sh, rh, om; + //long t01 = System.currentTimeMillis(); if (pluginName.equalsIgnoreCase(NCGRIB_TBL_NAME)) { TableQuery query; try { - for (Object level : levels) { - NcSoundingLayer soundingLy = new NcSoundingLayer(); - ht = ur= vr= t= d=sh= rh= om= false; - query = new TableQuery("metadata", - NcgribRecord.class.getName()); - query.addParameter("vcord", "PRES"); - query.addParameter("modelName", modelName); - query.addList("parm",NC_PARMS);//parmList.toString()); // - query.addParameter("dataTime.refTime", refTime); - query.addParameter("dataTime.validPeriod.start", validTime); - query.addParameter("glevel1", level.toString()); - //query.setSortBy("glevel1", false); - //System.out.println("level = "+ level.toString()); + query = new TableQuery("metadata", + NcgribRecord.class.getName()); + query.addParameter("vcord", "PRES"); + query.addParameter("modelName", modelName); + query.addList("parm",NC_PARMS);//parmList.toString()); // + query.addParameter("dataTime.refTime", refTime); + query.addParameter("dataTime.validPeriod.start", validTime); + //query.addParameter("glevel1", level.toString()); + query.setSortBy("glevel1", false); + - List recList = (List) query - .execute(); - //System.out.println("level = "+ level.toString() + " has "+recList.size()+ " records" ); - if (recList.size() != 0) { - for (NcgribRecord rec1 : recList) { - soundingLy.setPressure((float) rec1 - .getGlevel1()); - String prm = rec1.getParm(); - //System.out.println("point.x="+ pnt.x + " .y="+pnt.y+"pressure="+rec1 - // .getGlevel1()); - - //System.out.println("point.x="+ pnt.x + " .y="+pnt.y+"prm="+prm); - - switch (NcParmNames.valueOf(prm)) { - case HGHT: - if(ht== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setGeoHeight(fdata); - ht = true; + List recList = (List) query.execute(); + System.out.println("Ncgrib group query0 result size ="+ recList.size()); + + if (recList.size() != 0) { + + PointIn pointIn = new PointIn(pluginName, recList.get(0), + pnt.x, pnt.y); + //Chin note: + // We query all levels (pressure) and all parameters (at that level) at once. + // The return array (fdataArray) are listed in the same order as query array (recList.toArray()) + //However, returned array does not tell you which parameter itself is. + //Therefore, we have to use information in query array to find out returned value's type (which parameter it is) + // Further, we have to sort and store returned values to NcSoundingLayer based on its level (pressure) + // Parameters in same level should be stored in one same NcSoundingLayer + float[] fdataArray = pointIn.getHDF5GroupDataPoint(recList.toArray()); + Object[] recArray = recList.toArray(); + for (Object level : levels){ + NcSoundingLayer soundingLy = new NcSoundingLayer(); + int pressure= (Integer)level; + soundingLy.setPressure( pressure); + + for (int i=0; i < recArray.length; i++) { + NcgribRecord rec1 = (NcgribRecord)recArray[i]; + float fdata = fdataArray[i]; + if(rec1.getGlevel1() == pressure){ + String prm = rec1.getParm(); + //System.out.println("point.x="+ pnt.x + " .y="+pnt.y+"pressure="+rec1 + // .getGlevel1()+ " Parm="+prm ); + //long t01 = System.currentTimeMillis(); + switch (NcParmNames.valueOf(prm)) { + case HGHT: + soundingLy.setGeoHeight(fdata); + break; + case UREL: + // HDF5 data in unit of Knots, no conversion needed + soundingLy.setWindU(fdata); + break; + case VREL: + // HDF5 data in unit of Knots, no conversion needed + soundingLy.setWindV(fdata); + break; + case TMPK: + soundingLy.setTemperature((float) kelvinToCelsius + .convert(fdata)); + break; + case DWPK: + soundingLy.setDewpoint((float) kelvinToCelsius + .convert(fdata)); + break; + case SPFH: + soundingLy.setSpecHumidity(fdata); + break; + case OMEG: + soundingLy.setOmega(fdata); + break; + case RELH: + soundingLy.setRelativeHumidity(fdata); + break; } - break; - case UREL: - // HDF5 data in - // unit of - // Knots, no - // conversion - // needed - if(ur== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setWindU(fdata); - ur = true; - } - break; - case VREL: - // HDF5 data in - // unit of - // Knots, no - // conversion - // needed - if(vr== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setWindV(fdata); - vr = true; - } - break; - case TMPK: - if(t== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setTemperature((float) kelvinToCelsius - .convert(fdata)); - t = true; - } - break; - case DWPK: - if(d== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setDewpoint((float) kelvinToCelsius - .convert(fdata)); - d = true; - } - break; - case SPFH: - if(sh== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setSpecHumidity(fdata); - sh = true; - } - break; - case OMEG: - if(om== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setOmega(fdata); - om = true; - } - break; - case RELH: - if(rh== false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setRelativeHumidity(fdata); - rh = true; - } - break; } - } soundLyList.add(soundingLy); } @@ -706,149 +1031,99 @@ public class MdlSoundingQuery { // TODO Auto-generated catch block e.printStackTrace(); } - + //System.out.println("getModelSoundingLayerList:total level = "+ totalLevel + " total records= "+totalRecords ); + } else if (pluginName.equalsIgnoreCase(D2DGRIB_TBL_NAME)) { - + try { + TableQuery query = new TableQuery("metadata", + GribRecord.class.getName()); + //query.addParameter("modelInfo.level.levelonevalue", + // level.toString()); + //query.addParameter("modelInfo.level.leveltwovalue", + // "-999999.0"); + query.addParameter("modelInfo.level.masterLevel.name", "MB"); + query.addParameter("modelInfo.modelName", modelName); + query.addList("modelInfo.parameterAbbreviation", + D2D_PARMS); + query.addParameter("dataTime.refTime", refTime); + query.addParameter("dataTime.validPeriod.start", validTime); + query.setSortBy("modelInfo.level.levelonevalue", false); + //System.out.println("level = "+ level.toString()); - for (Object level : levels) { - ht = ur= vr= t= d=sh= rh= om= false; - NcSoundingLayer soundingLy = new NcSoundingLayer(); - try { - //Chin should change for performance - TableQuery query = new TableQuery("metadata", - GribRecord.class.getName()); - query.addParameter("modelInfo.level.levelonevalue", - level.toString()); - query.addParameter("modelInfo.level.leveltwovalue", - "-999999.0"); - query.addParameter("modelInfo.level.masterLevel.name", "MB"); - query.addParameter("modelInfo.modelName", modelName); - query.addList("modelInfo.parameterAbbreviation", - D2D_PARMS); - query.addParameter("dataTime.refTime", refTime); - query.addParameter("dataTime.validPeriod.start", validTime); - query.setSortBy("modelInfo.level.levelonevalue", false); - //System.out.println("level = "+ level.toString()); - try { - List recList = (List) query - .execute(); - if (recList.size() != 0) { - for (GribRecord rec1 : recList) { - soundingLy.setPressure((float) rec1 - .getModelInfo().getLevel() - .getLevelonevalue()); - String prm = rec1.getModelInfo() - .getParameterAbbreviation(); + List recList = (List) query.execute(); + System.out.println("Grib group query0 result size ="+ recList.size()); - - //System.out.println("point.x="+ pnt.x + " .y="+pnt.y+"prm="+prm+" value="+fdata); + if (recList.size() > 0) { + PointIn pointIn = new PointIn(pluginName, recList.get(0), + pnt.x, pnt.y); + float[] fdataArray = pointIn.getHDF5GroupDataPoint(recList.toArray()); + Object[] recArray = recList.toArray(); + for (Object level : levels){ + NcSoundingLayer soundingLy = new NcSoundingLayer(); + double pressure= (Double)level; + soundingLy.setPressure( (float)pressure); + + for (int i=0; i < recArray.length; i++) { + GribRecord rec1 = (GribRecord)recArray[i]; + float fdata = fdataArray[i]; + if(rec1.getModelInfo().getLevelOneValue() == pressure){ + String prm = rec1.getModelInfo().getParameterAbbreviation(); + //System.out.println("point.x="+ pnt.x + " .y="+pnt.y+"pressure="+pressure+ " Parm="+prm ); + //long t01 = System.currentTimeMillis(); switch (D2DParmNames.valueOf(prm)) { case GH: - if(ht == false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setGeoHeight(fdata); - ht= true; - } + soundingLy.setGeoHeight(fdata); break; case uW: - // HDF5 data in - // unit of - // Knots, no - // conversion - // needed - if(ur == false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setWindU(fdata); - ur= true; - } + // HDF5 data in unit of Knots, no conversion needed + soundingLy.setWindU(fdata); break; case vW: - // HDF5 data in - // unit of - // Knots, no - // conversion - // needed - if(vr == false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setWindV(fdata); - vr= true; - } + // HDF5 data in unit of Knots, no conversion needed + soundingLy.setWindV(fdata); break; case T: - if(t == false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setTemperature((float) kelvinToCelsius - .convert(fdata)); - t= true; - } + soundingLy.setTemperature((float) kelvinToCelsius + .convert(fdata)); break; - case DWPK: - if(d == false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setDewpoint((float) kelvinToCelsius - .convert(fdata)); - d= true; - } - break; - case RH: - if(rh == false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setRelativeHumidity(fdata); - rh= true; - } + case DWPK: + soundingLy.setDewpoint((float) kelvinToCelsius + .convert(fdata)); break; case OMEG: - if(om == false){ - PointIn pointIn = new PointIn(pluginName, rec1, - pnt.x, pnt.y); - float fdata = pointIn.getPointData(); - soundingLy.setOmega(fdata); - om= true; - } + soundingLy.setOmega(fdata); + break; + case RH: + soundingLy.setRelativeHumidity(fdata); break; } - } - soundLyList.add(soundingLy); } - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); + soundLyList.add(soundingLy); } - - } catch (DataAccessLayerException e) { - // TODO Auto-generated catch block - e.printStackTrace(); } - + } + catch (DataAccessLayerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); } } - long t02 = System.currentTimeMillis(); + //long t02 = System.currentTimeMillis(); //System.out.println("MDL profile retreival took " + (t02 - t01)); - /*/debug + for(NcSoundingLayer layer: soundLyList){ System.out.println("pre="+ layer.getPressure()+ " h="+layer.getGeoHeight()+ " T="+layer.getTemperature()+" D="+ layer.getDewpoint()+ " WS="+layer.getWindSpeed()+ " WD="+layer.getWindDirection() + " SH="+layer.getSpecHumidity()+ " RH="+layer.getRelativeHumidity()); - }*/ + } return soundLyList; } - - + */ /** * Return a list of data vertical levels for a specified time and model for * grib or ncgrib data. @@ -909,7 +1184,7 @@ public class MdlSoundingQuery { return null; } - + private static ISpatialObject spatialArea = null; /** * Returns the indices of the model grid of the closest point to the * specified latitude, longitude. @@ -929,7 +1204,7 @@ public class MdlSoundingQuery { public static Point getLatLonIndices(double lat, double lon, String refTime, String validTime, String level, String pluginName, String modelName) { - ISpatialObject spatialArea = null; + //ISpatialObject spatialArea = null; Point pnt = null; diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding.java b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding.java index 91eee4f760..94d9330c8a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding.java +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding.java @@ -28,6 +28,7 @@ import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer2; * 11/15/2010 301 C. Chen fix a index out of bound bug * 12/2010 301 T. Lee/NCEP Re-factored for BUFRUA * 5/10/2011 301 C. Chen added rhToDewpoint(), tempToVapr() + * 02/28/2012 Chin Chen modify several sounding query algorithms for better performance *
    * * @author T. Lee @@ -93,9 +94,9 @@ public class MergeSounding { if ( ttaa.size() > 0 ) { Collections.sort(ttaa, new reverseSortByPressure()); //System.out.println("TTAA sounding: "); - for ( NcSoundingLayer soundLy : ttaa ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ttaa ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); if (level.toUpperCase().equalsIgnoreCase("MAN")) { return ttaa; @@ -116,27 +117,27 @@ public class MergeSounding { if ( ttbb.size() > 0) { Collections.sort(ttbb, new reverseSortByPressure()); //System.out.println("TTBB sounding: "); - for ( NcSoundingLayer soundLy : ttbb ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ttbb ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } if ( ttcc.size() > 0) { Collections.sort(ttcc, new reverseSortByPressure()); //System.out.println("TTCC sounding: "); - for ( NcSoundingLayer soundLy : ttcc ){ - System.out.print(soundLy.getPressure() + " , "); - } + ////for ( NcSoundingLayer soundLy : ttcc ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } if ( ttdd.size() > 0) { Collections.sort(ttdd, new reverseSortByPressure()); //System.out.println("TTDD sounding: "); - for ( NcSoundingLayer soundLy : ttdd ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ttdd ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } @@ -144,16 +145,16 @@ public class MergeSounding { if (checkWindData(ppaa)) { Collections.sort(ppaa, new MergeSounding.sortByHeight()); //System.out.println("TTAA sounding: "); - for ( NcSoundingLayer soundLy : ttaa ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ttaa ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } else { Collections.sort(ppaa, new MergeSounding.reverseSortByPressure()); //System.out.println("TTAA sounding: "); - for ( NcSoundingLayer soundLy : ttaa ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ttaa ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } } @@ -163,16 +164,16 @@ public class MergeSounding { if (checkWindData(ppcc)) { Collections.sort(ppcc, new MergeSounding.sortByHeight()); //System.out.println("PPCC sounding: "); - for ( NcSoundingLayer soundLy : ppcc ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ppcc ){ + // System.out.print(soundLy.getPressure() + " , "); + // } //System.out.println(); } else { Collections.sort(ppcc, new MergeSounding.reverseSortByPressure()); //System.out.println("PPCC sounding: "); - for ( NcSoundingLayer soundLy : ppcc ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ppcc ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } } @@ -181,16 +182,16 @@ public class MergeSounding { if (checkWindData(ppbb)) { Collections.sort(ppbb, new MergeSounding.sortByHeight()); //System.out.println("PPBB sounding: "); - for ( NcSoundingLayer soundLy : ppbb ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ppbb ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } else { Collections.sort(ppbb, new MergeSounding.reverseSortByPressure()); //System.out.println("PPBB sounding: "); - for ( NcSoundingLayer soundLy : ppbb ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ppbb ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } } @@ -200,16 +201,16 @@ public class MergeSounding { if (checkWindData(ppdd)) { Collections.sort(ppdd, new MergeSounding.sortByHeight()); //System.out.println("PPDD sounding: "); - for ( NcSoundingLayer soundLy : ppdd ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ppdd ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } else { Collections.sort(ppdd, new MergeSounding.reverseSortByPressure()); //System.out.println("PPDD sounding: "); - for ( NcSoundingLayer soundLy : ppdd ){ - System.out.print(soundLy.getPressure() + " , "); - } + //for ( NcSoundingLayer soundLy : ppdd ){ + // System.out.print(soundLy.getPressure() + " , "); + //} //System.out.println(); } diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding2.java b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding2.java index f4141b25eb..aa6a25f45a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding2.java +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MergeSounding2.java @@ -49,7 +49,9 @@ import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer2; * 10/06/2011 465 Archana redesigned the merge sounding to use * the met parameters * 10/24/2011 465 Archana Removed several debug statements. - * Used the Amount class to set values for the Met parameters + * Used the Amount class to set values for the Met parameters + * 02/22/2012 C Chen fixed minor bugs + * 02/28/2012 Chin Chen modify several sounding query algorithms for better performance * * * @@ -406,6 +408,7 @@ public class MergeSounding2 implements ISerializableObject { DewPointTemp dewPoint; try { dewPoint = new DewPointTemp(); + dewPoint.setValue( new Amount ( dwpc, SI.CELSIUS ) ); layer.setDewpoint( dewPoint); } catch (Exception e1) { // TODO Auto-generated catch block @@ -450,7 +453,7 @@ public class MergeSounding2 implements ISerializableObject { else { dwpc = (float) (243.5 * ( Math.log(6.112) - Math.log(vapr)) / (Math.log(vapr) - Math.log(6.112)-17.67)); - dewpoint.setValueAs(dwpc, "℃" ); + dewpoint.setValue( new Amount ( dwpc, SI.CELSIUS )); layer.setDewpoint( dewpoint ); ////System.out.println("rhToDewpoint dwpc: " + dwpc); } 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 ac8acf49b0..c2d8b7e63c 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 @@ -25,6 +25,8 @@ package gov.noaa.nws.ncep.edex.uengine.tasks.profile; * Noc 2011 Chin Chen changed Ncuair table query algorithm for performance improvement * 01/05/2012 S. Gurung Removed references to UAIR (performed cleanup) * 01/05/2012 Chin Chen fixed bug that cause exception when query NCUair with bad result + * 02/28/2012 Chin Chen modify several sounding query algorithms for better performance + * 03/28/2012 Chin Chen modify Grid data sounding query algorithms for better performance * * Python Script example to query multiple locations at one request: * The following 3 query examples, returns same results. @@ -58,6 +60,23 @@ sndRq.setRefTime('2010-12-08 12:00') sndRq.setValidTime('2010-12-10 19:00') sndRq.setMerge(1) return sndRq.getSoundingDataByStnIdArray(['ATLH']) + +* + * + * +import NcSoundingDataRequest +sndRq = NcSoundingDataRequest.NcSoundingDataRequest() +sndRq.setSndType('NCUAIR') +sndRq.setDataType('ALLDATA') +sndRq.setRefTime(1320278400000L) +sndRq.setValidTimeStart(1320278400000L) +sndRq.setValidTimeEnd(1320278400000L) +sndRq.setMerge(1) +sndRq.setLevel('500') +sndRq.getSoundingLayer2DataByLatLonArray([32.37,-64.68,47.47,-111.38,53.96,-101.09,60.03,-111.93,28.200000762939453,-87.5999984741211,28.63,-106.08,51.28,-80.59,36.23333,-86.55,34.77556,-76.87917,18.72,-110.95,53.29,-60.36,28.88,-118.3,55.03,-131.57,17.98,-92.92,19.3,-81.35,43.93,-60.01]) +* + + * * * @@ -69,7 +88,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; -import java.util.Locale; import java.util.Set; import java.util.TimeZone; @@ -79,6 +97,9 @@ import javax.measure.unit.SI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import com.raytheon.uf.common.dataplugin.bufrua.UAObs; +import com.vividsolutions.jts.geom.Coordinate; + import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairMaxWind; import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairObsLevels; import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairTropopause; @@ -87,6 +108,7 @@ import gov.noaa.nws.ncep.edex.common.metparameters.AirTemperature; import gov.noaa.nws.ncep.edex.common.metparameters.Amount; import gov.noaa.nws.ncep.edex.common.metparameters.DewPointTemp; import gov.noaa.nws.ncep.edex.common.metparameters.HeightAboveSeaLevel; +import gov.noaa.nws.ncep.edex.common.metparameters.Omega; import gov.noaa.nws.ncep.edex.common.metparameters.PressureLevel; import gov.noaa.nws.ncep.edex.common.metparameters.WindDirection; import gov.noaa.nws.ncep.edex.common.metparameters.WindSpeed; @@ -112,28 +134,56 @@ public class NcSoundingDrv { private Calendar refTimeCal, validTimeStartCal, validTimeEndCal; private String stid,level, dataType, sndType, queryType, tableName; private int merge; + private boolean useNcSoundingLayer2=false; private int[] dbIdList; private String[] stnIdArr; private String[] stnNumArr; private String modelName; private String pluginName; - private float[][] latLonArray; // e.g. at nth element, lat=[n][0], lon=[n][1] - public float[][] getLatLons() { + private double[][] latLonArray; // e.g. at nth element, lat=[n][0], lon=[n][1] + private Coordinate[] coordinateArray; + private long []rangeTimeArr; + private List rangeTimeCalLst= new ArrayList(); + private List rangeTimeStringLst = new ArrayList(); + public double[][] getLatLons() { return latLonArray; } + public boolean isUseNcSoundingLayer2() { + return useNcSoundingLayer2; + } + + public void setUseNcSoundingLayer2(boolean useNcSoundingLayer2) { + this.useNcSoundingLayer2 = useNcSoundingLayer2; + System.out.println("useNcSoundingLayer2 set to "+useNcSoundingLayer2); + } + + public long[] getRangeTimeArr() { + return rangeTimeArr; + } - - - + public void setRangeTimeArr(long[] rangeTimeArr) { + this.rangeTimeArr = rangeTimeArr; + rangeTimeStringLst.clear(); + rangeTimeCalLst.clear(); + for(int i=0; i< rangeTimeArr.length ; i++){ + Calendar timeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + // reset time + timeCal.setTimeInMillis(rangeTimeArr[i]); + 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); + } + } public String[] getStnIdArr() { return stnIdArr; } - - - public void setStnIdArr(String[] stnIdArr) { this.stnIdArr = stnIdArr; + //stnId and coordinateArray (or latLonArray) should be mutual exclusive + coordinateArray = null; + latLonArray = null; } @@ -141,26 +191,32 @@ public class NcSoundingDrv { public String[] getStnNumArr() { return stnNumArr; } - - - public void setStnNumArr(String[] stnNumArr) { this.stnNumArr = stnNumArr; } - public void setLatLons(float[] latLons) { - - + public void setLatLons(double[] latLons) { //from python script, I only know a way to pass one dimensional array, therefore convert it 2-D here. if(latLons.length >0){ - latLonArray = new float[latLons.length/2][2]; - for(int i=0, j=0; i < latLons.length; i++,j++){ + latLonArray = new double[latLons.length/2][2]; + for(int i=0, j=0; i < latLons.length; i=i+2){ this.latLonArray[j][0] = latLons[i]; - this.latLonArray[j][1] = latLons[++i]; + this.latLonArray[j][1] = latLons[i+1]; + j++; //System.out.println("latlons = "+ latLonArray[j][0] + ","+ latLonArray[j][1]); } + coordinateArray = new Coordinate[latLons.length/2]; + for(int i=0, j=0; i < latLons.length; i=i+2){ + Coordinate coor = new Coordinate(); + coor.y = latLons[i]; //latitude + coor.x = latLons[i+1];//longitude + this.coordinateArray[j] = coor; + //System.out.println("i=" + i+ " j=" + j+" latlons = "+ latLons[i+1] + ","+ latLons[i]); + j++; + } + stnIdArr=null; //stnId and coordinateArray (or latLonArray) should be mutual exclusive } } @@ -179,96 +235,15 @@ public class NcSoundingDrv { public void setRefTimeStr(String refTimeStr) { this.refTimeStr = refTimeStr; refTimeCal = convertTimeStrToCalendar(refTimeStr); - /*int year, mon, date, hr; - int index = refTimeStr.indexOf('-'); - if (index >= 4 ){ - year = Integer.parseInt(refTimeStr.substring(index-4, index)); - refTimeStr = refTimeStr.substring(index+1); - index = refTimeStr.indexOf('-'); - if(index >= 2 ){ - mon = Integer.parseInt(refTimeStr.substring(index-2, index)); - refTimeStr = refTimeStr.substring(index+1); - index = refTimeStr.indexOf(' '); - if(index >= 2 ){ - date = Integer.parseInt(refTimeStr.substring(index-2, index)); - refTimeStr = refTimeStr.substring(index+1); - //index = refTimeStr.indexOf(':'); - if(refTimeStr.length() >= 2 ){ - hr = Integer.parseInt(refTimeStr.substring(0, 2)); - refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // reset time - refTimeCal.setTimeInMillis(0); - // set new time - refTimeCal.set(year, mon-1, date, hr, 0,0); - System.out.println("set time Str " + refTimeStr + " cal time in GMT " + refTimeCal.getTime().toGMTString() + " in msec = " + refTimeCal.getTimeInMillis()); -} -} -} -}*/ - + } public void setValidTimeStartStr(String validTimeStartStr) { this.validTimeStartStr = validTimeStartStr; validTimeStartCal = convertTimeStrToCalendar(validTimeStartStr); - /* - int year, mon, date, hr; - int index = validTimeStartStr.indexOf('-'); - if (index >= 4 ){ - year = Integer.parseInt(validTimeStartStr.substring(index-4, index)); - validTimeStartStr = validTimeStartStr.substring(index+1); - index = validTimeStartStr.indexOf('-'); - if(index >= 2 ){ - mon = Integer.parseInt(validTimeStartStr.substring(index-2, index)); - validTimeStartStr = validTimeStartStr.substring(index+1); - index = validTimeStartStr.indexOf(' '); - if(index >= 2 ){ - date = Integer.parseInt(validTimeStartStr.substring(index-2, index)); - validTimeStartStr = validTimeStartStr.substring(index+1); - //index = refTimeStr.indexOf(':'); - if(validTimeStartStr.length() >= 2 ){ - hr = Integer.parseInt(validTimeStartStr.substring(0, 2)); - validTimeStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // reset time - validTimeStartCal.setTimeInMillis(0); - // set new time - validTimeStartCal.set(year, mon-1, date, hr, 0,0); - System.out.println("set valid time start Str " + validTimeStartStr + " cal time in GMT " + validTimeStartCal.getTime().toGMTString() + " in msec = " + validTimeStartCal.getTimeInMillis()); -} -} -} -}*/ - } public void setValidTimeEndStr(String validTimeEndStr) { this.validTimeEndStr = validTimeEndStr; validTimeEndCal = convertTimeStrToCalendar(validTimeEndStr); - /* - int year, mon, date, hr; - int index = validTimeEndStr.indexOf('-'); - if (index >= 4 ){ - year = Integer.parseInt(validTimeEndStr.substring(index-4, index)); - validTimeEndStr = validTimeEndStr.substring(index+1); - index = validTimeEndStr.indexOf('-'); - if(index >= 2 ){ - mon = Integer.parseInt(validTimeEndStr.substring(index-2, index)); - validTimeEndStr = validTimeEndStr.substring(index+1); - index = validTimeEndStr.indexOf(' '); - if(index >= 2 ){ - date = Integer.parseInt(validTimeEndStr.substring(index-2, index)); - validTimeEndStr = validTimeEndStr.substring(index+1); - //index = refTimeStr.indexOf(':'); - if(validTimeEndStr.length() >= 2 ){ - hr = Integer.parseInt(validTimeEndStr.substring(0, 2)); - validTimeEndCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // reset time - validTimeEndCal.setTimeInMillis(0); - // set new time - validTimeEndCal.set(year, mon-1, date, hr, 0,0); - System.out.println("set valid time end Str " + validTimeEndStr + " cal time in GMT " + validTimeEndCal.getTime().toGMTString() + " in msec = " + validTimeEndCal.getTimeInMillis()); -} -} -} -}*/ } private Calendar convertTimeStrToCalendar(String intimeStr){ @@ -420,6 +395,10 @@ public class NcSoundingDrv { public void setRefTime(long refTime) { this.refTime = refTime; + Calendar timeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + // reset time + timeCal.setTimeInMillis(refTime); + refTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:00:00", timeCal); refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); refTimeCal.setTimeInMillis(refTime); } @@ -480,156 +459,6 @@ public class NcSoundingDrv { return pluginName; } - - /* - public Object execute() throws Exception { - Object returnedObject = new Object(); - System.out.println ( " Enter execute "); - MergeSounding ms = new MergeSounding(); - - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList();import BaseRequest -dataRequest = BaseRequest.BaseRequest("sgwh") -dataRequest.setCount(1500) -return dataRequest.execute() - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - NcSoundingProfile pf = null; - if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - System.out.println ( " Processing native model data"); - pf = PfcSoundingQuery.getPfcSndData(lat, lon, refTime, validTime, sndType); - ms.nativeModelSounding(pf.getSoundingLyLst(), pf.getStationElevation()); -} - else if (sndType.equals(ObsSndType.UAIR.toString()) || - sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - - - System.out.println ( " Processing UAIR data! sndType could be UAIR, BUFRUA, DROP, TAMDAR, etc"); - - if(dbIdList!= null) { - pf = ObservedSoundingQuery.getObservedSndData(dbIdList, sndType, dataType); -} else { - - if ( merge == 0 ) { - // ms.unMergedUairSounding - System.out.println ( " Request unmerged data"); - - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "ALLDATA"); -} else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - System.out.println ( " Request merged data"); - - // TO DO -----> add station ID and station number and a list of stations queries. - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "TTAA"); - ttaa = pf.getSoundingLyLst(); - if (ttaa.size() == 0) { - ttaa = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "UUAA").getSoundingLyLst(); -} - - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "TTBB").getSoundingLyLst(); - if (ttbb.size() == 0) { - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "UUBB").getSoundingLyLst(); -} - - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "TTCC").getSoundingLyLst(); - if (ttcc.size() == 0) { - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "UUCC").getSoundingLyLst(); -} - - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "TTDD").getSoundingLyLst(); - if (ttdd.size() == 0) { - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "UUDD").getSoundingLyLst(); -} - - ppaa = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "PPAA").getSoundingLyLst(); - ppbb = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "PPBB").getSoundingLyLst(); - ppcc = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "PPCC").getSoundingLyLst(); - ppdd = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "PPDD").getSoundingLyLst(); - wmax_a = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "MAXWIND_A").getSoundingLyLst(); - wmax_c = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "MAXWIND_C").getSoundingLyLst(); - trop_a = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "TROPOPAUSE_A").getSoundingLyLst(); - trop_c = ObservedSoundingQuery.getObservedSndData(lat, lon, refTime, sndType, "TROPOPAUSE_C").getSoundingLyLst(); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - pf.setSoundingLyLst(sls); -} -} -} - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, dataType); - - // TO DO: need to add "dataType" to bufr data - - if ( merge == 0 ) { - // ms.unMergedUairSounding - System.out.println ( " Request unmerged data"); - -//// pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "ALLDATA"); -} else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - System.out.println ( " Request merged data"); - - // TO DO -----> add station ID and station number and a list of stations queries. -//// pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "TTAA"); - ttaa = pf.getSoundingLyLst(); - if (ttaa.size() == 0) { -//// ttaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "UUAA").getSoundingLyLst(); -} - -//// ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "TTBB").getSoundingLyLst(); - if (ttbb.size() == 0) { -//// ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "UUBB").getSoundingLyLst(); -} - -//// ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "TTCC").getSoundingLyLst(); - if (ttcc.size() == 0) { -//// ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "UUCC").getSoundingLyLst(); -} - -//// ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "TTDD").getSoundingLyLst(); - if (ttdd.size() == 0) { -//// ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "UUDD").getSoundingLyLst(); -} - -//// ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "PPAA").getSoundingLyLst(); -//// ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "PPBB").getSoundingLyLst(); -//// ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "PPCC").getSoundingLyLst(); -//// ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "PPDD").getSoundingLyLst(); -//// wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "MAXWIND_A").getSoundingLyLst(); -//// wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "MAXWIND_C").getSoundingLyLst(); -//// trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "TROPOPAUSE_A").getSoundingLyLst(); -//// trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, refTime, sndType, "TROPOPAUSE_C").getSoundingLyLst(); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - pf.setSoundingLyLst(sls); -} -} - - - else { - - pf = null; -} - returnedObject = pf; - return returnedObject; -} - - */ //for static sounding type query public Object getSoundingRangeTimeLine() throws Exception { Object returnedObject=null; @@ -708,7 +537,7 @@ return dataRequest.execute() sndType.equals(PfcSndType.GFSSND.toString()) || sndType.equals(PfcSndType.RUCPTYPSND.toString()) || sndType.equals(PfcSndType.RUC2SND.toString())) { - stnInfoCol = PfcSoundingQuery.getPfcSndStnInfoCol(sndType, timeLine); + stnInfoCol = PfcSoundingQuery.getPfcSndStnInfoCol(sndType, timeLine,refTimeStr); } else @@ -952,55 +781,131 @@ return dataRequest.execute() //System.out.println("maxWinds="+maxWinds.size()+" sndLayers="+sndLayers.size()); return sndLayers; } - - /** - * This API is for getting multiple locations sounding info at one shot. - * latLonArray is used to input lat/lon for each location. - * Use StnID as input location is NOT SUPPORTED in this API - */ - public Object getSoundingDataByLatLonArray() throws Exception { + /* + * CHin: 2012 Feb 13: Support PFC sounding with one lat/lon location only..... + * Query PFC sounding data in one shot. to see performce difference + * + public Object getSoundingDataByRangeTimeArray() throws Exception { //long t01 = System.currentTimeMillis(); Object returnedObject = new Object(); - //*System.out.println ( " getSoundingDataByLatLonArray "); - if(latLonArray.length <= 0){ - returnedObject = null; - return returnedObject; - } + //System.out.println ( " getSoundingDataByLatLonArray "); + + + //MergeSounding ms = new MergeSounding(); + NcSoundingCube cube = new NcSoundingCube(); + //List soundingProfileList = new ArrayList(); + NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; + Coordinate[] coorArray = new Coordinate[1]; + Coordinate latLon = new Coordinate(); + latLon.y= lat; + latLon.x= lon; + coorArray[0]=latLon; + //List pfs2=PfcSoundingQuery.getPfcSndDataBySoundTimeRangeArray(lat, lon, null, refTimeStr, rangeTimeStringLst, sndType, SndQueryKeyType.LATLON); + List pfs=PfcSoundingQuery.getPfcSndDataGeneric(coorArray, null, refTimeStr, rangeTimeStringLst, sndType,level); + + if(pfs.size() == 0 ) + cube.setRtnStatus(failedRtnStatus); + else + cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + + cube.setSoundingProfileList(pfs); + returnedObject = cube; + + //long t02 = System.currentTimeMillis(); + //System.out.println("PFC/OBS cube retreival took " + (t02 - t01)); + return returnedObject; + }*/ + /* + * This API is for getting multiple locations sounding info at one shot. + * latLonArray is used to input lat/lon for each location. + * + * Chin's Note @ 02/27/2012 + * This API is currently only used for query grid and bufrua data by Nsharp. + */ + private Object getSoundingDataByLatLonArray() throws Exception { + //long t01 = System.currentTimeMillis(); + Object returnedObject = new Object(); + //System.out.println ( " getSoundingDataByLatLonArray entered"); + List timeLineStrList=new ArrayList(); List timeLimeCalList = new ArrayList(); - if(validTimeEnd !=0 && validTimeEnd > validTimeStart){ - //range of time line request - timeLimeCalList = ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, validTimeStartCal, validTimeEndCal); - for (int i=0; i< timeLimeCalList.size(); i++){ - Calendar timeCal = timeLimeCalList.get(i); - String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); - timeLineStrList.add(timeStr); - - } - } - else { - //one single time line - timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); - timeLimeCalList.add(refTimeCal); - } + NcSoundingCube cube = new NcSoundingCube(); List soundingProfileList = new ArrayList(); SndQueryKeyType sndQuery = SndQueryKeyType.LATLON; NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; - for ( int i=0; i < latLonArray.length ; i++) - { - for (int j=0; j< timeLineStrList.size(); j++){ - String timeStr = timeLineStrList.get(j); - Calendar timeCal = timeLimeCalList.get(j); + MergeSounding ms = new MergeSounding(); + NcSoundingProfile pf = null; + if(sndType.equals(MdlSndType.ANY.toString()) ) { + //temp fix for now... + if(validTimeEnd !=0 && validTimeEnd > validTimeStart){ + //range of time line request + timeLimeCalList = ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, validTimeStartCal, validTimeEndCal); + for (int i=0; i< timeLimeCalList.size(); i++){ + Calendar timeCal = timeLimeCalList.get(i); + String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); + timeLineStrList.add(timeStr); - MergeSounding ms = new MergeSounding(); + } + } + else { + //one single time line + timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); + timeLimeCalList.add(refTimeCal); + } + if(latLonArray!= null){ + /* old way + for ( int i=0; i < latLonArray.length ; i++) + { + double lat = latLonArray[i][0]; + double lon = latLonArray[i][1]; + for (int j=0; j< timeLineStrList.size(); j++){ + String timeStr = timeLineStrList.get(j); + pf = MdlSoundingQuery.getMdlSndData( lat, lon, timeStr, validTimeStartStr, pluginName, modelName ); + if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ + failedRtnStatus = pf.getRtnStatus(); + pf = null; + } + if(pf != null && pf.getSoundingLyLst().size()>0) { + soundingProfileList.add(pf); + pf = null; + } + } + }*/ + //Chin Note: using new API to query multiple Points at one shot + soundingProfileList =MdlSoundingQuery.getMdlSndDataProfileList(latLonArray,timeLineStrList.get(0), validTimeStartStr, pluginName, modelName); + } + } + else if(sndType.equals(ObsSndType.BUFRUA.toString())){ + int arrLen =0 ; + if(latLonArray!= null){ + arrLen = latLonArray.length; + sndQuery = SndQueryKeyType.LATLON; + } + else if (stnIdArr!=null){ + arrLen = stnIdArr.length; + sndQuery = SndQueryKeyType.STNID; + } + double lat=0,lon=0; + String stnId=""; + for ( int i=0; i < arrLen ; i++) + { + + //Calendar timeCal = timeLimeCalList.get(j); + + if(latLonArray!= null){ //make sure we have right precision... - lat = Double.parseDouble(Float.toString(latLonArray[i][0])); - lon = Double.parseDouble(Float.toString(latLonArray[i][1])); + lat = latLonArray[i][0]; + lon = latLonArray[i][1]; + } + else { + stnId = stnIdArr[i]; + } /* * Process sounding data. */ + List sls = new ArrayList(); List ttaa = new ArrayList(); List ttbb = new ArrayList(); @@ -1014,222 +919,34 @@ return dataRequest.execute() List trop_c = new ArrayList(); List wmax_a = new ArrayList(); List wmax_c = new ArrayList(); - - NcSoundingProfile pf = null; - if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - - //*System.out.println ( " Processing native model data"); - pf = PfcSoundingQuery.getPfcSndData2(lat, lon, "",refTimeCal, validTimeStartCal, sndType,sndQuery); - //PfcSoundingQuery.getPfcSndData(lat, lon, "",refTimeCal, validTimeCal, sndType,sndQuery); - ms.nativeModelSounding(pf.getSoundingLyLst(), pf.getStationElevation()); - if ( ms.isNumber (level) == 0 ) { - //level is an integer >=0. It means user request a single level - float rlev = new Integer(Integer.parseInt(level.trim())).floatValue(); - pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); - } else if ( ms.isNumber (level) == 1 ) { - //level is an float >=0. It also means user request a single level - float rlev = new Float(Float.parseFloat(level.trim())); - pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); - } - //for(NcSoundingLayer ly: pf.getSoundingLyLst()){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - } - else if(sndType.equals(MdlSndType.ANY.toString()) ) { - - pf = MdlSoundingQuery.getMdlSndData( lat, lon, refTimeStr, validTimeStartStr, pluginName, modelName ); - if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ - failedRtnStatus = pf.getRtnStatus(); - pf = null; - } - } - else if (sndType.equals(ObsSndType.NCUAIR.toString())) { - //System.out.println("getSoundingDataByLatLonArray:NcUair: lat="+lat+ " lon="+lon); - //make sure we have right precision... - - if ( merge == 0 ) { - //Chin...need more coding - pf = null; - } - else{ - //long t001 = System.currentTimeMillis(); - - NcUairRecord[] recordArray = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr); - if(recordArray != null && recordArray.length >0){ - for(int k=0; k< recordArray.length; k++){ - NcUairRecord record= recordArray[k]; - if(record.getDataType().equals("TTAA")){ - ttaa = getSndLayersFromNcUairRecordObsLevel(record); - trop_a = getSndLayersFromNcUairRecordTrop(record); - wmax_a = getSndLayersFromNcUairRecordMaxw(record); - } - else if(record.getDataType().equals("TTBB")){ - ttbb = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("TTCC")){ - ttcc = getSndLayersFromNcUairRecordObsLevel(record); - trop_c = getSndLayersFromNcUairRecordTrop(record); - wmax_c = getSndLayersFromNcUairRecordMaxw(record); - } - else if(record.getDataType().equals("TTDD")){ - ttdd = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPAA")){ - ppaa= getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPBB")){ - ppbb = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPCC")){ - ppcc = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPDD")){ - ppdd = getSndLayersFromNcUairRecordObsLevel(record); - } - } - pf = new NcSoundingProfile(); - pf.setStationElevation((float)recordArray[0].getElevation()); - pf.setStationId(recordArray[0].getStationId()); - if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) - pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); - pf.setStationLatitude((float)recordArray[0].getLatitude()); - pf.setStationLongitude((float)recordArray[0].getLongitude()); - //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //System.out.println("NCUAIR Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NCUAIR get one layer using level = "+ level); - pf.setSoundingLyLst(sls); - } - else { - pf = null; - //System.out.println("NCUAIR get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst(sls); - } - } - else - pf = null; - - } - } - else if (//sndType.equals(ObsSndType.UAIR.toString()) || - sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - - if ( merge == 0 ) { - // ms.unMergedUairSounding - //System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndAllData(lat, lon,"", timeCal, sndType, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - long t001 = System.currentTimeMillis(); - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTAA", sndQuery); - ttaa = pf.getSoundingLyLst(); - if (ttaa.size() == 0) { - ttaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUAA", sndQuery).getSoundingLyLst(); - } - - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTBB", sndQuery).getSoundingLyLst(); - if (ttbb.size() == 0) { - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUBB", sndQuery).getSoundingLyLst(); - } - - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTCC", sndQuery).getSoundingLyLst(); - if (ttcc.size() == 0) { - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUCC", sndQuery).getSoundingLyLst(); - } - - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTDD", sndQuery).getSoundingLyLst(); - if (ttdd.size() == 0) { - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUDD", sndQuery).getSoundingLyLst(); - } - - ppaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPAA", sndQuery).getSoundingLyLst(); - ppbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPBB", sndQuery).getSoundingLyLst(); - ppcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPCC", sndQuery).getSoundingLyLst(); - ppdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPDD", sndQuery).getSoundingLyLst(); - wmax_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_A", sndQuery).getSoundingLyLst(); - wmax_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_C", sndQuery).getSoundingLyLst(); - trop_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); - trop_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, timeCal,sndQuery); - long t02 = System.currentTimeMillis(); - System.out.println("UAIR profile retreival "+ timeStr+" took " + (t02 - t001)); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //System.out.println("UAIR Number of Layers:"+sls.size()); - if (level.toUpperCase().equalsIgnoreCase("MAN")) - pf.setSoundingLyLst(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - pf.setSoundingLyLst(sls); - } - else { - pf = null; - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst(sls); - } - - - } - - } - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ + for(Calendar timeCal :rangeTimeCalLst){ if ( merge == 0 ) { // ms.unMergedUairSounding //*System.out.println ( " Request unmerged data"); if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,"", refTimeCal, sndQuery); + pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,stnId, timeCal, sndQuery); else - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, dataType, sndQuery); + pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, dataType, sndQuery); } else { // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); + //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ timeCal.getTime().toGMTString()); - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal,"TTAA", sndQuery); - ttaa = pf.getSoundingLyLst(); - ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTBB", sndQuery).getSoundingLyLst(); - ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTCC", sndQuery).getSoundingLyLst(); - ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTDD", sndQuery).getSoundingLyLst(); - //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPAA", sndQuery).getSoundingLyLst(); - ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPBB", sndQuery).getSoundingLyLst(); - //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPCC", sndQuery).getSoundingLyLst(); - ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPDD", sndQuery).getSoundingLyLst(); - wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst(); - wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst(); - trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); - trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, refTimeCal,sndQuery); + ttaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal,"TTAA", sndQuery).getSoundingLyLst(); + ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TTBB", sndQuery).getSoundingLyLst(); + ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TTCC", sndQuery).getSoundingLyLst(); + ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TTDD", sndQuery).getSoundingLyLst(); + //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPAA", sndQuery).getSoundingLyLst(); + ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPBB", sndQuery).getSoundingLyLst(); + //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPCC", sndQuery).getSoundingLyLst(); + ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPDD", sndQuery).getSoundingLyLst(); + wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "MAXWIND_A", sndQuery).getSoundingLyLst(); + wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "MAXWIND_C", sndQuery).getSoundingLyLst(); + trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); + trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); + pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,stnId,sndType, timeCal,sndQuery); sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); @@ -1257,22 +974,15 @@ return dataRequest.execute() } } - } - else { - - /* - * Invalid sounding type - */ - pf = null; - } - if(pf != null && pf.getSoundingLyLst().size()>0) { - soundingProfileList.add(pf); - //pf.setStationLatitude(lat.floatValue()); - //pf.setStationLongitude(lon.floatValue()); - pf = null; + if(pf != null && pf.getSoundingLyLst().size()>0) { + soundingProfileList.add(pf); + pf = null; + } } } } + + if(soundingProfileList.size() == 0 ) cube.setRtnStatus(failedRtnStatus); else @@ -1287,48 +997,45 @@ return dataRequest.execute() } - /* Chin:: this metod uses algorithm to query all station at one shot - * Only NCUair query is using such algorithm now + + /* Chin:: 2/21/2012 + * Only NCUair and PFC (modelsounding DB) query is supported now + * Use generic query API + * Mainly used by CAVE Resource plotting + * Returned Sounding data are stored in NcSoundingLayer2. * */ - public Object getSoundingLayer2DataUsingLatLonArray() throws Exception { - //long t01 = System.currentTimeMillis(); + public Object getSoundingData2Generic() throws Exception { + long t01 = System.currentTimeMillis(); Object returnedObject = new Object(); //*System.out.println ( " getSoundingDataByLatLonArray "); - if(latLonArray.length <= 0){ + if(stnIdArr.length <= 0){ returnedObject = null; return returnedObject; } - List timeLineStrList=new ArrayList();; - List timeLimeCalList = new ArrayList(); - if(validTimeEnd !=0 && validTimeEnd > validTimeStart){ - //range of time line request - timeLimeCalList = ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, validTimeStartCal, validTimeEndCal); - for (int i=0; i< timeLimeCalList.size(); i++){ - Calendar timeCal = timeLimeCalList.get(i); - String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); - timeLineStrList.add(timeStr); - - } - } - else { - //one single time line - timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); - timeLimeCalList.add(refTimeCal); - } + //List timeLineStrList=new ArrayList();; + //List timeLimeCalList = new ArrayList(); + NcSoundingCube cube = new NcSoundingCube(); List soundingProfileList = new ArrayList(0); - SndQueryKeyType sndQuery = SndQueryKeyType.LATLON; NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; NcSoundingProfile pf; MergeSounding2 ms = new MergeSounding2(); if (sndType.equals(ObsSndType.NCUAIR.toString())) { - for (int j=0; j< timeLineStrList.size(); j++){ - String timeStr = timeLineStrList.get(j); + //Note: in NC Uair table, we only use ref time for query + if(rangeTimeStringLst!=null && rangeTimeStringLst.size() == 0){ + //one single time line + rangeTimeStringLst.add(refTimeStr); + } + //for (int j=0; j< rangeTimeStringLst.size(); j++){ + //String timeStr = rangeTimeStringLst.get(j); List uairRecordArrList; - uairRecordArrList = ObservedSoundingQuery.getAllStnObservedSndNcUairData(latLonArray,"", timeStr); - + long t003 = System.currentTimeMillis(); + uairRecordArrList = ObservedSoundingQuery.getObservedSndNcUairDataGeneric(coordinateArray, stnIdArr, rangeTimeStringLst,rangeTimeArr); + long t004 = System.currentTimeMillis(); + System.out.println("getObservedSndNcUairDataGeneric query took "+(t004-t003)+"ms"); if(uairRecordArrList!=null && uairRecordArrList.size()>0){ + long t005 = System.currentTimeMillis(); //for each station, processing its records list and keep in one profile for(NcUairRecord[] recordArray:uairRecordArrList){ @@ -1401,8 +1108,8 @@ return dataRequest.execute() pf.setStationId(recordArray[0].getStationId()); if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); - pf.setStationLatitude((float)recordArray[0].getLatitude()); - pf.setStationLongitude((float)recordArray[0].getLongitude()); + pf.setStationLatitude(recordArray[0].getLatitude()); + pf.setStationLongitude(recordArray[0].getLongitude()); //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); @@ -1439,50 +1146,25 @@ return dataRequest.execute() } } + long t006 = System.currentTimeMillis(); + System.out.println("getSoundingData2Generic total sounding time merging for "+uairRecordArrList.size()+" profiles took "+(t006-t005)+"ms"); } - } + //} } - else{ - for ( int i=0; i < latLonArray.length ; i++) - { - for (int j=0; j< timeLineStrList.size(); j++){ - String timeStr = timeLineStrList.get(j); - Calendar timeCal = timeLimeCalList.get(j); - - //MergeSounding2 ms = new MergeSounding2(); - //make sure we have right precision... - lat = Double.parseDouble(Float.toString(latLonArray[i][0])); - lon = Double.parseDouble(Float.toString(latLonArray[i][1])); - /* - * Process sounding data. - */ - - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - //NcSoundingProfile pf = new NcSoundingProfile(); - if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - - //*System.out.println ( " Processing native model data"); - pf = PfcSoundingQuery.getPfcSndData2(lat, lon, "",refTimeCal, validTimeStartCal, sndType,sndQuery); - //PfcSoundingQuery.getPfcSndData(lat, lon, "",refTimeCal, validTimeCal, sndType,sndQuery); - // ms.nativeModelSounding(pf.getSoundingLyLst(), pf.getStationElevation()); - revisit this - Archana - } - else if(sndType.equals(MdlSndType.ANY.toString()) ) { + else if(sndType.equals(PfcSndType.NAMSND.toString()) || + sndType.equals(PfcSndType.GFSSND.toString()) || + sndType.equals(PfcSndType.RUCPTYPSND.toString()) || + sndType.equals(PfcSndType.RUC2SND.toString())) { + + + List listReturned = PfcSoundingQuery.getPfcSndDataGeneric(null, stnIdArr,refTimeStr, rangeTimeStringLst,sndType,level); + soundingProfileList.addAll(listReturned); + convertPfcNcSoundingLayerToNcSoundingLayer2(soundingProfileList); + //sysPrintProfileLayer2(soundingProfileList); + + } + /* + else if(sndType.equals(MdlSndType.ANY.toString()) ) { pf = MdlSoundingQuery.getMdlSndData( lat, lon, refTimeStr, validTimeStartStr, pluginName, modelName ); if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ @@ -1490,159 +1172,170 @@ return dataRequest.execute() pf = null; } } - else if (sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { + */ + /*else if(sndType.equals(ObsSndType.BUFRUA.toString())){ + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + if ( merge == 0 ) { + // ms.unMergedUairSounding + //*System.out.println ( " Request unmerged data"); + if(dataType.equals(DataType.ALLDATA.toString())) + pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,"", refTimeCal, sndQuery); + else + pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, dataType, sndQuery); - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndAllData(lat, lon,"", timeCal, sndType, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, dataType, sndQuery); + } else { - } else { + // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, + // the body of code will return a sounding list with MAN data or single level data. + //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - long t001 = System.currentTimeMillis(); - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTAA", sndQuery); - ttaa = pf.getSoundingLyLst2(); - if (ttaa.size() == 0) { - ttaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUAA", sndQuery).getSoundingLyLst2(); - } + pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal,"TTAA", sndQuery); + ttaa = pf.getSoundingLyLst2(); + ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTBB", sndQuery).getSoundingLyLst2(); + ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTCC", sndQuery).getSoundingLyLst2(); + ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTDD", sndQuery).getSoundingLyLst2(); + //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPAA", sndQuery).getSoundingLyLst2(); + ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPBB", sndQuery).getSoundingLyLst2(); + //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPCC", sndQuery).getSoundingLyLst2(); + ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPDD", sndQuery).getSoundingLyLst2(); + wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst2(); + wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst2(); + trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); + trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); + pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, refTimeCal,sndQuery); + sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTBB", sndQuery).getSoundingLyLst2(); - if (ttbb.size() == 0) { - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUBB", sndQuery).getSoundingLyLst2(); - } + //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); + //for(NcSoundingLayer ly: sls){ + // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); + //} - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTCC", sndQuery).getSoundingLyLst2(); - if (ttcc.size() == 0) { - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUCC", sndQuery).getSoundingLyLst2(); - } - - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTDD", sndQuery).getSoundingLyLst2(); - if (ttdd.size() == 0) { - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUDD", sndQuery).getSoundingLyLst2(); - } - - ppaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPAA", sndQuery).getSoundingLyLst2(); - ppbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPBB", sndQuery).getSoundingLyLst2(); - ppcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPCC", sndQuery).getSoundingLyLst2(); - ppdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPDD", sndQuery).getSoundingLyLst2(); - wmax_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_A", sndQuery).getSoundingLyLst2(); - wmax_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_C", sndQuery).getSoundingLyLst2(); - trop_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); - trop_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, timeCal,sndQuery); - long t02 = System.currentTimeMillis(); - System.out.println("UAIR profile retreival "+ timeStr+" took " + (t02 - t001)); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //System.out.println("UAIR Number of Layers:"+sls.size()); - if (level.toUpperCase().equalsIgnoreCase("MAN")) - pf.setSoundingLyLst2(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - pf.setSoundingLyLst2(sls); - } - else { - pf = null; - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst2(sls); - } - - - } - - } - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,"", refTimeCal, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal,"TTAA", sndQuery); - ttaa = pf.getSoundingLyLst2(); - ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTBB", sndQuery).getSoundingLyLst2(); - ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTCC", sndQuery).getSoundingLyLst2(); - ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTDD", sndQuery).getSoundingLyLst2(); - //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPAA", sndQuery).getSoundingLyLst2(); - ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPBB", sndQuery).getSoundingLyLst2(); - //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPCC", sndQuery).getSoundingLyLst2(); - ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPDD", sndQuery).getSoundingLyLst2(); - wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst2(); - wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst2(); - trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); - trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, refTimeCal,sndQuery); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst2(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2(sls); - } - else { - pf = null; - //System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst2(sls); - } - - } + if (level.toUpperCase().equalsIgnoreCase("MAN") ) + pf.setSoundingLyLst2(sls); + else if( ms.isNumber(level)>=0 ){ + if(sls.size() == 1){ + //System.out.println("NcUair get one layer using level = "+ level); + pf.setSoundingLyLst2(sls); } else { - - /* - * Invalid sounding type - */ - // System.out.println(" Invalid sounding type "); - pf = null; - } - if(pf != null && pf.getSoundingLyLst2().size()>0) { - //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); - - // TODO : move this into the ObservedSoundingQuery methods. - // - pf.setStationLatitude( lat.floatValue() ); - pf.setStationLongitude( lon.floatValue() ); - - - soundingProfileList.add(pf); - //pf.setStationLatitude(lat.floatValue()); - //pf.setStationLongitude(lon.floatValue()); pf = null; + //System.out.println("NcUair get 0 layer using level = "+ level); } } + else { + if(sls.isEmpty() || sls.size() <=1) + pf = null; + else + pf.setSoundingLyLst2(sls); + } + } + + if(pf != null && pf.getSoundingLyLst2().size()>0) { + //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); + + // TODO : move this into the ObservedSoundingQuery methods. + // + pf.setStationLatitude( lat ); + pf.setStationLongitude( lon ); + + + soundingProfileList.add(pf); + //pf.setStationLatitude(lat.floatValue()); + //pf.setStationLongitude(lon.floatValue()); + pf = null; + } + } */ + if(soundingProfileList.size() == 0 ){ + //System.out.println(" Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() is set to failed "); + cube.setRtnStatus(failedRtnStatus); + + } + else{ + //System.out.println(); + cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + //long t02 = System.currentTimeMillis(); + //System.out.println("Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() - success, cube retreival took " + (t02 - t01)); + } + cube.setSoundingProfileList(soundingProfileList); + /*for(int i =0; i < cube.getSoundingProfileList().size();i++){ + System.out.println("lat/lon="+ cube.getSoundingProfileList().get(i).getStationLatitude()+"/"+cube.getSoundingProfileList().get(i).getStationLongitude()+ + " temp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getTemperature()+" dewp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getDewpoint()+" press="+ + cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getPressure() + " height="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getGeoHeight()+ + " windSp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getWindSpeed()+" windDir="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getWindDirection()+ + " omega="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getOmega()); + }*/ + returnedObject = cube; + //long t02 = System.currentTimeMillis(); + //System.out.println("getSoundingData2Generic query took "+(t02-t01)+" ms in total"); + + return returnedObject; + } + /* Chin:: 2/22/2012 + * Only NCUair and PFC (modelsounding DB) query is supported now + * Use generic query API + * */ + public Object getSoundingDataGeneric() throws Exception { + long t01 = System.currentTimeMillis(); + Object returnedObject = new Object(); + //*System.out.println ( " getSoundingDataByLatLonArray "); + + + NcSoundingCube cube = new NcSoundingCube(); + List soundingProfileList = new ArrayList(0); + NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; + + if (sndType.equals(ObsSndType.NCUAIR.toString())) { + //Note: in NC Uair table, we only use ref time for query + if(rangeTimeStringLst!=null && rangeTimeStringLst.size() == 0){ + //one single time line + rangeTimeStringLst.add(refTimeStr); + } + + List uairRecordArrList; + //long t003 = System.currentTimeMillis(); + uairRecordArrList = ObservedSoundingQuery.getObservedSndNcUairDataGeneric(coordinateArray, stnIdArr, rangeTimeStringLst,rangeTimeArr); + //long t004 = System.currentTimeMillis(); + //System.out.println("getObservedSndNcUairDataGeneric API call took "+(t004-t003)+"ms"); + if(uairRecordArrList!=null && uairRecordArrList.size()>0){ + //long t005 = System.currentTimeMillis(); + soundingProfileList=processQueryReturnedNcUairData( uairRecordArrList, useNcSoundingLayer2); + //long t006 = System.currentTimeMillis(); + //System.out.println("getSoundingDataGeneric total sounding time merging for "+uairRecordArrList.size()+" profiles took "+(t006-t005)+"ms"); + } + + } + else if(sndType.equals(PfcSndType.NAMSND.toString()) || + sndType.equals(PfcSndType.GFSSND.toString()) || + sndType.equals(PfcSndType.RUCPTYPSND.toString()) || + sndType.equals(PfcSndType.RUC2SND.toString())) { + + + List listReturned = PfcSoundingQuery.getPfcSndDataGeneric(coordinateArray, stnIdArr,refTimeStr, rangeTimeStringLst,sndType,level); + soundingProfileList.addAll(listReturned); + if(useNcSoundingLayer2==true){ + convertPfcNcSoundingLayerToNcSoundingLayer2(soundingProfileList); + //sysPrintProfileLayer2(soundingProfileList); + } + + } + else if(sndType.equals(MdlSndType.ANY.toString()) ) { + return getSoundingDataByLatLonArray(); + } + else if(sndType.equals(ObsSndType.BUFRUA.toString())){ + return getSoundingDataByLatLonArray(); } if(soundingProfileList.size() == 0 ){ //System.out.println(" Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() is set to failed "); @@ -1664,735 +1357,18 @@ return dataRequest.execute() " omega="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getOmega()); }*/ returnedObject = cube; - - - return returnedObject; - } - /* Chin:: this metod is to query DB using algorithm that query on per station basis - * Currently is not used. But keep it here. May be useful later. - * - */ - public Object getSoundingLayer2DataUsingLatLonArrayPerStn() throws Exception { - //long t01 = System.currentTimeMillis(); - Object returnedObject = new Object(); - //*System.out.println ( " getSoundingDataByLatLonArray "); - if(latLonArray.length <= 0){ - returnedObject = null; - return returnedObject; - } - List timeLineStrList=new ArrayList();; - List timeLimeCalList = new ArrayList(); - if(validTimeEnd !=0 && validTimeEnd > validTimeStart){ - //range of time line request - timeLimeCalList = ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, validTimeStartCal, validTimeEndCal); - for (int i=0; i< timeLimeCalList.size(); i++){ - Calendar timeCal = timeLimeCalList.get(i); - String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); - timeLineStrList.add(timeStr); - - } - } - else { - //one single time line - timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); - timeLimeCalList.add(refTimeCal); - } - NcSoundingCube cube = new NcSoundingCube(); - List soundingProfileList = new ArrayList(0); - SndQueryKeyType sndQuery = SndQueryKeyType.LATLON; - NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; - for ( int i=0; i < latLonArray.length ; i++) - { - for (int j=0; j< timeLineStrList.size(); j++){ - String timeStr = timeLineStrList.get(j); - Calendar timeCal = timeLimeCalList.get(j); - - MergeSounding2 ms = new MergeSounding2(); - //make sure we have right precision... - lat = Double.parseDouble(Float.toString(latLonArray[i][0])); - lon = Double.parseDouble(Float.toString(latLonArray[i][1])); - /* - * Process sounding data. - */ - - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - NcSoundingProfile pf = new NcSoundingProfile(); - if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - - //*System.out.println ( " Processing native model data"); - pf = PfcSoundingQuery.getPfcSndData2(lat, lon, "",refTimeCal, validTimeStartCal, sndType,sndQuery); - //PfcSoundingQuery.getPfcSndData(lat, lon, "",refTimeCal, validTimeCal, sndType,sndQuery); - // ms.nativeModelSounding(pf.getSoundingLyLst(), pf.getStationElevation()); - revisit this - Archana - } - else if(sndType.equals(MdlSndType.ANY.toString()) ) { - - pf = MdlSoundingQuery.getMdlSndData( lat, lon, refTimeStr, validTimeStartStr, pluginName, modelName ); - if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ - failedRtnStatus = pf.getRtnStatus(); - pf = null; - } - } - else if (sndType.equals(ObsSndType.NCUAIR.toString())) { - // System.out.println ( "From getSoundingLayer2DataUsingLatLonArray for ObsSndType.NCUAIR"); - //System.out.println("getSoundingDataByLatLonArray:NcUair: lat="+lat+ " lon="+lon); - //make sure we have right precision... - - if ( merge == 0 ) { - //Chin...need more coding - pf = null; - } - else{ - - NcUairRecord[] recordArray = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr); - if(recordArray != null && recordArray.length >0){ - for(int k=0; k< recordArray.length; k++){ - NcUairRecord record= recordArray[k]; - if(record.getDataType().equals("TTAA")){ - ttaa = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_a = getSoundingLayer2FromNcUairRecordTrop( record); - wmax_a = getSoundingLayer2FromNcUairRecordMaxw(record ); - } - else if(record.getDataType().equals("TTBB")){ - ttbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("TTCC")){ - ttcc = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_c = getSoundingLayer2FromNcUairRecordTrop( record ); - wmax_c = getSoundingLayer2FromNcUairRecordMaxw( record ); - } - else if(record.getDataType().equals("TTDD")){ - ttdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPAA")){ - ppaa= getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPBB")){ - ppbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPCC")){ - ppcc = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPDD")){ - ppdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - } - pf.setStationElevation((float)recordArray[0].getElevation()); - pf.setStationId(recordArray[0].getStationId()); - if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) - pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); - pf.setStationLatitude((float)recordArray[0].getLatitude()); - pf.setStationLongitude((float)recordArray[0].getLongitude()); - //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); - } - - - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - if (level.toUpperCase().equalsIgnoreCase("MAN") ){ - pf.setSoundingLyLst2( sls ); - // System.out.println("sls set to the sounding profile"); - } - else if( ms.isNumber( level )>=0 ){ - if(sls.size() == 1){ - // System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2( sls ); - } - else { - pf = null; - // System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1){ - pf = null; - // System.out.println("not MAN level & sls is empty or 1"); - } - else{ - pf.setSoundingLyLst2 ( sls ); - // System.out.println("sls set to the sounding profile for level = " + level); - } - } - } - } - else if (sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndAllData(lat, lon,"", timeCal, sndType, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - long t001 = System.currentTimeMillis(); - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTAA", sndQuery); - ttaa = pf.getSoundingLyLst2(); - if (ttaa.size() == 0) { - ttaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUAA", sndQuery).getSoundingLyLst2(); - } - - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTBB", sndQuery).getSoundingLyLst2(); - if (ttbb.size() == 0) { - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUBB", sndQuery).getSoundingLyLst2(); - } - - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTCC", sndQuery).getSoundingLyLst2(); - if (ttcc.size() == 0) { - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUCC", sndQuery).getSoundingLyLst2(); - } - - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTDD", sndQuery).getSoundingLyLst2(); - if (ttdd.size() == 0) { - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUDD", sndQuery).getSoundingLyLst2(); - } - - ppaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPAA", sndQuery).getSoundingLyLst2(); - ppbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPBB", sndQuery).getSoundingLyLst2(); - ppcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPCC", sndQuery).getSoundingLyLst2(); - ppdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPDD", sndQuery).getSoundingLyLst2(); - wmax_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_A", sndQuery).getSoundingLyLst2(); - wmax_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_C", sndQuery).getSoundingLyLst2(); - trop_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); - trop_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, timeCal,sndQuery); - long t02 = System.currentTimeMillis(); - System.out.println("UAIR profile retreival "+ timeStr+" took " + (t02 - t001)); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //System.out.println("UAIR Number of Layers:"+sls.size()); - if (level.toUpperCase().equalsIgnoreCase("MAN")) - pf.setSoundingLyLst2(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - pf.setSoundingLyLst2(sls); - } - else { - pf = null; - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst2(sls); - } - - - } - - } - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,"", refTimeCal, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal,"TTAA", sndQuery); - ttaa = pf.getSoundingLyLst2(); - ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTBB", sndQuery).getSoundingLyLst2(); - ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTCC", sndQuery).getSoundingLyLst2(); - ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTDD", sndQuery).getSoundingLyLst2(); - //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPAA", sndQuery).getSoundingLyLst2(); - ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPBB", sndQuery).getSoundingLyLst2(); - //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPCC", sndQuery).getSoundingLyLst2(); - ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPDD", sndQuery).getSoundingLyLst2(); - wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst2(); - wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst2(); - trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); - trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, refTimeCal,sndQuery); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst2(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2(sls); - } - else { - pf = null; - //System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst2(sls); - } - - } - } - else { - - /* - * Invalid sounding type - */ - // System.out.println(" Invalid sounding type "); - pf = null; - } - if(pf != null && pf.getSoundingLyLst2().size()>0) { - //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); - - // TODO : move this into the ObservedSoundingQuery methods. - // - pf.setStationLatitude( lat.floatValue() ); - pf.setStationLongitude( lon.floatValue() ); - - - soundingProfileList.add(pf); - //pf.setStationLatitude(lat.floatValue()); - //pf.setStationLongitude(lon.floatValue()); - pf = null; - } - } - } - if(soundingProfileList.size() == 0 ){ - //System.out.println(" Return status from getSoundingLayer2DataUsingLatLonArrayPerStn() is set to failed "); - cube.setRtnStatus(failedRtnStatus); - - } - else{ - //System.out.println(); - cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); - //long t02 = System.currentTimeMillis(); - //System.out.println("getSoundingLayer2DataUsingLatLonArrayPerStn() - success get stn#="+ soundingProfileList.size()+" cube retreival took " + (t02 - t01)); - } - // System.out.println(" Before storing the sounding profile list in the sounding cube"); - cube.setSoundingProfileList(soundingProfileList); - // System.out.println(" Before storing the sounding cube in the returnedObject"); - returnedObject = cube; - - - return returnedObject; - } - /* Chin - * This method use algorithm to query on per station per data type basis. It is slow. .. - * Keep for a while. To be removed later, - */ - public Object getSoundingLayer2DataUsingLatLonArrayOld() throws Exception { - long t01 = System.currentTimeMillis(); - Object returnedObject = new Object(); - //*System.out.println ( " getSoundingDataByLatLonArray "); - if(latLonArray.length <= 0){ - returnedObject = null; - return returnedObject; - } - List timeLineStrList=new ArrayList();; - List timeLimeCalList = new ArrayList(); - if(validTimeEnd !=0 && validTimeEnd > validTimeStart){ - //range of time line request - timeLimeCalList = ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, validTimeStartCal, validTimeEndCal); - for (int i=0; i< timeLimeCalList.size(); i++){ - Calendar timeCal = timeLimeCalList.get(i); - String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); - timeLineStrList.add(timeStr); - - } - } - else { - //one single time line - timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); - timeLimeCalList.add(refTimeCal); - } - NcSoundingCube cube = new NcSoundingCube(); - List soundingProfileList = new ArrayList(0); - SndQueryKeyType sndQuery = SndQueryKeyType.LATLON; - NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; - for ( int i=0; i < latLonArray.length ; i++) - { - for (int j=0; j< timeLineStrList.size(); j++){ - String timeStr = timeLineStrList.get(j); - Calendar timeCal = timeLimeCalList.get(j); - - MergeSounding2 ms = new MergeSounding2(); - //make sure we have right precision... - lat = Double.parseDouble(Float.toString(latLonArray[i][0])); - lon = Double.parseDouble(Float.toString(latLonArray[i][1])); - /* - * Process sounding data. - */ - - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - NcSoundingProfile pf = new NcSoundingProfile(); - if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - - //*System.out.println ( " Processing native model data"); - pf = PfcSoundingQuery.getPfcSndData2(lat, lon, "",refTimeCal, validTimeStartCal, sndType,sndQuery); - //PfcSoundingQuery.getPfcSndData(lat, lon, "",refTimeCal, validTimeCal, sndType,sndQuery); - // ms.nativeModelSounding(pf.getSoundingLyLst(), pf.getStationElevation()); - revisit this - Archana - } - else if(sndType.equals(MdlSndType.ANY.toString()) ) { - - pf = MdlSoundingQuery.getMdlSndData( lat, lon, refTimeStr, validTimeStartStr, pluginName, modelName ); - if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ - failedRtnStatus = pf.getRtnStatus(); - pf = null; - } - } - else if (sndType.equals(ObsSndType.NCUAIR.toString())) { - // System.out.println ( "From getSoundingLayer2DataUsingLatLonArray for ObsSndType.NCUAIR"); - //System.out.println("getSoundingDataByLatLonArray:NcUair: lat="+lat+ " lon="+lon); - //make sure we have right precision... - - if ( merge == 0 ) { - //Chin...need more coding - pf = null; - } - else{ - - - - //get TTAA & TROPOPAUSE_A & MAXWIND_A - NcUairRecord record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "TTAA", sndQuery); - if(record != null){ - // ttaa = getSndLayersFromNcUairRecordObsLevel(record); - // trop_a = getSndLayersFromNcUairRecordTrop(record); - // wmax_a = getSndLayersFromNcUairRecordMaxw(record); - ttaa = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_a = getSoundingLayer2FromNcUairRecordTrop( record ); - wmax_a = getSoundingLayer2FromNcUairRecordMaxw( record ); - // System.out.println("The URI for this record is: "+ record.getDataURI() ); - // for ( NcSoundingLayer2 ttaaSnding : ttaa) { - // if ( ttaaSnding != null ){ - // PressureLevel sndingPresLevel = ttaaSnding.getPressure(); - // if ( sndingPresLevel != null && sndingPresLevel.hasValidValue() ){ - // System.out.println("TTAA_PRES = " + sndingPresLevel - // .getValue().floatValue() ); - // } - // } - // } - // System.out.println(" Size of ttaa = " + ttaa.size()); - // System.out.println(" Size of trop_a = " + trop_a.size()); - // System.out.println(" Size of wmax_a = " + wmax_a.size()); - } - //get TTCC & TROPOPAUSE_C & MAXWIND_C - record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "TTCC", sndQuery); - if(record != null){ - // ttcc = getSndLayersFromNcUairRecordObsLevel(record); - // trop_c = getSndLayersFromNcUairRecordTrop(record); - // wmax_c = getSndLayersFromNcUairRecordMaxw(record); - ttcc = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_c = getSoundingLayer2FromNcUairRecordTrop( record ); - wmax_c = getSoundingLayer2FromNcUairRecordMaxw( record ); - // System.out.println(" Size of ttcc = " + ttcc.size()); - // System.out.println(" Size of trop_c = " + trop_c.size()); - // System.out.println(" Size of wmax_c = " + wmax_c.size()); - } - //get TTBB - record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "TTBB", sndQuery); - if(record != null){ - ttbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - // ttbb = getSndLayersFromNcUairRecordObsLevel(record); - // System.out.println(" Size of ttbb = " + ttbb.size()); - } - //get TTDD - record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "TTDD", sndQuery); - if(record != null){ - // ttdd = getSndLayersFromNcUairRecordObsLevel(record); - ttdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - // System.out.println(" Size of ttdd = " + ttdd.size()); - } - //get PPAA - record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "PPAA", sndQuery); - if(record != null){ - // ppaa = getSndLayersFromNcUairRecordObsLevel(record); - ppaa= getSoundingLayer2FromNcUairRecordObsLevel(record); - // System.out.println(" Size of ppaa = " + ppaa.size()); - } - //get PPBB - record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "PPBB", sndQuery); - if(record != null){ - // ppbb = getSndLayersFromNcUairRecordObsLevel(record); - ppbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - // System.out.println(" Size of ppbb = " + ppbb.size()); - } - //get PPCC - record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "PPCC", sndQuery); - if(record != null){ - // ppcc = getSndLayersFromNcUairRecordObsLevel(record); - ppcc = getSoundingLayer2FromNcUairRecordObsLevel(record); - // System.out.println(" Size of ppcc = " + ppcc.size()); - } - //get PPDD - record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "PPDD", sndQuery); - if(record != null){ - // ppdd = getSndLayersFromNcUairRecordObsLevel(record); - ppdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - // System.out.println(" Size of ppdd = " + ppdd.size()); - } - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, timeCal,sndQuery); - - - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - //if ( sls != null ){ - // System.out.println("Number of layers after the merging: " + sls.size() ); - // for (NcSoundingLayer2 thisSoundingLayer2: sls){ - // if ( thisSoundingLayer2 != null ){ - // System.out.println(" Pressure = " + thisSoundingLayer2.getPressure().getValue().doubleValue()); - // System.out.println(" Height = " + thisSoundingLayer2.getGeoHeight().getValue().doubleValue()); - // } - // } - //} - // System.out.println(" level = " + level ); - if (level.toUpperCase().equalsIgnoreCase("MAN") ){ - pf.setSoundingLyLst2( sls ); - // System.out.println("sls set to the sounding profile"); - } - else if( ms.isNumber( level )>=0 ){ - if(sls.size() == 1){ - // System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2( sls ); - } - else { - pf = null; - // System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1){ - pf = null; - // System.out.println("not MAN level & sls is empty or 1"); - } - else{ - pf.setSoundingLyLst2 ( sls ); - // System.out.println("sls set to the sounding profile for level = " + level); - } - } - } - } - else if (sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndAllData(lat, lon,"", timeCal, sndType, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - long t001 = System.currentTimeMillis(); - pf = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTAA", sndQuery); - ttaa = pf.getSoundingLyLst2(); - if (ttaa.size() == 0) { - ttaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUAA", sndQuery).getSoundingLyLst2(); - } - - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTBB", sndQuery).getSoundingLyLst2(); - if (ttbb.size() == 0) { - ttbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUBB", sndQuery).getSoundingLyLst2(); - } - - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTCC", sndQuery).getSoundingLyLst2(); - if (ttcc.size() == 0) { - ttcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUCC", sndQuery).getSoundingLyLst2(); - } - - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TTDD", sndQuery).getSoundingLyLst2(); - if (ttdd.size() == 0) { - ttdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "UUDD", sndQuery).getSoundingLyLst2(); - } - - ppaa = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPAA", sndQuery).getSoundingLyLst2(); - ppbb = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPBB", sndQuery).getSoundingLyLst2(); - ppcc = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPCC", sndQuery).getSoundingLyLst2(); - ppdd = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "PPDD", sndQuery).getSoundingLyLst2(); - wmax_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_A", sndQuery).getSoundingLyLst2(); - wmax_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "MAXWIND_C", sndQuery).getSoundingLyLst2(); - trop_a = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); - trop_c = ObservedSoundingQuery.getObservedSndData(lat, lon, "", timeCal, sndType, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, timeCal,sndQuery); - long t02 = System.currentTimeMillis(); - System.out.println("UAIR profile retreival "+ timeStr+" took " + (t02 - t001)); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //System.out.println("UAIR Number of Layers:"+sls.size()); - if (level.toUpperCase().equalsIgnoreCase("MAN")) - pf.setSoundingLyLst2(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - pf.setSoundingLyLst2(sls); - } - else { - pf = null; - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst2(sls); - } - - - } - - } - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,"", refTimeCal, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal,"TTAA", sndQuery); - ttaa = pf.getSoundingLyLst2(); - ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTBB", sndQuery).getSoundingLyLst2(); - ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTCC", sndQuery).getSoundingLyLst2(); - ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTDD", sndQuery).getSoundingLyLst2(); - //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPAA", sndQuery).getSoundingLyLst2(); - ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPBB", sndQuery).getSoundingLyLst2(); - //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPCC", sndQuery).getSoundingLyLst2(); - ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPDD", sndQuery).getSoundingLyLst2(); - wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst2(); - wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst2(); - trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); - trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, refTimeCal,sndQuery); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst2(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2(sls); - } - else { - pf = null; - //System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst2(sls); - } - - } - } - else { - - /* - * Invalid sounding type - */ - // System.out.println(" Invalid sounding type "); - pf = null; - } - if(pf != null && pf.getSoundingLyLst2().size()>0) { - //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); - - // TODO : move this into the ObservedSoundingQuery methods. - // - pf.setStationLatitude( lat.floatValue() ); - pf.setStationLongitude( lon.floatValue() ); - - - soundingProfileList.add(pf); - //pf.setStationLatitude(lat.floatValue()); - //pf.setStationLongitude(lon.floatValue()); - pf = null; - } - } - } - if(soundingProfileList.size() == 0 ){ - System.out.println(" Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() is set to failed "); - cube.setRtnStatus(failedRtnStatus); - - } - else{ - System.out.println(); - cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); - long t02 = System.currentTimeMillis(); - System.out.println("Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() - success, cube retreival took " + (t02 - t01)); - } - // System.out.println(" Before storing the sounding profile list in the sounding cube"); - cube.setSoundingProfileList(soundingProfileList); - // System.out.println(" Before storing the sounding cube in the returnedObject"); - returnedObject = cube; - + //long t02 = System.currentTimeMillis(); + //System.out.println("getSoundingDataGeneric API took "+(t02-t01)+" ms in total"); return returnedObject; } + /* * This API is for getting multiple locations sounding info at one shot. * StnIdArray or StnNumArray is used as input stn info for each location. * - */ + * Chin Note: 02/27/12 obsoleting this one. Use getSoundingDataGeneric() + * public Object getSoundingDataByStnArray() throws Exception { Object returnedObject = new Object(); //System.out.println ( " getSoundingData "); @@ -2447,9 +1423,6 @@ return dataRequest.execute() for (int j=0; j< timeLineStrList.size(); j++){ String timeStr = timeLineStrList.get(j); Calendar timeCal = timeLimeCalList.get(j); - /* - * Process sounding data. - */ List sls = new ArrayList(); List ttaa = new ArrayList(); @@ -2642,10 +1615,6 @@ return dataRequest.execute() pf = null; } else { - - /* - * Invalid sounding type - */ pf = null; } if(pf != null && pf.getSoundingLyLst().size()>0) { @@ -2667,27 +1636,386 @@ return dataRequest.execute() return returnedObject; } - + */ public Object getModels() throws Exception { Object returnedObject = new Object(); - NcSoundingModel mdls = MdlSoundingQuery.getMdls(tableName); + NcSoundingModel mdls = MdlSoundingQuery.getMdls(pluginName); returnedObject = mdls; return returnedObject; } -/* - * - * -import NcSoundingDataRequest -sndRq = NcSoundingDataRequest.NcSoundingDataRequest() -sndRq.setSndType('NCUAIR') -sndRq.setDataType('ALLDATA') -sndRq.setRefTime(1320278400000L) -sndRq.setValidTimeStart(1320278400000L) -sndRq.setValidTimeEnd(1320278400000L) -sndRq.setMerge(1) -sndRq.setLevel('500') -sndRq.getSoundingLayer2DataByLatLonArray([32.37,-64.68,47.47,-111.38,53.96,-101.09,60.03,-111.93,28.200000762939453,-87.5999984741211,28.63,-106.08,51.28,-80.59,36.23333,-86.55,34.77556,-76.87917,18.72,-110.95,53.29,-60.36,28.88,-118.3,55.03,-131.57,17.98,-92.92,19.3,-81.35,43.93,-60.01]) -*/ - + /* Chin: this is not completed yet.... + * When use point data query for bufrua is supported, then we have to work on this one. + * + */ + private List processQueryReturnedBufruaData(List uairRecordArrList, boolean useNcSndLayer2){ + List soundingProfileList = new ArrayList(0); + /* + if ( merge == 0 ) { + return soundingProfileList; + + } + else { + for(UAObs[] recordArray:uairRecordArrList){ + + NcSoundingProfile pf; + + pf = new NcSoundingProfile(); + if(useNcSndLayer2== true){ + //need more code + } + else { + if(recordArray != null && recordArray.length >0){ + MergeSounding ms = new MergeSounding(); + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + + for(int k=0; k< recordArray.length; k++){ + UAObs record= recordArray[k]; + if(record.getReportType() == NcSoundingLayer.dataTypeMap.get("TTAA")){ + ttaa = getSndLayersFromNcUairRecordObsLevel(record); + trop_a = getSndLayersFromNcUairRecordTrop(record); + wmax_a = getSndLayersFromNcUairRecordMaxw(record); + } + else if(record.getDataType().equals("TTBB")){ + ttbb = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("TTCC")){ + ttcc = getSndLayersFromNcUairRecordObsLevel(record); + trop_c = getSndLayersFromNcUairRecordTrop(record); + wmax_c = getSndLayersFromNcUairRecordMaxw(record); + } + else if(record.getDataType().equals("TTDD")){ + ttdd = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPAA")){ + ppaa= getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPBB")){ + ppbb = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPCC")){ + ppcc = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPDD")){ + ppdd = getSndLayersFromNcUairRecordObsLevel(record); + } + } + pf = new NcSoundingProfile(); + pf.setStationElevation((float)recordArray[0].getElevation()); + pf.setStationId(recordArray[0].getStationId()); + if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) + pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); + pf.setStationLatitude(recordArray[0].getLatitude()); + pf.setStationLongitude(recordArray[0].getLongitude()); + pf.setFcsTime(recordArray[0].getDataTime().getRefTime().getTime()); + //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); + sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); + if (level.toUpperCase().equalsIgnoreCase("MAN") ) + pf.setSoundingLyLst(sls); + else if( ms.isNumber(level)>=0 ){ + if(sls.size() == 1){ + //System.out.println("NCUAIR get one layer using level = "+ level); + pf.setSoundingLyLst(sls); + } + else { + pf = null; + //System.out.println("NCUAIR get 0 layer using level = "+ level); + } + } + else { + if(sls.isEmpty() || sls.size() <=1) + pf = null; + else + pf.setSoundingLyLst(sls); + } + } + else + pf = null; + } + if(pf != null && (pf.getSoundingLyLst2().size()>0||pf.getSoundingLyLst().size()>0 )) { + //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); + soundingProfileList.add(pf); + pf = null; + } + } + }*/ + return soundingProfileList; + } + + private List processQueryReturnedNcUairData(List uairRecordArrList, boolean useNcSndLayer2){ + List soundingProfileList = new ArrayList(0); + for(NcUairRecord[] recordArray:uairRecordArrList){ + + NcSoundingProfile pf; + + if ( merge == 0 ) { + //Chin...need more coding + pf = null; + } + else{ + pf = new NcSoundingProfile(); + if(useNcSndLayer2== true){ + //use NcSoundingLayer2 + if(recordArray != null && recordArray.length >0){ + MergeSounding2 ms2 = new MergeSounding2(); + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + + for(int k=0; k< recordArray.length; k++){ + NcUairRecord record= recordArray[k]; + if(record.getDataType().equals("TTAA")){ + ttaa = getSoundingLayer2FromNcUairRecordObsLevel( record ); + trop_a = getSoundingLayer2FromNcUairRecordTrop( record); + wmax_a = getSoundingLayer2FromNcUairRecordMaxw(record ); + } + else if(record.getDataType().equals("TTBB")){ + ttbb = getSoundingLayer2FromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("TTCC")){ + ttcc = getSoundingLayer2FromNcUairRecordObsLevel( record ); + trop_c = getSoundingLayer2FromNcUairRecordTrop( record ); + wmax_c = getSoundingLayer2FromNcUairRecordMaxw( record ); + } + else if(record.getDataType().equals("TTDD")){ + ttdd = getSoundingLayer2FromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPAA")){ + ppaa= getSoundingLayer2FromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPBB")){ + ppbb = getSoundingLayer2FromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPCC")){ + ppcc = getSoundingLayer2FromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPDD")){ + ppdd = getSoundingLayer2FromNcUairRecordObsLevel(record); + } + } + pf.setStationElevation((float)recordArray[0].getElevation()); + pf.setStationId(recordArray[0].getStationId()); + if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) + pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); + pf.setStationLatitude(recordArray[0].getLatitude()); + pf.setStationLongitude(recordArray[0].getLongitude()); + pf.setFcsTime(recordArray[0].getDataTime().getRefTime().getTime()); + //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); + if(useNcSndLayer2) + sls = ms2.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); + + if (level.toUpperCase().equalsIgnoreCase("MAN") ){ + pf.setSoundingLyLst2( sls ); + // System.out.println("sls set to the sounding profile"); + } + else if( ms2.isNumber( level )>=0 ){ + if(sls.size() == 1){ + // System.out.println("NcUair get one layer using level = "+ level); + pf.setSoundingLyLst2( sls ); + } + else { + pf = null; + // System.out.println("NcUair get 0 layer using level = "+ level); + } + } + else { + if(sls.isEmpty() || sls.size() <=1){ + pf = null; + // System.out.println("not MAN level & sls is empty or 1"); + } + else{ + pf.setSoundingLyLst2 ( sls ); + // System.out.println("sls set to the sounding profile for level = " + level); + } + } + } + } + else{ + //use NcSoundingLayer + if(recordArray != null && recordArray.length >0){ + MergeSounding ms = new MergeSounding(); + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + for(int k=0; k< recordArray.length; k++){ + NcUairRecord record= recordArray[k]; + if(record.getDataType().equals("TTAA")){ + ttaa = getSndLayersFromNcUairRecordObsLevel(record); + trop_a = getSndLayersFromNcUairRecordTrop(record); + wmax_a = getSndLayersFromNcUairRecordMaxw(record); + } + else if(record.getDataType().equals("TTBB")){ + ttbb = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("TTCC")){ + ttcc = getSndLayersFromNcUairRecordObsLevel(record); + trop_c = getSndLayersFromNcUairRecordTrop(record); + wmax_c = getSndLayersFromNcUairRecordMaxw(record); + } + else if(record.getDataType().equals("TTDD")){ + ttdd = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPAA")){ + ppaa= getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPBB")){ + ppbb = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPCC")){ + ppcc = getSndLayersFromNcUairRecordObsLevel(record); + } + else if(record.getDataType().equals("PPDD")){ + ppdd = getSndLayersFromNcUairRecordObsLevel(record); + } + } + pf = new NcSoundingProfile(); + pf.setStationElevation((float)recordArray[0].getElevation()); + pf.setStationId(recordArray[0].getStationId()); + if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) + pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); + pf.setStationLatitude(recordArray[0].getLatitude()); + pf.setStationLongitude(recordArray[0].getLongitude()); + pf.setFcsTime(recordArray[0].getDataTime().getRefTime().getTime()); + //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); + sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); + //System.out.println("NCUAIR Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); + //for(NcSoundingLayer ly: sls){ + // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); + //} + + if (level.toUpperCase().equalsIgnoreCase("MAN") ) + pf.setSoundingLyLst(sls); + else if( ms.isNumber(level)>=0 ){ + if(sls.size() == 1){ + //System.out.println("NCUAIR get one layer using level = "+ level); + pf.setSoundingLyLst(sls); + } + else { + pf = null; + //System.out.println("NCUAIR get 0 layer using level = "+ level); + } + } + else { + if(sls.isEmpty() || sls.size() <=1) + pf = null; + else + pf.setSoundingLyLst(sls); + } + } + else + pf = null; + } + if(pf != null && (pf.getSoundingLyLst2().size()>0||pf.getSoundingLyLst().size()>0 )) { + //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); + soundingProfileList.add(pf); + pf = null; + } + } + } + return soundingProfileList; + } + /* + * Convert sounding data saved in NcSoundingLayer list to NcSoundingLayer2 list + * remove NcSoundingLayer data to have a smaller size for sending back to client + */ + private void convertPfcNcSoundingLayerToNcSoundingLayer2(List pfLst){ + for(NcSoundingProfile pf: pfLst){ + List soundLy2List = new ArrayList(); + for (NcSoundingLayer level : pf.getSoundingLyLst()) + { + NcSoundingLayer2 soundingLy2; + try { + soundingLy2 = new NcSoundingLayer2(); + AirTemperature airTemp; + airTemp = new AirTemperature(); + airTemp.setValue( new Amount ( level.getTemperature(), SI.CELSIUS ) ); + soundingLy2.setTemperature(airTemp); + + DewPointTemp dewPoint = new DewPointTemp(); + dewPoint.setValue( new Amount (level.getDewpoint(), SI.CELSIUS ) ); + soundingLy2.setDewpoint(dewPoint); + + PressureLevel pressure = new PressureLevel(); + pressure.setValue( new Amount (level.getPressure(), NcUnits.MILLIBAR )); + soundingLy2.setPressure(pressure); + + WindDirection windDirection = new WindDirection(); + windDirection.setValue(level.getWindDirection(), NonSI.DEGREE_ANGLE); + soundingLy2.setWindDirection(windDirection); + + WindSpeed windSpeed = new WindSpeed(); + // HDF5 data in unit of Knots, no conversion needed + windSpeed.setValue( level.getWindSpeed(), NonSI.KNOT); + soundingLy2.setWindSpeed(windSpeed); + + HeightAboveSeaLevel height = new HeightAboveSeaLevel(); + height.setValue(level.getGeoHeight(), SI.METER ); + soundingLy2.setGeoHeight(height); + + Omega omega = new Omega(); + omega.setValueAs(level.getOmega(), ""); + soundingLy2.setOmega(omega); + //soundingLy.setPressure(level.getPressure().floatValue()/100); + //soundingLy.setWindU(level.getUcWind().floatValue()); // HDF5 data in unit of Knots, no conversion needed + //soundingLy.setWindV(level.getVcWind().floatValue()); + //soundingLy.setSpecHumidity(level.getSpecificHumidity().floatValue()); + soundLy2List.add(soundingLy2); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + //Collections.sort(soundLyList,reversePressureComparator()); + pf.setSoundingLyLst2(soundLy2List); + pf.getSoundingLyLst().clear(); + } + } + private void sysPrintProfileLayer2(List pfs){ + System.out.println("-----------------------------------------------------------------\n sysPrintProfileLayer2: profile size ="+ pfs.size()); + for(int i =0; i < pfs.size();i++){ + if(pfs.get(i).getStationId().indexOf('K') == 0){ + System.out.println("pf"+i+ " stn="+pfs.get(i).getStationId()+" lat/lon="+ pfs.get(i).getStationLatitude()+"/"+pfs.get(i).getStationLongitude()); + if(pfs.get(i).getSoundingLyLst2().size() >0){ + System.out.println(" temp="+pfs.get(i).getSoundingLyLst2().get(0).getTemperature()+" dewp="+pfs.get(i).getSoundingLyLst2().get(0).getDewpoint()+" press="+ + pfs.get(i).getSoundingLyLst2().get(0).getPressure() + " height="+pfs.get(i).getSoundingLyLst2().get(0).getGeoHeight()+ + " windSp="+pfs.get(i).getSoundingLyLst2().get(0).getWindSpeed()+" windDir="+pfs.get(i).getSoundingLyLst2().get(0).getWindDirection()+ + " omega="+pfs.get(i).getSoundingLyLst2().get(0).getOmega()); + } + } + } + } + } 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 d053d4d049..d4241471c0 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 @@ -19,6 +19,7 @@ package gov.noaa.nws.ncep.edex.uengine.tasks.profile; * 10/20/2011 S. Gurung Added ncuair changes related to replacing slat/slon/selv with location of type SurfaceObsLocation * Nov 2011 Chin Chen changed Ncuair table query algorithm for performance improvement * 01/05/2012 S. Gurung Removed references to UAIR (performed cleanup) + * 02/28/2012 Chin Chen modify several sounding query algorithms for better performance * * * @author Chin Chen @@ -53,10 +54,9 @@ import com.raytheon.uf.common.datastorage.IDataStore; import com.raytheon.uf.common.datastorage.Request; import com.raytheon.uf.common.datastorage.records.FloatDataRecord; import com.raytheon.uf.common.datastorage.records.IntegerDataRecord; -import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.dataplugin.bufrua.UAObs; +import com.raytheon.uf.common.dataplugin.bufrua.dao.BufrUAPointDataTransform; import com.raytheon.uf.common.pointdata.PointDataContainer; -import com.raytheon.uf.common.pointdata.spatial.SurfaceObsLocation; import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; @@ -66,7 +66,6 @@ import com.vividsolutions.jts.geom.Coordinate; public class ObservedSoundingQuery { private static final UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND.getConverterTo(NonSI.KNOT); private static final UnitConverter kelvinToCelsius = SI.KELVIN.getConverterTo(SI.CELSIUS); - private static final String UAIR_TBL_NAME = "uair"; private static final String NCUAIR_TBL_NAME = "ncuair"; private static final String BURFUA_TBL_NAME = "bufrua"; private static String currentDBTblName = "nil"; @@ -81,7 +80,7 @@ public class ObservedSoundingQuery { CoreDao dao; List fields = new ArrayList(); List values = new ArrayList(); - if(obType.equals(ObsSndType.NCUAIR.toString())){ + /*if(obType.equals(ObsSndType.NCUAIR.toString())){ List operands = new ArrayList(); List lUairRecords = null; if(queryType==SndQueryKeyType.STNID){ @@ -109,7 +108,7 @@ public class ObservedSoundingQuery { operands.add("<="); } else { - //*System.out.println("request query type "+ queryType+ " is not supported in this API" ); + //System.out.println("request query type "+ queryType+ " is not supported in this API" ); return pf; } fields.add("synopticTime");// the synoptic time field name defined in UairRecord @@ -128,11 +127,11 @@ public class ObservedSoundingQuery { pf.setStationLongitude((float)lUairRecords.get(0).getLongitude()); } }catch (DataAccessLayerException e) { - //*System.out.println("obs sounding query exception"); + //System.out.println("obs sounding query exception"); e.printStackTrace(); } } - else if(obType.equals(ObsSndType.BUFRUA.toString())) { + else*/ if(obType.equals(ObsSndType.BUFRUA.toString())) { List lUairRecords = null; if(queryType==SndQueryKeyType.STNID){ fields.add("stationName");// the stationName String field name defined in UAObs, dont be confused with UAIRRecord definition @@ -164,6 +163,7 @@ public class ObservedSoundingQuery { if(lUairRecords.get(0).getStationId()!=null && lUairRecords.get(0).getStationId().length()>0) pf.setStationNum(Integer.parseInt(lUairRecords.get(0).getStationId())); pf.setStationId(lUairRecords.get(0).getStationName()); + pf.setFcsTime(lUairRecords.get(0).getDataTime().getRefTime().getTime()); } }catch (DataAccessLayerException e) { //*System.out.println("obs sounding query exception"); @@ -257,8 +257,8 @@ public class ObservedSoundingQuery { NcSoundingStnInfo stn = stnInfoCol.getNewStnInfo(); stn.setStnId(stnInfo); - stn.setStationLongitude((float)lon); - stn.setStationLatitude((float)lat); + stn.setStationLongitude(lon); + stn.setStationLatitude(lat); stn.setStationElevation((float)elv); stn.setSynopTime(synoptictime); stationInfoList.add((NcSoundingStnInfo)stn); @@ -342,8 +342,8 @@ public class ObservedSoundingQuery { /* * Chin: Note: get NcUair based on stn is NOT supported yet!!! * NEW: This function requests ONE station's all dataTypes data at once - * Nsharp is using this metod...dont remove it without consulting Nsharp developer - */ + * NSHARP is using this metod...dont remove it without consulting Nsharp developer + * public static NcUairRecord[] getObservedSndNcUairData(Double lat, Double lon, String stn, String refTime){ PointDataQuery request = null; @@ -356,19 +356,16 @@ public class ObservedSoundingQuery { request.setParameters(NcUairToRecord.MAN_PARAMS_LIST); request.addParameter("location.latitude", String.valueOf(lat), "="); request.addParameter("location.longitude", String.valueOf(lon), "="); - /*request.addParameter("location.latitude", String.valueOf(lat-0.1), ">="); - request.addParameter("location.latitude", String.valueOf(lat+0.1), "<="); - request.addParameter("location.longitude", String.valueOf(lon-0.1), ">="); - request.addParameter("location.longitude", String.valueOf(lon+0.1), "<=");*/ + request.addParameter("dataTime.refTime",refTime, "="); request.addParameter("nil", String.valueOf(false), "="); //Chin newQ request.addParameter("dataType", dataType, "="); - //long t001 = System.currentTimeMillis(); + long t001 = System.currentTimeMillis(); request.requestAllLevels(); result = request.execute(); - //long t002 = System.currentTimeMillis(); + long t002 = System.currentTimeMillis(); //totalRqTime=totalRqTime+(t002-t001); - //System.out.println("getObservedSndNcUairData request at lat="+ lat+ " lon="+lon+" took "+(t002-t001)+"ms total Qtime="+totalRqTime); + //System.out.println("getObservedSndNcUairData request at lat="+ lat+ " lon="+lon+" took "+(t002-t001)+"ms "); if (result != null) { //System.out.println("getObservedSndNcUairData: result is not null, getAllocatedSz= "+ result.getAllocatedSz()); //System.out.println("getObservedSndNcUairData:getting "+dataType); @@ -426,12 +423,13 @@ public class ObservedSoundingQuery { return pickedH5Records.toArray(new NcUairRecord[pickedH5Records.size()]); } return null; - } + }*/ /* * Chin: Note: get NcUair based on stn is NOT supported yet!!! * NEW: This function requests ALL stn with all dataTypes and returns all good ("corrected")records at once to improve performance - */ - public static List getAllStnObservedSndNcUairData(float[][] latLonArray, String stn, String refTime){ + * Need performance improving by using Operand "in" for lat/lon pair, see getObservedSndNcUairDataByLatLonArrayNew() 02/15/2012 Chin + * + public static List getObservedSndNcUairDataByLatLonArray(double[][] latLonArray, String refTime){ //List soundingProfileList= new ArrayList(); PointDataQuery request = null; PointDataContainer result = null; @@ -441,12 +439,13 @@ public class ObservedSoundingQuery { List finalRecordArrayList = new ArrayList(); maxLat=minLat=0.0; maxLon=minLon=0.0; - for ( int i=0; i < latLonArray.length ; i++) + for ( int i=0; i < latLonArray.length ; i++) { //make sure we have right precision... - lat = Double.parseDouble(Float.toString(latLonArray[i][0])); - lon = Double.parseDouble(Float.toString(latLonArray[i][1])); + lat = latLonArray[i][0]; + lon = latLonArray[i][1]; + //latLonStr = latLonStr+ if(i==0){ maxLat=minLat=lat; maxLon=minLon=lon; @@ -481,8 +480,8 @@ public class ObservedSoundingQuery { for ( int i=0; i < latLonArray.length ; i++) { //for each station - lat = Double.parseDouble(Float.toString(latLonArray[i][0])); - lon = Double.parseDouble(Float.toString(latLonArray[i][1])); + lat = latLonArray[i][0]; + lon = latLonArray[i][1]; NcUairRecord record; List stnRecords = new ArrayList(); //System.out.println("Before loop: Number of records in returnedDbRecords="+returnedDbRecords.size()); @@ -537,7 +536,7 @@ public class ObservedSoundingQuery { //pickedUairRecords.get(0).setNil(false); // set for special handling for its caller finalRecordArrayList.add(pickedUairRecords.toArray(new NcUairRecord[pickedUairRecords.size()])); //System.out.println("After checking: stn record size="+pickedUairRecords.size()); - }/*Chin: If caller need all query stns returned (no matter there is no data), then we may need to add this code... + }//Chin: If caller need all query stns returned (no matter there is no data), then we may need to add this code... else { //just add a null record array NcUairRecord dummy = new NcUairRecord(); @@ -550,7 +549,7 @@ public class ObservedSoundingQuery { NcUairRecord[] dummys= new NcUairRecord[1]; dummys[0] = dummy; finalRecordArrayList.add(dummys); - }*/ + }// } } } @@ -558,10 +557,573 @@ public class ObservedSoundingQuery { e.printStackTrace(); } return finalRecordArrayList; + }*/ + /* + * Chin: Note: get NcUair based on stn is NOT supported yet!!! + * NEW: This function requests ALL stn with all dataTypes and returns all good ("corrected")records at once to improve performance + * Performance improved by using Operand "in" for lat/lon pair. 02/16/2012 Chin + * + public static List getObservedSndNcUairDataByLatLonArrayNew(double[][] latLonArray, String refTime){ + //List soundingProfileList= new ArrayList(); + PointDataQuery request = null; + PointDataContainer result = null; + //NcUairRecord[] h5Records=null; + Double lat, lon; + List returnedDbRecords = new ArrayList(); + List finalRecordArrayList = new ArrayList(); + String latStr="", lonStr=""; + for ( int i=0; i < latLonArray.length ; i++) + { + latStr = latStr+String.valueOf(latLonArray[i][0])+","; + lonStr = lonStr+String.valueOf(latLonArray[i][1])+","; + } + latStr=latStr.substring(0, latStr.length()-1);//get rid of last "," + lonStr=lonStr.substring(0, lonStr.length()-1);//get rid of last "," + try { + request = new PointDataQuery("ncuair"); + request.setParameters(NcUairToRecord.MAN_PARAMS_LIST); + + request.addParameter("location.latitude",latStr, "in"); + request.addParameter("location.longitude", lonStr, "in"); + request.addParameter("dataTime.refTime",refTime, "="); + request.addParameter("nil", String.valueOf(false), "="); + request.requestAllLevels(); + result = request.execute(); + //long t002 = System.currentTimeMillis(); + //totalRqTime=totalRqTime+(t002-t001); + //System.out.println("getObservedSndNcUairData request at lat="+ lat+ " lon="+lon+" took "+(t002-t001)+"ms total Qtime="+totalRqTime); + if (result != null) { + returnedDbRecords = NcUairToRecord.toNcUairRecordsList(result); + + if(returnedDbRecords!= null && returnedDbRecords.size() > 0){ + System.out.println("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 + for ( int i=0; i < latLonArray.length ; i++) + { + //for each station + lat = latLonArray[i][0]; + lon = latLonArray[i][1]; + NcUairRecord record; + List stnRecords = new ArrayList(); + + for(int j=returnedDbRecords.size()-1; j >=0; j--){ + record =returnedDbRecords.get(j); + if(record.getLatitude() >= lat - 0.1 && record.getLatitude() <= lat + 0.1 && record.getLongitude() >= lon-0.1&& record.getLongitude() <= lon+0.1){ + //remove this record from return list and add it to this stn list + stnRecords.add(returnedDbRecords.remove(j)); + } + } + if(stnRecords.size()>0){ + //System.out.println("Before checking:stn lat="+lat +"stn record size="+stnRecords.size()); + List pickedUairRecords = new ArrayList(); + NcUairRecord orignalRd; + boolean addToList = true; + for(int ii=0; ii< stnRecords.size(); ii++){ + orignalRd = stnRecords.get(ii); + addToList = true; + for(NcUairRecord pickedRd: pickedUairRecords){ + if(orignalRd.getDataType().equals( pickedRd.getDataType())){ + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " find a same datatype="+pickedRd.getDataType()+ " orignalRd corr="+orignalRd.getCorr()+ + // " pickedRd Corr="+pickedRd.getCorr()); + + //the two records have same data type + //this records will either replace the one in list or be dropped + addToList = false; + if ((pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())<0) || + (pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())==0 && orignalRd.getCorr()!=null && pickedRd.getCorr() != null && pickedRd.getCorr().compareTo(orignalRd.getCorr())<0 )|| + (pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())==0 && orignalRd.getCorr()!=null && pickedRd.getCorr() == null) + ) + { + // decide to replace picked with original record, based on the following cases, in (priority) order + //case 1: original record has "later" issue time than picked record + //case 2: original record has "larger" correction "corr" than picked record + //case 3: original record has correction "corr", picked record does not have + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " ori= " + orignalRd.getDataURI()+ + // " picked="+ pickedRd.getDataURI()); + int pickedIndex = pickedUairRecords.indexOf(pickedRd); + pickedUairRecords.set(pickedIndex, orignalRd); + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " afterreplaced picked record ="+pickedH5Records.get(pickedIndex).getDataURI()); + } + break; + } + } + if(addToList==true){ + // add this original record to picked list + pickedUairRecords.add(orignalRd); + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " add ori to picked record ="+orignalRd.getDataURI()); + + } + } + //pickedUairRecords.get(0).setNil(false); // set for special handling for its caller + finalRecordArrayList.add(pickedUairRecords.toArray(new NcUairRecord[pickedUairRecords.size()])); + //System.out.println("After checking: stn record size="+pickedUairRecords.size()); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println(" Number of records in finalRecordArrayList="+finalRecordArrayList.size()); + return finalRecordArrayList; + }*/ + /* + * Chin: Note: + * NEW: This function requests ALL stn with all dataTypes and returns all good ("corrected")records at once to improve performance + * Performance improved by using Operand "in" for stnId list. 02/16/2012 Chin + * + public static List getObservedSndNcUairDataByStnIdArray(String[] stnIdArray, String refTime){ + //List soundingProfileList= new ArrayList(); + PointDataQuery request = null; + PointDataContainer result = null; + //NcUairRecord[] h5Records=null; + String stnStr; + List returnedDbRecords = new ArrayList(); + List finalRecordArrayList = new ArrayList(); + String stnIdListStr=""; + for ( int i=0; i < stnIdArray.length ; i++) + { + + if(i < stnIdArray.length -1){ + stnIdListStr = stnIdListStr+stnIdArray[i]+","; + } + } + try { + request = new PointDataQuery("ncuair"); + request.setParameters(NcUairToRecord.MAN_PARAMS_LIST); + + request.addParameter("location.stationId",stnIdListStr, "in"); + request.addParameter("dataTime.refTime",refTime, "="); + request.addParameter("nil", String.valueOf(false), "="); + request.requestAllLevels(); + long t001 = System.currentTimeMillis(); + result = request.execute(); + long t002 = System.currentTimeMillis(); + //totalRqTime=totalRqTime+(t002-t001); + System.out.println("getObservedSndNcUairDataByStnIdArray request stn size="+ stnIdArray.length+ " took "+(t002-t001)+"ms"); + + if (result != null) { + long t003 = System.currentTimeMillis(); + returnedDbRecords = NcUairToRecord.toNcUairRecordsList(result); + + if(returnedDbRecords!= null && returnedDbRecords.size() > 0){ + System.out.println("getObservedSndNcUairDataByStnIdArray 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 + for ( int i=0; i < stnIdArray.length ; i++) + { + //for each station + stnStr = stnIdArray[i]; + NcUairRecord record; + List stnRecords = new ArrayList(); + + for(int j=returnedDbRecords.size()-1; j >=0; j--){ + record =returnedDbRecords.get(j); + //System.out.println("requesting stn="+stnStr+" returned rd stnId="+record.getStationId()+ " stnNum="+record.getStnum()); + if(stnStr.equals(record.getStationId())){ + //remove this record from return list and add it to this stn list + stnRecords.add(returnedDbRecords.remove(j)); + } + } + if(stnRecords.size()>0){ + //System.out.println("Before checking:stn lat="+lat +"stn record size="+stnRecords.size()); + List pickedUairRecords = new ArrayList(); + NcUairRecord orignalRd; + boolean addToList = true; + for(int ii=0; ii< stnRecords.size(); ii++){ + orignalRd = stnRecords.get(ii); + addToList = true; + for(NcUairRecord pickedRd: pickedUairRecords){ + if(orignalRd.getDataType().equals( pickedRd.getDataType())){ + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " find a same datatype="+pickedRd.getDataType()+ " orignalRd corr="+orignalRd.getCorr()+ + // " pickedRd Corr="+pickedRd.getCorr()); + + //the two records have same data type + //this records will either replace the one in list or be dropped + addToList = false; + if ((pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())<0) || + (pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())==0 && orignalRd.getCorr()!=null && pickedRd.getCorr() != null && pickedRd.getCorr().compareTo(orignalRd.getCorr())<0 )|| + (pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())==0 && orignalRd.getCorr()!=null && pickedRd.getCorr() == null) + ) + { + // decide to replace picked with original record, based on the following cases, in (priority) order + //case 1: original record has "later" issue time than picked record + //case 2: original record has "larger" correction "corr" than picked record + //case 3: original record has correction "corr", picked record does not have + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " ori= " + orignalRd.getDataURI()+ + // " picked="+ pickedRd.getDataURI()); + int pickedIndex = pickedUairRecords.indexOf(pickedRd); + pickedUairRecords.set(pickedIndex, orignalRd); + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " afterreplaced picked record ="+pickedH5Records.get(pickedIndex).getDataURI()); + } + break; + } + } + if(addToList==true){ + // add this original record to picked list + pickedUairRecords.add(orignalRd); + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " add ori to picked record ="+orignalRd.getDataURI()); + + } + } + //pickedUairRecords.get(0).setNil(false); // set for special handling for its caller + finalRecordArrayList.add(pickedUairRecords.toArray(new NcUairRecord[pickedUairRecords.size()])); + //System.out.println("After checking: stn record size="+pickedUairRecords.size()); + } + } + + } + long t004 = System.currentTimeMillis(); + System.out.println(" sorting return records took "+(t004-t003)+"ms"); + } + } catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("getObservedSndNcUairDataByStnIdArray Number of records in finalRecordArrayList="+finalRecordArrayList.size()); + return finalRecordArrayList; + }*/ + /* + * Chin: 2/21/2012 + * Using Lat/lon array OR StnId array, AND soundingTimeAry (fcst time array) as input. + * This function is to be generic for all cases. + * One and only one of latLonArray and stnIdArr should be not null and the other one should be null + * soundingTimeAry is a list of refer time (in Bufrua, only use refer time for query) should be not null + * Chin's note: NOT completed yet................. + */ + public static List getObservedSndBufruaDataGeneric(Coordinate[] coordArray,String[] stnIdArray, List soundingTimeStrList, long[] soundTimeLongArr){ + //List soundingProfileList= new ArrayList(); + PointDataQuery request = null; + PointDataContainer result = null; + //NcUairRecord[] h5Records=null; + String stnStr=""; + Coordinate coord= new Coordinate();; + List returnedDbRecords = new ArrayList(); + UAObs[] returnedDbRecordArr; + List finalRecordArrayList = new ArrayList(); + boolean queryByStn; + try { + request = new PointDataQuery("bufrua"); + request.setParameters(BufrUAPointDataTransform.MAN_PARAMS_LIST); + request.requestAllLevels(); + String d=""; + for (String timeStr: soundingTimeStrList){ + d = d+timeStr; + d= d+","; + } + d=d.substring(0, d.length()-1);//get rid of last "," + request.addParameter("dataTime.refTime",d, "in"); + if(coordArray != null){ + String latStr="", lonStr=""; + for ( int i=0; i < coordArray.length ; i++) + { + latStr = latStr+String.valueOf(coordArray[i].y)+","; + lonStr = lonStr+String.valueOf(coordArray[i].x)+","; + } + latStr=latStr.substring(0, latStr.length()-1);//get rid of last "," + lonStr=lonStr.substring(0, lonStr.length()-1);//get rid of last "," + request.addParameter("location.latitude",latStr, "in"); + request.addParameter("location.longitude", lonStr, "in"); + queryByStn = false; + } + else if(stnIdArray != null){ + String stnIdListStr=""; + for ( int i=0; i < stnIdArray.length ; i++) + { + + if(i < stnIdArray.length -1){ + stnIdListStr = stnIdListStr+stnIdArray[i]+","; + } + } + request.addParameter("location.stationId",stnIdListStr, "in"); + queryByStn= true; + } + else { + return finalRecordArrayList; + } + long t001 = System.currentTimeMillis(); + result = request.execute(); + long t002 = System.currentTimeMillis(); + //totalRqTime=totalRqTime+(t002-t001); + System.out.println("getObservedSndBufruaDataGeneric data query alone took "+(t002-t001)+"ms"); + + if (result != null) { + long t003 = System.currentTimeMillis(); + returnedDbRecordArr = BufrUAPointDataTransform.toUAObsRecords(result); + for(int i=0; i < returnedDbRecordArr.length; i++) + returnedDbRecords.add(returnedDbRecordArr[i]); + if(returnedDbRecords!= null && returnedDbRecords.size() > 0){ + System.out.println("getObservedSndBufruaDataGeneric 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; + if(queryByStn== true){ + loopLen = stnIdArray.length; + } + else { + loopLen = coordArray.length; + } + UAObs record; + + for ( int i=0; i < loopLen ; i++) + { + //for each station + if(queryByStn== true){ + stnStr = stnIdArray[i]; + } + else{ + coord = coordArray[i]; + } + + List> stnRecordsList = new ArrayList>(); + for (long refT: soundTimeLongArr){ + List stnRecords = new ArrayList(); + stnRecordsList.add(stnRecords); + } + for(int j=returnedDbRecords.size()-1; j >=0; j--){ + record =returnedDbRecords.get(j); + boolean goodRecord = false; + //System.out.println("requesting stn="+stnStr+" returned rd stnId="+record.getStationId()+ " stnNum="+record.getStnum()); + if(queryByStn== true){ + if(stnStr.equals(record.getStationId()) ){ + //remove this record from return list and add it to this stn list + //stnRecords.add(returnedDbRecords.remove(j)); + goodRecord = true; + } + } + else { + //System.out.println("coor.x="+coord.x + " coor.y="+coord.y + " record lon="+record.getLongitude()+ " record lat="+ record.getLatitude()); + //Chin: for some unknown reason that record returned from DB with lat/lon extended with many digits + //For example, coor.x=-114.4 coor.y=32.85 record lon=-114.4000015258789 record lat=32.849998474121094 + //Therefore, do the following. + if( Math.abs(coord.x-record.getLongitude())< 0.01 && Math.abs(coord.y-record.getLatitude())<0.01){ + //remove this record from return list and add it to this stn list + //stnRecords.add(returnedDbRecords.remove(j)); + goodRecord = true; + } + } + if(goodRecord == true){ + for(int index=0; index< soundTimeLongArr.length; index++){ + long refT= soundTimeLongArr[index]; + if( refT == record.getDataTime().getRefTime().getTime()){ + stnRecordsList.get(index).add(returnedDbRecords.remove(j)); + } + } + } + } + for(List recordList:stnRecordsList){ + if(recordList.size()>0){ + + //pickedUairRecords.get(0).setNil(false); // set for special handling for its caller + finalRecordArrayList.add(recordList.toArray(new UAObs[recordList.size()])); + //System.out.println("getObservedSndNcUairDataGeneric Number of records in PF=" + pickedUairRecords.size()); + } + } + } + + } + long t004 = System.currentTimeMillis(); + System.out.println(" sorting return records took "+(t004-t003)+"ms"); + } + } catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("getObservedSndBufruaDataGeneric Number profiles (record[]s) in finalRecordArrayList="+finalRecordArrayList.size()); + return finalRecordArrayList; + } + /* + * Chin: 2/21/2012 + * Using Lat/lon array OR StnId array, AND soundingTimeAry (fcst time array) as input. + * This function is to be generic for all cases. + * One and only one of latLonArray and stnIdArr should be not null and the other one should be null + * soundingTimeAry is a list of refer time (in NCUair, only use refer time for query) should be not null + * + */ + public static List getObservedSndNcUairDataGeneric(Coordinate[] coordArray,String[] stnIdArray, List soundingTimeStrList, long[] soundTimeLongArr){ + //List soundingProfileList= new ArrayList(); + PointDataQuery request = null; + PointDataContainer result = null; + //NcUairRecord[] h5Records=null; + String stnStr=""; + Coordinate coord= new Coordinate();; + List returnedDbRecords = new ArrayList(); + List finalRecordArrayList = new ArrayList(); + boolean queryByStn; + try { + request = new PointDataQuery("ncuair"); + request.setParameters(NcUairToRecord.MAN_PARAMS_LIST); + request.addParameter("nil", String.valueOf(false), "="); + request.requestAllLevels(); + String d=""; + for (String timeStr: soundingTimeStrList){ + d = d+timeStr; + d= d+","; + } + d=d.substring(0, d.length()-1);//get rid of last "," + request.addParameter("dataTime.refTime",d, "in"); + if(coordArray != null){ + String latStr="", lonStr=""; + for ( int i=0; i < coordArray.length ; i++) + { + latStr = latStr+String.valueOf(coordArray[i].y)+","; + lonStr = lonStr+String.valueOf(coordArray[i].x)+","; + } + latStr=latStr.substring(0, latStr.length()-1);//get rid of last "," + lonStr=lonStr.substring(0, lonStr.length()-1);//get rid of last "," + request.addParameter("location.latitude",latStr, "in"); + request.addParameter("location.longitude", lonStr, "in"); + queryByStn = false; + } + else if(stnIdArray != null){ + String stnIdListStr=""; + for ( int i=0; i < stnIdArray.length ; i++) + { + + if(i < stnIdArray.length -1){ + stnIdListStr = stnIdListStr+stnIdArray[i]+","; + } + } + request.addParameter("location.stationId",stnIdListStr, "in"); + queryByStn= true; + } + else { + return finalRecordArrayList; + } + long t001 = System.currentTimeMillis(); + result = request.execute(); + long t002 = System.currentTimeMillis(); + //totalRqTime=totalRqTime+(t002-t001); + 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()); + //Chin: keep list of records for same station + //search through all returned records and keep same staion's records in one list + int loopLen; + if(queryByStn== true){ + loopLen = stnIdArray.length; + } + else { + loopLen = coordArray.length; + } + NcUairRecord record; + + for ( int i=0; i < loopLen ; i++) + { + //for each station + if(queryByStn== true){ + stnStr = stnIdArray[i]; + } + else{ + coord = coordArray[i]; + } + + List> stnRecordsList = new ArrayList>(); + for (long refT: soundTimeLongArr){ + //create empty List for each sounding time line + List stnRecords = new ArrayList(); + stnRecordsList.add(stnRecords); + } + for(int j=returnedDbRecords.size()-1; j >=0; j--){ + record =returnedDbRecords.get(j); + boolean goodRecord = false; + //System.out.println("requesting stn="+stnStr+" returned rd stnId="+record.getStationId()+ " stnNum="+record.getStnum()); + if(queryByStn== true){ + if(stnStr.equals(record.getStationId()) ){ + //remove this record from return list and add it to this stn list + //stnRecords.add(returnedDbRecords.remove(j)); + goodRecord = true; + } + } + else { + //System.out.println("coor.x="+coord.x + " coor.y="+coord.y + " record lon="+record.getLongitude()+ " record lat="+ record.getLatitude()); + //Chin: for some unknown reason that record returned from DB with lat/lon extended with many digits + //For example, coor.x=-114.4 coor.y=32.85 record lon=-114.4000015258789 record lat=32.849998474121094 + //Therefore, do the following. + if( Math.abs(coord.x-record.getLongitude())< 0.01 && Math.abs(coord.y-record.getLatitude())<0.01){ + //remove this record from return list and add it to this stn list + //stnRecords.add(returnedDbRecords.remove(j)); + goodRecord = true; + } + } + if(goodRecord == true){ + for(int index=0; index< soundTimeLongArr.length; index++){ + long refT= soundTimeLongArr[index]; + if( refT == record.getDataTime().getRefTime().getTime()){ + stnRecordsList.get(index).add(returnedDbRecords.remove(j)); + } + } + } + } + for(List recordList:stnRecordsList){ + if(recordList.size()>0){ + //System.out.println("Before checking:stn lat="+lat +"stn record size="+stnRecords.size()); + List pickedUairRecords = new ArrayList(); + NcUairRecord orignalRd; + boolean addToList = true; + for(int ii=0; ii< recordList.size(); ii++){ + orignalRd = recordList.get(ii); + addToList = true; + for(NcUairRecord pickedRd: pickedUairRecords){ + if(orignalRd.getDataType().equals( pickedRd.getDataType())){ + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " find a same datatype="+pickedRd.getDataType()+ " orignalRd corr="+orignalRd.getCorr()+ + // " pickedRd Corr="+pickedRd.getCorr()); + + //the two records have same data type + //this records will either replace the one in list or be dropped + addToList = false; + if ((pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())<0) || + (pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())==0 && orignalRd.getCorr()!=null && pickedRd.getCorr() != null && pickedRd.getCorr().compareTo(orignalRd.getCorr())<0 )|| + (pickedRd.getIssueTime().compareTo(orignalRd.getIssueTime())==0 && orignalRd.getCorr()!=null && pickedRd.getCorr() == null) + ) + { + // decide to replace picked with original record, based on the following cases, in (priority) order + //case 1: original record has "later" issue time than picked record + //case 2: original record has "larger" correction "corr" than picked record + //case 3: original record has correction "corr", picked record does not have + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " ori= " + orignalRd.getDataURI()+ + // " picked="+ pickedRd.getDataURI()); + int pickedIndex = pickedUairRecords.indexOf(pickedRd); + pickedUairRecords.set(pickedIndex, orignalRd); + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " afterreplaced picked record ="+pickedH5Records.get(pickedIndex).getDataURI()); + } + break; + } + } + if(addToList==true){ + // add this original record to picked list + pickedUairRecords.add(orignalRd); + //System.out.println("getObservedSndNcUairData: at lat="+ lat+ " lon="+lon+ " add ori to picked record ="+orignalRd.getDataURI()); + + } + } + //pickedUairRecords.get(0).setNil(false); // set for special handling for its caller + finalRecordArrayList.add(pickedUairRecords.toArray(new NcUairRecord[pickedUairRecords.size()])); + //System.out.println("getObservedSndNcUairDataGeneric Number of records in PF=" + pickedUairRecords.size()); + } + } + } + + } + long t004 = System.currentTimeMillis(); + 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()); + return finalRecordArrayList; } /* * This method query ONE station's specific one dataType data only - */ + * public static NcUairRecord getObservedSndNcUairData(Double lat, Double lon, String stn, String refTime, String dataType, SndQueryKeyType queryType){ NcUairRecord effectRecord=null; PointDataQuery request = null; @@ -621,316 +1183,7 @@ public class ObservedSoundingQuery { } return effectRecord; } - - /* - * this api is provided for applications and for testing to retrieve observed uair data from PostgreSql DB - * dataType should use "enum DataType" defined in NcSoundingLayer.java - * Support "ALLDATA" data type only - */ - public static NcSoundingProfile getObservedSndAllData(Double lat, Double lon, String stn, long refTimeL, String obType, SndQueryKeyType queryType){ - Calendar refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // for testing ...refTimeCal.setTimeInMillis(1276581600000L); - //refTimeCal.setTimeInMillis(refTime.getTime()); - refTimeCal.setTimeInMillis(refTimeL); - return getObservedSndAllData(lat, lon, stn, refTimeCal, obType, queryType); - } - - /* - * this api is provided for applications and for testing to retrieve observed uair data from PostgreSql DB - * dataType should use "enum DataType" defined in NcSoundingLayer.java - * Support "ALLDATA" data type only - */ - public static NcSoundingProfile getObservedSndAllData(Double lat, Double lon, String stn, Calendar refTimeCal, String obType, SndQueryKeyType queryType){ - NcSoundingProfile pfAll= new NcSoundingProfile(); - List soundingLyLst, finalsoundingLyLst; - /*if(obType.equals(ObsSndType.UAIR.toString())){ - NcSoundingProfile pf = getObservedSndData(lat, lon, stn, refTimeCal, obType, "TTAA", queryType); - pfAll.setStationElevation(pf.getStationElevation()); - finalsoundingLyLst = pf.getSoundingLyLst(); - if (finalsoundingLyLst.size() == 0) { - finalsoundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "UUAA", queryType).getSoundingLyLst(); - } - - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "TTBB", queryType).getSoundingLyLst(); - if (soundingLyLst.size() == 0) { - soundingLyLst = getObservedSndData(lat, lon,stn, refTimeCal, obType, "UUBB", queryType).getSoundingLyLst(); - } - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "TTCC", queryType).getSoundingLyLst(); - if (soundingLyLst.size() == 0) { - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "UUCC", queryType).getSoundingLyLst(); - } - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "TTDD", queryType).getSoundingLyLst(); - if (soundingLyLst.size() == 0) { - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "UUDD", queryType).getSoundingLyLst(); - } - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "PPAA", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "PPBB", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "PPCC", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "PPDD", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon,stn, refTimeCal, obType, "MAXWIND_A", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "MAXWIND_C", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "TROPOPAUSE_A", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - soundingLyLst = getObservedSndData(lat, lon, stn,refTimeCal, obType, "TROPOPAUSE_C", queryType).getSoundingLyLst(); - if (soundingLyLst.size() >= 0){ - finalsoundingLyLst.addAll(soundingLyLst); - } - pfAll.setSoundingLyLst(finalsoundingLyLst); - } - */ - return pfAll; - } - /* - * this api is provided for applications and for testing to retrieve observed uair data from PostgreSql DB - * dataType should use "enum DataType" defined in NcSoundingLayer.java - * Support all dataType except "ALLDATA" data type - * using either lat/lon, stnId or stnNum and synopticTime as key - * refTime is with unit of msec as input - */ - public static NcSoundingProfile getObservedSndData(Double lat, Double lon,String stn, long refTimeL, String obType, String dataType, SndQueryKeyType queryType){ - Calendar refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // for testing ...refTimeCal.setTimeInMillis(1276581600000L); - //refTimeCal.setTimeInMillis(refTime.getTime()); - refTimeCal.setTimeInMillis(refTimeL); - return getObservedSndData(lat, lon, stn, refTimeCal, obType, dataType, queryType); - } - /* - * this api is provided for applications and for testing to retrieve observed uair data from PostgreSql DB - * dataType should use "enum DataType" defined in NcSoundingLayer.java - * Support all dataType except "ALLDATA" data type - * using either lat/lon, stnId or stnNum and synopticTime as key - * reference time is with Calendar data type as input - */ - @SuppressWarnings("unchecked") - public static NcSoundingProfile getObservedSndData(Double lat, Double lon,String stn, Calendar refTimeCal, String obType, String dataType, SndQueryKeyType queryType){ - NcSoundingProfile pf = new NcSoundingProfile(); - //one StnPt represent one data time line - List soundLyLst = new ArrayList(); - NcSoundingLayer soundingLy; - soundLyLst.clear(); - - //String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", refTimeCal); - //*System.out.println("sndType= "+ obType+" data type="+ dataType+ " lat " + lat+ " lon "+ lon+" GMT time " + gmtTimeStr ); - - /*obType = ObsSndType.UAIR.toString(); // currently assume all uair sounding type - if(obType.equals(ObsSndType.UAIR.toString())){ - if(dataType.equals(NcSoundingLayer.DataType.ALLDATA.toString())){ - //System.out.println("request all data is not supported in this API"); - } - else { - List fields = new ArrayList(); - List values = new ArrayList(); - List operands = new ArrayList(); - List lUairRecords = null; - if(queryType==SndQueryKeyType.STNID){ - fields.add("stationId");// the stnId field name defined in UairRecord - values.add(stn); - operands.add("="); - } - else if(queryType==SndQueryKeyType.STNNUM){ - fields.add("stationNumber");// the stnNum field name defined in UairRecord - values.add(stn); - operands.add("="); - } - else if(queryType==SndQueryKeyType.LATLON){ - fields.add("slat");// the lat field name defined in UairRecord - values.add(lat-0.1); - operands.add(">="); - fields.add("slat");// the lat field name defined in UairRecord - values.add(lat+0.1); - operands.add("<="); - fields.add("slon");// the lon field name defined in UairRecord - values.add(lon-0.1); - operands.add(">="); - fields.add("slon");// the lon field name defined in UairRecord - values.add(lon+0.1); - operands.add("<="); - - } - else { - //System.out.println("request query type "+ queryType+ " is not supported in this API" ); - return pf; - } - fields.add("dataTime.refTime");// the synoptic time field name defined in UairRecord - //fields.add("synopticTime");// the synoptic time field name defined in UairRecord - values.add(refTimeCal.getTime()); - operands.add("="); - fields.add("nil");// nil field name defined in UairRecord - values.add(false); - operands.add("="); - fields.add("dataType");// the record dataType field name defined in UairRecord - String realDataType; //when query, need to use TTAA for MAXWIND_A, or TROPOPAUSE_A, and TTCC for MAXWIND_C, or TROPOPAUSE_C - if(dataType.equals(NcSoundingLayer.DataType.MAXWIND_A.toString()) || - dataType.equals(NcSoundingLayer.DataType.TROPOPAUSE_A.toString())){ - realDataType = NcSoundingLayer.DataType.TTAA.toString(); - } else if(dataType.equals(NcSoundingLayer.DataType.MAXWIND_C.toString()) || - dataType.equals(NcSoundingLayer.DataType.TROPOPAUSE_C.toString())){ - realDataType = NcSoundingLayer.DataType.TTCC.toString(); - } else - realDataType = dataType; - values.add(realDataType); - operands.add("="); - - CoreDao dao = new CoreDao(DaoConfig.forClass(UairRecord.class)); - try { - lUairRecords = (List) dao.queryByCriteria(fields, values, operands); - if(lUairRecords.size() > 0){ - //*System.out.println("size of uairrecord " + lUairRecords.size()); - int lastCorrectedRecord=0; - String currentCorInd = ""; - Calendar curIssueTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // set init time - curIssueTime.setTimeInMillis(0); - - if(lUairRecords.size() > 1){ - for(int i=0; i< lUairRecords.size(); i++){ - //Since we are using lat/lon/refTime to query uair table. We may have several records returned for - // one query. It indicates there is a correction report, then we should use the newest one report. - // we compare corIndicator to find the latest record. - //System.out.println("id ="+lUairRecords.get(i).getId() + " datauri=" +lUairRecords.get(i).getDataURI()); - //System.out.println("size of ObsLevels ="+lUairRecords.get(i).getObsLevels().size() ); - //System.out.println("size of maxWind ="+lUairRecords.get(i).getMaxWind().size() ); - //System.out.println("size of Tropopause ="+lUairRecords.get(i).getTropopause().size() ); - //System.out.println("correction ind ="+lUairRecords.get(i).getCorIndicator() ); - if((curIssueTime.compareTo(lUairRecords.get(i).getIssueTime())==0 && lUairRecords.get(i).getCorIndicator()!= null && currentCorInd.compareTo(lUairRecords.get(i).getCorIndicator()) < 0)|| - (curIssueTime.compareTo(lUairRecords.get(i).getIssueTime())<0)) { - currentCorInd = lUairRecords.get(i).getCorIndicator(); - curIssueTime = lUairRecords.get(i).getIssueTime(); - lastCorrectedRecord = i; - } - } - } - pf.setStationElevation((float)lUairRecords.get(lastCorrectedRecord).getSelv()); - pf.setStationId(lUairRecords.get(lastCorrectedRecord).getStationId()); - if(lUairRecords.get(lastCorrectedRecord).getStationNumber()!= null && lUairRecords.get(lastCorrectedRecord).getStationNumber().length() >0){ - //System.out.println("stn num = "+ lUairRecords.get(lastCorrectedRecord).getStationNumber()); - pf.setStationNum(Integer.parseInt(lUairRecords.get(lastCorrectedRecord).getStationNumber())); - }else{ - pf.setStationNum(-1); - } - pf.setStationLatitude((float)lUairRecords.get(lastCorrectedRecord).getSlat()); - pf.setStationLongitude((float)lUairRecords.get(lastCorrectedRecord).getSlon()); - //System.out.println("stn elevation ="+ pf.getStationElevation() ); - - - if((lUairRecords.get(lastCorrectedRecord).getObsLevels().size()>0) && - !dataType.equals(NcSoundingLayer.DataType.MAXWIND_A.toString()) && - !dataType.equals(NcSoundingLayer.DataType.TROPOPAUSE_A.toString()) && - !dataType.equals(NcSoundingLayer.DataType.MAXWIND_C.toString()) && - !dataType.equals(NcSoundingLayer.DataType.TROPOPAUSE_C.toString())){ - //*System.out.println("getting "+ dataType); - - java.util.Iterator it=lUairRecords.get(lastCorrectedRecord).getObsLevels().iterator(); - while(it.hasNext()) - { - ObsLevels value=(ObsLevels)it.next(); - soundingLy = new NcSoundingLayer(); - soundingLy.setGeoHeight(value.getGeoHeight()); - soundingLy.setTemperature(value.getTemp()); - soundingLy.setPressure(value.getPressure()); - soundingLy.setWindDirection(value.getWindDirection()); - if ( value.getWindSpeed() != NcSoundingLayer.MISSING ) { - soundingLy.setWindSpeed((float)metersPerSecondToKnots.convert((float)value.getWindSpeed())); - } else { - soundingLy.setWindSpeed((float)value.getWindSpeed()); - } - soundingLy.setDewpoint(value.getDwpt()); - // System.out.println("pressure :"+value.getPressure() + " temp:" + value.getTemp() + " H:"+value.getGeoHeight() + " D:" + - // value.getWindDirection() + " F: " + value.getWindSpeed()); - soundLyLst.add(soundingLy); - } - } - else if(lUairRecords.get(lastCorrectedRecord).getMaxWind().size() >0 && - (dataType.equals(NcSoundingLayer.DataType.MAXWIND_A.toString())|| - dataType.equals(NcSoundingLayer.DataType.MAXWIND_C.toString()))){ - //*System.out.println("getting "+ dataType); - java.util.Iterator itWind=lUairRecords.get(lastCorrectedRecord).getMaxWind().iterator(); - - while(itWind.hasNext()) - { - MaxWind value=(MaxWind)itWind.next(); - soundingLy = new NcSoundingLayer(); - soundingLy.setPressure(value.getPressure()); - soundingLy.setWindDirection(value.getWindDirection()); - if ( value.getWindSpeed() != NcSoundingLayer.MISSING ) { - soundingLy.setWindSpeed((float)metersPerSecondToKnots.convert((float)value.getWindSpeed())); - } else { - soundingLy.setWindSpeed((float)value.getWindSpeed()); - } - //*System.out.println("WIND pressure :"+value.getPressure() + " WD:" + value.getWindDirection() + " WS:"+(float)metersPerSecondToKnots.convert((float)value.getWindSpeed())); - soundLyLst.add(soundingLy); - } - } - else if(lUairRecords.get(lastCorrectedRecord).getTropopause().size() >0 && - (dataType.equals(NcSoundingLayer.DataType.TROPOPAUSE_A.toString())|| - dataType.equals(NcSoundingLayer.DataType.TROPOPAUSE_C.toString()))){ - //*System.out.println("getting "+ dataType); - java.util.Iterator it=lUairRecords.get(lastCorrectedRecord).getTropopause().iterator(); - while(it.hasNext()) - { - Tropopause value=(Tropopause)it.next(); - soundingLy = new NcSoundingLayer(); - soundingLy.setTemperature(value.getTemp()); - soundingLy.setPressure(value.getPressure()); - soundingLy.setWindDirection(value.getWindDirection()); - if ( value.getWindSpeed() != NcSoundingLayer.MISSING ) { - soundingLy.setWindSpeed((float)metersPerSecondToKnots.convert((float)value.getWindSpeed())); - //*System.out.println("Tropopause pressure :"+value.getPressure() + " temp:" + value.getTemp()+" WD:" + value.getWindDirection() + " WS:"+(float)metersPerSecondToKnots.convert((float)value.getWindSpeed())); - - } else { - soundingLy.setWindSpeed((float)value.getWindSpeed()); - //*System.out.println("Tropopause pressure :"+value.getPressure() + " temp:" + value.getTemp()+" WD:" + value.getWindDirection() + " WS:"+(float)value.getWindSpeed()); - - } - soundingLy.setDewpoint(value.getDwpt()); - soundLyLst.add(soundingLy); - } - } - } - - } catch (DataAccessLayerException e) { - //*System.out.println("obs sounding query exception"); - //e.printStackTrace(); - } - } - - }//end ObsSndType.UAIR */ - - pf.setSoundingLyLst(soundLyLst); - return pf; - - } - /* * NOT used currently * @@ -1146,6 +1399,8 @@ public class ObservedSoundingQuery { * Support all dataType except "ALLDATA" data type * using either lat/lon, stnId or stnNum and synopticTime as key * reference time is with Calendar data type as input + * Chin's Note 2/28/2012:This API is used for bufrua query now. Should be replaced by + * getObservedSndBufruaDataGeneric() when point data query is implemented. */ @SuppressWarnings("unchecked") public static NcSoundingProfile getObservedSndBufruaData(Double lat, Double lon, String stn, Calendar refTimeCal, String dataType,SndQueryKeyType queryType){ @@ -1474,175 +1729,7 @@ public class ObservedSoundingQuery { pf.setSoundingLyLst(soundLyList); return pf; - /* - List soundLyList = new ArrayList(); - UAObs uaRecord = new UAObs(); - uaRecord.setPluginName("bufrua"); - - - // refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // for testing ...refTimeCal.setTimeInMillis(1276581600000L); - - //refTimeCal.setTimeInMillis(refTime.getTime()); - DataTime refTimeDataTime = new DataTime(refTimeCal); - uaRecord.setDataTime(refTimeDataTime); - - // for testing ... validTime = new Timestamp(1277013600000L); - //validTime.setTime(1277013600000L); - - try { - BufrUADao uadao = new BufrUADao("bufrua"); - File hdf5loc = uadao.getFullFilePath(lUairRecords.get(0)); - System.out.println("hdf5 path = " + hdf5loc.getAbsolutePath()); - IDataStore dataStore = DataStoreFactory.getDataStore(hdf5loc); - - try { - LongDataRecord longData = (LongDataRecord) dataStore.retrieve( - "/", "validTime", Request.ALL); - long[] validtimedata = longData.getLongData(); - - FloatDataRecord latfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "latitude", Request.ALL); - float[] latdata = latfloatData.getFloatData(); - - FloatDataRecord lonfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "longitude", Request.ALL); - float[] londata = lonfloatData.getFloatData(); - - FloatDataRecord elvfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "staElev", Request.ALL); - float[] elvdata = elvfloatData.getFloatData(); - - StringDataRecord stnIdStrData = (StringDataRecord) dataStore.retrieve( - "/", "staName", Request.ALL); - String[] stnIddata = stnIdStrData.getStringData(); - - IntegerDataRecord stnNumIntData = (IntegerDataRecord) dataStore.retrieve( - "/", "wmoStaNum", Request.ALL); - int[] stnNumdata = stnNumIntData.getIntData(); - - IntegerDataRecord rptIntData = (IntegerDataRecord) dataStore.retrieve( - "/", "rptType", Request.ALL); - int[] rptData = rptIntData.getIntData(); - - int selectedTimeIndex=-1; - - for (int j=0; j0) - pf.setSfcPress(sfcPressuredata[0]/100F); - - NcSoundingLayer soundingLy; - - // get temp, dew point, pressure, wind u/v components, and height - //they are 2-D tables - FloatDataRecord pressurefloatData = (FloatDataRecord) dataStore.retrieve( - "/", "prMan", Request.buildYLineRequest(new int[] {selectedTimeIndex})); - float[] pressuredata = pressurefloatData.getFloatData(); - FloatDataRecord temperaturefloatData = (FloatDataRecord) dataStore.retrieve( - "/", "tpMan", Request.buildYLineRequest(new int[] {selectedTimeIndex})); - float[] temperaturedata = temperaturefloatData.getFloatData(); - FloatDataRecord dewptfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "tdMan", Request.buildYLineRequest(new int[] {selectedTimeIndex})); - float[] dewptdata = dewptfloatData.getFloatData(); - FloatDataRecord windDfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "wdMan", Request.buildYLineRequest(new int[] {selectedTimeIndex})); - float[] windDdata = windDfloatData.getFloatData(); - FloatDataRecord windSfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "wsMan", Request.buildYLineRequest(new int[] {selectedTimeIndex})); - float[] windSdata = windSfloatData.getFloatData(); - FloatDataRecord htfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "htMan", Request.buildYLineRequest(new int[] {selectedTimeIndex})); - float[] htdata = htfloatData.getFloatData(); - long[] sizes = pressurefloatData.getSizes(); - //int dim = pressurefloatData.getDimension(); - for (int i=0; i stationInfoList= new ArrayList(); String queryStr=""; @@ -80,7 +70,7 @@ public class PfcSoundingQuery { return stnInfoCol; } queryStr = new String("Select Distinct latitude, longitude, stationid, elevation, reftime, rangestart FROM "+ currentDBTblName + " where rangestart='" + - selectedSndTime+ "' AND reporttype ='" + reportType + "' AND latitude BETWEEN -89.9 AND 89.9 AND longitude BETWEEN -179.9 AND 179.9"); + selectedSndTime+ "' AND reftime ='"+ refTimeStr+ "' AND reporttype ='" + reportType + "' AND latitude BETWEEN -89.9 AND 89.9 AND longitude BETWEEN -179.9 AND 179.9"); //System.out.println(queryStr); CoreDao dao = new CoreDao(DaoConfig.forClass(SoundingSite.class)); @@ -100,8 +90,8 @@ public class PfcSoundingQuery { NcSoundingStnInfo stn = stnInfoCol.getNewStnInfo(); stn.setStnId((String)objArray[2]); - stn.setStationLongitude((float)lon); - stn.setStationLatitude((float)lat); + stn.setStationLongitude(lon); + stn.setStationLatitude(lat); stn.setStationElevation((float)elv); stn.setSynopTime((Timestamp)objArray[4]); stn.setRangeStartTime((Timestamp)objArray[5]); @@ -155,7 +145,7 @@ public class PfcSoundingQuery { } //query table in metadata db String queryStr = new String("Select Distinct rangestart FROM "+ currentDBTblName + - " where reporttype='" +reportType+ "' AND "+ "reftime='"+refTimeStr+":00:00'"+" ORDER BY rangestart DESC"); + " where reporttype='" +reportType+ "' AND "+ "reftime='"+refTimeStr+":00:00'"+" ORDER BY rangestart");// DESC"); System.out.println("queryStr "+ queryStr); @@ -165,7 +155,9 @@ public class PfcSoundingQuery { return tl; } - + /* + * Chin Note: 02/27/12 obsoleting this one. Use getPfcSndDataGeneric() + * public static NcSoundingProfile getPfcSndData(double lat, double lon, String stn, long refTimeL, long validTimeL, String sndTypeStr, SndQueryKeyType queryType) { //*System.out.println("getPfcSndData input ref time = "+ refTimeL+" valid time is " + validTimeL); Calendar refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); @@ -174,7 +166,10 @@ public class PfcSoundingQuery { validTimeCal.setTimeInMillis(validTimeL); return getPfcSndData( lat, lon, stn, refTimeCal, validTimeCal, sndTypeStr, queryType); } - + */ + /* + * Chin Note: 02/27/12 obsoleting this one. Use getPfcSndDataGeneric() + * @SuppressWarnings("unchecked") public static NcSoundingProfile getPfcSndData(double lat, double lon, String stn, Calendar refTimeCal, Calendar validTimeCal, String sndTypeStr, SndQueryKeyType queryType) { //System.out.println("getPfcSndData input ref time = "+ refTimeCal+" valid time is " + validTimeCal); @@ -239,8 +234,8 @@ public class PfcSoundingQuery { //for(SoundingSite site: lSndSiteRecords) // System.out.println("SoundingSite record Idx="+ site.getIdx()); //set pf data - pf.setStationLatitude((float)lSndSiteRecords.get(0).getLatitude()); - pf.setStationLongitude((float)lSndSiteRecords.get(0).getLongitude()); + pf.setStationLatitude(lSndSiteRecords.get(0).getLatitude()); + pf.setStationLongitude(lSndSiteRecords.get(0).getLongitude()); pf.setStationElevation((float)lSndSiteRecords.get(0).getElevation()); if(lSndSiteRecords.get(0).getSiteId()!=null && lSndSiteRecords.get(0).getSiteId().length()>0) pf.setStationNum(Integer.parseInt(lSndSiteRecords.get(0).getSiteId())); @@ -287,7 +282,7 @@ public class PfcSoundingQuery { //ModelSoundingDAO mdldao = new ModelSoundingDAO("modelsounding"); //File hdf5loc = mdldao.getFullFilePath(lSndSiteRecords.get(0)); - //*System.out.println("hdf5 path = " + hdf5loc.getAbsolutePath()); + //System.out.println("hdf5 path = " + hdf5loc.getAbsolutePath()); //IDataStore dataStore = DataStoreFactory.getDataStore(hdf5loc); FloatDataRecord sfcPressurefloatData = (FloatDataRecord) dataStore.retrieve( @@ -356,216 +351,25 @@ public class PfcSoundingQuery { } } - - /* - SoundingSite sndSite = new SoundingSite(); - sndSite.setPluginName("modelsounding"); - DataTime refTimeDataTime = new DataTime(refTimeCal); - sndSite.setDataTime(refTimeDataTime); - - ModelSoundingDAO mdldao = new ModelSoundingDAO("modelsounding"); - File hdf5loc = mdldao.getFullFilePath(sndSite); - //*System.out.println("hdf5 path = " + hdf5loc.getAbsolutePath()); - IDataStore dataStore = DataStoreFactory.getDataStore(hdf5loc); - try { - LongDataRecord validtimeLongData = (LongDataRecord) dataStore.retrieve( - "/", "validTime", Request.ALL); - long[] validtimedata = validtimeLongData.getLongData(); - - FloatDataRecord latfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "latitude", Request.ALL); - float[] latdata = latfloatData.getFloatData(); - - FloatDataRecord lonfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "longitude", Request.ALL); - float[] londata = lonfloatData.getFloatData(); - - FloatDataRecord elvfloatData = (FloatDataRecord) dataStore.retrieve( - "/", "elevation", Request.ALL); - float[] elvdata = elvfloatData.getFloatData(); - - - - int selectedTimeIndex=-1; - - for (int j=0; j= 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_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(); - } - try { - if (file_id >= 0) - H5.H5Fclose(file_id); - } - catch (Exception e) { - e.printStackTrace(); - } - */ pf.setSoundingLyLst(soundLyList); long t02 = System.currentTimeMillis(); System.out.println("PFC profile retreival took " + (t02 - t01)); return pf; } - + */ //@SuppressWarnings("unchecked") /* - * Chin: using ModelSoundingPointDataTransform for query. Need test after 11.5 + * Chin: using ModelSoundingPointDataTransform for query. */ public static NcSoundingProfile getPfcSndData2(double lat, double lon, String stn, Calendar refTimeCal, Calendar validTimeCal, String sndTypeStr, SndQueryKeyType queryType) { //System.out.println("getPfcSndData lat="+lat+" lon="+lon); //NcSoundingProfile.PfcSndType sndType; //yes, it is not used now.. //Timestamp validTime = new Timestamp(validTimeL); - //System.out.println("getPfcSndData input ref time = "+ refTime.toGMTString()+" valid time is " + validTime.toGMTString()); - long t01 = System.currentTimeMillis(); + //System.out.println("getPfcSndData2 input ref time = "+ refTimeCal.getTime()); + //long t01 = System.currentTimeMillis(); NcSoundingProfile pf = new NcSoundingProfile(); if(validTimeCal == null || refTimeCal == null ) return pf; @@ -612,9 +416,21 @@ public class PfcSoundingQuery { fields.add("dataTime.validPeriod.start");// the rangeStart field name defined in SoundingSite and decoded modelsounding table values.add(validTimeCal.getTime()); //rangestart data type defined in SoundingSite is "Date" operands.add("="); - //for (int i=0; i < fields.size(); i++) { - // System.out.println("field "+ fields.get(i) + " value "+ values.get(i)); + + //String d=""; + //String d1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(validTimeCal.getTime()); + //d = d+d1; + //for (int i=1; i< 85; i++){ + // Date date2 = new Date(validTimeCal.getTimeInMillis()-3600000*i); + // String d2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date2); + // d = d+","+d2; //} + + //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("field "+ fields.get(i) + " value "+ values.get(i)); + } List parameters = new ArrayList(12); parameters.addAll(ModelSoundingPointDataTransform.LVL_PARAMETERS); parameters.add(ModelSoundingPointDataTransform.P_LATITUDE); @@ -622,16 +438,16 @@ public class PfcSoundingQuery { parameters.add(ModelSoundingPointDataTransform.P_ELEVATION); parameters.add(ModelSoundingPointDataTransform.P_STATION_ID); parameters.add(ModelSoundingPointDataTransform.P_STATION_NUMBER); - + parameters.add(ModelSoundingPointDataTransform.P_DATAURI); try { lSndSiteRecords = ModelSoundingPointDataTransform.getSoundingSites(fields, values, operands, parameters); - + System.out.println("sounding site record size = "+ lSndSiteRecords.size()); if(lSndSiteRecords.size() > 0){ //set pf data - pf.setStationLatitude((float)lSndSiteRecords.get(0).getLatitude()); - pf.setStationLongitude((float)lSndSiteRecords.get(0).getLongitude()); + pf.setStationLatitude(lSndSiteRecords.get(0).getLatitude()); + pf.setStationLongitude(lSndSiteRecords.get(0).getLongitude()); pf.setStationElevation((float)lSndSiteRecords.get(0).getElevation()); if(lSndSiteRecords.get(0).getSiteId()!=null && lSndSiteRecords.get(0).getSiteId().length()>0) pf.setStationNum(Integer.parseInt(lSndSiteRecords.get(0).getSiteId())); @@ -647,17 +463,20 @@ public class PfcSoundingQuery { soundingLy.setOmega(level.getOmega().floatValue()); soundingLy.setTemperature((float)kelvinToCelsius.convert(level.getTemperature())); soundingLy.setPressure(level.getPressure().floatValue()/100); - soundingLy.setWindU(level.getUcWind().floatValue()); // HDF5 data in unit of Knots, no conversion needed - soundingLy.setWindV(level.getVcWind().floatValue()); + soundingLy.setWindU((float)metersPerSecondToKnots.convert(level.getUcWind().floatValue())); // HDF5 data in unit of m/s, convert to Knots 4/12/2012 + soundingLy.setWindV((float)metersPerSecondToKnots.convert(level.getVcWind().floatValue())); soundingLy.setSpecHumidity(level.getSpecificHumidity().floatValue()); soundLyList.add(soundingLy); } - //System.out.println("sounding layer size = "+ soundLyList.size()); + //debug - //for(NcSoundingLayer ly: soundLyList){ - //*System.out.println("P= "+ly.getPressure()+ " Hm= "+ ly.getSpecHumidity()+ " T= "+ ly.getTemperature()); + + //for(NcSoundingLayer ly: soundLyList1){ + // System.out.println("P= "+ly.getPressure()+ " Hm= "+ ly.getSpecHumidity()+ " T= "+ ly.getTemperature()); //} - + for(int i =0; i getPfcSndDataGeneric(Coordinate[] coordinateArray,String[] stnIdArr, String refTimeStr,List soundingTimeAry, String sndTypeStr, String level) { + List pfs = new ArrayList(); + + if(sndTypeStr.equals(PfcSndType.GFSSND.toString()) || sndTypeStr.equals(PfcSndType.NAMSND.toString())){ + List fields = new ArrayList(); + List values = new ArrayList(); + List lSndSiteRecords = null; + List operands = new ArrayList(); + MergeSounding ms = new MergeSounding(); + + + if(coordinateArray != null){ + String latStr="", lonStr=""; + for ( int i=0; i < coordinateArray.length ; i++) + { + latStr = latStr+String.valueOf(coordinateArray[i].y)+","; + lonStr = lonStr+String.valueOf(coordinateArray[i].x)+","; + } + latStr=latStr.substring(0, latStr.length()-1);//get rid of last "," + lonStr=lonStr.substring(0, lonStr.length()-1);//get rid of last "," + fields.add("location.latitude"); + values.add(latStr); + operands.add("in"); + fields.add("location.longitude"); + values.add(lonStr); + operands.add("in"); + } + else if(stnIdArr != null){ + fields.add("location.stationId");// the rangeStart field name defined in SoundingSite and decoded modelsounding table + String stnIdStr=""; + for (String stnStr: stnIdArr){ + stnIdStr = stnIdStr+stnStr; + stnIdStr= stnIdStr+","; + } + stnIdStr=stnIdStr.substring(0, stnIdStr.length()-1);//get rid of last "," + values.add(stnIdStr); //rangestart data type defined in SoundingSite is "Date" + operands.add("in"); + } + else { + return pfs; + } + + fields.add("dataTime.refTime");// the refTime time field name defined in SoundingSite and decoded modelsounding table + values.add(refTimeStr); //refTime data type defined in SoundingSite is "Date" + operands.add("="); + // the rangeStart field name defined in SoundingSite and decoded modelsounding table. It is forcast time. + fields.add("dataTime.validPeriod.start"); + String d=""; + for (String timeStr: soundingTimeAry){ + d = d+timeStr; + d= d+","; + } + 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)); + } + List parameters = new ArrayList(12); + parameters.addAll(ModelSoundingPointDataTransform.LVL_PARAMETERS); + parameters.add(ModelSoundingPointDataTransform.P_LATITUDE); + parameters.add(ModelSoundingPointDataTransform.P_LONGITUDE); + parameters.add(ModelSoundingPointDataTransform.P_ELEVATION); + parameters.add(ModelSoundingPointDataTransform.P_STATION_ID); + parameters.add(ModelSoundingPointDataTransform.P_STATION_NUMBER); + parameters.add(ModelSoundingPointDataTransform.P_REF_TIME); + parameters.add(ModelSoundingPointDataTransform.P_FORECAST_HOUR); + + try { + 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"); + for(SoundingSite sndSite:lSndSiteRecords){ + //set pf data + NcSoundingProfile pf = new NcSoundingProfile(); + pf.setStationLatitude(sndSite.getLatitude()); + pf.setStationLongitude(sndSite.getLongitude()); + pf.setStationElevation((float)sndSite.getElevation()); + pf.setFcsTime((sndSite.getDataTime().getFcstTime()*1000)+ sndSite.getDataTime().getRefTime().getTime()); + if(sndSite.getSiteId()!=null && sndSite.getSiteId().length()>0) + pf.setStationNum(Integer.parseInt(sndSite.getSiteId())); + pf.setStationId(sndSite.getStationId()); + + + List soundLyList = new ArrayList(); + + //for (int i=0; i=0. It means user request a single level + float rlev = new Integer(Integer.parseInt(level.trim())).floatValue(); + pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); + } else if ( ms.isNumber (level) == 1 ) { + //level is an float >=0. It also means user request a single level + float rlev = new Float(Float.parseFloat(level.trim())); + pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); + } + + pfs.add(pf); + //System.out.println("sounding fcs time = "+ pf.getFcsTime()); + //System.out.println("sounding ref time = "+ sndSite.getDataTime().getRefTime().getTime()); + + } + + } catch (Exception e) { + //System.out.println("exception=" + e ); + e.printStackTrace(); + return pfs; + } + + } + + //debug + + //long t02 = System.currentTimeMillis(); + //System.out.println("getPfcSndData2 PFC profile retreival took " + (t02 - t01)); + return pfs; } private static Comparator reversePressureComparator() { @@ -773,4 +736,136 @@ public class PfcSoundingQuery { } */ + /* + * + * Chin: using ModelSoundingPointDataTransform for query. + * Sounding time array is an array of user picked PFC sounding time String(s) in this format "2012-02-11 12:00:00" + * Replaced by getPfcSndDataGeneric() + * + + public static List getPfcSndDataBySoundTimeRangeArray(double lat, double lon, String stn, String refTimeStr, List soundingTimeAry, String sndTypeStr, SndQueryKeyType queryType) { + //System.out.println("getPfcSndData lat="+lat+" lon="+lon); + //NcSoundingProfile.PfcSndType sndType; //yes, it is not used now.. + //Timestamp validTime = new Timestamp(validTimeL); + List pfs = new ArrayList(); + + if(sndTypeStr.equals(PfcSndType.GFSSND.toString()) || sndTypeStr.equals(PfcSndType.NAMSND.toString())){ + List fields = new ArrayList(); + List values = new ArrayList(); + List lSndSiteRecords = null; + List operands = new ArrayList(); + if(queryType==SndQueryKeyType.STNID){ + fields.add("location.stationId");// the location.stationId String field name defined in SoundingSite class and decoded modelsounding table. + values.add(stn); + operands.add("="); + } + else if(queryType==SndQueryKeyType.STNNUM){ + fields.add("siteid");// the siteid String field name defined in SoundingSite class and decoded in modelsounding table. + values.add(stn); + operands.add("="); + } + else if(queryType==SndQueryKeyType.LATLON){ + //fields.add("location.latitude");// the location.latitude field name defined in SoundingSite class and decoded modelsounding table + //values.add(lat-0.1); + //operands.add(">="); + //fields.add("location.latitude");// the location.latitude field name defined in SoundingSite class and decoded modelsounding table + //values.add(lat+0.1); + //operands.add("<="); + //fields.add("location.longitude");// the location.longitude field name defined in SoundingSite class and decoded modelsounding table + //values.add(lon-0.1); + //operands.add(">="); + //fields.add("location.longitude");// the location.longitude field name defined in SoundingSite class and decoded modelsounding table + //values.add(lon+0.1); + //operands.add("<="); + fields.add("location.latitude");// the location.latitude field name defined in SoundingSite class and decoded modelsounding table + values.add(lat); + operands.add("="); + fields.add("location.longitude");// the location.longitude field name defined in SoundingSite class and decoded modelsounding table + values.add(lon); + operands.add("="); + + + } + else { + System.out.println("request query type "+ queryType+ " is not supported in this API" ); + return pfs; + } + + fields.add("dataTime.refTime");// the refTime time field name defined in SoundingSite and decoded modelsounding table + values.add(refTimeStr); //refTime data type defined in SoundingSite is "Date" + operands.add("="); + fields.add("dataTime.validPeriod.start");// the rangeStart field name defined in SoundingSite and decoded modelsounding table + String d=""; + for (String timeStr: soundingTimeAry){ + d = d+timeStr; + d= d+","; + } + 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("field "+ fields.get(i) + " value "+ values.get(i)); + //} + List parameters = new ArrayList(12); + parameters.addAll(ModelSoundingPointDataTransform.LVL_PARAMETERS); + parameters.add(ModelSoundingPointDataTransform.P_LATITUDE); + parameters.add(ModelSoundingPointDataTransform.P_LONGITUDE); + parameters.add(ModelSoundingPointDataTransform.P_ELEVATION); + parameters.add(ModelSoundingPointDataTransform.P_STATION_ID); + parameters.add(ModelSoundingPointDataTransform.P_STATION_NUMBER); + parameters.add(ModelSoundingPointDataTransform.P_REF_TIME); + parameters.add(ModelSoundingPointDataTransform.P_FORECAST_HOUR); + + try { + long t01 = System.currentTimeMillis(); + lSndSiteRecords = ModelSoundingPointDataTransform.getSoundingSites(fields, values, operands, parameters); + long t02 = System.currentTimeMillis(); + System.out.println("getPfcSndDataBySoundTimeRangeArray sounding site record size = "+ lSndSiteRecords.size()+ + " took "+(t02-t01)+ " ms"); + for(SoundingSite sndSite:lSndSiteRecords){ + //set pf data + List soundLyList = new ArrayList(); + NcSoundingProfile pf = new NcSoundingProfile(); + pf.setStationLatitude(sndSite.getLatitude()); + pf.setStationLongitude(sndSite.getLongitude()); + pf.setStationElevation((float)sndSite.getElevation()); + pf.setFcsTime((sndSite.getDataTime().getFcstTime()*1000)+ sndSite.getDataTime().getRefTime().getTime()); + if(sndSite.getSiteId()!=null && sndSite.getSiteId().length()>0) + pf.setStationNum(Integer.parseInt(sndSite.getSiteId())); + pf.setStationId(sndSite.getStationId()); + //for (int i=0; i * */ -public class PointIn extends ScriptTask { +public class PointIn {//extends ScriptTask { private PluginDataObject dataRecord; @@ -79,29 +91,41 @@ public class PointIn extends ScriptTask { + " dao"); } } + public PointIn(String aPlugin, PluginDataObject aDataRecord) { + dataRecord = aDataRecord; + indX = 0; + indY = 0; + try { + dao = PluginFactory.getInstance().getPluginDao(aPlugin); +// dataRecord.getPluginName()); + } catch (PluginException e) { + System.out.println("Unable to get " + dataRecord.getPluginName() + + " dao"); + } + } /* * (non-Javadoc) * * @see com.raytheon.edex.uengine.js.tasks.ScriptTask#execute() - */ + * @Override public Object execute() throws PluginException { - IDataRecord record = getHDF5DataPoint(dataRecord, indX, indY ); + IDataRecord record = getHDF5DataPointNew(dataRecord, indX, indY ); FloatDataRecord fdr = (FloatDataRecord)record; return fdr.getFloatData()[0]; - } + }*/ public float getPointData() throws PluginException { return ((FloatDataRecord)getHDF5DataPoint(dataRecord, indX, indY )).getFloatData()[0]; } - public Object[] retrieveGroup() throws PluginException { - return dao.getHDF5Data(dataRecord, -1); - } + //public Object[] retrieveGroup() throws PluginException { + // return dao.getHDF5Data(dataRecord, -1); + //} - public IDataRecord getHDF5DataPoint(PluginDataObject object, + /*public IDataRecord getHDF5DataPoint(PluginDataObject object, int xInd, int yInd) throws PluginException { Request pointRequest = Request.buildPointRequest(new Point(xInd, yInd) ); @@ -109,7 +133,7 @@ public class PointIn extends ScriptTask { record = new IDataRecord[1]; if (object instanceof IPersistable) { - /* connect to the data store and retrieve the data */ + // connect to the data store and retrieve the data //chin remove this line NcgribDao dao = new NcgribDao(); IDataStore dataStore = dao.getDataStore((IPersistable) object); try { @@ -121,6 +145,110 @@ public class PointIn extends ScriptTask { } } return record[0]; + }*/ + public IDataRecord getHDF5DataPoint(PluginDataObject object, + int xInd, int yInd) throws PluginException { + + Request pointRequest = Request.buildPointRequest(new Point(xInd, yInd) ); + IDataRecord[] dr = null; + //record = new IDataRecord[1]; + + if (object instanceof IPersistable) { + //chin remove this line NcgribDao dao = new NcgribDao(); + IDataStore dataStore = dao.getDataStore((IPersistable) object); + try { + String[] groups = new String[1]; + groups[0] = object.getDataURI(); + dr= dataStore.retrieveGroups(groups, pointRequest); + for (int k = 0; k < dr.length; k++) { + float[] data = (float[]) dr[k].getDataObject(); + + } + + } catch (Exception e) { + throw new PluginException("Error getting HDF5 data", e); + } + } + return dr[0]; + } + /* + //from efficientRetirevePoint() + public float[] getHDF5GroupDataPoint(Object[] objects) throws PluginException { + float[] rval = new float[objects.length]; + Request pointRequest = Request.buildPointRequest(new Point(indX, indY) ); + IDataRecord[] dr = null; + //record = new IDataRecord[1]; + + if (objects[0] instanceof IPersistable) { + IDataStore dataStore = dao.getDataStore((IPersistable) objects[0]); + try { + String[] groups = new String[objects.length]; + for(int i=0; i getHDF5GroupDataPoints(Object[] objects, List points) throws PluginException { + List rval = new ArrayList(); + Request pointRequest = (Request.buildPointRequest(points.toArray(new Point[points.size()]))); + IDataRecord[] dr = null; + //record = new IDataRecord[1]; + + if (objects[0] instanceof IPersistable) { + /* connect to the data store and retrieve the data */ + IDataStore dataStore = dao.getDataStore((IPersistable) objects[0]); + try { + String[] groups = new String[objects.length]; + for(int i=0; i0){ + for(Point pt: points){ + float[] ptData = new float[dr.length]; + rval.add(ptData); + } + } + for (int k = 0, index=0; k < dr.length; k++, index++) { + float[] data = (float[]) dr[k].getDataObject(); + //note; data.length should be the same as points.size() + //if(k==0) + // System.out.println("data[] szie="+data.length+ " parameter group size="+dr.length); + totalRec = totalRec + data.length; + for(int i=0; i< data.length; i++){ + float[] pData = rval.get(i); + pData[k]= data[i]; + } + } + System.out.println("total points = "+ points.size()+ " totalRec = "+totalRec); + } catch (Exception e) { + throw new PluginException("Error getting HDF5 data", e); + } + } + return rval; } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/utility/edex_static/base/python/NcSoundingDataRequest.py b/ncep/gov.noaa.nws.ncep.edex.uengine/utility/edex_static/base/python/NcSoundingDataRequest.py index 0570f0c596..3e642cc1bb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/utility/edex_static/base/python/NcSoundingDataRequest.py +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/utility/edex_static/base/python/NcSoundingDataRequest.py @@ -6,6 +6,10 @@ class NcSoundingDataRequest(): def __init__(self): self.NcSoundingDrv = NcSoundingDrv() + def setNcSoundingLayer2(self, useLayer2): + self.NcSoundingDrv.setUseNcSoundingLayer2(useLayer2) + + def setLat(self, lat): self.NcSoundingDrv.setLat(lat) self.lat = lat @@ -14,6 +18,20 @@ class NcSoundingDataRequest(): self.NcSoundingDrv.setLon(lon) self.lon = lon + def setRangeTimeArr(self,rtArr): + from jep import jarray, JLONG_ID + jTA = jarray(len(rtArr), JLONG_ID) + for i in range(len(rtArr)): + jTA[i] = long(rtArr[i]) + self.NcSoundingDrv.setRangeTimeArr(jTA) + + def setLatLonArr(self, LatLonArr): + from jep import jarray, JDOUBLE_ID + jA = jarray(len(LatLonArr), JDOUBLE_ID) + for i in range(len(LatLonArr)): + jA[i] = LatLonArr[i] + self.NcSoundingDrv.setLatLons(jA) + def setRefTime(self, refTime): self.NcSoundingDrv.setRefTime(refTime) self.refTime = refTime @@ -64,11 +82,11 @@ class NcSoundingDataRequest(): self.NcSoundingDrv.setDbIdList(jA) def setLatLonList(self, LatLonArr): - from jep import jarray, JFLOAT_ID - jA = jarray(len(LatLonArr)*len(LatLonArr[0]), JFLOAT_ID, 0) + from jep import jarray, JDOUBLE_ID + jA = jarray(len(LatLonArr)*len(LatLonArr[0]), JDOUBLE_ID, 0) for i in range(len(LatLonArr)): for j in range(len(LatLonArr[0])): - jA[i*len(LatLonArr)+j] = float(LatLonArr[i][j]) + jA[i*len(LatLonArr)+j] = LatLonArr[i][j] self.NcSoundingDrv.setLatLons(jA) def setTimeLine(self, timeLine): @@ -121,52 +139,33 @@ class NcSoundingDataRequest(): def getSoundingDataByLatLonArray(self, LatLonArr): self.NcSoundingDrv.setQueryType("LATLON") - from jep import jarray, JFLOAT_ID - jA = jarray(len(LatLonArr), JFLOAT_ID) + from jep import jarray, JDOUBLE_ID + jA = jarray(len(LatLonArr), JDOUBLE_ID) for i in range(len(LatLonArr)): - jA[i] = float(LatLonArr[i]) + jA[i] = LatLonArr[i] self.NcSoundingDrv.setLatLons(jA) - - self.result = self.NcSoundingDrv.getSoundingDataByLatLonArray() + self.result = self.NcSoundingDrv.getSoundingDataGeneric() +#was self.result = self.NcSoundingDrv.getSoundingDataByLatLonArray() if self.result is None: return self.makeNullResponse() else: return self.makeResponse() - def getSoundingLayer2DataByLatLonArray(self, LatLonArr): -# print'from NcSoundingDataRequest.getSoundingLayer2DataByLatLonArray' + + def getSoundingDataByRangeTimeArray(self, rtArr): self.NcSoundingDrv.setQueryType("LATLON") - from jep import jarray, JFLOAT_ID - jA = jarray(len(LatLonArr), JFLOAT_ID) - for i in range(len(LatLonArr)): - jA[i] = float(LatLonArr[i]) - self.NcSoundingDrv.setLatLons(jA) -# print'just before calling self.NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray()' - self.result = self.NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() + from jep import jarray, JLONG_ID + jTA = jarray(len(rtArr), JLONG_ID) + for i in range(len(rtArr)): + jTA[i] = long(rtArr[i]) + self.NcSoundingDrv.setRangeTimeArr(jTA) + self.result = self.NcSoundingDrv.getSoundingDataGeneric() +# self.result = self.NcSoundingDrv.getSoundingDataByRangeTimeArray() if self.result is None: -# print 'unable to get the sounding cube back' return self.makeNullResponse() else: -# print 'Got the sounding cube back' - return self.makeResponse() - - def getSoundingLayer2DataByLatLonArray1(self, LatLonArr): -# This method calling per station base algorithm. It is not used for production. - self.NcSoundingDrv.setQueryType("LATLON") - from jep import jarray, JFLOAT_ID - jA = jarray(len(LatLonArr), JFLOAT_ID) - for i in range(len(LatLonArr)): - jA[i] = float(LatLonArr[i]) - self.NcSoundingDrv.setLatLons(jA) -# print'just before calling self.NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray()' - self.result = self.NcSoundingDrv.getSoundingLayer2DataUsingLatLonArrayPerStn() - if self.result is None: -# print 'unable to get the sounding cube back' - return self.makeNullResponse() - else: -# print 'Got the sounding cube back' - return self.makeResponse() - + return self.makeResponse() + def getSoundingDataByStnIdArray(self, StnIdArr): self.NcSoundingDrv.setQueryType("STNID") from jep import jarray @@ -175,8 +174,8 @@ class NcSoundingDataRequest(): for i in range(len(StnIdArr)): jA[i] = String(StnIdArr[i]) self.NcSoundingDrv.setStnIdArr(jA) - - self.result = self.NcSoundingDrv.getSoundingDataByStnArray() + self.result = self.NcSoundingDrv.getSoundingDataGeneric() +# self.result = self.NcSoundingDrv.getSoundingDataByStnArray() if self.result is None: return self.makeNullResponse() else: @@ -190,13 +189,52 @@ class NcSoundingDataRequest(): for i in range(len(StnNumArr)): jA[i] = String(StnNumArr[i]) self.NcSoundingDrv.setStnNumArr(jA) - - self.result = self.NcSoundingDrv.getSoundingDataByStnArray() + self.result = self.NcSoundingDrv.getSoundingDataGeneric() +# self.result = self.NcSoundingDrv.getSoundingDataByStnArray() if self.result is None: return self.makeNullResponse() else: return self.makeResponse() + + def getSoundingData2ByStnIdArray(self, stnIdArr): + self.NcSoundingDrv.setQueryType("STNID") + from jep import jarray + from java.lang import String + jA = jarray(len(stnIdArr), String) + for i in range(len(stnIdArr)): + jA[i] = String(stnIdArr[i]) + self.NcSoundingDrv.setStnIdArr(jA) + + self.result = self.NcSoundingDrv.getSoundingData2Generic() + if self.result is None: + return self.makeNullResponse() + else: + return self.makeResponse() + def getSoundingData2ByLatLonArray(self, LatLonArr): +# print'from NcSoundingDataRequest.getSoundingLayer2DataByLatLonArray' + self.NcSoundingDrv.setQueryType("LATLON") + from jep import jarray, JDOUBLE_ID + jA = jarray(len(LatLonArr), JDOUBLE_ID) + for i in range(len(LatLonArr)): + jA[i] = LatLonArr[i] + self.NcSoundingDrv.setLatLons(jA) +# print'just before calling self.NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray()' + self.result = self.NcSoundingDrv.getSoundingData2Generic() + if self.result is None: +# print 'unable to get the sounding cube back' + return self.makeNullResponse() + else: +# print 'Got the sounding cube back' + return self.makeResponse() + + def getModelSoundingModelNames (self): + self.result = self.NcSoundingDrv.getModels() + if self.result is None: + return self.makeNullResponse() + else: + return self.makeResponse() +# Chin: query DB from Python script directly. Much slower than from Java. Obsoleted and replaced by getModelSoundingModelNames() def getSoundingModelNames (self, plugin): from java.util import ArrayList from com.raytheon.edex.uengine.tasks.query import TableQuery diff --git a/ncep/gov.noaa.nws.ncep.gempak.parameterConversionLibrary/gov.noaa.nws.ncep.gempak.parameterConversionLibrary.ecl b/ncep/gov.noaa.nws.ncep.gempak.parameterConversionLibrary/gov.noaa.nws.ncep.gempak.parameterConversionLibrary.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.gempak.parameters/gov.noaa.nws.ncep.gempak.parameters.ecl b/ncep/gov.noaa.nws.ncep.gempak.parameters/gov.noaa.nws.ncep.gempak.parameters.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.metParameters/gov.noaa.nws.ncep.metParameters.ecl b/ncep/gov.noaa.nws.ncep.metParameters/gov.noaa.nws.ncep.metParameters.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.ui.nctextui/gov.noaa.nws.ncep.ui.nctextui.ecl b/ncep/gov.noaa.nws.ncep.ui.nctextui/gov.noaa.nws.ncep.ui.nctextui.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/palette/NctextuiPaletteWindow.java b/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/palette/NctextuiPaletteWindow.java index 2733ff4113..439d277df4 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/palette/NctextuiPaletteWindow.java +++ b/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/palette/NctextuiPaletteWindow.java @@ -249,7 +249,7 @@ public class NctextuiPaletteWindow extends ViewPart implements SelectionListener * Invoked by the workbench to initialize this View. */ public void init( IViewSite site ) { - + //System.out.println("nctextuiPaletteWindow inited!!"); try { super.init( site ); @@ -259,7 +259,7 @@ public class NctextuiPaletteWindow extends ViewPart implements SelectionListener pie.printStackTrace(); } - + NctextuiResource.registerMouseHandler(); page = site.getPage(); page.addPartListener(this); @@ -269,46 +269,36 @@ public class NctextuiPaletteWindow extends ViewPart implements SelectionListener * Disposes resource. invoked by the workbench */ public void dispose() { - if ( ! isEditorVisible ) return; - super.dispose(); + // System.out.println("NctextuiPaletteWindow dispose me, isEditorVisible="+ isEditorVisible); + if ( ! isEditorVisible ){ + NctextuiResource.unregisterMouseHandler(); + return; + } + else { + super.dispose(); - //System.out.println("NctextuiPaletteWindow dispose me"); - NCMapEditor editor = NctextuiResource.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 NctextuiResource ) { - NctextuiResource rsc = (NctextuiResource)rp.getResource(); - rsc.unload(); -// display.getDescriptor().getResourceList().removePreRemoveListener(rsc); - } - } - //System.out.println("rp "+ rp.getResource().getName()); + NCMapEditor editor = NctextuiResource.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 NctextuiResource ) { + NctextuiResource rsc = (NctextuiResource)rp.getResource(); + rsc.unload(); + } + } + } + } + nctextuiPaletteWindow = null; - } - } - nctextuiPaletteWindow = null; - - /* - * remove the workbench part listener - */ - page.removePartListener(this); - + /* + * remove the workbench part listener + */ + page.removePartListener(this); + } - //if( NmapUiUtils.getActiveNatlCntrsEditor() != null ){ - //getNctextuiResource().setPoints(null); - //NmapUiUtils.getActiveNatlCntrsEditor().refresh(); - //reset mouse handler to default - //NmapUiUtils.setPanningMode(); - //} - - //close editor -// if(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null && NctextuiResource.getMapEditor() != null ){ -// PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeEditor(NctextuiResource.getMapEditor(), false); -// } } private void close () { diff --git a/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiMouseHandler.java b/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiMouseHandler.java index 8b84ff7eea..86b39bef6d 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiMouseHandler.java +++ b/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiMouseHandler.java @@ -97,7 +97,7 @@ public class NctextuiMouseHandler extends InputHandlerDefaultImpl { */ @Override public boolean handleMouseUp(int x, int y, int button) { - //System.out.println("mouse up"); + //System.out.println("NctextuiMouseHandler mouse up"); // button 1 is left mouse button if (button == 1 ){ diff --git a/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiResource.java b/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiResource.java index 1ec96120e7..5213136335 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiResource.java +++ b/ncep/gov.noaa.nws.ncep.ui.nctextui/src/gov/noaa/nws/ncep/ui/nctextui/rsc/NctextuiResource.java @@ -11,6 +11,9 @@ * ------------ ---------- ----------- -------------------------- * 06/28/2011 T402 X. Guo Re-format NCTEXT view panel, check * the click action on nctext legend + * 02/15/2012 T627 Archana Updated the call to addRbd() to accept + * a NCMapEditor object as one of the arguments + * Removed the call to setNcEditor() */ package gov.noaa.nws.ncep.ui.nctextui.rsc; @@ -104,8 +107,7 @@ public class NctextuiResource extends AbstractVizResourceparms = (char **) &parmsPtr; - strcpy(&parms[0][0], "PRES"); - strcpy(&parms[1][0], "HGHT"); - strcpy(&parms[2][0], "TEMP"); - strcpy(&parms[3][0], "DWPT"); - strcpy(&parms[4][0], "DRCT"); - strcpy(&parms[5][0], "SPED"); - strcpy(&parms[6][0], "OMEG"); + strcpy(&parms[PPRESS][0], "PRES"); + strcpy(&parms[PHGHT][0], "HGHT"); + strcpy(&parms[PTEMP][0], "TEMP"); + strcpy(&parms[PDEW][0], "DWPT"); + strcpy(&parms[PWDIR][0], "DRCT"); + strcpy(&parms[PWSPED][0], "SPED"); + strcpy(&parms[POMEG][0], "OMEG"); new->nparms = NPARM; for(j=0;jparms[j] = (char **)&parms[j][0]; @@ -122,20 +163,20 @@ int populateSndgDataStatic(CaveSndgParms snDataArray[], int arraySize, int data /* Populate data*/ for (i=0;idata[i][0] = snDataArray[i].pres; - s->origdata[i][0] = snDataArray[i].pres; - s->data[i][1] = snDataArray[i].hght; - s->origdata[i][1] = snDataArray[i].hght; - s->data[i][2] = snDataArray[i].temp; - s->origdata[i][2] = snDataArray[i].temp; - s->data[i][3] = snDataArray[i].dwpt; - s->origdata[i][3] = snDataArray[i].dwpt; - s->data[i][4] = snDataArray[i].drct; - s->origdata[i][4] = snDataArray[i].drct; - s->data[i][5] = snDataArray[i].sped; - s->origdata[i][5] = snDataArray[i].sped; - s->data[i][6] = snDataArray[i].omega; - s->origdata[i][6] = snDataArray[i].omega; + s->data[i][PPRESS] = snDataArray[i].pres; + s->origdata[i][PPRESS] = snDataArray[i].pres; + s->data[i][PHGHT] = snDataArray[i].hght; + s->origdata[i][PHGHT] = snDataArray[i].hght; + s->data[i][PTEMP] = snDataArray[i].temp; + s->origdata[i][PTEMP] = snDataArray[i].temp; + s->data[i][PDEW] = snDataArray[i].dwpt; + s->origdata[i][PDEW] = snDataArray[i].dwpt; + s->data[i][PWDIR] = snDataArray[i].drct; + s->origdata[i][PWDIR] = snDataArray[i].drct; + s->data[i][PWSPED] = snDataArray[i].sped; + s->origdata[i][PWSPED] = snDataArray[i].sped; + s->data[i][POMEG] = snDataArray[i].omega; + s->origdata[i][POMEG] = snDataArray[i].omega; } @@ -181,13 +222,13 @@ int populateSndgData(CaveSndgParms snDataArray[], int arraySize, int datatype) strcpy(parms, "PRES;HGHT;TEMP;DWPT;DRCT;SPED;OMEG"); for (i=0;i= -10) + return 1.0; + else + return (-.1*(x+70)+7); +} + +float F2(float x) { + if (x>=0) + return 2.0; + else if (x>=-10 && x<0) + return (-.025*(x+10)+2.5); + else + return(-.125*(x+70)+10.0); +} + +float F3(float x) { + if (x>=0) + return 3.0; + else if (x>=-10 && x<0) + return(-0.1*(x+10)+4.0); + else + return(-0.15*(x+50)+10.0); +} + + +int getCloudAmount(float temp,float dd) { + if (ddsizeFM=0; + cloudStr->sizeCE=0; + for (i=1;i-900.0 && sndg[s2][PTEMP] > -900.0 && sndg[s3][PTEMP]>-900) { + T1=sndg[s1][PTEMP]; + T2=sndg[s2][PTEMP]; + T3=sndg[s3][PTEMP]; + dz=sndg[s3][PHGHT]-sndg[s1][PHGHT]; + if (dz==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]); + R3=100*mixratio(sndg[s3][PPRESS],sndg[s3][PDEW])/mixratio(sndg[s3][PPRESS],sndg[s3][PTEMP]); + d2R=(R3-2*R2+R1)/(dz*dz); + if (d2T>=0 && d2R<=0 && !startflag) { + startflag=1; + startpres=sndg[s2][PPRESS]; + spsub=s2; + + } + else if ( !(d2T>=0 && d2R<=0) && startflag) { + startflag=0; + endpres=sndg[s2][PPRESS]; + epsub=s2; + Tavg=Taccum/TCount; + DDavg=DDaccum/TCount; + cloudAmt=getCloudAmount(Tavg,DDavg); + Taccum=0.0; + DDaccum=0.0; + TCount=0; + + if (cloudAmt != FEW && cloudStr->sizeFM preStartFM[cloudStr->sizeFM]= startpres; + cloudStr->preEndFM[cloudStr->sizeFM]= endpres; + cloudStr->cloudTypeFM[cloudStr->sizeFM] = cloudAmt; + cloudStr->sizeFM++; + } + } + + if ((d2T>=0 && d2R<=0) && startflag) { + Taccum+=sndg[s2][PTEMP]; + DD=sndg[s2][PTEMP]-sndg[s2][PDEW]; + DDaccum+=DD; + TCount++; + } + } + } + top=0; + for (i=numlvl-2/* was -1*/;i>0; i--) { + basefound=0; + s1=i-1; + s2=i; + s3=i+1; + if (sndg[s1][PTEMP]>-900.0 && sndg[s2][PTEMP] > -900.0 && sndg[s3][PTEMP]>-900) { + + if (! top) { + dd1=sndg[s1][PTEMP]-sndg[s1][PDEW]; + dd2=sndg[s2][PTEMP]-sndg[s2][PDEW]; + dd3=sndg[s3][PTEMP]-sndg[s3][PDEW]; + dz=(sndg[s3][PHGHT]-sndg[s1][PHGHT])/2.0; + if (dz==0) dz=1; + d2x=(dd3-2*dd2+dd1)/(dz*dz); + if (d2x>0 && dd2<4.5) { + top=-1; + endpres=sndg[s2][PPRESS]; + epsub=s2; + /* Now work downward till you get moistening with height */ + /* Do this until you reach lowest level of this condition */ + ; + while(i>1 && ! basefound) { + i--; + s1=i-1; + s2=i; + s3=i+1; + if (sndg[s1][PTEMP]>-900.0 && sndg[s2][PTEMP] > -900.0 && sndg[s3][PTEMP]>-900) { + dd1=sndg[s1][PTEMP]-sndg[s1][PDEW]; + dd2=sndg[s2][PTEMP]-sndg[s2][PDEW]; + dd3=sndg[s3][PTEMP]-sndg[s3][PDEW]; + dz=(sndg[s3][PHGHT]-sndg[s1][PHGHT])/2.0; + if (dz==0) dz=1; + d2x=(dd3-2*dd2+dd1)/(dz*dz); + if (d2x < -d2xparam) { + while ((d2x < -d2xparam && dd2<4.5) && i>1) { + i--; + s1=i-1; + s2=i; + s3=i+1; + if (sndg[s1][PTEMP]>-900.0 && sndg[s2][PTEMP] > -900.0 && sndg[s3][PTEMP]>-900) { + dd1=sndg[s1][PTEMP]-sndg[s1][PDEW]; + dd2=sndg[s2][PTEMP]-sndg[s2][PDEW]; + dd3=sndg[s3][PTEMP]-sndg[s3][PDEW]; + dz=(sndg[s3][PHGHT]-sndg[s1][PHGHT])/2.0; + if (dz==0) dz=1; + d2x=(dd3-2*dd2+dd1)/(dz*dz); + } + } + /* Lowest level of drying found...compute LCL from s1*/ + drylift(sndg[s1][PPRESS],sndg[s1][PTEMP],sndg[s1][PDEW],&p2,&t2); + startpres=p2; + if (startpressizeCE preStartCE[cloudStr->sizeCE]= startpres; + cloudStr->preEndCE[cloudStr->sizeCE]= endpres; + cloudStr->sizeCE++; + } + //setcolor(2); + //XFillRectangle(XtDisplay(draw_reg), canvas, gc,50,pres_to_pix(endpres), + // 90-50,pres_to_pix(startpres)-pres_to_pix(endpres)); + + } + } + } + } + } + } + } + } + diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/flipflop.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/flipflop.c index 3803e0e4e0..17a1030896 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/flipflop.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/flipflop.c @@ -14,7 +14,7 @@ void flipflopsounding(float **inoutsndg, int nlev) int i, j; if (nlev >= MAXLEV) { - fprintf(stderr, "WTF? flipflopsounding. nlev >= MAXLEV\n"); + fprintf(stderr, " flipflopsounding. nlev >= MAXLEV\n"); } /* First copy stuff into temporary array */ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/freako b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/freako old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/gemglb.nts b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/gemglb.nts old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals_xw.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals_xw.h index c7f35575c3..97425c3637 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals_xw.h +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals_xw.h @@ -39,6 +39,7 @@ #define DISPLAY_LEFT 0 #define DISPLAY_RIGHT 1 +#ifndef _WIN32 extern short drawing_mode; extern short display_mode_left; extern short display_mode_right; @@ -54,6 +55,7 @@ extern GC gc; extern Widget draw_reg; extern Pixmap canvas; extern XtAppContext app; +#endif extern short pagenum; extern short nobanner; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/last.nts b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/last.nts old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/nlist_backup.txt b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/nlist_backup.txt old mode 100755 new mode 100644 index 8a0ed8aa98..901d5a2afe --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/nlist_backup.txt +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/nlist_backup.txt @@ -1,1149 +1,1149 @@ -DATE / RAOB REPORT MUMR MUCAPE 500TEMP 7-5 LR 0-6SH 0-9SH 0-3SH SHIP MODELb SRH -91051100.MAF 6.00 14.9 4692 -10.8 8.8 13.2 18.1 14.2 1.9 2.70 -37 -95052300.DDC 6.00 15.3 4181 -9.6 7.5 19.4 26.8 23.4 1.9 3.00 325 -97061700.OUN 5.50 18.8 5751 -9.5 7.4 23.6 45.9 14.5 4.3 3.50 116 -06040300.LZK 5.00 13.7 3819 -14.9 8.0 26.6 32.6 20.9 3.9 3.40 251 -57070300.RAP 5.00 15.8 4359 -6.7 7.7 22.9 39.3 13.9 1.9 3.40 130 -90070800.BIS 5.00 16.6 3717 -9.8 7.7 29.8 42.2 12.5 3.3 2.40 202 -91052900.HON 5.00 15.2 3892 -12.3 8.0 40.7 36.0 25.0 5.7 3.50 269 -92072600.DDC 5.00 17.4 4794 -4.6 6.8 17.4 14.6 18.2 1.1 0.80 176 -96061200.DDC 5.00 13.7 2820 -8.3 7.6 20.3 15.8 12.9 1.2 2.50 142 -99012200.LZK 5.00 12.3 2240 -17.3 7.6 26.3 32.1 23.0 2.3 3.00 294 -99060100.DDC 4.75 15.9 4387 -11.3 8.0 27.7 38.0 15.3 4.2 3.50 209 -02042900.IAD 4.50 13.6 2553 -16.7 7.3 21.1 33.9 24.9 2.1 2.90 373 -02043000.FWD 4.50 19.4 5853 -10.9 8.0 29.7 37.1 14.6 7.0 3.10 151 -89060400.MAF 4.50 14.0 3939 -10.0 8.5 20.6 33.6 6.6 2.3 2.20 58 -89060700.SEP 4.50 15.6 3510 -7.9 7.0 24.8 47.4 9.0 1.8 2.40 130 -89062700.GSO 4.50 17.6 4349 -7.3 6.3 14.2 6.4 7.8 1.2 0.90 52 -89070300.SEP 4.50 18.5 5261 -7.6 8.4 22.6 1.2 12.9 3.4 2.90 222 -89080400.INL 4.50 17.4 3953 -11.5 8.3 18.6 29.2 7.3 2.9 1.00 36 -90051600.OUN 4.50 16.7 4398 -9.0 7.6 25.5 44.9 23.2 3.1 3.10 180 -91032800.FNT 4.50 11.3 1860 -17.3 7.6 47.0 45.4 26.8 3.1 2.90 431 -91042912.BRO 4.50 19.5 4471 -9.8 7.7 23.1 24.2 13.7 3.6 -999.00 254 -91072100.HON 4.50 20.1 5826 -6.1 6.8 22.8 33.9 14.3 2.6 1.90 180 -91081400.GTF 4.50 11.5 2524 -13.2 8.5 25.8 28.9 15.3 2.0 2.00 213 -92062800.AMA 4.50 16.0 4069 -10.3 7.9 22.8 27.5 16.9 2.9 3.20 150 -92062800.DDC 4.50 13.8 2750 -11.3 7.8 20.6 41.3 15.2 1.6 2.90 315 -92062900.SEP 4.50 17.4 3761 -9.6 7.8 21.8 15.6 13.7 2.5 2.80 248 -92073000.OVN 4.50 16.6 4366 -11.4 7.4 22.3 23.7 13.9 3.3 3.20 216 -92073000.TOP 4.50 16.6 4074 -10.0 7.5 22.5 22.1 11.8 2.7 2.40 164 -93050100.DDC 4.50 11.1 3206 -16.5 8.0 24.0 29.9 15.4 2.7 3.70 194 -93060800.OUN 4.50 17.0 4917 -9.1 7.1 30.6 26.7 9.7 3.9 2.60 195 -93062700.OVN 4.50 15.0 3720 -10.0 6.3 22.3 28.9 9.4 1.9 3.10 140 -93072400.BIS 4.50 15.3 3597 -9.8 5.8 21.0 33.2 14.9 1.6 2.30 263 -93092200.OVN 4.50 15.4 3685 -11.1 8.1 31.9 33.2 23.5 3.9 4.00 492 -93092200.TOP 4.50 16.8 3665 -8.1 6.5 21.3 37.9 21.3 1.7 1.30 502 -93101300.SEP 4.50 14.2 3151 -13.1 8.0 22.3 31.8 15.0 2.5 2.90 307 -93101800.SEP 4.50 15.7 3958 -10.6 7.0 31.7 30.5 23.2 3.5 2.20 441 -94040300.OUN 4.50 10.1 2075 -17.0 7.6 31.2 39.3 18.7 2.0 2.10 163 -94042600.SEP 4.50 16.3 4409 -11.5 7.4 26.7 26.2 21.2 3.9 3.30 138 -94060800.LBF 4.50 13.0 3400 -9.5 7.8 18.7 18.4 8.1 1.5 2.40 109 -95051700.DDC 4.50 15.6 4878 -10.8 8.5 26.6 40.7 8.9 4.4 2.60 43 -95060500.MAF 4.50 14.9 4358 -8.6 7.6 23.2 32.0 16.0 2.3 2.90 181 -95060900.MAF 4.50 17.8 5653 -8.1 8.1 18.7 33.5 12.8 2.9 2.90 83 -96030700.JAN 4.50 14.0 2362 -12.5 6.8 34.9 36.9 16.8 2.3 0.60 196 -96050500.IAD 4.50 12.1 2432 -15.2 7.2 25.0 25.5 15.9 1.9 1.90 36 -96051000.TOP 4.50 15.6 3884 -11.1 8.8 18.3 22.3 22.1 2.6 3.30 234 -96062700.TFX 4.50 13.9 3835 -10.9 8.3 37.1 44.3 21.8 4.3 1.60 297 -96081100.LBF 4.50 13.3 2360 -8.4 6.2 26.1 22.0 26.5 1.0 2.60 326 -96102100.OUN 4.50 12.7 2995 -12.9 7.5 20.3 28.4 15.6 1.8 3.00 71 -01070300.LBF 4.25 16.7 5584 -8.7 8.5 18.0 24.7 14.2 3.0 4.20 154 -03040600.FWD 4.25 12.4 2487 -14.3 7.3 31.5 51.8 17.1 2.4 2.90 341 -03050500.SGF 4.25 15.7 5169 -13.5 7.6 38.4 50.7 30.0 7.6 2.90 348 -03050518.BNA 4.25 16.0 2730 -12.9 7.1 37.0 37.2 18.3 3.5 -999.00 239 -03051000.MHX 4.25 17.1 4373 -10.5 7.3 22.7 23.2 14.1 3.1 2.10 146 -04040400.MAF 4.25 12.0 2746 -14.7 7.0 19.5 31.1 14.4 1.6 2.70 262 -04052200.AMA 4.25 13.7 4265 -8.7 7.9 21.5 23.9 13.6 2.1 2.10 176 -04053000.OUN 4.25 16.8 4526 -7.5 7.8 24.4 40.4 15.8 2.6 -999.00 224 -04062200.AMA 4.25 13.8 3828 -8.9 8.0 26.2 40.5 17.8 2.3 2.30 141 -04071200.GGW 4.25 11.0 2390 -13.7 8.6 22.3 32.0 17.1 1.6 1.90 99 -04071300.LBF 4.25 19.5 7183 -7.3 8.6 14.7 20.5 10.3 3.1 3.70 68 -04071318.ILX 4.25 22.1 6811 -10.9 7.9 18.7 21.9 15.5 5.8 2.60 131 -04081000.DNR 4.25 12.9 3415 -9.1 8.0 15.0 15.4 16.2 1.2 3.20 270 -05031400.JAN 4.25 11.1 1382 -15.7 7.6 25.5 49.7 19.2 1.1 2.80 161 -05042000.LBF 4.25 10.1 2460 -15.7 8.9 15.3 22.3 16.6 1.3 2.90 255 -05042200.SGF 4.25 12.6 2944 -13.3 6.8 21.3 15.6 15.1 1.7 2.20 193 -07080400.RAP 4.25 15.6 2983 -4.1 6.2 22.7 35.8 18.3 0.6 0.90 270 -08020600.SHV 4.25 13.5 2312 -14.1 7.3 32.4 43.7 25.8 2.5 1.80 212 -02042000.MAF 4.00 12.9 2974 -8.1 6.9 24.3 41.7 19.0 1.2 2.50 133 -02061300.DDC 4.00 19.5 6234 -6.9 7.6 19.8 32.7 17.2 3.0 3.70 126 -03050300.BMX 4.00 15.2 4593 -15.7 7.9 32.4 30.5 8.1 6.7 2.90 51 -04071318.DVN 4.00 20.8 6090 -11.1 8.4 25.9 22.3 22.5 7.3 2.80 191 -06050600.MAF 4.00 12.4 3533 -12.3 8.2 33.6 48.0 19.3 3.5 2.00 174 -06071700.INL 4.00 14.1 3719 -11.1 8.4 26.3 29.8 19.9 3.1 2.40 328 -06092221.SGF 4.00 17.6 5071 -6.7 5.3 31.6 37.0 21.0 2.4 1.10 202 -89061100.AMA 4.00 15.8 3666 -8.7 7.6 11.0 19.2 11.1 1.0 -999.00 87 -89062700.DDC 4.00 14.3 2840 -8.4 7.6 19.4 19.2 12.7 1.2 2.20 167 -89071800.LBF 4.00 15.4 3622 -9.4 8.1 38.9 37.6 22.9 3.9 2.90 361 -90051500.AMA 4.00 14.8 4543 -9.9 8.2 24.7 33.8 19.2 3.2 2.20 473 -90051900.AMA 4.00 11.5 2732 -9.3 7.7 26.1 30.4 18.5 1.4 2.10 301 -90060900.TOP 4.00 18.5 5571 -10.1 7.3 22.6 16.4 14.8 4.1 2.70 252 -90070100.DAY 4.00 16.6 3541 -9.4 7.1 19.9 24.5 8.6 1.8 1.80 154 -90090200.RAP 4.00 11.3 1762 -7.4 7.5 23.6 32.7 14.1 0.6 2.10 181 -91041300.SEP 4.00 16.9 5008 -10.6 6.8 21.8 27.4 12.2 3.2 3.40 137 -93071600.RAP 4.00 14.1 3230 -7.5 7.7 25.0 35.8 18.6 1.6 3.20 97 -93072300.HON 4.00 15.7 3720 -8.1 6.0 19.1 22.5 15.4 1.3 1.50 130 -95050600.FTD 4.00 15.1 2036 -11.1 7.1 21.2 37.5 20.8 1.2 0.60 304 -95051600.JAN 4.00 17.9 4861 -10.9 7.8 14.9 18.5 8.6 2.6 2.50 -35 -95072500.FTD 4.00 15.4 2897 -10.0 9.2 19.1 19.8 12.8 1.9 -999.00 168 -95072600.DDC 4.00 18.3 5696 -10.1 8.8 21.3 19.2 17.1 4.7 3.30 238 -95102700.SGF 4.00 12.5 2166 -13.8 6.9 21.9 29.4 25.7 1.3 1.60 267 -96052300.LBF 4.00 13.5 2915 -11.1 8.0 27.8 43.7 18.5 2.3 2.90 303 -97082200.LBF 4.00 15.7 3974 -9.7 7.4 26.4 37.5 17.4 2.8 3.30 321 -98050800.FFC 4.00 17.3 4120 -12.3 7.7 31.0 51.6 17.1 5.0 2.20 172 -98063000.TOP 4.00 21.8 6490 -5.3 7.2 24.4 32.6 18.1 3.1 1.70 230 -03040400.OUN 3.75 11.9 2640 -15.1 7.3 24.0 23.9 13.4 2.0 2.30 187 -95051900.BMX 3.75 16.5 3370 -9.9 6.6 20.6 25.5 16.9 1.8 0.60 246 -01040400.SGF 3.65 12.8 3277 -15.1 8.3 22.4 28.9 17.2 2.8 3.10 310 -01041500.DDC 3.65 13.1 3892 -18.3 9.0 43.1 54.7 24.4 8.6 2.50 233 -01050700.LZK 3.65 14.7 3512 -12.9 5.9 18.7 26.3 7.3 1.8 3.40 77 -01050700.SHV 3.65 14.8 2945 -12.5 6.5 15.7 22.1 9.0 1.3 1.70 110 -01051800.AMA 3.65 13.9 4695 -10.5 8.6 13.2 22.8 16.1 1.8 2.10 86 -01052500.JAN 3.65 13.5 3446 -15.1 7.5 21.8 31.4 17.4 2.7 2.70 240 -01061400.DDC 3.65 15.7 5244 -8.9 8.0 28.1 28.2 19.8 3.9 2.50 384 -01062100.DDC 3.65 15.2 4428 -10.7 7.8 19.0 25.2 13.4 2.5 3.20 400 -01071800.ABR 3.65 17.5 5177 -9.9 8.4 19.5 28.2 9.6 3.5 3.90 136 -01072100.GGW 3.65 13.5 3114 -10.7 7.7 28.3 30.5 15.8 2.3 2.80 354 -02051100.MAF 3.65 14.5 4658 -9.3 8.4 23.1 40.3 14.8 2.9 2.20 132 -02051200.TOP 3.65 15.8 4489 -11.9 8.1 26.0 26.5 13.7 4.2 3.30 224 -02060500.RNK 3.65 17.9 5399 -9.7 6.9 4.0 7.3 8.7 0.6 3.20 54 -02062400.ABR 3.65 17.2 5093 -10.5 8.2 26.3 30.9 16.9 4.7 3.50 187 -02091900.OUN 3.65 15.7 4268 -6.1 6.7 20.8 23.4 17.8 1.4 3.00 308 -03062300.OAX 3.65 18.7 6203 -9.3 8.6 13.6 22.9 12.3 3.0 4.20 237 -98040800.ILX 3.65 10.2 1354 -19.7 7.2 21.2 25.1 20.1 1.0 2.60 180 -98052200.SGF 3.65 17.1 4719 -9.9 7.8 22.4 23.1 13.8 3.3 2.30 232 -99030600.LZK 3.65 11.7 1922 -18.5 8.2 22.8 39.2 21.4 1.9 2.10 360 -99050400.OUN 3.65 15.6 5195 -14.9 8.4 21.3 22.0 16.5 5.1 4.70 343 -99072600.LBF 3.65 16.4 4375 -6.7 7.9 12.9 16.1 9.5 1.2 2.60 60 -01041000.SGF 3.50 13.0 3476 -14.5 7.9 21.6 30.3 12.5 2.7 2.60 141 -01061500.FWD 3.50 17.3 4260 -9.7 7.9 15.1 9.7 11.1 2.0 2.20 74 -02081200.DDC 3.50 14.0 3415 -8.7 8.0 15.7 27.7 10.7 1.2 3.10 157 -89070300.STC 3.50 15.6 3556 -8.2 7.0 15.8 21.4 8.5 1.2 1.40 128 -90031400.OUN 3.50 14.6 3950 -16.1 7.2 20.2 49.4 12.3 3.2 2.90 169 -90040600.SEP 3.50 12.4 3764 -14.9 7.8 25.2 36.8 15.4 3.3 2.30 305 -90060900.IAD 3.50 17.2 3994 -10.9 7.1 23.7 20.0 18.3 3.0 0.90 203 -90061900.BIS 3.50 11.1 1968 -13.5 8.2 28.4 38.0 17.4 1.6 2.90 257 -96062000.OAX 3.50 16.3 4081 -9.8 8.6 19.0 24.4 18.9 2.5 -999.00 271 -97062100.LBF 3.50 17.3 6058 -9.3 8.8 23.1 25.1 13.9 4.7 3.70 129 -98052100.TOP 3.50 16.5 4680 -12.5 8.4 10.5 23.7 9.8 2.0 3.80 100 -98052500.OUN 3.50 18.0 5688 -10.7 8.1 21.9 28.7 9.9 4.6 4.20 172 -98062000.OUN 3.50 19.0 6048 -7.1 7.8 15.4 11.2 13.7 2.3 3.90 209 -06070200.GRB 3.25 15.4 3255 -9.3 6.6 17.0 24.9 14.7 1.2 1.50 99 -91060500.DDC 3.25 16.9 4631 -7.9 6.5 15.3 15.4 11.0 1.5 3.50 74 -00050400.FWD 3.00 13.2 2731 -14.3 6.3 21.7 28.5 19.0 1.7 3.00 327 -00062900.MAF 3.00 14.8 3565 -6.3 6.3 10.5 16.7 9.6 0.5 1.80 29 -00080600.OAX 3.00 19.0 5525 -7.1 7.5 15.0 22.8 9.4 2.0 3.10 56 -01051900.LZK 3.00 16.6 4269 -12.5 8.1 18.5 25.8 9.9 3.2 2.70 98 -01053000.AMA 3.00 16.4 5827 -9.7 8.2 26.1 29.7 25.0 4.7 2.80 268 -01090900.FWD 3.00 17.1 4304 -8.9 8.2 14.1 12.0 7.7 1.8 2.70 97 -03042100.SHV 3.00 15.5 2947 -13.5 7.5 24.0 38.0 14.3 2.6 0.90 110 -03050420.SGF 3.00 15.8 4524 -11.9 7.1 35.4 47.9 25.2 5.1 3.20 480 -03062400.LBF 3.00 18.6 6189 -8.7 8.1 30.8 31.6 21.7 5.9 4.80 381 -03062800.DDC 3.00 11.4 2329 -9.3 6.7 16.9 26.8 10.8 0.7 2.20 138 -04041900.OAX 3.00 11.9 3136 -15.1 8.2 33.8 44.9 20.5 3.7 1.90 394 -04042200.OUN 3.00 12.2 2363 -13.5 7.0 24.3 33.8 16.9 1.6 2.70 385 -04051700.DDC 3.00 10.0 2200 -11.9 8.4 31.7 30.2 20.5 1.6 1.50 390 -04052300.OAX 3.00 15.6 4333 -12.3 7.6 32.4 28.9 19.6 4.9 3.00 289 -04070200.AMA 3.00 16.9 5137 -8.1 7.4 14.0 16.6 18.0 1.7 3.00 80 -04081000.DDC 3.00 14.6 3147 -9.7 7.7 21.0 22.0 13.0 1.7 3.00 222 -06042412.LMN 3.00 14.1 3248 -12.9 8.2 25.4 28.7 16.6 2.9 3.20 413 -06042500.OUN 3.00 15.5 4007 -12.3 8.6 20.1 21.2 15.4 3.2 3.30 105 -06052500.SGF 3.00 15.6 3470 -11.1 7.6 14.3 7.3 13.6 1.5 2.00 162 -06052700.BNA 3.00 16.1 3535 -8.3 5.9 12.8 17.2 17.7 0.9 0.70 196 -06052800.BIS 3.00 12.5 3434 -11.1 8.1 11.3 12.7 10.5 1.0 1.80 74 -72081200.YRM 3.00 10.9 1989 -14.2 8.3 24.6 35.0 14.0 1.5 2.40 132 -89060500.OUN 3.00 12.5 1640 -11.6 7.0 15.7 23.9 8.8 0.6 0.70 53 -89060700.AMA 3.00 15.4 4752 -9.5 8.5 30.5 55.6 21.7 4.3 2.40 303 -90051500.OUN 3.00 16.8 4798 -10.7 7.8 19.8 29.7 12.5 3.2 4.20 186 -90052700.OUN 3.00 17.5 4621 -8.8 7.6 23.8 25.1 20.4 3.1 3.20 255 -91032700.TOP 3.00 12.7 2763 -12.3 6.8 27.7 31.7 21.6 1.9 2.50 279 -91040912.1M1 3.00 14.2 3450 -15.2 8.0 19.7 20.8 11.5 2.8 -999.00 134 -91052700.DDC 3.00 17.0 5493 -10.5 8.4 21.7 29.3 13.3 4.2 2.90 81 -92032600.TBW 3.00 12.6 2104 -14.0 6.5 32.2 37.0 18.6 1.8 1.10 195 -92062700.MAF 3.00 13.9 3224 -8.2 7.7 23.7 38.8 13.0 1.6 2.50 253 -92070500.OVN 3.00 17.3 5051 -9.3 7.4 21.8 33.3 16.1 3.1 3.50 243 -93050600.MAF 3.00 13.9 3784 -9.6 7.2 27.0 25.4 18.6 2.3 2.50 149 -93060600.HAT 3.00 16.0 4948 -13.5 8.3 15.5 17.2 12.6 3.2 3.90 70 -93070200.DDC 3.00 17.1 4895 -5.2 7.2 16.4 21.4 13.3 1.2 2.80 237 -93070900.OVN 3.00 19.7 5546 -6.8 6.9 29.4 24.3 16.9 3.6 0.60 345 -93082300.DDC 3.00 13.3 2608 -7.8 7.7 19.5 27.0 13.1 1.0 2.00 83 -93091900.AMA 3.00 12.4 1911 -9.0 7.7 32.7 35.4 16.5 1.3 2.40 264 -93091900.DDC 3.00 12.4 1954 -10.4 7.2 29.5 46.6 16.8 1.3 2.80 233 -94032800.CKL 3.00 15.3 2066 -9.6 6.3 38.6 36.3 30.5 1.8 0.60 429 -94052600.FNT 3.00 10.8 2240 -16.3 6.1 17.8 25.8 12.8 1.0 2.40 113 -94060600.DDC 3.00 14.8 4882 -8.8 8.7 15.6 18.6 13.1 2.0 2.10 248 -95021400.PBI 3.00 16.5 2433 -11.0 5.9 27.1 33.4 13.8 1.7 0.60 117 -95043000.FTD 3.00 15.0 4416 -13.3 8.1 21.9 31.7 15.6 3.7 3.40 166 -95062300.LBF 3.00 12.9 2962 -11.1 7.9 21.0 19.8 15.3 1.7 2.80 220 -95071500.LBF 3.00 14.4 3052 -7.0 6.5 15.9 24.7 13.9 0.8 2.10 159 -95072400.DDC 3.00 15.9 3645 -9.9 8.2 18.2 32.6 11.8 2.0 3.60 31 -95082300.INL 3.00 15.4 3023 -11.6 8.0 30.9 26.5 25.4 3.2 2.10 694 -95082700.GGW 3.00 11.7 3094 -12.6 8.3 26.8 41.0 13.6 2.4 1.70 162 -96033100.SHV 3.00 12.7 2891 -17.1 7.6 27.4 35.5 20.1 3.1 3.10 163 -96042000.ILX 3.00 12.9 2394 -14.6 7.1 27.0 39.5 16.4 2.1 -999.00 249 -96052700.OUN 3.00 15.2 3034 -9.4 6.9 29.8 33.6 22.5 2.1 2.00 330 -96061400.UNR 3.00 13.1 3801 -11.0 8.4 18.0 14.8 12.4 2.0 2.00 63 -96062012.LBF 3.00 15.2 3418 -8.6 7.9 22.6 25.0 16.5 1.9 3.30 380 -96070800.LBF 3.00 15.3 3341 -6.4 7.0 30.0 41.5 20.6 1.6 2.20 390 -97052600.OUN 3.00 17.2 5143 -7.7 5.9 30.4 32.4 15.0 2.9 2.60 148 -97061000.FWD 3.00 15.6 2699 -9.9 7.0 18.7 24.1 10.9 1.3 1.30 98 -98052400.DDC 3.00 11.6 2630 -12.9 6.7 22.0 27.7 9.8 1.4 2.30 101 -98061400.OAX 3.00 13.3 2830 -10.5 7.7 24.4 45.4 15.3 1.8 3.40 219 -98062500.ABR 3.00 16.3 4448 -13.7 8.8 17.4 28.7 11.2 3.6 3.70 42 -98062500.BIS 3.00 15.5 4591 -13.3 8.1 15.9 15.4 15.5 2.9 3.00 89 -98062900.TOP 3.00 22.0 6895 -7.7 7.0 20.6 27.3 19.3 4.0 2.40 335 -99060200.FWD 3.00 17.3 4928 -11.5 8.8 15.0 30.3 15.3 3.1 4.50 171 -00022500.AMA 2.75 10.3 3614 -18.5 8.5 26.8 48.5 13.1 3.8 1.70 107 -00051300.DTX 2.75 16.9 4524 -8.5 7.7 24.1 18.5 20.2 2.9 2.40 328 -00052700.OUN 2.75 18.3 5870 -10.1 8.4 21.5 32.8 12.8 4.6 4.00 117 -00061200.BIS 2.75 11.3 2000 -13.1 7.5 22.0 28.0 10.2 1.2 2.50 306 -00061400.AMA 2.75 16.5 5758 -4.9 7.6 23.8 32.0 19.9 2.0 2.50 244 -00062000.LBF 2.75 14.9 4028 -8.5 6.8 18.8 23.9 11.9 1.6 3.00 96 -00071000.GGW 2.75 15.6 3180 -10.9 7.0 18.4 13.5 23.2 1.7 2.60 248 -00071000.LBF 2.75 18.1 5871 -5.5 7.8 14.3 19.9 10.7 1.5 3.50 146 -00071700.MHX 2.75 15.1 2929 -12.3 7.2 18.2 29.9 7.9 1.7 2.30 81 -00072100.LBF 2.75 15.3 3073 -11.3 7.8 26.5 39.4 16.9 2.6 2.00 223 -00072500.LBF 2.75 17.1 5901 -8.9 8.5 24.5 29.4 22.2 4.4 2.90 162 -00072700.OAX 2.75 18.5 5048 -9.7 8.0 21.8 23.2 16.7 3.8 2.60 215 -00121618.BMX 2.75 13.2 2219 -14.1 6.7 32.9 45.8 25.0 2.2 0.90 266 -01040400.LZK 2.75 15.2 4223 -15.1 8.5 18.1 24.8 11.9 3.5 3.10 105 -01042100.OAX 2.75 12.4 3283 -15.3 7.7 28.1 32.7 23.5 3.2 2.40 282 -01050620.LMN 2.75 15.4 4496 -16.1 7.3 11.5 20.9 7.3 2.2 3.10 60 -01052500.FFC 2.75 11.7 2338 -14.5 6.4 18.1 21.4 19.6 1.1 2.50 240 -01060600.AMA 2.75 14.9 4665 -8.9 7.2 15.8 15.6 11.9 1.7 2.30 191 -01060800.DNR 2.75 13.9 3440 -8.7 7.2 25.3 21.9 7.4 1.8 3.10 -26 -01061000.ABR 2.75 13.8 3453 -12.1 7.8 24.6 32.3 16.6 2.6 3.60 158 -01061400.OAX 2.75 17.2 4956 -11.3 9.0 20.4 25.5 18.5 4.2 3.80 153 -01061700.LMN 2.75 14.1 4093 -10.7 8.0 19.4 26.9 9.3 2.3 3.50 195 -01061700.TOP 2.75 15.7 4594 -13.7 8.5 22.1 26.6 15.7 4.4 3.40 214 -01061900.MPX 2.75 15.6 5114 -11.9 9.2 33.1 31.9 19.0 6.9 3.40 154 -01070100.RAP 2.75 14.3 3235 -10.7 7.7 30.8 40.7 12.9 2.8 2.60 114 -01071800.INL 2.75 17.0 4580 -12.9 7.8 11.9 12.8 11.8 2.2 0.80 154 -01071900.ABR 2.75 17.5 5356 -10.5 8.8 18.1 22.7 3.4 3.7 2.70 35 -01071900.BIS 2.75 17.8 5738 -9.9 8.6 21.8 28.8 14.1 4.5 2.90 183 -01072500.GGW 2.75 11.5 1714 -11.3 6.9 26.7 32.1 18.2 1.0 2.20 350 -01112418.BMX 2.75 15.1 2902 -11.3 6.1 26.9 31.9 22.2 1.9 0.80 328 -02051800.DRT 2.75 16.0 5077 -10.5 8.1 8.8 6.3 5.2 1.5 2.60 15 -02052400.AMA 2.75 13.8 4729 -13.3 8.3 28.8 21.8 18.5 4.9 2.30 258 -02060500.AMA 2.75 13.2 2947 -11.5 7.6 32.1 45.0 17.9 2.6 2.70 309 -02061300.AMA 2.75 13.7 3027 -8.5 8.4 29.6 33.0 18.7 2.1 2.50 65 -02062400.BIS 2.75 16.0 3559 -9.7 6.8 28.0 24.8 25.2 2.5 2.40 298 -02062500.ABR 2.75 15.1 4208 -7.1 6.8 19.1 19.3 11.1 1.4 3.10 20 -02072000.TOP 2.75 17.5 4986 -7.5 7.3 10.0 12.7 8.5 1.1 2.70 197 -02072700.TOP 2.75 19.3 6406 -5.3 6.9 18.2 19.3 9.1 2.0 2.60 131 -02081200.LBF 2.75 13.3 3735 -9.9 8.7 13.1 11.8 10.5 1.3 2.10 222 -03031300.SHV 2.75 13.5 2901 -15.3 7.1 17.1 24.1 11.0 1.7 2.00 162 -03040618.LZK 2.75 13.1 2556 -15.9 7.6 35.1 38.9 28.4 3.4 3.10 600 -03042500.LZK 2.75 13.8 3423 -15.7 7.6 20.9 31.0 20.0 2.8 3.30 212 -03042600.BMX 2.75 14.2 3921 -13.3 6.2 35.8 33.5 26.6 3.9 2.70 89 -03042900.SGF 2.75 13.1 3399 -16.7 8.5 5.0 19.6 4.8 0.7 2.80 53 -03050100.TOP 2.75 13.0 3922 -14.1 7.8 17.2 19.6 13.9 2.3 2.70 117 -03050618.SGF 2.75 15.6 5492 -14.7 7.7 32.0 40.6 17.8 7.4 2.80 313 -03050700.FWD 2.75 17.8 5303 -9.7 7.1 30.4 36.2 8.4 4.7 3.50 126 -03051000.OUN 2.75 16.8 5328 -11.1 8.3 27.5 34.8 16.8 5.4 3.60 182 -03051400.SHV 2.75 16.7 3920 -9.5 7.2 27.2 37.0 19.3 2.9 0.80 389 -03051600.AMA 2.75 14.1 3706 -10.3 8.9 42.9 37.7 34.9 4.9 -999.00 632 -03051700.SHV 2.75 16.3 3995 -10.9 7.4 23.2 13.9 19.6 2.9 2.70 242 -03060500.AMA 2.75 11.9 2647 -11.9 7.6 23.0 28.5 13.1 1.5 2.10 167 -03061400.AMA 2.75 12.3 3153 -13.3 8.3 21.7 24.7 13.7 2.2 2.10 35 -03091000.DDC 2.75 14.8 3620 -7.7 7.5 12.1 15.8 11.3 0.9 3.00 233 -03091100.MAF 2.75 13.3 2808 -6.5 6.8 10.3 9.0 7.4 0.4 1.40 80 -03100600.AMA 2.75 12.2 2542 -10.3 6.4 24.1 30.2 12.9 1.2 2.50 50 -04032718.DDC 2.75 13.2 4133 -17.3 8.0 24.6 26.6 14.4 4.4 2.30 143 -04032800.OUN 2.75 12.6 2904 -15.9 7.8 23.3 31.1 16.4 2.5 2.80 315 -04040500.CRP 2.75 14.9 2478 -12.1 6.7 22.4 20.6 7.0 1.6 0.60 184 -04050600.WAL 2.75 9.3 1861 -21.3 7.2 20.2 28.3 21.3 1.3 1.40 239 -04051100.DNR 2.75 10.6 3995 -12.9 9.2 28.3 16.6 18.2 3.4 1.50 379 -04051223.LMN 2.75 15.9 4076 -10.5 7.4 22.7 30.4 21.9 2.7 2.40 304 -04051300.OUN 2.75 16.8 5740 -11.5 8.2 15.2 20.9 12.4 3.3 3.60 131 -04053000.TOP 2.75 15.9 3882 -12.9 8.7 22.4 15.3 14.8 3.7 3.20 295 -04060300.FWD 2.75 16.9 4767 -11.1 8.7 19.1 24.1 14.1 3.5 -999.00 157 -04070500.DDC 2.75 14.3 3819 -10.3 8.3 18.6 30.5 14.4 2.1 2.50 161 -05022200.FFC 2.75 11.4 1389 -16.3 7.0 28.5 35.4 20.7 1.2 1.70 225 -05041800.AMA 2.75 9.4 1767 -17.3 8.7 19.6 22.9 15.5 1.2 1.90 211 -05042100.DDC 2.75 13.2 4722 -15.3 8.6 16.1 14.9 15.2 3.1 2.10 174 -05042300.JAN 2.75 13.6 2558 -14.7 7.1 28.5 34.1 19.9 2.5 2.70 183 -05051000.FWD 2.75 15.5 4841 -11.5 6.7 18.0 25.9 9.5 2.5 2.90 152 -05092300.ILX 2.75 14.1 1858 -8.1 6.9 21.5 16.8 11.5 0.7 0.80 121 -06031218.TOP 2.75 12.6 2814 -17.9 8.5 44.8 54.9 33.9 5.7 2.70 723 -06041400.DVN 2.75 11.2 1524 -15.7 8.3 30.6 30.3 15.8 1.6 3.40 263 -06042000.BMX 2.75 13.1 2242 -11.9 7.1 21.7 27.0 11.3 1.3 2.10 122 -06050300.DRT 2.75 13.7 3549 -12.1 8.5 14.2 19.0 5.1 1.7 2.10 74 -06050500.MAF 2.75 11.5 3709 -12.1 8.1 27.6 34.4 21.7 2.7 1.70 372 -06050718.CHS 2.75 12.9 2580 -12.5 6.0 17.7 18.8 15.9 1.1 2.00 177 -06050800.MAF 2.75 11.9 2440 -12.5 8.0 33.3 51.2 22.1 2.3 2.30 327 -06062200.DDC 2.75 12.7 2406 -8.7 8.1 21.1 24.9 11.0 1.1 2.40 175 -06081000.BIS 2.75 13.0 2589 -8.9 7.5 19.1 18.8 8.8 1.0 2.60 147 -06082600.DDC 2.75 16.5 3488 -5.5 6.5 20.2 26.5 17.6 1.0 0.80 141 -07021400.BMX 2.75 9.9 1032 -19.1 7.0 20.7 36.3 19.5 0.7 2.40 245 -58042200.FWH 2.75 13.3 3338 -16.1 7.8 37.0 49.4 25.5 4.9 2.40 276 -89060200.MAF 2.75 14.1 3193 -10.4 7.9 24.5 27.4 8.5 2.2 2.80 104 -89060300.MAF 2.75 11.9 2291 -8.4 7.6 19.3 32.2 13.3 0.8 2.20 147 -89060300.TOP 2.75 13.7 2623 -12.6 7.0 19.5 39.7 12.4 1.5 2.00 118 -89061300.AMA 2.75 14.4 3611 -10.8 8.1 15.8 22.1 9.9 1.7 3.00 79 -89062600.RAP 2.75 11.5 2246 -13.8 7.8 31.3 30.4 20.0 2.1 2.60 301 -89081600.AMA 2.75 12.8 2669 -7.1 6.9 17.0 24.9 10.5 0.7 2.50 158 -89082200.HON 2.75 15.6 4160 -9.4 6.9 22.9 28.9 14.8 2.3 3.30 107 -89082200.OMA 2.75 17.9 4223 -8.3 7.0 22.2 45.4 15.0 2.3 0.90 138 -89082200.STC 2.75 16.2 3346 -11.1 6.9 20.6 30.6 11.9 2.0 1.20 173 -89082900.STC 2.75 14.6 1959 -10.0 6.8 26.3 44.7 18.0 1.2 1.10 147 -89090400.LBF 2.75 17.3 4599 -8.6 8.3 29.6 38.8 8.6 4.0 3.30 223 -90021600.JAN 2.75 15.2 2047 -10.9 6.6 20.9 34.6 18.9 1.1 -999.00 124 -90031400.PIA 2.75 12.4 2115 -14.4 6.9 18.1 24.1 15.3 1.1 2.60 206 -90041700.OUN 2.75 13.6 3717 -15.0 8.3 11.5 20.5 17.2 1.7 3.80 152 -90042800.GGG 2.75 12.9 2263 -14.9 6.6 14.1 25.3 12.8 1.0 2.80 84 -90050100.AHN 2.75 14.9 4557 -12.6 7.7 14.7 9.3 19.7 2.3 3.40 92 -90051700.GGG 2.75 17.5 3234 -8.3 7.2 24.7 35.1 17.6 2.0 0.60 304 -90051900.LBF 2.75 12.1 3954 -13.9 8.6 25.1 24.6 16.2 3.4 2.00 398 -90052000.OUN 2.75 15.3 4565 -10.8 7.1 13.7 14.7 12.1 1.8 3.10 94 -90053100.GGG 2.75 19.3 4743 -5.7 6.1 27.2 25.7 21.5 2.1 0.70 317 -90060200.LBF 2.75 13.6 3719 -10.8 7.9 15.6 29.4 16.4 1.6 2.40 89 -90060200.STC 2.75 13.4 2697 -13.3 8.5 18.6 17.2 10.4 1.8 2.20 132 -90061900.LBF 2.75 19.2 7070 -6.1 8.4 30.2 38.1 18.5 5.0 3.60 266 -90070300.BIS 2.75 21.3 6982 -6.3 8.2 23.0 29.6 14.9 4.2 4.60 172 -90070700.BIS 2.75 14.9 3274 -7.5 6.9 19.0 25.7 12.9 1.1 2.20 316 -90081100.LBF 2.75 14.8 3971 -9.0 7.5 25.6 21.5 14.3 2.4 2.90 282 -90082800.SSM 2.75 18.2 5115 -8.5 6.2 31.6 29.9 20.5 3.7 1.10 334 -90090600.STC 2.75 19.5 4899 -6.8 6.2 21.0 17.1 14.7 2.0 1.00 294 -91032200.UMN 2.75 11.5 2632 -15.3 7.0 33.0 35.3 18.8 2.5 2.50 371 -91032700.DDC 2.75 12.4 3132 -14.2 8.2 40.7 44.0 18.9 4.4 2.10 160 -91040300.OUN 2.75 10.1 1560 -19.8 7.3 22.6 41.7 15.1 1.2 1.50 275 -91041300.OUN 2.75 14.1 4063 -13.7 8.0 22.0 25.1 17.1 3.3 2.90 205 -91042700.GGG 2.75 18.9 5164 -10.7 8.2 18.9 27.6 12.4 3.8 2.70 209 -91042700.OUN 2.75 16.6 4751 -11.5 7.0 23.6 26.4 20.6 3.6 3.70 376 -91042800.GGG 2.75 18.9 4554 -10.5 7.2 29.5 19.6 15.4 4.6 2.20 140 -91051100.AMA 2.75 15.6 5629 -10.7 9.0 16.5 21.5 14.5 3.3 2.50 314 -91051200.RAP 2.75 14.1 4430 -11.0 7.9 23.5 33.5 26.6 3.0 2.50 437 -91051700.UMN 2.75 15.9 3299 -10.6 7.6 16.1 11.8 14.4 1.6 1.90 174 -91051800.UMN 2.75 15.1 3444 -11.0 7.4 11.9 21.0 9.4 1.2 1.20 59 -91052500.AMA 2.75 13.7 3416 -10.5 7.0 17.4 13.8 17.0 1.4 2.50 124 -91053000.OVN 2.75 16.8 4446 -10.2 6.8 18.2 19.0 14.3 2.2 2.70 31 -91053000.RAP 2.75 10.9 2814 -15.7 8.1 14.5 28.4 13.0 1.3 2.00 159 -91060500.OVN 2.75 14.6 2813 -10.1 6.5 17.1 19.6 8.4 1.1 3.10 177 -91061500.BIS 2.75 13.0 2379 -11.9 6.6 22.5 25.2 13.2 1.3 2.60 152 -91061500.GRB 2.75 17.6 3430 -8.7 6.7 13.9 17.0 21.7 1.2 0.60 161 -91061900.LBF 2.75 13.0 3600 -12.0 8.6 15.2 20.9 13.5 1.7 2.60 219 -91062000.HON 2.75 13.9 2691 -10.5 7.0 22.1 20.0 16.1 1.4 1.20 282 -91070500.BIS 2.75 13.3 2941 -9.3 6.4 21.4 26.6 19.3 1.2 2.40 206 -91070500.GGW 2.75 11.4 2308 -9.9 7.0 17.5 23.9 6.7 0.8 2.20 144 -91072200.HON 2.75 19.3 4474 -6.8 7.2 17.3 24.1 11.1 1.7 -999.00 198 -92021500.UMN 2.75 10.2 1724 -16.9 6.4 33.2 28.2 24.2 1.5 2.20 289 -92030600.1M1 2.75 11.5 2572 -21.1 7.2 22.5 26.7 17.3 2.4 2.30 194 -92060500.AMA 2.75 13.4 2870 -9.4 7.5 17.5 25.9 12.2 1.1 2.60 249 -92061200.MAF 2.75 13.8 2387 -8.2 7.4 26.7 34.6 13.3 1.3 2.00 178 -92061300.AMA 2.75 14.7 2821 -8.8 7.2 19.1 36.4 12.0 1.2 2.70 165 -92061900.BIS 2.75 11.0 1791 -14.4 6.9 27.4 24.4 13.0 1.3 2.50 106 -92061900.DDC 2.75 12.8 2598 -8.3 7.9 25.1 40.5 15.7 1.3 2.70 114 -92062700.AMA 2.75 14.1 3165 -10.0 7.7 16.6 29.9 12.4 1.4 2.90 191 -92073000.LBF 2.75 15.0 3544 -10.3 7.9 25.7 33.8 22.0 2.6 3.00 335 -92101600.SEP 2.75 14.6 3654 -12.1 7.7 16.4 22.7 12.6 1.9 2.90 227 -93033100.1M1 2.75 11.9 2471 -15.1 7.2 30.2 27.1 17.8 2.3 2.80 54 -93033100.UMN 2.75 11.1 2598 -16.5 6.4 29.7 28.9 19.7 2.2 2.10 117 -93040200.WAL 2.75 10.9 1625 -18.5 7.3 30.7 48.4 26.8 1.7 2.40 200 -93042000.GGG 2.75 12.4 2342 -13.3 8.0 26.7 28.4 17.5 2.0 2.70 156 -93042500.UMN 2.75 11.4 2317 -14.6 6.9 25.2 33.1 18.2 1.6 2.40 198 -93042800.MAF 2.75 10.4 1494 -10.6 6.9 19.6 25.8 12.9 0.5 1.80 150 -93042900.MAF 2.75 11.7 2435 -10.9 7.1 29.3 37.4 20.8 1.5 2.20 551 -93050100.AMA 2.75 11.6 4085 -14.5 8.1 25.7 15.8 15.3 3.4 1.90 234 -93050600.AMA 2.75 13.2 4478 -13.6 8.6 34.6 38.4 16.6 5.7 2.00 340 -93051600.DDC 2.75 12.8 3614 -9.8 6.6 19.4 23.7 12.6 1.4 2.50 161 -93061900.AMA 2.75 12.8 2140 -7.8 7.0 22.7 23.3 14.4 0.8 1.90 146 -93062400.DEN 2.75 11.7 3442 -9.6 8.8 32.0 42.3 15.8 2.6 1.80 211 -93062400.LBF 2.75 16.0 3944 -8.6 8.1 21.9 33.8 18.1 2.3 2.80 178 -93070500.DDC 2.75 17.1 4186 -5.4 6.7 30.6 34.9 16.6 1.9 1.20 146 -93070700.AMA 2.75 17.0 5327 -4.7 7.8 21.3 20.0 11.4 1.7 3.80 127 -93070700.DDC 2.75 17.0 5334 -6.0 7.2 27.9 28.2 16.5 2.6 3.10 154 -93090400.IAD 2.75 15.6 2779 -5.9 5.7 15.2 15.6 12.4 0.5 0.60 149 -93101300.CRP 2.75 17.3 4367 -8.6 6.3 20.2 29.8 14.8 2.0 1.50 227 -93101900.GGG 2.75 15.7 3105 -9.8 6.9 23.5 33.9 10.3 1.9 0.70 105 -93102000.DRT 2.75 15.5 3433 -8.9 6.4 25.4 34.0 13.4 1.8 1.60 35 -94012700.GGG 2.75 13.2 2167 -15.9 6.8 31.0 32.3 17.5 2.3 0.70 306 -94041100.UMN 2.75 12.6 2040 -16.5 7.6 37.8 45.4 19.9 2.9 2.50 486 -94052500.OUN 2.75 15.0 3912 -11.5 7.4 22.0 36.2 13.2 2.6 3.00 122 -94053000.SEP 2.75 17.5 5032 -10.6 8.2 27.0 23.8 16.1 4.9 3.90 291 -94060500.HON 2.75 14.2 3871 -11.6 8.5 21.4 19.2 12.0 2.8 2.40 202 -94060600.TOP 2.75 16.5 3953 -9.3 8.1 16.1 27.7 15.4 1.9 2.50 394 -94061100.AMA 2.75 12.3 2164 -8.3 7.3 19.5 20.3 16.6 0.7 2.80 229 -94061200.AMA 2.75 14.7 4015 -8.0 7.8 26.7 19.9 18.4 2.3 2.70 302 -94061200.TOP 2.75 13.9 2320 -9.5 6.6 23.9 24.4 15.8 1.2 0.90 117 -94061800.AMA 2.75 11.9 2676 -7.0 8.2 11.0 11.3 10.7 0.5 1.60 171 -94061900.JAN 2.75 16.8 3177 -7.5 5.9 11.5 12.4 3.8 0.6 0.60 42 -94062500.HON 2.75 11.8 1962 -10.8 6.4 27.8 33.5 15.4 1.1 2.20 211 -94062600.JAN 2.75 16.1 2842 -9.5 6.4 24.0 32.8 12.4 1.6 0.90 130 -94070100.STC 2.75 14.3 3701 -11.6 7.3 27.2 25.1 19.0 2.9 2.70 399 -94070200.OAX 2.75 18.5 5257 -10.1 8.0 26.5 25.4 15.5 4.9 3.20 416 -94070700.HON 2.75 16.5 3051 -8.8 7.2 20.5 18.6 10.2 1.5 0.60 159 -95040900.TOP 2.75 10.7 2836 -17.5 9.2 21.4 31.9 16.5 2.5 1.90 120 -95042000.FTD 2.75 14.6 2621 -13.3 7.7 39.5 59.2 25.8 3.7 2.40 498 -95051400.UMN 2.75 16.5 5278 -10.3 6.9 28.0 26.2 22.3 4.1 3.20 211 -95052200.LBF 2.75 10.4 2027 -14.9 7.4 28.3 33.3 18.7 1.6 2.10 221 -95060300.AMA 2.75 12.4 3024 -9.6 8.2 22.4 37.2 15.7 1.6 2.00 346 -95062100.OKX 2.75 17.1 3918 -9.8 7.1 18.4 25.8 11.4 2.1 1.00 18 -95062800.LBF 2.75 12.4 2880 -10.1 7.7 22.0 19.7 13.9 1.5 2.50 208 -95070300.AMA 2.75 14.7 3838 -11.5 8.8 22.8 29.0 8.2 3.1 2.50 115 -95070300.DDC 2.75 14.2 2905 -9.6 6.8 18.2 21.4 12.3 1.2 2.30 111 -95071200.OKX 2.75 13.9 2900 -15.6 6.9 12.7 13.6 8.1 1.3 2.40 48 -95071500.GRB 2.75 19.0 5409 -8.5 8.1 12.1 9.0 8.0 2.0 3.00 69 -95072400.AMA 2.75 13.3 2225 -7.8 8.5 21.6 25.1 13.1 1.0 2.90 124 -95081800.BIS 2.75 18.4 5585 -7.0 7.7 10.6 17.3 10.6 1.4 3.30 142 -96031600.FFC 2.75 9.6 890 -19.2 7.8 28.8 55.2 20.5 0.9 2.20 353 -96042200.OUN 2.75 12.7 2260 -10.9 5.9 38.3 48.8 18.5 1.7 2.30 500 -96042200.TOP 2.75 10.9 1574 -16.6 7.3 45.6 54.3 14.6 2.2 2.30 145 -96051700.UNR 2.75 14.8 4365 -8.1 8.0 25.5 28.7 15.0 2.5 2.50 219 -96051800.OAX 2.75 15.3 4523 -11.1 8.8 16.0 21.2 12.9 2.6 -999.00 68 -96052500.AMA 2.75 13.5 3927 -11.3 9.1 20.3 4.9 16.4 2.6 1.90 101 -96052600.MAF 2.75 14.1 3464 -6.2 7.7 28.7 42.1 22.5 1.6 2.90 240 -96053000.MAF 2.75 14.9 3675 -7.0 7.7 35.1 40.6 19.0 2.4 2.50 321 -96060100.ABR 2.75 12.6 2276 -13.4 6.2 22.4 27.2 24.6 1.3 2.20 370 -96060200.JAN 2.75 16.1 1863 -7.5 5.5 12.7 20.3 11.3 0.4 0.60 168 -96060300.SGF 2.75 11.7 2739 -15.9 7.1 26.4 35.9 14.8 2.3 2.10 90 -96061200.AMA 2.75 11.9 3079 -8.8 8.0 24.3 30.2 18.3 1.5 1.90 373 -96061300.FFC 2.75 13.7 2727 -9.1 5.7 12.9 13.1 12.9 0.6 1.00 152 -96061400.LBF 2.75 12.4 2384 -8.6 6.5 15.4 25.0 12.0 0.6 2.20 102 -96062500.AMA 2.75 13.9 3778 -9.4 8.5 22.9 28.2 7.0 2.3 1.90 123 -96072400.DDC 2.75 14.3 3068 -11.1 8.6 27.6 36.6 16.8 2.8 2.70 203 -96080100.DEN 2.75 13.5 3920 -7.8 8.5 22.6 26.3 15.0 1.9 2.10 276 -96083000.DEN 2.75 11.7 2478 -9.1 7.8 26.2 28.9 17.6 1.3 2.30 86 -96092100.FTD 2.75 16.4 2870 -9.4 6.5 26.4 32.6 15.7 1.8 -999.00 136 -97012500.SIL 2.75 13.0 2563 -16.5 7.5 18.3 25.8 18.3 1.8 2.80 145 -97032900.BNA 2.75 11.1 1618 -15.6 7.4 25.2 15.3 18.1 1.3 3.00 389 -97041100.MAF 2.75 11.9 4076 -15.0 8.2 23.7 30.7 20.8 3.3 2.10 260 -97042100.SGF 2.75 9.4 1773 -16.5 7.4 25.4 23.9 23.3 1.2 2.00 405 -97052700.OUN 2.75 18.0 5907 -8.7 6.4 17.5 23.9 17.6 2.5 3.70 271 -97052700.SGF 2.75 16.3 4440 -9.9 7.0 22.6 25.0 16.3 2.7 2.60 276 -97061200.TOP 2.75 12.6 1552 -11.7 7.1 23.5 30.2 11.6 0.9 0.90 141 -97061600.DDC 2.75 13.5 3187 -10.9 7.7 23.3 39.3 11.9 2.0 2.70 26 -98040900.BMX 2.75 15.8 3341 -13.9 7.9 40.1 51.5 25.9 5.5 2.00 296 -98052500.DDC 2.75 12.5 2688 -12.1 7.2 27.9 32.0 13.7 1.9 2.70 180 -98061400.OUN 2.75 20.5 6689 -6.5 7.7 32.8 42.7 17.9 5.4 4.00 262 -99060300.AMA 2.75 15.6 5087 -10.3 8.7 18.6 49.2 15.5 3.1 2.50 289 -99061200.AMA 2.75 14.7 4400 -10.3 7.7 26.2 36.6 18.8 3.2 2.40 210 -99061900.DDC 2.75 13.9 4141 -11.3 7.3 22.5 29.0 13.4 2.5 2.40 346 -99070100.MAF 2.75 13.7 3989 -2.5 7.5 14.9 13.7 10.5 0.4 2.00 146 -99081800.LBF 2.75 18.3 5554 -8.9 7.8 23.7 25.1 10.7 3.9 3.40 143 -00021400.LZK 2.50 10.7 2091 -20.3 6.4 21.1 24.5 22.2 1.5 2.10 245 -00032700.SGF 2.50 9.8 1766 -18.3 7.5 34.3 43.9 21.4 1.9 2.20 350 -00050100.FWD 2.50 14.3 3593 -13.1 7.2 17.3 18.5 19.0 2.0 1.70 401 -00051200.DVN 2.50 15.6 4865 -8.1 7.4 24.8 24.9 19.3 2.7 3.40 225 -00052300.MHX 2.50 15.1 3613 -13.5 6.5 15.3 26.5 10.5 1.7 2.40 79 -00061000.RAP 2.50 13.2 3610 -8.1 7.8 14.3 21.1 11.9 1.0 2.10 70 -00062400.OAX 2.50 17.5 4783 -8.7 7.2 18.7 28.2 14.9 2.3 2.30 195 -00070200.ABR 2.50 17.8 5952 -10.3 8.4 12.2 23.4 8.1 2.7 3.90 147 -00070600.LBF 2.50 18.2 5506 -7.1 8.3 25.3 35.5 11.8 3.5 3.50 155 -00080500.BIS 2.50 17.0 4830 -8.7 6.9 17.2 22.9 4.0 2.0 3.30 86 -00091100.MPX 2.50 16.6 4554 -10.3 7.0 22.0 24.0 18.4 2.9 3.20 271 -01041700.MAF 2.50 13.9 4552 -12.1 7.5 16.2 30.6 8.0 2.2 2.20 100 -01042200.DDC 2.50 13.3 3749 -12.1 7.3 33.4 45.3 24.2 3.5 2.70 510 -01050100.OAX 2.50 10.4 2265 -16.9 7.7 17.4 17.0 19.2 1.3 2.20 226 -01050400.MAF 2.50 13.7 3866 -11.3 7.2 12.8 33.8 11.4 1.3 2.70 101 -01052500.BMX 2.50 11.9 2388 -14.9 6.7 29.2 27.4 23.5 2.0 2.70 436 -01052620.LMN 2.50 14.1 4355 -13.5 6.4 27.3 33.2 20.2 3.5 2.90 233 -01070400.RAP 2.50 13.2 3145 -11.1 8.3 25.2 26.1 12.9 2.3 2.60 144 -01070500.LBF 2.50 14.5 3571 -7.7 7.7 26.0 27.0 17.1 1.9 2.90 313 -01082400.AMA 2.50 15.4 4318 -6.7 7.4 24.0 28.1 21.0 1.9 2.80 158 -01101000.DDC 2.50 12.9 3299 -9.7 6.4 18.8 18.3 16.4 1.2 2.50 275 -02040300.JAX 2.50 14.8 3327 -14.3 7.2 11.5 30.9 11.8 1.4 1.50 80 -02041212.AMA 2.50 12.2 2907 -13.7 7.5 20.4 25.1 14.6 1.8 2.80 184 -02041900.DVN 2.50 12.3 2861 -14.5 8.2 14.1 20.0 15.9 1.4 2.50 213 -02051700.AMA 2.50 13.8 5036 -12.7 8.7 21.9 26.5 17.4 4.0 2.20 216 -02072500.ABR 2.50 15.0 3995 -11.5 7.9 28.3 28.6 13.8 3.7 3.00 207 -03051500.SHV 2.50 16.8 4260 -9.9 6.8 33.7 42.9 16.3 3.9 0.80 246 -03062200.RAP 2.50 10.6 3380 -13.7 8.0 27.5 42.2 18.7 2.6 1.50 189 -04032718.OUN 2.50 12.6 2825 -14.9 7.3 21.1 32.3 11.5 2.0 2.10 199 -04040400.EPZ 2.50 12.1 4482 -17.9 8.2 29.1 25.4 11.6 5.5 2.10 203 -04080700.ABR 2.50 13.1 2792 -9.3 6.7 21.0 25.9 12.1 1.1 2.50 240 -04091500.LBF 2.50 12.8 1474 -10.7 8.0 35.4 39.8 20.5 1.4 -999.00 306 -04102400.JAN 2.50 15.8 1938 -6.9 5.3 30.8 27.8 19.3 0.8 0.60 328 -05050322.XMR 2.50 13.4 2165 -13.9 7.6 23.3 41.5 21.5 1.7 1.20 82 -05050700.MAF 2.50 10.7 3257 -12.3 8.0 20.3 24.6 11.2 1.7 1.60 48 -06050900.JAN 2.50 16.1 3303 -13.3 7.3 28.4 39.9 14.9 3.5 1.90 170 -06052600.SGF 2.50 13.9 3409 -9.5 6.5 18.9 23.2 18.8 1.3 2.50 262 -06061400.RAP 2.50 11.5 2691 -7.7 8.3 17.3 24.5 15.3 0.8 1.60 248 -06062500.DNR 2.50 7.1 987 -11.5 8.9 26.1 26.5 12.5 0.4 0.90 -172 -06071123.LMN 2.50 16.5 2996 -5.9 6.7 12.6 11.2 9.4 0.6 0.60 110 -08110600.OUN 2.50 11.4 1623 -12.5 6.9 29.8 32.7 24.8 1.1 2.40 317 -90060300.PAH 2.50 17.8 3663 -7.6 7.0 24.0 25.9 29.8 2.0 0.60 367 -90060700.DEN 2.50 10.9 2393 -8.2 9.0 26.3 23.9 19.6 1.2 1.60 170 -90061500.DDC 2.50 16.0 4667 -6.5 7.9 28.4 30.1 15.7 2.6 2.70 306 -90062200.ALB 2.50 12.6 1833 -14.1 6.7 32.5 29.1 20.6 1.7 1.60 203 -90070200.GSO 2.50 14.8 3963 -10.0 7.2 26.0 16.3 10.7 2.6 2.20 100 -90083100.CHS 2.50 16.0 2477 -8.5 6.5 17.0 17.7 8.3 0.9 0.60 67 -91041900.SEP 2.50 17.6 5996 -13.2 7.4 13.5 44.8 13.0 3.3 3.10 24 -91042100.AYS 2.50 11.8 2563 -16.9 7.4 13.4 30.0 10.3 1.2 1.70 76 -91050800.MAF 2.50 11.2 3415 -14.8 8.4 31.1 36.7 25.4 3.5 1.60 280 -91051200.AMA 2.50 14.3 4539 -10.8 8.5 12.4 14.9 16.7 1.7 2.30 208 -91052700.LBF 2.50 11.9 2669 -13.4 7.9 13.9 32.3 13.0 1.1 2.10 35 -91053100.DEN 2.50 12.0 3551 -12.1 9.5 27.3 45.8 10.7 3.2 1.90 149 -91071800.STC 2.50 18.2 4956 -8.7 7.3 18.7 20.1 21.9 2.5 2.50 104 -91080200.CAR 2.50 12.3 1891 -13.7 6.3 19.6 33.3 11.9 0.9 1.50 223 -92030400.SEP 2.50 12.7 2676 -15.3 7.7 20.1 27.2 9.2 1.9 2.30 133 -92041600.AMA 2.50 11.1 3362 -13.4 7.6 16.0 17.8 12.0 1.5 1.70 127 -92070200.DEN 2.50 11.7 2313 -11.2 8.0 27.6 29.9 20.0 1.6 2.50 362 -93033000.DRT 2.50 12.7 2680 -13.4 8.2 39.6 44.0 26.0 3.5 2.80 411 -93061400.TOP 2.50 16.5 4195 -8.5 7.7 12.5 17.8 10.7 1.3 2.80 65 -93070200.HON 2.50 14.6 2619 -11.3 7.0 28.3 40.3 12.6 2.0 0.80 143 -93070300.TOP 2.50 18.5 4019 -7.2 7.1 15.8 16.4 15.2 1.4 0.70 202 -94032800.AHN 2.50 14.4 2627 -10.5 6.2 34.5 24.7 30.4 2.0 0.70 518 -94062600.TOP 2.50 16.4 4265 -8.6 8.4 25.2 45.9 21.6 3.0 2.90 418 -95050800.FTD 2.50 16.5 2700 -10.4 7.7 30.8 30.8 24.5 2.6 0.80 407 -95050800.LCH 2.50 17.9 3259 -9.9 7.1 16.7 31.1 10.2 1.6 0.60 119 -95050900.TOP 2.50 10.0 1495 -19.3 6.9 19.3 22.8 21.2 0.9 1.20 126 -95051600.MAF 2.50 13.6 3261 -7.8 8.4 21.7 28.8 10.3 1.5 1.80 134 -95051900.GSO 2.50 13.4 1758 -11.8 7.9 25.3 27.1 23.6 1.3 -999.00 83 -95052912.MAF 2.50 13.0 1617 -11.3 7.5 27.6 22.0 13.7 1.2 1.90 284 -95060700.DEN 2.50 12.3 3137 -10.8 9.2 37.2 35.9 20.7 3.4 2.00 284 -95061600.TFX 2.50 13.0 3142 -12.0 8.4 27.7 35.6 23.8 2.7 2.30 277 -95081212.MPX 2.50 19.1 3361 -6.3 7.2 20.6 36.8 23.0 1.4 -999.00 164 -96030700.TLH 2.50 15.4 2615 -10.4 6.0 20.9 23.7 20.7 1.2 0.60 320 -96042200.FTD 2.50 12.0 1872 -12.6 8.2 27.1 34.0 18.3 1.5 -999.00 298 -96051800.MPX 2.50 16.3 4406 -8.9 8.2 13.0 23.4 20.7 1.6 3.40 259 -96060100.DDC 2.50 13.3 2888 -10.9 8.3 13.3 19.3 13.9 1.1 2.50 111 -96060300.AMA 2.50 11.0 2356 -10.5 6.9 27.6 31.6 18.0 1.2 2.00 256 -96061200.LBF 2.50 11.7 2310 -9.9 7.5 16.7 22.2 12.7 0.8 2.40 122 -96062100.DEN 2.50 15.2 5603 -8.1 9.6 27.5 33.4 8.8 4.4 2.20 155 -96071900.GRB 2.50 20.7 4746 -7.5 6.4 26.3 26.2 20.0 3.0 0.70 164 -96072200.LBF 2.50 18.4 4756 -6.5 7.2 20.0 29.4 19.0 1.9 2.10 94 -98071100.DDC 2.50 18.9 4323 -4.3 6.2 12.7 15.2 16.0 0.7 0.60 230 -00061300.OAX 2.25 17.7 5453 -11.5 8.5 15.8 19.3 12.9 3.5 4.00 206 -00030300.FWD 2.00 12.3 2589 -14.3 6.2 33.4 29.1 20.2 2.2 2.70 239 -00031600.LMN 2.00 9.5 1478 -17.3 7.1 22.1 10.9 12.9 0.9 2.20 164 -00032800.JAX 2.00 12.5 2135 -14.5 6.3 29.1 24.7 25.7 1.7 0.90 268 -00061200.AMA 2.00 16.8 5720 -10.3 8.3 16.1 28.7 15.7 3.2 2.70 88 -00061300.LBF 2.00 13.9 4790 -9.9 8.3 16.6 18.6 9.9 2.1 2.00 159 -00061500.JAX 2.00 17.9 4801 -8.7 6.4 6.2 13.3 3.6 0.7 1.10 55 -00071100.GGW 2.00 14.2 3230 -11.3 6.9 30.1 48.1 16.9 2.6 3.00 88 -00071500.BIS 2.00 16.5 5132 -9.5 8.1 27.6 34.1 14.6 4.3 2.70 152 -00072300.LBF 2.00 13.2 2926 -11.5 7.1 25.2 27.3 13.6 1.9 2.80 91 -01042200.AMA 2.00 14.1 6059 -15.3 9.2 35.7 38.3 16.6 10.2 3.30 320 -01042200.MAF 2.00 13.7 4543 -12.3 8.4 27.4 36.2 12.3 4.2 2.20 164 -01050600.FWD 2.00 15.4 3092 -12.7 6.8 32.7 34.4 19.4 3.2 2.10 170 -01050700.SGF 2.00 14.5 4025 -13.7 6.1 8.8 17.0 10.5 1.0 3.10 202 -01050702.LZK 2.00 14.2 2759 -12.9 5.9 18.7 26.3 7.3 1.3 2.00 77 -01051200.OUN 2.00 13.2 3098 -13.9 7.1 10.0 10.8 8.7 1.0 2.10 132 -01052700.DDC 2.00 11.3 2853 -12.1 6.7 30.6 37.1 19.3 1.9 1.80 184 -01052800.OUN 2.00 16.5 4910 -10.7 7.6 29.7 38.8 16.9 4.7 3.10 113 -01053000.DDC 2.00 15.2 2892 -12.1 8.0 19.5 26.6 14.8 2.0 1.80 388 -01053100.FWD 2.00 15.8 4571 -12.3 8.7 12.4 20.6 13.7 2.3 3.90 106 -01053100.LCH 2.00 17.4 3988 -8.3 7.0 8.3 13.9 0.8 0.8 2.40 8 -01062100.DNR 2.00 10.8 2544 -11.5 7.5 21.4 23.2 20.5 1.2 2.10 192 -01063000.FWD 2.00 16.8 4122 -9.7 6.9 11.2 19.2 9.2 1.2 1.60 133 -01071300.GGW 2.00 14.5 3042 -10.1 8.1 16.5 34.2 7.9 1.4 3.50 19 -01072000.RAP 2.00 15.1 4486 -8.7 8.4 15.4 26.3 10.9 1.8 2.40 71 -01082300.TOP 2.00 16.7 4361 -9.7 7.6 9.9 23.0 13.6 1.3 2.30 192 -01082400.DDC 2.00 16.4 4283 -7.5 7.7 14.7 16.3 11.9 1.4 3.10 77 -01090800.OUN 2.00 17.6 4351 -8.7 7.8 26.1 21.2 21.8 3.3 2.30 151 -01090800.TOP 2.00 17.8 4174 -11.3 8.1 26.2 26.7 24.5 4.2 1.70 274 -01101000.OUN 2.00 15.6 3485 -12.9 7.9 24.4 28.2 23.9 3.2 2.50 447 -02041800.OAX 2.00 11.4 2113 -14.5 7.6 33.9 35.5 24.0 2.1 2.20 376 -02052800.LZK 2.00 15.1 3284 -12.3 6.5 4.4 12.3 2.6 0.4 0.60 13 -02061300.DVN 2.00 17.3 3501 -11.9 7.4 26.3 38.7 10.0 3.3 1.10 100 -02062600.MPX 2.00 19.6 6228 -9.7 7.1 18.6 21.8 9.2 3.7 3.20 120 -03051900.TBW 2.00 17.1 3797 -10.9 6.8 5.9 5.0 4.0 0.7 1.00 -4 -04043000.JAN 2.00 13.6 1469 -12.7 6.5 27.4 22.8 18.1 1.1 0.60 184 -04052200.DDC 2.00 13.5 3809 -9.7 8.1 21.0 27.0 20.3 2.0 2.20 297 -04062400.GRB 2.00 10.4 1604 -16.9 6.3 25.3 36.9 16.4 1.1 2.40 128 -04072300.TOP 2.00 16.0 3276 -7.7 6.4 15.8 19.6 11.4 1.0 0.70 158 -04082400.BIS 2.00 13.4 2596 -11.1 7.6 21.3 22.3 16.4 1.5 2.20 208 -04091200.GRB 2.00 12.3 2256 -14.9 7.2 14.7 24.8 11.6 1.0 1.00 64 -05022100.SGF 2.00 9.1 1128 -18.9 6.8 27.7 36.6 17.1 0.9 1.90 97 -05050700.LBF 2.00 9.7 3058 -14.3 8.2 12.5 21.7 6.1 1.0 1.40 135 -05050900.LMN 2.00 12.0 2971 -16.1 7.8 15.1 29.6 15.9 1.6 2.20 290 -06040700.TOP 2.00 11.0 2249 -15.1 7.4 35.7 27.3 15.8 2.3 2.10 206 -06041600.TOP 2.00 12.2 2191 -12.9 8.2 37.2 42.6 28.5 2.5 2.90 533 -06050800.DDC 2.00 9.5 1674 -17.1 8.9 16.8 27.8 16.1 1.0 2.60 248 -06051600.MFL 2.00 15.8 2473 -11.1 6.8 26.6 21.2 18.7 1.9 0.60 227 -06052400.DDC 2.00 10.2 1607 -8.7 7.6 22.4 19.3 17.0 0.6 1.80 189 -06061400.TFX 2.00 12.3 2827 -9.7 8.1 15.9 28.9 14.3 1.0 2.10 65 -06062700.ILX 2.00 12.2 2025 -15.7 6.4 3.5 11.7 5.2 0.2 1.20 15 -06090100.DDC 2.00 12.2 1972 -7.7 7.1 15.6 27.4 13.9 0.5 1.60 363 -89052800.ELP 2.00 11.2 2569 -6.8 8.0 11.3 17.1 14.9 0.4 1.40 232 -89071100.HON 2.00 15.7 3126 -7.0 6.9 14.6 18.6 12.3 0.8 1.20 151 -89082100.LBF 2.00 14.8 3307 -9.1 7.1 28.0 44.7 8.0 2.1 3.00 83 -89103000.OUN 2.00 12.5 2163 -14.7 6.6 18.0 18.1 13.1 1.1 1.60 195 -90060900.PIT 2.00 16.7 4095 -9.5 6.7 18.1 13.6 18.8 1.9 1.00 236 -90061400.PIA 2.00 18.1 3570 -7.0 7.0 16.5 23.4 9.5 1.2 0.60 134 -90072600.TBW 2.00 18.4 4330 -6.3 5.7 3.5 8.5 6.3 0.2 0.60 7 -90091400.STC 2.00 13.1 2123 -10.9 7.4 27.8 39.0 23.2 1.5 -999.00 564 -98033100.FWD 2.00 13.3 2873 -14.3 7.2 29.6 57.5 17.6 2.7 2.90 93 -98062500.APX 2.00 15.8 3453 -11.3 7.3 28.9 35.4 21.9 3.1 3.30 348 -98063000.BUF 2.00 14.5 2615 -10.5 6.1 23.6 28.2 8.5 1.4 1.70 86 -99050400.DRT 2.00 17.4 5609 -10.1 7.5 40.5 38.9 21.2 7.1 4.56 342 -99053100.TOP 2.00 13.1 2215 -10.9 6.8 18.6 12.2 14.7 1.0 1.40 189 -00033000.SHV 1.75 15.4 3548 -15.9 7.6 31.6 50.3 23.8 5.0 2.80 323 -00051200.TOP 1.75 16.7 5329 -7.3 6.5 25.1 29.2 21.0 2.5 3.70 216 -00051900.FWD 1.75 16.2 3610 -10.9 7.4 25.2 32.9 6.7 2.8 0.64 75 -00052900.GSO 1.75 14.3 1988 -11.1 6.2 28.7 35.1 17.6 1.3 1.20 139 -00060300.ABQ 1.75 9.4 1267 -8.7 8.2 10.3 17.5 7.6 0.2 1.40 70 -00061100.AMA 1.75 14.0 3932 -7.9 7.8 14.8 19.1 9.4 1.2 2.10 128 -00062200.DDC 1.75 14.3 3602 -8.7 7.0 15.4 23.4 16.2 1.2 2.90 157 -00062400.DDC 1.75 14.8 3499 -7.3 7.7 23.2 30.2 12.0 1.6 2.70 237 -00062400.LBF 1.75 14.8 4723 -9.7 8.6 17.4 29.6 9.8 2.4 2.00 126 -00070600.GGW 1.75 11.7 2743 -14.1 8.5 29.6 40.4 13.0 2.7 1.90 165 -00071300.ABR 1.75 13.6 2305 -8.7 6.7 29.3 44.3 21.7 1.3 2.00 278 -00071500.IAD 1.75 13.9 2186 -12.3 6.8 17.8 17.7 9.3 1.1 2.00 118 -00071800.AMA 1.75 14.4 3660 -4.7 6.9 9.1 7.7 5.9 0.4 1.50 79 -00072100.FFC 1.75 14.3 2149 -6.9 6.4 9.2 10.4 9.1 0.3 0.60 63 -00072200.LBF 1.75 12.8 3031 -11.5 7.6 27.5 23.7 14.5 2.2 2.60 247 -00072500.ABR 1.75 15.6 4195 -12.3 8.9 15.3 19.8 10.9 2.6 3.10 113 -00072600.MFL 1.75 18.3 4079 -8.5 6.6 5.2 5.6 2.4 0.5 0.60 18 -00072600.MPX 1.75 15.3 3240 -13.1 7.6 21.4 12.4 10.1 2.5 3.00 139 -00072700.LBF 1.75 18.1 5178 -8.9 8.7 17.5 26.1 12.2 3.0 2.20 351 -00072900.GSO 1.75 14.3 2081 -9.7 6.2 6.2 16.1 6.5 0.3 0.60 43 -00073100.JAX 1.75 17.6 3581 -8.9 6.0 6.6 5.5 4.7 0.5 0.60 27 -00080200.GGW 1.75 10.8 2057 -8.9 8.0 24.6 35.3 15.0 0.9 1.80 148 -00080800.OAX 1.75 16.3 4679 -8.1 7.8 16.4 25.1 10.8 1.9 3.00 185 -00090400.LBF 1.75 11.2 2441 -9.5 7.8 21.4 24.1 18.5 1.0 1.50 309 -01061800.TBW 1.75 15.9 3469 -9.7 5.9 4.6 6.6 1.5 0.3 0.80 23 -01062000.DTX 1.75 14.9 3813 -12.5 6.9 8.4 17.6 15.0 1.0 2.80 -45 -02041600.PIT 1.75 11.5 1856 -14.9 7.3 17.9 18.1 15.8 1.0 1.60 245 -02041800.FWD 1.75 15.9 3343 -9.9 6.4 12.4 34.6 5.6 1.0 -999.00 61 -02050400.CHS 1.75 15.9 3255 -10.7 6.6 21.1 29.5 16.6 1.8 0.90 19 -02052800.LBF 1.75 11.3 3387 -15.1 9.0 18.8 30.1 11.6 2.3 1.90 184 -02052800.MAF 1.75 12.7 3115 -11.1 8.0 20.6 24.7 16.4 1.7 2.10 103 -02052900.TOP 1.75 12.8 2661 -13.7 6.8 4.2 10.7 7.3 0.3 1.30 48 -02060402.CHS 1.75 13.7 2637 -10.1 7.6 9.7 10.8 11.7 0.6 0.80 33 -02060700.MPX 1.75 9.2 1952 -15.1 7.7 22.8 25.3 16.2 1.1 1.50 758 -02061200.TOP 1.75 19.6 5029 -8.9 7.6 21.1 24.7 15.6 3.3 0.70 224 -02062600.DTX 1.75 14.5 3079 -8.9 6.1 1.9 7.2 1.4 0.1 0.70 -1 -02070200.AMA 1.75 12.2 2393 -6.5 7.3 18.4 11.3 20.8 0.6 1.60 353 -02072518.TBW 1.75 18.9 4523 -8.5 6.7 7.8 6.3 2.0 0.9 0.60 7 -02072800.DDC 1.75 12.9 2480 -5.3 7.4 10.6 11.1 10.7 0.3 1.40 155 -02082300.LBF 1.75 17.8 6193 -10.1 8.0 12.9 28.1 3.8 2.7 3.10 10 -03031500.BMX 1.75 10.9 1555 -19.1 7.4 8.5 21.2 12.3 0.5 1.30 94 -03032600.LZK 1.75 11.3 2073 -18.5 6.7 14.3 15.4 9.5 1.0 2.20 67 -03032600.SHV 1.75 11.3 1723 -18.3 8.5 17.7 18.0 8.0 1.3 1.40 108 -03042900.AMA 1.75 9.6 2549 -14.5 8.3 25.3 33.7 16.5 1.8 1.60 237 -03042900.MAF 1.75 9.8 2325 -13.5 8.4 23.4 21.0 15.5 1.4 1.40 165 -03043000.BNA 1.75 12.4 3359 -15.3 7.2 4.3 5.5 4.1 0.5 1.30 30 -03050200.FFC 1.75 13.7 3289 -13.5 6.5 9.8 9.5 7.5 0.9 0.90 55 -03050700.BMX 1.75 17.4 4489 -10.5 7.0 26.5 28.4 12.2 3.6 2.10 101 -03051312.FWD 1.75 12.6 1814 -10.3 7.3 17.7 24.7 16.8 0.7 1.20 205 -03060400.LCH 1.75 19.7 4988 -6.7 5.8 13.3 17.2 7.3 1.2 0.60 44 -03061100.OUN 1.75 14.5 3045 -9.3 7.2 17.8 13.1 12.1 1.3 2.00 135 -03061300.LBF 1.75 12.0 2759 -11.3 7.2 15.4 16.3 13.0 1.0 2.60 179 -03061500.FWD 1.75 14.3 2433 -11.3 6.9 12.1 2.8 5.3 0.8 1.70 32 -03061500.LBF 1.75 10.7 1717 -11.3 6.3 10.6 12.0 6.6 0.3 1.70 51 -03061700.FFC 1.75 16.3 2826 -8.5 6.2 7.0 13.0 5.5 0.4 0.60 32 -03061700.RAP 1.75 10.1 1501 -11.1 7.1 5.7 17.5 2.9 0.2 1.90 92 -03062100.MAF 1.75 10.7 1489 -7.7 7.0 14.5 29.4 6.5 0.3 1.90 74 -03062500.MAF 1.75 16.5 4621 -6.7 7.7 8.7 16.8 11.9 0.8 2.10 45 -03090500.DRA 1.75 11.3 1966 -8.3 8.1 3.7 9.2 5.0 0.1 1.20 33 -03091000.MAF 1.75 12.9 3038 -7.3 7.4 8.3 12.7 8.6 0.4 2.10 79 -03091100.DDC 1.75 14.8 3112 -7.5 6.9 22.3 30.8 15.7 1.3 2.20 259 -03092100.DDC 1.75 10.2 1784 -10.9 7.3 20.1 23.8 21.8 0.7 2.00 257 -04022512.LIX 1.75 10.3 837 -17.7 6.7 31.9 48.7 25.2 0.8 2.40 340 -04030100.TOP 1.75 6.3 487 -28.7 8.7 32.0 35.0 20.1 0.6 1.60 171 -04032100.FFC 1.75 7.9 942 -17.3 7.5 12.0 13.4 11.3 0.3 1.10 154 -04032100.MAF 1.75 10.0 2053 -12.9 7.9 9.6 21.3 5.5 0.5 1.50 39 -04040700.FWD 1.75 10.4 835 -16.3 6.7 28.3 27.2 11.8 0.6 1.00 87 -04042900.DRT 1.75 12.4 1834 -12.9 6.4 20.0 31.6 16.1 0.9 1.30 217 -04051000.LBF 1.75 11.6 4026 -13.9 9.0 13.9 17.5 3.0 1.9 1.60 38 -04051600.EPZ 1.75 10.4 2888 -11.5 8.7 12.2 7.0 4.1 0.9 1.60 93 -04071200.TOP 1.75 17.7 3709 -7.3 6.8 13.6 9.1 11.9 1.1 0.60 204 -04081900.ILX 1.75 15.1 3685 -9.1 5.9 19.9 28.2 19.7 1.4 1.30 371 -04082600.BIS 1.75 12.5 3083 -13.1 7.1 16.6 18.9 13.9 1.4 2.40 101 -04092300.AMA 1.75 12.8 1887 -10.1 6.7 23.5 21.8 19.6 0.9 1.30 374 -04092500.AMA 1.75 11.2 2465 -11.9 6.9 15.1 24.9 12.0 0.8 2.00 38 -05030400.AMA 1.75 4.3 697 -23.3 8.7 22.7 36.0 13.1 0.3 1.30 142 -05031500.TLH 1.75 12.4 1338 -14.1 7.1 28.4 53.2 12.7 1.1 1.10 41 -05082400.RAP 1.75 11.3 2040 -11.3 8.6 11.6 19.1 13.6 0.6 -999.00 116 -05082700.AMA 1.75 13.6 2765 -5.5 7.4 11.5 11.5 10.0 0.4 2.00 31 -06040400.CHS 1.75 11.6 2165 -16.9 8.1 31.6 39.3 26.6 2.6 2.60 207 -06040900.JAX 1.75 13.6 2254 -13.7 6.6 20.4 22.0 19.5 1.3 2.10 178 -06041300.LZK 1.75 11.0 1294 -13.5 7.2 12.6 20.8 6.0 0.4 -999.00 34 -06041600.IAD 1.75 10.2 2181 -16.7 7.0 27.7 43.3 16.6 1.7 1.80 48 -06041600.WAL 1.75 10.9 2234 -16.5 7.2 17.7 48.2 17.2 1.2 2.30 81 -06041900.BMX 1.75 12.0 1805 -11.1 6.3 14.2 22.0 5.4 0.5 0.70 62 -06042300.DTX 1.75 6.7 609 -24.1 7.4 17.7 27.4 14.0 0.3 1.80 50 -06050400.SHV 1.75 15.0 3310 -12.1 6.7 8.0 14.3 5.8 0.8 0.60 85 -06050600.LCH 1.75 14.9 2655 -10.3 5.8 23.1 25.2 15.8 1.3 0.60 64 -06050900.DDC 1.75 9.6 1630 -13.3 7.9 27.2 27.8 15.1 1.1 2.00 179 -06050912.SGF 1.75 12.9 2144 -12.9 6.7 20.3 18.4 10.1 1.2 1.80 144 -06051100.LCH 1.75 18.5 4564 -12.3 8.9 22.9 22.0 12.2 5.1 1.70 38 -06051412.SHV 1.75 12.4 2270 -14.9 7.8 16.8 26.2 15.5 1.3 2.80 84 -06051800.ILX 1.75 8.0 713 -17.5 6.9 28.8 29.6 16.9 0.5 2.10 226 -06052300.SGF 1.75 14.4 3032 -11.9 7.1 9.0 15.5 8.3 0.8 1.60 91 -06052500.TLH 1.75 14.8 2619 -10.5 6.4 7.3 7.5 9.2 0.5 0.60 56 -06052700.GSO 1.75 12.7 2136 -9.9 5.8 17.4 21.2 17.1 0.6 1.50 217 -06061800.FWD 1.75 14.3 2286 -10.9 8.2 13.9 24.6 11.6 1.0 2.30 134 -06062100.CHS 1.75 17.0 4007 -10.1 6.4 12.9 19.3 7.1 1.3 0.70 66 -06062400.BIS 1.75 8.3 942 -15.3 7.0 22.7 27.2 16.7 0.5 1.60 167 -06062400.LBF 1.75 10.7 1400 -12.1 7.4 26.6 25.0 13.6 0.8 2.10 272 -06062900.DDC 1.75 7.7 919 -10.1 7.7 17.9 17.9 1.9 0.2 0.80 16 -06070100.BNA 1.75 13.5 2750 -11.5 6.7 10.8 7.8 11.5 0.7 1.50 41 -06071200.DDC 1.75 11.8 1068 -8.7 8.0 15.4 21.8 11.8 0.3 1.00 12 -06071300.DDC 1.75 12.8 1575 -5.9 6.9 12.7 13.7 7.4 0.2 0.80 99 -06071900.JAN 1.75 15.2 2280 -6.9 6.5 11.1 11.1 9.0 0.4 0.60 88 -06072200.LZK 1.75 14.1 2480 -8.1 7.3 6.9 5.8 7.7 0.3 0.60 67 -06072600.TUS 1.75 11.2 1725 -5.7 7.4 15.0 18.3 8.5 0.3 0.90 36 -06080700.TOP 1.75 12.5 1693 -6.7 7.0 7.6 6.8 3.2 0.2 0.60 35 -06080900.TUS 1.75 11.9 1640 -4.7 6.6 5.1 8.2 6.6 0.1 0.60 25 -06082100.ABR 1.75 12.5 1851 -9.9 6.8 21.9 39.5 15.5 0.8 2.10 257 -06082300.RAP 1.75 8.3 1757 -9.5 9.1 21.3 28.7 12.7 0.6 0.80 108 -06091100.AMA 1.75 12.5 1812 -8.9 7.1 14.9 33.3 13.7 0.5 2.10 51 -06091400.EPZ 1.75 11.7 1589 -10.3 7.6 17.4 23.7 13.1 0.6 2.00 167 -06091600.DDC 1.75 14.4 2738 -6.9 6.6 29.7 39.0 21.6 1.3 2.20 378 -06100400.MPX 1.75 13.7 3011 -12.1 7.4 34.0 30.2 23.9 3.0 2.90 514 -89060100.TOP 1.75 15.8 2810 -10.9 7.9 10.6 26.9 7.9 1.0 -999.00 90 -89060600.GSO 1.75 14.8 2078 -9.1 5.9 8.1 6.7 10.0 0.3 0.60 93 -89060600.JAN 1.75 16.3 3336 -11.3 6.7 20.8 25.3 10.4 2.0 0.80 103 -89061400.GGG 1.75 17.2 3674 -11.0 6.9 15.4 23.3 4.3 1.7 -999.00 61 -89061900.BNA 1.75 13.9 1755 -10.2 6.3 9.7 7.8 6.8 0.4 0.60 86 -89062200.AHN 1.75 15.5 1517 -7.6 5.8 12.6 15.8 14.9 0.3 0.60 112 -89062600.IAD 1.75 16.2 3138 -8.6 6.1 14.3 23.0 12.1 0.9 0.70 108 -89062700.PIA 1.75 15.7 2460 -7.9 6.6 13.2 12.4 5.3 0.6 0.70 87 -89062800.BUF 1.75 15.2 2385 -8.2 5.3 20.1 22.3 9.8 0.7 0.60 82 -89070800.PIT 1.75 15.4 2732 -9.1 6.8 17.5 15.7 12.8 1.1 1.50 81 -89071300.DDC 1.75 15.1 3239 -4.9 6.9 5.1 7.2 7.9 0.2 1.20 81 -89071300.OUN 1.75 19.0 4127 -5.4 6.9 13.8 19.1 13.0 1.0 -999.00 196 -89071500.LBF 1.75 14.3 2675 -6.9 6.1 6.1 8.4 5.5 0.2 0.60 27 -89072900.HON 1.75 14.0 2092 -5.9 6.0 12.0 17.9 6.4 0.3 0.80 105 -89073000.JAN 1.75 18.0 3940 -7.7 6.7 1.9 3.1 2.1 0.2 0.60 9 -89080600.UMN 1.75 19.0 5563 -6.9 7.0 11.7 11.3 8.8 1.4 0.80 99 -89081300.TBW 1.75 16.4 2617 -8.6 6.0 18.1 18.2 10.1 1.0 0.60 65 -89082500.RAP 1.75 10.6 1899 -7.1 7.6 7.7 7.6 2.7 0.2 1.00 55 -89082700.OMA 1.75 17.8 3452 -6.6 6.1 19.5 33.1 15.2 1.1 0.60 142 -89082800.UMN 1.75 17.3 3603 -6.1 6.5 7.8 5.6 2.6 0.5 0.60 28 -89082900.TOP 1.75 19.8 4842 -6.3 6.6 15.4 21.1 13.2 1.5 0.60 156 -89083000.OUN 1.75 17.3 3864 -5.6 6.0 13.1 24.2 11.8 0.7 0.60 112 -89083100.DDC 1.75 16.5 2956 -5.7 6.6 13.6 22.5 13.3 0.6 0.80 346 -89090200.1M1 1.75 18.3 3818 -4.8 6.1 16.2 14.1 8.2 0.8 0.60 64 -89090800.DEN 1.75 10.1 1350 -6.8 8.3 24.1 24.0 15.4 0.4 2.00 366 -90022800.MAF 1.75 9.7 607 -16.2 6.6 16.4 23.8 5.1 0.2 1.20 55 -90031000.AMA 1.75 11.1 2468 -16.0 8.6 13.1 18.2 9.9 1.2 1.90 106 -90031300.OUN 1.75 12.7 3211 -13.6 7.8 24.2 18.1 19.4 2.5 2.80 286 -90040200.BRO 1.75 16.2 3494 -9.3 7.1 25.7 37.2 15.2 2.3 0.90 65 -90042200.OUN 1.75 11.1 2748 -13.3 6.6 12.2 14.9 7.3 0.8 2.00 48 -90042600.DRT 1.75 14.6 3699 -13.8 8.1 25.7 33.2 11.1 3.7 4.30 101 -90042900.AYS 1.75 13.0 2333 -12.2 6.2 30.6 23.2 19.1 1.7 2.30 243 -90050600.OUN 1.75 7.6 836 -20.1 7.2 18.3 48.8 5.8 0.4 1.40 30 -90051200.SEP 1.75 13.6 2282 -9.2 6.9 34.8 47.4 14.5 1.6 -999.00 134 -90051600.IAD 1.75 13.4 2004 -14.0 7.0 16.7 27.7 12.7 1.0 -999.00 102 -90051900.SEP 1.75 17.0 3246 -9.1 6.6 20.9 27.2 15.6 1.6 0.60 387 -90052100.HAT 1.75 15.8 2891 -9.7 5.6 13.8 19.5 12.4 0.8 0.60 182 -90052100.UMN 1.75 14.8 3661 -13.1 7.6 15.4 23.7 15.3 2.0 3.40 181 -90052300.HON 1.75 10.9 1984 -14.0 7.2 22.3 33.6 15.0 1.1 2.40 107 -90052800.SIL 1.75 18.0 3916 -10.0 6.8 19.3 10.6 10.4 2.2 0.80 48 -90061000.IAD 1.75 14.9 2818 -9.2 6.5 16.4 19.3 18.0 1.0 0.60 175 -90061000.OUN 1.75 15.1 3242 -8.5 7.8 10.1 1.3 10.9 0.8 2.50 21 -90061100.CHS 1.75 17.7 4050 -8.1 6.6 8.1 19.1 6.4 0.7 0.60 102 -90061300.STC 1.75 16.2 2789 -10.4 7.2 36.6 42.0 14.2 2.9 0.70 139 -90061800.PIA 1.75 19.5 4567 -8.1 7.4 17.0 25.7 14.1 2.2 1.00 94 -90070500.LCH 1.75 17.6 3315 -8.5 6.6 15.3 2.5 11.6 1.2 0.60 58 -90070900.GRB 1.75 16.9 2962 -6.5 6.5 18.2 22.7 12.1 0.9 0.60 82 -90071100.CKL 1.75 15.4 2544 -8.1 6.4 5.1 4.6 2.1 0.3 0.60 9 -90071300.CRP 1.75 13.3 1658 -6.5 6.5 12.8 9.3 14.6 0.3 0.60 121 -90071400.ABQ 1.75 10.4 1588 -9.4 8.7 18.9 32.6 4.4 0.6 1.20 70 -90071700.FNT 1.75 11.9 1393 -12.5 6.5 15.5 25.3 13.2 0.5 0.60 176 -90071800.LBF 1.75 12.3 3138 -7.7 8.2 17.7 16.6 10.0 1.0 1.60 115 -90072100.ABQ 1.75 10.9 1327 -5.9 8.3 7.9 14.5 9.8 0.1 1.30 145 -90072600.OUN 1.75 16.6 3546 -6.8 6.2 10.8 14.7 11.1 0.6 0.70 206 -90072700.AMA 1.75 14.3 3104 -5.8 7.3 7.7 7.9 11.1 0.3 2.20 117 -90073100.GGG 1.75 16.1 3254 -7.5 6.4 7.9 5.4 1.2 0.5 0.60 3 -90080200.LCH 1.75 18.4 3223 -7.3 6.4 6.5 2.0 3.1 0.4 0.60 14 -90081000.AHN 1.75 14.9 2234 -9.4 6.2 13.3 26.7 6.4 0.6 0.80 33 -90081500.DDC 1.75 15.1 3012 -6.6 5.6 9.0 15.8 9.9 0.4 0.60 59 -90082100.AMA 1.75 14.6 2833 -5.7 6.6 11.7 11.3 10.6 0.4 1.20 75 -90082400.OVN 1.75 18.7 5016 -7.4 6.8 7.4 14.7 9.4 0.8 0.70 100 -90082600.BIS 1.75 13.7 3187 -13.2 8.6 22.2 23.1 13.2 2.6 2.50 190 -90082600.HON 1.75 17.9 5529 -11.5 9.1 14.7 28.6 9.9 3.6 -999.00 156 -90090200.MAF 1.75 14.9 3597 -6.2 6.8 17.2 18.3 7.5 0.9 2.50 58 -90091100.AHN 1.75 15.1 2857 -8.6 5.9 7.9 7.6 6.3 0.4 0.60 80 -91032700.DAY 1.75 10.7 1310 -13.1 6.4 30.2 30.6 24.3 0.8 1.80 531 -91051300.BIS 1.75 13.8 1867 -11.5 6.8 26.9 19.8 15.8 1.3 0.70 -79 -91051300.HON 1.75 14.7 3615 -9.5 7.2 14.2 22.7 13.0 1.2 2.80 97 -91051700.GGG 1.75 18.4 5081 -10.4 7.5 7.9 11.2 10.5 1.4 0.90 157 -91053100.AHN 1.75 16.3 3505 -6.9 5.9 3.9 4.1 3.2 0.2 0.60 15 -91060600.JAN 1.75 16.3 3344 -9.1 6.8 9.5 9.6 3.1 0.8 0.60 12 -91060600.RAP 1.75 13.1 2001 -11.5 7.1 13.2 19.7 11.9 0.7 1.40 170 -92051500.1M1 1.75 13.3 2877 -11.3 6.4 11.4 16.3 7.9 0.7 1.50 54 -94062600.PBI 1.75 17.7 4199 -9.1 6.6 4.9 6.6 5.2 0.5 1.80 10 -94070100.1M1 1.75 18.6 4820 -8.1 6.1 20.0 18.5 12.6 2.1 1.00 342 -94071700.1M1 1.75 17.7 3339 -6.4 5.8 12.5 11.3 19.1 0.7 0.60 164 -94071700.HAT 1.75 16.5 2973 -6.0 5.7 5.9 3.1 4.4 0.2 0.60 33 -97100900.OUN 1.75 16.5 3628 -7.5 6.0 20.0 29.9 16.6 1.3 0.80 205 -98062500.FFC 1.75 15.8 3224 -8.9 7.3 4.2 9.9 5.6 0.3 0.60 54 -00051800.GSO 1.50 11.9 1767 -13.7 6.5 16.4 31.1 7.6 0.7 1.60 124 -00090200.SLC 1.50 9.1 1641 -14.7 8.4 16.1 24.8 20.1 0.7 1.70 101 -01062600.GSO 1.50 11.9 929 -11.7 6.0 17.8 25.6 10.4 0.3 0.60 106 -01062600.RNK 1.50 11.1 1653 -11.9 5.7 13.7 30.3 8.3 0.4 2.10 88 -02042200.ILN 1.50 10.3 623 -13.3 6.8 36.0 43.5 31.2 0.5 2.10 525 -02072500.LCH 1.50 20.2 5453 -7.3 5.9 8.5 11.3 5.5 1.0 0.60 66 -03031700.MHX 1.50 12.1 1241 -13.1 5.4 19.1 32.8 11.5 0.5 0.70 37 -03091800.INL 1.50 13.7 1863 -13.5 7.5 24.7 29.2 15.3 1.5 -999.00 384 -06042117.JAN 1.50 13.4 1486 -12.9 6.5 17.4 11.7 6.4 0.7 0.60 58 -06052200.LBF 1.50 8.2 1420 -11.1 7.7 15.2 22.6 14.8 0.4 1.30 199 -06053000.SGF 1.50 15.0 2988 -9.3 6.5 2.7 12.8 4.0 0.2 0.60 27 -06071100.DNR 1.50 10.1 1192 -7.9 7.6 16.2 27.0 12.2 0.3 1.70 79 -89060200.AHN 1.50 13.2 1996 -7.3 6.1 2.6 1.6 3.2 0.1 -999.00 18 -90040200.GSO 1.50 8.7 984 -17.4 6.8 29.7 37.4 19.9 0.7 2.00 210 -90041100.AHN 1.50 11.5 1096 -14.0 6.4 25.4 25.8 19.0 0.7 0.60 343 -90071000.DEN 1.50 13.5 3504 -8.2 8.0 25.4 20.1 16.7 1.9 2.50 41 -90082200.AHN 1.50 16.5 3275 -6.8 6.5 8.7 15.8 6.0 0.5 0.60 48 -90082200.OUN 1.50 16.6 3350 -5.5 6.1 3.3 5.7 3.1 0.1 0.60 -7 -94070100.GSO 1.50 13.8 2296 -10.3 5.4 8.1 14.3 6.6 0.3 0.60 40 -00030400.BMX 1.25 11.4 1311 -14.9 5.7 42.9 54.3 21.1 1.3 1.40 205 -00071100.DDC 1.25 16.4 4707 -4.1 6.8 4.6 8.7 6.0 0.2 2.60 136 -00072000.LZK 1.25 16.4 3973 -6.7 6.8 12.6 12.7 8.3 0.9 1.10 102 -02041200.TOP 1.25 9.8 1084 -16.5 7.1 9.4 27.2 16.2 0.3 1.60 99 -03040500.ILN 1.25 10.4 1856 -15.7 6.5 20.8 25.6 17.7 1.0 2.20 233 -03090300.NKX 1.25 10.8 940 -5.9 6.6 7.0 5.9 4.2 0.1 0.70 9 -03090800.FGZ 1.25 8.3 663 -8.3 7.7 15.0 17.0 11.2 0.1 1.20 130 -03090800.PHX 1.25 12.1 2268 -6.7 6.7 10.7 16.8 8.2 0.3 1.20 90 -04032700.RAP 1.25 8.5 2052 -15.5 8.0 19.0 17.5 12.6 1.0 1.50 161 -04100400.AMA 1.25 10.5 1672 -13.5 7.6 23.5 31.9 10.7 1.0 2.40 28 -05030700.MAF 1.25 8.0 547 -16.7 6.9 34.3 40.4 16.9 0.4 1.90 177 -05090600.LBF 1.25 13.0 2252 -9.1 8.1 14.1 27.2 6.3 0.7 2.90 28 -05100123.LMN 1.25 15.9 2672 -9.9 7.0 21.4 26.0 14.1 1.5 -999.00 276 -06051500.TLH 1.25 10.8 1279 -13.7 7.1 24.7 23.2 18.5 0.8 1.70 104 -06052000.BOI 1.25 7.4 1070 -13.5 8.4 15.9 25.9 9.2 0.3 0.80 95 -06052600.FFC 1.25 12.1 1711 -12.1 7.1 8.7 3.3 4.1 0.4 1.10 46 -06060300.ILX 1.25 10.0 1218 -14.5 5.9 20.0 22.7 14.1 0.5 1.50 87 -06060312.LBF 1.25 7.7 988 -11.9 9.0 19.5 17.8 10.8 0.4 1.00 699 -06061200.DNR 1.25 6.0 942 -9.9 9.4 17.1 22.2 7.4 0.2 0.60 130 -06070400.GRB 1.25 14.1 1881 -10.1 6.6 22.8 40.7 14.0 1.0 0.60 132 -06072700.ILX 1.25 20.7 4385 -4.3 5.7 12.7 19.1 14.7 0.7 0.60 318 -06072800.FGZ 1.25 13.5 3100 -5.3 8.1 22.7 18.3 14.1 1.0 2.70 193 -90041400.OUN 1.25 10.8 1408 -18.2 7.9 23.5 33.0 17.5 1.2 2.00 146 -94062500.GSO 1.25 15.9 2334 -5.4 5.6 9.9 5.2 12.9 0.3 0.60 103 -00051400.TLH 1.00 15.9 3542 -9.9 6.9 4.2 4.2 5.4 0.4 1.00 -4 -00053000.LBF 1.00 9.9 2258 -9.7 9.2 27.2 31.9 16.9 1.3 1.10 294 -00060100.ILX 1.00 16.1 3208 -9.1 7.0 17.9 15.6 20.7 1.4 1.80 163 -00060200.DVN 1.00 16.4 3451 -9.3 7.3 14.1 11.0 14.2 1.3 0.60 175 -00060200.TOP 1.00 16.1 3517 -9.3 6.9 10.4 16.3 4.9 0.9 0.80 39 -00062100.TBW 1.00 17.1 3180 -8.5 6.4 12.2 19.0 8.9 0.9 0.60 49 -00062300.MHX 1.00 18.6 4167 -8.7 6.1 6.0 6.1 9.7 0.6 0.60 89 -00062600.DDC 1.00 13.5 2618 -6.1 6.7 15.8 16.9 14.3 0.5 1.60 51 -00062600.TOP 1.00 17.8 4052 -8.9 7.6 1.3 23.9 2.4 0.1 2.30 26 -00063000.PIT 1.00 9.9 1086 -15.9 5.5 22.0 37.9 8.1 0.5 1.80 77 -00070200.DDC 1.00 16.2 3566 -5.7 6.6 14.2 21.9 5.5 0.7 1.30 38 -00070200.RAP 1.00 15.6 5621 -9.7 8.7 21.5 22.7 15.9 3.8 2.20 263 -00070300.DDC 1.00 17.2 4558 -5.9 7.5 13.6 22.7 11.7 1.1 2.40 66 -00070300.OAX 1.00 18.5 4633 -6.3 6.9 10.6 19.6 9.9 0.9 1.90 133 -00070400.DDC 1.00 18.1 5142 -7.1 7.6 9.7 19.2 11.4 1.2 2.40 114 -00070700.RAP 1.00 14.2 4065 -7.7 8.6 29.4 33.3 10.8 2.7 2.10 111 -00071200.DDC 1.00 14.4 2941 -5.5 7.2 11.3 11.7 10.8 0.5 1.40 196 -00071400.GRB 1.00 12.0 1743 -12.3 6.9 21.5 42.9 13.4 0.9 1.70 195 -00071500.SHV 1.00 17.2 4004 -5.9 6.0 4.6 8.6 6.2 0.3 0.60 46 -00071700.TOP 1.00 15.9 3927 -8.7 7.9 8.9 14.1 14.5 0.9 2.40 198 -00071900.GYX 1.00 11.4 997 -13.3 6.0 27.0 36.1 18.8 0.6 1.00 107 -00072300.OTX 1.00 9.0 2088 -12.3 8.2 17.2 21.1 7.8 0.8 1.20 43 -00072700.JAN 1.00 12.5 2066 -10.7 6.4 8.0 8.4 4.2 0.3 1.00 -50 -00072800.LBF 1.00 17.1 5581 -7.7 8.1 25.0 21.1 9.6 3.5 3.10 187 -00072800.TOP 1.00 15.3 3666 -10.3 7.6 22.0 26.4 9.1 2.3 2.60 115 -00072900.CHS 1.00 16.1 2462 -7.5 5.6 9.3 13.2 3.3 0.4 0.60 4 -00072900.ILN 1.00 14.3 2735 -11.5 6.7 13.4 21.0 8.0 1.0 0.60 68 -00080700.TOP 1.00 17.3 4476 -7.5 7.2 17.8 22.9 11.7 1.8 1.80 72 -01061900.JAX 1.00 17.2 2584 -9.5 6.1 4.8 8.3 5.0 0.3 0.60 13 -01062100.ABR 1.00 8.1 1118 -19.3 7.0 4.2 12.4 3.6 0.1 1.30 14 -01062600.LBF 1.00 12.7 3931 -8.1 8.1 9.3 8.1 8.1 0.7 1.50 119 -02012400.LZK 1.00 13.1 1343 -12.7 6.6 32.5 40.7 20.2 1.1 0.60 290 -02042300.OAX 1.00 6.4 614 -23.3 7.9 26.3 36.6 15.2 0.4 1.40 133 -02051800.CRP 1.00 20.3 5902 -10.5 7.4 22.6 23.2 10.7 5.0 1.60 86 -02052700.AMA 1.00 9.7 2332 -11.1 7.2 14.5 11.8 13.0 0.6 1.40 198 -02060400.CHS 1.00 15.2 3170 -10.1 7.6 9.7 10.8 11.7 0.9 0.60 33 -02060700.ABR 1.00 9.0 2252 -14.7 8.1 12.4 18.1 8.2 0.7 1.20 118 -02070200.FFC 1.00 16.3 4268 -9.7 6.6 7.8 4.3 7.3 0.8 0.60 46 -02070300.LBF 1.00 14.1 3367 -5.9 7.5 14.0 6.2 11.5 0.7 1.20 158 -02072000.JAN 1.00 17.6 3501 -6.7 6.1 6.1 7.9 5.7 0.4 0.60 58 -02072600.TOP 1.00 13.8 3390 -5.9 7.5 16.9 16.9 11.9 0.8 2.20 168 -02072700.RAP 1.00 9.4 1688 -9.3 7.5 21.0 28.6 14.5 0.6 1.30 139 -02072900.AMA 1.00 13.6 3610 -6.5 7.8 12.5 12.2 13.6 0.7 2.00 164 -02080300.BMX 1.00 18.4 5098 -6.5 5.8 9.6 10.8 11.5 0.8 1.40 33 -02080400.SGF 1.00 17.7 4328 -5.5 6.5 1.1 7.6 3.8 0.1 1.50 -11 -03031500.TBW 1.00 15.9 3398 -13.7 7.0 18.6 27.3 3.9 2.3 0.90 32 -03032000.ILX 1.00 8.0 713 -21.9 6.9 3.5 11.4 5.4 0.1 1.40 -26 -03032100.DTX 1.00 8.7 1602 -21.3 6.6 13.3 27.1 7.7 0.6 1.10 80 -03040500.LZK 1.00 10.7 1751 -14.9 6.6 27.4 33.1 12.6 1.2 2.30 65 -03041800.DNR 1.00 5.3 1063 -18.1 8.6 11.0 43.9 5.9 0.2 0.60 41 -03042400.SHV 1.00 13.1 1456 -12.9 7.2 26.1 36.8 15.2 1.1 0.60 278 -03042800.MFL 1.00 16.7 2735 -10.7 6.4 11.7 25.5 12.3 0.9 0.60 83 -03043000.OAX 1.00 8.9 1064 -16.3 7.4 29.1 32.0 18.4 0.8 1.90 353 -03050100.FFC 1.00 11.1 1429 -13.5 6.6 6.9 6.4 1.0 0.2 1.60 5 -03050212.BNA 1.00 10.3 1865 -15.3 7.0 13.0 18.0 12.1 0.6 2.20 55 -03050312.BMX 1.00 9.7 1402 -16.1 7.5 13.8 38.5 7.9 0.5 1.80 72 -03051100.MHX 1.00 16.0 3585 -9.3 7.3 16.2 15.0 11.9 1.5 0.90 104 -03051200.JAX 1.00 15.9 3060 -7.9 6.9 13.2 20.0 10.1 0.8 -999.00 48 -03051800.TBW 1.00 16.1 3839 -8.7 6.5 5.7 11.9 6.2 0.5 1.10 3 -03051800.XMR 1.00 16.0 3602 -9.5 7.0 8.6 10.7 5.6 0.8 0.90 -7 -03052600.TFX 1.00 8.3 994 -10.9 8.0 16.0 15.9 9.1 0.3 1.30 59 -03052700.ABQ 1.00 7.1 713 -9.9 8.3 14.7 20.6 3.1 0.1 0.60 12 -03060200.DDC 1.00 11.1 1960 -9.5 7.9 17.5 20.6 11.9 0.7 2.00 222 -03060900.RNK 1.00 15.0 2965 -9.1 6.2 24.1 29.2 18.9 1.4 1.20 134 -03090900.TUS 1.00 11.5 2363 -8.3 7.3 7.9 11.8 2.8 0.3 1.10 12 -03111712.TOP 1.00 11.5 1641 -17.3 7.3 25.6 32.6 17.8 1.4 2.70 329 -04031500.DRT 1.00 11.6 1498 -15.5 7.0 16.8 24.5 6.6 0.8 1.40 123 -04032100.FWD 1.00 13.1 2648 -15.5 8.2 12.9 20.8 4.9 1.4 2.80 29 -04051000.FFC 1.00 11.4 2006 -11.1 5.4 4.7 11.0 4.0 0.2 1.90 -15 -04051200.AMA 1.00 9.7 1922 -11.5 8.0 15.0 8.4 19.1 0.6 1.60 282 -04080900.TOP 1.00 14.3 2676 -11.5 7.4 11.9 15.6 5.9 0.9 0.90 82 -04081700.TUS 1.00 13.1 2027 -8.9 7.1 13.2 13.3 8.8 0.5 1.00 96 -04082800.OUN 1.00 16.0 4225 -7.1 7.4 3.8 3.0 7.0 0.3 1.50 101 -05030400.SGF 1.00 5.9 823 -25.9 7.1 24.2 27.9 13.0 0.5 0.70 151 -05050412.TBW 1.00 14.1 1839 -13.5 7.3 15.8 33.3 10.0 1.0 1.00 187 -05050600.EPZ 1.00 8.0 1672 -12.7 8.6 27.7 28.8 15.0 1.0 1.20 178 -05081100.GGW 1.00 10.1 805 -13.7 7.4 30.5 38.9 15.6 0.6 2.10 170 -05081700.GGW 1.00 9.2 1042 -11.1 7.8 27.6 40.5 16.7 0.5 1.70 265 -05081800.LMN 1.00 17.7 3655 -4.1 6.0 22.3 17.3 13.3 0.8 0.60 221 -05082700.EPZ 1.00 11.1 2162 -6.5 8.5 4.9 6.7 4.0 0.2 1.00 21 -05092900.FWD 1.00 12.7 1553 -5.9 6.4 10.1 13.0 8.5 0.2 0.60 39 -06010300.ILN 1.00 9.0 791 -19.3 7.5 16.0 23.8 7.8 0.4 1.40 140 -06011200.GSO 1.00 9.5 1374 -19.1 7.5 15.6 28.9 21.9 0.7 2.50 253 -06041400.BUF 1.00 6.2 383 -23.3 7.6 26.8 55.7 21.6 0.3 1.40 237 -06041400.PIT 1.00 6.2 390 -20.1 7.0 18.6 40.0 18.8 0.1 0.90 220 -06051600.DTX 1.00 8.7 519 -20.5 6.1 5.0 17.9 7.2 0.1 0.70 -7 -06051800.IAD 1.00 8.4 1009 -20.5 6.7 16.0 20.3 11.9 0.4 1.30 66 -06052300.RAP 1.00 9.6 2536 -10.3 8.5 9.7 18.1 5.6 0.5 1.30 43 -06052600.AMA 1.00 7.9 1911 -11.3 9.9 16.9 12.6 11.8 0.7 0.70 262 -06052600.GSO 1.00 11.9 1743 -10.1 6.1 14.4 11.4 8.4 0.4 0.80 82 -06052600.JAX 1.00 13.3 1856 -10.7 6.6 15.3 20.8 10.5 0.6 0.60 70 -06052700.BIS 1.00 9.4 2274 -11.9 8.5 22.0 21.3 20.2 1.1 1.30 198 -06052700.JAX 1.00 15.0 2879 -9.9 6.1 13.7 13.1 11.0 0.9 0.80 117 -06053100.GGW 1.00 5.6 570 -21.1 7.4 5.0 8.1 2.8 0.1 0.90 30 -06060200.BNA 1.00 14.2 2055 -7.9 5.4 5.5 12.6 8.6 0.2 0.60 -2 -06060300.GRB 1.00 8.8 1314 -18.9 7.1 16.3 19.5 12.0 0.6 1.60 77 -06060400.ILN 1.00 8.3 1032 -18.1 6.5 8.5 11.1 6.7 0.2 1.20 35 -06060500.FFC 1.00 11.0 1475 -12.5 5.9 11.7 22.4 5.7 0.3 2.10 18 -06060700.SHV 1.00 14.6 2252 -10.3 7.4 25.4 14.5 15.1 1.5 0.60 164 -06060712.RAP 1.00 7.9 1110 -10.3 8.7 12.3 19.2 9.9 0.2 1.30 131 -06060800.LBF 1.00 10.8 2368 -6.9 7.7 20.5 22.3 11.2 0.7 1.70 244 -06061200.BNA 1.00 13.6 1539 -6.7 5.6 15.2 7.0 9.1 0.3 0.60 107 -06061900.GRB 1.00 14.0 2397 -11.7 6.2 15.9 20.9 12.4 0.9 1.90 74 -06062100.BNA 1.00 14.1 2387 -9.3 6.8 6.7 3.3 6.8 0.3 0.60 43 -06062200.JAN 1.00 15.3 2595 -8.7 7.0 3.0 2.5 4.6 0.2 0.60 -15 -06062300.BMX 1.00 12.5 1595 -7.1 6.2 5.1 4.3 1.9 0.1 0.60 -10 -06062300.BNA 1.00 15.6 3023 -10.1 7.3 10.6 3.6 8.0 0.9 0.60 71 -06062300.DDC 1.00 11.0 987 -11.1 7.2 17.7 17.5 9.3 0.4 1.30 78 -06062700.FFC 1.00 15.4 2376 -6.9 5.6 12.6 21.6 9.3 0.4 0.60 23 -06062800.GRB 1.00 9.4 1049 -15.5 6.1 13.8 20.6 8.1 0.3 1.60 34 -06062900.PIT 1.00 10.9 925 -13.7 6.4 21.3 35.7 7.1 0.4 1.60 17 -06062900.TOP 1.00 8.5 959 -12.3 7.1 12.7 14.7 8.1 0.2 1.00 120 -06070200.FFC 1.00 11.2 1552 -9.7 6.3 6.5 9.5 1.2 0.2 0.90 4 -06070200.FWD 1.00 12.8 1806 -9.9 7.2 6.1 11.2 1.6 0.2 0.60 20 -06070200.LBF 1.00 12.2 2554 -8.5 8.0 20.5 17.9 17.1 1.0 2.00 223 -06070300.IAD 1.00 14.8 3195 -9.3 5.9 10.7 13.6 10.7 0.7 0.90 60 -06070500.GSO 1.00 15.2 2335 -7.3 6.1 9.6 6.1 7.6 0.4 0.60 96 -06071300.BIS 1.00 9.0 966 -8.7 8.1 7.7 14.5 5.9 0.1 0.70 108 -06071800.DNR 1.00 9.1 1197 -6.9 8.0 7.7 6.2 3.5 0.1 1.10 83 -06072000.RNK 1.00 14.2 2160 -8.5 5.9 9.1 3.0 11.1 0.3 1.00 113 -06072200.RNK 1.00 16.5 3249 -6.1 6.0 7.0 9.1 7.2 0.3 0.60 100 -06072300.ABQ 1.00 9.6 1267 -4.9 7.8 5.7 11.2 2.8 0.1 1.00 -9 -06072700.RAP 1.00 8.7 694 -8.7 8.3 16.3 21.8 13.4 0.2 0.90 157 -06072800.ABR 1.00 12.7 1956 -6.1 6.4 23.5 29.4 16.1 0.5 1.40 149 -06072800.OAX 1.00 15.6 2714 -5.3 6.0 16.8 22.8 9.3 0.5 0.60 92 -06080100.PIT 1.00 18.6 3456 -4.5 5.8 12.7 7.9 10.1 0.5 0.60 104 -06081000.TUS 1.00 13.4 1913 -6.3 7.3 3.1 6.2 1.2 0.1 0.60 12 -06090800.ABR 1.00 9.5 1406 -14.3 7.5 9.4 9.1 10.6 0.3 1.70 163 -06090800.LBF 1.00 7.9 880 -14.1 7.5 11.1 19.9 6.9 0.2 0.90 20 -06091200.ILX 1.00 13.6 1642 -11.1 6.4 12.9 23.9 8.6 0.5 0.60 56 -06092900.FFC 1.00 10.8 705 -11.1 4.6 19.1 33.4 18.9 0.2 0.60 85 -89060500.1M1 1.00 15.8 2493 -8.2 6.0 14.7 13.0 10.3 0.7 0.60 19 -89061200.JAN 1.00 17.7 3616 -9.1 6.5 15.3 5.8 7.5 1.4 0.60 84 -89061400.JAN 1.00 16.0 3274 -11.5 7.1 11.3 8.2 9.4 1.2 1.00 57 -89061600.TBW 1.00 16.4 3463 -7.6 5.7 10.2 6.4 5.9 0.6 0.60 36 -89061900.CKL 1.00 16.7 3363 -9.6 6.4 14.5 12.2 12.2 1.2 0.60 103 -89062800.HTS 1.00 17.6 3659 -8.0 5.8 15.4 21.4 7.4 1.1 0.60 62 -89062900.AMA 1.00 12.6 2035 -8.2 8.6 14.8 26.0 13.0 0.6 2.30 165 -89070600.OUN 1.00 12.9 1373 -6.0 6.2 6.0 12.2 11.3 0.1 0.60 64 -89071200.TOP 1.00 16.6 3182 -8.1 7.6 12.6 8.2 13.2 1.0 1.60 157 -89072400.VCT 1.00 14.8 2953 -9.6 6.2 7.7 13.3 9.5 0.5 0.60 120 -89072800.DAY 1.00 16.4 2617 -7.8 5.7 13.5 11.3 7.5 0.6 0.60 83 -89073100.GTF 1.00 9.5 1858 -9.3 8.9 10.8 21.7 10.3 0.4 1.20 106 -89080600.OUN 1.00 16.3 3439 -5.4 6.8 10.2 12.1 9.7 0.5 0.80 101 -89082000.UMN 1.00 17.3 3524 -6.0 6.2 20.6 14.9 13.6 1.1 0.80 350 -89082700.DDC 1.00 16.9 4549 -7.4 7.6 11.3 24.3 1.4 1.2 2.10 11 -90050400.CKL 1.00 14.0 1534 -10.6 6.4 20.1 25.8 10.8 0.7 0.60 141 -90061000.GSO 1.00 15.3 2409 -8.8 6.1 9.7 14.5 11.1 0.5 0.60 145 -90062300.HTS 1.00 14.5 1346 -8.5 5.8 27.1 36.9 19.1 0.6 0.60 231 -90062400.OUN 1.00 11.9 1571 -10.8 8.2 26.8 24.9 14.1 1.1 1.90 186 -90070900.GSO 1.00 17.6 4051 -5.3 5.6 10.2 10.5 6.1 0.5 0.80 73 -90071100.GSO 1.00 15.2 3487 -6.6 5.9 3.5 9.1 7.5 0.2 0.60 38 -90071800.AMA 1.00 11.4 1482 -6.5 6.7 14.8 26.1 8.4 0.3 1.10 98 -90072000.DEN 1.00 11.7 1698 -7.2 7.4 16.1 20.8 14.0 0.4 2.10 182 -90072200.TBW 1.00 17.8 3409 -5.7 6.0 4.6 7.8 3.6 0.2 0.60 35 -90072500.DDC 1.00 11.9 1703 -8.0 6.8 14.0 17.5 10.1 0.4 1.40 208 -90072600.GGW 1.00 10.2 1514 -10.6 7.0 15.6 16.6 7.9 0.4 1.80 55 -90080200.MAF 1.00 14.4 1702 -6.2 6.1 9.7 12.2 2.8 0.2 0.60 27 -90081900.AMA 1.00 13.6 2596 -7.9 7.0 5.1 5.1 3.8 0.2 0.80 45 -90082100.OUN 1.00 19.2 5290 -6.7 6.9 8.3 3.4 6.2 0.9 0.60 38 -90082300.HTS 1.00 15.2 707 -7.7 6.2 7.0 8.5 3.6 0.1 0.60 -4 -90083000.GSO 1.00 16.4 3552 -9.3 6.0 20.1 18.2 14.1 1.6 0.60 37 -90092900.MAF 1.00 12.2 1606 -8.0 6.0 15.0 28.7 11.3 0.3 0.80 35 -90100800.GGG 1.00 16.8 2689 -6.0 5.8 14.2 17.2 8.9 0.5 0.60 70 -90101800.GGG 1.00 14.2 1619 -10.6 6.4 20.0 27.9 12.5 0.7 0.60 114 -91060500.AHN 1.00 15.3 3036 -8.1 6.7 5.7 13.0 11.6 0.3 0.60 72 -91060500.CKL 1.00 16.9 3345 -7.5 6.3 5.0 4.8 9.2 0.3 0.60 52 -93092500.OUN 1.00 16.1 2895 -6.7 6.2 24.5 27.2 16.0 1.1 0.60 264 -97081700.DVN 1.00 20.8 5790 -8.3 7.5 14.3 11.8 12.3 2.6 1.00 137 -97081700.PIT 1.00 18.3 3951 -7.9 6.9 12.7 23.0 15.4 1.2 0.60 224 -97081800.FFC 1.00 18.4 3564 -6.1 6.1 2.5 2.0 4.4 0.1 0.60 37 -98052200.BNA 1.00 15.2 3709 -10.7 6.4 9.2 7.9 10.4 0.8 0.90 83 -99061200.ILN 1.00 14.7 3299 -8.3 5.8 4.6 4.0 8.2 0.3 1.10 32 -00021800.JAN 0.88 12.5 1866 -14.9 6.7 27.5 38.9 16.2 1.5 0.70 270 -00061100.DDC 0.88 14.3 3471 -7.9 6.9 11.0 20.2 14.0 0.7 2.40 53 -00061800.RAP 0.88 7.4 1396 -18.9 7.1 14.0 34.9 7.4 0.5 1.40 270 -00070600.DDC 0.88 12.3 2581 -7.5 8.5 9.4 10.0 10.7 0.5 1.80 97 -00072800.BMX 0.88 13.2 2147 -9.5 6.2 8.0 11.4 6.0 0.3 0.70 35 -00080200.DVN 0.88 16.6 4183 -9.7 6.6 11.2 16.4 13.3 1.2 1.10 169 -00080300.PIT 0.88 14.9 2780 -9.7 6.2 15.5 29.2 9.1 0.9 0.60 81 -00080400.BNA 0.88 16.3 3453 -9.9 6.8 10.9 16.0 9.1 1.0 0.60 83 -00080500.LZK 0.88 16.1 3872 -6.3 5.6 9.4 14.6 7.3 0.5 0.80 6 -00080700.DTX 0.88 19.4 4231 -7.3 6.0 16.6 31.6 10.6 1.4 0.60 78 -00090300.OAX 0.88 12.6 3099 -10.1 8.7 16.9 21.6 9.5 1.4 1.40 126 -01062200.DVN 0.88 10.3 1285 -18.1 6.5 10.8 11.8 8.7 0.4 1.00 66 -01062600.CRP 0.88 16.6 3837 -8.5 6.4 4.0 8.9 7.1 0.3 0.60 53 -02031000.GSO 0.88 11.0 819 -15.3 5.8 24.6 29.7 19.8 0.5 1.20 236 -02052900.OAX 0.88 13.0 2754 -13.3 7.1 7.5 7.0 10.0 0.6 2.60 127 -03031400.TLH 0.88 11.6 2141 -13.1 6.3 10.5 9.0 5.7 0.5 1.10 39 -03042912.TOP 0.88 10.6 1617 -16.9 7.8 16.7 22.5 11.0 0.9 2.80 238 -03050400.BIS 0.88 8.2 1467 -18.7 7.4 15.4 16.1 8.8 0.6 1.60 86 -03060300.JAX 0.88 16.1 3513 -10.1 7.6 11.1 10.3 11.4 1.1 0.60 111 -03060600.ABR 0.88 8.1 888 -19.9 6.8 17.3 14.2 9.2 0.4 1.50 47 -03061600.TOP 0.88 12.4 1944 -11.9 6.4 0.8 4.2 5.8 0.0 1.00 3 -03062000.GGW 0.88 9.2 1032 -9.7 8.1 9.8 17.1 8.3 0.2 1.30 76 -03101712.JAN 0.88 12.8 1891 -11.5 6.3 25.4 33.9 16.9 1.1 1.20 246 -03102600.CRP 0.88 17.9 3408 -9.9 6.3 15.2 34.5 9.8 1.4 0.60 17 -03111800.OAX 0.88 10.0 957 -18.3 6.8 41.2 58.6 20.0 1.2 2.50 88 -04040900.AMA 0.88 8.2 1515 -16.7 7.0 17.9 23.0 14.7 0.6 1.60 139 -04081800.PHX 0.88 10.5 1709 -9.1 7.3 4.8 9.2 6.0 0.1 0.80 15 -04082700.ABR 0.88 10.2 1433 -15.1 6.7 14.4 40.5 5.3 0.5 1.50 28 -04091900.LCH 0.88 15.9 2433 -6.9 5.8 4.4 15.6 7.7 0.2 0.60 6 -04092000.OAK 0.88 7.3 242 -17.9 5.5 27.4 30.4 6.5 0.1 0.70 56 -04100400.GSO 0.88 13.2 1385 -14.9 6.5 15.2 26.8 10.4 0.6 1.40 101 -05081300.MAF 0.88 12.8 1568 -6.3 6.5 11.8 13.7 6.9 0.2 0.60 82 -06013012.JAN 0.88 10.0 1058 -20.9 7.1 38.7 46.0 18.9 1.5 2.60 71 -06032100.OUN 0.88 5.4 579 -25.5 7.4 16.6 26.7 5.7 0.2 0.90 53 -06040700.FWD 0.88 12.5 2831 -12.5 6.2 33.5 41.5 20.1 2.2 2.80 40 -06041200.TOP 0.88 8.4 726 -14.3 7.0 33.2 37.2 23.1 0.5 2.00 232 -06043000.OTX 0.88 6.4 499 -17.9 7.3 17.3 23.3 8.3 0.2 0.80 75 -89061200.AMA 0.88 13.2 3301 -11.7 8.7 12.9 25.2 9.2 1.4 2.30 167 -89062600.UMN 0.88 16.2 3812 -6.9 6.3 0.7 10.8 2.0 0.0 0.60 -14 -89062700.DEN 0.88 8.6 931 -11.1 7.6 14.3 14.3 10.8 0.2 1.80 122 -89072700.AHN 0.88 17.5 3996 -6.9 6.5 3.5 6.8 7.1 0.3 0.60 66 -89082500.AHN 0.88 16.9 3533 -5.1 6.1 3.3 8.1 2.7 0.1 0.60 5 -89082600.AHN 0.88 17.1 3463 -5.6 5.8 11.3 8.6 4.0 0.5 0.60 41 -89082900.GGG 0.88 18.5 3979 -4.6 6.0 4.1 2.2 1.6 0.2 0.60 3 -90071000.PIT 0.88 16.6 3362 -6.7 6.3 19.7 14.7 14.3 1.1 0.60 124 -90073000.AMA 0.88 12.2 943 -7.5 6.3 12.7 18.1 8.4 0.2 0.60 14 -90091900.OUN 0.88 18.0 3878 -6.7 6.2 11.9 20.5 12.1 0.8 0.60 119 -97010900.SIL 0.88 13.1 909 -13.6 6.7 39.7 37.0 33.7 1.0 -999.00 511 -98062500.DDC 0.88 11.9 2667 -7.3 8.7 25.1 34.7 12.4 1.2 1.40 224 -90052100.SIL 0.85 16.6 3505 -10.6 6.7 8.4 13.0 10.9 0.8 0.60 70 -03052100.TBW 0.80 15.8 2941 -9.5 6.2 2.7 5.4 7.1 0.2 0.60 27 -91051700.JAN 0.80 15.5 2890 -8.9 6.5 1.1 7.8 0.6 0.1 0.60 1 -00022400.LZK 0.75 10.6 1590 -18.1 7.0 25.0 34.2 17.2 1.3 2.50 270 -00050300.JAN 0.75 12.8 1438 -12.9 5.9 12.8 7.2 13.9 0.4 0.60 120 -00052200.LZK 0.75 12.1 2062 -13.5 6.2 22.6 32.5 17.7 1.1 1.40 162 -00061800.JAX 0.75 15.7 2677 -7.9 5.7 6.0 10.5 7.9 0.3 0.60 61 -00061900.WAL 0.75 17.4 2940 -7.9 6.3 11.3 9.5 11.6 0.7 0.60 134 -00062500.JAX 0.75 15.6 2442 -10.1 6.2 9.4 21.8 9.3 0.5 0.60 104 -00062900.GRB 0.75 8.9 860 -18.9 6.4 17.0 24.4 14.1 0.4 1.10 108 -00071300.DDC 0.75 15.1 3064 -3.7 6.1 6.2 10.6 9.2 0.2 0.60 0 -00071300.FWD 0.75 14.9 3103 -5.7 6.5 10.6 11.4 13.9 0.4 0.80 120 -00071800.JAN 0.75 15.8 3305 -5.5 6.0 13.9 14.4 13.1 0.6 0.60 -56 -00071900.JAN 0.75 17.3 3841 -6.1 6.1 7.5 6.9 5.7 0.4 0.60 32 -00072100.TBW 0.75 18.9 4845 -6.9 6.4 7.0 10.7 7.4 0.7 0.90 56 -00072300.GSO 0.75 16.5 2443 -9.1 5.7 20.6 22.2 6.6 1.0 0.60 88 -00072400.GGW 0.75 10.9 3240 -11.1 8.5 26.1 22.5 12.5 2.1 1.40 54 -00080400.LCH 0.75 15.7 3045 -7.5 5.6 2.8 12.8 4.7 0.1 0.60 28 -00090200.SHV 0.75 12.1 1896 -7.5 7.0 3.2 2.0 5.2 0.1 0.70 15 -01062400.BIS 0.75 13.7 4781 -10.9 9.0 18.7 27.1 15.0 2.8 1.70 249 -02030812.ILX 0.75 7.2 533 -19.7 6.9 31.5 49.1 16.1 0.4 1.30 599 -02051500.PIT 0.75 5.9 521 -27.9 7.9 14.7 14.3 17.3 0.2 1.10 74 -02060400.JAX 0.75 15.3 3128 -8.1 6.5 3.7 6.5 0.3 0.2 0.60 15 -02062500.LBF 0.75 11.7 3690 -10.3 9.2 7.2 9.1 5.0 0.7 1.30 45 -02072000.LZK 0.75 21.6 6551 -8.5 6.9 10.2 6.8 8.7 2.0 0.90 145 -03031500.OTX 0.75 6.3 801 -26.3 7.5 24.9 28.7 18.3 0.6 1.50 240 -03032000.SGF 0.75 7.6 909 -22.1 6.7 10.5 8.6 18.2 0.3 1.40 205 -03040922.XMR 0.75 15.5 2570 -10.3 5.6 31.0 38.3 12.7 1.7 0.60 34 -03042300.DNR 0.75 6.7 1183 -16.1 7.9 19.1 35.2 12.2 0.5 1.20 265 -03050100.DNR 0.75 6.7 1011 -20.1 8.0 33.5 27.3 12.5 0.9 1.20 108 -03050200.BMX 0.75 12.4 2216 -12.9 6.6 6.7 7.6 4.6 0.4 0.70 9 -03052400.PIT 0.75 10.0 707 -16.7 6.5 26.5 23.6 12.1 0.5 1.00 65 -03060700.MFL 0.75 18.2 3041 -6.7 5.6 2.8 9.3 0.9 0.1 0.60 5 -03061000.JAX 0.75 16.0 2482 -8.7 6.7 11.3 22.4 10.8 0.6 0.60 13 -03061222.XMR 0.75 17.1 2144 -7.9 6.1 4.6 6.1 5.2 0.2 0.60 65 -03061500.SHV 0.75 16.2 2511 -9.9 6.3 21.1 32.8 13.5 1.3 0.60 91 -03061900.TFX 0.75 8.6 1802 -9.3 8.2 10.8 13.4 13.1 0.3 1.00 178 -03062000.BOI 0.75 7.0 491 -12.5 8.2 23.3 18.1 17.9 0.2 1.00 141 -03062100.RAP 0.75 11.9 2338 -10.3 7.2 8.1 14.4 15.0 0.4 2.40 137 -03062200.IAD 0.75 10.5 1215 -17.1 5.8 15.1 9.7 9.3 0.5 1.10 79 -03090900.GJT 0.75 6.8 996 -12.3 9.1 17.7 28.1 8.5 0.3 0.70 199 -03090900.MAF 0.75 12.1 2389 -7.9 7.0 18.1 17.8 12.1 0.7 2.20 222 -03091000.JAN 0.75 15.0 1929 -9.5 6.0 10.8 22.1 8.1 0.4 0.60 83 -03111300.BUF 0.75 8.1 418 -20.5 6.7 46.9 65.5 18.0 0.5 1.50 335 -04030500.LZK 0.75 12.4 745 -10.1 5.8 39.6 53.2 27.8 0.5 0.60 468 -04051300.OAX 0.75 10.5 1193 -13.7 6.9 24.2 28.7 16.7 0.7 2.20 133 -04051700.FFC 0.75 12.2 2077 -12.1 6.4 2.0 11.6 2.9 0.1 0.80 0 -04052300.BUF 0.75 13.8 1807 -10.6 5.8 22.4 24.0 18.8 0.8 0.60 239 -04081700.PHX 0.75 12.6 2729 -7.9 7.1 8.0 6.2 6.2 0.4 1.30 60 -04081900.DDC 0.75 11.7 2146 -6.3 6.2 4.3 11.0 10.2 0.1 0.70 15 -04081900.OTX 0.75 9.8 1929 -11.3 7.4 9.9 15.1 6.2 0.4 1.50 43 -04082800.JAN 0.75 18.0 3714 -7.5 6.4 2.6 3.6 1.0 0.2 0.60 12 -04082800.PIT 0.75 18.3 3258 -6.1 5.6 7.8 6.8 10.4 0.4 0.60 106 -04092800.DNR 0.75 7.9 698 -13.9 7.1 17.7 21.0 12.4 0.2 1.00 112 -04100400.CHS 0.75 15.3 1850 -10.7 6.0 22.1 32.7 13.4 1.0 0.60 81 -05022200.BMX 0.75 11.8 1749 -15.9 6.8 26.1 36.8 19.0 1.4 1.20 174 -05030700.OAX 0.75 5.7 324 -21.9 7.4 14.9 9.6 13.6 0.1 0.90 156 -05042612.JAN 0.75 9.2 993 -17.3 6.9 27.2 35.7 15.7 0.7 2.20 336 -05050500.OTX 0.75 7.7 1601 -19.1 7.3 15.7 22.0 8.5 0.6 1.40 35 -05082100.OAX 0.75 15.5 2617 -6.9 6.0 14.8 30.9 15.0 0.6 0.60 159 -05082400.SHV 0.75 16.6 3397 -5.3 6.1 9.2 4.4 11.1 0.4 0.60 72 -06011400.JAX 0.75 12.1 1223 -15.1 6.5 19.6 26.7 19.7 0.7 0.70 233 -89052800.CKL 0.75 15.4 2098 -8.1 6.2 11.8 13.5 8.0 0.5 0.60 43 -89060400.PAH 0.75 16.4 3338 -9.7 5.8 14.2 14.7 15.5 1.0 0.60 90 -89060700.AHN 0.75 14.2 2402 -13.0 6.6 12.3 18.6 2.7 0.9 0.60 37 -89061300.CKL 0.75 16.1 2677 -8.6 6.1 15.9 7.3 11.5 0.9 0.60 102 -89061500.AHN 0.75 14.7 1717 -7.5 5.5 10.0 9.8 11.8 0.2 0.60 91 -89061600.ACY 0.75 16.5 2243 -7.6 5.9 18.8 19.1 19.5 0.7 0.60 217 -89062200.CKL 0.75 16.1 2986 -10.1 6.7 10.0 8.5 6.8 0.8 0.60 76 -89062300.GRB 0.75 14.6 1729 -8.4 6.2 10.7 10.8 10.0 0.3 -999.00 139 -89062300.OUN 0.75 16.0 3217 -7.1 5.9 12.8 14.9 6.9 0.7 0.60 113 -89062700.PIT 0.75 16.0 2924 -9.1 6.8 8.1 4.9 7.9 0.6 0.60 69 -89070800.AHN 0.75 16.8 2876 -6.5 5.8 4.1 4.8 4.3 0.2 0.60 33 -89071100.DDC 0.75 11.9 1858 -8.1 7.6 8.5 14.0 12.4 0.3 2.10 249 -89072900.SIL 0.75 18.8 4031 -6.8 6.3 4.1 4.4 3.9 0.3 0.60 37 -89073000.PAH 0.75 17.9 3630 -7.0 6.4 11.4 9.0 7.4 0.8 0.60 58 -89073100.TOP 0.75 14.5 2685 -6.4 6.7 9.8 13.0 12.0 0.4 0.60 117 -89081200.GRB 0.75 11.3 1782 -14.8 6.7 4.1 9.5 3.9 0.2 0.60 39 -89081900.HON 0.75 13.1 984 -7.6 7.1 14.0 17.9 12.1 0.2 -999.00 244 -89102800.OUN 0.75 12.0 1679 -12.7 6.8 10.1 27.1 8.3 0.4 1.00 115 -90033100.TBW 0.75 14.8 2515 -10.0 5.6 14.0 15.0 12.0 0.7 0.60 135 -90042100.OUN 0.75 12.4 1915 -14.1 6.5 25.3 31.9 13.1 1.3 1.70 138 -90042200.SEP 0.75 13.3 2775 -11.7 6.5 10.2 20.8 8.1 0.7 1.00 98 -90042400.1M1 0.75 12.8 2374 -12.6 6.7 14.0 8.3 6.6 0.9 0.90 56 -90052500.MAF 0.75 13.1 3262 -7.2 7.9 22.0 30.6 12.4 1.3 1.80 97 -90060400.PIT 0.75 9.5 390 -12.5 5.6 26.0 37.7 14.6 0.2 0.60 57 -90060700.TBW 0.75 17.0 3262 -8.6 6.0 1.6 7.3 4.1 0.1 0.60 8 -90061000.AHN 0.75 14.8 2847 -8.2 5.9 8.6 9.9 5.6 0.4 0.60 50 -90070300.SLI 0.75 18.4 3250 -5.7 5.8 11.8 14.5 7.5 0.6 0.60 79 -90070800.TBW 0.75 20.0 5452 -8.1 6.5 7.8 15.4 5.9 1.1 0.60 11 -90072200.CHS 0.75 18.4 3537 -7.5 6.2 8.3 10.2 7.1 0.6 0.60 88 -90072200.PAH 0.75 16.9 2541 -5.6 5.7 13.3 15.3 11.4 0.4 0.60 80 -90072700.DDC 0.75 14.7 3550 -7.0 7.6 7.6 7.2 6.0 0.5 2.20 84 -90072800.TOP 0.75 16.5 3231 -7.8 6.7 8.8 11.3 9.8 0.6 0.90 281 -90073100.JAN 0.75 14.6 2834 -7.3 6.1 5.1 4.3 0.7 0.2 0.60 -3 -90080400.STC 0.75 13.1 2284 -12.5 7.3 5.3 20.0 8.7 0.3 1.40 45 -90081400.ALB 0.75 14.6 1251 -7.6 5.7 31.1 21.6 20.7 0.6 0.60 261 -90081400.MAF 0.75 13.7 1598 -7.1 6.2 4.4 16.6 2.3 0.1 0.60 35 -90081700.CHS 0.75 19.5 3949 -6.9 5.7 14.2 20.9 11.2 1.0 0.60 101 -90081900.DEN 0.75 11.7 1982 -7.8 7.6 10.2 22.1 6.4 0.3 1.70 25 -90082000.PIA 0.75 19.3 4350 -6.5 6.2 12.0 9.9 9.4 1.0 0.60 67 -90082200.BNA 0.75 15.5 2619 -6.1 6.1 9.1 12.7 8.7 0.3 0.60 -10 -90082300.GGG 0.75 16.2 3016 -5.9 6.0 1.3 5.5 5.3 0.1 0.60 35 -90082500.OUN 0.75 15.7 2800 -6.4 6.6 5.0 11.9 5.3 0.2 0.60 63 -90082500.OVN 0.75 17.2 3418 -7.1 6.4 12.0 21.9 10.0 0.8 0.70 181 -90083000.ACY 0.75 15.2 2413 -9.3 5.8 13.9 22.7 9.0 0.7 0.60 62 -90101700.MAF 0.75 12.3 2870 -12.5 8.0 14.9 16.2 7.7 1.3 2.30 78 -91051700.TBW 0.75 16.1 3306 -7.5 5.4 4.0 0.9 3.8 0.2 0.60 -5 -91060600.CKL 0.75 16.3 2864 -8.6 6.4 8.9 11.4 6.2 0.5 0.60 21 -94062400.GGG 0.75 18.0 3754 -5.5 6.3 11.0 14.2 8.2 0.6 0.60 98 -94062400.HTS 0.75 16.5 2798 -5.5 5.3 8.5 15.0 4.7 0.3 0.60 39 -94070200.LCH 0.75 17.0 2754 -6.8 6.4 10.7 11.0 12.4 0.5 0.60 84 -97061700.BMX 0.75 18.2 3829 -6.9 5.9 12.4 13.0 6.9 0.8 0.60 48 -97062400.MAF 0.75 14.1 3310 -9.9 8.9 11.5 8.6 13.0 1.1 1.60 108 -97081700.TBW 0.75 17.4 3152 -7.3 6.2 2.6 4.4 1.8 0.2 0.60 8 -97081800.SLC 0.75 8.3 931 -10.3 8.5 16.1 22.9 13.6 0.3 1.40 203 -97082200.ILN 0.75 9.6 520 -16.3 5.8 17.5 30.9 3.9 0.2 0.70 50 -98062500.JAN 0.75 17.3 3507 -6.1 6.0 2.3 8.6 7.1 0.1 0.70 -1 -98081000.SHV 0.75 16.8 3464 -6.5 5.9 4.8 1.1 4.2 0.3 0.60 42 +DATE / RAOB REPORT MUMR MUCAPE 500TEMP 7-5 LR 0-6SH 0-9SH 0-3SH SHIP MODELb SRH +91051100.MAF 6.00 14.9 4692 -10.8 8.8 13.2 18.1 14.2 1.9 2.70 -37 +95052300.DDC 6.00 15.3 4181 -9.6 7.5 19.4 26.8 23.4 1.9 3.00 325 +97061700.OUN 5.50 18.8 5751 -9.5 7.4 23.6 45.9 14.5 4.3 3.50 116 +06040300.LZK 5.00 13.7 3819 -14.9 8.0 26.6 32.6 20.9 3.9 3.40 251 +57070300.RAP 5.00 15.8 4359 -6.7 7.7 22.9 39.3 13.9 1.9 3.40 130 +90070800.BIS 5.00 16.6 3717 -9.8 7.7 29.8 42.2 12.5 3.3 2.40 202 +91052900.HON 5.00 15.2 3892 -12.3 8.0 40.7 36.0 25.0 5.7 3.50 269 +92072600.DDC 5.00 17.4 4794 -4.6 6.8 17.4 14.6 18.2 1.1 0.80 176 +96061200.DDC 5.00 13.7 2820 -8.3 7.6 20.3 15.8 12.9 1.2 2.50 142 +99012200.LZK 5.00 12.3 2240 -17.3 7.6 26.3 32.1 23.0 2.3 3.00 294 +99060100.DDC 4.75 15.9 4387 -11.3 8.0 27.7 38.0 15.3 4.2 3.50 209 +02042900.IAD 4.50 13.6 2553 -16.7 7.3 21.1 33.9 24.9 2.1 2.90 373 +02043000.FWD 4.50 19.4 5853 -10.9 8.0 29.7 37.1 14.6 7.0 3.10 151 +89060400.MAF 4.50 14.0 3939 -10.0 8.5 20.6 33.6 6.6 2.3 2.20 58 +89060700.SEP 4.50 15.6 3510 -7.9 7.0 24.8 47.4 9.0 1.8 2.40 130 +89062700.GSO 4.50 17.6 4349 -7.3 6.3 14.2 6.4 7.8 1.2 0.90 52 +89070300.SEP 4.50 18.5 5261 -7.6 8.4 22.6 1.2 12.9 3.4 2.90 222 +89080400.INL 4.50 17.4 3953 -11.5 8.3 18.6 29.2 7.3 2.9 1.00 36 +90051600.OUN 4.50 16.7 4398 -9.0 7.6 25.5 44.9 23.2 3.1 3.10 180 +91032800.FNT 4.50 11.3 1860 -17.3 7.6 47.0 45.4 26.8 3.1 2.90 431 +91042912.BRO 4.50 19.5 4471 -9.8 7.7 23.1 24.2 13.7 3.6 -999.00 254 +91072100.HON 4.50 20.1 5826 -6.1 6.8 22.8 33.9 14.3 2.6 1.90 180 +91081400.GTF 4.50 11.5 2524 -13.2 8.5 25.8 28.9 15.3 2.0 2.00 213 +92062800.AMA 4.50 16.0 4069 -10.3 7.9 22.8 27.5 16.9 2.9 3.20 150 +92062800.DDC 4.50 13.8 2750 -11.3 7.8 20.6 41.3 15.2 1.6 2.90 315 +92062900.SEP 4.50 17.4 3761 -9.6 7.8 21.8 15.6 13.7 2.5 2.80 248 +92073000.OVN 4.50 16.6 4366 -11.4 7.4 22.3 23.7 13.9 3.3 3.20 216 +92073000.TOP 4.50 16.6 4074 -10.0 7.5 22.5 22.1 11.8 2.7 2.40 164 +93050100.DDC 4.50 11.1 3206 -16.5 8.0 24.0 29.9 15.4 2.7 3.70 194 +93060800.OUN 4.50 17.0 4917 -9.1 7.1 30.6 26.7 9.7 3.9 2.60 195 +93062700.OVN 4.50 15.0 3720 -10.0 6.3 22.3 28.9 9.4 1.9 3.10 140 +93072400.BIS 4.50 15.3 3597 -9.8 5.8 21.0 33.2 14.9 1.6 2.30 263 +93092200.OVN 4.50 15.4 3685 -11.1 8.1 31.9 33.2 23.5 3.9 4.00 492 +93092200.TOP 4.50 16.8 3665 -8.1 6.5 21.3 37.9 21.3 1.7 1.30 502 +93101300.SEP 4.50 14.2 3151 -13.1 8.0 22.3 31.8 15.0 2.5 2.90 307 +93101800.SEP 4.50 15.7 3958 -10.6 7.0 31.7 30.5 23.2 3.5 2.20 441 +94040300.OUN 4.50 10.1 2075 -17.0 7.6 31.2 39.3 18.7 2.0 2.10 163 +94042600.SEP 4.50 16.3 4409 -11.5 7.4 26.7 26.2 21.2 3.9 3.30 138 +94060800.LBF 4.50 13.0 3400 -9.5 7.8 18.7 18.4 8.1 1.5 2.40 109 +95051700.DDC 4.50 15.6 4878 -10.8 8.5 26.6 40.7 8.9 4.4 2.60 43 +95060500.MAF 4.50 14.9 4358 -8.6 7.6 23.2 32.0 16.0 2.3 2.90 181 +95060900.MAF 4.50 17.8 5653 -8.1 8.1 18.7 33.5 12.8 2.9 2.90 83 +96030700.JAN 4.50 14.0 2362 -12.5 6.8 34.9 36.9 16.8 2.3 0.60 196 +96050500.IAD 4.50 12.1 2432 -15.2 7.2 25.0 25.5 15.9 1.9 1.90 36 +96051000.TOP 4.50 15.6 3884 -11.1 8.8 18.3 22.3 22.1 2.6 3.30 234 +96062700.TFX 4.50 13.9 3835 -10.9 8.3 37.1 44.3 21.8 4.3 1.60 297 +96081100.LBF 4.50 13.3 2360 -8.4 6.2 26.1 22.0 26.5 1.0 2.60 326 +96102100.OUN 4.50 12.7 2995 -12.9 7.5 20.3 28.4 15.6 1.8 3.00 71 +01070300.LBF 4.25 16.7 5584 -8.7 8.5 18.0 24.7 14.2 3.0 4.20 154 +03040600.FWD 4.25 12.4 2487 -14.3 7.3 31.5 51.8 17.1 2.4 2.90 341 +03050500.SGF 4.25 15.7 5169 -13.5 7.6 38.4 50.7 30.0 7.6 2.90 348 +03050518.BNA 4.25 16.0 2730 -12.9 7.1 37.0 37.2 18.3 3.5 -999.00 239 +03051000.MHX 4.25 17.1 4373 -10.5 7.3 22.7 23.2 14.1 3.1 2.10 146 +04040400.MAF 4.25 12.0 2746 -14.7 7.0 19.5 31.1 14.4 1.6 2.70 262 +04052200.AMA 4.25 13.7 4265 -8.7 7.9 21.5 23.9 13.6 2.1 2.10 176 +04053000.OUN 4.25 16.8 4526 -7.5 7.8 24.4 40.4 15.8 2.6 -999.00 224 +04062200.AMA 4.25 13.8 3828 -8.9 8.0 26.2 40.5 17.8 2.3 2.30 141 +04071200.GGW 4.25 11.0 2390 -13.7 8.6 22.3 32.0 17.1 1.6 1.90 99 +04071300.LBF 4.25 19.5 7183 -7.3 8.6 14.7 20.5 10.3 3.1 3.70 68 +04071318.ILX 4.25 22.1 6811 -10.9 7.9 18.7 21.9 15.5 5.8 2.60 131 +04081000.DNR 4.25 12.9 3415 -9.1 8.0 15.0 15.4 16.2 1.2 3.20 270 +05031400.JAN 4.25 11.1 1382 -15.7 7.6 25.5 49.7 19.2 1.1 2.80 161 +05042000.LBF 4.25 10.1 2460 -15.7 8.9 15.3 22.3 16.6 1.3 2.90 255 +05042200.SGF 4.25 12.6 2944 -13.3 6.8 21.3 15.6 15.1 1.7 2.20 193 +07080400.RAP 4.25 15.6 2983 -4.1 6.2 22.7 35.8 18.3 0.6 0.90 270 +08020600.SHV 4.25 13.5 2312 -14.1 7.3 32.4 43.7 25.8 2.5 1.80 212 +02042000.MAF 4.00 12.9 2974 -8.1 6.9 24.3 41.7 19.0 1.2 2.50 133 +02061300.DDC 4.00 19.5 6234 -6.9 7.6 19.8 32.7 17.2 3.0 3.70 126 +03050300.BMX 4.00 15.2 4593 -15.7 7.9 32.4 30.5 8.1 6.7 2.90 51 +04071318.DVN 4.00 20.8 6090 -11.1 8.4 25.9 22.3 22.5 7.3 2.80 191 +06050600.MAF 4.00 12.4 3533 -12.3 8.2 33.6 48.0 19.3 3.5 2.00 174 +06071700.INL 4.00 14.1 3719 -11.1 8.4 26.3 29.8 19.9 3.1 2.40 328 +06092221.SGF 4.00 17.6 5071 -6.7 5.3 31.6 37.0 21.0 2.4 1.10 202 +89061100.AMA 4.00 15.8 3666 -8.7 7.6 11.0 19.2 11.1 1.0 -999.00 87 +89062700.DDC 4.00 14.3 2840 -8.4 7.6 19.4 19.2 12.7 1.2 2.20 167 +89071800.LBF 4.00 15.4 3622 -9.4 8.1 38.9 37.6 22.9 3.9 2.90 361 +90051500.AMA 4.00 14.8 4543 -9.9 8.2 24.7 33.8 19.2 3.2 2.20 473 +90051900.AMA 4.00 11.5 2732 -9.3 7.7 26.1 30.4 18.5 1.4 2.10 301 +90060900.TOP 4.00 18.5 5571 -10.1 7.3 22.6 16.4 14.8 4.1 2.70 252 +90070100.DAY 4.00 16.6 3541 -9.4 7.1 19.9 24.5 8.6 1.8 1.80 154 +90090200.RAP 4.00 11.3 1762 -7.4 7.5 23.6 32.7 14.1 0.6 2.10 181 +91041300.SEP 4.00 16.9 5008 -10.6 6.8 21.8 27.4 12.2 3.2 3.40 137 +93071600.RAP 4.00 14.1 3230 -7.5 7.7 25.0 35.8 18.6 1.6 3.20 97 +93072300.HON 4.00 15.7 3720 -8.1 6.0 19.1 22.5 15.4 1.3 1.50 130 +95050600.FTD 4.00 15.1 2036 -11.1 7.1 21.2 37.5 20.8 1.2 0.60 304 +95051600.JAN 4.00 17.9 4861 -10.9 7.8 14.9 18.5 8.6 2.6 2.50 -35 +95072500.FTD 4.00 15.4 2897 -10.0 9.2 19.1 19.8 12.8 1.9 -999.00 168 +95072600.DDC 4.00 18.3 5696 -10.1 8.8 21.3 19.2 17.1 4.7 3.30 238 +95102700.SGF 4.00 12.5 2166 -13.8 6.9 21.9 29.4 25.7 1.3 1.60 267 +96052300.LBF 4.00 13.5 2915 -11.1 8.0 27.8 43.7 18.5 2.3 2.90 303 +97082200.LBF 4.00 15.7 3974 -9.7 7.4 26.4 37.5 17.4 2.8 3.30 321 +98050800.FFC 4.00 17.3 4120 -12.3 7.7 31.0 51.6 17.1 5.0 2.20 172 +98063000.TOP 4.00 21.8 6490 -5.3 7.2 24.4 32.6 18.1 3.1 1.70 230 +03040400.OUN 3.75 11.9 2640 -15.1 7.3 24.0 23.9 13.4 2.0 2.30 187 +95051900.BMX 3.75 16.5 3370 -9.9 6.6 20.6 25.5 16.9 1.8 0.60 246 +01040400.SGF 3.65 12.8 3277 -15.1 8.3 22.4 28.9 17.2 2.8 3.10 310 +01041500.DDC 3.65 13.1 3892 -18.3 9.0 43.1 54.7 24.4 8.6 2.50 233 +01050700.LZK 3.65 14.7 3512 -12.9 5.9 18.7 26.3 7.3 1.8 3.40 77 +01050700.SHV 3.65 14.8 2945 -12.5 6.5 15.7 22.1 9.0 1.3 1.70 110 +01051800.AMA 3.65 13.9 4695 -10.5 8.6 13.2 22.8 16.1 1.8 2.10 86 +01052500.JAN 3.65 13.5 3446 -15.1 7.5 21.8 31.4 17.4 2.7 2.70 240 +01061400.DDC 3.65 15.7 5244 -8.9 8.0 28.1 28.2 19.8 3.9 2.50 384 +01062100.DDC 3.65 15.2 4428 -10.7 7.8 19.0 25.2 13.4 2.5 3.20 400 +01071800.ABR 3.65 17.5 5177 -9.9 8.4 19.5 28.2 9.6 3.5 3.90 136 +01072100.GGW 3.65 13.5 3114 -10.7 7.7 28.3 30.5 15.8 2.3 2.80 354 +02051100.MAF 3.65 14.5 4658 -9.3 8.4 23.1 40.3 14.8 2.9 2.20 132 +02051200.TOP 3.65 15.8 4489 -11.9 8.1 26.0 26.5 13.7 4.2 3.30 224 +02060500.RNK 3.65 17.9 5399 -9.7 6.9 4.0 7.3 8.7 0.6 3.20 54 +02062400.ABR 3.65 17.2 5093 -10.5 8.2 26.3 30.9 16.9 4.7 3.50 187 +02091900.OUN 3.65 15.7 4268 -6.1 6.7 20.8 23.4 17.8 1.4 3.00 308 +03062300.OAX 3.65 18.7 6203 -9.3 8.6 13.6 22.9 12.3 3.0 4.20 237 +98040800.ILX 3.65 10.2 1354 -19.7 7.2 21.2 25.1 20.1 1.0 2.60 180 +98052200.SGF 3.65 17.1 4719 -9.9 7.8 22.4 23.1 13.8 3.3 2.30 232 +99030600.LZK 3.65 11.7 1922 -18.5 8.2 22.8 39.2 21.4 1.9 2.10 360 +99050400.OUN 3.65 15.6 5195 -14.9 8.4 21.3 22.0 16.5 5.1 4.70 343 +99072600.LBF 3.65 16.4 4375 -6.7 7.9 12.9 16.1 9.5 1.2 2.60 60 +01041000.SGF 3.50 13.0 3476 -14.5 7.9 21.6 30.3 12.5 2.7 2.60 141 +01061500.FWD 3.50 17.3 4260 -9.7 7.9 15.1 9.7 11.1 2.0 2.20 74 +02081200.DDC 3.50 14.0 3415 -8.7 8.0 15.7 27.7 10.7 1.2 3.10 157 +89070300.STC 3.50 15.6 3556 -8.2 7.0 15.8 21.4 8.5 1.2 1.40 128 +90031400.OUN 3.50 14.6 3950 -16.1 7.2 20.2 49.4 12.3 3.2 2.90 169 +90040600.SEP 3.50 12.4 3764 -14.9 7.8 25.2 36.8 15.4 3.3 2.30 305 +90060900.IAD 3.50 17.2 3994 -10.9 7.1 23.7 20.0 18.3 3.0 0.90 203 +90061900.BIS 3.50 11.1 1968 -13.5 8.2 28.4 38.0 17.4 1.6 2.90 257 +96062000.OAX 3.50 16.3 4081 -9.8 8.6 19.0 24.4 18.9 2.5 -999.00 271 +97062100.LBF 3.50 17.3 6058 -9.3 8.8 23.1 25.1 13.9 4.7 3.70 129 +98052100.TOP 3.50 16.5 4680 -12.5 8.4 10.5 23.7 9.8 2.0 3.80 100 +98052500.OUN 3.50 18.0 5688 -10.7 8.1 21.9 28.7 9.9 4.6 4.20 172 +98062000.OUN 3.50 19.0 6048 -7.1 7.8 15.4 11.2 13.7 2.3 3.90 209 +06070200.GRB 3.25 15.4 3255 -9.3 6.6 17.0 24.9 14.7 1.2 1.50 99 +91060500.DDC 3.25 16.9 4631 -7.9 6.5 15.3 15.4 11.0 1.5 3.50 74 +00050400.FWD 3.00 13.2 2731 -14.3 6.3 21.7 28.5 19.0 1.7 3.00 327 +00062900.MAF 3.00 14.8 3565 -6.3 6.3 10.5 16.7 9.6 0.5 1.80 29 +00080600.OAX 3.00 19.0 5525 -7.1 7.5 15.0 22.8 9.4 2.0 3.10 56 +01051900.LZK 3.00 16.6 4269 -12.5 8.1 18.5 25.8 9.9 3.2 2.70 98 +01053000.AMA 3.00 16.4 5827 -9.7 8.2 26.1 29.7 25.0 4.7 2.80 268 +01090900.FWD 3.00 17.1 4304 -8.9 8.2 14.1 12.0 7.7 1.8 2.70 97 +03042100.SHV 3.00 15.5 2947 -13.5 7.5 24.0 38.0 14.3 2.6 0.90 110 +03050420.SGF 3.00 15.8 4524 -11.9 7.1 35.4 47.9 25.2 5.1 3.20 480 +03062400.LBF 3.00 18.6 6189 -8.7 8.1 30.8 31.6 21.7 5.9 4.80 381 +03062800.DDC 3.00 11.4 2329 -9.3 6.7 16.9 26.8 10.8 0.7 2.20 138 +04041900.OAX 3.00 11.9 3136 -15.1 8.2 33.8 44.9 20.5 3.7 1.90 394 +04042200.OUN 3.00 12.2 2363 -13.5 7.0 24.3 33.8 16.9 1.6 2.70 385 +04051700.DDC 3.00 10.0 2200 -11.9 8.4 31.7 30.2 20.5 1.6 1.50 390 +04052300.OAX 3.00 15.6 4333 -12.3 7.6 32.4 28.9 19.6 4.9 3.00 289 +04070200.AMA 3.00 16.9 5137 -8.1 7.4 14.0 16.6 18.0 1.7 3.00 80 +04081000.DDC 3.00 14.6 3147 -9.7 7.7 21.0 22.0 13.0 1.7 3.00 222 +06042412.LMN 3.00 14.1 3248 -12.9 8.2 25.4 28.7 16.6 2.9 3.20 413 +06042500.OUN 3.00 15.5 4007 -12.3 8.6 20.1 21.2 15.4 3.2 3.30 105 +06052500.SGF 3.00 15.6 3470 -11.1 7.6 14.3 7.3 13.6 1.5 2.00 162 +06052700.BNA 3.00 16.1 3535 -8.3 5.9 12.8 17.2 17.7 0.9 0.70 196 +06052800.BIS 3.00 12.5 3434 -11.1 8.1 11.3 12.7 10.5 1.0 1.80 74 +72081200.YRM 3.00 10.9 1989 -14.2 8.3 24.6 35.0 14.0 1.5 2.40 132 +89060500.OUN 3.00 12.5 1640 -11.6 7.0 15.7 23.9 8.8 0.6 0.70 53 +89060700.AMA 3.00 15.4 4752 -9.5 8.5 30.5 55.6 21.7 4.3 2.40 303 +90051500.OUN 3.00 16.8 4798 -10.7 7.8 19.8 29.7 12.5 3.2 4.20 186 +90052700.OUN 3.00 17.5 4621 -8.8 7.6 23.8 25.1 20.4 3.1 3.20 255 +91032700.TOP 3.00 12.7 2763 -12.3 6.8 27.7 31.7 21.6 1.9 2.50 279 +91040912.1M1 3.00 14.2 3450 -15.2 8.0 19.7 20.8 11.5 2.8 -999.00 134 +91052700.DDC 3.00 17.0 5493 -10.5 8.4 21.7 29.3 13.3 4.2 2.90 81 +92032600.TBW 3.00 12.6 2104 -14.0 6.5 32.2 37.0 18.6 1.8 1.10 195 +92062700.MAF 3.00 13.9 3224 -8.2 7.7 23.7 38.8 13.0 1.6 2.50 253 +92070500.OVN 3.00 17.3 5051 -9.3 7.4 21.8 33.3 16.1 3.1 3.50 243 +93050600.MAF 3.00 13.9 3784 -9.6 7.2 27.0 25.4 18.6 2.3 2.50 149 +93060600.HAT 3.00 16.0 4948 -13.5 8.3 15.5 17.2 12.6 3.2 3.90 70 +93070200.DDC 3.00 17.1 4895 -5.2 7.2 16.4 21.4 13.3 1.2 2.80 237 +93070900.OVN 3.00 19.7 5546 -6.8 6.9 29.4 24.3 16.9 3.6 0.60 345 +93082300.DDC 3.00 13.3 2608 -7.8 7.7 19.5 27.0 13.1 1.0 2.00 83 +93091900.AMA 3.00 12.4 1911 -9.0 7.7 32.7 35.4 16.5 1.3 2.40 264 +93091900.DDC 3.00 12.4 1954 -10.4 7.2 29.5 46.6 16.8 1.3 2.80 233 +94032800.CKL 3.00 15.3 2066 -9.6 6.3 38.6 36.3 30.5 1.8 0.60 429 +94052600.FNT 3.00 10.8 2240 -16.3 6.1 17.8 25.8 12.8 1.0 2.40 113 +94060600.DDC 3.00 14.8 4882 -8.8 8.7 15.6 18.6 13.1 2.0 2.10 248 +95021400.PBI 3.00 16.5 2433 -11.0 5.9 27.1 33.4 13.8 1.7 0.60 117 +95043000.FTD 3.00 15.0 4416 -13.3 8.1 21.9 31.7 15.6 3.7 3.40 166 +95062300.LBF 3.00 12.9 2962 -11.1 7.9 21.0 19.8 15.3 1.7 2.80 220 +95071500.LBF 3.00 14.4 3052 -7.0 6.5 15.9 24.7 13.9 0.8 2.10 159 +95072400.DDC 3.00 15.9 3645 -9.9 8.2 18.2 32.6 11.8 2.0 3.60 31 +95082300.INL 3.00 15.4 3023 -11.6 8.0 30.9 26.5 25.4 3.2 2.10 694 +95082700.GGW 3.00 11.7 3094 -12.6 8.3 26.8 41.0 13.6 2.4 1.70 162 +96033100.SHV 3.00 12.7 2891 -17.1 7.6 27.4 35.5 20.1 3.1 3.10 163 +96042000.ILX 3.00 12.9 2394 -14.6 7.1 27.0 39.5 16.4 2.1 -999.00 249 +96052700.OUN 3.00 15.2 3034 -9.4 6.9 29.8 33.6 22.5 2.1 2.00 330 +96061400.UNR 3.00 13.1 3801 -11.0 8.4 18.0 14.8 12.4 2.0 2.00 63 +96062012.LBF 3.00 15.2 3418 -8.6 7.9 22.6 25.0 16.5 1.9 3.30 380 +96070800.LBF 3.00 15.3 3341 -6.4 7.0 30.0 41.5 20.6 1.6 2.20 390 +97052600.OUN 3.00 17.2 5143 -7.7 5.9 30.4 32.4 15.0 2.9 2.60 148 +97061000.FWD 3.00 15.6 2699 -9.9 7.0 18.7 24.1 10.9 1.3 1.30 98 +98052400.DDC 3.00 11.6 2630 -12.9 6.7 22.0 27.7 9.8 1.4 2.30 101 +98061400.OAX 3.00 13.3 2830 -10.5 7.7 24.4 45.4 15.3 1.8 3.40 219 +98062500.ABR 3.00 16.3 4448 -13.7 8.8 17.4 28.7 11.2 3.6 3.70 42 +98062500.BIS 3.00 15.5 4591 -13.3 8.1 15.9 15.4 15.5 2.9 3.00 89 +98062900.TOP 3.00 22.0 6895 -7.7 7.0 20.6 27.3 19.3 4.0 2.40 335 +99060200.FWD 3.00 17.3 4928 -11.5 8.8 15.0 30.3 15.3 3.1 4.50 171 +00022500.AMA 2.75 10.3 3614 -18.5 8.5 26.8 48.5 13.1 3.8 1.70 107 +00051300.DTX 2.75 16.9 4524 -8.5 7.7 24.1 18.5 20.2 2.9 2.40 328 +00052700.OUN 2.75 18.3 5870 -10.1 8.4 21.5 32.8 12.8 4.6 4.00 117 +00061200.BIS 2.75 11.3 2000 -13.1 7.5 22.0 28.0 10.2 1.2 2.50 306 +00061400.AMA 2.75 16.5 5758 -4.9 7.6 23.8 32.0 19.9 2.0 2.50 244 +00062000.LBF 2.75 14.9 4028 -8.5 6.8 18.8 23.9 11.9 1.6 3.00 96 +00071000.GGW 2.75 15.6 3180 -10.9 7.0 18.4 13.5 23.2 1.7 2.60 248 +00071000.LBF 2.75 18.1 5871 -5.5 7.8 14.3 19.9 10.7 1.5 3.50 146 +00071700.MHX 2.75 15.1 2929 -12.3 7.2 18.2 29.9 7.9 1.7 2.30 81 +00072100.LBF 2.75 15.3 3073 -11.3 7.8 26.5 39.4 16.9 2.6 2.00 223 +00072500.LBF 2.75 17.1 5901 -8.9 8.5 24.5 29.4 22.2 4.4 2.90 162 +00072700.OAX 2.75 18.5 5048 -9.7 8.0 21.8 23.2 16.7 3.8 2.60 215 +00121618.BMX 2.75 13.2 2219 -14.1 6.7 32.9 45.8 25.0 2.2 0.90 266 +01040400.LZK 2.75 15.2 4223 -15.1 8.5 18.1 24.8 11.9 3.5 3.10 105 +01042100.OAX 2.75 12.4 3283 -15.3 7.7 28.1 32.7 23.5 3.2 2.40 282 +01050620.LMN 2.75 15.4 4496 -16.1 7.3 11.5 20.9 7.3 2.2 3.10 60 +01052500.FFC 2.75 11.7 2338 -14.5 6.4 18.1 21.4 19.6 1.1 2.50 240 +01060600.AMA 2.75 14.9 4665 -8.9 7.2 15.8 15.6 11.9 1.7 2.30 191 +01060800.DNR 2.75 13.9 3440 -8.7 7.2 25.3 21.9 7.4 1.8 3.10 -26 +01061000.ABR 2.75 13.8 3453 -12.1 7.8 24.6 32.3 16.6 2.6 3.60 158 +01061400.OAX 2.75 17.2 4956 -11.3 9.0 20.4 25.5 18.5 4.2 3.80 153 +01061700.LMN 2.75 14.1 4093 -10.7 8.0 19.4 26.9 9.3 2.3 3.50 195 +01061700.TOP 2.75 15.7 4594 -13.7 8.5 22.1 26.6 15.7 4.4 3.40 214 +01061900.MPX 2.75 15.6 5114 -11.9 9.2 33.1 31.9 19.0 6.9 3.40 154 +01070100.RAP 2.75 14.3 3235 -10.7 7.7 30.8 40.7 12.9 2.8 2.60 114 +01071800.INL 2.75 17.0 4580 -12.9 7.8 11.9 12.8 11.8 2.2 0.80 154 +01071900.ABR 2.75 17.5 5356 -10.5 8.8 18.1 22.7 3.4 3.7 2.70 35 +01071900.BIS 2.75 17.8 5738 -9.9 8.6 21.8 28.8 14.1 4.5 2.90 183 +01072500.GGW 2.75 11.5 1714 -11.3 6.9 26.7 32.1 18.2 1.0 2.20 350 +01112418.BMX 2.75 15.1 2902 -11.3 6.1 26.9 31.9 22.2 1.9 0.80 328 +02051800.DRT 2.75 16.0 5077 -10.5 8.1 8.8 6.3 5.2 1.5 2.60 15 +02052400.AMA 2.75 13.8 4729 -13.3 8.3 28.8 21.8 18.5 4.9 2.30 258 +02060500.AMA 2.75 13.2 2947 -11.5 7.6 32.1 45.0 17.9 2.6 2.70 309 +02061300.AMA 2.75 13.7 3027 -8.5 8.4 29.6 33.0 18.7 2.1 2.50 65 +02062400.BIS 2.75 16.0 3559 -9.7 6.8 28.0 24.8 25.2 2.5 2.40 298 +02062500.ABR 2.75 15.1 4208 -7.1 6.8 19.1 19.3 11.1 1.4 3.10 20 +02072000.TOP 2.75 17.5 4986 -7.5 7.3 10.0 12.7 8.5 1.1 2.70 197 +02072700.TOP 2.75 19.3 6406 -5.3 6.9 18.2 19.3 9.1 2.0 2.60 131 +02081200.LBF 2.75 13.3 3735 -9.9 8.7 13.1 11.8 10.5 1.3 2.10 222 +03031300.SHV 2.75 13.5 2901 -15.3 7.1 17.1 24.1 11.0 1.7 2.00 162 +03040618.LZK 2.75 13.1 2556 -15.9 7.6 35.1 38.9 28.4 3.4 3.10 600 +03042500.LZK 2.75 13.8 3423 -15.7 7.6 20.9 31.0 20.0 2.8 3.30 212 +03042600.BMX 2.75 14.2 3921 -13.3 6.2 35.8 33.5 26.6 3.9 2.70 89 +03042900.SGF 2.75 13.1 3399 -16.7 8.5 5.0 19.6 4.8 0.7 2.80 53 +03050100.TOP 2.75 13.0 3922 -14.1 7.8 17.2 19.6 13.9 2.3 2.70 117 +03050618.SGF 2.75 15.6 5492 -14.7 7.7 32.0 40.6 17.8 7.4 2.80 313 +03050700.FWD 2.75 17.8 5303 -9.7 7.1 30.4 36.2 8.4 4.7 3.50 126 +03051000.OUN 2.75 16.8 5328 -11.1 8.3 27.5 34.8 16.8 5.4 3.60 182 +03051400.SHV 2.75 16.7 3920 -9.5 7.2 27.2 37.0 19.3 2.9 0.80 389 +03051600.AMA 2.75 14.1 3706 -10.3 8.9 42.9 37.7 34.9 4.9 -999.00 632 +03051700.SHV 2.75 16.3 3995 -10.9 7.4 23.2 13.9 19.6 2.9 2.70 242 +03060500.AMA 2.75 11.9 2647 -11.9 7.6 23.0 28.5 13.1 1.5 2.10 167 +03061400.AMA 2.75 12.3 3153 -13.3 8.3 21.7 24.7 13.7 2.2 2.10 35 +03091000.DDC 2.75 14.8 3620 -7.7 7.5 12.1 15.8 11.3 0.9 3.00 233 +03091100.MAF 2.75 13.3 2808 -6.5 6.8 10.3 9.0 7.4 0.4 1.40 80 +03100600.AMA 2.75 12.2 2542 -10.3 6.4 24.1 30.2 12.9 1.2 2.50 50 +04032718.DDC 2.75 13.2 4133 -17.3 8.0 24.6 26.6 14.4 4.4 2.30 143 +04032800.OUN 2.75 12.6 2904 -15.9 7.8 23.3 31.1 16.4 2.5 2.80 315 +04040500.CRP 2.75 14.9 2478 -12.1 6.7 22.4 20.6 7.0 1.6 0.60 184 +04050600.WAL 2.75 9.3 1861 -21.3 7.2 20.2 28.3 21.3 1.3 1.40 239 +04051100.DNR 2.75 10.6 3995 -12.9 9.2 28.3 16.6 18.2 3.4 1.50 379 +04051223.LMN 2.75 15.9 4076 -10.5 7.4 22.7 30.4 21.9 2.7 2.40 304 +04051300.OUN 2.75 16.8 5740 -11.5 8.2 15.2 20.9 12.4 3.3 3.60 131 +04053000.TOP 2.75 15.9 3882 -12.9 8.7 22.4 15.3 14.8 3.7 3.20 295 +04060300.FWD 2.75 16.9 4767 -11.1 8.7 19.1 24.1 14.1 3.5 -999.00 157 +04070500.DDC 2.75 14.3 3819 -10.3 8.3 18.6 30.5 14.4 2.1 2.50 161 +05022200.FFC 2.75 11.4 1389 -16.3 7.0 28.5 35.4 20.7 1.2 1.70 225 +05041800.AMA 2.75 9.4 1767 -17.3 8.7 19.6 22.9 15.5 1.2 1.90 211 +05042100.DDC 2.75 13.2 4722 -15.3 8.6 16.1 14.9 15.2 3.1 2.10 174 +05042300.JAN 2.75 13.6 2558 -14.7 7.1 28.5 34.1 19.9 2.5 2.70 183 +05051000.FWD 2.75 15.5 4841 -11.5 6.7 18.0 25.9 9.5 2.5 2.90 152 +05092300.ILX 2.75 14.1 1858 -8.1 6.9 21.5 16.8 11.5 0.7 0.80 121 +06031218.TOP 2.75 12.6 2814 -17.9 8.5 44.8 54.9 33.9 5.7 2.70 723 +06041400.DVN 2.75 11.2 1524 -15.7 8.3 30.6 30.3 15.8 1.6 3.40 263 +06042000.BMX 2.75 13.1 2242 -11.9 7.1 21.7 27.0 11.3 1.3 2.10 122 +06050300.DRT 2.75 13.7 3549 -12.1 8.5 14.2 19.0 5.1 1.7 2.10 74 +06050500.MAF 2.75 11.5 3709 -12.1 8.1 27.6 34.4 21.7 2.7 1.70 372 +06050718.CHS 2.75 12.9 2580 -12.5 6.0 17.7 18.8 15.9 1.1 2.00 177 +06050800.MAF 2.75 11.9 2440 -12.5 8.0 33.3 51.2 22.1 2.3 2.30 327 +06062200.DDC 2.75 12.7 2406 -8.7 8.1 21.1 24.9 11.0 1.1 2.40 175 +06081000.BIS 2.75 13.0 2589 -8.9 7.5 19.1 18.8 8.8 1.0 2.60 147 +06082600.DDC 2.75 16.5 3488 -5.5 6.5 20.2 26.5 17.6 1.0 0.80 141 +07021400.BMX 2.75 9.9 1032 -19.1 7.0 20.7 36.3 19.5 0.7 2.40 245 +58042200.FWH 2.75 13.3 3338 -16.1 7.8 37.0 49.4 25.5 4.9 2.40 276 +89060200.MAF 2.75 14.1 3193 -10.4 7.9 24.5 27.4 8.5 2.2 2.80 104 +89060300.MAF 2.75 11.9 2291 -8.4 7.6 19.3 32.2 13.3 0.8 2.20 147 +89060300.TOP 2.75 13.7 2623 -12.6 7.0 19.5 39.7 12.4 1.5 2.00 118 +89061300.AMA 2.75 14.4 3611 -10.8 8.1 15.8 22.1 9.9 1.7 3.00 79 +89062600.RAP 2.75 11.5 2246 -13.8 7.8 31.3 30.4 20.0 2.1 2.60 301 +89081600.AMA 2.75 12.8 2669 -7.1 6.9 17.0 24.9 10.5 0.7 2.50 158 +89082200.HON 2.75 15.6 4160 -9.4 6.9 22.9 28.9 14.8 2.3 3.30 107 +89082200.OMA 2.75 17.9 4223 -8.3 7.0 22.2 45.4 15.0 2.3 0.90 138 +89082200.STC 2.75 16.2 3346 -11.1 6.9 20.6 30.6 11.9 2.0 1.20 173 +89082900.STC 2.75 14.6 1959 -10.0 6.8 26.3 44.7 18.0 1.2 1.10 147 +89090400.LBF 2.75 17.3 4599 -8.6 8.3 29.6 38.8 8.6 4.0 3.30 223 +90021600.JAN 2.75 15.2 2047 -10.9 6.6 20.9 34.6 18.9 1.1 -999.00 124 +90031400.PIA 2.75 12.4 2115 -14.4 6.9 18.1 24.1 15.3 1.1 2.60 206 +90041700.OUN 2.75 13.6 3717 -15.0 8.3 11.5 20.5 17.2 1.7 3.80 152 +90042800.GGG 2.75 12.9 2263 -14.9 6.6 14.1 25.3 12.8 1.0 2.80 84 +90050100.AHN 2.75 14.9 4557 -12.6 7.7 14.7 9.3 19.7 2.3 3.40 92 +90051700.GGG 2.75 17.5 3234 -8.3 7.2 24.7 35.1 17.6 2.0 0.60 304 +90051900.LBF 2.75 12.1 3954 -13.9 8.6 25.1 24.6 16.2 3.4 2.00 398 +90052000.OUN 2.75 15.3 4565 -10.8 7.1 13.7 14.7 12.1 1.8 3.10 94 +90053100.GGG 2.75 19.3 4743 -5.7 6.1 27.2 25.7 21.5 2.1 0.70 317 +90060200.LBF 2.75 13.6 3719 -10.8 7.9 15.6 29.4 16.4 1.6 2.40 89 +90060200.STC 2.75 13.4 2697 -13.3 8.5 18.6 17.2 10.4 1.8 2.20 132 +90061900.LBF 2.75 19.2 7070 -6.1 8.4 30.2 38.1 18.5 5.0 3.60 266 +90070300.BIS 2.75 21.3 6982 -6.3 8.2 23.0 29.6 14.9 4.2 4.60 172 +90070700.BIS 2.75 14.9 3274 -7.5 6.9 19.0 25.7 12.9 1.1 2.20 316 +90081100.LBF 2.75 14.8 3971 -9.0 7.5 25.6 21.5 14.3 2.4 2.90 282 +90082800.SSM 2.75 18.2 5115 -8.5 6.2 31.6 29.9 20.5 3.7 1.10 334 +90090600.STC 2.75 19.5 4899 -6.8 6.2 21.0 17.1 14.7 2.0 1.00 294 +91032200.UMN 2.75 11.5 2632 -15.3 7.0 33.0 35.3 18.8 2.5 2.50 371 +91032700.DDC 2.75 12.4 3132 -14.2 8.2 40.7 44.0 18.9 4.4 2.10 160 +91040300.OUN 2.75 10.1 1560 -19.8 7.3 22.6 41.7 15.1 1.2 1.50 275 +91041300.OUN 2.75 14.1 4063 -13.7 8.0 22.0 25.1 17.1 3.3 2.90 205 +91042700.GGG 2.75 18.9 5164 -10.7 8.2 18.9 27.6 12.4 3.8 2.70 209 +91042700.OUN 2.75 16.6 4751 -11.5 7.0 23.6 26.4 20.6 3.6 3.70 376 +91042800.GGG 2.75 18.9 4554 -10.5 7.2 29.5 19.6 15.4 4.6 2.20 140 +91051100.AMA 2.75 15.6 5629 -10.7 9.0 16.5 21.5 14.5 3.3 2.50 314 +91051200.RAP 2.75 14.1 4430 -11.0 7.9 23.5 33.5 26.6 3.0 2.50 437 +91051700.UMN 2.75 15.9 3299 -10.6 7.6 16.1 11.8 14.4 1.6 1.90 174 +91051800.UMN 2.75 15.1 3444 -11.0 7.4 11.9 21.0 9.4 1.2 1.20 59 +91052500.AMA 2.75 13.7 3416 -10.5 7.0 17.4 13.8 17.0 1.4 2.50 124 +91053000.OVN 2.75 16.8 4446 -10.2 6.8 18.2 19.0 14.3 2.2 2.70 31 +91053000.RAP 2.75 10.9 2814 -15.7 8.1 14.5 28.4 13.0 1.3 2.00 159 +91060500.OVN 2.75 14.6 2813 -10.1 6.5 17.1 19.6 8.4 1.1 3.10 177 +91061500.BIS 2.75 13.0 2379 -11.9 6.6 22.5 25.2 13.2 1.3 2.60 152 +91061500.GRB 2.75 17.6 3430 -8.7 6.7 13.9 17.0 21.7 1.2 0.60 161 +91061900.LBF 2.75 13.0 3600 -12.0 8.6 15.2 20.9 13.5 1.7 2.60 219 +91062000.HON 2.75 13.9 2691 -10.5 7.0 22.1 20.0 16.1 1.4 1.20 282 +91070500.BIS 2.75 13.3 2941 -9.3 6.4 21.4 26.6 19.3 1.2 2.40 206 +91070500.GGW 2.75 11.4 2308 -9.9 7.0 17.5 23.9 6.7 0.8 2.20 144 +91072200.HON 2.75 19.3 4474 -6.8 7.2 17.3 24.1 11.1 1.7 -999.00 198 +92021500.UMN 2.75 10.2 1724 -16.9 6.4 33.2 28.2 24.2 1.5 2.20 289 +92030600.1M1 2.75 11.5 2572 -21.1 7.2 22.5 26.7 17.3 2.4 2.30 194 +92060500.AMA 2.75 13.4 2870 -9.4 7.5 17.5 25.9 12.2 1.1 2.60 249 +92061200.MAF 2.75 13.8 2387 -8.2 7.4 26.7 34.6 13.3 1.3 2.00 178 +92061300.AMA 2.75 14.7 2821 -8.8 7.2 19.1 36.4 12.0 1.2 2.70 165 +92061900.BIS 2.75 11.0 1791 -14.4 6.9 27.4 24.4 13.0 1.3 2.50 106 +92061900.DDC 2.75 12.8 2598 -8.3 7.9 25.1 40.5 15.7 1.3 2.70 114 +92062700.AMA 2.75 14.1 3165 -10.0 7.7 16.6 29.9 12.4 1.4 2.90 191 +92073000.LBF 2.75 15.0 3544 -10.3 7.9 25.7 33.8 22.0 2.6 3.00 335 +92101600.SEP 2.75 14.6 3654 -12.1 7.7 16.4 22.7 12.6 1.9 2.90 227 +93033100.1M1 2.75 11.9 2471 -15.1 7.2 30.2 27.1 17.8 2.3 2.80 54 +93033100.UMN 2.75 11.1 2598 -16.5 6.4 29.7 28.9 19.7 2.2 2.10 117 +93040200.WAL 2.75 10.9 1625 -18.5 7.3 30.7 48.4 26.8 1.7 2.40 200 +93042000.GGG 2.75 12.4 2342 -13.3 8.0 26.7 28.4 17.5 2.0 2.70 156 +93042500.UMN 2.75 11.4 2317 -14.6 6.9 25.2 33.1 18.2 1.6 2.40 198 +93042800.MAF 2.75 10.4 1494 -10.6 6.9 19.6 25.8 12.9 0.5 1.80 150 +93042900.MAF 2.75 11.7 2435 -10.9 7.1 29.3 37.4 20.8 1.5 2.20 551 +93050100.AMA 2.75 11.6 4085 -14.5 8.1 25.7 15.8 15.3 3.4 1.90 234 +93050600.AMA 2.75 13.2 4478 -13.6 8.6 34.6 38.4 16.6 5.7 2.00 340 +93051600.DDC 2.75 12.8 3614 -9.8 6.6 19.4 23.7 12.6 1.4 2.50 161 +93061900.AMA 2.75 12.8 2140 -7.8 7.0 22.7 23.3 14.4 0.8 1.90 146 +93062400.DEN 2.75 11.7 3442 -9.6 8.8 32.0 42.3 15.8 2.6 1.80 211 +93062400.LBF 2.75 16.0 3944 -8.6 8.1 21.9 33.8 18.1 2.3 2.80 178 +93070500.DDC 2.75 17.1 4186 -5.4 6.7 30.6 34.9 16.6 1.9 1.20 146 +93070700.AMA 2.75 17.0 5327 -4.7 7.8 21.3 20.0 11.4 1.7 3.80 127 +93070700.DDC 2.75 17.0 5334 -6.0 7.2 27.9 28.2 16.5 2.6 3.10 154 +93090400.IAD 2.75 15.6 2779 -5.9 5.7 15.2 15.6 12.4 0.5 0.60 149 +93101300.CRP 2.75 17.3 4367 -8.6 6.3 20.2 29.8 14.8 2.0 1.50 227 +93101900.GGG 2.75 15.7 3105 -9.8 6.9 23.5 33.9 10.3 1.9 0.70 105 +93102000.DRT 2.75 15.5 3433 -8.9 6.4 25.4 34.0 13.4 1.8 1.60 35 +94012700.GGG 2.75 13.2 2167 -15.9 6.8 31.0 32.3 17.5 2.3 0.70 306 +94041100.UMN 2.75 12.6 2040 -16.5 7.6 37.8 45.4 19.9 2.9 2.50 486 +94052500.OUN 2.75 15.0 3912 -11.5 7.4 22.0 36.2 13.2 2.6 3.00 122 +94053000.SEP 2.75 17.5 5032 -10.6 8.2 27.0 23.8 16.1 4.9 3.90 291 +94060500.HON 2.75 14.2 3871 -11.6 8.5 21.4 19.2 12.0 2.8 2.40 202 +94060600.TOP 2.75 16.5 3953 -9.3 8.1 16.1 27.7 15.4 1.9 2.50 394 +94061100.AMA 2.75 12.3 2164 -8.3 7.3 19.5 20.3 16.6 0.7 2.80 229 +94061200.AMA 2.75 14.7 4015 -8.0 7.8 26.7 19.9 18.4 2.3 2.70 302 +94061200.TOP 2.75 13.9 2320 -9.5 6.6 23.9 24.4 15.8 1.2 0.90 117 +94061800.AMA 2.75 11.9 2676 -7.0 8.2 11.0 11.3 10.7 0.5 1.60 171 +94061900.JAN 2.75 16.8 3177 -7.5 5.9 11.5 12.4 3.8 0.6 0.60 42 +94062500.HON 2.75 11.8 1962 -10.8 6.4 27.8 33.5 15.4 1.1 2.20 211 +94062600.JAN 2.75 16.1 2842 -9.5 6.4 24.0 32.8 12.4 1.6 0.90 130 +94070100.STC 2.75 14.3 3701 -11.6 7.3 27.2 25.1 19.0 2.9 2.70 399 +94070200.OAX 2.75 18.5 5257 -10.1 8.0 26.5 25.4 15.5 4.9 3.20 416 +94070700.HON 2.75 16.5 3051 -8.8 7.2 20.5 18.6 10.2 1.5 0.60 159 +95040900.TOP 2.75 10.7 2836 -17.5 9.2 21.4 31.9 16.5 2.5 1.90 120 +95042000.FTD 2.75 14.6 2621 -13.3 7.7 39.5 59.2 25.8 3.7 2.40 498 +95051400.UMN 2.75 16.5 5278 -10.3 6.9 28.0 26.2 22.3 4.1 3.20 211 +95052200.LBF 2.75 10.4 2027 -14.9 7.4 28.3 33.3 18.7 1.6 2.10 221 +95060300.AMA 2.75 12.4 3024 -9.6 8.2 22.4 37.2 15.7 1.6 2.00 346 +95062100.OKX 2.75 17.1 3918 -9.8 7.1 18.4 25.8 11.4 2.1 1.00 18 +95062800.LBF 2.75 12.4 2880 -10.1 7.7 22.0 19.7 13.9 1.5 2.50 208 +95070300.AMA 2.75 14.7 3838 -11.5 8.8 22.8 29.0 8.2 3.1 2.50 115 +95070300.DDC 2.75 14.2 2905 -9.6 6.8 18.2 21.4 12.3 1.2 2.30 111 +95071200.OKX 2.75 13.9 2900 -15.6 6.9 12.7 13.6 8.1 1.3 2.40 48 +95071500.GRB 2.75 19.0 5409 -8.5 8.1 12.1 9.0 8.0 2.0 3.00 69 +95072400.AMA 2.75 13.3 2225 -7.8 8.5 21.6 25.1 13.1 1.0 2.90 124 +95081800.BIS 2.75 18.4 5585 -7.0 7.7 10.6 17.3 10.6 1.4 3.30 142 +96031600.FFC 2.75 9.6 890 -19.2 7.8 28.8 55.2 20.5 0.9 2.20 353 +96042200.OUN 2.75 12.7 2260 -10.9 5.9 38.3 48.8 18.5 1.7 2.30 500 +96042200.TOP 2.75 10.9 1574 -16.6 7.3 45.6 54.3 14.6 2.2 2.30 145 +96051700.UNR 2.75 14.8 4365 -8.1 8.0 25.5 28.7 15.0 2.5 2.50 219 +96051800.OAX 2.75 15.3 4523 -11.1 8.8 16.0 21.2 12.9 2.6 -999.00 68 +96052500.AMA 2.75 13.5 3927 -11.3 9.1 20.3 4.9 16.4 2.6 1.90 101 +96052600.MAF 2.75 14.1 3464 -6.2 7.7 28.7 42.1 22.5 1.6 2.90 240 +96053000.MAF 2.75 14.9 3675 -7.0 7.7 35.1 40.6 19.0 2.4 2.50 321 +96060100.ABR 2.75 12.6 2276 -13.4 6.2 22.4 27.2 24.6 1.3 2.20 370 +96060200.JAN 2.75 16.1 1863 -7.5 5.5 12.7 20.3 11.3 0.4 0.60 168 +96060300.SGF 2.75 11.7 2739 -15.9 7.1 26.4 35.9 14.8 2.3 2.10 90 +96061200.AMA 2.75 11.9 3079 -8.8 8.0 24.3 30.2 18.3 1.5 1.90 373 +96061300.FFC 2.75 13.7 2727 -9.1 5.7 12.9 13.1 12.9 0.6 1.00 152 +96061400.LBF 2.75 12.4 2384 -8.6 6.5 15.4 25.0 12.0 0.6 2.20 102 +96062500.AMA 2.75 13.9 3778 -9.4 8.5 22.9 28.2 7.0 2.3 1.90 123 +96072400.DDC 2.75 14.3 3068 -11.1 8.6 27.6 36.6 16.8 2.8 2.70 203 +96080100.DEN 2.75 13.5 3920 -7.8 8.5 22.6 26.3 15.0 1.9 2.10 276 +96083000.DEN 2.75 11.7 2478 -9.1 7.8 26.2 28.9 17.6 1.3 2.30 86 +96092100.FTD 2.75 16.4 2870 -9.4 6.5 26.4 32.6 15.7 1.8 -999.00 136 +97012500.SIL 2.75 13.0 2563 -16.5 7.5 18.3 25.8 18.3 1.8 2.80 145 +97032900.BNA 2.75 11.1 1618 -15.6 7.4 25.2 15.3 18.1 1.3 3.00 389 +97041100.MAF 2.75 11.9 4076 -15.0 8.2 23.7 30.7 20.8 3.3 2.10 260 +97042100.SGF 2.75 9.4 1773 -16.5 7.4 25.4 23.9 23.3 1.2 2.00 405 +97052700.OUN 2.75 18.0 5907 -8.7 6.4 17.5 23.9 17.6 2.5 3.70 271 +97052700.SGF 2.75 16.3 4440 -9.9 7.0 22.6 25.0 16.3 2.7 2.60 276 +97061200.TOP 2.75 12.6 1552 -11.7 7.1 23.5 30.2 11.6 0.9 0.90 141 +97061600.DDC 2.75 13.5 3187 -10.9 7.7 23.3 39.3 11.9 2.0 2.70 26 +98040900.BMX 2.75 15.8 3341 -13.9 7.9 40.1 51.5 25.9 5.5 2.00 296 +98052500.DDC 2.75 12.5 2688 -12.1 7.2 27.9 32.0 13.7 1.9 2.70 180 +98061400.OUN 2.75 20.5 6689 -6.5 7.7 32.8 42.7 17.9 5.4 4.00 262 +99060300.AMA 2.75 15.6 5087 -10.3 8.7 18.6 49.2 15.5 3.1 2.50 289 +99061200.AMA 2.75 14.7 4400 -10.3 7.7 26.2 36.6 18.8 3.2 2.40 210 +99061900.DDC 2.75 13.9 4141 -11.3 7.3 22.5 29.0 13.4 2.5 2.40 346 +99070100.MAF 2.75 13.7 3989 -2.5 7.5 14.9 13.7 10.5 0.4 2.00 146 +99081800.LBF 2.75 18.3 5554 -8.9 7.8 23.7 25.1 10.7 3.9 3.40 143 +00021400.LZK 2.50 10.7 2091 -20.3 6.4 21.1 24.5 22.2 1.5 2.10 245 +00032700.SGF 2.50 9.8 1766 -18.3 7.5 34.3 43.9 21.4 1.9 2.20 350 +00050100.FWD 2.50 14.3 3593 -13.1 7.2 17.3 18.5 19.0 2.0 1.70 401 +00051200.DVN 2.50 15.6 4865 -8.1 7.4 24.8 24.9 19.3 2.7 3.40 225 +00052300.MHX 2.50 15.1 3613 -13.5 6.5 15.3 26.5 10.5 1.7 2.40 79 +00061000.RAP 2.50 13.2 3610 -8.1 7.8 14.3 21.1 11.9 1.0 2.10 70 +00062400.OAX 2.50 17.5 4783 -8.7 7.2 18.7 28.2 14.9 2.3 2.30 195 +00070200.ABR 2.50 17.8 5952 -10.3 8.4 12.2 23.4 8.1 2.7 3.90 147 +00070600.LBF 2.50 18.2 5506 -7.1 8.3 25.3 35.5 11.8 3.5 3.50 155 +00080500.BIS 2.50 17.0 4830 -8.7 6.9 17.2 22.9 4.0 2.0 3.30 86 +00091100.MPX 2.50 16.6 4554 -10.3 7.0 22.0 24.0 18.4 2.9 3.20 271 +01041700.MAF 2.50 13.9 4552 -12.1 7.5 16.2 30.6 8.0 2.2 2.20 100 +01042200.DDC 2.50 13.3 3749 -12.1 7.3 33.4 45.3 24.2 3.5 2.70 510 +01050100.OAX 2.50 10.4 2265 -16.9 7.7 17.4 17.0 19.2 1.3 2.20 226 +01050400.MAF 2.50 13.7 3866 -11.3 7.2 12.8 33.8 11.4 1.3 2.70 101 +01052500.BMX 2.50 11.9 2388 -14.9 6.7 29.2 27.4 23.5 2.0 2.70 436 +01052620.LMN 2.50 14.1 4355 -13.5 6.4 27.3 33.2 20.2 3.5 2.90 233 +01070400.RAP 2.50 13.2 3145 -11.1 8.3 25.2 26.1 12.9 2.3 2.60 144 +01070500.LBF 2.50 14.5 3571 -7.7 7.7 26.0 27.0 17.1 1.9 2.90 313 +01082400.AMA 2.50 15.4 4318 -6.7 7.4 24.0 28.1 21.0 1.9 2.80 158 +01101000.DDC 2.50 12.9 3299 -9.7 6.4 18.8 18.3 16.4 1.2 2.50 275 +02040300.JAX 2.50 14.8 3327 -14.3 7.2 11.5 30.9 11.8 1.4 1.50 80 +02041212.AMA 2.50 12.2 2907 -13.7 7.5 20.4 25.1 14.6 1.8 2.80 184 +02041900.DVN 2.50 12.3 2861 -14.5 8.2 14.1 20.0 15.9 1.4 2.50 213 +02051700.AMA 2.50 13.8 5036 -12.7 8.7 21.9 26.5 17.4 4.0 2.20 216 +02072500.ABR 2.50 15.0 3995 -11.5 7.9 28.3 28.6 13.8 3.7 3.00 207 +03051500.SHV 2.50 16.8 4260 -9.9 6.8 33.7 42.9 16.3 3.9 0.80 246 +03062200.RAP 2.50 10.6 3380 -13.7 8.0 27.5 42.2 18.7 2.6 1.50 189 +04032718.OUN 2.50 12.6 2825 -14.9 7.3 21.1 32.3 11.5 2.0 2.10 199 +04040400.EPZ 2.50 12.1 4482 -17.9 8.2 29.1 25.4 11.6 5.5 2.10 203 +04080700.ABR 2.50 13.1 2792 -9.3 6.7 21.0 25.9 12.1 1.1 2.50 240 +04091500.LBF 2.50 12.8 1474 -10.7 8.0 35.4 39.8 20.5 1.4 -999.00 306 +04102400.JAN 2.50 15.8 1938 -6.9 5.3 30.8 27.8 19.3 0.8 0.60 328 +05050322.XMR 2.50 13.4 2165 -13.9 7.6 23.3 41.5 21.5 1.7 1.20 82 +05050700.MAF 2.50 10.7 3257 -12.3 8.0 20.3 24.6 11.2 1.7 1.60 48 +06050900.JAN 2.50 16.1 3303 -13.3 7.3 28.4 39.9 14.9 3.5 1.90 170 +06052600.SGF 2.50 13.9 3409 -9.5 6.5 18.9 23.2 18.8 1.3 2.50 262 +06061400.RAP 2.50 11.5 2691 -7.7 8.3 17.3 24.5 15.3 0.8 1.60 248 +06062500.DNR 2.50 7.1 987 -11.5 8.9 26.1 26.5 12.5 0.4 0.90 -172 +06071123.LMN 2.50 16.5 2996 -5.9 6.7 12.6 11.2 9.4 0.6 0.60 110 +08110600.OUN 2.50 11.4 1623 -12.5 6.9 29.8 32.7 24.8 1.1 2.40 317 +90060300.PAH 2.50 17.8 3663 -7.6 7.0 24.0 25.9 29.8 2.0 0.60 367 +90060700.DEN 2.50 10.9 2393 -8.2 9.0 26.3 23.9 19.6 1.2 1.60 170 +90061500.DDC 2.50 16.0 4667 -6.5 7.9 28.4 30.1 15.7 2.6 2.70 306 +90062200.ALB 2.50 12.6 1833 -14.1 6.7 32.5 29.1 20.6 1.7 1.60 203 +90070200.GSO 2.50 14.8 3963 -10.0 7.2 26.0 16.3 10.7 2.6 2.20 100 +90083100.CHS 2.50 16.0 2477 -8.5 6.5 17.0 17.7 8.3 0.9 0.60 67 +91041900.SEP 2.50 17.6 5996 -13.2 7.4 13.5 44.8 13.0 3.3 3.10 24 +91042100.AYS 2.50 11.8 2563 -16.9 7.4 13.4 30.0 10.3 1.2 1.70 76 +91050800.MAF 2.50 11.2 3415 -14.8 8.4 31.1 36.7 25.4 3.5 1.60 280 +91051200.AMA 2.50 14.3 4539 -10.8 8.5 12.4 14.9 16.7 1.7 2.30 208 +91052700.LBF 2.50 11.9 2669 -13.4 7.9 13.9 32.3 13.0 1.1 2.10 35 +91053100.DEN 2.50 12.0 3551 -12.1 9.5 27.3 45.8 10.7 3.2 1.90 149 +91071800.STC 2.50 18.2 4956 -8.7 7.3 18.7 20.1 21.9 2.5 2.50 104 +91080200.CAR 2.50 12.3 1891 -13.7 6.3 19.6 33.3 11.9 0.9 1.50 223 +92030400.SEP 2.50 12.7 2676 -15.3 7.7 20.1 27.2 9.2 1.9 2.30 133 +92041600.AMA 2.50 11.1 3362 -13.4 7.6 16.0 17.8 12.0 1.5 1.70 127 +92070200.DEN 2.50 11.7 2313 -11.2 8.0 27.6 29.9 20.0 1.6 2.50 362 +93033000.DRT 2.50 12.7 2680 -13.4 8.2 39.6 44.0 26.0 3.5 2.80 411 +93061400.TOP 2.50 16.5 4195 -8.5 7.7 12.5 17.8 10.7 1.3 2.80 65 +93070200.HON 2.50 14.6 2619 -11.3 7.0 28.3 40.3 12.6 2.0 0.80 143 +93070300.TOP 2.50 18.5 4019 -7.2 7.1 15.8 16.4 15.2 1.4 0.70 202 +94032800.AHN 2.50 14.4 2627 -10.5 6.2 34.5 24.7 30.4 2.0 0.70 518 +94062600.TOP 2.50 16.4 4265 -8.6 8.4 25.2 45.9 21.6 3.0 2.90 418 +95050800.FTD 2.50 16.5 2700 -10.4 7.7 30.8 30.8 24.5 2.6 0.80 407 +95050800.LCH 2.50 17.9 3259 -9.9 7.1 16.7 31.1 10.2 1.6 0.60 119 +95050900.TOP 2.50 10.0 1495 -19.3 6.9 19.3 22.8 21.2 0.9 1.20 126 +95051600.MAF 2.50 13.6 3261 -7.8 8.4 21.7 28.8 10.3 1.5 1.80 134 +95051900.GSO 2.50 13.4 1758 -11.8 7.9 25.3 27.1 23.6 1.3 -999.00 83 +95052912.MAF 2.50 13.0 1617 -11.3 7.5 27.6 22.0 13.7 1.2 1.90 284 +95060700.DEN 2.50 12.3 3137 -10.8 9.2 37.2 35.9 20.7 3.4 2.00 284 +95061600.TFX 2.50 13.0 3142 -12.0 8.4 27.7 35.6 23.8 2.7 2.30 277 +95081212.MPX 2.50 19.1 3361 -6.3 7.2 20.6 36.8 23.0 1.4 -999.00 164 +96030700.TLH 2.50 15.4 2615 -10.4 6.0 20.9 23.7 20.7 1.2 0.60 320 +96042200.FTD 2.50 12.0 1872 -12.6 8.2 27.1 34.0 18.3 1.5 -999.00 298 +96051800.MPX 2.50 16.3 4406 -8.9 8.2 13.0 23.4 20.7 1.6 3.40 259 +96060100.DDC 2.50 13.3 2888 -10.9 8.3 13.3 19.3 13.9 1.1 2.50 111 +96060300.AMA 2.50 11.0 2356 -10.5 6.9 27.6 31.6 18.0 1.2 2.00 256 +96061200.LBF 2.50 11.7 2310 -9.9 7.5 16.7 22.2 12.7 0.8 2.40 122 +96062100.DEN 2.50 15.2 5603 -8.1 9.6 27.5 33.4 8.8 4.4 2.20 155 +96071900.GRB 2.50 20.7 4746 -7.5 6.4 26.3 26.2 20.0 3.0 0.70 164 +96072200.LBF 2.50 18.4 4756 -6.5 7.2 20.0 29.4 19.0 1.9 2.10 94 +98071100.DDC 2.50 18.9 4323 -4.3 6.2 12.7 15.2 16.0 0.7 0.60 230 +00061300.OAX 2.25 17.7 5453 -11.5 8.5 15.8 19.3 12.9 3.5 4.00 206 +00030300.FWD 2.00 12.3 2589 -14.3 6.2 33.4 29.1 20.2 2.2 2.70 239 +00031600.LMN 2.00 9.5 1478 -17.3 7.1 22.1 10.9 12.9 0.9 2.20 164 +00032800.JAX 2.00 12.5 2135 -14.5 6.3 29.1 24.7 25.7 1.7 0.90 268 +00061200.AMA 2.00 16.8 5720 -10.3 8.3 16.1 28.7 15.7 3.2 2.70 88 +00061300.LBF 2.00 13.9 4790 -9.9 8.3 16.6 18.6 9.9 2.1 2.00 159 +00061500.JAX 2.00 17.9 4801 -8.7 6.4 6.2 13.3 3.6 0.7 1.10 55 +00071100.GGW 2.00 14.2 3230 -11.3 6.9 30.1 48.1 16.9 2.6 3.00 88 +00071500.BIS 2.00 16.5 5132 -9.5 8.1 27.6 34.1 14.6 4.3 2.70 152 +00072300.LBF 2.00 13.2 2926 -11.5 7.1 25.2 27.3 13.6 1.9 2.80 91 +01042200.AMA 2.00 14.1 6059 -15.3 9.2 35.7 38.3 16.6 10.2 3.30 320 +01042200.MAF 2.00 13.7 4543 -12.3 8.4 27.4 36.2 12.3 4.2 2.20 164 +01050600.FWD 2.00 15.4 3092 -12.7 6.8 32.7 34.4 19.4 3.2 2.10 170 +01050700.SGF 2.00 14.5 4025 -13.7 6.1 8.8 17.0 10.5 1.0 3.10 202 +01050702.LZK 2.00 14.2 2759 -12.9 5.9 18.7 26.3 7.3 1.3 2.00 77 +01051200.OUN 2.00 13.2 3098 -13.9 7.1 10.0 10.8 8.7 1.0 2.10 132 +01052700.DDC 2.00 11.3 2853 -12.1 6.7 30.6 37.1 19.3 1.9 1.80 184 +01052800.OUN 2.00 16.5 4910 -10.7 7.6 29.7 38.8 16.9 4.7 3.10 113 +01053000.DDC 2.00 15.2 2892 -12.1 8.0 19.5 26.6 14.8 2.0 1.80 388 +01053100.FWD 2.00 15.8 4571 -12.3 8.7 12.4 20.6 13.7 2.3 3.90 106 +01053100.LCH 2.00 17.4 3988 -8.3 7.0 8.3 13.9 0.8 0.8 2.40 8 +01062100.DNR 2.00 10.8 2544 -11.5 7.5 21.4 23.2 20.5 1.2 2.10 192 +01063000.FWD 2.00 16.8 4122 -9.7 6.9 11.2 19.2 9.2 1.2 1.60 133 +01071300.GGW 2.00 14.5 3042 -10.1 8.1 16.5 34.2 7.9 1.4 3.50 19 +01072000.RAP 2.00 15.1 4486 -8.7 8.4 15.4 26.3 10.9 1.8 2.40 71 +01082300.TOP 2.00 16.7 4361 -9.7 7.6 9.9 23.0 13.6 1.3 2.30 192 +01082400.DDC 2.00 16.4 4283 -7.5 7.7 14.7 16.3 11.9 1.4 3.10 77 +01090800.OUN 2.00 17.6 4351 -8.7 7.8 26.1 21.2 21.8 3.3 2.30 151 +01090800.TOP 2.00 17.8 4174 -11.3 8.1 26.2 26.7 24.5 4.2 1.70 274 +01101000.OUN 2.00 15.6 3485 -12.9 7.9 24.4 28.2 23.9 3.2 2.50 447 +02041800.OAX 2.00 11.4 2113 -14.5 7.6 33.9 35.5 24.0 2.1 2.20 376 +02052800.LZK 2.00 15.1 3284 -12.3 6.5 4.4 12.3 2.6 0.4 0.60 13 +02061300.DVN 2.00 17.3 3501 -11.9 7.4 26.3 38.7 10.0 3.3 1.10 100 +02062600.MPX 2.00 19.6 6228 -9.7 7.1 18.6 21.8 9.2 3.7 3.20 120 +03051900.TBW 2.00 17.1 3797 -10.9 6.8 5.9 5.0 4.0 0.7 1.00 -4 +04043000.JAN 2.00 13.6 1469 -12.7 6.5 27.4 22.8 18.1 1.1 0.60 184 +04052200.DDC 2.00 13.5 3809 -9.7 8.1 21.0 27.0 20.3 2.0 2.20 297 +04062400.GRB 2.00 10.4 1604 -16.9 6.3 25.3 36.9 16.4 1.1 2.40 128 +04072300.TOP 2.00 16.0 3276 -7.7 6.4 15.8 19.6 11.4 1.0 0.70 158 +04082400.BIS 2.00 13.4 2596 -11.1 7.6 21.3 22.3 16.4 1.5 2.20 208 +04091200.GRB 2.00 12.3 2256 -14.9 7.2 14.7 24.8 11.6 1.0 1.00 64 +05022100.SGF 2.00 9.1 1128 -18.9 6.8 27.7 36.6 17.1 0.9 1.90 97 +05050700.LBF 2.00 9.7 3058 -14.3 8.2 12.5 21.7 6.1 1.0 1.40 135 +05050900.LMN 2.00 12.0 2971 -16.1 7.8 15.1 29.6 15.9 1.6 2.20 290 +06040700.TOP 2.00 11.0 2249 -15.1 7.4 35.7 27.3 15.8 2.3 2.10 206 +06041600.TOP 2.00 12.2 2191 -12.9 8.2 37.2 42.6 28.5 2.5 2.90 533 +06050800.DDC 2.00 9.5 1674 -17.1 8.9 16.8 27.8 16.1 1.0 2.60 248 +06051600.MFL 2.00 15.8 2473 -11.1 6.8 26.6 21.2 18.7 1.9 0.60 227 +06052400.DDC 2.00 10.2 1607 -8.7 7.6 22.4 19.3 17.0 0.6 1.80 189 +06061400.TFX 2.00 12.3 2827 -9.7 8.1 15.9 28.9 14.3 1.0 2.10 65 +06062700.ILX 2.00 12.2 2025 -15.7 6.4 3.5 11.7 5.2 0.2 1.20 15 +06090100.DDC 2.00 12.2 1972 -7.7 7.1 15.6 27.4 13.9 0.5 1.60 363 +89052800.ELP 2.00 11.2 2569 -6.8 8.0 11.3 17.1 14.9 0.4 1.40 232 +89071100.HON 2.00 15.7 3126 -7.0 6.9 14.6 18.6 12.3 0.8 1.20 151 +89082100.LBF 2.00 14.8 3307 -9.1 7.1 28.0 44.7 8.0 2.1 3.00 83 +89103000.OUN 2.00 12.5 2163 -14.7 6.6 18.0 18.1 13.1 1.1 1.60 195 +90060900.PIT 2.00 16.7 4095 -9.5 6.7 18.1 13.6 18.8 1.9 1.00 236 +90061400.PIA 2.00 18.1 3570 -7.0 7.0 16.5 23.4 9.5 1.2 0.60 134 +90072600.TBW 2.00 18.4 4330 -6.3 5.7 3.5 8.5 6.3 0.2 0.60 7 +90091400.STC 2.00 13.1 2123 -10.9 7.4 27.8 39.0 23.2 1.5 -999.00 564 +98033100.FWD 2.00 13.3 2873 -14.3 7.2 29.6 57.5 17.6 2.7 2.90 93 +98062500.APX 2.00 15.8 3453 -11.3 7.3 28.9 35.4 21.9 3.1 3.30 348 +98063000.BUF 2.00 14.5 2615 -10.5 6.1 23.6 28.2 8.5 1.4 1.70 86 +99050400.DRT 2.00 17.4 5609 -10.1 7.5 40.5 38.9 21.2 7.1 4.56 342 +99053100.TOP 2.00 13.1 2215 -10.9 6.8 18.6 12.2 14.7 1.0 1.40 189 +00033000.SHV 1.75 15.4 3548 -15.9 7.6 31.6 50.3 23.8 5.0 2.80 323 +00051200.TOP 1.75 16.7 5329 -7.3 6.5 25.1 29.2 21.0 2.5 3.70 216 +00051900.FWD 1.75 16.2 3610 -10.9 7.4 25.2 32.9 6.7 2.8 0.64 75 +00052900.GSO 1.75 14.3 1988 -11.1 6.2 28.7 35.1 17.6 1.3 1.20 139 +00060300.ABQ 1.75 9.4 1267 -8.7 8.2 10.3 17.5 7.6 0.2 1.40 70 +00061100.AMA 1.75 14.0 3932 -7.9 7.8 14.8 19.1 9.4 1.2 2.10 128 +00062200.DDC 1.75 14.3 3602 -8.7 7.0 15.4 23.4 16.2 1.2 2.90 157 +00062400.DDC 1.75 14.8 3499 -7.3 7.7 23.2 30.2 12.0 1.6 2.70 237 +00062400.LBF 1.75 14.8 4723 -9.7 8.6 17.4 29.6 9.8 2.4 2.00 126 +00070600.GGW 1.75 11.7 2743 -14.1 8.5 29.6 40.4 13.0 2.7 1.90 165 +00071300.ABR 1.75 13.6 2305 -8.7 6.7 29.3 44.3 21.7 1.3 2.00 278 +00071500.IAD 1.75 13.9 2186 -12.3 6.8 17.8 17.7 9.3 1.1 2.00 118 +00071800.AMA 1.75 14.4 3660 -4.7 6.9 9.1 7.7 5.9 0.4 1.50 79 +00072100.FFC 1.75 14.3 2149 -6.9 6.4 9.2 10.4 9.1 0.3 0.60 63 +00072200.LBF 1.75 12.8 3031 -11.5 7.6 27.5 23.7 14.5 2.2 2.60 247 +00072500.ABR 1.75 15.6 4195 -12.3 8.9 15.3 19.8 10.9 2.6 3.10 113 +00072600.MFL 1.75 18.3 4079 -8.5 6.6 5.2 5.6 2.4 0.5 0.60 18 +00072600.MPX 1.75 15.3 3240 -13.1 7.6 21.4 12.4 10.1 2.5 3.00 139 +00072700.LBF 1.75 18.1 5178 -8.9 8.7 17.5 26.1 12.2 3.0 2.20 351 +00072900.GSO 1.75 14.3 2081 -9.7 6.2 6.2 16.1 6.5 0.3 0.60 43 +00073100.JAX 1.75 17.6 3581 -8.9 6.0 6.6 5.5 4.7 0.5 0.60 27 +00080200.GGW 1.75 10.8 2057 -8.9 8.0 24.6 35.3 15.0 0.9 1.80 148 +00080800.OAX 1.75 16.3 4679 -8.1 7.8 16.4 25.1 10.8 1.9 3.00 185 +00090400.LBF 1.75 11.2 2441 -9.5 7.8 21.4 24.1 18.5 1.0 1.50 309 +01061800.TBW 1.75 15.9 3469 -9.7 5.9 4.6 6.6 1.5 0.3 0.80 23 +01062000.DTX 1.75 14.9 3813 -12.5 6.9 8.4 17.6 15.0 1.0 2.80 -45 +02041600.PIT 1.75 11.5 1856 -14.9 7.3 17.9 18.1 15.8 1.0 1.60 245 +02041800.FWD 1.75 15.9 3343 -9.9 6.4 12.4 34.6 5.6 1.0 -999.00 61 +02050400.CHS 1.75 15.9 3255 -10.7 6.6 21.1 29.5 16.6 1.8 0.90 19 +02052800.LBF 1.75 11.3 3387 -15.1 9.0 18.8 30.1 11.6 2.3 1.90 184 +02052800.MAF 1.75 12.7 3115 -11.1 8.0 20.6 24.7 16.4 1.7 2.10 103 +02052900.TOP 1.75 12.8 2661 -13.7 6.8 4.2 10.7 7.3 0.3 1.30 48 +02060402.CHS 1.75 13.7 2637 -10.1 7.6 9.7 10.8 11.7 0.6 0.80 33 +02060700.MPX 1.75 9.2 1952 -15.1 7.7 22.8 25.3 16.2 1.1 1.50 758 +02061200.TOP 1.75 19.6 5029 -8.9 7.6 21.1 24.7 15.6 3.3 0.70 224 +02062600.DTX 1.75 14.5 3079 -8.9 6.1 1.9 7.2 1.4 0.1 0.70 -1 +02070200.AMA 1.75 12.2 2393 -6.5 7.3 18.4 11.3 20.8 0.6 1.60 353 +02072518.TBW 1.75 18.9 4523 -8.5 6.7 7.8 6.3 2.0 0.9 0.60 7 +02072800.DDC 1.75 12.9 2480 -5.3 7.4 10.6 11.1 10.7 0.3 1.40 155 +02082300.LBF 1.75 17.8 6193 -10.1 8.0 12.9 28.1 3.8 2.7 3.10 10 +03031500.BMX 1.75 10.9 1555 -19.1 7.4 8.5 21.2 12.3 0.5 1.30 94 +03032600.LZK 1.75 11.3 2073 -18.5 6.7 14.3 15.4 9.5 1.0 2.20 67 +03032600.SHV 1.75 11.3 1723 -18.3 8.5 17.7 18.0 8.0 1.3 1.40 108 +03042900.AMA 1.75 9.6 2549 -14.5 8.3 25.3 33.7 16.5 1.8 1.60 237 +03042900.MAF 1.75 9.8 2325 -13.5 8.4 23.4 21.0 15.5 1.4 1.40 165 +03043000.BNA 1.75 12.4 3359 -15.3 7.2 4.3 5.5 4.1 0.5 1.30 30 +03050200.FFC 1.75 13.7 3289 -13.5 6.5 9.8 9.5 7.5 0.9 0.90 55 +03050700.BMX 1.75 17.4 4489 -10.5 7.0 26.5 28.4 12.2 3.6 2.10 101 +03051312.FWD 1.75 12.6 1814 -10.3 7.3 17.7 24.7 16.8 0.7 1.20 205 +03060400.LCH 1.75 19.7 4988 -6.7 5.8 13.3 17.2 7.3 1.2 0.60 44 +03061100.OUN 1.75 14.5 3045 -9.3 7.2 17.8 13.1 12.1 1.3 2.00 135 +03061300.LBF 1.75 12.0 2759 -11.3 7.2 15.4 16.3 13.0 1.0 2.60 179 +03061500.FWD 1.75 14.3 2433 -11.3 6.9 12.1 2.8 5.3 0.8 1.70 32 +03061500.LBF 1.75 10.7 1717 -11.3 6.3 10.6 12.0 6.6 0.3 1.70 51 +03061700.FFC 1.75 16.3 2826 -8.5 6.2 7.0 13.0 5.5 0.4 0.60 32 +03061700.RAP 1.75 10.1 1501 -11.1 7.1 5.7 17.5 2.9 0.2 1.90 92 +03062100.MAF 1.75 10.7 1489 -7.7 7.0 14.5 29.4 6.5 0.3 1.90 74 +03062500.MAF 1.75 16.5 4621 -6.7 7.7 8.7 16.8 11.9 0.8 2.10 45 +03090500.DRA 1.75 11.3 1966 -8.3 8.1 3.7 9.2 5.0 0.1 1.20 33 +03091000.MAF 1.75 12.9 3038 -7.3 7.4 8.3 12.7 8.6 0.4 2.10 79 +03091100.DDC 1.75 14.8 3112 -7.5 6.9 22.3 30.8 15.7 1.3 2.20 259 +03092100.DDC 1.75 10.2 1784 -10.9 7.3 20.1 23.8 21.8 0.7 2.00 257 +04022512.LIX 1.75 10.3 837 -17.7 6.7 31.9 48.7 25.2 0.8 2.40 340 +04030100.TOP 1.75 6.3 487 -28.7 8.7 32.0 35.0 20.1 0.6 1.60 171 +04032100.FFC 1.75 7.9 942 -17.3 7.5 12.0 13.4 11.3 0.3 1.10 154 +04032100.MAF 1.75 10.0 2053 -12.9 7.9 9.6 21.3 5.5 0.5 1.50 39 +04040700.FWD 1.75 10.4 835 -16.3 6.7 28.3 27.2 11.8 0.6 1.00 87 +04042900.DRT 1.75 12.4 1834 -12.9 6.4 20.0 31.6 16.1 0.9 1.30 217 +04051000.LBF 1.75 11.6 4026 -13.9 9.0 13.9 17.5 3.0 1.9 1.60 38 +04051600.EPZ 1.75 10.4 2888 -11.5 8.7 12.2 7.0 4.1 0.9 1.60 93 +04071200.TOP 1.75 17.7 3709 -7.3 6.8 13.6 9.1 11.9 1.1 0.60 204 +04081900.ILX 1.75 15.1 3685 -9.1 5.9 19.9 28.2 19.7 1.4 1.30 371 +04082600.BIS 1.75 12.5 3083 -13.1 7.1 16.6 18.9 13.9 1.4 2.40 101 +04092300.AMA 1.75 12.8 1887 -10.1 6.7 23.5 21.8 19.6 0.9 1.30 374 +04092500.AMA 1.75 11.2 2465 -11.9 6.9 15.1 24.9 12.0 0.8 2.00 38 +05030400.AMA 1.75 4.3 697 -23.3 8.7 22.7 36.0 13.1 0.3 1.30 142 +05031500.TLH 1.75 12.4 1338 -14.1 7.1 28.4 53.2 12.7 1.1 1.10 41 +05082400.RAP 1.75 11.3 2040 -11.3 8.6 11.6 19.1 13.6 0.6 -999.00 116 +05082700.AMA 1.75 13.6 2765 -5.5 7.4 11.5 11.5 10.0 0.4 2.00 31 +06040400.CHS 1.75 11.6 2165 -16.9 8.1 31.6 39.3 26.6 2.6 2.60 207 +06040900.JAX 1.75 13.6 2254 -13.7 6.6 20.4 22.0 19.5 1.3 2.10 178 +06041300.LZK 1.75 11.0 1294 -13.5 7.2 12.6 20.8 6.0 0.4 -999.00 34 +06041600.IAD 1.75 10.2 2181 -16.7 7.0 27.7 43.3 16.6 1.7 1.80 48 +06041600.WAL 1.75 10.9 2234 -16.5 7.2 17.7 48.2 17.2 1.2 2.30 81 +06041900.BMX 1.75 12.0 1805 -11.1 6.3 14.2 22.0 5.4 0.5 0.70 62 +06042300.DTX 1.75 6.7 609 -24.1 7.4 17.7 27.4 14.0 0.3 1.80 50 +06050400.SHV 1.75 15.0 3310 -12.1 6.7 8.0 14.3 5.8 0.8 0.60 85 +06050600.LCH 1.75 14.9 2655 -10.3 5.8 23.1 25.2 15.8 1.3 0.60 64 +06050900.DDC 1.75 9.6 1630 -13.3 7.9 27.2 27.8 15.1 1.1 2.00 179 +06050912.SGF 1.75 12.9 2144 -12.9 6.7 20.3 18.4 10.1 1.2 1.80 144 +06051100.LCH 1.75 18.5 4564 -12.3 8.9 22.9 22.0 12.2 5.1 1.70 38 +06051412.SHV 1.75 12.4 2270 -14.9 7.8 16.8 26.2 15.5 1.3 2.80 84 +06051800.ILX 1.75 8.0 713 -17.5 6.9 28.8 29.6 16.9 0.5 2.10 226 +06052300.SGF 1.75 14.4 3032 -11.9 7.1 9.0 15.5 8.3 0.8 1.60 91 +06052500.TLH 1.75 14.8 2619 -10.5 6.4 7.3 7.5 9.2 0.5 0.60 56 +06052700.GSO 1.75 12.7 2136 -9.9 5.8 17.4 21.2 17.1 0.6 1.50 217 +06061800.FWD 1.75 14.3 2286 -10.9 8.2 13.9 24.6 11.6 1.0 2.30 134 +06062100.CHS 1.75 17.0 4007 -10.1 6.4 12.9 19.3 7.1 1.3 0.70 66 +06062400.BIS 1.75 8.3 942 -15.3 7.0 22.7 27.2 16.7 0.5 1.60 167 +06062400.LBF 1.75 10.7 1400 -12.1 7.4 26.6 25.0 13.6 0.8 2.10 272 +06062900.DDC 1.75 7.7 919 -10.1 7.7 17.9 17.9 1.9 0.2 0.80 16 +06070100.BNA 1.75 13.5 2750 -11.5 6.7 10.8 7.8 11.5 0.7 1.50 41 +06071200.DDC 1.75 11.8 1068 -8.7 8.0 15.4 21.8 11.8 0.3 1.00 12 +06071300.DDC 1.75 12.8 1575 -5.9 6.9 12.7 13.7 7.4 0.2 0.80 99 +06071900.JAN 1.75 15.2 2280 -6.9 6.5 11.1 11.1 9.0 0.4 0.60 88 +06072200.LZK 1.75 14.1 2480 -8.1 7.3 6.9 5.8 7.7 0.3 0.60 67 +06072600.TUS 1.75 11.2 1725 -5.7 7.4 15.0 18.3 8.5 0.3 0.90 36 +06080700.TOP 1.75 12.5 1693 -6.7 7.0 7.6 6.8 3.2 0.2 0.60 35 +06080900.TUS 1.75 11.9 1640 -4.7 6.6 5.1 8.2 6.6 0.1 0.60 25 +06082100.ABR 1.75 12.5 1851 -9.9 6.8 21.9 39.5 15.5 0.8 2.10 257 +06082300.RAP 1.75 8.3 1757 -9.5 9.1 21.3 28.7 12.7 0.6 0.80 108 +06091100.AMA 1.75 12.5 1812 -8.9 7.1 14.9 33.3 13.7 0.5 2.10 51 +06091400.EPZ 1.75 11.7 1589 -10.3 7.6 17.4 23.7 13.1 0.6 2.00 167 +06091600.DDC 1.75 14.4 2738 -6.9 6.6 29.7 39.0 21.6 1.3 2.20 378 +06100400.MPX 1.75 13.7 3011 -12.1 7.4 34.0 30.2 23.9 3.0 2.90 514 +89060100.TOP 1.75 15.8 2810 -10.9 7.9 10.6 26.9 7.9 1.0 -999.00 90 +89060600.GSO 1.75 14.8 2078 -9.1 5.9 8.1 6.7 10.0 0.3 0.60 93 +89060600.JAN 1.75 16.3 3336 -11.3 6.7 20.8 25.3 10.4 2.0 0.80 103 +89061400.GGG 1.75 17.2 3674 -11.0 6.9 15.4 23.3 4.3 1.7 -999.00 61 +89061900.BNA 1.75 13.9 1755 -10.2 6.3 9.7 7.8 6.8 0.4 0.60 86 +89062200.AHN 1.75 15.5 1517 -7.6 5.8 12.6 15.8 14.9 0.3 0.60 112 +89062600.IAD 1.75 16.2 3138 -8.6 6.1 14.3 23.0 12.1 0.9 0.70 108 +89062700.PIA 1.75 15.7 2460 -7.9 6.6 13.2 12.4 5.3 0.6 0.70 87 +89062800.BUF 1.75 15.2 2385 -8.2 5.3 20.1 22.3 9.8 0.7 0.60 82 +89070800.PIT 1.75 15.4 2732 -9.1 6.8 17.5 15.7 12.8 1.1 1.50 81 +89071300.DDC 1.75 15.1 3239 -4.9 6.9 5.1 7.2 7.9 0.2 1.20 81 +89071300.OUN 1.75 19.0 4127 -5.4 6.9 13.8 19.1 13.0 1.0 -999.00 196 +89071500.LBF 1.75 14.3 2675 -6.9 6.1 6.1 8.4 5.5 0.2 0.60 27 +89072900.HON 1.75 14.0 2092 -5.9 6.0 12.0 17.9 6.4 0.3 0.80 105 +89073000.JAN 1.75 18.0 3940 -7.7 6.7 1.9 3.1 2.1 0.2 0.60 9 +89080600.UMN 1.75 19.0 5563 -6.9 7.0 11.7 11.3 8.8 1.4 0.80 99 +89081300.TBW 1.75 16.4 2617 -8.6 6.0 18.1 18.2 10.1 1.0 0.60 65 +89082500.RAP 1.75 10.6 1899 -7.1 7.6 7.7 7.6 2.7 0.2 1.00 55 +89082700.OMA 1.75 17.8 3452 -6.6 6.1 19.5 33.1 15.2 1.1 0.60 142 +89082800.UMN 1.75 17.3 3603 -6.1 6.5 7.8 5.6 2.6 0.5 0.60 28 +89082900.TOP 1.75 19.8 4842 -6.3 6.6 15.4 21.1 13.2 1.5 0.60 156 +89083000.OUN 1.75 17.3 3864 -5.6 6.0 13.1 24.2 11.8 0.7 0.60 112 +89083100.DDC 1.75 16.5 2956 -5.7 6.6 13.6 22.5 13.3 0.6 0.80 346 +89090200.1M1 1.75 18.3 3818 -4.8 6.1 16.2 14.1 8.2 0.8 0.60 64 +89090800.DEN 1.75 10.1 1350 -6.8 8.3 24.1 24.0 15.4 0.4 2.00 366 +90022800.MAF 1.75 9.7 607 -16.2 6.6 16.4 23.8 5.1 0.2 1.20 55 +90031000.AMA 1.75 11.1 2468 -16.0 8.6 13.1 18.2 9.9 1.2 1.90 106 +90031300.OUN 1.75 12.7 3211 -13.6 7.8 24.2 18.1 19.4 2.5 2.80 286 +90040200.BRO 1.75 16.2 3494 -9.3 7.1 25.7 37.2 15.2 2.3 0.90 65 +90042200.OUN 1.75 11.1 2748 -13.3 6.6 12.2 14.9 7.3 0.8 2.00 48 +90042600.DRT 1.75 14.6 3699 -13.8 8.1 25.7 33.2 11.1 3.7 4.30 101 +90042900.AYS 1.75 13.0 2333 -12.2 6.2 30.6 23.2 19.1 1.7 2.30 243 +90050600.OUN 1.75 7.6 836 -20.1 7.2 18.3 48.8 5.8 0.4 1.40 30 +90051200.SEP 1.75 13.6 2282 -9.2 6.9 34.8 47.4 14.5 1.6 -999.00 134 +90051600.IAD 1.75 13.4 2004 -14.0 7.0 16.7 27.7 12.7 1.0 -999.00 102 +90051900.SEP 1.75 17.0 3246 -9.1 6.6 20.9 27.2 15.6 1.6 0.60 387 +90052100.HAT 1.75 15.8 2891 -9.7 5.6 13.8 19.5 12.4 0.8 0.60 182 +90052100.UMN 1.75 14.8 3661 -13.1 7.6 15.4 23.7 15.3 2.0 3.40 181 +90052300.HON 1.75 10.9 1984 -14.0 7.2 22.3 33.6 15.0 1.1 2.40 107 +90052800.SIL 1.75 18.0 3916 -10.0 6.8 19.3 10.6 10.4 2.2 0.80 48 +90061000.IAD 1.75 14.9 2818 -9.2 6.5 16.4 19.3 18.0 1.0 0.60 175 +90061000.OUN 1.75 15.1 3242 -8.5 7.8 10.1 1.3 10.9 0.8 2.50 21 +90061100.CHS 1.75 17.7 4050 -8.1 6.6 8.1 19.1 6.4 0.7 0.60 102 +90061300.STC 1.75 16.2 2789 -10.4 7.2 36.6 42.0 14.2 2.9 0.70 139 +90061800.PIA 1.75 19.5 4567 -8.1 7.4 17.0 25.7 14.1 2.2 1.00 94 +90070500.LCH 1.75 17.6 3315 -8.5 6.6 15.3 2.5 11.6 1.2 0.60 58 +90070900.GRB 1.75 16.9 2962 -6.5 6.5 18.2 22.7 12.1 0.9 0.60 82 +90071100.CKL 1.75 15.4 2544 -8.1 6.4 5.1 4.6 2.1 0.3 0.60 9 +90071300.CRP 1.75 13.3 1658 -6.5 6.5 12.8 9.3 14.6 0.3 0.60 121 +90071400.ABQ 1.75 10.4 1588 -9.4 8.7 18.9 32.6 4.4 0.6 1.20 70 +90071700.FNT 1.75 11.9 1393 -12.5 6.5 15.5 25.3 13.2 0.5 0.60 176 +90071800.LBF 1.75 12.3 3138 -7.7 8.2 17.7 16.6 10.0 1.0 1.60 115 +90072100.ABQ 1.75 10.9 1327 -5.9 8.3 7.9 14.5 9.8 0.1 1.30 145 +90072600.OUN 1.75 16.6 3546 -6.8 6.2 10.8 14.7 11.1 0.6 0.70 206 +90072700.AMA 1.75 14.3 3104 -5.8 7.3 7.7 7.9 11.1 0.3 2.20 117 +90073100.GGG 1.75 16.1 3254 -7.5 6.4 7.9 5.4 1.2 0.5 0.60 3 +90080200.LCH 1.75 18.4 3223 -7.3 6.4 6.5 2.0 3.1 0.4 0.60 14 +90081000.AHN 1.75 14.9 2234 -9.4 6.2 13.3 26.7 6.4 0.6 0.80 33 +90081500.DDC 1.75 15.1 3012 -6.6 5.6 9.0 15.8 9.9 0.4 0.60 59 +90082100.AMA 1.75 14.6 2833 -5.7 6.6 11.7 11.3 10.6 0.4 1.20 75 +90082400.OVN 1.75 18.7 5016 -7.4 6.8 7.4 14.7 9.4 0.8 0.70 100 +90082600.BIS 1.75 13.7 3187 -13.2 8.6 22.2 23.1 13.2 2.6 2.50 190 +90082600.HON 1.75 17.9 5529 -11.5 9.1 14.7 28.6 9.9 3.6 -999.00 156 +90090200.MAF 1.75 14.9 3597 -6.2 6.8 17.2 18.3 7.5 0.9 2.50 58 +90091100.AHN 1.75 15.1 2857 -8.6 5.9 7.9 7.6 6.3 0.4 0.60 80 +91032700.DAY 1.75 10.7 1310 -13.1 6.4 30.2 30.6 24.3 0.8 1.80 531 +91051300.BIS 1.75 13.8 1867 -11.5 6.8 26.9 19.8 15.8 1.3 0.70 -79 +91051300.HON 1.75 14.7 3615 -9.5 7.2 14.2 22.7 13.0 1.2 2.80 97 +91051700.GGG 1.75 18.4 5081 -10.4 7.5 7.9 11.2 10.5 1.4 0.90 157 +91053100.AHN 1.75 16.3 3505 -6.9 5.9 3.9 4.1 3.2 0.2 0.60 15 +91060600.JAN 1.75 16.3 3344 -9.1 6.8 9.5 9.6 3.1 0.8 0.60 12 +91060600.RAP 1.75 13.1 2001 -11.5 7.1 13.2 19.7 11.9 0.7 1.40 170 +92051500.1M1 1.75 13.3 2877 -11.3 6.4 11.4 16.3 7.9 0.7 1.50 54 +94062600.PBI 1.75 17.7 4199 -9.1 6.6 4.9 6.6 5.2 0.5 1.80 10 +94070100.1M1 1.75 18.6 4820 -8.1 6.1 20.0 18.5 12.6 2.1 1.00 342 +94071700.1M1 1.75 17.7 3339 -6.4 5.8 12.5 11.3 19.1 0.7 0.60 164 +94071700.HAT 1.75 16.5 2973 -6.0 5.7 5.9 3.1 4.4 0.2 0.60 33 +97100900.OUN 1.75 16.5 3628 -7.5 6.0 20.0 29.9 16.6 1.3 0.80 205 +98062500.FFC 1.75 15.8 3224 -8.9 7.3 4.2 9.9 5.6 0.3 0.60 54 +00051800.GSO 1.50 11.9 1767 -13.7 6.5 16.4 31.1 7.6 0.7 1.60 124 +00090200.SLC 1.50 9.1 1641 -14.7 8.4 16.1 24.8 20.1 0.7 1.70 101 +01062600.GSO 1.50 11.9 929 -11.7 6.0 17.8 25.6 10.4 0.3 0.60 106 +01062600.RNK 1.50 11.1 1653 -11.9 5.7 13.7 30.3 8.3 0.4 2.10 88 +02042200.ILN 1.50 10.3 623 -13.3 6.8 36.0 43.5 31.2 0.5 2.10 525 +02072500.LCH 1.50 20.2 5453 -7.3 5.9 8.5 11.3 5.5 1.0 0.60 66 +03031700.MHX 1.50 12.1 1241 -13.1 5.4 19.1 32.8 11.5 0.5 0.70 37 +03091800.INL 1.50 13.7 1863 -13.5 7.5 24.7 29.2 15.3 1.5 -999.00 384 +06042117.JAN 1.50 13.4 1486 -12.9 6.5 17.4 11.7 6.4 0.7 0.60 58 +06052200.LBF 1.50 8.2 1420 -11.1 7.7 15.2 22.6 14.8 0.4 1.30 199 +06053000.SGF 1.50 15.0 2988 -9.3 6.5 2.7 12.8 4.0 0.2 0.60 27 +06071100.DNR 1.50 10.1 1192 -7.9 7.6 16.2 27.0 12.2 0.3 1.70 79 +89060200.AHN 1.50 13.2 1996 -7.3 6.1 2.6 1.6 3.2 0.1 -999.00 18 +90040200.GSO 1.50 8.7 984 -17.4 6.8 29.7 37.4 19.9 0.7 2.00 210 +90041100.AHN 1.50 11.5 1096 -14.0 6.4 25.4 25.8 19.0 0.7 0.60 343 +90071000.DEN 1.50 13.5 3504 -8.2 8.0 25.4 20.1 16.7 1.9 2.50 41 +90082200.AHN 1.50 16.5 3275 -6.8 6.5 8.7 15.8 6.0 0.5 0.60 48 +90082200.OUN 1.50 16.6 3350 -5.5 6.1 3.3 5.7 3.1 0.1 0.60 -7 +94070100.GSO 1.50 13.8 2296 -10.3 5.4 8.1 14.3 6.6 0.3 0.60 40 +00030400.BMX 1.25 11.4 1311 -14.9 5.7 42.9 54.3 21.1 1.3 1.40 205 +00071100.DDC 1.25 16.4 4707 -4.1 6.8 4.6 8.7 6.0 0.2 2.60 136 +00072000.LZK 1.25 16.4 3973 -6.7 6.8 12.6 12.7 8.3 0.9 1.10 102 +02041200.TOP 1.25 9.8 1084 -16.5 7.1 9.4 27.2 16.2 0.3 1.60 99 +03040500.ILN 1.25 10.4 1856 -15.7 6.5 20.8 25.6 17.7 1.0 2.20 233 +03090300.NKX 1.25 10.8 940 -5.9 6.6 7.0 5.9 4.2 0.1 0.70 9 +03090800.FGZ 1.25 8.3 663 -8.3 7.7 15.0 17.0 11.2 0.1 1.20 130 +03090800.PHX 1.25 12.1 2268 -6.7 6.7 10.7 16.8 8.2 0.3 1.20 90 +04032700.RAP 1.25 8.5 2052 -15.5 8.0 19.0 17.5 12.6 1.0 1.50 161 +04100400.AMA 1.25 10.5 1672 -13.5 7.6 23.5 31.9 10.7 1.0 2.40 28 +05030700.MAF 1.25 8.0 547 -16.7 6.9 34.3 40.4 16.9 0.4 1.90 177 +05090600.LBF 1.25 13.0 2252 -9.1 8.1 14.1 27.2 6.3 0.7 2.90 28 +05100123.LMN 1.25 15.9 2672 -9.9 7.0 21.4 26.0 14.1 1.5 -999.00 276 +06051500.TLH 1.25 10.8 1279 -13.7 7.1 24.7 23.2 18.5 0.8 1.70 104 +06052000.BOI 1.25 7.4 1070 -13.5 8.4 15.9 25.9 9.2 0.3 0.80 95 +06052600.FFC 1.25 12.1 1711 -12.1 7.1 8.7 3.3 4.1 0.4 1.10 46 +06060300.ILX 1.25 10.0 1218 -14.5 5.9 20.0 22.7 14.1 0.5 1.50 87 +06060312.LBF 1.25 7.7 988 -11.9 9.0 19.5 17.8 10.8 0.4 1.00 699 +06061200.DNR 1.25 6.0 942 -9.9 9.4 17.1 22.2 7.4 0.2 0.60 130 +06070400.GRB 1.25 14.1 1881 -10.1 6.6 22.8 40.7 14.0 1.0 0.60 132 +06072700.ILX 1.25 20.7 4385 -4.3 5.7 12.7 19.1 14.7 0.7 0.60 318 +06072800.FGZ 1.25 13.5 3100 -5.3 8.1 22.7 18.3 14.1 1.0 2.70 193 +90041400.OUN 1.25 10.8 1408 -18.2 7.9 23.5 33.0 17.5 1.2 2.00 146 +94062500.GSO 1.25 15.9 2334 -5.4 5.6 9.9 5.2 12.9 0.3 0.60 103 +00051400.TLH 1.00 15.9 3542 -9.9 6.9 4.2 4.2 5.4 0.4 1.00 -4 +00053000.LBF 1.00 9.9 2258 -9.7 9.2 27.2 31.9 16.9 1.3 1.10 294 +00060100.ILX 1.00 16.1 3208 -9.1 7.0 17.9 15.6 20.7 1.4 1.80 163 +00060200.DVN 1.00 16.4 3451 -9.3 7.3 14.1 11.0 14.2 1.3 0.60 175 +00060200.TOP 1.00 16.1 3517 -9.3 6.9 10.4 16.3 4.9 0.9 0.80 39 +00062100.TBW 1.00 17.1 3180 -8.5 6.4 12.2 19.0 8.9 0.9 0.60 49 +00062300.MHX 1.00 18.6 4167 -8.7 6.1 6.0 6.1 9.7 0.6 0.60 89 +00062600.DDC 1.00 13.5 2618 -6.1 6.7 15.8 16.9 14.3 0.5 1.60 51 +00062600.TOP 1.00 17.8 4052 -8.9 7.6 1.3 23.9 2.4 0.1 2.30 26 +00063000.PIT 1.00 9.9 1086 -15.9 5.5 22.0 37.9 8.1 0.5 1.80 77 +00070200.DDC 1.00 16.2 3566 -5.7 6.6 14.2 21.9 5.5 0.7 1.30 38 +00070200.RAP 1.00 15.6 5621 -9.7 8.7 21.5 22.7 15.9 3.8 2.20 263 +00070300.DDC 1.00 17.2 4558 -5.9 7.5 13.6 22.7 11.7 1.1 2.40 66 +00070300.OAX 1.00 18.5 4633 -6.3 6.9 10.6 19.6 9.9 0.9 1.90 133 +00070400.DDC 1.00 18.1 5142 -7.1 7.6 9.7 19.2 11.4 1.2 2.40 114 +00070700.RAP 1.00 14.2 4065 -7.7 8.6 29.4 33.3 10.8 2.7 2.10 111 +00071200.DDC 1.00 14.4 2941 -5.5 7.2 11.3 11.7 10.8 0.5 1.40 196 +00071400.GRB 1.00 12.0 1743 -12.3 6.9 21.5 42.9 13.4 0.9 1.70 195 +00071500.SHV 1.00 17.2 4004 -5.9 6.0 4.6 8.6 6.2 0.3 0.60 46 +00071700.TOP 1.00 15.9 3927 -8.7 7.9 8.9 14.1 14.5 0.9 2.40 198 +00071900.GYX 1.00 11.4 997 -13.3 6.0 27.0 36.1 18.8 0.6 1.00 107 +00072300.OTX 1.00 9.0 2088 -12.3 8.2 17.2 21.1 7.8 0.8 1.20 43 +00072700.JAN 1.00 12.5 2066 -10.7 6.4 8.0 8.4 4.2 0.3 1.00 -50 +00072800.LBF 1.00 17.1 5581 -7.7 8.1 25.0 21.1 9.6 3.5 3.10 187 +00072800.TOP 1.00 15.3 3666 -10.3 7.6 22.0 26.4 9.1 2.3 2.60 115 +00072900.CHS 1.00 16.1 2462 -7.5 5.6 9.3 13.2 3.3 0.4 0.60 4 +00072900.ILN 1.00 14.3 2735 -11.5 6.7 13.4 21.0 8.0 1.0 0.60 68 +00080700.TOP 1.00 17.3 4476 -7.5 7.2 17.8 22.9 11.7 1.8 1.80 72 +01061900.JAX 1.00 17.2 2584 -9.5 6.1 4.8 8.3 5.0 0.3 0.60 13 +01062100.ABR 1.00 8.1 1118 -19.3 7.0 4.2 12.4 3.6 0.1 1.30 14 +01062600.LBF 1.00 12.7 3931 -8.1 8.1 9.3 8.1 8.1 0.7 1.50 119 +02012400.LZK 1.00 13.1 1343 -12.7 6.6 32.5 40.7 20.2 1.1 0.60 290 +02042300.OAX 1.00 6.4 614 -23.3 7.9 26.3 36.6 15.2 0.4 1.40 133 +02051800.CRP 1.00 20.3 5902 -10.5 7.4 22.6 23.2 10.7 5.0 1.60 86 +02052700.AMA 1.00 9.7 2332 -11.1 7.2 14.5 11.8 13.0 0.6 1.40 198 +02060400.CHS 1.00 15.2 3170 -10.1 7.6 9.7 10.8 11.7 0.9 0.60 33 +02060700.ABR 1.00 9.0 2252 -14.7 8.1 12.4 18.1 8.2 0.7 1.20 118 +02070200.FFC 1.00 16.3 4268 -9.7 6.6 7.8 4.3 7.3 0.8 0.60 46 +02070300.LBF 1.00 14.1 3367 -5.9 7.5 14.0 6.2 11.5 0.7 1.20 158 +02072000.JAN 1.00 17.6 3501 -6.7 6.1 6.1 7.9 5.7 0.4 0.60 58 +02072600.TOP 1.00 13.8 3390 -5.9 7.5 16.9 16.9 11.9 0.8 2.20 168 +02072700.RAP 1.00 9.4 1688 -9.3 7.5 21.0 28.6 14.5 0.6 1.30 139 +02072900.AMA 1.00 13.6 3610 -6.5 7.8 12.5 12.2 13.6 0.7 2.00 164 +02080300.BMX 1.00 18.4 5098 -6.5 5.8 9.6 10.8 11.5 0.8 1.40 33 +02080400.SGF 1.00 17.7 4328 -5.5 6.5 1.1 7.6 3.8 0.1 1.50 -11 +03031500.TBW 1.00 15.9 3398 -13.7 7.0 18.6 27.3 3.9 2.3 0.90 32 +03032000.ILX 1.00 8.0 713 -21.9 6.9 3.5 11.4 5.4 0.1 1.40 -26 +03032100.DTX 1.00 8.7 1602 -21.3 6.6 13.3 27.1 7.7 0.6 1.10 80 +03040500.LZK 1.00 10.7 1751 -14.9 6.6 27.4 33.1 12.6 1.2 2.30 65 +03041800.DNR 1.00 5.3 1063 -18.1 8.6 11.0 43.9 5.9 0.2 0.60 41 +03042400.SHV 1.00 13.1 1456 -12.9 7.2 26.1 36.8 15.2 1.1 0.60 278 +03042800.MFL 1.00 16.7 2735 -10.7 6.4 11.7 25.5 12.3 0.9 0.60 83 +03043000.OAX 1.00 8.9 1064 -16.3 7.4 29.1 32.0 18.4 0.8 1.90 353 +03050100.FFC 1.00 11.1 1429 -13.5 6.6 6.9 6.4 1.0 0.2 1.60 5 +03050212.BNA 1.00 10.3 1865 -15.3 7.0 13.0 18.0 12.1 0.6 2.20 55 +03050312.BMX 1.00 9.7 1402 -16.1 7.5 13.8 38.5 7.9 0.5 1.80 72 +03051100.MHX 1.00 16.0 3585 -9.3 7.3 16.2 15.0 11.9 1.5 0.90 104 +03051200.JAX 1.00 15.9 3060 -7.9 6.9 13.2 20.0 10.1 0.8 -999.00 48 +03051800.TBW 1.00 16.1 3839 -8.7 6.5 5.7 11.9 6.2 0.5 1.10 3 +03051800.XMR 1.00 16.0 3602 -9.5 7.0 8.6 10.7 5.6 0.8 0.90 -7 +03052600.TFX 1.00 8.3 994 -10.9 8.0 16.0 15.9 9.1 0.3 1.30 59 +03052700.ABQ 1.00 7.1 713 -9.9 8.3 14.7 20.6 3.1 0.1 0.60 12 +03060200.DDC 1.00 11.1 1960 -9.5 7.9 17.5 20.6 11.9 0.7 2.00 222 +03060900.RNK 1.00 15.0 2965 -9.1 6.2 24.1 29.2 18.9 1.4 1.20 134 +03090900.TUS 1.00 11.5 2363 -8.3 7.3 7.9 11.8 2.8 0.3 1.10 12 +03111712.TOP 1.00 11.5 1641 -17.3 7.3 25.6 32.6 17.8 1.4 2.70 329 +04031500.DRT 1.00 11.6 1498 -15.5 7.0 16.8 24.5 6.6 0.8 1.40 123 +04032100.FWD 1.00 13.1 2648 -15.5 8.2 12.9 20.8 4.9 1.4 2.80 29 +04051000.FFC 1.00 11.4 2006 -11.1 5.4 4.7 11.0 4.0 0.2 1.90 -15 +04051200.AMA 1.00 9.7 1922 -11.5 8.0 15.0 8.4 19.1 0.6 1.60 282 +04080900.TOP 1.00 14.3 2676 -11.5 7.4 11.9 15.6 5.9 0.9 0.90 82 +04081700.TUS 1.00 13.1 2027 -8.9 7.1 13.2 13.3 8.8 0.5 1.00 96 +04082800.OUN 1.00 16.0 4225 -7.1 7.4 3.8 3.0 7.0 0.3 1.50 101 +05030400.SGF 1.00 5.9 823 -25.9 7.1 24.2 27.9 13.0 0.5 0.70 151 +05050412.TBW 1.00 14.1 1839 -13.5 7.3 15.8 33.3 10.0 1.0 1.00 187 +05050600.EPZ 1.00 8.0 1672 -12.7 8.6 27.7 28.8 15.0 1.0 1.20 178 +05081100.GGW 1.00 10.1 805 -13.7 7.4 30.5 38.9 15.6 0.6 2.10 170 +05081700.GGW 1.00 9.2 1042 -11.1 7.8 27.6 40.5 16.7 0.5 1.70 265 +05081800.LMN 1.00 17.7 3655 -4.1 6.0 22.3 17.3 13.3 0.8 0.60 221 +05082700.EPZ 1.00 11.1 2162 -6.5 8.5 4.9 6.7 4.0 0.2 1.00 21 +05092900.FWD 1.00 12.7 1553 -5.9 6.4 10.1 13.0 8.5 0.2 0.60 39 +06010300.ILN 1.00 9.0 791 -19.3 7.5 16.0 23.8 7.8 0.4 1.40 140 +06011200.GSO 1.00 9.5 1374 -19.1 7.5 15.6 28.9 21.9 0.7 2.50 253 +06041400.BUF 1.00 6.2 383 -23.3 7.6 26.8 55.7 21.6 0.3 1.40 237 +06041400.PIT 1.00 6.2 390 -20.1 7.0 18.6 40.0 18.8 0.1 0.90 220 +06051600.DTX 1.00 8.7 519 -20.5 6.1 5.0 17.9 7.2 0.1 0.70 -7 +06051800.IAD 1.00 8.4 1009 -20.5 6.7 16.0 20.3 11.9 0.4 1.30 66 +06052300.RAP 1.00 9.6 2536 -10.3 8.5 9.7 18.1 5.6 0.5 1.30 43 +06052600.AMA 1.00 7.9 1911 -11.3 9.9 16.9 12.6 11.8 0.7 0.70 262 +06052600.GSO 1.00 11.9 1743 -10.1 6.1 14.4 11.4 8.4 0.4 0.80 82 +06052600.JAX 1.00 13.3 1856 -10.7 6.6 15.3 20.8 10.5 0.6 0.60 70 +06052700.BIS 1.00 9.4 2274 -11.9 8.5 22.0 21.3 20.2 1.1 1.30 198 +06052700.JAX 1.00 15.0 2879 -9.9 6.1 13.7 13.1 11.0 0.9 0.80 117 +06053100.GGW 1.00 5.6 570 -21.1 7.4 5.0 8.1 2.8 0.1 0.90 30 +06060200.BNA 1.00 14.2 2055 -7.9 5.4 5.5 12.6 8.6 0.2 0.60 -2 +06060300.GRB 1.00 8.8 1314 -18.9 7.1 16.3 19.5 12.0 0.6 1.60 77 +06060400.ILN 1.00 8.3 1032 -18.1 6.5 8.5 11.1 6.7 0.2 1.20 35 +06060500.FFC 1.00 11.0 1475 -12.5 5.9 11.7 22.4 5.7 0.3 2.10 18 +06060700.SHV 1.00 14.6 2252 -10.3 7.4 25.4 14.5 15.1 1.5 0.60 164 +06060712.RAP 1.00 7.9 1110 -10.3 8.7 12.3 19.2 9.9 0.2 1.30 131 +06060800.LBF 1.00 10.8 2368 -6.9 7.7 20.5 22.3 11.2 0.7 1.70 244 +06061200.BNA 1.00 13.6 1539 -6.7 5.6 15.2 7.0 9.1 0.3 0.60 107 +06061900.GRB 1.00 14.0 2397 -11.7 6.2 15.9 20.9 12.4 0.9 1.90 74 +06062100.BNA 1.00 14.1 2387 -9.3 6.8 6.7 3.3 6.8 0.3 0.60 43 +06062200.JAN 1.00 15.3 2595 -8.7 7.0 3.0 2.5 4.6 0.2 0.60 -15 +06062300.BMX 1.00 12.5 1595 -7.1 6.2 5.1 4.3 1.9 0.1 0.60 -10 +06062300.BNA 1.00 15.6 3023 -10.1 7.3 10.6 3.6 8.0 0.9 0.60 71 +06062300.DDC 1.00 11.0 987 -11.1 7.2 17.7 17.5 9.3 0.4 1.30 78 +06062700.FFC 1.00 15.4 2376 -6.9 5.6 12.6 21.6 9.3 0.4 0.60 23 +06062800.GRB 1.00 9.4 1049 -15.5 6.1 13.8 20.6 8.1 0.3 1.60 34 +06062900.PIT 1.00 10.9 925 -13.7 6.4 21.3 35.7 7.1 0.4 1.60 17 +06062900.TOP 1.00 8.5 959 -12.3 7.1 12.7 14.7 8.1 0.2 1.00 120 +06070200.FFC 1.00 11.2 1552 -9.7 6.3 6.5 9.5 1.2 0.2 0.90 4 +06070200.FWD 1.00 12.8 1806 -9.9 7.2 6.1 11.2 1.6 0.2 0.60 20 +06070200.LBF 1.00 12.2 2554 -8.5 8.0 20.5 17.9 17.1 1.0 2.00 223 +06070300.IAD 1.00 14.8 3195 -9.3 5.9 10.7 13.6 10.7 0.7 0.90 60 +06070500.GSO 1.00 15.2 2335 -7.3 6.1 9.6 6.1 7.6 0.4 0.60 96 +06071300.BIS 1.00 9.0 966 -8.7 8.1 7.7 14.5 5.9 0.1 0.70 108 +06071800.DNR 1.00 9.1 1197 -6.9 8.0 7.7 6.2 3.5 0.1 1.10 83 +06072000.RNK 1.00 14.2 2160 -8.5 5.9 9.1 3.0 11.1 0.3 1.00 113 +06072200.RNK 1.00 16.5 3249 -6.1 6.0 7.0 9.1 7.2 0.3 0.60 100 +06072300.ABQ 1.00 9.6 1267 -4.9 7.8 5.7 11.2 2.8 0.1 1.00 -9 +06072700.RAP 1.00 8.7 694 -8.7 8.3 16.3 21.8 13.4 0.2 0.90 157 +06072800.ABR 1.00 12.7 1956 -6.1 6.4 23.5 29.4 16.1 0.5 1.40 149 +06072800.OAX 1.00 15.6 2714 -5.3 6.0 16.8 22.8 9.3 0.5 0.60 92 +06080100.PIT 1.00 18.6 3456 -4.5 5.8 12.7 7.9 10.1 0.5 0.60 104 +06081000.TUS 1.00 13.4 1913 -6.3 7.3 3.1 6.2 1.2 0.1 0.60 12 +06090800.ABR 1.00 9.5 1406 -14.3 7.5 9.4 9.1 10.6 0.3 1.70 163 +06090800.LBF 1.00 7.9 880 -14.1 7.5 11.1 19.9 6.9 0.2 0.90 20 +06091200.ILX 1.00 13.6 1642 -11.1 6.4 12.9 23.9 8.6 0.5 0.60 56 +06092900.FFC 1.00 10.8 705 -11.1 4.6 19.1 33.4 18.9 0.2 0.60 85 +89060500.1M1 1.00 15.8 2493 -8.2 6.0 14.7 13.0 10.3 0.7 0.60 19 +89061200.JAN 1.00 17.7 3616 -9.1 6.5 15.3 5.8 7.5 1.4 0.60 84 +89061400.JAN 1.00 16.0 3274 -11.5 7.1 11.3 8.2 9.4 1.2 1.00 57 +89061600.TBW 1.00 16.4 3463 -7.6 5.7 10.2 6.4 5.9 0.6 0.60 36 +89061900.CKL 1.00 16.7 3363 -9.6 6.4 14.5 12.2 12.2 1.2 0.60 103 +89062800.HTS 1.00 17.6 3659 -8.0 5.8 15.4 21.4 7.4 1.1 0.60 62 +89062900.AMA 1.00 12.6 2035 -8.2 8.6 14.8 26.0 13.0 0.6 2.30 165 +89070600.OUN 1.00 12.9 1373 -6.0 6.2 6.0 12.2 11.3 0.1 0.60 64 +89071200.TOP 1.00 16.6 3182 -8.1 7.6 12.6 8.2 13.2 1.0 1.60 157 +89072400.VCT 1.00 14.8 2953 -9.6 6.2 7.7 13.3 9.5 0.5 0.60 120 +89072800.DAY 1.00 16.4 2617 -7.8 5.7 13.5 11.3 7.5 0.6 0.60 83 +89073100.GTF 1.00 9.5 1858 -9.3 8.9 10.8 21.7 10.3 0.4 1.20 106 +89080600.OUN 1.00 16.3 3439 -5.4 6.8 10.2 12.1 9.7 0.5 0.80 101 +89082000.UMN 1.00 17.3 3524 -6.0 6.2 20.6 14.9 13.6 1.1 0.80 350 +89082700.DDC 1.00 16.9 4549 -7.4 7.6 11.3 24.3 1.4 1.2 2.10 11 +90050400.CKL 1.00 14.0 1534 -10.6 6.4 20.1 25.8 10.8 0.7 0.60 141 +90061000.GSO 1.00 15.3 2409 -8.8 6.1 9.7 14.5 11.1 0.5 0.60 145 +90062300.HTS 1.00 14.5 1346 -8.5 5.8 27.1 36.9 19.1 0.6 0.60 231 +90062400.OUN 1.00 11.9 1571 -10.8 8.2 26.8 24.9 14.1 1.1 1.90 186 +90070900.GSO 1.00 17.6 4051 -5.3 5.6 10.2 10.5 6.1 0.5 0.80 73 +90071100.GSO 1.00 15.2 3487 -6.6 5.9 3.5 9.1 7.5 0.2 0.60 38 +90071800.AMA 1.00 11.4 1482 -6.5 6.7 14.8 26.1 8.4 0.3 1.10 98 +90072000.DEN 1.00 11.7 1698 -7.2 7.4 16.1 20.8 14.0 0.4 2.10 182 +90072200.TBW 1.00 17.8 3409 -5.7 6.0 4.6 7.8 3.6 0.2 0.60 35 +90072500.DDC 1.00 11.9 1703 -8.0 6.8 14.0 17.5 10.1 0.4 1.40 208 +90072600.GGW 1.00 10.2 1514 -10.6 7.0 15.6 16.6 7.9 0.4 1.80 55 +90080200.MAF 1.00 14.4 1702 -6.2 6.1 9.7 12.2 2.8 0.2 0.60 27 +90081900.AMA 1.00 13.6 2596 -7.9 7.0 5.1 5.1 3.8 0.2 0.80 45 +90082100.OUN 1.00 19.2 5290 -6.7 6.9 8.3 3.4 6.2 0.9 0.60 38 +90082300.HTS 1.00 15.2 707 -7.7 6.2 7.0 8.5 3.6 0.1 0.60 -4 +90083000.GSO 1.00 16.4 3552 -9.3 6.0 20.1 18.2 14.1 1.6 0.60 37 +90092900.MAF 1.00 12.2 1606 -8.0 6.0 15.0 28.7 11.3 0.3 0.80 35 +90100800.GGG 1.00 16.8 2689 -6.0 5.8 14.2 17.2 8.9 0.5 0.60 70 +90101800.GGG 1.00 14.2 1619 -10.6 6.4 20.0 27.9 12.5 0.7 0.60 114 +91060500.AHN 1.00 15.3 3036 -8.1 6.7 5.7 13.0 11.6 0.3 0.60 72 +91060500.CKL 1.00 16.9 3345 -7.5 6.3 5.0 4.8 9.2 0.3 0.60 52 +93092500.OUN 1.00 16.1 2895 -6.7 6.2 24.5 27.2 16.0 1.1 0.60 264 +97081700.DVN 1.00 20.8 5790 -8.3 7.5 14.3 11.8 12.3 2.6 1.00 137 +97081700.PIT 1.00 18.3 3951 -7.9 6.9 12.7 23.0 15.4 1.2 0.60 224 +97081800.FFC 1.00 18.4 3564 -6.1 6.1 2.5 2.0 4.4 0.1 0.60 37 +98052200.BNA 1.00 15.2 3709 -10.7 6.4 9.2 7.9 10.4 0.8 0.90 83 +99061200.ILN 1.00 14.7 3299 -8.3 5.8 4.6 4.0 8.2 0.3 1.10 32 +00021800.JAN 0.88 12.5 1866 -14.9 6.7 27.5 38.9 16.2 1.5 0.70 270 +00061100.DDC 0.88 14.3 3471 -7.9 6.9 11.0 20.2 14.0 0.7 2.40 53 +00061800.RAP 0.88 7.4 1396 -18.9 7.1 14.0 34.9 7.4 0.5 1.40 270 +00070600.DDC 0.88 12.3 2581 -7.5 8.5 9.4 10.0 10.7 0.5 1.80 97 +00072800.BMX 0.88 13.2 2147 -9.5 6.2 8.0 11.4 6.0 0.3 0.70 35 +00080200.DVN 0.88 16.6 4183 -9.7 6.6 11.2 16.4 13.3 1.2 1.10 169 +00080300.PIT 0.88 14.9 2780 -9.7 6.2 15.5 29.2 9.1 0.9 0.60 81 +00080400.BNA 0.88 16.3 3453 -9.9 6.8 10.9 16.0 9.1 1.0 0.60 83 +00080500.LZK 0.88 16.1 3872 -6.3 5.6 9.4 14.6 7.3 0.5 0.80 6 +00080700.DTX 0.88 19.4 4231 -7.3 6.0 16.6 31.6 10.6 1.4 0.60 78 +00090300.OAX 0.88 12.6 3099 -10.1 8.7 16.9 21.6 9.5 1.4 1.40 126 +01062200.DVN 0.88 10.3 1285 -18.1 6.5 10.8 11.8 8.7 0.4 1.00 66 +01062600.CRP 0.88 16.6 3837 -8.5 6.4 4.0 8.9 7.1 0.3 0.60 53 +02031000.GSO 0.88 11.0 819 -15.3 5.8 24.6 29.7 19.8 0.5 1.20 236 +02052900.OAX 0.88 13.0 2754 -13.3 7.1 7.5 7.0 10.0 0.6 2.60 127 +03031400.TLH 0.88 11.6 2141 -13.1 6.3 10.5 9.0 5.7 0.5 1.10 39 +03042912.TOP 0.88 10.6 1617 -16.9 7.8 16.7 22.5 11.0 0.9 2.80 238 +03050400.BIS 0.88 8.2 1467 -18.7 7.4 15.4 16.1 8.8 0.6 1.60 86 +03060300.JAX 0.88 16.1 3513 -10.1 7.6 11.1 10.3 11.4 1.1 0.60 111 +03060600.ABR 0.88 8.1 888 -19.9 6.8 17.3 14.2 9.2 0.4 1.50 47 +03061600.TOP 0.88 12.4 1944 -11.9 6.4 0.8 4.2 5.8 0.0 1.00 3 +03062000.GGW 0.88 9.2 1032 -9.7 8.1 9.8 17.1 8.3 0.2 1.30 76 +03101712.JAN 0.88 12.8 1891 -11.5 6.3 25.4 33.9 16.9 1.1 1.20 246 +03102600.CRP 0.88 17.9 3408 -9.9 6.3 15.2 34.5 9.8 1.4 0.60 17 +03111800.OAX 0.88 10.0 957 -18.3 6.8 41.2 58.6 20.0 1.2 2.50 88 +04040900.AMA 0.88 8.2 1515 -16.7 7.0 17.9 23.0 14.7 0.6 1.60 139 +04081800.PHX 0.88 10.5 1709 -9.1 7.3 4.8 9.2 6.0 0.1 0.80 15 +04082700.ABR 0.88 10.2 1433 -15.1 6.7 14.4 40.5 5.3 0.5 1.50 28 +04091900.LCH 0.88 15.9 2433 -6.9 5.8 4.4 15.6 7.7 0.2 0.60 6 +04092000.OAK 0.88 7.3 242 -17.9 5.5 27.4 30.4 6.5 0.1 0.70 56 +04100400.GSO 0.88 13.2 1385 -14.9 6.5 15.2 26.8 10.4 0.6 1.40 101 +05081300.MAF 0.88 12.8 1568 -6.3 6.5 11.8 13.7 6.9 0.2 0.60 82 +06013012.JAN 0.88 10.0 1058 -20.9 7.1 38.7 46.0 18.9 1.5 2.60 71 +06032100.OUN 0.88 5.4 579 -25.5 7.4 16.6 26.7 5.7 0.2 0.90 53 +06040700.FWD 0.88 12.5 2831 -12.5 6.2 33.5 41.5 20.1 2.2 2.80 40 +06041200.TOP 0.88 8.4 726 -14.3 7.0 33.2 37.2 23.1 0.5 2.00 232 +06043000.OTX 0.88 6.4 499 -17.9 7.3 17.3 23.3 8.3 0.2 0.80 75 +89061200.AMA 0.88 13.2 3301 -11.7 8.7 12.9 25.2 9.2 1.4 2.30 167 +89062600.UMN 0.88 16.2 3812 -6.9 6.3 0.7 10.8 2.0 0.0 0.60 -14 +89062700.DEN 0.88 8.6 931 -11.1 7.6 14.3 14.3 10.8 0.2 1.80 122 +89072700.AHN 0.88 17.5 3996 -6.9 6.5 3.5 6.8 7.1 0.3 0.60 66 +89082500.AHN 0.88 16.9 3533 -5.1 6.1 3.3 8.1 2.7 0.1 0.60 5 +89082600.AHN 0.88 17.1 3463 -5.6 5.8 11.3 8.6 4.0 0.5 0.60 41 +89082900.GGG 0.88 18.5 3979 -4.6 6.0 4.1 2.2 1.6 0.2 0.60 3 +90071000.PIT 0.88 16.6 3362 -6.7 6.3 19.7 14.7 14.3 1.1 0.60 124 +90073000.AMA 0.88 12.2 943 -7.5 6.3 12.7 18.1 8.4 0.2 0.60 14 +90091900.OUN 0.88 18.0 3878 -6.7 6.2 11.9 20.5 12.1 0.8 0.60 119 +97010900.SIL 0.88 13.1 909 -13.6 6.7 39.7 37.0 33.7 1.0 -999.00 511 +98062500.DDC 0.88 11.9 2667 -7.3 8.7 25.1 34.7 12.4 1.2 1.40 224 +90052100.SIL 0.85 16.6 3505 -10.6 6.7 8.4 13.0 10.9 0.8 0.60 70 +03052100.TBW 0.80 15.8 2941 -9.5 6.2 2.7 5.4 7.1 0.2 0.60 27 +91051700.JAN 0.80 15.5 2890 -8.9 6.5 1.1 7.8 0.6 0.1 0.60 1 +00022400.LZK 0.75 10.6 1590 -18.1 7.0 25.0 34.2 17.2 1.3 2.50 270 +00050300.JAN 0.75 12.8 1438 -12.9 5.9 12.8 7.2 13.9 0.4 0.60 120 +00052200.LZK 0.75 12.1 2062 -13.5 6.2 22.6 32.5 17.7 1.1 1.40 162 +00061800.JAX 0.75 15.7 2677 -7.9 5.7 6.0 10.5 7.9 0.3 0.60 61 +00061900.WAL 0.75 17.4 2940 -7.9 6.3 11.3 9.5 11.6 0.7 0.60 134 +00062500.JAX 0.75 15.6 2442 -10.1 6.2 9.4 21.8 9.3 0.5 0.60 104 +00062900.GRB 0.75 8.9 860 -18.9 6.4 17.0 24.4 14.1 0.4 1.10 108 +00071300.DDC 0.75 15.1 3064 -3.7 6.1 6.2 10.6 9.2 0.2 0.60 0 +00071300.FWD 0.75 14.9 3103 -5.7 6.5 10.6 11.4 13.9 0.4 0.80 120 +00071800.JAN 0.75 15.8 3305 -5.5 6.0 13.9 14.4 13.1 0.6 0.60 -56 +00071900.JAN 0.75 17.3 3841 -6.1 6.1 7.5 6.9 5.7 0.4 0.60 32 +00072100.TBW 0.75 18.9 4845 -6.9 6.4 7.0 10.7 7.4 0.7 0.90 56 +00072300.GSO 0.75 16.5 2443 -9.1 5.7 20.6 22.2 6.6 1.0 0.60 88 +00072400.GGW 0.75 10.9 3240 -11.1 8.5 26.1 22.5 12.5 2.1 1.40 54 +00080400.LCH 0.75 15.7 3045 -7.5 5.6 2.8 12.8 4.7 0.1 0.60 28 +00090200.SHV 0.75 12.1 1896 -7.5 7.0 3.2 2.0 5.2 0.1 0.70 15 +01062400.BIS 0.75 13.7 4781 -10.9 9.0 18.7 27.1 15.0 2.8 1.70 249 +02030812.ILX 0.75 7.2 533 -19.7 6.9 31.5 49.1 16.1 0.4 1.30 599 +02051500.PIT 0.75 5.9 521 -27.9 7.9 14.7 14.3 17.3 0.2 1.10 74 +02060400.JAX 0.75 15.3 3128 -8.1 6.5 3.7 6.5 0.3 0.2 0.60 15 +02062500.LBF 0.75 11.7 3690 -10.3 9.2 7.2 9.1 5.0 0.7 1.30 45 +02072000.LZK 0.75 21.6 6551 -8.5 6.9 10.2 6.8 8.7 2.0 0.90 145 +03031500.OTX 0.75 6.3 801 -26.3 7.5 24.9 28.7 18.3 0.6 1.50 240 +03032000.SGF 0.75 7.6 909 -22.1 6.7 10.5 8.6 18.2 0.3 1.40 205 +03040922.XMR 0.75 15.5 2570 -10.3 5.6 31.0 38.3 12.7 1.7 0.60 34 +03042300.DNR 0.75 6.7 1183 -16.1 7.9 19.1 35.2 12.2 0.5 1.20 265 +03050100.DNR 0.75 6.7 1011 -20.1 8.0 33.5 27.3 12.5 0.9 1.20 108 +03050200.BMX 0.75 12.4 2216 -12.9 6.6 6.7 7.6 4.6 0.4 0.70 9 +03052400.PIT 0.75 10.0 707 -16.7 6.5 26.5 23.6 12.1 0.5 1.00 65 +03060700.MFL 0.75 18.2 3041 -6.7 5.6 2.8 9.3 0.9 0.1 0.60 5 +03061000.JAX 0.75 16.0 2482 -8.7 6.7 11.3 22.4 10.8 0.6 0.60 13 +03061222.XMR 0.75 17.1 2144 -7.9 6.1 4.6 6.1 5.2 0.2 0.60 65 +03061500.SHV 0.75 16.2 2511 -9.9 6.3 21.1 32.8 13.5 1.3 0.60 91 +03061900.TFX 0.75 8.6 1802 -9.3 8.2 10.8 13.4 13.1 0.3 1.00 178 +03062000.BOI 0.75 7.0 491 -12.5 8.2 23.3 18.1 17.9 0.2 1.00 141 +03062100.RAP 0.75 11.9 2338 -10.3 7.2 8.1 14.4 15.0 0.4 2.40 137 +03062200.IAD 0.75 10.5 1215 -17.1 5.8 15.1 9.7 9.3 0.5 1.10 79 +03090900.GJT 0.75 6.8 996 -12.3 9.1 17.7 28.1 8.5 0.3 0.70 199 +03090900.MAF 0.75 12.1 2389 -7.9 7.0 18.1 17.8 12.1 0.7 2.20 222 +03091000.JAN 0.75 15.0 1929 -9.5 6.0 10.8 22.1 8.1 0.4 0.60 83 +03111300.BUF 0.75 8.1 418 -20.5 6.7 46.9 65.5 18.0 0.5 1.50 335 +04030500.LZK 0.75 12.4 745 -10.1 5.8 39.6 53.2 27.8 0.5 0.60 468 +04051300.OAX 0.75 10.5 1193 -13.7 6.9 24.2 28.7 16.7 0.7 2.20 133 +04051700.FFC 0.75 12.2 2077 -12.1 6.4 2.0 11.6 2.9 0.1 0.80 0 +04052300.BUF 0.75 13.8 1807 -10.6 5.8 22.4 24.0 18.8 0.8 0.60 239 +04081700.PHX 0.75 12.6 2729 -7.9 7.1 8.0 6.2 6.2 0.4 1.30 60 +04081900.DDC 0.75 11.7 2146 -6.3 6.2 4.3 11.0 10.2 0.1 0.70 15 +04081900.OTX 0.75 9.8 1929 -11.3 7.4 9.9 15.1 6.2 0.4 1.50 43 +04082800.JAN 0.75 18.0 3714 -7.5 6.4 2.6 3.6 1.0 0.2 0.60 12 +04082800.PIT 0.75 18.3 3258 -6.1 5.6 7.8 6.8 10.4 0.4 0.60 106 +04092800.DNR 0.75 7.9 698 -13.9 7.1 17.7 21.0 12.4 0.2 1.00 112 +04100400.CHS 0.75 15.3 1850 -10.7 6.0 22.1 32.7 13.4 1.0 0.60 81 +05022200.BMX 0.75 11.8 1749 -15.9 6.8 26.1 36.8 19.0 1.4 1.20 174 +05030700.OAX 0.75 5.7 324 -21.9 7.4 14.9 9.6 13.6 0.1 0.90 156 +05042612.JAN 0.75 9.2 993 -17.3 6.9 27.2 35.7 15.7 0.7 2.20 336 +05050500.OTX 0.75 7.7 1601 -19.1 7.3 15.7 22.0 8.5 0.6 1.40 35 +05082100.OAX 0.75 15.5 2617 -6.9 6.0 14.8 30.9 15.0 0.6 0.60 159 +05082400.SHV 0.75 16.6 3397 -5.3 6.1 9.2 4.4 11.1 0.4 0.60 72 +06011400.JAX 0.75 12.1 1223 -15.1 6.5 19.6 26.7 19.7 0.7 0.70 233 +89052800.CKL 0.75 15.4 2098 -8.1 6.2 11.8 13.5 8.0 0.5 0.60 43 +89060400.PAH 0.75 16.4 3338 -9.7 5.8 14.2 14.7 15.5 1.0 0.60 90 +89060700.AHN 0.75 14.2 2402 -13.0 6.6 12.3 18.6 2.7 0.9 0.60 37 +89061300.CKL 0.75 16.1 2677 -8.6 6.1 15.9 7.3 11.5 0.9 0.60 102 +89061500.AHN 0.75 14.7 1717 -7.5 5.5 10.0 9.8 11.8 0.2 0.60 91 +89061600.ACY 0.75 16.5 2243 -7.6 5.9 18.8 19.1 19.5 0.7 0.60 217 +89062200.CKL 0.75 16.1 2986 -10.1 6.7 10.0 8.5 6.8 0.8 0.60 76 +89062300.GRB 0.75 14.6 1729 -8.4 6.2 10.7 10.8 10.0 0.3 -999.00 139 +89062300.OUN 0.75 16.0 3217 -7.1 5.9 12.8 14.9 6.9 0.7 0.60 113 +89062700.PIT 0.75 16.0 2924 -9.1 6.8 8.1 4.9 7.9 0.6 0.60 69 +89070800.AHN 0.75 16.8 2876 -6.5 5.8 4.1 4.8 4.3 0.2 0.60 33 +89071100.DDC 0.75 11.9 1858 -8.1 7.6 8.5 14.0 12.4 0.3 2.10 249 +89072900.SIL 0.75 18.8 4031 -6.8 6.3 4.1 4.4 3.9 0.3 0.60 37 +89073000.PAH 0.75 17.9 3630 -7.0 6.4 11.4 9.0 7.4 0.8 0.60 58 +89073100.TOP 0.75 14.5 2685 -6.4 6.7 9.8 13.0 12.0 0.4 0.60 117 +89081200.GRB 0.75 11.3 1782 -14.8 6.7 4.1 9.5 3.9 0.2 0.60 39 +89081900.HON 0.75 13.1 984 -7.6 7.1 14.0 17.9 12.1 0.2 -999.00 244 +89102800.OUN 0.75 12.0 1679 -12.7 6.8 10.1 27.1 8.3 0.4 1.00 115 +90033100.TBW 0.75 14.8 2515 -10.0 5.6 14.0 15.0 12.0 0.7 0.60 135 +90042100.OUN 0.75 12.4 1915 -14.1 6.5 25.3 31.9 13.1 1.3 1.70 138 +90042200.SEP 0.75 13.3 2775 -11.7 6.5 10.2 20.8 8.1 0.7 1.00 98 +90042400.1M1 0.75 12.8 2374 -12.6 6.7 14.0 8.3 6.6 0.9 0.90 56 +90052500.MAF 0.75 13.1 3262 -7.2 7.9 22.0 30.6 12.4 1.3 1.80 97 +90060400.PIT 0.75 9.5 390 -12.5 5.6 26.0 37.7 14.6 0.2 0.60 57 +90060700.TBW 0.75 17.0 3262 -8.6 6.0 1.6 7.3 4.1 0.1 0.60 8 +90061000.AHN 0.75 14.8 2847 -8.2 5.9 8.6 9.9 5.6 0.4 0.60 50 +90070300.SLI 0.75 18.4 3250 -5.7 5.8 11.8 14.5 7.5 0.6 0.60 79 +90070800.TBW 0.75 20.0 5452 -8.1 6.5 7.8 15.4 5.9 1.1 0.60 11 +90072200.CHS 0.75 18.4 3537 -7.5 6.2 8.3 10.2 7.1 0.6 0.60 88 +90072200.PAH 0.75 16.9 2541 -5.6 5.7 13.3 15.3 11.4 0.4 0.60 80 +90072700.DDC 0.75 14.7 3550 -7.0 7.6 7.6 7.2 6.0 0.5 2.20 84 +90072800.TOP 0.75 16.5 3231 -7.8 6.7 8.8 11.3 9.8 0.6 0.90 281 +90073100.JAN 0.75 14.6 2834 -7.3 6.1 5.1 4.3 0.7 0.2 0.60 -3 +90080400.STC 0.75 13.1 2284 -12.5 7.3 5.3 20.0 8.7 0.3 1.40 45 +90081400.ALB 0.75 14.6 1251 -7.6 5.7 31.1 21.6 20.7 0.6 0.60 261 +90081400.MAF 0.75 13.7 1598 -7.1 6.2 4.4 16.6 2.3 0.1 0.60 35 +90081700.CHS 0.75 19.5 3949 -6.9 5.7 14.2 20.9 11.2 1.0 0.60 101 +90081900.DEN 0.75 11.7 1982 -7.8 7.6 10.2 22.1 6.4 0.3 1.70 25 +90082000.PIA 0.75 19.3 4350 -6.5 6.2 12.0 9.9 9.4 1.0 0.60 67 +90082200.BNA 0.75 15.5 2619 -6.1 6.1 9.1 12.7 8.7 0.3 0.60 -10 +90082300.GGG 0.75 16.2 3016 -5.9 6.0 1.3 5.5 5.3 0.1 0.60 35 +90082500.OUN 0.75 15.7 2800 -6.4 6.6 5.0 11.9 5.3 0.2 0.60 63 +90082500.OVN 0.75 17.2 3418 -7.1 6.4 12.0 21.9 10.0 0.8 0.70 181 +90083000.ACY 0.75 15.2 2413 -9.3 5.8 13.9 22.7 9.0 0.7 0.60 62 +90101700.MAF 0.75 12.3 2870 -12.5 8.0 14.9 16.2 7.7 1.3 2.30 78 +91051700.TBW 0.75 16.1 3306 -7.5 5.4 4.0 0.9 3.8 0.2 0.60 -5 +91060600.CKL 0.75 16.3 2864 -8.6 6.4 8.9 11.4 6.2 0.5 0.60 21 +94062400.GGG 0.75 18.0 3754 -5.5 6.3 11.0 14.2 8.2 0.6 0.60 98 +94062400.HTS 0.75 16.5 2798 -5.5 5.3 8.5 15.0 4.7 0.3 0.60 39 +94070200.LCH 0.75 17.0 2754 -6.8 6.4 10.7 11.0 12.4 0.5 0.60 84 +97061700.BMX 0.75 18.2 3829 -6.9 5.9 12.4 13.0 6.9 0.8 0.60 48 +97062400.MAF 0.75 14.1 3310 -9.9 8.9 11.5 8.6 13.0 1.1 1.60 108 +97081700.TBW 0.75 17.4 3152 -7.3 6.2 2.6 4.4 1.8 0.2 0.60 8 +97081800.SLC 0.75 8.3 931 -10.3 8.5 16.1 22.9 13.6 0.3 1.40 203 +97082200.ILN 0.75 9.6 520 -16.3 5.8 17.5 30.9 3.9 0.2 0.70 50 +98062500.JAN 0.75 17.3 3507 -6.1 6.0 2.3 8.6 7.1 0.1 0.70 -1 +98081000.SHV 0.75 16.8 3464 -6.5 5.9 4.8 1.1 4.2 0.3 0.60 42 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 8300baea25..546cfc6267 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/parameterization.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/parameterization.c @@ -1,4 +1,7 @@ #define GLOBAL +#ifdef _WIN32 +#include +#endif #include "sharp95.h" void write_scheme_file(char st[80]) diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/rlt.script b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/rlt.script old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sars.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sars.f index c2e56519f4..18bb2c3b97 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sars.f +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sars.f @@ -4,7 +4,7 @@ + sndglist, haillist, fname) 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. @@ -21,7 +21,7 @@ c Jan 27, 2010, REJ. character datestn*15,dummy*25,matdatestn(maob)*15 character sndglist(saob)*15, fname*(80), fname1*(80) - integer maob,j,cnt,mrmat(maob),capemat(maob),tempmat(maob), + integer j,cnt,mrmat(maob),capemat(maob),tempmat(maob), & lrmat(maob),shrmat(maob),km9mat(maob),shr3mat(maob),golf, & sigm(maob),tier1,tier1cnt,srhmat(maob) diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sfcmap.out b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sfcmap.out old mode 100755 new mode 100644 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 cd4dd0cb45..c3697ea1ce 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.c @@ -43,6 +43,7 @@ History hist; struct _configure config; +#ifndef _WIN32 void main(int argc, char *argv[]) { int i; @@ -125,3 +126,4 @@ void main(int argc, char *argv[]) /* Pass args so that X gets command line args */ make_screen(argc, argv); } +#endif diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.h index 7eb0464519..62b79e48a2 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.h +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.h @@ -14,13 +14,17 @@ hpgl.h:1: parse error before `*' */ #include "winter.h" +#ifndef _WIN32 #include "xwvideo.h" #include "save.h" +#endif #include "globals_xw.h" #include "config.h" #include "textsave.h" #include "sndglib.h" +#ifndef _WIN32 #include "hpgl.h" +#endif void write_scheme_file(char st[80]); void write_hail_file(char st[80]); diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/siglist.txt b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/siglist.txt old mode 100755 new mode 100644 index 3995f55c39..11e50be13e --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/siglist.txt +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/siglist.txt @@ -1,641 +1,641 @@ -FILENAME CAT MLMIXR ML CAPE ML CIN MLCL(MAGL) 0-1SRH 0-6KT STPC 500 T (C) 500DIR 7-5 LR 0-3(KT) 0-9(KT) 0-3 KM SRH (M2/S2) -00042320.TXK 2 12.9 1702 -1 657 134 61.7 2.3 -14.0 250 6.5 32.8 76.6 166 -00042001.PPF 2 13.5 2614 -50 1216 227 59.9 4.7 -12.9 234 7.5 39.7 73.5 244 -00032900.FTW 2 13.1 2058 -42 1069 83 49.7 1.3 -15.2 245 8.0 21.9 87.1 126 -00032304.SJT 2 11.9 1680 -119 896 119 61.1 1.1 -15.5 212 9.1 38.4 66.9 217 -00031622.ATT 2 9.4 1019 -7 1566 12 45.8 0.0 -17.5 249 8.0 34.4 53.7 159 -00021323.LRF 2 9.2 1256 -9 1066 82 46.9 0.8 -21.2 249 7.5 32.3 51.4 114 -00010323.MEI 2 13.4 1148 -15 769 241 57.2 2.6 -10.0 226 6.1 38.8 71.2 288 -00010319.GWO 2 12.8 1168 -9 770 202 66.4 2.4 -13.0 223 7.5 47.3 75.1 246 -03050500.UMN 2 13.8 2392 -10 773 341 66.3 8.2 -13.4 237 7.7 49.1 93.8 411 -03050500.JBR 2 15.7 2713 -22 862 266 57.8 6.9 -10.7 240 7.1 50.5 82.9 440 -03050421.TUL 2 16.1 3621 -15 843 147 63.1 5.3 -11.7 230 7.3 45.6 100.2 160 -03050421.MKC 2 13.7 2002 -67 478 479 68.4 8.5 -14.6 224 7.9 48.1 89.8 508 -03050420.P#F 2 15.7 3397 -1 660 166 58.5 5.5 -12.7 230 7.8 34.3 100.9 195 -03050321.P#T 2 12.7 3156 -2 1967 61 36.2 0.0 -9.8 247 7.5 27.2 67.1 207 -03042503.JAN 2 13.5 2568 -27 924 257 44.3 4.9 -15.4 255 7.7 41.1 76.9 279 -03041922.PNC 2 11.5 1157 -40 665 212 87.9 2.5 -17.9 223 7.3 46.5 111.5 242 -03041523.CDS 2 10.7 1020 -106 1534 326 74.0 1.0 -12.4 234 7.5 56.1 83.8 531 -03041522.LBB 2 8.8 883 -53 1986 116 77.2 0.0 -11.7 243 7.5 48.5 87.4 276 -03040702.CLN 2 13.1 488 -133 780 363 62.7 0.8 -11.4 244 7.1 33.6 74.1 411 -03040623.ESF 2 15.8 1847 -29 621 166 51.8 2.6 -11.0 246 6.8 26.8 50.8 161 -03032722.MIA 2 12.4 299 -31 1074 187 48.8 0.4 -10.5 261 5.8 20.5 87.0 197 -01061900.ROS 2 13.6 2218 -30 1076 140 67.7 2.9 -11.1 250 8.2 40.5 73.6 279 -01061401.LNK 2 17.2 4665 -15 1190 173 39.2 4.3 -10.5 215 8.3 32.6 50.7 217 -01061120.ILL 2 14.7 3400 -120 1255 270 56.1 3.4 -10.8 259 8.6 41.9 54.8 448 -01060222.LOZ 2 9.7 164 -10 898 117 51.4 0.2 -13.4 270 5.3 39.8 66.8 189 -01053000.AMA 2 13.0 2887 -76 1322 166 48.4 2.2 -10.1 246 8.4 38.6 50.6 216 -01052902.LHX 2 10.9 1698 -120 1285 185 52.1 1.0 -10.0 251 8.2 38.9 60.5 365 -01052118.OZW 2 12.5 494 -2 775 133 33.4 0.4 -10.3 188 5.6 34.2 36.9 174 -01052022.MIN 2 16.9 3331 -2 711 122 47.8 3.2 -11.0 244 7.3 36.0 67.7 201 -01051022.MIW 2 12.8 2912 -24 1091 65 36.4 1.0 -16.0 255 7.9 28.8 43.0 141 -01051001.FBL 2 9.5 2106 -90 1776 330 50.0 1.0 -16.6 265 8.2 42.9 50.3 516 -01050200.AUM 2 11.2 1434 -74 1331 179 38.8 0.9 -13.3 251 7.5 36.0 52.3 237 -01042202.GBD 2 12.6 2145 -40 777 165 61.8 3.5 -13.6 229 7.8 41.6 62.6 328 -01041423.P28 2 12.3 2168 -54 827 145 76.4 3.1 -16.2 256 8.3 45.0 89.5 235 -01041117.LWD 2 11.9 968 -3 632 282 77.0 2.7 -15.1 208 7.5 38.2 81.4 327 -01040918.BVI 2 10.7 1326 -11 1210 102 57.2 1.0 -15.4 266 7.7 32.1 32.1 174 -01022422.SGT 2 11.8 1020 -15 967 335 52.8 3.0 -14.3 213 7.7 53.6 64.9 450 -00110820.HEZ 2 15.9 2158 -6 881 236 47.1 4.0 -8.5 204 6.2 29.0 68.5 266 -00103122.HLC 2 11.0 1274 -14 954 110 47.4 1.1 -14.1 202 7.4 32.6 74.4 169 -00092022.DAY 2 13.9 1299 -7 971 215 63.4 2.8 -8.2 237 6.1 37.5 61.0 237 -00072601.OTG 2 14.5 2869 -49 1055 88 42.5 1.7 -12.6 290 7.2 33.4 41.3 161 -00072523.RWF 2 14.6 2791 -13 1068 96 39.4 1.6 -12.0 275 7.0 29.2 35.8 163 -00071122.BKX 2 14.7 1167 -47 944 134 42.8 1.1 -7.8 261 6.8 27.2 67.9 205 -00070601.SNY 2 13.6 2847 -18 1681 52 57.5 0.5 -7.4 248 8.1 19.0 74.4 122 -00052319.BWG 2 13.7 2114 -41 1128 167 38.6 2.0 -11.4 294 6.9 36.9 62.8 278 -00051722.LXN 2 14.0 3552 -16 910 111 27.5 1.8 -13.9 169 8.4 28.1 44.5 170 -00051200.ALO 2 16.5 4382 -13 1110 168 51.1 5.6 -7.9 254 6.7 33.2 51.6 199 -00050101.MWL 2 13.0 2207 -103 1176 253 47.3 2.4 -12.4 227 8.2 40.3 37.8 297 -00042323.SHV 2 13.4 2001 -19 928 216 58.9 4.2 -13.0 261 6.7 41.9 60.0 296 -04051923.GFK 2 11.2 967 -44 828 233 54.9 2.1 -16.6 243 7.2 39.5 86.1 229 -04051302.ICT 2 15.9 3157 -12 538 223 36.4 4.3 -9.4 232 6.4 23.8 51.5 245 -04051101.LIC 2 9.0 1549 -59 1592 233 43.4 1.0 -11.5 244 8.4 35.1 46.6 395 -04042022.PIA 2 12.4 1852 -11 728 320 36.4 3.6 -14.7 235 6.2 38.5 40.1 488 -04032718.DDC 2 10.0 1332 -8 893 190 41.4 1.7 -16.6 206 7.5 30.8 47.5 198 -04030418.ABI 2 10.7 626 -20 1108 319 46.5 1.4 -13.7 196 7.0 40.3 84.2 350 -03111718.HOU 2 16.4 1980 -1 445 137 48.2 2.2 -12.4 207 6.6 24.0 77.0 158 -03111223.MFD 2 8.3 64 -56 890 219 99.1 0.1 -15.7 261 5.7 55.1 123.1 275 -03111220.MIE 2 9.7 388 -1 757 123 91.0 0.5 -15.6 258 5.7 47.1 117.3 205 -03082201.JXN 2 17.2 3046 -36 1091 255 31.0 3.6 -5.9 285 6.6 34.4 33.2 304 -03072122.AVP 2 14.3 1810 -16 1228 162 51.1 1.9 -7.9 239 5.6 45.7 49.9 148 -03072104.CID 2 17.8 2344 -22 462 187 48.9 3.6 -7.0 291 7.0 34.2 63.6 237 -03072101.ALO 2 15.0 1859 -107 921 156 49.6 1.5 -8.0 297 7.0 28.2 58.2 248 -03062500.HON 2 17.0 3737 -23 1021 335 52.2 10.7 -7.4 227 7.5 43.4 61.6 550 -03062422.MHE 2 19.5 5088 -22 717 256 55.5 12.1 -8.0 228 7.9 40.9 58.4 422 -03062421.MHE 2 17.5 3584 -16 768 252 56.0 8.4 -7.9 220 7.8 38.8 57.2 348 -03062302.P#8 2 16.8 3414 -169 1003 367 38.7 1.7 -6.8 227 7.6 30.2 57.1 437 -03062223.P#8 2 17.7 4366 -39 972 253 38.8 7.2 -8.3 246 8.6 34.3 54.7 387 -03061001.P#9 2 12.6 2103 -97 1467 421 51.0 2.8 -11.2 266 7.9 45.5 63.9 651 -03053103.CMI 2 12.6 701 -119 899 482 64.7 1.8 -11.6 292 6.3 36.9 85.1 523 -03053101.ILX 2 12.4 784 -55 1108 474 76.0 3.2 -8.5 294 5.0 45.0 90.9 524 -03051100.UIN 2 14.7 2093 -27 738 302 63.1 6.3 -11.7 240 7.7 43.7 97.9 354 -03051004.C34 2 17.3 3493 -14 749 452 53.6 14.1 -8.8 228 7.7 32.1 77.0 511 -03050923.HBR 2 11.1 1389 -64 2135 137 56.8 0.0 -9.1 231 7.7 35.8 78.1 219 -03050900.C30 2 14.6 1749 -112 819 321 69.8 3.3 -8.9 227 6.8 57.0 72.2 306 -03050823.C34 2 17.9 3605 -25 669 342 65.2 12.3 -7.2 233 7.1 42.3 72.0 318 -03050822.W#N 2 17.4 3730 -13 635 141 70.0 5.3 -10.1 228 7.6 45.5 81.3 173 -03050821.LW1 2 19.1 5309 -6 876 145 63.2 7.7 -8.7 235 7.4 31.6 71.3 182 -03050807.ADM 2 17.1 3114 -53 730 439 47.4 10.6 -9.3 253 8.0 50.2 61.5 608 -03050805.SPS 2 16.0 2409 -148 836 382 44.4 2.4 -9.1 262 7.9 43.1 59.0 798 -03050703.PAH 2 15.8 2873 -49 602 390 36.8 6.9 -13.6 237 7.9 35.3 70.1 454 -03050701.CGI 2 15.1 2935 -47 799 431 61.0 12.6 -14.4 269 7.8 32.8 83.2 580 -03050504.MKL 2 15.6 2334 -16 833 615 59.6 14.3 -9.9 251 7.1 62.0 77.1 842 -03050501.LZK 2 15.9 2390 -18 719 361 67.0 8.6 -11.0 237 7.4 41.7 97.3 397 -99120301.GOK 2 10.2 1811 -12 858 234 47.2 3.3 -21.1 202 8.2 32.4 63.0 262 -99081601.JMS 2 13.6 1255 -165 1044 130 48.5 0.3 -9.9 240 8.1 30.2 89.4 174 -99070900.ONA 2 18.4 3379 -18 992 385 46.0 10.0 -5.8 275 6.5 42.9 49.4 571 -99070400.OSC 2 15.9 1760 -27 1078 101 26.7 0.7 -6.7 320 6.2 28.3 31.6 163 -99060620.HCO 2 14.6 3241 -5 904 65 29.6 1.0 -16.1 175 8.1 26.8 70.8 115 -99060500.IEN 2 12.1 2533 -37 1323 70 52.4 1.0 -11.4 201 8.2 32.9 60.1 191 -99060400.HLC 2 15.7 4348 -16 1101 154 38.3 3.9 -9.3 240 7.5 36.9 40.6 277 -99060200.TBN 2 14.9 2338 -19 838 136 37.3 2.0 -10.3 259 6.5 40.0 21.6 223 -99060123.MKO 2 17.3 3739 0 888 68 38.1 1.6 -10.6 279 7.9 32.2 23.0 135 -99060100.LIC 2 9.1 1877 -49 1439 56 56.8 0.6 -13.7 249 9.2 34.3 62.4 140 -99051621.OMA 2 16.1 4691 0 824 102 38.6 3.1 -14.5 223 8.8 33.7 41.5 176 -99051122.BMQ 2 15.0 3545 -92 1026 40 35.1 0.6 -12.3 259 8.0 21.8 29.6 59 -99050408.JCT 2 13.0 2082 -218 838 355 55.0 0.0 -11.2 254 8.3 46.8 58.7 506 -99050402.GOK 2 13.9 3154 -61 723 366 51.4 9.2 -14.6 240 8.2 36.8 57.5 441 -99050401.ICT 2 12.6 2748 -7 1016 257 31.8 3.7 -14.7 227 7.9 40.5 70.4 415 -99050323.OKC 2 15.2 4117 -15 733 308 43.5 9.2 -13.2 243 7.8 43.2 70.1 401 -99050300.HSI 2 8.0 203 -4 845 168 41.5 0.2 -17.7 222 6.7 28.6 32.1 221 -99042200.END 2 12.7 3301 -34 1156 225 46.1 4.8 -15.4 236 8.1 35.1 48.2 242 -04082700.RDD 2 18.4 3706 -37 940 184 41.0 4.7 -6.9 255 7.1 28.7 60.7 258 -04071823.GFK 2 16.7 3575 -36 1246 117 45.4 2.4 -7.9 310 6.8 35.1 45.5 292 -04071302.GRI 2 15.9 3090 -197 1538 152 29.0 0.0 -7.9 298 8.5 13.8 50.5 173 -04062402.OSH 2 11.1 1428 -30 700 187 62.2 2.7 -16.7 257 6.5 50.9 79.3 234 -04061620.LAA 2 12.3 1494 -63 908 129 51.4 1.5 -9.4 252 7.7 34.1 57.1 369 -04061300.W#N 2 16.4 3866 -17 1255 231 34.6 3.8 -9.2 251 7.9 37.4 44.2 387 -04060701.MOT 2 10.4 295 -316 1541 461 68.3 0.0 -8.4 254 6.7 33.2 82.6 561 -04060621.C02 2 9.9 1824 -59 2285 83 55.5 0.0 -10.8 234 7.9 39.7 69.2 64 -04053023.IND 2 17.3 2618 -10 577 361 58.6 9.2 -9.1 248 6.9 35.7 45.1 369 -04053020.SDF 2 16.6 2653 -2 807 250 52.4 5.8 -9.4 245 6.8 37.1 41.1 317 -04053002.OKC 2 15.5 2559 -32 1162 314 55.7 6.2 -7.3 244 7.0 35.6 70.5 434 -04053002.ICT 2 16.1 3240 -98 992 315 44.2 5.1 -10.4 245 7.9 25.8 56.2 399 -04053000.MCI 2 16.0 3437 -5 863 239 36.5 5.0 -12.8 232 8.3 27.4 42.9 372 -04052922.C33 2 16.5 4081 -4 1356 126 51.4 2.8 -7.8 244 7.4 36.9 74.7 248 -04052921.TOP 2 16.1 3843 -13 936 78 32.5 1.6 -12.5 233 8.0 17.3 39.0 190 -04052421.STJ 2 15.6 3982 -40 991 76 40.4 2.0 -11.9 234 7.7 26.3 67.6 270 -04052300.P#8 2 15.0 3882 -47 1262 228 54.5 5.9 -10.5 233 7.9 34.1 69.9 334 -04052221.MCK 2 13.2 3453 -37 1185 103 72.0 2.9 -12.3 231 8.6 35.5 82.5 224 -04052219.GLD 2 9.9 1898 -54 1700 22 59.0 0.1 -12.7 233 8.4 12.6 69.5 76 -04052122.CID 2 15.4 2960 -48 971 309 36.6 5.6 -11.5 268 7.4 36.1 50.0 390 -53031321.FWH 2 10.8 727 -98 981 119 51.2 0.5 -16.3 248 8.1 30.6 80.9 266 V -55052521.LTS 2 15.0 4060 -25 1509 322 66.4 6.4 -12.3 225 8.6 37.0 53.5 355 V -56041521.GUN 2 11.7 1189 -11 1302 251 72.4 2.1 -13.6 230 7.3 55.7 66.8 370 V -57040221.FWH 2 13.2 3580 -3 942 94 35.8 2.0 -15.8 189 7.9 26.1 52.8 122 V -57052021.TOP 2 14.0 2801 -2 920 142 55.7 3.7 -13.8 207 7.7 48.0 77.2 228 V -57052121.BYH 2 15.7 2854 -5 1106 236 49.7 5.0 -10.9 230 7.2 33.0 92.5 240 V -57061418.PIA 2 15.9 2118 -6 986 394 50.0 7.0 -8.6 252 6.9 52.8 52.1 496 V -59040100.FWH 2 12.6 3068 -26 987 124 42.8 2.7 -17.6 247 9.0 28.0 61.5 142 V -61050800.FSM 2 14.5 2844 -7 1215 261 61.7 5.8 -11.4 240 7.5 42.2 65.9 323 V -61050600.FSM 2 14.3 2667 -12 1121 245 65.5 5.8 -13.1 240 8.3 61.7 43.1 430 V -62052600.OKC 2 14.3 4171 -76 1591 154 33.3 1.2 -12.0 264 8.6 25.3 43.2 228 V -62080700.TOP 2 20.6 6024 -12 1167 160 42.3 5.7 -7.3 250 7.7 32.4 60.6 243 V -64050600.OMA 2 12.7 2395 -61 1048 349 68.6 7.4 -13.8 224 8.8 54.6 89.3 498 V -65041200.FNT 2 11.2 1814 -1 974 166 91.0 3.0 -17.7 250 7.7 46.4 91.6 372 V -66042800.FWH 2 14.1 3342 -17 1291 148 38.0 2.2 -11.8 265 7.2 39.3 49.0 269 V -66030400.HKS 2 12.2 1434 -10 831 138 47.6 1.6 -14.0 234 7.6 49.0 77.8 142 V -67061100.OKC 2 14.4 3497 0 1569 144 32.2 1.2 -11.0 235 8.7 35.0 51.1 260 V -68110400.VPS 2 12.8 1596 -2 812 129 50.5 1.7 -13.4 251 5.9 30.3 72.0 184 V -69041806.VPS 2 15.2 1013 -8 445 370 55.8 3.5 -11.0 248 6.9 42.3 73.3 439 V -69062400.TIK 2 18.4 4403 -4 776 317 37.5 8.7 -9.4 240 7.5 45.3 56.2 431 V -70100600.TIK 2 13.7 1865 -3 772 241 41.1 3.1 -12.2 230 6.7 35.4 55.6 335 V -71022200.JAN 2 12.8 938 -4 930 470 74.7 4.4 -11.8 211 6.7 57.8 77.3 590 V -73052800.MGM 2 16.4 2337 -2 1017 293 53.5 6.0 -7.9 239 6.2 45.6 45.2 386 V -73041600.VCT 2 15.4 2861 -37 1272 385 48.1 6.4 -12.9 231 8.1 35.7 72.2 377 V -74040400.MGM 2 14.8 2955 -2 1017 161 52.0 4.1 -12.8 235 8.2 39.5 59.4 253 V -74040400.BNA 2 14.6 2744 -31 970 209 77.8 5.7 -13.3 238 7.8 57.0 80.2 301 V -74040400.DAY 2 12.8 2185 -7 986 619 90.8 13.5 -13.1 235 7.1 71.9 91.6 919 V -75042500.UMN 2 15.7 5306 -1 837 145 53.3 6.8 -13.8 255 7.3 41.6 61.8 185 V -74060900.UMN 2 17.0 3643 -2 987 363 37.0 8.1 -6.7 231 7.6 41.4 27.5 508 V -75063000.BIS 2 13.6 3158 -76 1566 198 41.8 1.6 -12.3 233 8.6 26.8 55.7 204 V -76042000.SEP 2 13.7 3326 0 1092 305 45.1 6.9 -14.1 240 7.6 33.7 48.9 358 V -77040418.CKL 2 14.1 1633 0 994 247 66.8 4.0 -9.8 231 6.0 52.7 80.0 333 V -78060100.TOP 2 16.2 4279 -1 1160 267 35.7 5.7 -12.7 233 7.6 36.3 57.0 349 V -79041021.SEP 2 12.8 2186 -9 912 345 48.2 6.1 -13.1 228 8.1 42.9 54.3 468 V -79050300.OKC 2 13.9 2775 -4 877 218 73.2 6.0 -12.3 246 7.2 57.7 103.2 279 V -79033000.OMA 2 10.1 1322 -24 1155 223 56.4 2.4 -15.8 232 7.1 49.1 52.9 345 V -80040800.UMN 2 10.2 2256 -3 1473 97 39.6 0.8 -18.5 236 8.4 39.7 92.1 247 V -84060800.TOP 2 16.2 2284 -16 918 560 74.0 12.8 -6.0 237 6.2 49.1 84.6 705 V -84031600.1M1 2 12.2 2339 -1 1056 250 47.1 4.3 -14.9 251 6.9 30.4 55.5 292 V -86072900.OMA 2 16.4 4252 -21 1667 112 48.4 1.3 -10.6 268 8.6 28.2 81.3 151 V -87111600.GGG 2 12.8 1593 -8 723 298 61.9 4.8 -15.3 178 7.9 43.3 65.2 326 V -90061600.LBF 2 16.1 3827 -1 1050 21 42.1 0.5 -10.6 185 8.5 24.5 74.1 95 V -90060300.PAH 2 15.6 2246 -3 1039 274 47.1 4.7 -7.6 251 7.0 57.8 49.8 384 V -91042700.OUN 2 15.8 4387 -8 898 195 50.3 7.2 -11.5 242 7.0 44.2 54.9 370 V -92062800.AMA 2 14.6 3148 -3 1020 83 44.3 1.9 -10.3 249 7.9 32.7 52.7 220 V -92061700.OVN 2 18.7 4878 -1 1119 262 50.4 9.5 -6.5 237 6.9 46.6 64.6 473 V -93042500.OUN 2 11.6 2675 0 1209 113 49.6 2.0 -14.6 235 6.9 35.5 65.5 168 V -93050700.TOP 2 13.7 2046 -7 666 484 58.8 9.7 -13.1 217 7.0 55.4 51.4 644 V -93060700.LBF 2 15.9 4738 0 930 328 59.3 15.3 -8.6 229 7.6 41.9 67.6 583 V -94042600.SEP 2 12.9 2562 -34 1365 201 51.9 2.8 -11.5 258 7.4 41.3 51.0 198 V -95051900.BMX 2 15.7 2868 -5 989 239 39.3 4.5 -9.9 247 6.7 31.9 49.1 230 V -98040900.BMX 2 14.6 2259 -18 642 136 77.9 3.1 -13.9 240 7.9 50.3 100.1 290 V -98041700.BMX 2 14.7 2038 0 704 263 73.4 5.4 -11.9 245 6.8 36.3 98.6 327 V -99050400.OUN 2 13.4 3644 -22 1050 271 41.4 6.5 -14.9 225 8.4 32.0 37.7 343 V -00121618.BMX 2 12.0 1369 -1 737 279 66.9 3.8 -14.1 220 6.7 51.3 90.8 339 V -00092100.ILN 2 12.5 747 -19 1280 611 75.3 3.3 -7.5 240 5.4 64.7 73.0 810 V -01061400.OAX 2 16.8 4639 -1 1278 127 38.6 2.8 -11.3 215 9.0 35.2 48.5 145 V -01112412.JAN 2 13.0 1392 -2 773 366 50.4 4.3 -10.1 225 5.7 52.4 48.8 504 V -01112418.BMX 2 13.4 1498 -1 655 227 52.0 3.0 -11.3 220 6.1 43.1 61.9 319 V -02111018.ILN 2 11.3 1239 0 734 385 54.4 4.3 -13.7 230 6.6 49.5 103.8 417 V -02062400.ABR 2 17.1 4378 0 1112 85 50.6 2.8 -10.5 245 8.2 29.8 57.9 153 V -03050900.OUN 2 17.0 3871 -32 990 336 62.0 13.0 -6.9 235 6.3 53.9 80.1 364 V -94032718.CKL 2 15.5 1965 0 743 344 72.9 6.8 -9.1 233 6.3 54.7 56.0 403 V -81052300.OKC 2 13.1 2411 -70 1142 203 49.1 3.0 -13.7 235 9.0 37.6 49.1 249 V -65041100.LIT 2 12.7 1815 -1 1365 140 52.3 1.4 -11.1 248 7.2 39.4 64.4 212 V -53051121.FWH 2 13.2 1452 -55 1150 122 53.0 1.3 -11.2 248 7.3 40.4 64.4 209 V -90082900.PIA 2 21.0 6470 -2 974 110 33.6 4.0 -7.3 297 7.1 23.3 54.6 147 V -55042411.GUN 2 13.1 1784 -7 917 345 68.7 6.2 -12.7 248 7.1 44.1 85.9 375 V -56040321.HKS 2 13.0 1491 -14 1212 173 82.1 2.0 -12.4 221 7.5 52.1 107.5 267 V -56051221.MTC 2 13.8 2444 -8 1001 124 69.2 3.0 -14.4 266 7.5 25.2 94.3 162 V -60052000.TOP 2 14.3 3120 -23 1112 167 43.1 3.3 -13.3 213 8.2 32.6 58.1 244 V -66060900.TOP 2 15.9 2226 -24 819 296 59.5 6.5 -8.6 223 7.1 47.3 69.8 397 V -68082000.GRB 2 16.1 2780 -11 1217 173 50.0 3.1 -7.3 258 6.4 27.0 43.6 195 V -74040318.BNA 2 13.0 2906 -5 1157 205 63.1 5.0 -15.5 229 8.2 48.6 76.4 333 V -61051500.PIA 2 12.4 1259 -2 817 196 68.7 2.5 -13.0 202 6.6 36.7 80.9 205 V -54050121.TIK 2 13.0 1988 -17 709 242 56.2 4.5 -13.5 203 8.0 39.2 73.2 282 V -55060421.SLN 2 13.4 3594 -5 1422 36 25.3 0.3 -12.7 225 7.9 23.8 30.4 152 V -70061300.COU 2 16.5 3499 -11 949 204 64.2 7.2 -7.8 246 5.5 49.6 57.1 318 V -76032700.1M1 2 11.8 1820 -17 961 187 41.8 2.4 -17.1 230 8.2 57.3 71.8 243 V -04071318.ILX 2 19.0 4958 -10 1102 117 37.5 3.3 -10.9 305 7.9 33.8 45.3 197 V -68051600.LIT 2 15.6 2612 -4 971 250 52.8 5.7 -11.7 260 8.6 45.5 72.5 337 V -65031700.OKC 2 11.1 1628 -3 687 269 91.0 4.4 -17.9 235 7.1 58.8 114.4 325 V -00050901.AIZ 0 13.1 1987 -68 1453 84 35.7 0.5 -11.3 241 8.5 41.9 28.1 204 -00050722.SNY 0 9.8 2015 -39 1845 23 56.1 0.1 -12.4 245 8.7 34.2 64.8 128 -00050707.OGA 0 11.6 1205 -190 787 34 39.5 0.0 -11.3 236 8.2 22.0 47.2 115 -00050323.RBD 0 11.2 940 -3 1077 54 42.9 0.3 -14.6 290 6.2 28.9 58.4 174 -00043001.ABI 0 11.9 2549 -66 1686 111 39.6 0.5 -11.8 268 8.4 26.8 40.5 228 -00042423.LAA 0 5.4 613 -132 2566 97 54.0 0.0 -16.3 278 8.9 29.1 72.7 192 -00042422.EHA 0 6.7 706 -56 2143 58 53.8 0.0 -15.2 295 8.1 25.8 83.4 159 -00042021.BWG 0 11.2 1126 -13 1162 167 52.1 1.4 -13.5 240 7.4 46.8 53.8 253 -00042021.BNA 0 11.2 989 -26 1114 165 53.6 1.3 -13.7 242 7.7 45.4 65.0 244 -00042001.MCI 0 12.4 2093 -43 1300 141 61.9 2.1 -12.3 226 7.0 33.4 81.4 163 -00042000.JCT 0 13.1 2950 -156 1701 170 51.7 0.4 -9.4 253 8.2 40.5 71.8 240 -00041822.SJT 0 7.1 414 -185 3169 -7 49.4 0.0 -9.5 243 8.2 32.3 60.6 45 -00041620.SUS 0 9.5 579 -1 968 46 41.8 0.2 -18.1 247 6.6 30.2 69.5 154 -00041602.GRA 0 10.2 901 -182 1269 251 56.8 0.2 -17.0 244 8.6 34.1 76.8 276 -00033000.SHV 0 12.6 1635 -14 797 147 57.7 2.3 -15.2 267 7.2 33.9 91.9 219 -00032900.HYI 0 15.8 2875 -10 771 106 60.6 3.0 -11.6 251 7.3 36.4 82.8 192 -00032522.BNA 0 8.3 268 -8 1461 34 37.5 0.0 -16.9 270 6.2 23.2 61.3 60 -00032207.MAF 0 11.5 1952 0 562 249 54.6 4.4 -16.4 196 8.3 45.0 77.8 468 -00031600.CSM 0 8.3 808 -99 1327 59 34.5 0.1 -17.7 251 7.6 25.7 34.3 101 -00031022.BHM 0 10.3 614 -95 1034 103 48.9 0.4 -15.8 238 7.0 33.1 49.4 179 -00030923.LRD 0 13.5 2701 -7 1360 -13 41.3 -0.2 -12.5 256 7.5 20.8 59.4 95 -00030920.GFL 0 7.1 1 -425 1416 88 63.6 0.0 -18.7 242 8.1 39.6 77.0 165 -00030900.UNU 0 9.9 1306 -11 1121 172 50.6 1.7 -17.3 203 6.6 39.6 44.1 206 -00030900.CLI 0 9.4 673 -29 1009 196 53.3 1.2 -16.9 202 6.6 39.4 53.8 226 -00030302.PWG 0 12.0 1469 -17 1106 252 60.9 3.3 -12.2 259 6.1 45.0 75.3 323 -00030222.AFW 0 11.1 999 -6 913 256 68.3 2.6 -13.5 238 6.5 36.9 80.1 345 -00022606.CRS 0 13.3 2158 -10 637 191 48.7 3.3 -14.8 239 6.9 25.4 69.2 184 -00022523.FSD 0 7.3 495 -2 929 82 38.3 0.3 -21.9 172 7.7 30.1 52.5 83 -00022405.FAM 0 9.2 437 -46 772 315 46.8 1.1 -18.0 235 6.3 29.2 42.2 331 -00072222.BBW 0 11.9 1462 -1 1218 36 35.2 0.2 -11.1 328 6.5 26.6 43.9 124 -00072220.GLD 0 10.6 1162 -15 1699 26 39.9 0.1 -10.2 319 7.4 19.8 55.8 82 -00072122.BFF 0 9.8 1738 -8 2036 34 42.0 0.0 -9.9 297 7.7 36.2 48.9 131 -00072022.AKO 0 14.0 3465 -7 1063 22 46.2 0.6 -10.2 278 8.3 29.1 64.7 106 -00072000.BVX 0 17.4 3847 -11 1674 30 36.4 0.2 -7.1 298 6.9 26.0 29.2 130 -00071022.RCA 0 13.2 1916 -28 1452 23 41.1 0.2 -9.2 238 7.6 21.4 68.1 95 -00071001.LBF 0 14.7 2947 -100 1740 24 28.1 0.1 -5.6 239 7.8 23.6 37.9 109 -00070922.MHE 0 16.8 3556 -34 1430 6 40.7 0.1 -6.1 258 6.7 18.8 41.5 109 -00070922.GGW 0 13.3 2242 -12 1039 31 46.6 0.5 -11.4 226 7.4 18.7 71.4 74 -00070901.LWT 0 8.7 874 -65 1998 38 58.4 0.0 -11.5 232 8.1 32.4 92.6 236 -00070805.LVN 0 18.2 2722 -69 530 388 37.6 5.8 -9.2 261 8.1 22.9 53.3 407 -00070803.JDN 0 7.6 57 -220 2275 33 69.9 0.0 -11.7 240 7.8 39.2 84.5 167 -00070601.CUT 0 11.7 2058 -14 1543 37 55.5 0.3 -9.9 245 8.5 28.5 78.8 136 -00070523.MCK 0 16.4 3979 -55 1631 151 45.4 1.6 -6.8 254 8.1 24.5 59.5 231 -00070521.RAP 0 14.5 3135 -2 1289 15 44.0 0.3 -10.0 233 8.0 19.5 68.5 93 -00070501.2WX 0 11.2 1574 -93 1339 -29 47.6 -0.2 -12.4 230 8.6 28.2 78.4 64 -00070421.JDN 0 8.1 1033 -47 1927 -17 41.2 0.0 -15.0 209 7.9 26.2 68.3 49 -00070302.GGW 0 10.6 1484 -86 1685 121 67.7 0.4 -12.6 252 7.9 36.1 78.0 267 -00070222.FOD 0 17.4 3585 -43 1097 53 23.7 0.0 -9.5 292 7.5 16.4 31.4 91 -00070201.ABR 0 14.2 3411 -108 1790 100 24.5 0.0 -10.0 259 8.3 16.6 39.9 145 -00070123.ELO 0 13.3 2835 -49 1339 117 57.8 2.1 -13.1 291 7.7 31.9 66.7 228 -00070122.ABI 0 13.9 1505 -15 1776 40 26.6 0.1 -5.4 261 5.7 21.4 25.5 120 -00070100.JLN 0 15.5 2255 -3 786 81 43.6 1.3 -7.6 313 5.9 25.5 56.4 208 -00062923.ELM 0 8.8 332 -11 1098 19 33.4 0.0 -16.5 253 6.2 19.9 82.5 60 -00062923.D07 0 9.6 1600 -26 1649 30 42.4 0.1 -15.7 295 7.7 30.2 50.5 90 -00062901.LAM 0 11.8 506 -57 1728 28 25.5 0.0 -6.5 268 6.3 18.5 25.2 126 -00062519.AIO 0 14.7 2632 -77 1269 122 38.0 1.2 -10.6 279 7.3 29.0 32.0 250 -00062402.RCA 0 11.5 1507 -76 1200 0 40.3 0.0 -11.0 273 7.9 29.4 67.6 159 -00062322.SDA 0 16.8 4294 -9 1398 56 28.6 0.7 -9.2 284 7.3 21.1 46.7 160 -00061522.OKV 0 14.5 746 -31 749 130 32.3 0.5 -8.8 240 6.0 35.1 29.5 198 -00061323.P28 0 14.3 3106 -53 1734 60 41.3 0.3 -10.0 260 8.0 15.7 31.7 91 -00061122.DFS 0 13.5 3143 -11 1597 67 28.6 0.4 -8.2 251 7.7 28.8 45.0 62 -00060400.GLD 0 9.0 1430 -74 2560 51 35.6 0.0 -10.7 313 8.7 29.0 38.3 146 -00060221.CEF 0 12.1 326 -141 1452 156 38.5 0.1 -9.8 279 6.6 44.9 47.0 277 -00052701.SZL 0 13.7 1477 -23 1157 198 50.0 2.1 -9.7 244 6.7 38.9 69.4 232 -00052501.PPA 0 15.2 3731 -83 1597 78 46.6 0.7 -8.0 249 8.4 33.0 60.7 288 -00052501.ADK 0 16.3 4569 -134 1861 108 40.3 0.2 -7.8 255 8.7 36.4 49.3 291 -00052219.AVC 0 10.1 628 -1 1000 2 52.8 0.0 -13.8 256 5.9 28.0 59.1 95 -00052021.VPC 0 13.0 805 -6 1196 15 39.2 0.1 -9.8 231 6.1 19.7 47.6 87 -00050922.IRS 0 12.0 729 -2 928 68 49.6 0.4 -13.6 230 6.9 46.6 41.5 178 -01041105.JCT 0 14.1 1545 -229 832 346 71.9 0.0 -9.7 230 8.5 44.0 97.0 386 -01041004.IND 0 11.4 1318 -107 1240 185 57.8 1.1 -13.8 292 7.2 35.6 68.3 216 -01040321.UNO 0 12.3 1279 -42 722 107 57.2 1.3 -13.7 270 7.4 36.3 60.7 225 -01040300.BFF 0 5.0 0 -9999 1708 161 63.5 0.0 -17.8 241 7.5 37.7 81.7 433 -01032404.ABI 0 10.8 1700 -61 813 65 27.5 0.5 -18.2 289 8.0 17.4 46.6 180 -01031202.FTW 0 11.7 1341 -9 490 161 53.1 1.9 -17.9 240 7.3 37.5 47.3 201 -01031123.BWD 0 10.1 846 -18 912 76 47.4 0.5 -17.4 245 7.7 31.1 69.7 133 -01022500.TOP 0 7.3 153 -15 715 148 78.6 0.2 -21.3 203 6.8 32.9 92.4 170 -00110907.GZH 0 15.4 1005 -3 768 172 47.3 1.4 -7.8 213 6.0 36.2 52.6 220 -00110906.EET 0 14.9 674 -3 539 277 52.5 1.6 -8.6 217 5.7 41.9 58.8 327 -00110121.CID 0 12.2 1537 -17 1087 164 40.8 1.6 -12.1 210 6.0 36.7 41.3 225 -00102323.ELP 0 9.8 1432 -3 1298 24 68.0 0.2 -14.2 201 7.5 36.8 65.9 132 -00102212.MWL 0 13.4 1016 -7 525 152 31.3 0.8 -11.5 208 6.2 22.4 43.6 149 -00101423.INK 0 8.5 757 -27 2381 63 29.5 0.0 -10.8 243 7.2 27.3 48.1 91 -00101408.CNM 0 11.5 1524 -124 1147 79 34.2 0.3 -10.4 246 7.2 29.4 55.6 119 -00101400.SLN 0 11.5 577 -49 879 26 58.0 0.1 -11.3 234 5.7 28.9 63.6 76 -00100401.GCK 0 8.5 341 -281 1869 -16 53.4 0.0 -11.5 263 8.5 38.0 70.8 124 -00090523.GTF 0 7.6 277 -43 1393 8 65.8 0.0 -15.8 219 7.4 34.7 93.3 112 -00090300.ISN 0 10.7 654 -10 754 62 42.1 0.3 -13.8 225 6.8 27.3 72.5 95 -00090120.SLC 0 5.7 78 -67 2129 29 41.1 0.0 -14.3 198 7.4 15.4 53.6 53 -00081820.BUY 0 15.3 1702 -37 1351 58 34.7 0.4 -8.2 275 6.5 38.7 13.2 134 -00081723.IND 0 19.2 4115 -13 791 158 47.3 5.1 -7.9 275 6.9 37.5 49.8 224 -00081720.LEX 0 16.6 2579 -6 1129 81 36.5 1.1 -6.7 284 5.9 24.9 42.3 141 -00081420.AIT 0 16.2 2299 -120 690 282 52.2 3.0 -9.8 267 8.0 37.9 69.5 368 -00080623.CDJ 0 14.7 1350 -119 1250 43 35.9 0.1 -6.8 272 6.3 24.5 54.6 88 -00080601.HNR 0 18.6 4073 -16 990 54 37.6 1.4 -7.0 271 7.3 25.9 55.8 92 -00080522.AIA 0 7.8 312 -3 2875 0 43.4 0.0 -8.3 272 7.7 22.1 49.4 52 -00080502.PIR 0 14.4 2629 -128 1844 202 48.0 0.3 -7.4 270 7.5 30.4 64.1 318 -00080502.ANW 0 11.5 1035 -228 2157 138 37.9 0.0 -6.3 276 7.6 25.6 46.8 227 -00080222.FKL 0 13.7 1168 -22 892 104 26.2 0.5 -9.1 253 5.9 27.0 55.7 145 -00080202.LWT 0 8.3 700 -130 2701 50 46.5 0.0 -8.4 286 8.6 19.4 78.7 94 -00080202.GGW 0 10.8 1193 -207 1955 94 51.1 0.0 -9.6 293 8.0 25.1 71.3 230 -00072622.AIO 0 16.7 3711 -2 964 67 44.8 1.9 -10.2 324 7.6 29.1 43.1 186 -00072501.HON 0 13.9 2463 -99 1314 85 29.5 0.5 -11.1 271 8.3 13.2 40.3 91 -01060123.LWC 0 11.2 1268 -25 1421 113 62.6 0.8 -13.2 305 6.4 37.6 79.8 249 -01060122.P28 0 11.4 1141 -69 1552 80 51.2 0.3 -9.7 308 6.6 21.4 62.5 156 -01053100.CVN 0 8.5 1309 -86 2195 -18 45.9 0.0 -10.8 289 8.3 24.1 38.5 138 -01052801.END 0 13.1 2369 -85 1258 150 47.1 1.6 -12.5 280 8.2 39.8 67.4 370 -01052400.OKF 0 7.6 314 -55 2200 85 59.2 0.0 -15.3 298 7.1 43.3 63.3 244 -01052022.GRK 0 15.6 2852 -21 1408 32 40.1 0.4 -7.9 242 6.8 30.2 75.1 60 -01051801.RUL 0 11.1 1624 -134 2428 24 25.8 0.0 -8.5 258 8.1 18.9 46.6 76 -01051623.BIE 0 13.4 3208 -41 1905 35 30.0 0.1 -10.4 274 7.5 20.5 32.1 103 -01051218.DDH 0 8.9 325 -25 1493 21 36.4 0.0 -16.2 229 6.4 25.9 46.8 102 -01051000.OLU 0 9.6 2423 -73 2081 70 30.6 0.0 -15.8 265 8.8 23.7 36.8 157 -01050823.GBD 0 8.1 447 -90 1828 55 44.5 0.0 -15.8 323 7.4 25.4 50.6 207 -01050701.COT 0 15.9 3113 -16 1068 4 34.1 0.1 -12.2 267 8.1 10.5 56.5 73 -01050700.ADS 0 14.6 2915 -5 1038 115 37.4 2.0 -13.7 248 7.3 23.1 63.5 148 -01050623.BMQ 0 16.4 4217 -12 955 48 38.2 1.3 -13.0 257 7.5 27.3 64.9 143 -01050501.COT 0 14.3 1453 -9 1075 113 48.9 1.2 -9.9 226 7.0 33.1 73.5 169 -01050200.AUD 0 10.0 1544 -80 1896 85 31.2 0.1 -14.7 266 8.2 22.1 40.9 170 -01050101.SLN 0 10.5 1695 -66 1383 122 37.1 0.7 -16.7 295 8.0 24.3 61.4 188 -01050100.P28 0 9.9 1422 -94 1553 70 45.7 0.2 -15.7 309 7.8 24.3 54.0 188 -01042317.STE 0 9.5 775 -5 970 86 55.4 0.6 -18.0 210 6.8 38.9 110.9 170 -01042304.JCT 0 14.1 2210 -11 659 190 53.5 3.8 -11.8 248 7.8 31.4 55.1 214 -01042222.MWL 0 11.8 1193 -8 1373 116 46.2 0.7 -10.2 212 6.2 33.4 58.0 105 -01042123.PIA 0 12.1 1857 -13 1175 79 41.0 0.8 -13.4 257 7.5 25.7 51.8 94 -01042123.CDS 0 10.3 2000 -70 2105 81 55.8 0.0 -11.8 230 7.9 27.2 70.8 141 -01042102.SLN 0 11.5 2072 -206 1218 280 50.2 0.0 -15.1 239 8.7 44.2 73.5 374 -01041702.SJT 0 13.0 1793 -30 989 96 38.8 1.1 -10.9 296 7.0 26.3 65.2 260 -01041700.LBB 0 8.1 406 -65 1861 42 46.3 0.0 -12.1 288 7.1 32.9 80.6 256 -01041500.ABI 0 12.6 2222 -121 1474 76 59.9 0.5 -13.2 249 8.7 28.8 78.5 130 -01041423.ADM 0 14.2 1613 -86 524 248 67.7 3.1 -14.2 254 8.6 38.9 90.8 310 -01041422.PCS 0 13.6 2872 -90 1455 5 57.7 0.1 -10.8 245 8.2 21.5 77.6 85 -01041422.EMP 0 8.9 652 -15 1486 57 59.4 0.2 -16.8 254 7.2 31.9 84.7 218 -01041421.HBR 0 13.9 2647 -29 786 167 70.6 4.4 -14.3 255 8.2 39.1 91.1 239 -03050100.BRL 0 12.7 2707 -10 1047 121 47.3 2.5 -15.8 247 8.2 27.0 50.9 270 -03043021.AIA 0 12.3 2247 -53 863 158 49.0 2.8 -15.7 243 8.1 37.1 49.5 276 -03043003.LIC 0 8.7 1228 -82 574 264 52.2 2.2 -15.9 216 8.8 43.9 59.2 676 -03042900.APA 0 6.3 1056 -56 1639 56 35.9 0.1 -15.6 239 8.3 10.6 65.7 63 -03042600.HRL 0 12.4 1634 -219 1994 5 43.7 0.0 -11.1 286 8.3 25.0 72.5 36 -03042522.FTY 0 11.2 645 -12 811 160 61.6 1.0 -14.4 253 6.7 33.8 66.6 259 -03042520.ANB 0 11.5 783 -1 777 164 64.0 1.3 -14.0 259 6.2 36.4 64.7 319 -03042400.SEP 0 14.4 2485 -6 558 393 62.4 9.8 -14.6 238 7.9 39.1 92.6 485 -03042022.MKL 0 12.5 1017 -22 789 92 57.6 0.9 -14.3 251 6.9 29.0 70.2 188 -03042019.MEM 0 13.1 1682 -6 857 78 50.6 1.1 -14.2 252 7.3 29.0 57.0 148 -03041922.P#0 0 11.7 1623 -17 730 127 72.6 2.1 -19.4 223 7.9 35.5 102.9 148 -03041920.END 0 10.6 1171 -12 629 144 57.4 1.6 -21.0 215 8.4 39.0 99.4 219 -03041907.FDR 0 12.6 1046 -418 613 365 65.8 0.0 -13.9 207 8.9 40.5 101.8 352 -03040720.HOU 0 16.5 2215 -1 373 67 57.9 1.4 -11.4 231 7.6 30.3 77.2 191 -03040718.BPT 0 13.8 933 -139 741 16 59.0 0.1 -12.1 226 7.4 26.5 91.0 110 -03040717.LFT 0 14.1 780 -168 559 29 50.5 0.0 -12.0 233 7.3 29.3 84.8 74 -03040605.C12 0 11.3 655 -128 639 328 69.4 1.0 -14.6 250 7.3 45.3 111.0 697 -03040601.C11 0 12.1 2056 -4 832 109 75.1 2.2 -15.3 251 7.6 26.4 93.3 198 -03040400.LW1 0 13.3 2761 -1 682 153 54.3 3.8 -15.1 242 7.6 32.9 52.2 224 -03040322.HBR 0 9.5 1315 -38 1655 57 42.4 0.2 -14.8 235 7.5 33.0 47.0 130 -03032821.MBS 0 7.7 95 -1 1423 199 68.1 0.1 -17.6 223 6.6 48.9 65.7 252 -03032819.AZO 0 8.9 146 -2 830 200 60.9 0.3 -17.3 225 6.7 54.5 64.3 255 -03031722.SPS 0 10.7 981 -38 1183 127 34.3 0.6 -15.4 236 7.3 19.3 95.8 139 -03031720.SPS 0 10.2 947 -44 1140 35 24.3 0.0 -16.7 216 7.4 15.4 100.9 42 -03031221.PBI 0 14.2 1790 -2 1215 21 36.5 0.2 -12.1 258 7.7 2.8 67.6 -23 -03031218.FPR 0 15.8 2760 -2 892 -28 38.6 -0.5 -14.1 256 8.0 11.8 71.6 86 -01062102.ICT 0 13.9 1917 -38 976 89 37.8 1.1 -11.3 291 7.3 26.8 48.8 202 -01061623.JMS 0 8.9 600 -4 1096 41 40.5 0.2 -18.1 283 7.1 25.4 84.9 82 -01061122.RGK 0 14.3 3269 -77 1618 201 51.8 1.8 -10.9 265 8.4 35.2 56.2 397 -01060502.CSM 0 15.8 3992 -79 1412 107 34.9 1.2 -8.4 251 8.1 28.3 40.7 227 -01060501.LHX 0 8.3 615 -248 1957 94 44.0 0.0 -11.2 243 9.0 29.0 49.3 127 -03062823.RST 0 8.8 203 -71 1471 26 40.8 0.0 -12.1 287 4.8 15.4 60.6 57 -03062822.BH4 0 6.7 253 -82 2374 15 53.7 0.0 -12.2 288 8.0 39.8 64.9 352 -03062820.WSC 0 9.5 432 -25 1288 24 38.2 0.1 -13.2 292 5.0 20.7 57.7 45 -03062800.C07 0 9.3 1323 -51 2202 29 36.5 0.0 -9.3 311 7.4 12.9 41.7 81 -03062800.8V7 0 10.5 2208 -13 2023 82 42.3 0.0 -8.2 320 7.8 44.3 44.0 293 -03062722.8V7 0 11.1 2543 -6 1821 66 38.6 0.2 -8.4 315 7.5 40.0 47.0 258 -03062721.C07 0 8.9 1146 -29 2232 32 35.4 0.0 -9.2 306 7.2 11.7 50.1 74 -03062401.CYS 0 10.5 1054 -23 891 146 67.4 1.5 -8.4 210 6.6 44.6 77.5 258 -03062022.ROW 0 10.0 1448 -1 2438 18 41.2 0.0 -8.3 220 7.9 29.6 51.3 74 -03062022.CVS 0 12.0 1680 -21 1220 96 32.9 0.7 -8.5 224 7.2 20.3 41.0 110 -03062020.CVS 0 12.3 2087 -2 1100 14 22.8 0.0 -9.4 233 7.4 10.8 35.9 48 -03061501.CNM 0 11.3 2677 -1 2178 -48 31.4 0.0 -11.2 338 8.5 17.4 38.2 109 -03061423.HOB 0 9.6 1525 -68 2132 7 32.6 0.0 -11.5 330 8.5 14.0 32.3 24 -03061223.C11 0 20.9 5150 -8 501 190 32.5 5.3 -8.9 269 8.0 41.4 58.8 339 -03061221.AGC 0 13.1 691 -9 1032 158 35.1 0.6 -8.8 227 5.9 34.2 44.2 256 -03060401.TCC 0 11.4 1746 -91 1622 -15 59.6 -0.1 -9.6 288 8.2 44.8 48.7 398 -03060322.LBB 0 13.6 2239 -128 1199 80 45.2 0.5 -9.1 302 7.9 31.8 57.3 316 -03060302.LRD 0 17.3 3023 -81 1418 -4 35.4 0.0 -5.0 285 7.3 27.3 67.7 -12 -03053121.ILM 0 13.5 1237 -102 1265 394 58.4 2.3 -10.4 275 6.3 47.7 74.8 576 -03052001.ADM 0 16.8 3033 -19 1155 81 33.3 1.2 -8.4 288 7.5 14.5 61.0 188 -03051922.FSI 0 15.9 2088 -80 836 131 37.4 1.4 -8.3 246 8.1 40.1 50.7 385 -03051409.C12 0 13.9 2056 -415 1151 505 44.5 0.0 -12.7 290 9.5 25.4 80.3 466 -03051406.LW1 0 15.8 3351 -219 819 259 50.4 0.0 -11.8 274 8.3 12.9 74.5 238 -03051401.C11 0 13.9 3239 -178 1774 132 58.3 0.1 -9.9 286 8.2 22.1 60.4 192 -03051322.CDS 0 12.4 3323 -92 2274 79 49.1 0.0 -10.1 280 8.6 18.1 68.8 98 -03051223.MRF 0 11.6 1914 -2 1612 41 42.7 0.2 -6.0 279 6.7 33.9 49.2 174 -03051019.MLC 0 14.5 849 -221 615 158 58.7 0.0 -8.7 240 7.6 34.0 74.3 199 -03051017.P#Q 0 16.5 2801 -34 619 97 68.4 2.7 -9.2 235 7.2 32.3 77.8 168 -03051000.P#J 0 16.2 3929 -21 888 74 55.8 2.7 -12.5 247 7.6 33.6 64.7 227 -03050922.LEX 0 15.5 2304 -3 715 119 55.3 2.5 -9.5 278 7.4 32.8 69.7 185 -03050921.COU 0 16.1 4338 -12 941 67 45.4 2.2 -11.8 246 7.4 35.8 73.5 264 -03050920.SDF 0 15.2 2300 -15 871 88 52.2 1.8 -10.2 268 7.2 36.6 70.7 247 -03050520.MKL 0 15.8 2332 -17 581 247 71.6 5.8 -11.9 263 7.3 40.2 88.1 300 -03050223.BMX 0 15.4 3487 -10 686 61 44.2 1.6 -13.2 283 6.8 21.9 38.7 114 -03050221.HSV 0 13.0 2237 -40 946 139 42.3 2.2 -13.8 264 7.0 27.8 33.8 201 -03050221.ABL 0 13.6 3056 -5 1063 81 40.9 1.6 -14.7 280 7.2 27.0 27.0 130 -03050219.SJT 0 15.1 4252 -2 1189 17 38.9 0.4 -12.5 277 8.1 4.7 61.7 18 -03050219.ABL 0 12.9 2572 -28 1072 45 27.2 0.5 -13.7 261 6.7 22.6 36.0 82 -03050218.MSL 0 13.0 2367 -24 912 19 25.5 0.2 -14.5 257 7.4 24.2 40.8 60 -03050201.ACT 0 13.6 2339 -88 1301 -44 31.1 -0.3 -11.9 280 8.3 21.3 53.8 -77 -03050102.END 0 14.0 3853 -58 1033 227 43.6 5.8 -13.5 250 7.4 27.5 43.5 247 -03071221.AVL 0 11.9 710 -2 1196 56 37.5 0.2 -8.5 266 5.6 31.7 43.3 103 -03071201.FOE 0 16.7 3598 -41 1289 -96 59.4 -2.4 -10.2 313 7.9 33.9 54.8 89 -03071200.FOE 0 16.2 3683 -11 1441 -16 63.8 -0.3 -11.0 315 7.7 31.9 59.2 109 -03071123.P#H 0 12.6 927 -26 1632 97 59.9 0.3 -9.9 322 7.2 45.3 55.0 319 -03070904.PHP 0 14.6 2161 -292 1066 549 72.4 0.0 -8.6 260 8.8 53.5 55.7 683 -03070900.BH3 0 8.3 1108 -106 2627 277 55.8 0.0 -7.9 250 8.4 55.7 68.2 568 -03070723.LVS 0 8.8 850 -179 2135 85 20.0 0.0 -6.4 329 8.7 24.3 27.9 305 -03070720.DSM 0 18.0 4261 -35 1012 20 39.2 0.6 -9.9 262 8.0 13.2 34.7 79 -03070719.LVS 0 9.9 1337 -68 1800 12 22.3 0.0 -7.2 336 8.0 27.0 21.0 98 -03070600.VTN 0 11.6 1572 -201 1584 157 52.8 0.0 -9.5 273 8.2 30.3 50.1 293 -03070521.RAP 0 8.7 803 -208 2327 67 22.6 0.0 -11.2 272 8.5 6.7 33.0 46 -03070521.P#7 0 10.3 1147 -137 2084 84 43.4 0.0 -10.3 249 8.1 22.9 55.2 239 -03070517.BH3 0 8.9 1171 -147 2263 -14 27.2 0.0 -12.5 293 9.1 15.8 39.6 51 -03070305.GDV 0 9.1 634 -206 1972 120 22.6 0.0 -13.9 250 8.7 30.3 58.1 255 -03063018.AUG 0 11.8 1327 -56 1152 60 42.9 0.5 -12.3 267 5.3 24.4 72.0 118 -03081800.BH5 0 9.0 725 -5 2392 -33 27.4 0.0 -9.3 180 7.6 12.2 31.3 76 -03081322.XRW 0 16.6 1031 -16 519 88 21.6 0.0 -6.2 187 5.5 23.7 39.1 164 -03081202.SEP 0 12.7 373 -104 1300 -113 55.9 -0.2 -8.4 345 6.8 38.0 68.0 -12 -03081200.FWD 0 12.2 1050 -51 2135 -30 50.2 0.0 -8.8 339 6.7 35.0 52.7 68 -03081023.P#9 0 13.9 1702 0 1195 30 41.7 0.3 -9.2 346 6.8 25.8 56.8 104 -03080902.P#C 0 15.5 3216 -71 1472 8 27.4 0.1 -6.4 277 7.9 17.3 40.8 199 -03080900.MIB 0 15.0 3325 -48 1477 39 33.2 0.4 -9.0 291 7.7 10.7 43.9 102 -03080900.P#C 0 14.4 3127 -1 1826 10 25.0 0.0 -5.8 262 7.5 12.2 42.3 64 -03080622.GLD 0 12.9 3132 -2 2338 21 28.1 0.0 -7.1 306 8.2 14.7 32.7 115 -03080601.CNU 0 15.8 2262 -28 1629 -18 34.6 -0.1 -5.1 317 6.6 25.1 42.1 49 -03080600.SUX 0 15.5 1945 -3 996 54 38.2 0.7 -8.6 321 7.0 35.9 44.6 171 -03080521.TOP 0 16.0 2857 -24 1592 -7 30.8 0.0 -6.8 308 6.3 19.6 40.9 101 -03080520.DAN 0 15.0 2224 -8 858 8 18.6 0.0 -10.1 275 6.4 27.6 30.4 121 -03080422.P#R 0 15.1 1771 -64 1131 59 51.1 0.7 -8.5 326 6.5 23.7 72.7 144 -03080401.BVX 0 16.9 2856 -38 1072 96 33.8 1.4 -8.7 308 6.7 18.2 47.9 100 -03080202.LUS 0 9.3 520 -170 1828 -21 47.7 0.0 -8.2 291 7.9 30.7 60.7 11 -03080123.CRL 0 13.5 2544 -8 1131 18 35.3 0.2 -12.9 299 7.9 26.6 36.1 109 -03080103.MCW 0 11.0 914 -111 1515 8 24.1 0.0 -12.2 281 7.0 26.6 47.8 60 -03073123.C31 0 8.6 251 -238 2988 79 50.4 0.0 -8.0 311 8.0 29.8 74.4 268 -03073120.TVL 0 10.6 1275 -24 1488 33 34.5 0.1 -7.4 90 7.8 32.3 17.1 170 -03072700.IWD 0 15.1 1598 -19 1386 149 42.6 1.0 -6.1 276 5.9 27.7 60.4 150 -03071802.BH1 0 13.9 2073 -132 1543 52 64.4 0.2 -6.9 291 7.8 47.0 77.9 171 -03071721.RAP 0 14.6 3713 -127 1972 107 39.2 0.0 -6.2 280 8.5 31.5 54.8 181 -03071320.MSL 0 16.4 2839 -21 1060 37 23.4 0.0 -9.3 310 7.1 4.1 36.8 35 -03071320.DIK 0 9.2 2113 -26 3189 -19 27.9 0.0 -9.3 266 9.0 11.0 36.6 31 -04040721.P#U 0 11.2 1509 -10 1060 103 47.1 1.2 -15.7 268 6.4 35.8 60.8 191 -04040702.SPS 0 8.6 230 -53 980 110 36.0 0.2 -17.3 236 6.3 19.0 53.3 110 -04040700.FTW 0 10.4 641 -8 948 43 57.7 0.3 -14.3 228 6.4 22.9 60.1 83 -04040422.LRD 0 13.8 2148 -1 827 171 49.4 3.0 -12.9 244 7.0 31.5 38.8 217 -04040421.ALI 0 13.2 1124 -3 718 10 40.8 0.1 -13.2 238 7.0 18.0 35.9 100 -04032701.DHT 0 9.5 1004 -128 1142 153 30.2 0.3 -13.4 233 8.2 31.2 63.3 235 -04032623.RAP 0 8.7 1651 -52 1568 172 42.5 0.9 -15.5 205 8.0 26.0 46.8 264 -04031802.FSM 0 8.0 442 -99 1939 211 48.0 0.0 -17.1 278 7.5 37.8 72.5 338 -04031800.P#P 0 9.4 1357 -30 1585 127 45.0 0.5 -17.4 288 7.7 34.4 66.4 269 -04030121.ORD 0 7.2 534 -1 908 208 58.9 1.1 -23.3 222 6.6 37.3 72.6 297 -04030120.RFD 0 6.8 505 -7 892 172 55.3 0.8 -24.3 220 6.8 34.8 71.1 256 -04022416.MCO 0 13.1 534 -37 687 121 47.0 0.5 -10.8 255 5.0 28.8 81.9 156 -04022407.G#5 0 10.5 962 -124 801 -16 47.4 -0.1 -18.2 218 7.7 31.4 83.7 14 -04022316.MSY 0 11.3 0 -9999 417 436 51.3 0.0 -11.2 240 6.1 44.9 86.2 531 -04020601.BTR 0 11.7 57 -172 540 186 69.9 0.0 -13.3 214 7.0 48.1 87.1 199 -04020514.LFT 0 11.1 165 -244 1109 583 49.0 0.0 -11.7 217 6.5 46.0 63.5 611 -04020512.LCH 0 13.6 1421 -64 497 282 49.1 3.0 -12.5 222 6.8 41.7 68.1 319 -04011921.VRB 0 10.3 196 -20 878 -16 82.2 0.0 -14.0 242 5.1 46.9 123.3 207 -03112718.RUE 0 10.5 681 0 396 4 92.3 0.0 -20.1 238 7.0 35.8 100.8 153 -03110923.SAC 0 6.9 156 -14 892 38 24.7 0.0 -25.3 234 7.5 14.4 91.8 77 -03102818.CTY 0 16.5 1074 -53 594 181 37.6 1.2 -7.8 217 6.3 23.6 51.5 193 -03100822.VAD 0 14.1 1355 -7 765 -4 27.1 0.0 -11.2 277 6.4 13.9 52.0 68 -03092718.CBE 0 11.6 969 -2 1256 109 40.4 0.5 -12.3 213 6.1 33.1 58.2 137 -03092620.UIN 0 12.7 1139 -3 844 177 50.2 1.7 -14.6 266 7.9 42.7 77.1 266 -03092619.BRL 0 11.1 906 -34 824 125 50.2 1.0 -14.9 256 6.9 40.9 76.6 149 -03091200.MRF 0 9.8 747 -2 1645 9 36.3 0.0 -6.8 276 6.2 25.5 49.1 163 -03090900.MAF 0 9.9 1214 -1 2565 13 32.3 0.0 -8.4 313 7.4 22.4 35.6 163 -03083123.HUF 0 14.8 27 -163 471 268 39.8 0.0 -6.8 243 6.3 41.6 43.2 340 -03082601.P#4 0 12.9 980 -231 1606 140 42.5 0.0 -9.4 277 7.1 39.4 44.3 283 -03082600.ABR 0 14.2 3471 -76 1925 104 37.8 0.1 -11.4 289 8.6 27.8 43.9 143 -03082221.LOL 0 9.6 944 -94 1467 89 64.9 0.3 -12.3 188 8.3 46.4 77.0 299 -03082119.APX 0 14.4 2077 -120 1359 80 36.1 0.3 -8.3 255 7.1 34.1 35.4 132 -03082100.DLH 0 16.1 2503 -11 1009 166 39.5 2.7 -8.1 226 6.2 24.3 46.3 201 -04051501.PUB 0 3.9 204 -85 2585 153 55.2 0.0 -18.2 268 8.8 42.0 78.8 355 -04051423.COS 0 4.6 230 -87 1664 52 57.1 0.0 -18.0 274 8.2 45.2 68.4 179 -04051300.HBR 0 14.0 4148 -28 1710 172 41.2 1.4 -11.1 244 7.8 44.0 46.5 333 -04051100.LUS 0 8.3 917 -69 1429 204 53.5 0.8 -11.5 237 7.4 28.1 44.2 323 -04050923.CVS 0 5.9 554 -61 3040 -32 23.7 0.0 -12.6 309 9.6 17.1 15.5 78 -04050921.STC 0 9.9 1302 -52 1737 185 49.7 0.5 -14.2 264 7.5 46.1 49.8 400 -04050900.P#A 0 13.8 2438 -42 1008 193 29.0 2.3 -12.7 278 7.7 19.9 36.2 251 -04050822.BH3 0 5.3 996 -6 3054 49 48.0 0.0 -15.0 280 9.6 8.9 60.8 58 -04050522.RIC 0 8.3 824 -38 1493 133 43.8 0.4 -20.4 310 7.1 34.9 60.9 251 -04050101.FWD 0 13.9 2471 -39 907 158 44.9 2.9 -14.8 225 8.3 23.0 58.2 185 -04043021.C12 0 13.3 2483 -8 1029 37 45.1 0.7 -14.1 236 7.9 32.8 46.0 48 -04043020.DYS 0 14.1 2950 -10 638 71 52.3 1.8 -14.3 236 7.8 34.1 51.0 143 -04043018.ABI 0 12.0 2372 -1 1211 -3 32.6 0.0 -13.6 230 7.7 22.8 40.3 -22 -04042920.MLU 0 12.9 972 0 744 72 46.0 0.5 -14.5 232 6.6 29.2 45.8 176 -04042821.G#2 0 10.1 747 -3 1175 139 56.7 0.8 -14.7 252 7.4 32.3 53.8 179 -04042521.CDS 0 7.1 679 -5 2042 20 45.4 0.0 -17.7 276 7.7 27.7 76.8 88 -04042300.SGF 0 9.8 113 -134 794 263 69.4 0.1 -15.2 267 7.5 51.1 79.0 572 -04042300.P#P 0 14.6 2114 -9 448 155 49.9 2.7 -13.6 245 7.2 26.3 46.7 258 -04042223.C12 0 12.6 1615 -11 1173 56 54.8 0.7 -10.8 266 6.6 36.5 68.7 191 -04042222.UMN 0 10.5 412 -29 663 220 60.2 0.9 -17.5 254 8.2 45.7 67.6 357 -04042221.C34 0 11.2 1504 -22 1170 72 53.8 0.8 -15.5 265 7.8 38.9 55.3 252 -04042200.ADM 0 11.7 1347 -25 1310 194 51.9 1.6 -13.2 269 6.8 28.4 68.1 339 -04042122.C12 0 11.5 1550 -3 1449 83 53.3 0.6 -13.2 261 6.6 30.3 65.8 168 -04041921.HOB 0 11.3 2173 -1 1395 86 53.9 1.0 -10.9 235 6.7 32.7 83.0 143 -04041801.MFD 0 10.8 1224 -65 1060 185 23.7 0.0 -16.5 288 8.0 29.7 50.0 245 -04041723.MFD 0 11.9 2519 -15 1046 104 26.5 1.1 -15.5 303 7.2 29.2 37.6 184 -04041105.MFE 0 15.8 2222 -37 402 26 39.9 0.4 -11.6 248 7.5 2.1 69.3 23 -04041019.ILM 0 9.2 180 -45 1165 111 41.2 0.1 -16.1 267 6.0 29.7 69.5 345 -04041001.PRX 0 8.8 516 -75 1780 210 42.3 0.1 -14.1 270 6.7 37.6 59.1 314 -04040818.DAB 0 13.2 1058 -19 810 73 56.2 0.7 -15.8 264 7.7 33.6 94.9 186 -04040815.DHN 0 11.9 877 -2 522 78 53.9 0.6 -15.8 257 6.5 30.9 87.6 111 -04071305.CHE 0 17.6 3151 -107 771 181 49.7 2.9 -8.9 301 7.9 29.7 60.2 300 -04070104.HBR 0 15.7 1988 -45 801 174 24.0 0.0 -8.2 259 7.0 25.9 23.7 276 -04062402.FNT 0 10.0 608 -67 1046 219 50.4 1.0 -15.3 260 6.5 32.1 72.4 270 -04062222.BIS 0 7.2 504 -14 1518 9 56.3 0.0 -18.7 301 6.3 28.7 75.6 88 -04062023.DHT 0 8.4 905 -127 2633 107 47.8 0.0 -9.3 270 8.8 36.3 67.8 192 -04061902.G#1 0 13.2 1631 -27 1122 144 35.1 1.2 -8.6 284 7.3 37.4 58.3 408 -04061900.HDN 0 6.4 316 -26 1668 -40 51.4 0.0 -13.3 257 8.3 36.5 73.3 29 -04061820.FAM 0 15.9 1842 -13 923 65 31.0 0.6 -7.0 271 5.7 23.9 35.7 131 -04061800.LHX 0 12.7 2059 -86 777 206 47.3 2.5 -11.2 235 8.4 37.4 49.6 651 -04052700.CHE 0 8.9 347 -4 1255 145 31.1 0.2 -14.7 268 6.1 31.0 44.9 228 -04052623.TYS 0 14.7 1654 -44 919 199 50.1 2.8 -9.7 275 5.9 37.8 71.9 255 -04052623.OKC 0 15.9 3047 -69 1198 124 56.8 2.5 -7.9 261 6.8 24.4 82.9 79 -04052622.FSD 0 9.4 835 -34 1187 143 35.4 0.6 -17.3 267 7.3 33.1 47.2 271 -04052621.CSV 0 14.4 1608 -15 870 176 59.8 2.8 -9.3 268 6.2 35.9 58.7 237 -04052621.C33 0 13.6 2405 -23 1847 104 55.5 0.4 -9.6 256 7.5 30.4 80.9 72 -04052603.CAI 0 15.4 1463 -14 609 129 47.0 1.5 -11.0 277 7.2 31.6 59.9 153 -04052402.P#7 0 7.8 400 -213 1358 246 41.2 0.0 -15.5 247 8.2 35.3 62.4 412 -04052400.STL 0 16.1 3087 -3 604 162 45.4 3.8 -12.7 253 8.0 28.6 58.7 195 -04052400.CDR 0 5.8 117 -187 2181 178 56.7 0.0 -14.5 256 8.0 30.8 66.1 338 -04052323.BGM 0 14.6 2244 0 781 156 41.1 2.4 -11.9 272 7.8 30.1 44.7 249 -04052320.PIN 0 12.0 1300 -3 1376 120 33.7 0.6 -11.8 267 6.7 36.9 31.3 199 -04052300.ELM 0 12.4 1089 -41 1163 226 43.8 1.5 -9.7 281 5.7 46.2 46.0 359 -04052201.G#1 0 12.3 2404 -84 1771 261 33.8 0.6 -8.2 246 7.9 36.9 50.5 385 -04052201.SNY 0 7.0 484 -214 2287 78 62.8 0.0 -12.7 227 9.0 42.4 81.2 214 -04052123.HYS 0 12.7 3460 -27 2109 75 39.7 0.0 -10.8 236 8.6 29.0 45.1 157 -04052100.FKL 0 14.7 2440 -9 772 269 42.7 4.7 -10.6 299 6.4 28.6 49.2 346 -04052100.DEN 0 9.0 1781 -3 1934 76 49.3 0.1 -11.5 231 8.4 30.6 60.1 225 -04051723.DSM 0 13.3 1669 -24 854 23 36.8 0.2 -11.5 251 6.5 26.2 51.1 132 -04051723.PUB 0 9.2 546 -83 1212 147 55.3 0.5 -11.9 251 7.8 44.9 72.1 222 -04051601.9V9 0 7.5 608 -65 1315 120 61.8 0.5 -19.3 286 7.0 35.7 85.8 189 -04051521.PIR 0 6.8 724 -30 1545 91 60.8 0.3 -21.3 289 7.3 36.7 70.4 224 -04051520.Y26 0 7.0 965 -32 1206 89 60.4 0.7 -23.7 287 7.8 40.0 67.1 217 -99053023.P07 0 12.1 2286 -113 1897 53 39.7 0.1 -8.5 315 7.8 22.5 45.3 165 -99052800.FTW 0 12.2 1104 -4 954 41 33.8 0.3 -12.6 256 6.8 24.6 36.5 103 -99052503.FST 0 10.3 1116 -185 1882 122 53.5 0.0 -9.7 271 8.3 44.1 67.4 157 -99052502.INK 0 11.4 1576 -110 1665 119 56.3 0.4 -10.0 270 7.8 39.9 60.4 191 -99052420.ABQ 0 8.1 781 -71 1338 71 34.2 0.2 -13.9 212 8.5 24.7 44.7 132 -99052220.TUL 0 16.0 3471 -3 869 32 31.1 0.6 -12.1 269 7.3 20.4 36.1 91 -99052200.SNY 0 8.7 1439 -7 1674 53 48.7 0.2 -12.8 266 7.7 28.2 65.4 147 -99052123.RAP 0 8.6 1729 -70 1711 131 43.6 0.4 -16.2 256 8.7 23.0 67.0 178 -99052001.MOT 0 8.0 903 -1 1506 2 27.5 0.0 -17.4 240 7.0 14.4 59.7 47 -99051700.LAA 0 7.5 817 -141 1731 124 65.0 0.1 -15.0 234 8.6 43.8 78.0 361 -99050519.MVN 0 12.9 1777 -10 790 108 57.7 1.8 -14.1 237 6.6 41.0 44.8 194 -99043001.INK 0 12.4 2333 -60 967 95 52.8 1.8 -11.4 237 8.1 32.9 71.8 280 -99042900.BIL 0 6.5 60 -143 1109 133 46.8 0.0 -17.8 182 7.5 39.8 84.0 324 -99042800.EVV 0 9.5 305 -3 1146 22 26.2 0.0 -15.6 225 6.4 18.9 38.1 56 -99042701.OKC 0 8.9 873 -24 1056 47 27.4 0.2 -20.3 275 7.9 23.0 44.2 88 -99042322.LOZ 0 12.8 1995 -5 979 77 37.3 1.0 -11.6 287 6.9 30.4 44.4 71 -99042319.EZF 0 10.2 1142 -51 1722 106 57.2 0.3 -14.2 276 6.9 38.0 68.5 172 -99042203.GOK 0 12.3 2307 -132 894 364 53.9 3.4 -16.0 254 8.5 31.2 54.6 401 -99042123.BMI 0 11.6 1687 -24 839 261 53.4 3.9 -16.4 252 7.8 45.9 57.4 408 -04083002.GCK 0 10.7 1029 -108 1687 204 32.5 0.2 -8.1 315 6.8 29.0 26.2 278 -04083000.SUX 0 10.7 779 -7 1471 199 42.6 0.6 -12.9 289 6.7 36.3 45.9 296 -04082622.C23 0 10.2 983 -43 1349 25 41.1 0.1 -15.8 254 7.2 17.8 70.6 46 -04082621.MCW 0 15.4 2478 -27 1087 26 46.1 0.5 -9.9 239 7.0 37.9 68.9 181 -04082522.FSM 0 18.2 3688 -45 1240 101 33.9 1.6 -6.7 244 6.2 16.5 39.6 113 -04082522.BIS 0 10.2 2077 -41 1811 74 38.1 0.2 -15.2 230 8.4 22.8 43.2 103 -04082503.MHK 0 19.2 4217 -59 627 274 31.2 5.7 -7.9 224 7.5 31.4 51.8 392 -04082501.MHK 0 18.9 4262 -45 721 150 29.9 3.2 -7.4 240 7.1 28.3 50.9 241 -04082020.BGM 0 14.6 1425 -21 712 95 53.2 1.2 -9.5 238 5.9 38.1 53.7 106 -04082018.ORH 0 15.1 2067 -19 1051 47 40.0 0.6 -8.9 256 6.1 29.0 39.9 132 -04081918.LBE 0 14.4 1183 -7 597 105 39.9 0.8 -8.7 270 5.6 40.5 44.4 152 -04081901.PIA 0 13.9 1294 -107 1203 377 40.4 1.6 -7.9 277 5.6 39.8 43.3 465 -04081822.BRL 0 15.3 2600 -41 963 377 41.3 6.8 -9.4 276 6.6 42.5 42.9 508 -04081421.LIC 0 9.9 1288 -66 1242 15 32.2 0.1 -10.2 333 7.8 25.5 42.7 65 -04080321.OAX 0 18.7 4816 -44 1389 92 36.9 1.7 -5.9 259 7.0 23.6 38.1 189 -04080202.Y26 0 15.4 3187 -169 1209 336 55.2 1.6 -9.3 291 8.1 28.5 83.2 385 -04080123.Y22 0 8.5 1290 -28 3011 -1 45.9 0.0 -10.5 298 8.6 30.2 71.2 158 -04073101.GAG 0 14.4 2006 -116 1300 54 42.0 0.3 -6.2 308 6.7 14.8 44.7 98 -04072102.FSD 0 19.9 4659 -49 869 261 26.0 5.3 -5.9 278 7.3 28.0 37.4 426 -99081101.HLC 0 17.4 3928 -33 1289 71 38.3 1.3 -5.1 243 6.7 21.0 34.5 152 -99081023.AKO 0 14.9 2910 -32 1271 87 33.9 1.0 -6.5 232 7.6 22.7 45.7 163 -99080901.DIK 0 12.0 2409 -98 1891 48 58.5 0.1 -10.8 267 8.5 29.7 54.5 94 -99080822.2WX 0 10.3 1972 -32 2526 39 44.1 0.0 -8.8 262 8.3 27.2 41.0 117 -99080702.RAP 0 12.7 921 -36 1200 35 33.6 0.1 -6.6 268 6.3 20.0 48.7 72 -99080301.LWT 0 8.5 449 -155 1772 53 48.3 0.0 -10.3 278 7.8 29.4 70.4 131 -99073100.JKL 0 15.8 3605 -30 1833 89 22.3 0.0 -5.9 355 6.7 22.8 19.6 158 -99073020.IPT 0 15.0 2685 -12 1238 32 34.0 0.4 -8.7 319 6.3 16.0 50.7 72 -99072922.FVX 0 14.5 1431 -13 1556 81 34.3 0.3 -6.0 327 5.6 22.6 48.0 117 -99072902.XVG 0 12.7 1459 -186 1710 319 58.3 0.1 -9.5 302 7.7 41.9 73.8 381 -99072900.ADG 0 14.8 1974 -6 1415 63 37.3 0.5 -9.4 298 7.1 21.7 66.3 118 -99072420.MHT 0 14.8 1594 -17 1088 66 27.8 0.5 -9.7 275 6.5 25.2 56.1 134 -99072319.RAP 0 10.6 1320 -19 2145 52 38.7 0.0 -7.5 263 7.3 22.5 54.0 87 -99072300.FAR 0 16.2 2819 -34 1355 81 35.4 0.9 -8.5 247 7.6 27.9 55.9 137 -99071923.GDV 0 11.9 1807 -31 1654 21 41.3 0.1 -11.2 254 7.9 18.9 69.4 67 -99071302.FAR 0 12.1 1948 -48 1552 125 38.2 0.7 -12.5 297 7.2 27.2 61.0 158 -99071302.DVL 0 10.4 1453 -76 1761 69 42.5 0.1 -13.5 288 7.5 28.3 62.4 124 -99071300.OLF 0 9.2 1101 -38 2374 25 49.7 0.0 -10.3 281 7.3 26.5 65.7 106 -99071202.AIA 0 9.4 1094 -73 1844 -8 27.8 0.0 -11.3 327 8.0 26.7 47.0 79 -99070804.GDV 0 14.2 2058 -209 1364 472 61.7 0.0 -7.6 251 8.0 40.8 78.6 551 -99070421.ERY 0 19.1 3756 -61 791 95 32.9 1.8 -6.7 267 8.2 22.2 36.6 98 -99070207.SFD 0 9.5 32 -374 1535 254 82.4 0.0 -10.7 263 7.4 45.0 92.7 464 -99070103.SWO 0 18.3 2994 -18 703 229 51.1 5.8 -4.6 303 6.4 25.9 51.9 297 -99070103.GCK 0 15.2 2113 -124 873 95 73.0 1.0 -6.5 294 7.5 37.6 74.8 319 -99063023.LBF 0 9.7 291 -114 1136 0 76.3 0.0 -12.3 289 6.9 54.3 115.6 214 -99062801.BGD 0 13.8 2864 -63 2251 73 37.7 0.0 -5.0 266 8.5 22.5 43.1 130 -99062522.DIK 0 12.8 2775 -1 1732 -52 57.7 -0.4 -10.3 230 8.2 35.4 58.9 132 -99062501.VTN 0 11.7 1035 -41 1545 55 41.3 0.2 -8.2 282 6.6 23.6 41.7 120 -99062400.BGD 0 12.2 2544 -17 2195 10 13.6 0.0 -6.5 288 7.8 22.6 35.1 91 -99060601.P07 0 11.8 1543 -130 1771 -31 45.2 0.0 -8.7 243 7.9 18.4 58.3 32 -99060523.LBF 0 10.7 2070 -28 1957 91 62.6 0.1 -12.9 197 8.5 25.9 90.4 131 -99060302.IML 0 10.0 869 -198 1657 237 43.7 0.0 -11.0 225 8.5 39.8 66.5 421 -99060202.GCC 0 6.3 226 -83 1883 18 41.3 0.0 -15.4 262 8.3 26.0 42.6 126 -99060200.FTW 0 16.8 3982 -31 1338 62 35.0 1.0 -11.1 275 8.5 25.7 60.3 144 -99053102.MHK 0 11.6 903 -51 1360 108 32.8 0.3 -11.3 270 6.9 30.0 24.5 179 -99120303.ADM 0 9.7 1355 -50 974 250 42.8 2.4 -22.1 217 8.5 35.9 65.7 332 -99112303.RBD 0 13.2 1077 -16 789 138 48.1 1.2 -13.6 235 6.4 25.1 60.9 176 -99112302.HBR 0 8.7 124 -124 660 53 47.7 0.0 -17.1 219 6.7 41.5 75.7 132 -99100823.FSI 0 10.1 649 -14 1313 5 36.2 0.0 -13.6 219 6.3 14.3 67.9 56 -99092600.GKY 0 13.1 1483 -15 1429 43 28.0 0.2 -9.4 340 6.3 21.5 55.3 182 -99092522.D07 0 6.4 163 -199 2219 136 65.7 0.0 -15.8 242 8.3 31.8 105.7 206 -99092004.RRC 0 11.2 292 -200 1044 70 37.2 0.0 -11.2 270 6.7 28.8 60.6 216 -99092000.OKC 0 11.1 1068 -42 1896 56 39.5 0.0 -10.1 290 6.8 29.0 60.9 190 -99091923.CSM 0 11.9 1645 -3 1885 18 41.3 0.0 -9.8 280 7.0 27.5 64.0 178 -99091920.CGZ 0 11.2 802 -16 1905 19 39.1 0.0 -8.7 245 6.5 16.0 60.3 61 -99091207.SLP 0 15.6 2094 -69 507 92 45.4 1.3 -10.8 271 8.2 16.8 55.8 121 -99091200.LBL 0 11.9 1180 -121 1590 31 43.2 0.1 -9.0 275 7.8 25.7 65.5 84 -99091122.HLC 0 12.4 1517 -36 1221 59 37.8 0.4 -11.3 253 7.4 21.0 66.2 94 -99091101.AFW 0 13.1 1250 -24 1970 21 29.5 0.0 -7.4 297 6.2 21.7 52.8 139 -99082300.ABR 0 11.7 1432 -38 1851 61 40.1 0.1 -9.6 289 6.9 20.3 45.5 101 -99082104.HON 0 13.3 1187 -244 1155 197 38.1 0.0 -8.9 281 7.4 31.4 54.2 238 -99082100.LBF 0 9.8 20 -311 1794 44 34.8 0.0 -7.8 321 7.1 19.7 46.1 126 -99082022.DIK 0 11.7 1445 -10 1669 21 33.6 0.1 -7.8 298 6.3 17.8 36.0 58 -99081922.MLS 0 7.1 393 -105 3278 19 33.8 0.0 -10.0 244 8.6 22.0 37.3 120 -99081800.RRT 0 11.4 1524 -26 847 90 49.2 1.1 -17.7 268 7.3 32.2 62.0 126 -99081400.ALB 0 16.8 1843 -4 701 196 38.5 2.3 -6.3 249 5.8 29.9 48.4 252 -99081202.GCC 0 10.6 877 -99 1162 63 34.5 0.2 -10.2 218 7.5 17.7 54.6 98 +FILENAME CAT MLMIXR ML CAPE ML CIN MLCL(MAGL) 0-1SRH 0-6KT STPC 500 T (C) 500DIR 7-5 LR 0-3(KT) 0-9(KT) 0-3 KM SRH (M2/S2) +00042320.TXK 2 12.9 1702 -1 657 134 61.7 2.3 -14.0 250 6.5 32.8 76.6 166 +00042001.PPF 2 13.5 2614 -50 1216 227 59.9 4.7 -12.9 234 7.5 39.7 73.5 244 +00032900.FTW 2 13.1 2058 -42 1069 83 49.7 1.3 -15.2 245 8.0 21.9 87.1 126 +00032304.SJT 2 11.9 1680 -119 896 119 61.1 1.1 -15.5 212 9.1 38.4 66.9 217 +00031622.ATT 2 9.4 1019 -7 1566 12 45.8 0.0 -17.5 249 8.0 34.4 53.7 159 +00021323.LRF 2 9.2 1256 -9 1066 82 46.9 0.8 -21.2 249 7.5 32.3 51.4 114 +00010323.MEI 2 13.4 1148 -15 769 241 57.2 2.6 -10.0 226 6.1 38.8 71.2 288 +00010319.GWO 2 12.8 1168 -9 770 202 66.4 2.4 -13.0 223 7.5 47.3 75.1 246 +03050500.UMN 2 13.8 2392 -10 773 341 66.3 8.2 -13.4 237 7.7 49.1 93.8 411 +03050500.JBR 2 15.7 2713 -22 862 266 57.8 6.9 -10.7 240 7.1 50.5 82.9 440 +03050421.TUL 2 16.1 3621 -15 843 147 63.1 5.3 -11.7 230 7.3 45.6 100.2 160 +03050421.MKC 2 13.7 2002 -67 478 479 68.4 8.5 -14.6 224 7.9 48.1 89.8 508 +03050420.P#F 2 15.7 3397 -1 660 166 58.5 5.5 -12.7 230 7.8 34.3 100.9 195 +03050321.P#T 2 12.7 3156 -2 1967 61 36.2 0.0 -9.8 247 7.5 27.2 67.1 207 +03042503.JAN 2 13.5 2568 -27 924 257 44.3 4.9 -15.4 255 7.7 41.1 76.9 279 +03041922.PNC 2 11.5 1157 -40 665 212 87.9 2.5 -17.9 223 7.3 46.5 111.5 242 +03041523.CDS 2 10.7 1020 -106 1534 326 74.0 1.0 -12.4 234 7.5 56.1 83.8 531 +03041522.LBB 2 8.8 883 -53 1986 116 77.2 0.0 -11.7 243 7.5 48.5 87.4 276 +03040702.CLN 2 13.1 488 -133 780 363 62.7 0.8 -11.4 244 7.1 33.6 74.1 411 +03040623.ESF 2 15.8 1847 -29 621 166 51.8 2.6 -11.0 246 6.8 26.8 50.8 161 +03032722.MIA 2 12.4 299 -31 1074 187 48.8 0.4 -10.5 261 5.8 20.5 87.0 197 +01061900.ROS 2 13.6 2218 -30 1076 140 67.7 2.9 -11.1 250 8.2 40.5 73.6 279 +01061401.LNK 2 17.2 4665 -15 1190 173 39.2 4.3 -10.5 215 8.3 32.6 50.7 217 +01061120.ILL 2 14.7 3400 -120 1255 270 56.1 3.4 -10.8 259 8.6 41.9 54.8 448 +01060222.LOZ 2 9.7 164 -10 898 117 51.4 0.2 -13.4 270 5.3 39.8 66.8 189 +01053000.AMA 2 13.0 2887 -76 1322 166 48.4 2.2 -10.1 246 8.4 38.6 50.6 216 +01052902.LHX 2 10.9 1698 -120 1285 185 52.1 1.0 -10.0 251 8.2 38.9 60.5 365 +01052118.OZW 2 12.5 494 -2 775 133 33.4 0.4 -10.3 188 5.6 34.2 36.9 174 +01052022.MIN 2 16.9 3331 -2 711 122 47.8 3.2 -11.0 244 7.3 36.0 67.7 201 +01051022.MIW 2 12.8 2912 -24 1091 65 36.4 1.0 -16.0 255 7.9 28.8 43.0 141 +01051001.FBL 2 9.5 2106 -90 1776 330 50.0 1.0 -16.6 265 8.2 42.9 50.3 516 +01050200.AUM 2 11.2 1434 -74 1331 179 38.8 0.9 -13.3 251 7.5 36.0 52.3 237 +01042202.GBD 2 12.6 2145 -40 777 165 61.8 3.5 -13.6 229 7.8 41.6 62.6 328 +01041423.P28 2 12.3 2168 -54 827 145 76.4 3.1 -16.2 256 8.3 45.0 89.5 235 +01041117.LWD 2 11.9 968 -3 632 282 77.0 2.7 -15.1 208 7.5 38.2 81.4 327 +01040918.BVI 2 10.7 1326 -11 1210 102 57.2 1.0 -15.4 266 7.7 32.1 32.1 174 +01022422.SGT 2 11.8 1020 -15 967 335 52.8 3.0 -14.3 213 7.7 53.6 64.9 450 +00110820.HEZ 2 15.9 2158 -6 881 236 47.1 4.0 -8.5 204 6.2 29.0 68.5 266 +00103122.HLC 2 11.0 1274 -14 954 110 47.4 1.1 -14.1 202 7.4 32.6 74.4 169 +00092022.DAY 2 13.9 1299 -7 971 215 63.4 2.8 -8.2 237 6.1 37.5 61.0 237 +00072601.OTG 2 14.5 2869 -49 1055 88 42.5 1.7 -12.6 290 7.2 33.4 41.3 161 +00072523.RWF 2 14.6 2791 -13 1068 96 39.4 1.6 -12.0 275 7.0 29.2 35.8 163 +00071122.BKX 2 14.7 1167 -47 944 134 42.8 1.1 -7.8 261 6.8 27.2 67.9 205 +00070601.SNY 2 13.6 2847 -18 1681 52 57.5 0.5 -7.4 248 8.1 19.0 74.4 122 +00052319.BWG 2 13.7 2114 -41 1128 167 38.6 2.0 -11.4 294 6.9 36.9 62.8 278 +00051722.LXN 2 14.0 3552 -16 910 111 27.5 1.8 -13.9 169 8.4 28.1 44.5 170 +00051200.ALO 2 16.5 4382 -13 1110 168 51.1 5.6 -7.9 254 6.7 33.2 51.6 199 +00050101.MWL 2 13.0 2207 -103 1176 253 47.3 2.4 -12.4 227 8.2 40.3 37.8 297 +00042323.SHV 2 13.4 2001 -19 928 216 58.9 4.2 -13.0 261 6.7 41.9 60.0 296 +04051923.GFK 2 11.2 967 -44 828 233 54.9 2.1 -16.6 243 7.2 39.5 86.1 229 +04051302.ICT 2 15.9 3157 -12 538 223 36.4 4.3 -9.4 232 6.4 23.8 51.5 245 +04051101.LIC 2 9.0 1549 -59 1592 233 43.4 1.0 -11.5 244 8.4 35.1 46.6 395 +04042022.PIA 2 12.4 1852 -11 728 320 36.4 3.6 -14.7 235 6.2 38.5 40.1 488 +04032718.DDC 2 10.0 1332 -8 893 190 41.4 1.7 -16.6 206 7.5 30.8 47.5 198 +04030418.ABI 2 10.7 626 -20 1108 319 46.5 1.4 -13.7 196 7.0 40.3 84.2 350 +03111718.HOU 2 16.4 1980 -1 445 137 48.2 2.2 -12.4 207 6.6 24.0 77.0 158 +03111223.MFD 2 8.3 64 -56 890 219 99.1 0.1 -15.7 261 5.7 55.1 123.1 275 +03111220.MIE 2 9.7 388 -1 757 123 91.0 0.5 -15.6 258 5.7 47.1 117.3 205 +03082201.JXN 2 17.2 3046 -36 1091 255 31.0 3.6 -5.9 285 6.6 34.4 33.2 304 +03072122.AVP 2 14.3 1810 -16 1228 162 51.1 1.9 -7.9 239 5.6 45.7 49.9 148 +03072104.CID 2 17.8 2344 -22 462 187 48.9 3.6 -7.0 291 7.0 34.2 63.6 237 +03072101.ALO 2 15.0 1859 -107 921 156 49.6 1.5 -8.0 297 7.0 28.2 58.2 248 +03062500.HON 2 17.0 3737 -23 1021 335 52.2 10.7 -7.4 227 7.5 43.4 61.6 550 +03062422.MHE 2 19.5 5088 -22 717 256 55.5 12.1 -8.0 228 7.9 40.9 58.4 422 +03062421.MHE 2 17.5 3584 -16 768 252 56.0 8.4 -7.9 220 7.8 38.8 57.2 348 +03062302.P#8 2 16.8 3414 -169 1003 367 38.7 1.7 -6.8 227 7.6 30.2 57.1 437 +03062223.P#8 2 17.7 4366 -39 972 253 38.8 7.2 -8.3 246 8.6 34.3 54.7 387 +03061001.P#9 2 12.6 2103 -97 1467 421 51.0 2.8 -11.2 266 7.9 45.5 63.9 651 +03053103.CMI 2 12.6 701 -119 899 482 64.7 1.8 -11.6 292 6.3 36.9 85.1 523 +03053101.ILX 2 12.4 784 -55 1108 474 76.0 3.2 -8.5 294 5.0 45.0 90.9 524 +03051100.UIN 2 14.7 2093 -27 738 302 63.1 6.3 -11.7 240 7.7 43.7 97.9 354 +03051004.C34 2 17.3 3493 -14 749 452 53.6 14.1 -8.8 228 7.7 32.1 77.0 511 +03050923.HBR 2 11.1 1389 -64 2135 137 56.8 0.0 -9.1 231 7.7 35.8 78.1 219 +03050900.C30 2 14.6 1749 -112 819 321 69.8 3.3 -8.9 227 6.8 57.0 72.2 306 +03050823.C34 2 17.9 3605 -25 669 342 65.2 12.3 -7.2 233 7.1 42.3 72.0 318 +03050822.W#N 2 17.4 3730 -13 635 141 70.0 5.3 -10.1 228 7.6 45.5 81.3 173 +03050821.LW1 2 19.1 5309 -6 876 145 63.2 7.7 -8.7 235 7.4 31.6 71.3 182 +03050807.ADM 2 17.1 3114 -53 730 439 47.4 10.6 -9.3 253 8.0 50.2 61.5 608 +03050805.SPS 2 16.0 2409 -148 836 382 44.4 2.4 -9.1 262 7.9 43.1 59.0 798 +03050703.PAH 2 15.8 2873 -49 602 390 36.8 6.9 -13.6 237 7.9 35.3 70.1 454 +03050701.CGI 2 15.1 2935 -47 799 431 61.0 12.6 -14.4 269 7.8 32.8 83.2 580 +03050504.MKL 2 15.6 2334 -16 833 615 59.6 14.3 -9.9 251 7.1 62.0 77.1 842 +03050501.LZK 2 15.9 2390 -18 719 361 67.0 8.6 -11.0 237 7.4 41.7 97.3 397 +99120301.GOK 2 10.2 1811 -12 858 234 47.2 3.3 -21.1 202 8.2 32.4 63.0 262 +99081601.JMS 2 13.6 1255 -165 1044 130 48.5 0.3 -9.9 240 8.1 30.2 89.4 174 +99070900.ONA 2 18.4 3379 -18 992 385 46.0 10.0 -5.8 275 6.5 42.9 49.4 571 +99070400.OSC 2 15.9 1760 -27 1078 101 26.7 0.7 -6.7 320 6.2 28.3 31.6 163 +99060620.HCO 2 14.6 3241 -5 904 65 29.6 1.0 -16.1 175 8.1 26.8 70.8 115 +99060500.IEN 2 12.1 2533 -37 1323 70 52.4 1.0 -11.4 201 8.2 32.9 60.1 191 +99060400.HLC 2 15.7 4348 -16 1101 154 38.3 3.9 -9.3 240 7.5 36.9 40.6 277 +99060200.TBN 2 14.9 2338 -19 838 136 37.3 2.0 -10.3 259 6.5 40.0 21.6 223 +99060123.MKO 2 17.3 3739 0 888 68 38.1 1.6 -10.6 279 7.9 32.2 23.0 135 +99060100.LIC 2 9.1 1877 -49 1439 56 56.8 0.6 -13.7 249 9.2 34.3 62.4 140 +99051621.OMA 2 16.1 4691 0 824 102 38.6 3.1 -14.5 223 8.8 33.7 41.5 176 +99051122.BMQ 2 15.0 3545 -92 1026 40 35.1 0.6 -12.3 259 8.0 21.8 29.6 59 +99050408.JCT 2 13.0 2082 -218 838 355 55.0 0.0 -11.2 254 8.3 46.8 58.7 506 +99050402.GOK 2 13.9 3154 -61 723 366 51.4 9.2 -14.6 240 8.2 36.8 57.5 441 +99050401.ICT 2 12.6 2748 -7 1016 257 31.8 3.7 -14.7 227 7.9 40.5 70.4 415 +99050323.OKC 2 15.2 4117 -15 733 308 43.5 9.2 -13.2 243 7.8 43.2 70.1 401 +99050300.HSI 2 8.0 203 -4 845 168 41.5 0.2 -17.7 222 6.7 28.6 32.1 221 +99042200.END 2 12.7 3301 -34 1156 225 46.1 4.8 -15.4 236 8.1 35.1 48.2 242 +04082700.RDD 2 18.4 3706 -37 940 184 41.0 4.7 -6.9 255 7.1 28.7 60.7 258 +04071823.GFK 2 16.7 3575 -36 1246 117 45.4 2.4 -7.9 310 6.8 35.1 45.5 292 +04071302.GRI 2 15.9 3090 -197 1538 152 29.0 0.0 -7.9 298 8.5 13.8 50.5 173 +04062402.OSH 2 11.1 1428 -30 700 187 62.2 2.7 -16.7 257 6.5 50.9 79.3 234 +04061620.LAA 2 12.3 1494 -63 908 129 51.4 1.5 -9.4 252 7.7 34.1 57.1 369 +04061300.W#N 2 16.4 3866 -17 1255 231 34.6 3.8 -9.2 251 7.9 37.4 44.2 387 +04060701.MOT 2 10.4 295 -316 1541 461 68.3 0.0 -8.4 254 6.7 33.2 82.6 561 +04060621.C02 2 9.9 1824 -59 2285 83 55.5 0.0 -10.8 234 7.9 39.7 69.2 64 +04053023.IND 2 17.3 2618 -10 577 361 58.6 9.2 -9.1 248 6.9 35.7 45.1 369 +04053020.SDF 2 16.6 2653 -2 807 250 52.4 5.8 -9.4 245 6.8 37.1 41.1 317 +04053002.OKC 2 15.5 2559 -32 1162 314 55.7 6.2 -7.3 244 7.0 35.6 70.5 434 +04053002.ICT 2 16.1 3240 -98 992 315 44.2 5.1 -10.4 245 7.9 25.8 56.2 399 +04053000.MCI 2 16.0 3437 -5 863 239 36.5 5.0 -12.8 232 8.3 27.4 42.9 372 +04052922.C33 2 16.5 4081 -4 1356 126 51.4 2.8 -7.8 244 7.4 36.9 74.7 248 +04052921.TOP 2 16.1 3843 -13 936 78 32.5 1.6 -12.5 233 8.0 17.3 39.0 190 +04052421.STJ 2 15.6 3982 -40 991 76 40.4 2.0 -11.9 234 7.7 26.3 67.6 270 +04052300.P#8 2 15.0 3882 -47 1262 228 54.5 5.9 -10.5 233 7.9 34.1 69.9 334 +04052221.MCK 2 13.2 3453 -37 1185 103 72.0 2.9 -12.3 231 8.6 35.5 82.5 224 +04052219.GLD 2 9.9 1898 -54 1700 22 59.0 0.1 -12.7 233 8.4 12.6 69.5 76 +04052122.CID 2 15.4 2960 -48 971 309 36.6 5.6 -11.5 268 7.4 36.1 50.0 390 +53031321.FWH 2 10.8 727 -98 981 119 51.2 0.5 -16.3 248 8.1 30.6 80.9 266 V +55052521.LTS 2 15.0 4060 -25 1509 322 66.4 6.4 -12.3 225 8.6 37.0 53.5 355 V +56041521.GUN 2 11.7 1189 -11 1302 251 72.4 2.1 -13.6 230 7.3 55.7 66.8 370 V +57040221.FWH 2 13.2 3580 -3 942 94 35.8 2.0 -15.8 189 7.9 26.1 52.8 122 V +57052021.TOP 2 14.0 2801 -2 920 142 55.7 3.7 -13.8 207 7.7 48.0 77.2 228 V +57052121.BYH 2 15.7 2854 -5 1106 236 49.7 5.0 -10.9 230 7.2 33.0 92.5 240 V +57061418.PIA 2 15.9 2118 -6 986 394 50.0 7.0 -8.6 252 6.9 52.8 52.1 496 V +59040100.FWH 2 12.6 3068 -26 987 124 42.8 2.7 -17.6 247 9.0 28.0 61.5 142 V +61050800.FSM 2 14.5 2844 -7 1215 261 61.7 5.8 -11.4 240 7.5 42.2 65.9 323 V +61050600.FSM 2 14.3 2667 -12 1121 245 65.5 5.8 -13.1 240 8.3 61.7 43.1 430 V +62052600.OKC 2 14.3 4171 -76 1591 154 33.3 1.2 -12.0 264 8.6 25.3 43.2 228 V +62080700.TOP 2 20.6 6024 -12 1167 160 42.3 5.7 -7.3 250 7.7 32.4 60.6 243 V +64050600.OMA 2 12.7 2395 -61 1048 349 68.6 7.4 -13.8 224 8.8 54.6 89.3 498 V +65041200.FNT 2 11.2 1814 -1 974 166 91.0 3.0 -17.7 250 7.7 46.4 91.6 372 V +66042800.FWH 2 14.1 3342 -17 1291 148 38.0 2.2 -11.8 265 7.2 39.3 49.0 269 V +66030400.HKS 2 12.2 1434 -10 831 138 47.6 1.6 -14.0 234 7.6 49.0 77.8 142 V +67061100.OKC 2 14.4 3497 0 1569 144 32.2 1.2 -11.0 235 8.7 35.0 51.1 260 V +68110400.VPS 2 12.8 1596 -2 812 129 50.5 1.7 -13.4 251 5.9 30.3 72.0 184 V +69041806.VPS 2 15.2 1013 -8 445 370 55.8 3.5 -11.0 248 6.9 42.3 73.3 439 V +69062400.TIK 2 18.4 4403 -4 776 317 37.5 8.7 -9.4 240 7.5 45.3 56.2 431 V +70100600.TIK 2 13.7 1865 -3 772 241 41.1 3.1 -12.2 230 6.7 35.4 55.6 335 V +71022200.JAN 2 12.8 938 -4 930 470 74.7 4.4 -11.8 211 6.7 57.8 77.3 590 V +73052800.MGM 2 16.4 2337 -2 1017 293 53.5 6.0 -7.9 239 6.2 45.6 45.2 386 V +73041600.VCT 2 15.4 2861 -37 1272 385 48.1 6.4 -12.9 231 8.1 35.7 72.2 377 V +74040400.MGM 2 14.8 2955 -2 1017 161 52.0 4.1 -12.8 235 8.2 39.5 59.4 253 V +74040400.BNA 2 14.6 2744 -31 970 209 77.8 5.7 -13.3 238 7.8 57.0 80.2 301 V +74040400.DAY 2 12.8 2185 -7 986 619 90.8 13.5 -13.1 235 7.1 71.9 91.6 919 V +75042500.UMN 2 15.7 5306 -1 837 145 53.3 6.8 -13.8 255 7.3 41.6 61.8 185 V +74060900.UMN 2 17.0 3643 -2 987 363 37.0 8.1 -6.7 231 7.6 41.4 27.5 508 V +75063000.BIS 2 13.6 3158 -76 1566 198 41.8 1.6 -12.3 233 8.6 26.8 55.7 204 V +76042000.SEP 2 13.7 3326 0 1092 305 45.1 6.9 -14.1 240 7.6 33.7 48.9 358 V +77040418.CKL 2 14.1 1633 0 994 247 66.8 4.0 -9.8 231 6.0 52.7 80.0 333 V +78060100.TOP 2 16.2 4279 -1 1160 267 35.7 5.7 -12.7 233 7.6 36.3 57.0 349 V +79041021.SEP 2 12.8 2186 -9 912 345 48.2 6.1 -13.1 228 8.1 42.9 54.3 468 V +79050300.OKC 2 13.9 2775 -4 877 218 73.2 6.0 -12.3 246 7.2 57.7 103.2 279 V +79033000.OMA 2 10.1 1322 -24 1155 223 56.4 2.4 -15.8 232 7.1 49.1 52.9 345 V +80040800.UMN 2 10.2 2256 -3 1473 97 39.6 0.8 -18.5 236 8.4 39.7 92.1 247 V +84060800.TOP 2 16.2 2284 -16 918 560 74.0 12.8 -6.0 237 6.2 49.1 84.6 705 V +84031600.1M1 2 12.2 2339 -1 1056 250 47.1 4.3 -14.9 251 6.9 30.4 55.5 292 V +86072900.OMA 2 16.4 4252 -21 1667 112 48.4 1.3 -10.6 268 8.6 28.2 81.3 151 V +87111600.GGG 2 12.8 1593 -8 723 298 61.9 4.8 -15.3 178 7.9 43.3 65.2 326 V +90061600.LBF 2 16.1 3827 -1 1050 21 42.1 0.5 -10.6 185 8.5 24.5 74.1 95 V +90060300.PAH 2 15.6 2246 -3 1039 274 47.1 4.7 -7.6 251 7.0 57.8 49.8 384 V +91042700.OUN 2 15.8 4387 -8 898 195 50.3 7.2 -11.5 242 7.0 44.2 54.9 370 V +92062800.AMA 2 14.6 3148 -3 1020 83 44.3 1.9 -10.3 249 7.9 32.7 52.7 220 V +92061700.OVN 2 18.7 4878 -1 1119 262 50.4 9.5 -6.5 237 6.9 46.6 64.6 473 V +93042500.OUN 2 11.6 2675 0 1209 113 49.6 2.0 -14.6 235 6.9 35.5 65.5 168 V +93050700.TOP 2 13.7 2046 -7 666 484 58.8 9.7 -13.1 217 7.0 55.4 51.4 644 V +93060700.LBF 2 15.9 4738 0 930 328 59.3 15.3 -8.6 229 7.6 41.9 67.6 583 V +94042600.SEP 2 12.9 2562 -34 1365 201 51.9 2.8 -11.5 258 7.4 41.3 51.0 198 V +95051900.BMX 2 15.7 2868 -5 989 239 39.3 4.5 -9.9 247 6.7 31.9 49.1 230 V +98040900.BMX 2 14.6 2259 -18 642 136 77.9 3.1 -13.9 240 7.9 50.3 100.1 290 V +98041700.BMX 2 14.7 2038 0 704 263 73.4 5.4 -11.9 245 6.8 36.3 98.6 327 V +99050400.OUN 2 13.4 3644 -22 1050 271 41.4 6.5 -14.9 225 8.4 32.0 37.7 343 V +00121618.BMX 2 12.0 1369 -1 737 279 66.9 3.8 -14.1 220 6.7 51.3 90.8 339 V +00092100.ILN 2 12.5 747 -19 1280 611 75.3 3.3 -7.5 240 5.4 64.7 73.0 810 V +01061400.OAX 2 16.8 4639 -1 1278 127 38.6 2.8 -11.3 215 9.0 35.2 48.5 145 V +01112412.JAN 2 13.0 1392 -2 773 366 50.4 4.3 -10.1 225 5.7 52.4 48.8 504 V +01112418.BMX 2 13.4 1498 -1 655 227 52.0 3.0 -11.3 220 6.1 43.1 61.9 319 V +02111018.ILN 2 11.3 1239 0 734 385 54.4 4.3 -13.7 230 6.6 49.5 103.8 417 V +02062400.ABR 2 17.1 4378 0 1112 85 50.6 2.8 -10.5 245 8.2 29.8 57.9 153 V +03050900.OUN 2 17.0 3871 -32 990 336 62.0 13.0 -6.9 235 6.3 53.9 80.1 364 V +94032718.CKL 2 15.5 1965 0 743 344 72.9 6.8 -9.1 233 6.3 54.7 56.0 403 V +81052300.OKC 2 13.1 2411 -70 1142 203 49.1 3.0 -13.7 235 9.0 37.6 49.1 249 V +65041100.LIT 2 12.7 1815 -1 1365 140 52.3 1.4 -11.1 248 7.2 39.4 64.4 212 V +53051121.FWH 2 13.2 1452 -55 1150 122 53.0 1.3 -11.2 248 7.3 40.4 64.4 209 V +90082900.PIA 2 21.0 6470 -2 974 110 33.6 4.0 -7.3 297 7.1 23.3 54.6 147 V +55042411.GUN 2 13.1 1784 -7 917 345 68.7 6.2 -12.7 248 7.1 44.1 85.9 375 V +56040321.HKS 2 13.0 1491 -14 1212 173 82.1 2.0 -12.4 221 7.5 52.1 107.5 267 V +56051221.MTC 2 13.8 2444 -8 1001 124 69.2 3.0 -14.4 266 7.5 25.2 94.3 162 V +60052000.TOP 2 14.3 3120 -23 1112 167 43.1 3.3 -13.3 213 8.2 32.6 58.1 244 V +66060900.TOP 2 15.9 2226 -24 819 296 59.5 6.5 -8.6 223 7.1 47.3 69.8 397 V +68082000.GRB 2 16.1 2780 -11 1217 173 50.0 3.1 -7.3 258 6.4 27.0 43.6 195 V +74040318.BNA 2 13.0 2906 -5 1157 205 63.1 5.0 -15.5 229 8.2 48.6 76.4 333 V +61051500.PIA 2 12.4 1259 -2 817 196 68.7 2.5 -13.0 202 6.6 36.7 80.9 205 V +54050121.TIK 2 13.0 1988 -17 709 242 56.2 4.5 -13.5 203 8.0 39.2 73.2 282 V +55060421.SLN 2 13.4 3594 -5 1422 36 25.3 0.3 -12.7 225 7.9 23.8 30.4 152 V +70061300.COU 2 16.5 3499 -11 949 204 64.2 7.2 -7.8 246 5.5 49.6 57.1 318 V +76032700.1M1 2 11.8 1820 -17 961 187 41.8 2.4 -17.1 230 8.2 57.3 71.8 243 V +04071318.ILX 2 19.0 4958 -10 1102 117 37.5 3.3 -10.9 305 7.9 33.8 45.3 197 V +68051600.LIT 2 15.6 2612 -4 971 250 52.8 5.7 -11.7 260 8.6 45.5 72.5 337 V +65031700.OKC 2 11.1 1628 -3 687 269 91.0 4.4 -17.9 235 7.1 58.8 114.4 325 V +00050901.AIZ 0 13.1 1987 -68 1453 84 35.7 0.5 -11.3 241 8.5 41.9 28.1 204 +00050722.SNY 0 9.8 2015 -39 1845 23 56.1 0.1 -12.4 245 8.7 34.2 64.8 128 +00050707.OGA 0 11.6 1205 -190 787 34 39.5 0.0 -11.3 236 8.2 22.0 47.2 115 +00050323.RBD 0 11.2 940 -3 1077 54 42.9 0.3 -14.6 290 6.2 28.9 58.4 174 +00043001.ABI 0 11.9 2549 -66 1686 111 39.6 0.5 -11.8 268 8.4 26.8 40.5 228 +00042423.LAA 0 5.4 613 -132 2566 97 54.0 0.0 -16.3 278 8.9 29.1 72.7 192 +00042422.EHA 0 6.7 706 -56 2143 58 53.8 0.0 -15.2 295 8.1 25.8 83.4 159 +00042021.BWG 0 11.2 1126 -13 1162 167 52.1 1.4 -13.5 240 7.4 46.8 53.8 253 +00042021.BNA 0 11.2 989 -26 1114 165 53.6 1.3 -13.7 242 7.7 45.4 65.0 244 +00042001.MCI 0 12.4 2093 -43 1300 141 61.9 2.1 -12.3 226 7.0 33.4 81.4 163 +00042000.JCT 0 13.1 2950 -156 1701 170 51.7 0.4 -9.4 253 8.2 40.5 71.8 240 +00041822.SJT 0 7.1 414 -185 3169 -7 49.4 0.0 -9.5 243 8.2 32.3 60.6 45 +00041620.SUS 0 9.5 579 -1 968 46 41.8 0.2 -18.1 247 6.6 30.2 69.5 154 +00041602.GRA 0 10.2 901 -182 1269 251 56.8 0.2 -17.0 244 8.6 34.1 76.8 276 +00033000.SHV 0 12.6 1635 -14 797 147 57.7 2.3 -15.2 267 7.2 33.9 91.9 219 +00032900.HYI 0 15.8 2875 -10 771 106 60.6 3.0 -11.6 251 7.3 36.4 82.8 192 +00032522.BNA 0 8.3 268 -8 1461 34 37.5 0.0 -16.9 270 6.2 23.2 61.3 60 +00032207.MAF 0 11.5 1952 0 562 249 54.6 4.4 -16.4 196 8.3 45.0 77.8 468 +00031600.CSM 0 8.3 808 -99 1327 59 34.5 0.1 -17.7 251 7.6 25.7 34.3 101 +00031022.BHM 0 10.3 614 -95 1034 103 48.9 0.4 -15.8 238 7.0 33.1 49.4 179 +00030923.LRD 0 13.5 2701 -7 1360 -13 41.3 -0.2 -12.5 256 7.5 20.8 59.4 95 +00030920.GFL 0 7.1 1 -425 1416 88 63.6 0.0 -18.7 242 8.1 39.6 77.0 165 +00030900.UNU 0 9.9 1306 -11 1121 172 50.6 1.7 -17.3 203 6.6 39.6 44.1 206 +00030900.CLI 0 9.4 673 -29 1009 196 53.3 1.2 -16.9 202 6.6 39.4 53.8 226 +00030302.PWG 0 12.0 1469 -17 1106 252 60.9 3.3 -12.2 259 6.1 45.0 75.3 323 +00030222.AFW 0 11.1 999 -6 913 256 68.3 2.6 -13.5 238 6.5 36.9 80.1 345 +00022606.CRS 0 13.3 2158 -10 637 191 48.7 3.3 -14.8 239 6.9 25.4 69.2 184 +00022523.FSD 0 7.3 495 -2 929 82 38.3 0.3 -21.9 172 7.7 30.1 52.5 83 +00022405.FAM 0 9.2 437 -46 772 315 46.8 1.1 -18.0 235 6.3 29.2 42.2 331 +00072222.BBW 0 11.9 1462 -1 1218 36 35.2 0.2 -11.1 328 6.5 26.6 43.9 124 +00072220.GLD 0 10.6 1162 -15 1699 26 39.9 0.1 -10.2 319 7.4 19.8 55.8 82 +00072122.BFF 0 9.8 1738 -8 2036 34 42.0 0.0 -9.9 297 7.7 36.2 48.9 131 +00072022.AKO 0 14.0 3465 -7 1063 22 46.2 0.6 -10.2 278 8.3 29.1 64.7 106 +00072000.BVX 0 17.4 3847 -11 1674 30 36.4 0.2 -7.1 298 6.9 26.0 29.2 130 +00071022.RCA 0 13.2 1916 -28 1452 23 41.1 0.2 -9.2 238 7.6 21.4 68.1 95 +00071001.LBF 0 14.7 2947 -100 1740 24 28.1 0.1 -5.6 239 7.8 23.6 37.9 109 +00070922.MHE 0 16.8 3556 -34 1430 6 40.7 0.1 -6.1 258 6.7 18.8 41.5 109 +00070922.GGW 0 13.3 2242 -12 1039 31 46.6 0.5 -11.4 226 7.4 18.7 71.4 74 +00070901.LWT 0 8.7 874 -65 1998 38 58.4 0.0 -11.5 232 8.1 32.4 92.6 236 +00070805.LVN 0 18.2 2722 -69 530 388 37.6 5.8 -9.2 261 8.1 22.9 53.3 407 +00070803.JDN 0 7.6 57 -220 2275 33 69.9 0.0 -11.7 240 7.8 39.2 84.5 167 +00070601.CUT 0 11.7 2058 -14 1543 37 55.5 0.3 -9.9 245 8.5 28.5 78.8 136 +00070523.MCK 0 16.4 3979 -55 1631 151 45.4 1.6 -6.8 254 8.1 24.5 59.5 231 +00070521.RAP 0 14.5 3135 -2 1289 15 44.0 0.3 -10.0 233 8.0 19.5 68.5 93 +00070501.2WX 0 11.2 1574 -93 1339 -29 47.6 -0.2 -12.4 230 8.6 28.2 78.4 64 +00070421.JDN 0 8.1 1033 -47 1927 -17 41.2 0.0 -15.0 209 7.9 26.2 68.3 49 +00070302.GGW 0 10.6 1484 -86 1685 121 67.7 0.4 -12.6 252 7.9 36.1 78.0 267 +00070222.FOD 0 17.4 3585 -43 1097 53 23.7 0.0 -9.5 292 7.5 16.4 31.4 91 +00070201.ABR 0 14.2 3411 -108 1790 100 24.5 0.0 -10.0 259 8.3 16.6 39.9 145 +00070123.ELO 0 13.3 2835 -49 1339 117 57.8 2.1 -13.1 291 7.7 31.9 66.7 228 +00070122.ABI 0 13.9 1505 -15 1776 40 26.6 0.1 -5.4 261 5.7 21.4 25.5 120 +00070100.JLN 0 15.5 2255 -3 786 81 43.6 1.3 -7.6 313 5.9 25.5 56.4 208 +00062923.ELM 0 8.8 332 -11 1098 19 33.4 0.0 -16.5 253 6.2 19.9 82.5 60 +00062923.D07 0 9.6 1600 -26 1649 30 42.4 0.1 -15.7 295 7.7 30.2 50.5 90 +00062901.LAM 0 11.8 506 -57 1728 28 25.5 0.0 -6.5 268 6.3 18.5 25.2 126 +00062519.AIO 0 14.7 2632 -77 1269 122 38.0 1.2 -10.6 279 7.3 29.0 32.0 250 +00062402.RCA 0 11.5 1507 -76 1200 0 40.3 0.0 -11.0 273 7.9 29.4 67.6 159 +00062322.SDA 0 16.8 4294 -9 1398 56 28.6 0.7 -9.2 284 7.3 21.1 46.7 160 +00061522.OKV 0 14.5 746 -31 749 130 32.3 0.5 -8.8 240 6.0 35.1 29.5 198 +00061323.P28 0 14.3 3106 -53 1734 60 41.3 0.3 -10.0 260 8.0 15.7 31.7 91 +00061122.DFS 0 13.5 3143 -11 1597 67 28.6 0.4 -8.2 251 7.7 28.8 45.0 62 +00060400.GLD 0 9.0 1430 -74 2560 51 35.6 0.0 -10.7 313 8.7 29.0 38.3 146 +00060221.CEF 0 12.1 326 -141 1452 156 38.5 0.1 -9.8 279 6.6 44.9 47.0 277 +00052701.SZL 0 13.7 1477 -23 1157 198 50.0 2.1 -9.7 244 6.7 38.9 69.4 232 +00052501.PPA 0 15.2 3731 -83 1597 78 46.6 0.7 -8.0 249 8.4 33.0 60.7 288 +00052501.ADK 0 16.3 4569 -134 1861 108 40.3 0.2 -7.8 255 8.7 36.4 49.3 291 +00052219.AVC 0 10.1 628 -1 1000 2 52.8 0.0 -13.8 256 5.9 28.0 59.1 95 +00052021.VPC 0 13.0 805 -6 1196 15 39.2 0.1 -9.8 231 6.1 19.7 47.6 87 +00050922.IRS 0 12.0 729 -2 928 68 49.6 0.4 -13.6 230 6.9 46.6 41.5 178 +01041105.JCT 0 14.1 1545 -229 832 346 71.9 0.0 -9.7 230 8.5 44.0 97.0 386 +01041004.IND 0 11.4 1318 -107 1240 185 57.8 1.1 -13.8 292 7.2 35.6 68.3 216 +01040321.UNO 0 12.3 1279 -42 722 107 57.2 1.3 -13.7 270 7.4 36.3 60.7 225 +01040300.BFF 0 5.0 0 -9999 1708 161 63.5 0.0 -17.8 241 7.5 37.7 81.7 433 +01032404.ABI 0 10.8 1700 -61 813 65 27.5 0.5 -18.2 289 8.0 17.4 46.6 180 +01031202.FTW 0 11.7 1341 -9 490 161 53.1 1.9 -17.9 240 7.3 37.5 47.3 201 +01031123.BWD 0 10.1 846 -18 912 76 47.4 0.5 -17.4 245 7.7 31.1 69.7 133 +01022500.TOP 0 7.3 153 -15 715 148 78.6 0.2 -21.3 203 6.8 32.9 92.4 170 +00110907.GZH 0 15.4 1005 -3 768 172 47.3 1.4 -7.8 213 6.0 36.2 52.6 220 +00110906.EET 0 14.9 674 -3 539 277 52.5 1.6 -8.6 217 5.7 41.9 58.8 327 +00110121.CID 0 12.2 1537 -17 1087 164 40.8 1.6 -12.1 210 6.0 36.7 41.3 225 +00102323.ELP 0 9.8 1432 -3 1298 24 68.0 0.2 -14.2 201 7.5 36.8 65.9 132 +00102212.MWL 0 13.4 1016 -7 525 152 31.3 0.8 -11.5 208 6.2 22.4 43.6 149 +00101423.INK 0 8.5 757 -27 2381 63 29.5 0.0 -10.8 243 7.2 27.3 48.1 91 +00101408.CNM 0 11.5 1524 -124 1147 79 34.2 0.3 -10.4 246 7.2 29.4 55.6 119 +00101400.SLN 0 11.5 577 -49 879 26 58.0 0.1 -11.3 234 5.7 28.9 63.6 76 +00100401.GCK 0 8.5 341 -281 1869 -16 53.4 0.0 -11.5 263 8.5 38.0 70.8 124 +00090523.GTF 0 7.6 277 -43 1393 8 65.8 0.0 -15.8 219 7.4 34.7 93.3 112 +00090300.ISN 0 10.7 654 -10 754 62 42.1 0.3 -13.8 225 6.8 27.3 72.5 95 +00090120.SLC 0 5.7 78 -67 2129 29 41.1 0.0 -14.3 198 7.4 15.4 53.6 53 +00081820.BUY 0 15.3 1702 -37 1351 58 34.7 0.4 -8.2 275 6.5 38.7 13.2 134 +00081723.IND 0 19.2 4115 -13 791 158 47.3 5.1 -7.9 275 6.9 37.5 49.8 224 +00081720.LEX 0 16.6 2579 -6 1129 81 36.5 1.1 -6.7 284 5.9 24.9 42.3 141 +00081420.AIT 0 16.2 2299 -120 690 282 52.2 3.0 -9.8 267 8.0 37.9 69.5 368 +00080623.CDJ 0 14.7 1350 -119 1250 43 35.9 0.1 -6.8 272 6.3 24.5 54.6 88 +00080601.HNR 0 18.6 4073 -16 990 54 37.6 1.4 -7.0 271 7.3 25.9 55.8 92 +00080522.AIA 0 7.8 312 -3 2875 0 43.4 0.0 -8.3 272 7.7 22.1 49.4 52 +00080502.PIR 0 14.4 2629 -128 1844 202 48.0 0.3 -7.4 270 7.5 30.4 64.1 318 +00080502.ANW 0 11.5 1035 -228 2157 138 37.9 0.0 -6.3 276 7.6 25.6 46.8 227 +00080222.FKL 0 13.7 1168 -22 892 104 26.2 0.5 -9.1 253 5.9 27.0 55.7 145 +00080202.LWT 0 8.3 700 -130 2701 50 46.5 0.0 -8.4 286 8.6 19.4 78.7 94 +00080202.GGW 0 10.8 1193 -207 1955 94 51.1 0.0 -9.6 293 8.0 25.1 71.3 230 +00072622.AIO 0 16.7 3711 -2 964 67 44.8 1.9 -10.2 324 7.6 29.1 43.1 186 +00072501.HON 0 13.9 2463 -99 1314 85 29.5 0.5 -11.1 271 8.3 13.2 40.3 91 +01060123.LWC 0 11.2 1268 -25 1421 113 62.6 0.8 -13.2 305 6.4 37.6 79.8 249 +01060122.P28 0 11.4 1141 -69 1552 80 51.2 0.3 -9.7 308 6.6 21.4 62.5 156 +01053100.CVN 0 8.5 1309 -86 2195 -18 45.9 0.0 -10.8 289 8.3 24.1 38.5 138 +01052801.END 0 13.1 2369 -85 1258 150 47.1 1.6 -12.5 280 8.2 39.8 67.4 370 +01052400.OKF 0 7.6 314 -55 2200 85 59.2 0.0 -15.3 298 7.1 43.3 63.3 244 +01052022.GRK 0 15.6 2852 -21 1408 32 40.1 0.4 -7.9 242 6.8 30.2 75.1 60 +01051801.RUL 0 11.1 1624 -134 2428 24 25.8 0.0 -8.5 258 8.1 18.9 46.6 76 +01051623.BIE 0 13.4 3208 -41 1905 35 30.0 0.1 -10.4 274 7.5 20.5 32.1 103 +01051218.DDH 0 8.9 325 -25 1493 21 36.4 0.0 -16.2 229 6.4 25.9 46.8 102 +01051000.OLU 0 9.6 2423 -73 2081 70 30.6 0.0 -15.8 265 8.8 23.7 36.8 157 +01050823.GBD 0 8.1 447 -90 1828 55 44.5 0.0 -15.8 323 7.4 25.4 50.6 207 +01050701.COT 0 15.9 3113 -16 1068 4 34.1 0.1 -12.2 267 8.1 10.5 56.5 73 +01050700.ADS 0 14.6 2915 -5 1038 115 37.4 2.0 -13.7 248 7.3 23.1 63.5 148 +01050623.BMQ 0 16.4 4217 -12 955 48 38.2 1.3 -13.0 257 7.5 27.3 64.9 143 +01050501.COT 0 14.3 1453 -9 1075 113 48.9 1.2 -9.9 226 7.0 33.1 73.5 169 +01050200.AUD 0 10.0 1544 -80 1896 85 31.2 0.1 -14.7 266 8.2 22.1 40.9 170 +01050101.SLN 0 10.5 1695 -66 1383 122 37.1 0.7 -16.7 295 8.0 24.3 61.4 188 +01050100.P28 0 9.9 1422 -94 1553 70 45.7 0.2 -15.7 309 7.8 24.3 54.0 188 +01042317.STE 0 9.5 775 -5 970 86 55.4 0.6 -18.0 210 6.8 38.9 110.9 170 +01042304.JCT 0 14.1 2210 -11 659 190 53.5 3.8 -11.8 248 7.8 31.4 55.1 214 +01042222.MWL 0 11.8 1193 -8 1373 116 46.2 0.7 -10.2 212 6.2 33.4 58.0 105 +01042123.PIA 0 12.1 1857 -13 1175 79 41.0 0.8 -13.4 257 7.5 25.7 51.8 94 +01042123.CDS 0 10.3 2000 -70 2105 81 55.8 0.0 -11.8 230 7.9 27.2 70.8 141 +01042102.SLN 0 11.5 2072 -206 1218 280 50.2 0.0 -15.1 239 8.7 44.2 73.5 374 +01041702.SJT 0 13.0 1793 -30 989 96 38.8 1.1 -10.9 296 7.0 26.3 65.2 260 +01041700.LBB 0 8.1 406 -65 1861 42 46.3 0.0 -12.1 288 7.1 32.9 80.6 256 +01041500.ABI 0 12.6 2222 -121 1474 76 59.9 0.5 -13.2 249 8.7 28.8 78.5 130 +01041423.ADM 0 14.2 1613 -86 524 248 67.7 3.1 -14.2 254 8.6 38.9 90.8 310 +01041422.PCS 0 13.6 2872 -90 1455 5 57.7 0.1 -10.8 245 8.2 21.5 77.6 85 +01041422.EMP 0 8.9 652 -15 1486 57 59.4 0.2 -16.8 254 7.2 31.9 84.7 218 +01041421.HBR 0 13.9 2647 -29 786 167 70.6 4.4 -14.3 255 8.2 39.1 91.1 239 +03050100.BRL 0 12.7 2707 -10 1047 121 47.3 2.5 -15.8 247 8.2 27.0 50.9 270 +03043021.AIA 0 12.3 2247 -53 863 158 49.0 2.8 -15.7 243 8.1 37.1 49.5 276 +03043003.LIC 0 8.7 1228 -82 574 264 52.2 2.2 -15.9 216 8.8 43.9 59.2 676 +03042900.APA 0 6.3 1056 -56 1639 56 35.9 0.1 -15.6 239 8.3 10.6 65.7 63 +03042600.HRL 0 12.4 1634 -219 1994 5 43.7 0.0 -11.1 286 8.3 25.0 72.5 36 +03042522.FTY 0 11.2 645 -12 811 160 61.6 1.0 -14.4 253 6.7 33.8 66.6 259 +03042520.ANB 0 11.5 783 -1 777 164 64.0 1.3 -14.0 259 6.2 36.4 64.7 319 +03042400.SEP 0 14.4 2485 -6 558 393 62.4 9.8 -14.6 238 7.9 39.1 92.6 485 +03042022.MKL 0 12.5 1017 -22 789 92 57.6 0.9 -14.3 251 6.9 29.0 70.2 188 +03042019.MEM 0 13.1 1682 -6 857 78 50.6 1.1 -14.2 252 7.3 29.0 57.0 148 +03041922.P#0 0 11.7 1623 -17 730 127 72.6 2.1 -19.4 223 7.9 35.5 102.9 148 +03041920.END 0 10.6 1171 -12 629 144 57.4 1.6 -21.0 215 8.4 39.0 99.4 219 +03041907.FDR 0 12.6 1046 -418 613 365 65.8 0.0 -13.9 207 8.9 40.5 101.8 352 +03040720.HOU 0 16.5 2215 -1 373 67 57.9 1.4 -11.4 231 7.6 30.3 77.2 191 +03040718.BPT 0 13.8 933 -139 741 16 59.0 0.1 -12.1 226 7.4 26.5 91.0 110 +03040717.LFT 0 14.1 780 -168 559 29 50.5 0.0 -12.0 233 7.3 29.3 84.8 74 +03040605.C12 0 11.3 655 -128 639 328 69.4 1.0 -14.6 250 7.3 45.3 111.0 697 +03040601.C11 0 12.1 2056 -4 832 109 75.1 2.2 -15.3 251 7.6 26.4 93.3 198 +03040400.LW1 0 13.3 2761 -1 682 153 54.3 3.8 -15.1 242 7.6 32.9 52.2 224 +03040322.HBR 0 9.5 1315 -38 1655 57 42.4 0.2 -14.8 235 7.5 33.0 47.0 130 +03032821.MBS 0 7.7 95 -1 1423 199 68.1 0.1 -17.6 223 6.6 48.9 65.7 252 +03032819.AZO 0 8.9 146 -2 830 200 60.9 0.3 -17.3 225 6.7 54.5 64.3 255 +03031722.SPS 0 10.7 981 -38 1183 127 34.3 0.6 -15.4 236 7.3 19.3 95.8 139 +03031720.SPS 0 10.2 947 -44 1140 35 24.3 0.0 -16.7 216 7.4 15.4 100.9 42 +03031221.PBI 0 14.2 1790 -2 1215 21 36.5 0.2 -12.1 258 7.7 2.8 67.6 -23 +03031218.FPR 0 15.8 2760 -2 892 -28 38.6 -0.5 -14.1 256 8.0 11.8 71.6 86 +01062102.ICT 0 13.9 1917 -38 976 89 37.8 1.1 -11.3 291 7.3 26.8 48.8 202 +01061623.JMS 0 8.9 600 -4 1096 41 40.5 0.2 -18.1 283 7.1 25.4 84.9 82 +01061122.RGK 0 14.3 3269 -77 1618 201 51.8 1.8 -10.9 265 8.4 35.2 56.2 397 +01060502.CSM 0 15.8 3992 -79 1412 107 34.9 1.2 -8.4 251 8.1 28.3 40.7 227 +01060501.LHX 0 8.3 615 -248 1957 94 44.0 0.0 -11.2 243 9.0 29.0 49.3 127 +03062823.RST 0 8.8 203 -71 1471 26 40.8 0.0 -12.1 287 4.8 15.4 60.6 57 +03062822.BH4 0 6.7 253 -82 2374 15 53.7 0.0 -12.2 288 8.0 39.8 64.9 352 +03062820.WSC 0 9.5 432 -25 1288 24 38.2 0.1 -13.2 292 5.0 20.7 57.7 45 +03062800.C07 0 9.3 1323 -51 2202 29 36.5 0.0 -9.3 311 7.4 12.9 41.7 81 +03062800.8V7 0 10.5 2208 -13 2023 82 42.3 0.0 -8.2 320 7.8 44.3 44.0 293 +03062722.8V7 0 11.1 2543 -6 1821 66 38.6 0.2 -8.4 315 7.5 40.0 47.0 258 +03062721.C07 0 8.9 1146 -29 2232 32 35.4 0.0 -9.2 306 7.2 11.7 50.1 74 +03062401.CYS 0 10.5 1054 -23 891 146 67.4 1.5 -8.4 210 6.6 44.6 77.5 258 +03062022.ROW 0 10.0 1448 -1 2438 18 41.2 0.0 -8.3 220 7.9 29.6 51.3 74 +03062022.CVS 0 12.0 1680 -21 1220 96 32.9 0.7 -8.5 224 7.2 20.3 41.0 110 +03062020.CVS 0 12.3 2087 -2 1100 14 22.8 0.0 -9.4 233 7.4 10.8 35.9 48 +03061501.CNM 0 11.3 2677 -1 2178 -48 31.4 0.0 -11.2 338 8.5 17.4 38.2 109 +03061423.HOB 0 9.6 1525 -68 2132 7 32.6 0.0 -11.5 330 8.5 14.0 32.3 24 +03061223.C11 0 20.9 5150 -8 501 190 32.5 5.3 -8.9 269 8.0 41.4 58.8 339 +03061221.AGC 0 13.1 691 -9 1032 158 35.1 0.6 -8.8 227 5.9 34.2 44.2 256 +03060401.TCC 0 11.4 1746 -91 1622 -15 59.6 -0.1 -9.6 288 8.2 44.8 48.7 398 +03060322.LBB 0 13.6 2239 -128 1199 80 45.2 0.5 -9.1 302 7.9 31.8 57.3 316 +03060302.LRD 0 17.3 3023 -81 1418 -4 35.4 0.0 -5.0 285 7.3 27.3 67.7 -12 +03053121.ILM 0 13.5 1237 -102 1265 394 58.4 2.3 -10.4 275 6.3 47.7 74.8 576 +03052001.ADM 0 16.8 3033 -19 1155 81 33.3 1.2 -8.4 288 7.5 14.5 61.0 188 +03051922.FSI 0 15.9 2088 -80 836 131 37.4 1.4 -8.3 246 8.1 40.1 50.7 385 +03051409.C12 0 13.9 2056 -415 1151 505 44.5 0.0 -12.7 290 9.5 25.4 80.3 466 +03051406.LW1 0 15.8 3351 -219 819 259 50.4 0.0 -11.8 274 8.3 12.9 74.5 238 +03051401.C11 0 13.9 3239 -178 1774 132 58.3 0.1 -9.9 286 8.2 22.1 60.4 192 +03051322.CDS 0 12.4 3323 -92 2274 79 49.1 0.0 -10.1 280 8.6 18.1 68.8 98 +03051223.MRF 0 11.6 1914 -2 1612 41 42.7 0.2 -6.0 279 6.7 33.9 49.2 174 +03051019.MLC 0 14.5 849 -221 615 158 58.7 0.0 -8.7 240 7.6 34.0 74.3 199 +03051017.P#Q 0 16.5 2801 -34 619 97 68.4 2.7 -9.2 235 7.2 32.3 77.8 168 +03051000.P#J 0 16.2 3929 -21 888 74 55.8 2.7 -12.5 247 7.6 33.6 64.7 227 +03050922.LEX 0 15.5 2304 -3 715 119 55.3 2.5 -9.5 278 7.4 32.8 69.7 185 +03050921.COU 0 16.1 4338 -12 941 67 45.4 2.2 -11.8 246 7.4 35.8 73.5 264 +03050920.SDF 0 15.2 2300 -15 871 88 52.2 1.8 -10.2 268 7.2 36.6 70.7 247 +03050520.MKL 0 15.8 2332 -17 581 247 71.6 5.8 -11.9 263 7.3 40.2 88.1 300 +03050223.BMX 0 15.4 3487 -10 686 61 44.2 1.6 -13.2 283 6.8 21.9 38.7 114 +03050221.HSV 0 13.0 2237 -40 946 139 42.3 2.2 -13.8 264 7.0 27.8 33.8 201 +03050221.ABL 0 13.6 3056 -5 1063 81 40.9 1.6 -14.7 280 7.2 27.0 27.0 130 +03050219.SJT 0 15.1 4252 -2 1189 17 38.9 0.4 -12.5 277 8.1 4.7 61.7 18 +03050219.ABL 0 12.9 2572 -28 1072 45 27.2 0.5 -13.7 261 6.7 22.6 36.0 82 +03050218.MSL 0 13.0 2367 -24 912 19 25.5 0.2 -14.5 257 7.4 24.2 40.8 60 +03050201.ACT 0 13.6 2339 -88 1301 -44 31.1 -0.3 -11.9 280 8.3 21.3 53.8 -77 +03050102.END 0 14.0 3853 -58 1033 227 43.6 5.8 -13.5 250 7.4 27.5 43.5 247 +03071221.AVL 0 11.9 710 -2 1196 56 37.5 0.2 -8.5 266 5.6 31.7 43.3 103 +03071201.FOE 0 16.7 3598 -41 1289 -96 59.4 -2.4 -10.2 313 7.9 33.9 54.8 89 +03071200.FOE 0 16.2 3683 -11 1441 -16 63.8 -0.3 -11.0 315 7.7 31.9 59.2 109 +03071123.P#H 0 12.6 927 -26 1632 97 59.9 0.3 -9.9 322 7.2 45.3 55.0 319 +03070904.PHP 0 14.6 2161 -292 1066 549 72.4 0.0 -8.6 260 8.8 53.5 55.7 683 +03070900.BH3 0 8.3 1108 -106 2627 277 55.8 0.0 -7.9 250 8.4 55.7 68.2 568 +03070723.LVS 0 8.8 850 -179 2135 85 20.0 0.0 -6.4 329 8.7 24.3 27.9 305 +03070720.DSM 0 18.0 4261 -35 1012 20 39.2 0.6 -9.9 262 8.0 13.2 34.7 79 +03070719.LVS 0 9.9 1337 -68 1800 12 22.3 0.0 -7.2 336 8.0 27.0 21.0 98 +03070600.VTN 0 11.6 1572 -201 1584 157 52.8 0.0 -9.5 273 8.2 30.3 50.1 293 +03070521.RAP 0 8.7 803 -208 2327 67 22.6 0.0 -11.2 272 8.5 6.7 33.0 46 +03070521.P#7 0 10.3 1147 -137 2084 84 43.4 0.0 -10.3 249 8.1 22.9 55.2 239 +03070517.BH3 0 8.9 1171 -147 2263 -14 27.2 0.0 -12.5 293 9.1 15.8 39.6 51 +03070305.GDV 0 9.1 634 -206 1972 120 22.6 0.0 -13.9 250 8.7 30.3 58.1 255 +03063018.AUG 0 11.8 1327 -56 1152 60 42.9 0.5 -12.3 267 5.3 24.4 72.0 118 +03081800.BH5 0 9.0 725 -5 2392 -33 27.4 0.0 -9.3 180 7.6 12.2 31.3 76 +03081322.XRW 0 16.6 1031 -16 519 88 21.6 0.0 -6.2 187 5.5 23.7 39.1 164 +03081202.SEP 0 12.7 373 -104 1300 -113 55.9 -0.2 -8.4 345 6.8 38.0 68.0 -12 +03081200.FWD 0 12.2 1050 -51 2135 -30 50.2 0.0 -8.8 339 6.7 35.0 52.7 68 +03081023.P#9 0 13.9 1702 0 1195 30 41.7 0.3 -9.2 346 6.8 25.8 56.8 104 +03080902.P#C 0 15.5 3216 -71 1472 8 27.4 0.1 -6.4 277 7.9 17.3 40.8 199 +03080900.MIB 0 15.0 3325 -48 1477 39 33.2 0.4 -9.0 291 7.7 10.7 43.9 102 +03080900.P#C 0 14.4 3127 -1 1826 10 25.0 0.0 -5.8 262 7.5 12.2 42.3 64 +03080622.GLD 0 12.9 3132 -2 2338 21 28.1 0.0 -7.1 306 8.2 14.7 32.7 115 +03080601.CNU 0 15.8 2262 -28 1629 -18 34.6 -0.1 -5.1 317 6.6 25.1 42.1 49 +03080600.SUX 0 15.5 1945 -3 996 54 38.2 0.7 -8.6 321 7.0 35.9 44.6 171 +03080521.TOP 0 16.0 2857 -24 1592 -7 30.8 0.0 -6.8 308 6.3 19.6 40.9 101 +03080520.DAN 0 15.0 2224 -8 858 8 18.6 0.0 -10.1 275 6.4 27.6 30.4 121 +03080422.P#R 0 15.1 1771 -64 1131 59 51.1 0.7 -8.5 326 6.5 23.7 72.7 144 +03080401.BVX 0 16.9 2856 -38 1072 96 33.8 1.4 -8.7 308 6.7 18.2 47.9 100 +03080202.LUS 0 9.3 520 -170 1828 -21 47.7 0.0 -8.2 291 7.9 30.7 60.7 11 +03080123.CRL 0 13.5 2544 -8 1131 18 35.3 0.2 -12.9 299 7.9 26.6 36.1 109 +03080103.MCW 0 11.0 914 -111 1515 8 24.1 0.0 -12.2 281 7.0 26.6 47.8 60 +03073123.C31 0 8.6 251 -238 2988 79 50.4 0.0 -8.0 311 8.0 29.8 74.4 268 +03073120.TVL 0 10.6 1275 -24 1488 33 34.5 0.1 -7.4 90 7.8 32.3 17.1 170 +03072700.IWD 0 15.1 1598 -19 1386 149 42.6 1.0 -6.1 276 5.9 27.7 60.4 150 +03071802.BH1 0 13.9 2073 -132 1543 52 64.4 0.2 -6.9 291 7.8 47.0 77.9 171 +03071721.RAP 0 14.6 3713 -127 1972 107 39.2 0.0 -6.2 280 8.5 31.5 54.8 181 +03071320.MSL 0 16.4 2839 -21 1060 37 23.4 0.0 -9.3 310 7.1 4.1 36.8 35 +03071320.DIK 0 9.2 2113 -26 3189 -19 27.9 0.0 -9.3 266 9.0 11.0 36.6 31 +04040721.P#U 0 11.2 1509 -10 1060 103 47.1 1.2 -15.7 268 6.4 35.8 60.8 191 +04040702.SPS 0 8.6 230 -53 980 110 36.0 0.2 -17.3 236 6.3 19.0 53.3 110 +04040700.FTW 0 10.4 641 -8 948 43 57.7 0.3 -14.3 228 6.4 22.9 60.1 83 +04040422.LRD 0 13.8 2148 -1 827 171 49.4 3.0 -12.9 244 7.0 31.5 38.8 217 +04040421.ALI 0 13.2 1124 -3 718 10 40.8 0.1 -13.2 238 7.0 18.0 35.9 100 +04032701.DHT 0 9.5 1004 -128 1142 153 30.2 0.3 -13.4 233 8.2 31.2 63.3 235 +04032623.RAP 0 8.7 1651 -52 1568 172 42.5 0.9 -15.5 205 8.0 26.0 46.8 264 +04031802.FSM 0 8.0 442 -99 1939 211 48.0 0.0 -17.1 278 7.5 37.8 72.5 338 +04031800.P#P 0 9.4 1357 -30 1585 127 45.0 0.5 -17.4 288 7.7 34.4 66.4 269 +04030121.ORD 0 7.2 534 -1 908 208 58.9 1.1 -23.3 222 6.6 37.3 72.6 297 +04030120.RFD 0 6.8 505 -7 892 172 55.3 0.8 -24.3 220 6.8 34.8 71.1 256 +04022416.MCO 0 13.1 534 -37 687 121 47.0 0.5 -10.8 255 5.0 28.8 81.9 156 +04022407.G#5 0 10.5 962 -124 801 -16 47.4 -0.1 -18.2 218 7.7 31.4 83.7 14 +04022316.MSY 0 11.3 0 -9999 417 436 51.3 0.0 -11.2 240 6.1 44.9 86.2 531 +04020601.BTR 0 11.7 57 -172 540 186 69.9 0.0 -13.3 214 7.0 48.1 87.1 199 +04020514.LFT 0 11.1 165 -244 1109 583 49.0 0.0 -11.7 217 6.5 46.0 63.5 611 +04020512.LCH 0 13.6 1421 -64 497 282 49.1 3.0 -12.5 222 6.8 41.7 68.1 319 +04011921.VRB 0 10.3 196 -20 878 -16 82.2 0.0 -14.0 242 5.1 46.9 123.3 207 +03112718.RUE 0 10.5 681 0 396 4 92.3 0.0 -20.1 238 7.0 35.8 100.8 153 +03110923.SAC 0 6.9 156 -14 892 38 24.7 0.0 -25.3 234 7.5 14.4 91.8 77 +03102818.CTY 0 16.5 1074 -53 594 181 37.6 1.2 -7.8 217 6.3 23.6 51.5 193 +03100822.VAD 0 14.1 1355 -7 765 -4 27.1 0.0 -11.2 277 6.4 13.9 52.0 68 +03092718.CBE 0 11.6 969 -2 1256 109 40.4 0.5 -12.3 213 6.1 33.1 58.2 137 +03092620.UIN 0 12.7 1139 -3 844 177 50.2 1.7 -14.6 266 7.9 42.7 77.1 266 +03092619.BRL 0 11.1 906 -34 824 125 50.2 1.0 -14.9 256 6.9 40.9 76.6 149 +03091200.MRF 0 9.8 747 -2 1645 9 36.3 0.0 -6.8 276 6.2 25.5 49.1 163 +03090900.MAF 0 9.9 1214 -1 2565 13 32.3 0.0 -8.4 313 7.4 22.4 35.6 163 +03083123.HUF 0 14.8 27 -163 471 268 39.8 0.0 -6.8 243 6.3 41.6 43.2 340 +03082601.P#4 0 12.9 980 -231 1606 140 42.5 0.0 -9.4 277 7.1 39.4 44.3 283 +03082600.ABR 0 14.2 3471 -76 1925 104 37.8 0.1 -11.4 289 8.6 27.8 43.9 143 +03082221.LOL 0 9.6 944 -94 1467 89 64.9 0.3 -12.3 188 8.3 46.4 77.0 299 +03082119.APX 0 14.4 2077 -120 1359 80 36.1 0.3 -8.3 255 7.1 34.1 35.4 132 +03082100.DLH 0 16.1 2503 -11 1009 166 39.5 2.7 -8.1 226 6.2 24.3 46.3 201 +04051501.PUB 0 3.9 204 -85 2585 153 55.2 0.0 -18.2 268 8.8 42.0 78.8 355 +04051423.COS 0 4.6 230 -87 1664 52 57.1 0.0 -18.0 274 8.2 45.2 68.4 179 +04051300.HBR 0 14.0 4148 -28 1710 172 41.2 1.4 -11.1 244 7.8 44.0 46.5 333 +04051100.LUS 0 8.3 917 -69 1429 204 53.5 0.8 -11.5 237 7.4 28.1 44.2 323 +04050923.CVS 0 5.9 554 -61 3040 -32 23.7 0.0 -12.6 309 9.6 17.1 15.5 78 +04050921.STC 0 9.9 1302 -52 1737 185 49.7 0.5 -14.2 264 7.5 46.1 49.8 400 +04050900.P#A 0 13.8 2438 -42 1008 193 29.0 2.3 -12.7 278 7.7 19.9 36.2 251 +04050822.BH3 0 5.3 996 -6 3054 49 48.0 0.0 -15.0 280 9.6 8.9 60.8 58 +04050522.RIC 0 8.3 824 -38 1493 133 43.8 0.4 -20.4 310 7.1 34.9 60.9 251 +04050101.FWD 0 13.9 2471 -39 907 158 44.9 2.9 -14.8 225 8.3 23.0 58.2 185 +04043021.C12 0 13.3 2483 -8 1029 37 45.1 0.7 -14.1 236 7.9 32.8 46.0 48 +04043020.DYS 0 14.1 2950 -10 638 71 52.3 1.8 -14.3 236 7.8 34.1 51.0 143 +04043018.ABI 0 12.0 2372 -1 1211 -3 32.6 0.0 -13.6 230 7.7 22.8 40.3 -22 +04042920.MLU 0 12.9 972 0 744 72 46.0 0.5 -14.5 232 6.6 29.2 45.8 176 +04042821.G#2 0 10.1 747 -3 1175 139 56.7 0.8 -14.7 252 7.4 32.3 53.8 179 +04042521.CDS 0 7.1 679 -5 2042 20 45.4 0.0 -17.7 276 7.7 27.7 76.8 88 +04042300.SGF 0 9.8 113 -134 794 263 69.4 0.1 -15.2 267 7.5 51.1 79.0 572 +04042300.P#P 0 14.6 2114 -9 448 155 49.9 2.7 -13.6 245 7.2 26.3 46.7 258 +04042223.C12 0 12.6 1615 -11 1173 56 54.8 0.7 -10.8 266 6.6 36.5 68.7 191 +04042222.UMN 0 10.5 412 -29 663 220 60.2 0.9 -17.5 254 8.2 45.7 67.6 357 +04042221.C34 0 11.2 1504 -22 1170 72 53.8 0.8 -15.5 265 7.8 38.9 55.3 252 +04042200.ADM 0 11.7 1347 -25 1310 194 51.9 1.6 -13.2 269 6.8 28.4 68.1 339 +04042122.C12 0 11.5 1550 -3 1449 83 53.3 0.6 -13.2 261 6.6 30.3 65.8 168 +04041921.HOB 0 11.3 2173 -1 1395 86 53.9 1.0 -10.9 235 6.7 32.7 83.0 143 +04041801.MFD 0 10.8 1224 -65 1060 185 23.7 0.0 -16.5 288 8.0 29.7 50.0 245 +04041723.MFD 0 11.9 2519 -15 1046 104 26.5 1.1 -15.5 303 7.2 29.2 37.6 184 +04041105.MFE 0 15.8 2222 -37 402 26 39.9 0.4 -11.6 248 7.5 2.1 69.3 23 +04041019.ILM 0 9.2 180 -45 1165 111 41.2 0.1 -16.1 267 6.0 29.7 69.5 345 +04041001.PRX 0 8.8 516 -75 1780 210 42.3 0.1 -14.1 270 6.7 37.6 59.1 314 +04040818.DAB 0 13.2 1058 -19 810 73 56.2 0.7 -15.8 264 7.7 33.6 94.9 186 +04040815.DHN 0 11.9 877 -2 522 78 53.9 0.6 -15.8 257 6.5 30.9 87.6 111 +04071305.CHE 0 17.6 3151 -107 771 181 49.7 2.9 -8.9 301 7.9 29.7 60.2 300 +04070104.HBR 0 15.7 1988 -45 801 174 24.0 0.0 -8.2 259 7.0 25.9 23.7 276 +04062402.FNT 0 10.0 608 -67 1046 219 50.4 1.0 -15.3 260 6.5 32.1 72.4 270 +04062222.BIS 0 7.2 504 -14 1518 9 56.3 0.0 -18.7 301 6.3 28.7 75.6 88 +04062023.DHT 0 8.4 905 -127 2633 107 47.8 0.0 -9.3 270 8.8 36.3 67.8 192 +04061902.G#1 0 13.2 1631 -27 1122 144 35.1 1.2 -8.6 284 7.3 37.4 58.3 408 +04061900.HDN 0 6.4 316 -26 1668 -40 51.4 0.0 -13.3 257 8.3 36.5 73.3 29 +04061820.FAM 0 15.9 1842 -13 923 65 31.0 0.6 -7.0 271 5.7 23.9 35.7 131 +04061800.LHX 0 12.7 2059 -86 777 206 47.3 2.5 -11.2 235 8.4 37.4 49.6 651 +04052700.CHE 0 8.9 347 -4 1255 145 31.1 0.2 -14.7 268 6.1 31.0 44.9 228 +04052623.TYS 0 14.7 1654 -44 919 199 50.1 2.8 -9.7 275 5.9 37.8 71.9 255 +04052623.OKC 0 15.9 3047 -69 1198 124 56.8 2.5 -7.9 261 6.8 24.4 82.9 79 +04052622.FSD 0 9.4 835 -34 1187 143 35.4 0.6 -17.3 267 7.3 33.1 47.2 271 +04052621.CSV 0 14.4 1608 -15 870 176 59.8 2.8 -9.3 268 6.2 35.9 58.7 237 +04052621.C33 0 13.6 2405 -23 1847 104 55.5 0.4 -9.6 256 7.5 30.4 80.9 72 +04052603.CAI 0 15.4 1463 -14 609 129 47.0 1.5 -11.0 277 7.2 31.6 59.9 153 +04052402.P#7 0 7.8 400 -213 1358 246 41.2 0.0 -15.5 247 8.2 35.3 62.4 412 +04052400.STL 0 16.1 3087 -3 604 162 45.4 3.8 -12.7 253 8.0 28.6 58.7 195 +04052400.CDR 0 5.8 117 -187 2181 178 56.7 0.0 -14.5 256 8.0 30.8 66.1 338 +04052323.BGM 0 14.6 2244 0 781 156 41.1 2.4 -11.9 272 7.8 30.1 44.7 249 +04052320.PIN 0 12.0 1300 -3 1376 120 33.7 0.6 -11.8 267 6.7 36.9 31.3 199 +04052300.ELM 0 12.4 1089 -41 1163 226 43.8 1.5 -9.7 281 5.7 46.2 46.0 359 +04052201.G#1 0 12.3 2404 -84 1771 261 33.8 0.6 -8.2 246 7.9 36.9 50.5 385 +04052201.SNY 0 7.0 484 -214 2287 78 62.8 0.0 -12.7 227 9.0 42.4 81.2 214 +04052123.HYS 0 12.7 3460 -27 2109 75 39.7 0.0 -10.8 236 8.6 29.0 45.1 157 +04052100.FKL 0 14.7 2440 -9 772 269 42.7 4.7 -10.6 299 6.4 28.6 49.2 346 +04052100.DEN 0 9.0 1781 -3 1934 76 49.3 0.1 -11.5 231 8.4 30.6 60.1 225 +04051723.DSM 0 13.3 1669 -24 854 23 36.8 0.2 -11.5 251 6.5 26.2 51.1 132 +04051723.PUB 0 9.2 546 -83 1212 147 55.3 0.5 -11.9 251 7.8 44.9 72.1 222 +04051601.9V9 0 7.5 608 -65 1315 120 61.8 0.5 -19.3 286 7.0 35.7 85.8 189 +04051521.PIR 0 6.8 724 -30 1545 91 60.8 0.3 -21.3 289 7.3 36.7 70.4 224 +04051520.Y26 0 7.0 965 -32 1206 89 60.4 0.7 -23.7 287 7.8 40.0 67.1 217 +99053023.P07 0 12.1 2286 -113 1897 53 39.7 0.1 -8.5 315 7.8 22.5 45.3 165 +99052800.FTW 0 12.2 1104 -4 954 41 33.8 0.3 -12.6 256 6.8 24.6 36.5 103 +99052503.FST 0 10.3 1116 -185 1882 122 53.5 0.0 -9.7 271 8.3 44.1 67.4 157 +99052502.INK 0 11.4 1576 -110 1665 119 56.3 0.4 -10.0 270 7.8 39.9 60.4 191 +99052420.ABQ 0 8.1 781 -71 1338 71 34.2 0.2 -13.9 212 8.5 24.7 44.7 132 +99052220.TUL 0 16.0 3471 -3 869 32 31.1 0.6 -12.1 269 7.3 20.4 36.1 91 +99052200.SNY 0 8.7 1439 -7 1674 53 48.7 0.2 -12.8 266 7.7 28.2 65.4 147 +99052123.RAP 0 8.6 1729 -70 1711 131 43.6 0.4 -16.2 256 8.7 23.0 67.0 178 +99052001.MOT 0 8.0 903 -1 1506 2 27.5 0.0 -17.4 240 7.0 14.4 59.7 47 +99051700.LAA 0 7.5 817 -141 1731 124 65.0 0.1 -15.0 234 8.6 43.8 78.0 361 +99050519.MVN 0 12.9 1777 -10 790 108 57.7 1.8 -14.1 237 6.6 41.0 44.8 194 +99043001.INK 0 12.4 2333 -60 967 95 52.8 1.8 -11.4 237 8.1 32.9 71.8 280 +99042900.BIL 0 6.5 60 -143 1109 133 46.8 0.0 -17.8 182 7.5 39.8 84.0 324 +99042800.EVV 0 9.5 305 -3 1146 22 26.2 0.0 -15.6 225 6.4 18.9 38.1 56 +99042701.OKC 0 8.9 873 -24 1056 47 27.4 0.2 -20.3 275 7.9 23.0 44.2 88 +99042322.LOZ 0 12.8 1995 -5 979 77 37.3 1.0 -11.6 287 6.9 30.4 44.4 71 +99042319.EZF 0 10.2 1142 -51 1722 106 57.2 0.3 -14.2 276 6.9 38.0 68.5 172 +99042203.GOK 0 12.3 2307 -132 894 364 53.9 3.4 -16.0 254 8.5 31.2 54.6 401 +99042123.BMI 0 11.6 1687 -24 839 261 53.4 3.9 -16.4 252 7.8 45.9 57.4 408 +04083002.GCK 0 10.7 1029 -108 1687 204 32.5 0.2 -8.1 315 6.8 29.0 26.2 278 +04083000.SUX 0 10.7 779 -7 1471 199 42.6 0.6 -12.9 289 6.7 36.3 45.9 296 +04082622.C23 0 10.2 983 -43 1349 25 41.1 0.1 -15.8 254 7.2 17.8 70.6 46 +04082621.MCW 0 15.4 2478 -27 1087 26 46.1 0.5 -9.9 239 7.0 37.9 68.9 181 +04082522.FSM 0 18.2 3688 -45 1240 101 33.9 1.6 -6.7 244 6.2 16.5 39.6 113 +04082522.BIS 0 10.2 2077 -41 1811 74 38.1 0.2 -15.2 230 8.4 22.8 43.2 103 +04082503.MHK 0 19.2 4217 -59 627 274 31.2 5.7 -7.9 224 7.5 31.4 51.8 392 +04082501.MHK 0 18.9 4262 -45 721 150 29.9 3.2 -7.4 240 7.1 28.3 50.9 241 +04082020.BGM 0 14.6 1425 -21 712 95 53.2 1.2 -9.5 238 5.9 38.1 53.7 106 +04082018.ORH 0 15.1 2067 -19 1051 47 40.0 0.6 -8.9 256 6.1 29.0 39.9 132 +04081918.LBE 0 14.4 1183 -7 597 105 39.9 0.8 -8.7 270 5.6 40.5 44.4 152 +04081901.PIA 0 13.9 1294 -107 1203 377 40.4 1.6 -7.9 277 5.6 39.8 43.3 465 +04081822.BRL 0 15.3 2600 -41 963 377 41.3 6.8 -9.4 276 6.6 42.5 42.9 508 +04081421.LIC 0 9.9 1288 -66 1242 15 32.2 0.1 -10.2 333 7.8 25.5 42.7 65 +04080321.OAX 0 18.7 4816 -44 1389 92 36.9 1.7 -5.9 259 7.0 23.6 38.1 189 +04080202.Y26 0 15.4 3187 -169 1209 336 55.2 1.6 -9.3 291 8.1 28.5 83.2 385 +04080123.Y22 0 8.5 1290 -28 3011 -1 45.9 0.0 -10.5 298 8.6 30.2 71.2 158 +04073101.GAG 0 14.4 2006 -116 1300 54 42.0 0.3 -6.2 308 6.7 14.8 44.7 98 +04072102.FSD 0 19.9 4659 -49 869 261 26.0 5.3 -5.9 278 7.3 28.0 37.4 426 +99081101.HLC 0 17.4 3928 -33 1289 71 38.3 1.3 -5.1 243 6.7 21.0 34.5 152 +99081023.AKO 0 14.9 2910 -32 1271 87 33.9 1.0 -6.5 232 7.6 22.7 45.7 163 +99080901.DIK 0 12.0 2409 -98 1891 48 58.5 0.1 -10.8 267 8.5 29.7 54.5 94 +99080822.2WX 0 10.3 1972 -32 2526 39 44.1 0.0 -8.8 262 8.3 27.2 41.0 117 +99080702.RAP 0 12.7 921 -36 1200 35 33.6 0.1 -6.6 268 6.3 20.0 48.7 72 +99080301.LWT 0 8.5 449 -155 1772 53 48.3 0.0 -10.3 278 7.8 29.4 70.4 131 +99073100.JKL 0 15.8 3605 -30 1833 89 22.3 0.0 -5.9 355 6.7 22.8 19.6 158 +99073020.IPT 0 15.0 2685 -12 1238 32 34.0 0.4 -8.7 319 6.3 16.0 50.7 72 +99072922.FVX 0 14.5 1431 -13 1556 81 34.3 0.3 -6.0 327 5.6 22.6 48.0 117 +99072902.XVG 0 12.7 1459 -186 1710 319 58.3 0.1 -9.5 302 7.7 41.9 73.8 381 +99072900.ADG 0 14.8 1974 -6 1415 63 37.3 0.5 -9.4 298 7.1 21.7 66.3 118 +99072420.MHT 0 14.8 1594 -17 1088 66 27.8 0.5 -9.7 275 6.5 25.2 56.1 134 +99072319.RAP 0 10.6 1320 -19 2145 52 38.7 0.0 -7.5 263 7.3 22.5 54.0 87 +99072300.FAR 0 16.2 2819 -34 1355 81 35.4 0.9 -8.5 247 7.6 27.9 55.9 137 +99071923.GDV 0 11.9 1807 -31 1654 21 41.3 0.1 -11.2 254 7.9 18.9 69.4 67 +99071302.FAR 0 12.1 1948 -48 1552 125 38.2 0.7 -12.5 297 7.2 27.2 61.0 158 +99071302.DVL 0 10.4 1453 -76 1761 69 42.5 0.1 -13.5 288 7.5 28.3 62.4 124 +99071300.OLF 0 9.2 1101 -38 2374 25 49.7 0.0 -10.3 281 7.3 26.5 65.7 106 +99071202.AIA 0 9.4 1094 -73 1844 -8 27.8 0.0 -11.3 327 8.0 26.7 47.0 79 +99070804.GDV 0 14.2 2058 -209 1364 472 61.7 0.0 -7.6 251 8.0 40.8 78.6 551 +99070421.ERY 0 19.1 3756 -61 791 95 32.9 1.8 -6.7 267 8.2 22.2 36.6 98 +99070207.SFD 0 9.5 32 -374 1535 254 82.4 0.0 -10.7 263 7.4 45.0 92.7 464 +99070103.SWO 0 18.3 2994 -18 703 229 51.1 5.8 -4.6 303 6.4 25.9 51.9 297 +99070103.GCK 0 15.2 2113 -124 873 95 73.0 1.0 -6.5 294 7.5 37.6 74.8 319 +99063023.LBF 0 9.7 291 -114 1136 0 76.3 0.0 -12.3 289 6.9 54.3 115.6 214 +99062801.BGD 0 13.8 2864 -63 2251 73 37.7 0.0 -5.0 266 8.5 22.5 43.1 130 +99062522.DIK 0 12.8 2775 -1 1732 -52 57.7 -0.4 -10.3 230 8.2 35.4 58.9 132 +99062501.VTN 0 11.7 1035 -41 1545 55 41.3 0.2 -8.2 282 6.6 23.6 41.7 120 +99062400.BGD 0 12.2 2544 -17 2195 10 13.6 0.0 -6.5 288 7.8 22.6 35.1 91 +99060601.P07 0 11.8 1543 -130 1771 -31 45.2 0.0 -8.7 243 7.9 18.4 58.3 32 +99060523.LBF 0 10.7 2070 -28 1957 91 62.6 0.1 -12.9 197 8.5 25.9 90.4 131 +99060302.IML 0 10.0 869 -198 1657 237 43.7 0.0 -11.0 225 8.5 39.8 66.5 421 +99060202.GCC 0 6.3 226 -83 1883 18 41.3 0.0 -15.4 262 8.3 26.0 42.6 126 +99060200.FTW 0 16.8 3982 -31 1338 62 35.0 1.0 -11.1 275 8.5 25.7 60.3 144 +99053102.MHK 0 11.6 903 -51 1360 108 32.8 0.3 -11.3 270 6.9 30.0 24.5 179 +99120303.ADM 0 9.7 1355 -50 974 250 42.8 2.4 -22.1 217 8.5 35.9 65.7 332 +99112303.RBD 0 13.2 1077 -16 789 138 48.1 1.2 -13.6 235 6.4 25.1 60.9 176 +99112302.HBR 0 8.7 124 -124 660 53 47.7 0.0 -17.1 219 6.7 41.5 75.7 132 +99100823.FSI 0 10.1 649 -14 1313 5 36.2 0.0 -13.6 219 6.3 14.3 67.9 56 +99092600.GKY 0 13.1 1483 -15 1429 43 28.0 0.2 -9.4 340 6.3 21.5 55.3 182 +99092522.D07 0 6.4 163 -199 2219 136 65.7 0.0 -15.8 242 8.3 31.8 105.7 206 +99092004.RRC 0 11.2 292 -200 1044 70 37.2 0.0 -11.2 270 6.7 28.8 60.6 216 +99092000.OKC 0 11.1 1068 -42 1896 56 39.5 0.0 -10.1 290 6.8 29.0 60.9 190 +99091923.CSM 0 11.9 1645 -3 1885 18 41.3 0.0 -9.8 280 7.0 27.5 64.0 178 +99091920.CGZ 0 11.2 802 -16 1905 19 39.1 0.0 -8.7 245 6.5 16.0 60.3 61 +99091207.SLP 0 15.6 2094 -69 507 92 45.4 1.3 -10.8 271 8.2 16.8 55.8 121 +99091200.LBL 0 11.9 1180 -121 1590 31 43.2 0.1 -9.0 275 7.8 25.7 65.5 84 +99091122.HLC 0 12.4 1517 -36 1221 59 37.8 0.4 -11.3 253 7.4 21.0 66.2 94 +99091101.AFW 0 13.1 1250 -24 1970 21 29.5 0.0 -7.4 297 6.2 21.7 52.8 139 +99082300.ABR 0 11.7 1432 -38 1851 61 40.1 0.1 -9.6 289 6.9 20.3 45.5 101 +99082104.HON 0 13.3 1187 -244 1155 197 38.1 0.0 -8.9 281 7.4 31.4 54.2 238 +99082100.LBF 0 9.8 20 -311 1794 44 34.8 0.0 -7.8 321 7.1 19.7 46.1 126 +99082022.DIK 0 11.7 1445 -10 1669 21 33.6 0.1 -7.8 298 6.3 17.8 36.0 58 +99081922.MLS 0 7.1 393 -105 3278 19 33.8 0.0 -10.0 244 8.6 22.0 37.3 120 +99081800.RRT 0 11.4 1524 -26 847 90 49.2 1.1 -17.7 268 7.3 32.2 62.0 126 +99081400.ALB 0 16.8 1843 -4 701 196 38.5 2.3 -6.3 249 5.8 29.9 48.4 252 +99081202.GCC 0 10.6 877 -99 1162 63 34.5 0.2 -10.2 218 7.5 17.7 54.6 98 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sncmn.cmn b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sncmn.cmn old mode 100755 new mode 100644 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 old mode 100755 new mode 100644 index 003b0649fd..ee1eb46acd --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/so_new.csh +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/so_new.csh @@ -73,7 +73,6 @@ echo " " if ( $check == "libbignsharp.so") then echo "****** Shared library is created ******\n " echo " " - cp libbignsharp.so $DEV_BASE/workspace/build.cave/static/common/cave/caveEnvironment/lib cp libbignsharp.so $DEV_BASE/workspace/gov.noaa.nws.ncep.ui.nsharp.linux32 else echo "****** Houston, we got problems ******\n " diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sup_nsharp.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sup_nsharp.f index 5e562bb8ca..6c4bc54dd1 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sup_nsharp.f +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sup_nsharp.f @@ -6,7 +6,7 @@ c program sup_nsharp 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. @@ -26,7 +26,7 @@ c SARS For Supercells character sndglist(saob)*15, fname*(80), fname1*(80) character tortype(maob)*8,suplist(saob)*8 - integer maob,i,j,cnt,mlmrmat(maob),mlcapemat(maob), + 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, diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/test b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/test old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/textwin.c_linux b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/textwin.c_linux old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xinitd.c_11282007 b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xinitd.c_11282007 old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xtnd b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xtnd old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xv.h_linux b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xv.h_linux old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid1.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid1.c index 3465e07262..b5ec5c9594 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid1.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid1.c @@ -37,7 +37,7 @@ /***************************************************************/ #define GLOBAL #define VIDEO -#include "xwcmn.h" +//#include "xwcmn.h" #include "sharp95.h" /* @@ -56,11 +56,13 @@ short auto_mode; int xwdth, xhght, xdpth; int raob_mod; +#ifndef _WIN32 Pixel pixels[40]; /* for colors */ GC gc; Widget draw_reg; Pixmap canvas; XtAppContext app; +#endif short pagenum = 1; short overlay_previous; @@ -71,6 +73,7 @@ struct _skewt skv = { 40, 25, 500, 500, 100, 70, 60, 1}; struct _hodog hov = { 40, 675, 350, 1025, 0, 0, 120, 10}; struct _stpinset stv = { 720, 520, 1080, 790, 0}; struct _startup autostart; +#ifndef _WIN32 typedef struct { /* for drawing moving crosshairs or zoom boxes */ int start_x, start_y, last_x, last_y; @@ -82,6 +85,7 @@ typedef struct { /* for drawing moving crosshairs or zoom boxes */ } rubber_band_data; rubber_band_data rbdata; +#endif /* mkay added functions */ void mixratline(float val); @@ -90,6 +94,7 @@ void display_levels(short colr); void display_effective_layer(short colr); /*NP*/ +#ifndef _WIN32 void make_screen(int argc, char *argv[]) /*************************************************************/ /* MAKE_SCREEN */ @@ -696,7 +701,7 @@ void draw_hodo(void) */ } } - +#endif /*NP*/ void hodo_to_pix(float dir, float mag, short *x, short *y) /*************************************************************/ @@ -783,6 +788,7 @@ void pix_to_hodo(short x, short y, float *dir, float *mag) *mag = speed(u, v); } +#ifndef _WIN32 /*NP*/ void trace_hodo(short width) /*************************************************************/ @@ -1494,7 +1500,6 @@ void trace_temp(short width, short colr) } - /* This routine has same problems as trace_hodo @@ -1535,7 +1540,6 @@ void trace_temp2(short width) } } - /*NP*/ void trace_vtmp(short width) /*************************************************************/ @@ -1575,7 +1579,6 @@ void trace_vtmp(short width) } } - /*NP*/ void trace_dwpt(short width, short colr) /*************************************************************/ @@ -1680,7 +1683,6 @@ void trace_dwpt2(short width) } } - /*NP*/ void trace_wetbulb(short width) /*************************************************************/ @@ -1722,7 +1724,7 @@ void trace_wetbulb(short width) } } } - +#endif /*NP*/ short pres_to_pix(float pres) /*************************************************************/ @@ -1809,6 +1811,7 @@ float pix_to_temp(short x, short y) } /*NP*/ +#ifndef _WIN32 void trace_parcel(float pres, float temp, float dwpt) /*************************************************************/ /* TRACE_PARCEL */ @@ -1977,7 +1980,6 @@ void wind_barb(float wdir, float wspd, short x, short y, short siz) } } - /*NP*/ void plot_barbs(void) /*************************************************************/ @@ -2133,7 +2135,6 @@ void plot_barbs2(void) } - /*NP*/ void vvel_profile(void) /*************************************************************/ @@ -2194,7 +2195,6 @@ void vvel_profile(void) } } - /*NP*/ void trace_dcape(void) /*************************************************************/ @@ -2291,7 +2291,6 @@ void copytodisplay(void) XFlush(XtDisplay(draw_reg)); } - void display_dendritic_zone(short width) { short i, x, y, xold, yold; @@ -2373,7 +2372,6 @@ void display_dendritic_zone(short width) } } - void display_levels(short colr) { short i, x, y, xold, yold; @@ -2470,7 +2468,6 @@ void display_levels(short colr) outgtext(st, skv.tlx+ 35, y-5); } - void display_effective_layer(short colr) { short i, x, y, xold, yold; @@ -2557,3 +2554,4 @@ void display_effective_layer(short colr) sprintf( st, "%4.0f J/kg", pcl.bplus); outgtext(st, skv.brx - x2, y1+5); */ } +#endif diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid2.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid2.c index 458984d3c4..347a610aa2 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid2.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid2.c @@ -38,9 +38,12 @@ /* WW_TYPE */ /***************************************************************/ +#ifndef _WIN32 #include "xwcmn.h" +#endif #include "sharp95.h" +#ifndef _WIN32 short switch_modes(short mode) /*************************************************************/ /* SWITCH_MODES */ @@ -115,6 +118,7 @@ void disp_param(char *value, short rcol, short rlin) outgtext(value, (rcol - getgtextextent(value)), rlin); } +#endif /* grab_level should return an error as needed @@ -155,7 +159,7 @@ short grab_level(float pres) } - +#ifndef _WIN32 /*NP*/ void skewt_cursor_data( short x, short y ) /*************************************************************/ @@ -306,7 +310,7 @@ void hodo_cursor_data( short x, short y ) sprintf( st, "%3.0f", ix4 ); outtext( st, skv.brx+315, skv.tly+60 ); } - +#endif /* diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvideo.h_linux b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvideo.h_linux old mode 100755 new mode 100644 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 f6c1c47077..95c46b9696 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 @@ -5,6 +5,8 @@ Bundle-SymbolicName: gov.noaa.nws.ncep.ui.nsharp;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-Activator: gov.noaa.nws.ncep.ui.nsharp.Activator Bundle-Vendor: SIB +Eclipse-RegisterBuddy: gov.noaa.nws.ncep.resources, com.raytheon.viz.core, com.raytheon.uf.viz.core, com.raytheon.uf.common.serialization +Eclipse-BuddyPolicy: ext, global Require-Bundle: org.eclipse.ui;bundle-version="3.4.1", org.eclipse.core.runtime;bundle-version="3.4.0", org.eclipse.core.resources, diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/ncep/gov.noaa.nws.ncep.ui.nsharp/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject new file mode 100644 index 0000000000..2055dee5c1 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -0,0 +1,2 @@ +gov.noaa.nws.ncep.ui.nsharp.NsharpConfigStore +gov.noaa.nws.ncep.ui.nsharp.NsharpLineProperty \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/gov.noaa.nws.ncep.ui.nsharp.ecl b/ncep/gov.noaa.nws.ncep.ui.nsharp/gov.noaa.nws.ncep.ui.nsharp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/nlist.txt b/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/nlist.txt index 5c7d200395..1eada9d84f 100755 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/nlist.txt +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/nlist.txt @@ -1,1149 +1,1149 @@ -DATE / RAOB ELEV REPORT MUCAPE MUMR 500TEMP 300 T 7-5 LR 5-3 LR 0-3SH 0-6SH 0-9SH SRH3 SHIP MODELb -95052300.DDC 791 6.00 4181 15.3 -9.6 -36.2 7.5 7.1 23.4 19.4 26.8 325 1.9 3.0 -91051100.MAF 873 6.00 4692 14.9 -10.8 -37.3 8.8 7.2 14.2 13.2 18.1 -37 1.9 2.7 -97061700.OUN 357 5.50 5751 18.8 -9.5 -36.1 7.4 7.1 14.5 23.6 45.9 116 3.1 3.5 -99012200.LZK 165 5.00 2240 12.3 -17.3 -41.7 7.6 6.8 23.0 26.3 32.1 294 2.3 3.0 -96061200.DDC 791 5.00 2820 13.7 -8.3 -34.7 7.6 7.1 12.9 20.3 15.8 142 1.2 2.5 -92072600.DDC 791 5.00 4794 17.4 -4.6 -31.2 6.8 7.0 18.2 17.4 14.6 176 1.0 0.8 -91052900.HON 392 5.00 3892 15.2 -12.3 -38.0 8.0 7.0 25.0 40.7 36.0 269 3.4 3.5 -90070800.BIS 504 5.00 3717 16.6 -9.8 -33.6 7.7 6.4 12.5 29.8 42.2 202 2.4 2.4 -57070300.RAP 966 5.00 4359 15.8 -6.7 -36.0 7.7 7.8 13.9 22.9 39.3 130 1.7 3.4 -06040300.LZK 78 5.00 3819 13.7 -14.9 -44.7 8.0 8.2 20.9 26.6 32.6 251 3.9 3.4 -99060100.DDC 790 4.75 4387 15.9 -11.3 -38.7 8.0 7.4 15.3 27.7 38.0 209 3.5 3.5 -96102100.OUN 362 4.50 2995 12.7 -12.9 -42.6 7.5 8.1 15.6 20.3 28.4 71 1.8 3.0 -96081100.LBF 847 4.50 2360 13.3 -8.4 -34.4 6.2 7.0 26.5 26.1 22.0 326 1.0 2.6 -96062700.TFX 1130 4.50 3835 13.9 -10.9 -37.2 8.3 7.1 21.8 37.1 44.3 297 3.0 1.6 -96051000.TOP 268 4.50 3884 15.6 -11.1 -40.4 8.8 8.0 22.1 18.3 22.3 234 2.2 3.3 -96050500.IAD 85 4.50 2432 12.1 -15.2 -41.7 7.2 7.3 15.9 25.0 25.5 36 1.9 1.9 -96030700.JAN 91 4.50 2362 14.0 -12.5 -38.9 6.8 7.2 16.8 34.9 36.9 196 1.8 0.6 -95060900.MAF 873 4.50 5653 17.8 -8.1 -37.7 8.1 8.0 12.8 18.7 33.5 83 2.2 2.9 -95060500.MAF 873 4.50 4358 14.9 -8.6 -40.7 7.6 8.7 16.0 23.2 32.0 181 2.1 2.9 -95051700.DDC 791 4.50 4878 15.6 -10.8 -39.2 8.5 7.7 8.9 26.6 40.7 43 3.8 2.6 -94060800.LBF 847 4.50 3400 13.0 -9.5 -37.5 7.8 7.6 8.1 18.7 18.4 109 1.5 2.4 -94042600.SEP 399 4.50 4409 16.3 -11.5 -41.9 7.4 8.3 21.2 26.7 26.2 138 3.3 3.3 -94040300.OUN 362 4.50 2075 10.1 -17.0 -44.2 7.6 7.5 18.7 31.2 39.3 163 1.9 2.1 -93101800.SEP 428 4.50 3958 15.7 -10.6 -34.9 7.0 6.5 23.2 31.7 30.5 441 2.6 2.2 -93101300.SEP 428 4.50 3151 14.2 -13.1 -36.5 8.0 6.3 15.0 22.3 31.8 307 2.4 2.9 -93092200.TOP 270 4.50 3665 16.8 -8.1 -37.9 6.5 8.0 21.3 21.3 37.9 502 1.3 1.3 -93092200.OVN 486 4.50 3685 15.4 -11.1 -40.4 8.1 7.9 23.5 31.9 33.2 492 2.9 4.0 -93072400.BIS 505 4.50 3597 15.3 -9.8 -38.4 5.8 7.7 14.9 21.0 33.2 263 1.4 2.3 -93062700.OVN 400 4.50 3720 15.0 -10.0 -38.2 6.3 7.6 9.4 22.3 28.9 140 1.7 3.1 -93060800.OUN 431 4.50 4917 17.0 -9.1 -34.9 7.1 6.9 9.7 30.6 26.7 195 2.8 2.6 -93050100.DDC 790 4.50 3206 11.1 -16.5 -44.2 8.0 7.7 15.4 24.0 29.9 194 2.7 3.7 -92073000.TOP 268 4.50 4074 16.6 -10.0 -37.8 7.5 7.5 11.8 22.5 22.1 164 2.2 2.4 -92073000.OVN 400 4.50 4366 16.6 -11.4 -38.3 7.4 7.3 13.9 22.3 23.7 216 2.7 3.2 -92062900.SEP 399 4.50 3761 17.4 -9.6 -33.8 7.8 6.6 13.7 21.8 15.6 248 2.0 2.8 -92062800.DDC 791 4.50 2750 13.8 -11.3 -34.2 7.8 6.2 15.2 20.6 41.3 315 1.6 2.9 -92062800.AMA 1095 4.50 4069 16.0 -10.3 -36.1 7.9 6.9 16.9 22.8 27.5 150 2.4 3.2 -91081400.GTF 1118 4.50 2524 11.5 -13.2 -37.4 8.5 6.6 15.3 25.8 28.9 213 2.0 2.0 -91072100.HON 392 4.50 5826 20.1 -6.1 -32.2 6.8 6.9 14.3 22.8 33.9 180 1.8 1.9 -91042912.BRO 7 4.50 4471 19.5 -9.8 -38.2 7.7 7.6 13.7 23.1 24.2 254 2.5 -999.0 -91032800.FNT 236 4.50 1860 11.3 -17.3 -44.0 7.6 7.4 26.8 47.0 45.4 431 1.8 2.9 -90051600.OUN 357 4.50 4398 16.7 -9.0 -36.4 7.6 7.3 23.2 25.5 44.9 180 2.5 3.1 -89080400.INL 359 4.50 3953 17.4 -11.5 -30.6 8.3 5.1 7.3 18.6 29.2 36 2.3 1.0 -89070300.SEP 399 4.50 5261 18.5 -7.6 -28.8 8.4 5.6 12.9 22.6 1.2 222 2.5 2.9 -89062700.GSO 277 4.50 4349 17.6 -7.3 -33.8 6.3 7.1 7.8 14.2 6.4 52 0.9 0.9 -89060700.SEP 399 4.50 3510 15.6 -7.9 -33.9 7.0 7.0 9.0 24.8 47.4 130 1.6 2.4 -89060400.MAF 873 4.50 3939 14.0 -10.0 -36.2 8.5 7.1 6.6 20.6 33.6 58 2.2 2.2 -02043000.FWD 171 4.50 5853 19.4 -10.9 -33.7 8.0 6.1 14.6 29.7 37.1 151 4.4 3.1 -02042900.IAD 93 4.50 2553 13.6 -16.7 -41.9 7.3 6.9 24.9 21.1 33.9 373 2.1 2.9 -08020600.SHV 79 4.25 2312 13.5 -14.1 -42.1 7.3 7.7 25.8 32.4 43.7 212 2.1 1.8 -07080400.RAP 1029 4.25 2983 15.6 -4.1 -30.9 6.2 7.1 18.3 22.7 35.8 270 0.7 0.9 -05042200.SGF 387 4.25 2944 12.6 -13.3 -42.7 6.8 8.0 15.1 21.3 15.6 193 1.7 2.2 -05042000.LBF 849 4.25 2460 10.1 -15.7 -43.9 8.9 7.8 16.6 15.3 22.3 255 1.4 2.9 -05031400.JAN 101 4.25 1382 11.1 -15.7 -40.7 7.6 6.8 19.2 25.5 49.7 161 1.1 2.8 -04081000.DNR 1625 4.25 3415 12.9 -9.1 -38.9 8.0 8.1 16.2 15.0 15.4 270 1.2 3.2 -04071318.ILX 178 4.25 6811 22.1 -10.9 -36.3 7.9 6.8 15.5 18.7 21.9 131 3.6 2.6 -04071300.LBF 849 4.25 7183 19.5 -7.3 -35.7 8.6 7.5 10.3 14.7 20.5 68 2.1 3.7 -04071200.GGW 700 4.25 2390 11.0 -13.7 -41.1 8.6 7.5 17.1 22.3 32.0 99 1.7 1.9 -04062200.AMA 1099 4.25 3828 13.8 -8.9 -36.5 8.0 7.4 17.8 26.2 40.5 141 2.3 2.3 -04053000.OUN 357 4.25 4526 16.8 -7.5 -36.5 7.8 7.7 15.8 24.4 40.4 224 2.1 -999.0 -04052200.AMA 1099 4.25 4265 13.7 -8.7 -36.3 7.9 7.4 13.6 21.5 23.9 176 2.0 2.1 -04040400.MAF 872 4.25 2746 12.0 -14.7 -43.1 7.0 7.8 14.4 19.5 31.1 262 1.6 2.7 -03051000.MHX 11 4.25 4373 17.1 -10.5 -35.1 7.3 6.6 14.1 22.7 23.2 146 2.5 2.1 -03050518.BNA 210 4.25 2730 16.0 -12.9 -36.4 7.1 6.5 18.3 37.0 37.2 239 2.2 -999.0 -03050500.SGF 387 4.25 5169 15.7 -13.5 -40.7 7.6 7.4 30.0 38.4 50.7 348 4.6 2.9 -03040600.FWD 171 4.25 2487 12.4 -14.3 -41.7 7.3 7.5 17.1 31.5 51.8 341 2.1 2.9 -01070300.LBF 849 4.25 5584 16.7 -8.7 -37.3 8.5 7.8 14.2 18.0 24.7 154 2.4 4.2 -98063000.TOP 270 4.00 6490 21.8 -5.3 -30.5 7.2 6.6 18.1 24.4 32.6 230 2.0 1.7 -98050800.FFC 244 4.00 4120 17.3 -12.3 -36.1 7.7 6.4 17.1 31.0 51.6 172 3.4 2.2 -97082200.LBF 849 4.00 3974 15.7 -9.7 -35.9 7.4 7.1 17.4 26.4 37.5 321 2.4 3.3 -96052300.LBF 847 4.00 2915 13.5 -11.1 -38.2 8.0 7.3 18.5 27.8 43.7 303 2.3 2.9 -95102700.SGF 394 4.00 2166 12.5 -13.8 -41.6 6.9 7.6 25.7 21.9 29.4 267 1.3 1.6 -95072600.DDC 791 4.00 5696 18.3 -10.1 -32.2 8.8 5.9 17.1 21.3 19.2 238 3.5 3.3 -95072500.FTD 196 4.00 2897 15.4 -10.0 -30.5 9.2 5.5 12.8 19.1 19.8 168 1.7 -999.0 -95051600.JAN 91 4.00 4861 17.9 -10.9 -37.6 7.8 7.2 8.6 14.9 18.5 -35 2.0 2.5 -95050600.FTD 196 4.00 2036 15.1 -11.1 -34.7 7.1 6.4 20.8 21.2 37.5 304 1.1 0.6 -93072300.HON 443 4.00 3720 15.7 -8.1 -37.4 6.0 7.8 15.4 19.1 22.5 130 1.1 1.5 -93071600.RAP 966 4.00 3230 14.1 -7.5 -34.9 7.7 7.3 18.6 25.0 35.8 97 1.5 3.2 -91041300.SEP 399 4.00 5008 16.9 -10.6 -40.5 6.8 8.1 12.2 21.8 27.4 137 2.6 3.4 -90090200.RAP 966 4.00 1762 11.3 -7.4 -33.9 7.5 7.0 14.1 23.6 32.7 181 0.6 2.1 -90070100.DAY 298 4.00 3541 16.6 -9.4 -33.6 7.1 6.5 8.6 19.9 24.5 154 1.5 1.8 -90060900.TOP 268 4.00 5571 18.5 -10.1 -39.2 7.3 7.8 14.8 22.6 16.4 252 3.0 2.7 -90051900.AMA 1095 4.00 2732 11.5 -9.3 -38.2 7.7 7.8 18.5 26.1 30.4 301 1.4 2.1 -90051500.AMA 1095 4.00 4543 14.8 -9.9 -36.2 8.2 7.1 19.2 24.7 33.8 473 2.9 2.2 -89071800.LBF 847 4.00 3622 15.4 -9.4 -35.6 8.1 7.0 22.9 38.9 37.6 361 2.4 2.9 -89062700.DDC 791 4.00 2840 14.3 -8.4 -36.6 7.6 7.5 12.7 19.4 19.2 167 1.1 2.2 -89061100.AMA 1095 4.00 3666 15.8 -8.7 -35.4 7.6 7.2 11.1 11.0 19.2 87 0.9 -999.0 -06092221.SGF 387 4.00 5071 17.6 -6.7 -36.1 5.3 7.9 21.0 31.6 37.0 202 1.6 1.1 -06071700.INL 361 4.00 3719 14.1 -11.1 -38.3 8.4 7.4 19.9 26.3 29.8 328 3.0 2.4 -06050600.MAF 872 4.00 3533 12.4 -12.3 -40.1 8.2 7.5 19.3 33.6 48.0 174 2.8 2.0 -04071318.DVN 229 4.00 6090 20.8 -11.1 -37.3 8.4 7.1 22.5 25.9 22.3 191 4.7 2.8 -03050300.BMX 178 4.00 4593 15.2 -15.7 -40.1 7.9 6.7 8.1 32.4 30.5 51 5.0 2.9 -02061300.DDC 790 4.00 6234 19.5 -6.9 -31.9 7.6 6.6 17.2 19.8 32.7 126 2.1 3.7 -02042000.MAF 872 4.00 2974 12.9 -8.1 -36.7 6.9 7.6 19.0 24.3 41.7 133 1.2 2.5 -95051900.BMX 178 3.75 3370 16.5 -9.9 -35.7 6.6 7.0 16.9 20.6 25.5 246 1.5 0.6 -03040400.OUN 357 3.75 2640 11.9 -15.1 -42.7 7.3 7.6 13.4 24.0 23.9 187 2.0 2.3 -99072600.LBF 849 3.65 4375 16.4 -6.7 -30.5 7.9 6.4 9.5 12.9 16.1 60 1.0 2.6 -99050400.OUN 357 3.65 5195 15.6 -14.9 -44.1 8.4 8.0 16.5 21.3 22.0 343 4.5 4.7 -99030600.LZK 165 3.65 1922 11.7 -18.5 -46.3 8.2 7.7 21.4 22.8 39.2 360 1.9 2.1 -98052200.SGF 387 3.65 4719 17.1 -9.9 -36.5 7.8 7.2 13.8 22.4 23.1 232 2.6 2.3 -98040800.ILX 178 3.65 1354 10.2 -19.7 -46.5 7.2 7.5 20.1 21.2 25.1 180 1.1 2.6 -03062300.OAX 350 3.65 6203 18.7 -9.3 -36.9 8.6 7.5 12.3 13.6 22.9 237 2.2 4.2 -02091900.OUN 357 3.65 4268 15.7 -6.1 -36.9 6.7 8.2 17.8 20.8 23.4 308 1.2 3.0 -02062400.ABR 396 3.65 5093 17.2 -10.5 -35.7 8.2 6.8 16.9 26.3 30.9 187 3.7 3.5 -02060500.RNK 654 3.65 5399 17.9 -9.7 -34.9 6.9 6.7 8.7 4.0 7.3 54 0.8 3.2 -02051200.TOP 270 3.65 4489 15.8 -11.9 -38.9 8.1 7.3 13.7 26.0 26.5 224 3.6 3.3 -02051100.MAF 872 3.65 4658 14.5 -9.3 -35.9 8.4 7.2 14.8 23.1 40.3 132 2.7 2.2 -01072100.GGW 700 3.65 3114 13.5 -10.7 -38.5 7.7 7.5 15.8 28.3 30.5 354 2.2 2.8 -01071800.ABR 396 3.65 5177 17.5 -9.9 -36.7 8.4 7.2 9.6 19.5 28.2 136 2.7 3.9 -01062100.DDC 790 3.65 4428 15.2 -10.7 -37.5 7.8 7.3 13.4 19.0 25.2 400 2.3 3.2 -01061400.DDC 790 3.65 5244 15.7 -8.9 -36.7 8.0 7.5 19.8 28.1 28.2 384 3.2 2.5 -01052500.JAN 101 3.65 3446 13.5 -15.1 -42.5 7.5 7.5 17.4 21.8 31.4 240 2.7 2.7 -01051800.AMA 1099 3.65 4695 13.9 -10.5 -38.9 8.6 7.7 16.1 13.2 22.8 86 1.8 2.1 -01050700.SHV 79 3.65 2945 14.8 -12.5 -39.3 6.5 7.3 9.0 15.7 22.1 110 1.2 1.7 -01050700.LZK 78 3.65 3512 14.7 -12.9 -40.5 5.9 7.5 7.3 18.7 26.3 77 1.6 3.4 -01041500.DDC 790 3.65 3892 13.1 -18.3 -43.1 9.0 6.9 24.4 43.1 54.7 233 5.4 2.5 -01040400.SGF 387 3.65 3277 12.8 -15.1 -43.1 8.3 7.7 17.2 22.4 28.9 310 2.8 3.1 -98062000.OUN 357 3.50 6048 19.0 -7.1 -35.9 7.8 7.7 13.7 15.4 11.2 209 1.7 3.9 -98052500.OUN 357 3.50 5688 18.0 -10.7 -39.7 8.1 7.8 9.9 21.9 28.7 172 3.5 4.2 -98052100.TOP 270 3.50 4680 16.5 -12.5 -38.1 8.4 7.0 9.8 10.5 23.7 100 1.7 3.8 -97062100.LBF 849 3.50 6058 17.3 -9.3 -35.7 8.8 7.2 13.9 23.1 25.1 129 3.7 3.7 -96062000.OAX 350 3.50 4081 16.3 -9.8 -37.1 8.6 7.4 18.9 19.0 24.4 271 2.1 -999.0 -90061900.BIS 504 3.50 1968 11.1 -13.5 -40.9 8.2 7.5 17.4 28.4 38.0 257 1.5 2.9 -90060900.IAD 85 3.50 3994 17.2 -10.9 -35.5 7.1 6.7 18.3 23.7 20.0 203 2.4 0.9 -90040600.SEP 399 3.50 3764 12.4 -14.9 -45.3 7.8 8.4 15.4 25.2 36.8 305 3.3 2.3 -90031400.OUN 357 3.50 3950 14.6 -16.1 -39.5 7.2 6.4 12.3 20.2 49.4 169 3.0 2.9 -89070300.STC 315 3.50 3556 15.6 -8.2 -35.9 7.0 7.4 8.5 15.8 21.4 128 1.1 1.4 -02081200.DDC 790 3.50 3415 14.0 -8.7 -34.3 8.0 6.9 10.7 15.7 27.7 157 1.2 3.1 -01061500.FWD 171 3.50 4260 17.3 -9.7 -33.7 7.9 6.5 11.1 15.1 9.7 74 1.6 2.2 -01041000.SGF 387 3.50 3476 13.0 -14.5 -41.3 7.9 7.4 12.5 21.6 30.3 141 2.7 2.6 -91060500.DDC 791 3.25 4631 16.9 -7.9 -35.5 6.5 7.4 11.0 15.3 15.4 74 1.2 3.5 -06070200.GRB 214 3.25 3255 15.4 -9.3 -35.9 6.6 7.1 14.7 17.0 24.9 99 1.1 1.5 -99060200.FWD 196 3.00 4928 17.3 -11.5 -37.3 8.8 7.0 15.3 15.0 30.3 171 2.4 4.5 -98062900.TOP 270 3.00 6895 22.0 -7.7 -33.1 7.0 6.8 19.3 20.6 27.3 335 2.5 2.4 -98062500.BIS 506 3.00 4591 15.5 -13.3 -41.3 8.1 7.7 15.5 15.9 15.4 89 2.5 3.0 -98062500.ABR 396 3.00 4448 16.3 -13.7 -40.5 8.8 7.3 11.2 17.4 28.7 42 3.0 3.7 -98061400.OAX 350 3.00 2830 13.3 -10.5 -39.5 7.7 7.9 15.3 24.4 45.4 219 1.8 3.4 -98052400.DDC 790 3.00 2630 11.6 -12.9 -41.5 6.7 7.8 9.8 22.0 27.7 101 1.4 2.3 -97061000.FWD 196 3.00 2699 15.6 -9.9 -34.9 7.0 6.7 10.9 18.7 24.1 98 1.1 1.3 -97052600.OUN 357 3.00 5143 17.2 -7.7 -38.5 5.9 8.3 15.0 30.4 32.4 148 2.0 2.6 -96070800.LBF 847 3.00 3341 15.3 -6.4 -32.5 7.0 6.9 20.6 30.0 41.5 390 1.3 2.2 -96062012.LBF 847 3.00 3418 15.2 -8.6 -35.4 7.9 7.3 16.5 22.6 25.0 380 1.7 3.3 -96061400.UNR 1037 3.00 3801 13.1 -11.0 -37.6 8.4 7.2 12.4 18.0 14.8 63 2.0 2.0 -96052700.OUN 362 3.00 3034 15.2 -9.4 -36.2 6.9 7.2 22.5 29.8 33.6 330 1.7 2.0 -96042000.ILX 178 3.00 2394 12.9 -14.6 -41.1 7.1 7.3 16.4 27.0 39.5 249 2.1 -999.0 -96033100.SHV 84 3.00 2891 12.7 -17.1 -46.6 7.6 8.2 20.1 27.4 35.5 163 3.0 3.1 -95082700.GGW 696 3.00 3094 11.7 -12.6 -38.7 8.3 7.1 13.6 26.8 41.0 162 2.4 1.7 -95082300.INL 359 3.00 3023 15.4 -11.6 -36.2 8.0 6.7 25.4 30.9 26.5 694 2.5 2.1 -95072400.DDC 791 3.00 3645 15.9 -9.9 -33.5 8.2 6.3 11.8 18.2 32.6 31 1.7 3.6 -95071500.LBF 847 3.00 3052 14.4 -7.0 -32.9 6.5 6.9 13.9 15.9 24.7 159 0.7 2.1 -95062300.LBF 847 3.00 2962 12.9 -11.1 -36.7 7.9 7.0 15.3 21.0 19.8 220 1.7 2.8 -95043000.FTD 196 3.00 4416 15.0 -13.3 -43.2 8.1 8.2 15.6 21.9 31.7 166 3.4 3.4 -95021400.PBI 6 3.00 2433 16.5 -11.0 -41.1 5.9 8.1 13.8 27.1 33.4 117 1.4 0.6 -94060600.DDC 791 3.00 4882 14.8 -8.8 -37.2 8.7 7.6 13.1 15.6 18.6 248 1.9 2.1 -94052600.FNT 236 3.00 2240 10.8 -16.3 -46.6 6.1 8.4 12.8 17.8 25.8 113 1.0 2.4 -94032800.CKL 140 3.00 2066 15.3 -9.6 -33.7 6.3 6.4 30.5 38.6 36.3 429 1.1 0.6 -93091900.DDC 824 3.00 1954 12.4 -10.4 -35.2 7.2 6.7 16.8 29.5 46.6 233 1.2 2.8 -93091900.AMA 1094 3.00 1911 12.4 -9.0 -33.5 7.7 6.5 16.5 32.7 35.4 264 1.1 2.4 -93082300.DDC 790 3.00 2608 13.3 -7.8 -33.0 7.7 6.8 13.1 19.5 27.0 83 1.0 2.0 -93070900.OVN 487 3.00 5546 19.7 -6.8 -30.3 6.9 6.2 16.9 29.4 24.3 345 2.3 0.6 -93070200.DDC 816 3.00 4895 17.1 -5.2 -33.2 7.2 7.4 13.3 16.4 21.4 237 1.0 2.8 -93060600.HAT 4 3.00 4948 16.0 -13.5 -38.7 8.3 6.9 12.6 15.5 17.2 70 2.8 3.9 -93050600.MAF 873 3.00 3784 13.9 -9.6 -37.2 7.2 7.4 18.6 27.0 25.4 149 2.3 2.5 -92070500.OVN 400 3.00 5051 17.3 -9.3 -36.1 7.4 7.2 16.1 21.8 33.3 243 2.5 3.5 -92062700.MAF 873 3.00 3224 13.9 -8.2 -32.9 7.7 6.6 13.0 23.7 38.8 253 1.6 2.5 -92032600.TBW 13 3.00 2104 12.6 -14.0 -43.1 6.5 8.0 18.6 32.2 37.0 195 1.5 1.1 -91052700.DDC 791 3.00 5493 17.0 -10.5 -38.1 8.4 7.4 13.3 21.7 29.3 81 3.4 2.9 -91040912.1M1 172 3.00 3450 14.2 -15.2 -42.3 8.0 7.5 11.5 19.7 20.8 134 2.7 -999.0 -91032700.TOP 268 3.00 2763 12.7 -12.3 -39.3 6.8 7.4 21.6 27.7 31.7 279 1.9 2.5 -90052700.OUN 357 3.00 4621 17.5 -8.8 -37.3 7.6 7.7 20.4 23.8 25.1 255 2.4 3.2 -90051500.OUN 357 3.00 4798 16.8 -10.7 -38.4 7.8 7.5 12.5 19.8 29.7 186 2.6 4.2 -89060700.AMA 1095 3.00 4752 15.4 -9.5 -33.5 8.5 6.4 21.7 30.5 55.6 303 3.3 2.4 -89060500.OUN 357 3.00 1640 12.5 -11.6 -39.9 7.0 7.7 8.8 15.7 23.9 53 0.6 0.7 -72081200.YRM 988 3.00 1989 10.9 -14.2 -40.4 8.3 7.1 14.0 24.6 35.0 132 1.5 2.4 -06052800.BIS 506 3.00 3434 12.5 -11.1 -38.7 8.1 7.5 10.5 11.3 12.7 74 1.0 1.8 -06052700.BNA 210 3.00 3535 16.1 -8.3 -35.3 5.9 7.2 17.7 12.8 17.2 196 0.7 0.7 -06052500.SGF 387 3.00 3470 15.6 -11.1 -37.1 7.6 7.0 13.6 14.3 7.3 162 1.4 2.0 -06042500.OUN 357 3.00 4007 15.5 -12.3 -39.3 8.6 7.3 15.4 20.1 21.2 105 2.8 3.3 -06042412.LMN 317 3.00 3248 14.1 -12.9 -39.7 8.2 7.3 16.6 25.4 28.7 413 2.8 3.2 -04081000.DDC 790 3.00 3147 14.6 -9.7 -36.3 7.7 7.1 13.0 21.0 22.0 222 1.6 3.0 -04070200.AMA 1099 3.00 5137 16.9 -8.1 -37.7 7.4 7.9 18.0 14.0 16.6 80 1.4 3.0 -04052300.OAX 350 3.00 4333 15.6 -12.3 -40.7 7.6 7.8 19.6 32.4 28.9 289 3.6 3.0 -04051700.DDC 790 3.00 2200 10.0 -11.9 -41.3 8.4 8.0 20.5 31.7 30.2 390 1.6 1.5 -04042200.OUN 357 3.00 2363 12.2 -13.5 -39.5 7.0 7.1 16.9 24.3 33.8 385 1.6 2.7 -04041900.OAX 350 3.00 3136 11.9 -15.1 -40.5 8.2 7.0 20.5 33.8 44.9 394 3.0 1.9 -03062800.DDC 790 3.00 2329 11.4 -9.3 -38.9 6.7 8.0 10.8 16.9 26.8 138 0.7 2.2 -03062400.LBF 849 3.00 6189 18.6 -8.7 -38.9 8.1 8.1 21.7 30.8 31.6 381 3.8 4.8 -03050420.SGF 387 3.00 4524 15.8 -11.9 -40.7 7.1 7.8 25.2 35.4 47.9 480 3.3 3.2 -03042100.SHV 79 3.00 2947 15.5 -13.5 -38.7 7.5 6.8 14.3 24.0 38.0 110 2.3 0.9 -01090900.FWD 171 3.00 4304 17.1 -8.9 -35.7 8.2 7.1 7.7 14.1 12.0 97 1.4 2.7 -01053000.AMA 1099 3.00 5827 16.4 -9.7 -38.5 8.2 7.7 25.0 26.1 29.7 268 3.9 2.8 -01051900.LZK 78 3.00 4269 16.6 -12.5 -37.3 8.1 6.7 9.9 18.5 25.8 98 2.6 2.7 -00080600.OAX 350 3.00 5525 19.0 -7.1 -33.1 7.5 6.9 9.4 15.0 22.8 56 1.4 3.1 -00062900.MAF 872 3.00 3565 14.8 -6.3 -31.1 6.3 6.6 9.6 10.5 16.7 29 0.5 1.8 -00050400.FWD 196 3.00 2731 13.2 -14.3 -40.3 6.3 7.1 19.0 21.7 28.5 327 1.7 3.0 -99081800.LBF 849 2.75 5554 18.3 -8.9 -32.5 7.8 6.4 10.7 23.7 25.1 143 2.9 3.4 -99070100.MAF 872 2.75 3989 13.7 -2.5 -33.9 7.5 8.3 10.5 14.9 13.7 146 0.8 2.0 -99061900.DDC 790 2.75 4141 13.9 -11.3 -40.3 7.3 7.9 13.4 22.5 29.0 346 2.5 2.4 -99061200.AMA 1099 2.75 4400 14.7 -10.3 -36.3 7.7 7.0 18.8 26.2 36.6 210 3.0 2.4 -99060300.AMA 1099 2.75 5087 15.6 -10.3 -36.5 8.7 7.1 15.5 18.6 49.2 289 2.7 2.5 -98061400.OUN 357 2.75 6689 20.5 -6.5 -32.5 7.7 6.9 17.9 32.8 42.7 262 2.9 4.0 -98052500.DDC 790 2.75 2688 12.5 -12.1 -40.7 7.2 7.8 13.7 27.9 32.0 180 1.9 2.7 -98040900.BMX 178 2.75 3341 15.8 -13.9 -39.5 7.9 7.0 25.9 40.1 51.5 296 3.2 2.0 -97061600.DDC 790 2.75 3187 13.5 -10.9 -36.5 7.7 6.9 11.9 23.3 39.3 26 2.0 2.7 -97061200.TOP 270 2.75 1552 12.6 -11.7 -38.7 7.1 7.3 11.6 23.5 30.2 141 0.9 0.9 -97052700.SGF 387 2.75 4440 16.3 -9.9 -38.1 7.0 7.6 16.3 22.6 25.0 276 2.3 2.6 -97052700.OUN 357 2.75 5907 18.0 -8.7 -37.7 6.4 7.8 17.6 17.5 23.9 271 1.9 3.7 -97042100.SGF 387 2.75 1773 9.4 -16.5 -45.7 7.4 8.1 23.3 25.4 23.9 405 1.4 2.0 -97041100.MAF 873 2.75 4076 11.9 -15.0 -45.9 8.2 8.5 20.8 23.7 30.7 260 3.3 2.1 -97032900.BNA 180 2.75 1618 11.1 -15.6 -42.6 7.4 7.4 18.1 25.2 15.3 389 1.3 3.0 -97012500.SIL 8 2.75 2563 13.0 -16.5 -46.0 7.5 8.2 18.3 18.3 25.8 145 1.8 2.8 -96092100.FTD 196 2.75 2870 16.4 -9.4 -37.2 6.5 7.4 15.7 26.4 32.6 136 1.5 -999.0 -96083000.DEN 1611 2.75 2478 11.7 -9.1 -36.2 7.8 7.3 17.6 26.2 28.9 86 1.3 2.3 -96080100.DEN 1611 2.75 3920 13.5 -7.8 -34.9 8.5 7.3 15.0 22.6 26.3 276 1.9 2.1 -96072400.DDC 791 2.75 3068 14.3 -11.1 -36.0 8.6 6.7 16.8 27.6 36.6 203 2.6 2.7 -96062500.AMA 1095 2.75 3778 13.9 -9.4 -33.2 8.5 6.4 7.0 22.9 28.2 123 2.2 1.9 -96061400.LBF 847 2.75 2384 12.4 -8.6 -36.2 6.5 7.4 12.0 15.4 25.0 102 0.6 2.2 -96061300.FFC 246 2.75 2727 13.7 -9.1 -36.5 5.7 7.4 12.9 12.9 13.1 152 0.6 1.0 -96061200.AMA 1095 2.75 3079 11.9 -8.8 -38.1 8.0 7.9 18.3 24.3 30.2 373 1.5 1.9 -96060300.SGF 394 2.75 2739 11.7 -15.9 -42.2 7.1 7.2 14.8 26.4 35.9 90 2.3 2.1 -96060200.JAN 91 2.75 1863 16.1 -7.5 -32.6 5.5 6.8 11.3 12.7 20.3 168 0.3 0.6 -96060100.ABR 397 2.75 2276 12.6 -13.4 -40.4 6.2 7.4 24.6 22.4 27.2 370 1.3 2.2 -96053000.MAF 873 2.75 3675 14.9 -7.0 -32.9 7.7 6.9 19.0 35.1 40.6 321 1.7 2.5 -96052600.MAF 873 2.75 3464 14.1 -6.2 -36.5 7.7 8.1 22.5 28.7 42.1 240 1.4 2.9 -96052500.AMA 1095 2.75 3927 13.5 -11.3 -36.6 9.1 6.9 16.4 20.3 4.9 101 2.6 1.9 -96051800.OAX 350 2.75 4523 15.3 -11.1 -39.7 8.8 7.8 12.9 16.0 21.2 68 2.3 -999.0 -96051700.UNR 1037 2.75 4365 14.8 -8.1 -37.0 8.0 7.8 15.0 25.5 28.7 219 2.3 2.5 -96042200.TOP 268 2.75 1574 10.9 -16.6 -42.6 7.3 7.2 14.6 45.6 54.3 145 1.3 2.3 -96042200.OUN 362 2.75 2260 12.7 -10.9 -36.6 5.9 7.0 18.5 38.3 48.8 500 1.2 2.3 -96031600.FFC 246 2.75 890 9.6 -19.2 -39.7 7.8 5.7 20.5 28.8 55.2 353 0.9 2.2 -95081800.BIS 503 2.75 5585 18.4 -7.0 -34.2 7.7 7.3 10.6 10.6 17.3 142 1.0 3.3 -95072400.AMA 1095 2.75 2225 13.3 -7.8 -30.1 8.5 6.0 13.1 21.6 25.1 124 1.0 2.9 -95071500.GRB 210 2.75 5409 19.0 -8.5 -30.8 8.1 5.9 8.0 12.1 9.0 69 1.5 3.0 -95071200.OKX 20 2.75 2900 13.9 -15.6 -43.2 6.9 7.6 8.1 12.7 13.6 48 1.3 2.4 -95070300.DDC 791 2.75 2905 14.2 -9.6 -38.9 6.8 7.9 12.3 18.2 21.4 111 1.1 2.3 -95070300.AMA 1095 2.75 3838 14.7 -11.5 -36.5 8.8 6.8 8.2 22.8 29.0 115 2.9 2.5 -95062800.LBF 847 2.75 2880 12.4 -10.1 -37.2 7.7 7.3 13.9 22.0 19.7 208 1.5 2.5 -95062100.OKX 20 2.75 3918 17.1 -9.8 -34.9 7.1 6.7 11.4 18.4 25.8 18 1.6 1.0 -95060300.AMA 1095 2.75 3024 12.4 -9.6 -36.5 8.2 7.2 15.7 22.4 37.2 346 1.6 2.0 -95052200.LBF 847 2.75 2027 10.4 -14.9 -42.1 7.4 7.4 18.7 28.3 33.3 221 1.6 2.1 -95051400.UMN 438 2.75 5278 16.5 -10.3 -38.0 6.9 7.5 22.3 28.0 26.2 211 3.3 3.2 -95042000.FTD 196 2.75 2621 14.6 -13.3 -38.5 7.7 6.8 25.8 39.5 59.2 498 2.3 2.4 -95040900.TOP 268 2.75 2836 10.7 -17.5 -44.5 9.2 7.5 16.5 21.4 31.9 120 2.6 1.9 -94070700.HON 392 2.75 3051 16.5 -8.8 -35.7 7.2 7.2 10.2 20.5 18.6 159 1.3 0.6 -94070200.OAX 350 2.75 5257 18.5 -10.1 -33.0 8.0 6.2 15.5 26.5 25.4 416 3.6 3.2 -94070100.STC 315 2.75 3701 14.3 -11.6 -39.6 7.3 7.6 19.0 27.2 25.1 399 2.7 2.7 -94062600.JAN 106 2.75 2842 16.1 -9.5 -35.0 6.4 6.8 12.4 24.0 32.8 130 1.3 0.9 -94062500.HON 392 2.75 1962 11.8 -10.8 -39.7 6.4 7.8 15.4 27.8 33.5 211 1.0 2.2 -94061900.JAN 91 2.75 3177 16.8 -7.5 -32.7 5.9 6.7 3.8 11.5 12.4 42 0.5 0.6 -94061800.AMA 1095 2.75 2676 11.9 -7.0 -33.1 8.2 6.9 10.7 11.0 11.3 171 0.5 1.6 -94061200.TOP 268 2.75 2320 13.9 -9.5 -36.5 6.6 7.3 15.8 23.9 24.4 117 1.1 0.9 -94061200.AMA 1095 2.75 4015 14.7 -8.0 -33.7 7.8 6.9 18.4 26.7 19.9 302 2.2 2.7 -94061100.AMA 1095 2.75 2164 12.3 -8.3 -36.1 7.3 7.5 16.6 19.5 20.3 229 0.7 2.8 -94060600.TOP 268 2.75 3953 16.5 -9.3 -35.1 8.1 6.9 15.4 16.1 27.7 394 1.5 2.5 -94060500.HON 392 2.75 3871 14.2 -11.6 -38.7 8.5 7.4 12.0 21.4 19.2 202 2.6 2.4 -94053000.SEP 399 2.75 5032 17.5 -10.6 -36.6 8.2 7.0 16.1 27.0 23.8 291 3.8 3.9 -94052500.OUN 362 2.75 3912 15.0 -11.5 -38.1 7.4 7.2 13.2 22.0 36.2 122 2.4 3.0 -94041100.UMN 438 2.75 2040 12.6 -16.5 -41.0 7.6 6.7 19.9 37.8 45.4 486 2.1 2.5 -94012700.GGG 124 2.75 2167 13.2 -15.9 -42.4 6.8 7.3 17.5 31.0 32.3 306 2.0 0.7 -93102000.DRT 313 2.75 3433 15.5 -8.9 -36.3 6.4 7.4 13.4 25.4 34.0 35 1.6 1.6 -93101900.GGG 124 2.75 3105 15.7 -9.8 -36.9 6.9 7.3 10.3 23.5 33.9 105 1.6 0.7 -93101300.CRP 14 2.75 4367 17.3 -8.6 -37.2 6.3 7.7 14.8 20.2 29.8 227 1.5 1.5 -93090400.IAD 85 2.75 2779 15.6 -5.9 -32.6 5.7 7.1 12.4 15.2 15.6 149 0.5 0.6 -93070700.DDC 790 2.75 5334 17.0 -6.0 -36.1 7.2 8.0 16.5 27.9 28.2 154 2.0 3.1 -93070700.AMA 1094 2.75 5327 17.0 -4.7 -32.2 7.8 7.3 11.4 21.3 20.0 127 1.6 3.8 -93070500.DDC 790 2.75 4186 17.1 -5.4 -31.1 6.7 6.8 16.6 30.6 34.9 146 1.3 1.2 -93062400.LBF 849 2.75 3944 16.0 -8.6 -37.5 8.1 7.7 18.1 21.9 33.8 178 2.0 2.8 -93062400.DEN 1611 2.75 3442 11.7 -9.6 -38.0 8.8 7.8 15.8 32.0 42.3 211 2.2 1.8 -93061900.AMA 1094 2.75 2140 12.8 -7.8 -33.2 7.0 6.7 14.4 22.7 23.3 146 0.8 1.9 -93051600.DDC 790 2.75 3614 12.8 -9.8 -40.4 6.6 8.3 12.6 19.4 23.7 161 1.4 2.5 -93050600.AMA 1094 2.75 4478 13.2 -13.6 -38.2 8.6 6.7 16.6 34.6 38.4 340 4.5 2.0 -93050100.AMA 1095 2.75 4085 11.6 -14.5 -42.9 8.1 7.8 15.3 25.7 15.8 234 3.4 1.9 -93042900.MAF 873 2.75 2435 11.7 -10.9 -36.0 7.1 6.8 20.8 29.3 37.4 551 1.4 2.2 -93042800.MAF 873 2.75 1494 10.4 -10.6 -38.7 6.9 7.6 12.9 19.6 25.8 150 0.6 1.8 -93042500.UMN 438 2.75 2317 11.4 -14.6 -42.2 6.9 7.6 18.2 25.2 33.1 198 1.6 2.4 -93042000.GGG 168 2.75 2342 12.4 -13.3 -42.9 8.0 8.1 17.5 26.7 28.4 156 2.0 2.7 -93040200.WAL 13 2.75 1625 10.9 -18.5 -46.2 7.3 7.7 26.8 30.7 48.4 200 1.5 2.4 -93033100.UMN 440 2.75 2598 11.1 -16.5 -43.6 6.4 7.5 19.7 29.7 28.9 117 2.0 2.1 -93033100.1M1 204 2.75 2471 11.9 -15.1 -43.9 7.2 8.0 17.8 30.2 27.1 54 2.1 2.8 -92101600.SEP 399 2.75 3654 14.6 -12.1 -37.5 7.7 6.9 12.6 16.4 22.7 227 1.8 2.9 -92073000.LBF 847 2.75 3544 15.0 -10.3 -38.2 7.9 7.5 22.0 25.7 33.8 335 2.4 3.0 -92062700.AMA 1095 2.75 3165 14.1 -10.0 -34.2 7.7 6.5 12.4 16.6 29.9 191 1.3 2.9 -92061900.DDC 791 2.75 2598 12.8 -8.3 -34.7 7.9 7.1 15.7 25.1 40.5 114 1.3 2.7 -92061900.BIS 504 2.75 1791 11.0 -14.4 -39.4 6.9 6.9 13.0 27.4 24.4 106 1.3 2.5 -92061300.AMA 1095 2.75 2821 14.7 -8.8 -34.4 7.2 6.9 12.0 19.1 36.4 165 1.1 2.7 -92061200.MAF 873 2.75 2387 13.8 -8.2 -32.3 7.4 6.4 13.3 26.7 34.6 178 1.3 2.0 -92060500.AMA 1095 2.75 2870 13.4 -9.4 -37.0 7.5 7.4 12.2 17.5 25.9 249 1.1 2.6 -92030600.1M1 172 2.75 2572 11.5 -21.1 -44.4 7.2 6.5 17.3 22.5 26.7 194 2.4 2.3 -92021500.UMN 438 2.75 1724 10.2 -16.9 -44.0 6.4 7.5 24.2 33.2 28.2 289 1.3 2.2 -91072200.HON 392 2.75 4474 19.3 -6.8 -31.8 7.2 6.7 11.1 17.3 24.1 198 1.2 -999.0 -91070500.GGW 696 2.75 2308 11.4 -9.9 -38.5 7.0 7.7 6.7 17.5 23.9 144 0.8 2.2 -91070500.BIS 504 2.75 2941 13.3 -9.3 -37.6 6.4 7.6 19.3 21.4 26.6 206 1.2 2.4 -91062000.HON 392 2.75 2691 13.9 -10.5 -37.0 7.0 7.2 16.1 22.1 20.0 282 1.4 1.2 -91061900.LBF 847 2.75 3600 13.0 -12.0 -40.0 8.6 7.6 13.5 15.2 20.9 219 1.7 2.6 -91061500.GRB 210 2.75 3430 17.6 -8.7 -32.3 6.7 6.3 21.7 13.9 17.0 161 0.9 0.6 -91061500.BIS 504 2.75 2379 13.0 -11.9 -35.8 6.6 6.5 13.2 22.5 25.2 152 1.3 2.6 -91060500.OVN 400 2.75 2813 14.6 -10.1 -31.5 6.5 5.7 8.4 17.1 19.6 177 1.0 3.1 -91053000.RAP 966 2.75 2814 10.9 -15.7 -43.2 8.1 7.6 13.0 14.5 28.4 159 1.4 2.0 -91053000.OVN 400 2.75 4446 16.8 -10.2 -36.3 6.8 7.0 14.3 18.2 19.0 31 1.8 2.7 -91052500.AMA 1095 2.75 3416 13.7 -10.5 -37.1 7.0 7.2 17.0 17.4 13.8 124 1.4 2.5 -91051800.UMN 438 2.75 3444 15.1 -11.0 -34.2 7.4 6.2 9.4 11.9 21.0 59 1.1 1.2 -91051700.UMN 438 2.75 3299 15.9 -10.6 -35.6 7.6 6.7 14.4 16.1 11.8 174 1.4 1.9 -91051200.RAP 966 2.75 4430 14.1 -11.0 -39.1 7.9 7.6 26.6 23.5 33.5 437 2.9 2.5 -91051100.AMA 1095 2.75 5629 15.6 -10.7 -37.8 9.0 7.3 14.5 16.5 21.5 314 2.9 2.5 -91042800.GGG 124 2.75 4554 18.9 -10.5 -37.7 7.2 7.3 15.4 29.5 19.6 140 3.0 2.2 -91042700.OUN 357 2.75 4751 16.6 -11.5 -41.7 7.0 8.2 20.6 23.6 26.4 376 2.9 3.7 -91042700.GGG 124 2.75 5164 18.9 -10.7 -38.1 8.2 7.5 12.4 18.9 27.6 209 2.8 2.7 -91041300.OUN 357 2.75 4063 14.1 -13.7 -42.3 8.0 7.8 17.1 22.0 25.1 205 3.2 2.9 -91040300.OUN 357 2.75 1560 10.1 -19.8 -43.3 7.3 6.6 15.1 22.6 41.7 275 1.3 1.5 -91032700.DDC 791 2.75 3132 12.4 -14.2 -40.5 8.2 7.2 18.9 40.7 44.0 160 2.9 2.1 -91032200.UMN 438 2.75 2632 11.5 -15.3 -44.0 7.0 7.9 18.8 33.0 35.3 371 2.1 2.5 -90090600.STC 315 2.75 4899 19.5 -6.8 -33.9 6.2 7.2 14.7 21.0 17.1 294 1.4 1.0 -90082800.SSM 221 2.75 5115 18.2 -8.5 -36.7 6.2 7.5 20.5 31.6 29.9 334 2.4 1.1 -90081100.LBF 847 2.75 3971 14.8 -9.0 -36.8 7.5 7.5 14.3 25.6 21.5 282 2.2 2.9 -90070700.BIS 504 2.75 3274 14.9 -7.5 -34.7 6.9 7.3 12.9 19.0 25.7 316 1.0 2.2 -90070300.BIS 504 2.75 6982 21.3 -6.3 -31.9 8.2 6.8 14.9 23.0 29.6 172 2.7 4.6 -90061900.LBF 847 2.75 7070 19.2 -6.1 -35.5 8.4 7.9 18.5 30.2 38.1 266 3.2 3.6 -90060200.STC 315 2.75 2697 13.4 -13.3 -39.7 8.5 7.2 10.4 18.6 17.2 132 1.8 2.2 -90060200.LBF 847 2.75 3719 13.6 -10.8 -39.9 7.9 7.9 16.4 15.6 29.4 89 1.6 2.4 -90053100.GGG 124 2.75 4743 19.3 -5.7 -33.3 6.1 7.3 21.5 27.2 25.7 317 1.4 0.7 -90052000.OUN 357 2.75 4565 15.3 -10.8 -39.0 7.1 7.6 12.1 13.7 14.7 94 1.6 3.1 -90051900.LBF 847 2.75 3954 12.1 -13.9 -42.1 8.6 7.8 16.2 25.1 24.6 398 3.4 2.0 -90051700.GGG 124 2.75 3234 17.5 -8.3 -36.2 7.2 7.4 17.6 24.7 35.1 304 1.5 0.6 -90050100.AHN 246 2.75 4557 14.9 -12.6 -41.5 7.7 7.9 19.7 14.7 9.3 92 2.1 3.4 -90042800.GGG 124 2.75 2263 12.9 -14.9 -41.0 6.6 7.1 12.8 14.1 25.3 84 1.0 2.8 -90041700.OUN 357 2.75 3717 13.6 -15.0 -44.3 8.3 8.1 17.2 11.5 20.5 152 1.7 3.8 -90031400.PIA 200 2.75 2115 12.4 -14.4 -41.2 6.9 7.4 15.3 18.1 24.1 206 1.1 2.6 -90021600.JAN 91 2.75 2047 15.2 -10.9 -40.4 6.6 8.0 18.9 20.9 34.6 124 1.0 -999.0 -89090400.LBF 847 2.75 4599 17.3 -8.6 -36.0 8.3 7.3 8.6 29.6 38.8 223 2.9 3.3 -89082900.STC 315 2.75 1959 14.6 -10.0 -35.2 6.8 6.8 18.0 26.3 44.7 147 1.1 1.1 -89082200.STC 315 2.75 3346 16.2 -11.1 -35.6 6.9 6.7 11.9 20.6 30.6 173 1.7 1.2 -89082200.OMA 400 2.75 4223 17.9 -8.3 -30.9 7.0 6.0 15.0 22.2 45.4 138 1.8 0.9 -89082200.HON 392 2.75 4160 15.6 -9.4 -38.2 6.9 7.8 14.8 22.9 28.9 107 2.0 3.3 -89081600.AMA 1095 2.75 2669 12.8 -7.1 -34.8 6.9 7.4 10.5 17.0 24.9 158 0.7 2.5 -89062600.RAP 966 2.75 2246 11.5 -13.8 -40.7 7.8 7.4 20.0 31.3 30.4 301 1.8 2.6 -89061300.AMA 1095 2.75 3611 14.4 -10.8 -36.6 8.1 7.0 9.9 15.8 22.1 79 1.6 3.0 -89060300.TOP 268 2.75 2623 13.7 -12.6 -38.3 7.0 7.0 12.4 19.5 39.7 118 1.5 2.0 -89060300.MAF 873 2.75 2291 11.9 -8.4 -34.6 7.6 7.0 13.3 19.3 32.2 147 0.8 2.2 -89060200.MAF 873 2.75 3193 14.1 -10.4 -34.9 7.9 6.6 8.5 24.5 27.4 104 2.1 2.8 -58042200.FWH 180 2.75 3338 13.3 -16.1 -39.0 7.8 6.3 25.5 37.0 49.4 276 3.6 2.4 -07021400.BMX 178 2.75 1032 9.9 -19.1 -44.7 7.0 7.1 19.5 20.7 36.3 245 0.7 2.4 -06082600.DDC 790 2.75 3488 16.5 -5.5 -31.7 6.5 6.9 17.6 20.2 26.5 141 0.8 0.8 -06081000.BIS 506 2.75 2589 13.0 -8.9 -35.7 7.5 7.2 8.8 19.1 18.8 147 1.0 2.6 -06062200.DDC 790 2.75 2406 12.7 -8.7 -34.9 8.1 7.0 11.0 21.1 24.9 175 1.1 2.4 -06050800.MAF 872 2.75 2440 11.9 -12.5 -36.9 8.0 6.6 22.1 33.3 51.2 327 1.9 2.3 -06050718.CHS 15 2.75 2580 12.9 -12.5 -40.1 6.0 7.5 15.9 17.7 18.8 177 1.1 2.0 -06050500.MAF 872 2.75 3709 11.5 -12.1 -42.7 8.1 8.4 21.7 27.6 34.4 372 2.7 1.7 -06050300.DRT 313 2.75 3549 13.7 -12.1 -37.1 8.5 6.8 5.1 14.2 19.0 74 1.7 2.1 -06042000.BMX 178 2.75 2242 13.1 -11.9 -37.1 7.1 6.8 11.3 21.7 27.0 122 1.3 2.1 -06041400.DVN 229 2.75 1524 11.2 -15.7 -35.1 8.3 5.6 15.8 30.6 30.3 263 1.4 3.4 -06031218.TOP 270 2.75 2814 12.6 -17.9 -44.3 8.5 7.3 33.9 44.8 54.9 723 3.5 2.7 -05092300.ILX 178 2.75 1858 14.1 -8.1 -33.3 6.9 6.7 11.5 21.5 16.8 121 0.7 0.8 -05051000.FWD 171 2.75 4841 15.5 -11.5 -42.1 6.7 8.3 9.5 18.0 25.9 152 2.2 2.9 -05042300.JAN 101 2.75 2558 13.6 -14.7 -39.7 7.1 6.9 19.9 28.5 34.1 183 2.3 2.7 -05042100.DDC 790 2.75 4722 13.2 -15.3 -43.5 8.6 7.7 15.2 16.1 14.9 174 3.1 2.1 -05041800.AMA 1099 2.75 1767 9.4 -17.3 -43.3 8.7 7.2 15.5 19.6 22.9 211 1.4 1.9 -05022200.FFC 244 2.75 1389 11.4 -16.3 -43.1 7.0 7.4 20.7 28.5 35.4 225 1.2 1.7 -04070500.DDC 790 2.75 3819 14.3 -10.3 -37.7 8.3 7.4 14.4 18.6 30.5 161 2.0 2.5 -04060300.FWD 171 2.75 4767 16.9 -11.1 -36.5 8.7 6.9 14.1 19.1 24.1 157 2.9 -999.0 -04053000.TOP 270 2.75 3882 15.9 -12.9 -39.3 8.7 7.1 14.8 22.4 15.3 295 3.2 3.2 -04051300.OUN 357 2.75 5740 16.8 -11.5 -40.5 8.2 7.9 12.4 15.2 20.9 131 2.7 3.6 -04051223.LMN 317 2.75 4076 15.9 -10.5 -40.3 7.4 8.1 21.9 22.7 30.4 304 2.3 2.4 -04051100.DNR 1625 2.75 3995 10.6 -12.9 -41.1 9.2 7.8 18.2 28.3 16.6 379 3.4 1.5 -04050600.WAL 12 2.75 1861 9.3 -21.3 -47.5 7.2 7.4 21.3 20.2 28.3 239 1.5 1.4 -04040500.CRP 13 2.75 2478 14.9 -12.1 -39.1 6.7 7.3 7.0 22.4 20.6 184 1.5 0.6 -04032800.OUN 357 2.75 2904 12.6 -15.9 -44.3 7.8 7.8 16.4 23.3 31.1 315 2.5 2.8 -04032718.DDC 790 2.75 4133 13.2 -17.3 -42.1 8.0 6.9 14.4 24.6 26.6 143 4.4 2.3 -03100600.AMA 1099 2.75 2542 12.2 -10.3 -39.3 6.4 7.8 12.9 24.1 30.2 50 1.2 2.5 -03091100.MAF 872 2.75 2808 13.3 -6.5 -32.5 6.8 6.9 7.4 10.3 9.0 80 0.4 1.4 -03091000.DDC 790 2.75 3620 14.8 -7.7 -34.7 7.5 7.2 11.3 12.1 15.8 233 0.8 3.0 -03061400.AMA 1099 2.75 3153 12.3 -13.3 -39.3 8.3 7.1 13.7 21.7 24.7 35 2.2 2.1 -03060500.AMA 1099 2.75 2647 11.9 -11.9 -36.9 7.6 6.8 13.1 23.0 28.5 167 1.5 2.1 -03051700.SHV 79 2.75 3995 16.3 -10.9 -37.3 7.4 7.2 19.6 23.2 13.9 242 2.4 2.7 -03051600.AMA 1099 2.75 3706 14.1 -10.3 -37.5 8.9 7.4 34.9 42.9 37.7 632 3.0 -999.0 -03051400.SHV 79 2.75 3920 16.7 -9.5 -38.5 7.2 7.8 19.3 27.2 37.0 389 2.3 0.8 -03051000.OUN 357 2.75 5328 16.8 -11.1 -38.1 8.3 7.3 16.8 27.5 34.8 182 4.3 3.6 -03050700.FWD 171 2.75 5303 17.8 -9.7 -37.7 7.1 7.5 8.4 30.4 36.2 126 3.2 3.5 -03050618.SGF 387 2.75 5492 15.6 -14.7 -43.9 7.7 8.0 17.8 32.0 40.6 313 5.5 2.8 -03050100.TOP 270 2.75 3922 13.0 -14.1 -43.5 7.8 8.1 13.9 17.2 19.6 117 2.3 2.7 -03042900.SGF 387 2.75 3399 13.1 -16.7 -43.3 8.5 7.3 4.8 5.0 19.6 53 1.1 2.8 -03042600.BMX 178 2.75 3921 14.2 -13.3 -41.1 6.2 7.6 26.6 35.8 33.5 89 2.8 2.7 -03042500.LZK 78 2.75 3423 13.8 -15.7 -43.1 7.6 7.6 20.0 20.9 31.0 212 2.8 3.3 -03040618.LZK 78 2.75 2556 13.1 -15.9 -41.3 7.6 7.0 28.4 35.1 38.9 600 2.6 3.1 -03031300.SHV 79 2.75 2901 13.5 -15.3 -43.1 7.1 7.7 11.0 17.1 24.1 162 1.7 2.0 -02081200.LBF 849 2.75 3735 13.3 -9.9 -37.1 8.7 7.3 10.5 13.1 11.8 222 1.3 2.1 -02072700.TOP 270 2.75 6406 19.3 -5.3 -32.5 6.9 7.1 9.1 18.2 19.3 131 1.4 2.6 -02072000.TOP 270 2.75 4986 17.5 -7.5 -32.9 7.3 6.8 8.5 10.0 12.7 197 0.9 2.7 -02062500.ABR 396 2.75 4208 15.1 -7.1 -37.7 6.8 8.2 11.1 19.1 19.3 20 1.3 3.1 -02062400.BIS 506 2.75 3559 16.0 -9.7 -34.1 6.8 6.6 25.2 28.0 24.8 298 2.1 2.4 -02061300.AMA 1099 2.75 3027 13.7 -8.5 -31.9 8.4 6.3 18.7 29.6 33.0 65 1.9 2.5 -02060500.AMA 1099 2.75 2947 13.2 -11.5 -38.3 7.6 7.3 17.9 32.1 45.0 309 2.2 2.7 -02052400.AMA 1099 2.75 4729 13.8 -13.3 -39.9 8.3 7.2 18.5 28.8 21.8 258 4.5 2.3 -02051800.DRT 313 2.75 5077 16.0 -10.5 -37.1 8.1 7.2 5.2 8.8 6.3 15 1.2 2.6 -01112418.BMX 178 2.75 2902 15.1 -11.3 -39.7 6.1 7.7 22.2 26.9 31.9 328 1.7 0.8 -01072500.GGW 700 2.75 1714 11.5 -11.3 -36.3 6.9 6.8 18.2 26.7 32.1 350 1.0 2.2 -01071900.BIS 506 2.75 5738 17.8 -9.9 -36.1 8.6 7.1 14.1 21.8 28.8 183 3.4 2.9 -01071900.ABR 396 2.75 5356 17.5 -10.5 -35.1 8.8 6.6 3.4 18.1 22.7 35 2.9 2.7 -01071800.INL 361 2.75 4580 17.0 -12.9 -37.7 7.8 6.7 11.8 11.9 12.8 154 1.8 0.8 -01070100.RAP 1029 2.75 3235 14.3 -10.7 -35.7 7.7 6.8 12.9 30.8 40.7 114 2.3 2.6 -01061900.MPX 287 2.75 5114 15.6 -11.9 -39.3 9.2 7.5 19.0 33.1 31.9 154 4.9 3.4 -01061700.TOP 270 2.75 4594 15.7 -13.7 -41.9 8.5 7.8 15.7 22.1 26.6 214 3.8 3.4 -01061700.LMN 317 2.75 4093 14.1 -10.7 -37.9 8.0 7.3 9.3 19.4 26.9 195 2.2 3.5 -01061400.OAX 350 2.75 4956 17.2 -11.3 -38.5 9.0 7.4 18.5 20.4 25.5 153 3.3 3.8 -01061000.ABR 396 2.75 3453 13.8 -12.1 -39.9 7.8 7.5 16.6 24.6 32.3 158 2.6 3.6 -01060800.DNR 1625 2.75 3440 13.9 -8.7 -36.7 7.2 7.6 7.4 25.3 21.9 -26 1.8 3.1 -01060600.AMA 1099 2.75 4665 14.9 -8.9 -36.7 7.2 7.5 11.9 15.8 15.6 191 1.5 2.3 -01052500.FFC 244 2.75 2338 11.7 -14.5 -43.1 6.4 7.9 19.6 18.1 21.4 240 1.1 2.5 -01050620.LMN 317 2.75 4496 15.4 -16.1 -43.1 7.3 7.5 7.3 11.5 20.9 60 2.0 3.1 -01042100.OAX 350 2.75 3283 12.4 -15.3 -43.1 7.7 7.7 23.5 28.1 32.7 282 3.1 2.4 -01040400.LZK 78 2.75 4223 15.2 -15.1 -42.1 8.5 7.4 11.9 18.1 24.8 105 3.2 3.1 -00121618.BMX 178 2.75 2219 13.2 -14.1 -42.7 6.7 7.9 25.0 32.9 45.8 266 1.8 0.9 -00072700.OAX 350 2.75 5048 18.5 -9.7 -35.3 8.0 6.9 16.7 21.8 23.2 215 2.8 2.6 -00072500.LBF 849 2.75 5901 17.1 -8.9 -38.1 8.5 7.8 22.2 24.5 29.4 162 3.5 2.9 -00072100.LBF 849 2.75 3073 15.3 -11.3 -37.5 7.8 7.1 16.9 26.5 39.4 223 2.3 2.0 -00071700.MHX 11 2.75 2929 15.1 -12.3 -36.1 7.2 6.4 7.9 18.2 29.9 81 1.5 2.3 -00071000.LBF 849 2.75 5871 18.1 -5.5 -32.5 7.8 7.2 10.7 14.3 19.9 146 1.2 3.5 -00071000.GGW 700 2.75 3180 15.6 -10.9 -35.1 7.0 6.5 23.2 18.4 13.5 248 1.5 2.6 -00062000.LBF 849 2.75 4028 14.9 -8.5 -37.9 6.8 7.9 11.9 18.8 23.9 96 1.4 3.0 -00061400.AMA 1099 2.75 5758 16.5 -4.9 -34.9 7.6 7.9 19.9 23.8 32.0 244 1.8 2.5 -00061200.BIS 506 2.75 2000 11.3 -13.1 -39.9 7.5 7.4 10.2 22.0 28.0 306 1.2 2.5 -00052700.OUN 357 2.75 5870 18.3 -10.1 -37.9 8.4 7.5 12.8 21.5 32.8 117 3.5 4.0 -00051300.DTX 329 2.75 4524 16.9 -8.5 -37.3 7.7 7.7 20.2 24.1 18.5 328 2.3 2.4 -00022500.AMA 1099 2.75 3614 10.3 -18.5 -46.1 8.5 7.7 13.1 26.8 48.5 107 4.0 1.7 -98071100.DDC 790 2.50 4323 18.9 -4.3 -29.9 6.2 6.8 16.0 12.7 15.2 230 0.6 0.6 -96072200.LBF 847 2.50 4756 18.4 -6.5 -34.7 7.2 7.5 19.0 20.0 29.4 94 1.4 2.1 -96071900.GRB 210 2.50 4746 20.7 -7.5 -31.3 6.4 6.3 20.0 26.3 26.2 164 1.9 0.7 -96062100.DEN 1611 2.50 5603 15.2 -8.1 -36.1 9.6 7.6 8.8 27.5 33.4 155 3.8 2.2 -96061200.LBF 847 2.50 2310 11.7 -9.9 -37.5 7.5 7.4 12.7 16.7 22.2 122 0.8 2.4 -96060300.AMA 1095 2.50 2356 11.0 -10.5 -39.7 6.9 7.9 18.0 27.6 31.6 256 1.2 2.0 -96060100.DDC 791 2.50 2888 13.3 -10.9 -38.5 8.3 7.4 13.9 13.3 19.3 111 1.1 2.5 -96051800.MPX 287 2.50 4406 16.3 -8.9 -38.5 8.2 8.0 20.7 13.0 23.4 259 1.4 3.4 -96042200.FTD 196 2.50 1872 12.0 -12.6 -38.7 8.2 7.1 18.3 27.1 34.0 298 1.5 -999.0 -96030700.TLH 26 2.50 2615 15.4 -10.4 -39.0 6.0 7.7 20.7 20.9 23.7 320 1.1 0.6 -95081212.MPX 287 2.50 3361 19.1 -6.3 -31.3 7.2 6.7 23.0 20.6 36.8 164 1.0 -999.0 -95061600.TFX 1130 2.50 3142 13.0 -12.0 -37.7 8.4 7.0 23.8 27.7 35.6 277 2.7 2.3 -95060700.DEN 1611 2.50 3137 12.3 -10.8 -35.7 9.2 6.8 20.7 37.2 35.9 284 2.4 2.0 -95052912.MAF 873 2.50 1617 13.0 -11.3 -37.2 7.5 7.0 13.7 27.6 22.0 284 1.1 1.9 -95051900.GSO 277 2.50 1758 13.4 -11.8 -35.2 7.9 6.3 23.6 25.3 27.1 83 1.3 -999.0 -95051600.MAF 873 2.50 3261 13.6 -7.8 -34.0 8.4 7.1 10.3 21.7 28.8 134 1.5 1.8 -95050900.TOP 268 2.50 1495 10.0 -19.3 -39.2 6.9 5.6 21.2 19.3 22.8 126 1.0 1.2 -95050800.LCH 5 2.50 3259 17.9 -9.9 -35.6 7.1 6.9 10.2 16.7 31.1 119 1.2 0.6 -95050800.FTD 196 2.50 2700 16.5 -10.4 -38.9 7.7 7.7 24.5 30.8 30.8 407 1.9 0.8 -94062600.TOP 268 2.50 4265 16.4 -8.6 -35.2 8.4 7.1 21.6 25.2 45.9 418 2.5 2.9 -94032800.AHN 246 2.50 2627 14.4 -10.5 -35.7 6.2 6.8 30.4 34.5 24.7 518 1.5 0.7 -93070300.TOP 270 2.50 4019 18.5 -7.2 -31.5 7.1 6.5 15.2 15.8 16.4 202 1.0 0.7 -93070200.HON 392 2.50 2619 14.6 -11.3 -39.6 7.0 7.7 12.6 28.3 40.3 143 1.8 0.8 -93061400.TOP 270 2.50 4195 16.5 -8.5 -35.1 7.7 7.1 10.7 12.5 17.8 65 1.1 2.8 -93033000.DRT 314 2.50 2680 12.7 -13.4 -39.4 8.2 7.1 26.0 39.6 44.0 411 2.4 2.8 -92070200.DEN 1611 2.50 2313 11.7 -11.2 -35.2 8.0 6.5 20.0 27.6 29.9 362 1.6 2.5 -92041600.AMA 1095 2.50 3362 11.1 -13.4 -40.9 7.6 7.5 12.0 16.0 17.8 127 1.5 1.7 -92030400.SEP 399 2.50 2676 12.7 -15.3 -44.8 7.7 8.1 9.2 20.1 27.2 133 1.9 2.3 -91080200.CAR 191 2.50 1891 12.3 -13.7 -41.6 6.3 7.6 11.9 19.6 33.3 223 0.9 1.8 -91071800.STC 315 2.50 4956 18.2 -8.7 -32.0 7.3 6.3 21.9 18.7 20.1 104 1.9 2.5 -91053100.DEN 1611 2.50 3551 12.0 -12.1 -39.1 9.5 7.4 10.7 27.3 45.8 149 3.1 1.9 -91052700.LBF 847 2.50 2669 11.9 -13.4 -38.4 7.9 6.8 13.0 13.9 32.3 35 1.1 2.1 -91051200.AMA 1095 2.50 4539 14.3 -10.8 -37.8 8.5 7.3 16.7 12.4 14.9 208 1.7 2.3 -91050800.MAF 873 2.50 3415 11.2 -14.8 -41.4 8.4 7.3 25.4 31.1 36.7 280 3.1 1.6 -91042100.AYS 44 2.50 2563 11.8 -16.9 -41.9 7.4 6.9 10.3 13.4 30.0 76 1.2 1.7 -91041900.SEP 399 2.50 5996 17.6 -13.2 -38.3 7.4 6.8 13.0 13.5 44.8 24 2.6 3.1 -90083100.CHS 13 2.50 2477 16.0 -8.5 -33.3 6.5 6.6 8.3 17.0 17.7 67 0.8 0.6 -90070200.GSO 277 2.50 3963 14.8 -10.0 -35.9 7.2 7.0 10.7 26.0 16.3 100 2.4 2.2 -90062200.ALB 86 2.50 1833 12.6 -14.1 -41.8 6.7 7.6 20.6 32.5 29.1 203 1.4 1.6 -90061500.DDC 791 2.50 4667 16.0 -6.5 -35.9 7.9 7.8 15.7 28.4 30.1 306 2.1 2.7 -90060700.DEN 1611 2.50 2393 10.9 -8.2 -36.5 9.0 7.6 19.6 26.3 23.9 170 1.2 1.6 -90060300.PAH 126 2.50 3663 17.8 -7.6 -36.2 7.0 7.6 29.8 24.0 25.9 367 1.5 0.6 -08110600.OUN 357 2.50 1623 11.4 -12.5 -39.9 6.9 7.5 24.8 29.8 32.7 317 1.0 2.4 -06071123.LMN 317 2.50 2996 16.5 -5.9 -29.5 6.7 6.2 9.4 12.6 11.2 110 0.5 0.6 -06062500.DNR 1625 2.50 987 7.1 -11.5 -38.9 8.9 7.4 12.5 26.1 26.5 -172 0.7 0.9 -06061400.RAP 1029 2.50 2691 11.5 -7.7 -35.5 8.3 7.5 15.3 17.3 24.5 248 0.8 1.6 -06052600.SGF 387 2.50 3409 13.9 -9.5 -39.1 6.5 8.0 18.8 18.9 23.2 262 1.3 2.5 -06050900.JAN 101 2.50 3303 16.1 -13.3 -38.7 7.3 6.9 14.9 28.4 39.9 170 2.8 1.9 -05050700.MAF 872 2.50 3257 10.7 -12.3 -41.3 8.0 7.9 11.2 20.3 24.6 48 1.7 1.6 -05050322.XMR 3 2.50 2165 13.4 -13.9 -38.9 7.6 6.8 21.5 23.3 41.5 82 1.7 1.2 -04102400.JAN 101 2.50 1938 15.8 -6.9 -33.5 5.3 7.1 19.3 30.8 27.8 328 0.6 0.6 -04091500.LBF 849 2.50 1474 12.8 -10.7 -38.3 8.0 7.4 20.5 35.4 39.8 306 1.0 -999.0 -04080700.ABR 396 2.50 2792 13.1 -9.3 -36.7 6.7 7.4 12.1 21.0 25.9 240 1.1 2.5 -04040400.EPZ 1252 2.50 4482 12.1 -17.9 -46.3 8.2 7.9 11.6 29.1 25.4 203 5.1 2.1 -04032718.OUN 357 2.50 2825 12.6 -14.9 -42.3 7.3 7.6 11.5 21.1 32.3 199 2.0 2.1 -03062200.RAP 1029 2.50 3380 10.6 -13.7 -39.5 8.0 7.1 18.7 27.5 42.2 189 2.6 1.5 -03051500.SHV 79 2.50 4260 16.8 -9.9 -36.1 6.8 7.1 16.3 33.7 42.9 246 2.5 0.8 -02072500.ABR 396 2.50 3995 15.0 -11.5 -38.9 7.9 7.5 13.8 28.3 28.6 207 3.2 3.0 -02051700.AMA 1099 2.50 5036 13.8 -12.7 -40.5 8.7 7.6 17.4 21.9 26.5 216 3.9 2.2 -02041900.DVN 229 2.50 2861 12.3 -14.5 -39.9 8.2 7.0 15.9 14.1 20.0 213 1.4 2.5 -02041212.AMA 1099 2.50 2907 12.2 -13.7 -42.7 7.5 7.9 14.6 20.4 25.1 184 1.8 2.8 -02040300.JAX 9 2.50 3327 14.8 -14.3 -41.7 7.2 7.4 11.8 11.5 30.9 80 1.3 1.5 -01101000.DDC 790 2.50 3299 12.9 -9.7 -40.3 6.4 8.3 16.4 18.8 18.3 275 1.2 2.5 -01082400.AMA 1099 2.50 4318 15.4 -6.7 -34.3 7.4 7.4 21.0 24.0 28.1 158 1.7 2.8 -01070500.LBF 849 2.50 3571 14.5 -7.7 -36.3 7.7 7.6 17.1 26.0 27.0 313 1.8 2.9 -01070400.RAP 1029 2.50 3145 13.2 -11.1 -37.9 8.3 7.3 12.9 25.2 26.1 144 2.3 2.6 -01052620.LMN 317 2.50 4355 14.1 -13.5 -40.9 6.4 7.5 20.2 27.3 33.2 233 3.3 2.9 -01052500.BMX 178 2.50 2388 11.9 -14.9 -43.1 6.7 7.7 23.5 29.2 27.4 436 1.8 2.7 -01050400.MAF 872 2.50 3866 13.7 -11.3 -36.7 7.2 6.9 11.4 12.8 33.8 101 1.3 2.7 -01050100.OAX 350 2.50 2265 10.4 -16.9 -44.5 7.7 7.7 19.2 17.4 17.0 226 1.3 2.2 -01042200.DDC 790 2.50 3749 13.3 -12.1 -41.1 7.3 7.9 24.2 33.4 45.3 510 2.8 2.7 -01041700.MAF 872 2.50 4552 13.9 -12.1 -39.1 7.5 7.3 8.0 16.2 30.6 100 2.2 2.2 -00091100.MPX 287 2.50 4554 16.6 -10.3 -39.5 7.0 7.9 18.4 22.0 24.0 271 2.4 3.2 -00080500.BIS 506 2.50 4830 17.0 -8.7 -35.1 6.9 7.2 4.0 17.2 22.9 86 1.6 3.3 -00070600.LBF 849 2.50 5506 18.2 -7.1 -32.3 8.3 6.6 11.8 25.3 35.5 155 2.6 3.5 -00070200.ABR 396 2.50 5952 17.8 -10.3 -38.1 8.4 7.5 8.1 12.2 23.4 147 2.0 3.9 -00062400.OAX 350 2.50 4783 17.5 -8.7 -35.5 7.2 7.2 14.9 18.7 28.2 195 1.8 2.3 -00061000.RAP 966 2.50 3610 13.2 -8.1 -37.9 7.8 8.0 11.9 14.3 21.1 70 1.0 2.1 -00052300.MHX 11 2.50 3613 15.1 -13.5 -41.7 6.5 7.7 10.5 15.3 26.5 79 1.6 2.4 -00051200.DVN 229 2.50 4865 15.6 -8.1 -39.3 7.4 8.4 19.3 24.8 24.9 225 2.3 3.4 -00050100.FWD 196 2.50 3593 14.3 -13.1 -41.5 7.2 7.8 19.0 17.3 18.5 401 1.9 1.7 -00032700.SGF 387 2.50 1766 9.8 -18.3 -45.1 7.5 7.4 21.4 34.3 43.9 350 1.7 2.2 -00021400.LZK 165 2.50 2091 10.7 -20.3 -45.7 6.4 7.1 22.2 21.1 24.5 245 1.5 2.1 -00061300.OAX 350 2.25 5453 17.7 -11.5 -38.7 8.5 7.3 12.9 15.8 19.3 206 2.7 4.0 -99053100.TOP 270 2.00 2215 13.1 -10.9 -39.7 6.8 7.8 14.7 18.6 12.2 189 1.0 1.4 -99050400.DRT 307 2.00 5609 17.4 -10.1 -40.7 7.5 8.3 21.2 40.5 38.9 342 3.7 4.6 -98063000.BUF 215 2.00 2615 14.5 -10.5 -38.3 6.1 7.5 8.5 23.6 28.2 86 1.3 1.7 -98062500.APX 448 2.00 3453 15.8 -11.3 -34.3 7.3 6.2 21.9 28.9 35.4 348 2.5 3.3 -98033100.FWD 196 2.00 2873 13.3 -14.3 -40.7 7.2 7.2 17.6 29.6 57.5 93 2.5 2.9 -90091400.STC 315 2.00 2123 13.1 -10.9 -38.5 7.4 7.5 23.2 27.8 39.0 564 1.4 -999.0 -90072600.TBW 13 2.00 4330 18.4 -6.3 -31.8 5.7 6.8 6.3 3.5 8.5 7 0.4 0.6 -90061400.PIA 200 2.00 3570 18.1 -7.0 -32.9 7.0 6.9 9.5 16.5 23.4 134 0.9 0.6 -90060900.PIT 360 2.00 4095 16.7 -9.5 -35.8 6.7 7.0 18.8 18.1 13.6 236 1.5 1.0 -89103000.OUN 357 2.00 2163 12.5 -14.7 -42.6 6.6 7.6 13.1 18.0 18.1 195 1.1 1.6 -89082100.LBF 847 2.00 3307 14.8 -9.1 -35.7 7.1 7.1 8.0 28.0 44.7 83 1.9 3.0 -89071100.HON 392 2.00 3126 15.7 -7.0 -31.9 6.9 6.6 12.3 14.6 18.6 151 0.7 1.2 -89052800.ELP 1199 2.00 2569 11.2 -6.8 -34.2 8.0 7.3 14.9 11.3 17.1 232 0.4 1.4 -06090100.DDC 790 2.00 1972 12.2 -7.7 -34.9 7.1 7.2 13.9 15.6 27.4 363 0.5 1.6 -06062700.ILX 178 2.00 2025 12.2 -15.7 -43.1 6.4 7.6 5.2 3.5 11.7 15 0.4 1.2 -06061400.TFX 1131 2.00 2827 12.3 -9.7 -36.9 8.1 7.3 14.3 15.9 28.9 65 1.0 2.1 -06052400.DDC 790 2.00 1607 10.2 -8.7 -36.9 7.6 7.6 17.0 22.4 19.3 189 0.6 1.8 -06051600.MFL 5 2.00 2473 15.8 -11.1 -35.3 6.8 6.6 18.7 26.6 21.2 227 1.6 0.6 -06050800.DDC 790 2.00 1674 9.5 -17.1 -43.7 8.9 7.4 16.1 16.8 27.8 248 1.1 2.6 -06041600.TOP 270 2.00 2191 12.2 -12.9 -37.7 8.2 6.7 28.5 37.2 42.6 533 1.8 2.9 -06040700.TOP 270 2.00 2249 11.0 -15.1 -41.9 7.4 7.4 15.8 35.7 27.3 206 1.8 2.1 -05050900.LMN 317 2.00 2971 12.0 -16.1 -42.3 7.8 7.2 15.9 15.1 29.6 290 1.6 2.2 -05050700.LBF 849 2.00 3058 9.7 -14.3 -42.7 8.2 7.9 6.1 12.5 21.7 135 1.2 1.4 -05022100.SGF 387 2.00 1128 9.1 -18.9 -48.7 6.8 8.3 17.1 27.7 36.6 97 1.0 1.9 -04091200.GRB 214 2.00 2256 12.3 -14.9 -39.7 7.2 6.8 11.6 14.7 24.8 64 1.0 1.0 -04082400.BIS 506 2.00 2596 13.4 -11.1 -36.5 7.6 6.9 16.4 21.3 22.3 208 1.5 2.2 -04072300.TOP 270 2.00 3276 16.0 -7.7 -31.5 6.4 6.3 11.4 15.8 19.6 158 0.8 0.7 -04062400.GRB 214 2.00 1604 10.4 -16.9 -45.3 6.3 7.9 16.4 25.3 36.9 128 1.1 2.4 -04052200.DDC 790 2.00 3809 13.5 -9.7 -37.9 8.1 7.6 20.3 21.0 27.0 297 2.0 2.2 -04043000.JAN 101 2.00 1469 13.6 -12.7 -38.7 6.5 7.0 18.1 27.4 22.8 184 1.1 0.6 -03051900.TBW 13 2.00 3797 17.1 -10.9 -35.3 6.8 6.6 4.0 5.9 5.0 -4 0.6 1.0 -02062600.MPX 287 2.00 6228 19.6 -9.7 -37.1 7.1 7.4 9.2 18.6 21.8 120 2.6 3.2 -02061300.DVN 229 2.00 3501 17.3 -11.9 -35.7 7.4 6.5 10.0 26.3 38.7 100 2.6 1.1 -02052800.LZK 78 2.00 3284 15.1 -12.3 -37.7 6.5 6.9 2.6 4.4 12.3 13 0.6 0.6 -02041800.OAX 350 2.00 2113 11.4 -14.5 -43.5 7.6 8.0 24.0 33.9 35.5 376 1.7 2.2 -01101000.OUN 357 2.00 3485 15.6 -12.9 -39.9 7.9 7.3 23.9 24.4 28.2 447 2.8 2.5 -01090800.TOP 270 2.00 4174 17.8 -11.3 -34.9 8.1 6.4 24.5 26.2 26.7 274 3.2 1.7 -01090800.OUN 357 2.00 4351 17.6 -8.7 -33.7 7.8 6.7 21.8 26.1 21.2 151 2.5 2.3 -01082400.DDC 790 2.00 4283 16.4 -7.5 -33.9 7.7 7.0 11.9 14.7 16.3 77 1.2 3.1 -01082300.TOP 270 2.00 4361 16.7 -9.7 -33.7 7.6 6.5 13.6 9.9 23.0 192 1.0 2.3 -01072000.RAP 1029 2.00 4486 15.1 -8.7 -35.5 8.4 7.2 10.9 15.4 26.3 71 1.6 2.4 -01071300.GGW 700 2.00 3042 14.5 -10.1 -36.3 8.1 7.1 7.9 16.5 34.2 19 1.3 3.5 -01063000.FWD 171 2.00 4122 16.8 -9.7 -36.7 6.9 7.3 9.2 11.2 19.2 133 1.0 1.6 -01062100.DNR 1625 2.00 2544 10.8 -11.5 -39.3 7.5 7.5 20.5 21.4 23.2 192 1.2 2.1 -01053100.LCH 10 2.00 3988 17.4 -8.3 -37.7 7.0 7.9 0.8 8.3 13.9 8 0.6 2.4 -01053100.FWD 171 2.00 4571 15.8 -12.3 -40.5 8.7 7.7 13.7 12.4 20.6 106 2.0 3.9 -01053000.DDC 790 2.00 2892 15.2 -12.1 -35.1 8.0 6.2 14.8 19.5 26.6 388 1.8 1.8 -01052800.OUN 357 2.00 4910 16.5 -10.7 -40.3 7.6 8.0 16.9 29.7 38.8 113 3.5 3.1 -01052700.DDC 790 2.00 2853 11.3 -12.1 -40.1 6.7 7.6 19.3 30.6 37.1 184 1.7 1.8 -01051200.OUN 357 2.00 3098 13.2 -13.9 -40.5 7.1 7.3 8.7 10.0 10.8 132 1.0 2.1 -01050702.LZK 78 2.00 2759 14.2 -12.9 -40.5 5.9 7.5 7.3 18.7 26.3 77 1.3 2.0 -01050700.SGF 387 2.00 4025 14.5 -13.7 -42.3 6.1 7.9 10.5 8.8 17.0 202 1.0 3.1 -01050600.FWD 171 2.00 3092 15.4 -12.7 -38.7 6.8 7.1 19.4 32.7 34.4 170 2.3 2.1 -01042200.MAF 872 2.00 4543 13.7 -12.3 -39.7 8.4 7.5 12.3 27.4 36.2 164 4.1 2.2 -01042200.AMA 1099 2.00 6059 14.1 -15.3 -41.1 9.2 5.4 16.6 35.7 38.3 320 7.4 3.3 -00072300.LBF 849 2.00 2926 13.2 -11.5 -38.1 7.1 7.2 13.6 25.2 27.3 91 1.9 2.8 -00071500.BIS 506 2.00 5132 16.5 -9.5 -35.1 8.1 6.9 14.6 27.6 34.1 152 3.4 2.7 -00071100.GGW 700 2.00 3230 14.2 -11.3 -38.9 6.9 7.5 16.9 30.1 48.1 88 2.2 3.0 -00061500.JAX 9 2.00 4801 17.9 -8.7 -34.3 6.4 6.9 3.6 6.2 13.3 55 0.6 1.1 -00061300.LBF 849 2.00 4790 13.9 -9.9 -37.9 8.3 7.5 9.9 16.6 18.6 159 2.1 2.0 -00061200.AMA 1099 2.00 5720 16.8 -10.3 -34.7 8.3 6.6 15.7 16.1 28.7 88 2.6 2.7 -00032800.JAX 9 2.00 2135 12.5 -14.5 -43.3 6.3 7.9 25.7 29.1 24.7 268 1.6 0.9 -00031600.LMN 317 2.00 1478 9.5 -17.3 -45.5 7.1 7.8 12.9 22.1 10.9 164 1.0 2.2 -00030300.FWD 196 2.00 2589 12.3 -14.3 -41.7 6.2 7.5 20.2 33.4 29.1 239 1.8 2.7 -98062500.FFC 244 1.75 3224 15.8 -8.9 -34.3 7.3 6.8 5.6 4.2 9.9 54 0.5 0.6 -97100900.OUN 357 1.75 3628 16.5 -7.5 -35.9 6.0 7.5 16.6 20.0 29.9 205 1.1 0.8 -94071700.HAT 4 1.75 2973 16.5 -6.0 -31.3 5.7 6.7 4.4 5.9 3.1 33 0.2 0.6 -94071700.1M1 172 1.75 3339 17.7 -6.4 -31.8 5.8 6.7 19.1 12.5 11.3 164 0.5 0.6 -94070100.1M1 172 1.75 4820 18.6 -8.1 -33.0 6.1 6.7 12.6 20.0 18.5 342 1.5 1.0 -94062600.PBI 6 1.75 4199 17.7 -9.1 -34.2 6.6 6.7 5.2 4.9 6.6 10 0.6 1.8 -92051500.1M1 172 1.75 2877 13.3 -11.3 -39.9 6.4 7.8 7.9 11.4 16.3 54 0.7 1.5 -91060600.RAP 966 1.75 2001 13.1 -11.5 -36.7 7.1 6.8 11.9 13.2 19.7 170 0.7 1.4 -91060600.JAN 91 1.75 3344 16.3 -9.1 -33.5 6.8 6.5 3.1 9.5 9.6 12 0.6 0.6 -91053100.AHN 246 1.75 3505 16.3 -6.9 -32.1 5.9 6.7 3.2 3.9 4.1 15 0.3 0.6 -91051700.GGG 124 1.75 5081 18.4 -10.4 -36.4 7.5 7.0 10.5 7.9 11.2 157 1.0 0.9 -91051300.HON 392 1.75 3615 14.7 -9.5 -38.2 7.2 7.7 13.0 14.2 22.7 97 1.1 2.8 -91051300.BIS 504 1.75 1867 13.8 -11.5 -36.7 6.8 6.8 15.8 26.9 19.8 -79 1.3 0.7 -91032700.DAY 298 1.75 1310 10.7 -13.1 -42.1 6.4 7.9 24.3 30.2 30.6 531 0.8 1.8 -90091100.AHN 246 1.75 2857 15.1 -8.6 -34.0 5.9 6.8 6.3 7.9 7.6 80 0.4 0.6 -90090200.MAF 873 1.75 3597 14.9 -6.2 -32.1 6.8 6.8 7.5 17.2 18.3 58 0.8 2.5 -90082600.HON 392 1.75 5529 17.9 -11.5 -38.5 9.1 7.4 9.9 14.7 28.6 156 2.7 -999.0 -90082600.BIS 504 1.75 3187 13.7 -13.2 -42.0 8.6 7.9 13.2 22.2 23.1 190 2.6 2.5 -90082400.OVN 400 1.75 5016 18.7 -7.4 -31.7 6.8 6.5 9.4 7.4 14.7 100 0.6 0.7 -90082100.AMA 1095 1.75 2833 14.6 -5.7 -30.1 6.6 6.5 10.6 11.7 11.3 75 0.4 1.2 -90081500.DDC 791 1.75 3012 15.1 -6.6 -32.5 5.6 6.9 9.9 9.0 15.8 59 0.3 0.6 -90081000.AHN 246 1.75 2234 14.9 -9.4 -35.2 6.2 6.9 6.4 13.3 26.7 33 0.6 0.8 -90080200.LCH 5 1.75 3223 18.4 -7.3 -32.2 6.4 6.6 3.1 6.5 2.0 14 0.3 0.6 -90073100.GGG 124 1.75 3254 16.1 -7.5 -31.9 6.4 6.5 1.2 7.9 5.4 3 0.4 0.6 -90072700.AMA 1095 1.75 3104 14.3 -5.8 -31.4 7.3 6.8 11.1 7.7 7.9 117 0.3 2.2 -90072600.OUN 357 1.75 3546 16.6 -6.8 -32.6 6.2 6.8 11.1 10.8 14.7 206 0.5 0.7 -90072100.ABQ 1619 1.75 1327 10.9 -5.9 -28.5 8.3 6.1 9.8 7.9 14.5 145 0.1 1.3 -90071800.LBF 847 1.75 3138 12.3 -7.7 -36.8 8.2 7.8 10.0 17.7 16.6 115 1.0 1.6 -90071700.FNT 236 1.75 1393 11.9 -12.5 -40.9 6.5 7.7 13.2 15.5 25.3 176 0.5 0.6 -90071400.ABQ 1619 1.75 1588 10.4 -9.4 -32.2 8.7 6.2 4.4 18.9 32.6 70 0.6 1.2 -90071300.CRP 12 1.75 1658 13.3 -6.5 -31.6 6.5 6.7 14.6 12.8 9.3 121 0.3 0.6 -90071100.CKL 145 1.75 2544 15.4 -8.1 -32.3 6.4 6.4 2.1 5.1 4.6 9 0.3 0.6 -90070900.GRB 210 1.75 2962 16.9 -6.5 -31.5 6.5 6.6 12.1 18.2 22.7 82 0.7 0.6 -90070500.LCH 5 1.75 3315 17.6 -8.5 -32.0 6.6 6.3 11.6 15.3 2.5 58 0.9 0.6 -90061800.PIA 200 1.75 4567 19.5 -8.1 -33.4 7.4 6.7 14.1 17.0 25.7 94 1.5 1.0 -90061300.STC 315 1.75 2789 16.2 -10.4 -33.4 7.2 6.2 14.2 36.6 42.0 139 1.8 0.7 -90061100.CHS 13 1.75 4050 17.7 -8.1 -33.2 6.6 6.7 6.4 8.1 19.1 102 0.6 0.6 -90061000.OUN 357 1.75 3242 15.1 -8.5 -33.0 7.8 6.6 10.9 10.1 1.3 21 0.7 2.5 -90061000.IAD 85 1.75 2818 14.9 -9.2 -34.3 6.5 6.7 18.0 16.4 19.3 175 0.9 0.6 -90052800.SIL 8 1.75 3916 18.0 -10.0 -34.5 6.8 6.6 10.4 19.3 10.6 48 1.7 0.8 -90052300.HON 392 1.75 1984 10.9 -14.0 -42.8 7.2 7.9 15.0 22.3 33.6 107 1.2 2.4 -90052100.UMN 438 1.75 3661 14.8 -13.1 -43.5 7.6 8.3 15.3 15.4 23.7 181 1.8 3.4 -90052100.HAT 4 1.75 2891 15.8 -9.7 -37.4 5.6 7.5 12.4 13.8 19.5 182 0.7 0.6 -90051900.SEP 399 1.75 3246 17.0 -9.1 -34.7 6.6 6.8 15.6 20.9 27.2 387 1.3 0.6 -90051600.IAD 85 1.75 2004 13.4 -14.0 -39.9 7.0 7.1 12.7 16.7 27.7 102 1.0 -999.0 -90051200.SEP 399 1.75 2282 13.6 -9.2 -37.7 6.9 7.7 14.5 34.8 47.4 134 1.3 -999.0 -90050600.OUN 357 1.75 836 7.6 -20.1 -41.8 7.2 6.0 5.8 18.3 48.8 30 0.6 1.4 -90042900.AYS 44 1.75 2333 13.0 -12.2 -40.9 6.2 7.8 19.1 30.6 23.2 243 1.5 2.3 -90042600.DRT 314 1.75 3699 14.6 -13.8 -39.4 8.1 7.0 11.1 25.7 33.2 101 3.4 4.3 -90042200.OUN 357 1.75 2748 11.1 -13.3 -46.8 6.6 9.3 7.3 12.2 14.9 48 0.8 2.0 -90040200.BRO 7 1.75 3494 16.2 -9.3 -36.7 7.1 7.4 15.2 25.7 37.2 65 1.9 0.9 -90031300.OUN 357 1.75 3211 12.7 -13.6 -43.5 7.8 8.2 19.4 24.2 18.1 286 2.5 2.8 -90031000.AMA 1095 1.75 2468 11.1 -16.0 -40.7 8.6 6.8 9.9 13.1 18.2 106 1.2 1.9 -90022800.MAF 873 1.75 607 9.7 -16.2 -42.9 6.6 7.4 5.1 16.4 23.8 55 0.3 1.2 -89090800.DEN 1611 1.75 1350 10.1 -6.8 -33.1 8.3 7.1 15.4 24.1 24.0 366 0.5 2.0 -89090200.1M1 172 1.75 3818 18.3 -4.8 -29.4 6.1 6.5 8.2 16.2 14.1 64 0.7 0.6 -89083100.DDC 791 1.75 2956 16.5 -5.7 -31.4 6.6 6.9 13.3 13.6 22.5 346 0.5 0.8 -89083000.OUN 357 1.75 3864 17.3 -5.6 -30.2 6.0 6.5 11.8 13.1 24.2 112 0.6 0.6 -89082900.TOP 268 1.75 4842 19.8 -6.3 -32.1 6.6 6.8 13.2 15.4 21.1 156 1.0 0.6 -89082800.UMN 438 1.75 3603 17.3 -6.1 -30.3 6.5 6.4 2.6 7.8 5.6 28 0.4 0.6 -89082700.OMA 400 1.75 3452 17.8 -6.6 -33.4 6.1 7.1 15.2 19.5 33.1 142 0.9 0.6 -89082500.RAP 966 1.75 1899 10.6 -7.1 -34.2 7.6 7.2 2.7 7.7 7.6 55 0.2 1.0 -89081300.TBW 13 1.75 2617 16.4 -8.6 -33.3 6.0 6.6 10.1 18.1 18.2 65 0.8 0.6 -89080600.UMN 438 1.75 5563 19.0 -6.9 -31.4 7.0 6.5 8.8 11.7 11.3 99 1.0 0.8 -89073000.JAN 91 1.75 3940 18.0 -7.7 -34.5 6.7 7.2 2.1 1.9 3.1 9 0.5 0.6 -89072900.HON 392 1.75 2092 14.0 -5.9 -34.4 6.0 7.6 6.4 12.0 17.9 105 0.3 0.8 -89071500.LBF 847 1.75 2675 14.3 -6.9 -33.4 6.1 7.0 5.5 6.1 8.4 27 0.3 0.6 -89071300.OUN 357 1.75 4127 19.0 -5.4 -31.1 6.9 6.8 13.0 13.8 19.1 196 0.7 -999.0 -89071300.DDC 791 1.75 3239 15.1 -4.9 -31.6 6.9 7.1 7.9 5.1 7.2 81 0.3 1.2 -89070800.PIT 360 1.75 2732 15.4 -9.1 -36.1 6.8 7.3 12.8 17.5 15.7 81 1.0 1.5 -89062800.BUF 218 1.75 2385 15.2 -8.2 -33.3 5.3 6.8 9.8 20.1 22.3 82 0.7 0.6 -89062700.PIA 200 1.75 2460 15.7 -7.9 -33.9 6.6 6.9 5.3 13.2 12.4 87 0.5 0.7 -89062600.IAD 85 1.75 3138 16.2 -8.6 -36.4 6.1 7.4 12.1 14.3 23.0 108 0.8 0.7 -89062200.AHN 246 1.75 1517 15.5 -7.6 -33.7 5.8 6.9 14.9 12.6 15.8 112 0.3 0.6 -89061900.BNA 180 1.75 1755 13.9 -10.2 -36.1 6.3 6.9 6.8 9.7 7.8 86 0.4 0.6 -89061400.GGG 124 1.75 3674 17.2 -11.0 -35.3 6.9 6.6 4.3 15.4 23.3 61 1.4 -999.0 -89060600.JAN 91 1.75 3336 16.3 -11.3 -37.4 6.7 7.0 10.4 20.8 25.3 103 1.7 0.8 -89060600.GSO 277 1.75 2078 14.8 -9.1 -34.5 5.9 6.8 10.0 8.1 6.7 93 0.3 0.6 -89060100.TOP 268 1.75 2810 15.8 -10.9 -35.3 7.9 6.6 7.9 10.6 26.9 90 0.8 -999.0 -06100400.MPX 287 1.75 3011 13.7 -12.1 -41.5 7.4 8.1 23.9 34.0 30.2 514 2.4 2.9 -06091600.DDC 790 1.75 2738 14.4 -6.9 -34.5 6.6 7.4 21.6 29.7 39.0 378 1.1 2.2 -06091400.EPZ 1252 1.75 1589 11.7 -10.3 -32.9 7.6 6.1 13.1 17.4 23.7 167 0.6 2.0 -06091100.AMA 1099 1.75 1812 12.5 -8.9 -37.1 7.1 7.6 13.7 14.9 33.3 51 0.5 2.1 -06082300.RAP 1029 1.75 1757 8.3 -9.5 -39.1 9.1 8.0 12.7 21.3 28.7 108 0.8 0.8 -06082100.ABR 396 1.75 1851 12.5 -9.9 -36.9 6.8 7.3 15.5 21.9 39.5 257 0.8 2.1 -06080900.TUS 779 1.75 1640 11.9 -4.7 -30.5 6.6 6.8 6.6 5.1 8.2 25 0.1 0.6 -06080700.TOP 270 1.75 1693 12.5 -6.7 -31.1 7.0 6.4 3.2 7.6 6.8 35 0.2 0.6 -06072600.TUS 779 1.75 1725 11.2 -5.7 -31.7 7.4 7.0 8.5 15.0 18.3 36 0.3 0.9 -06072200.LZK 78 1.75 2480 14.1 -8.1 -31.3 7.3 6.2 7.7 6.9 5.8 67 0.3 0.6 -06071900.JAN 101 1.75 2280 15.2 -6.9 -33.5 6.5 7.1 9.0 11.1 11.1 88 0.4 0.6 -06071300.DDC 790 1.75 1575 12.8 -5.9 -30.5 6.9 6.5 7.4 12.7 13.7 99 0.2 0.8 -06071200.DDC 790 1.75 1068 11.8 -8.7 -29.3 8.0 5.5 11.8 15.4 21.8 12 0.3 1.0 -06070100.BNA 210 1.75 2750 13.5 -11.5 -39.1 6.7 7.5 11.5 10.8 7.8 41 0.7 1.5 -06062900.DDC 790 1.75 919 7.7 -10.1 -38.7 7.7 7.7 1.9 17.9 17.9 16 0.3 0.8 -06062400.LBF 849 1.75 1400 10.7 -12.1 -38.5 7.4 7.2 13.6 26.6 25.0 272 0.9 2.1 -06062400.BIS 506 1.75 942 8.3 -15.3 -41.9 7.0 7.3 16.7 22.7 27.2 167 0.6 1.6 -06062100.CHS 15 1.75 4007 17.0 -10.1 -35.5 6.4 6.9 7.1 12.9 19.3 66 1.1 0.7 -06061800.FWD 171 1.75 2286 14.3 -10.9 -34.3 8.2 6.2 11.6 13.9 24.6 134 0.9 2.3 -06052700.GSO 270 1.75 2136 12.7 -9.9 -37.3 5.8 7.4 17.1 17.4 21.2 217 0.6 1.5 -06052500.TLH 53 1.75 2619 14.8 -10.5 -36.5 6.4 7.0 9.2 7.3 7.5 56 0.4 0.6 -06052300.SGF 387 1.75 3032 14.4 -11.9 -37.7 7.1 7.0 8.3 9.0 15.5 91 0.7 1.6 -06051800.ILX 178 1.75 713 8.0 -17.5 -46.5 6.9 8.1 16.9 28.8 29.6 226 0.6 2.1 -06051412.SHV 79 1.75 2270 12.4 -14.9 -41.3 7.8 7.2 15.5 16.8 26.2 84 1.3 2.8 -06051100.LCH 10 1.75 4564 18.5 -12.3 -35.7 8.9 6.4 12.2 22.9 22.0 38 3.7 1.7 -06050912.SGF 387 1.75 2144 12.9 -12.9 -39.7 6.7 7.3 10.1 20.3 18.4 144 1.2 1.8 -06050900.DDC 790 1.75 1630 9.6 -13.3 -40.5 7.9 7.4 15.1 27.2 27.8 179 1.2 2.0 -06050600.LCH 10 1.75 2655 14.9 -10.3 -39.3 5.8 7.8 15.8 23.1 25.2 64 1.2 0.6 -06050400.SHV 79 1.75 3310 15.0 -12.1 -39.1 6.7 7.3 5.8 8.0 14.3 85 0.7 0.6 -06042300.DTX 329 1.75 609 6.7 -24.1 -43.7 7.4 5.5 14.0 17.7 27.4 50 0.5 1.8 -06041900.BMX 178 1.75 1805 12.0 -11.1 -39.9 6.3 7.7 5.4 14.2 22.0 62 0.5 0.7 -06041600.WAL 12 1.75 2234 10.9 -16.5 -44.7 7.2 7.8 17.2 17.7 48.2 81 1.2 2.3 -06041600.IAD 93 1.75 2181 10.2 -16.7 -43.9 7.0 7.5 16.6 27.7 43.3 48 1.8 1.8 -06041300.LZK 78 1.75 1294 11.0 -13.5 -41.1 7.2 7.6 6.0 12.6 20.8 34 0.4 -999.0 -06040900.JAX 9 1.75 2254 13.6 -13.7 -38.1 6.6 6.6 19.5 20.4 22.0 178 1.3 2.1 -06040400.CHS 15 1.75 2165 11.6 -16.9 -42.5 8.1 7.0 26.6 31.6 39.3 207 2.2 2.6 -05082700.AMA 1099 1.75 2765 13.6 -5.5 -32.3 7.4 7.1 10.0 11.5 11.5 31 0.4 2.0 -05082400.RAP 1029 1.75 2040 11.3 -11.3 -38.9 8.6 7.5 13.6 11.6 19.1 116 0.6 -999.0 -05031500.TLH 53 1.75 1338 12.4 -14.1 -38.5 7.1 6.6 12.7 28.4 53.2 41 1.1 1.1 -05030400.AMA 1099 1.75 697 4.3 -23.3 -51.5 8.7 8.0 13.1 22.7 36.0 142 0.8 1.3 -04092500.AMA 1099 1.75 2465 11.2 -11.9 -40.7 6.9 7.8 12.0 15.1 24.9 38 0.8 2.0 -04092300.AMA 1099 1.75 1887 12.8 -10.1 -35.5 6.7 6.9 19.6 23.5 21.8 374 0.9 1.3 -04082600.BIS 506 1.75 3083 12.5 -13.1 -41.7 7.1 7.8 13.9 16.6 18.9 101 1.4 2.4 -04081900.ILX 178 1.75 3685 15.1 -9.1 -36.3 5.9 7.3 19.7 19.9 28.2 371 1.3 1.3 -04071200.TOP 270 1.75 3709 17.7 -7.3 -32.5 6.8 6.7 11.9 13.6 9.1 204 0.8 0.6 -04051600.EPZ 1252 1.75 2888 10.4 -11.5 -39.9 8.7 7.8 4.1 12.2 7.0 93 0.9 1.6 -04051000.LBF 849 1.75 4026 11.6 -13.9 -41.1 9.0 7.5 3.0 13.9 17.5 38 1.9 1.6 -04042900.DRT 313 1.75 1834 12.4 -12.9 -40.9 6.4 7.7 16.1 20.0 31.6 217 0.9 1.3 -04040700.FWD 171 1.75 835 10.4 -16.3 -40.1 6.7 6.6 11.8 28.3 27.2 87 0.6 1.0 -04032100.MAF 872 1.75 2053 10.0 -12.9 -41.3 7.9 7.7 5.5 9.6 21.3 39 0.5 1.5 -04032100.FFC 244 1.75 942 7.9 -17.3 -44.1 7.5 7.4 11.3 12.0 13.4 154 0.4 1.1 -04030100.TOP 270 1.75 487 6.3 -28.7 -42.5 8.7 3.9 20.1 32.0 35.0 171 0.9 1.6 -04022512.LIX 8 1.75 837 10.3 -17.7 -40.5 6.7 6.3 25.2 31.9 48.7 340 0.7 2.4 -03092100.DDC 790 1.75 1784 10.2 -10.9 -38.5 7.3 7.5 21.8 20.1 23.8 257 0.7 2.0 -03091100.DDC 790 1.75 3112 14.8 -7.5 -31.9 6.9 6.6 15.7 22.3 30.8 259 1.2 2.2 -03091000.MAF 872 1.75 3038 12.9 -7.3 -34.1 7.4 7.1 8.6 8.3 12.7 79 0.4 2.1 -03090500.DRA 1009 1.75 1966 11.3 -8.3 -34.1 8.1 6.9 5.0 3.7 9.2 33 0.2 1.2 -03062500.MAF 872 1.75 4621 16.5 -6.7 -29.9 7.7 6.2 11.9 8.7 16.8 45 0.7 2.1 -03062100.MAF 872 1.75 1489 10.7 -7.7 -33.7 7.0 6.9 6.5 14.5 29.4 74 0.3 1.9 -03061700.RAP 1029 1.75 1501 10.1 -11.1 -38.5 7.1 7.4 2.9 5.7 17.5 92 0.2 1.9 -03061700.FFC 244 1.75 2826 16.3 -8.5 -33.7 6.2 6.8 5.5 7.0 13.0 32 0.3 0.6 -03061500.LBF 849 1.75 1717 10.7 -11.3 -39.3 6.3 7.6 6.6 10.6 12.0 51 0.3 1.7 -03061500.FWD 171 1.75 2433 14.3 -11.3 -37.9 6.9 7.2 5.3 12.1 2.8 32 0.7 1.7 -03061300.LBF 849 1.75 2759 12.0 -11.3 -40.9 7.2 8.0 13.0 15.4 16.3 179 1.0 2.6 -03061100.OUN 357 1.75 3045 14.5 -9.3 -35.7 7.2 7.1 12.1 17.8 13.1 135 1.2 2.0 -03060400.LCH 10 1.75 4988 19.7 -6.7 -34.5 5.8 7.4 7.3 13.3 17.2 44 0.8 0.6 -03051312.FWD 171 1.75 1814 12.6 -10.3 -36.9 7.3 7.1 16.8 17.7 24.7 205 0.7 1.2 -03050700.BMX 178 1.75 4489 17.4 -10.5 -36.9 7.0 7.1 12.2 26.5 28.4 101 2.8 2.1 -03050200.FFC 244 1.75 3289 13.7 -13.5 -41.1 6.5 7.5 7.5 9.8 9.5 55 0.9 0.9 -03043000.BNA 210 1.75 3359 12.4 -15.3 -42.5 7.2 7.5 4.1 4.3 5.5 30 0.8 1.3 -03042900.MAF 872 1.75 2325 9.8 -13.5 -39.1 8.4 7.0 15.5 23.4 21.0 165 1.6 1.4 -03042900.AMA 1099 1.75 2549 9.6 -14.5 -41.5 8.3 7.4 16.5 25.3 33.7 237 2.0 1.6 -03032600.SHV 79 1.75 1723 11.3 -18.3 -45.5 8.5 7.6 8.0 17.7 18.0 108 1.3 1.4 -03032600.LZK 78 1.75 2073 11.3 -18.5 -46.3 6.7 7.8 9.5 14.3 15.4 67 1.0 2.2 -03031500.BMX 178 1.75 1555 10.9 -19.1 -43.3 7.4 6.8 12.3 8.5 21.2 94 0.5 1.3 -02082300.LBF 849 1.75 6193 17.8 -10.1 -38.1 8.0 7.5 3.8 12.9 28.1 10 2.1 3.1 -02072800.DDC 790 1.75 2480 12.9 -5.3 -31.3 7.4 6.8 10.7 10.6 11.1 155 0.3 1.4 -02072518.TBW 13 1.75 4523 18.9 -8.5 -34.7 6.7 7.0 2.0 7.8 6.3 7 0.7 0.6 -02070200.AMA 1099 1.75 2393 12.2 -6.5 -35.3 7.3 7.6 20.8 18.4 11.3 353 0.6 1.6 -02062600.DTX 329 1.75 3079 14.5 -8.9 -34.7 6.1 7.0 1.4 1.9 7.2 -1 0.4 0.7 -02061200.TOP 270 1.75 5029 19.6 -8.9 -32.9 7.6 6.4 15.6 21.1 24.7 224 2.3 0.7 -02060700.MPX 287 1.75 1952 9.2 -15.1 -43.7 7.7 7.9 16.2 22.8 25.3 758 1.4 1.5 -02060402.CHS 15 1.75 2637 13.7 -10.1 -34.9 7.6 6.7 11.7 9.7 10.8 33 0.6 0.8 -02052900.TOP 270 1.75 2661 12.8 -13.7 -40.1 6.8 7.2 7.3 4.2 10.7 48 0.5 1.3 -02052800.MAF 872 1.75 3115 12.7 -11.1 -37.5 8.0 7.1 16.4 20.6 24.7 103 1.7 2.1 -02052800.LBF 849 1.75 3387 11.3 -15.1 -41.3 9.0 7.2 11.6 18.8 30.1 184 2.3 1.9 -02050400.CHS 15 1.75 3255 15.9 -10.7 -35.7 6.6 6.7 16.6 21.1 29.5 19 1.6 0.9 -02041800.FWD 171 1.75 3343 15.9 -9.9 -35.9 6.4 7.0 5.6 12.4 34.6 61 0.9 -999.0 -02041600.PIT 357 1.75 1856 11.5 -14.9 -41.7 7.3 7.4 15.8 17.9 18.1 245 1.0 1.6 -01062000.DTX 329 1.75 3813 14.9 -12.5 -37.3 6.9 6.7 15.0 8.4 17.6 -45 0.9 2.8 -01061800.TBW 13 1.75 3469 15.9 -9.7 -34.9 5.9 6.8 1.5 4.6 6.6 23 0.5 0.8 -00090400.LBF 849 1.75 2441 11.2 -9.5 -35.5 7.8 7.0 18.5 21.4 24.1 309 1.0 1.5 -00080800.OAX 350 1.75 4679 16.3 -8.1 -32.7 7.8 6.5 10.8 16.4 25.1 185 1.6 3.0 -00080200.GGW 700 1.75 2057 10.8 -8.9 -37.9 8.0 7.8 15.0 24.6 35.3 148 0.9 1.8 -00073100.JAX 9 1.75 3581 17.6 -8.9 -33.5 6.0 6.6 4.7 6.6 5.5 27 0.4 0.6 -00072900.GSO 270 1.75 2081 14.3 -9.7 -35.1 6.2 6.8 6.5 6.2 16.1 43 0.3 0.6 -00072700.LBF 849 1.75 5178 18.1 -8.9 -36.7 8.7 7.5 12.2 17.5 26.1 351 2.3 2.2 -00072600.MPX 287 1.75 3240 15.3 -13.1 -36.3 7.6 6.4 10.1 21.4 12.4 139 2.2 3.0 -00072600.MFL 5 1.75 4079 18.3 -8.5 -33.5 6.6 6.7 2.4 5.2 5.6 18 0.5 0.6 -00072500.ABR 396 1.75 4195 15.6 -12.3 -38.3 8.9 7.1 10.9 15.3 19.8 113 2.3 3.1 -00072200.LBF 849 1.75 3031 12.8 -11.5 -38.5 7.6 7.3 14.5 27.5 23.7 247 2.2 2.6 -00072100.FFC 244 1.75 2149 14.3 -6.9 -30.5 6.4 6.2 9.1 9.2 10.4 63 0.3 0.6 -00071800.AMA 1099 1.75 3660 14.4 -4.7 -32.7 6.9 7.4 5.9 9.1 7.7 79 0.4 1.5 -00071500.IAD 98 1.75 2186 13.9 -12.3 -36.3 6.8 6.5 9.3 17.8 17.7 118 1.1 2.0 -00071300.ABR 396 1.75 2305 13.6 -8.7 -36.1 6.7 7.3 21.7 29.3 44.3 278 1.2 2.0 -00070600.GGW 700 1.75 2743 11.7 -14.1 -40.7 8.5 7.3 13.0 29.6 40.4 165 2.4 1.9 -00062400.LBF 849 1.75 4723 14.8 -9.7 -37.3 8.6 7.4 9.8 17.4 29.6 126 2.2 2.0 -00062400.DDC 790 1.75 3499 14.8 -7.3 -33.9 7.7 7.2 12.0 23.2 30.2 237 1.5 2.7 -00062200.DDC 790 1.75 3602 14.3 -8.7 -37.5 7.0 7.7 16.2 15.4 23.4 157 1.1 2.9 -00061100.AMA 1099 1.75 3932 14.0 -7.9 -33.5 7.8 6.8 9.4 14.8 19.1 128 1.2 2.1 -00060300.ABQ 1620 1.75 1267 9.4 -8.7 -34.3 8.2 6.9 7.6 10.3 17.5 70 0.2 1.4 -00052900.GSO 270 1.75 1988 14.3 -11.1 -37.1 6.2 7.0 17.6 28.7 35.1 139 1.2 1.2 -00051900.FWD 196 1.75 3610 16.2 -10.9 -37.7 7.4 7.2 6.7 25.2 32.9 75 2.4 0.6 -00051200.TOP 270 1.75 5329 16.7 -7.3 -39.3 6.5 8.6 21.0 25.1 29.2 216 2.1 3.7 -00033000.SHV 79 1.75 3548 15.4 -15.9 -44.1 7.6 7.8 23.8 31.6 50.3 323 3.8 2.8 -94070100.GSO 277 1.50 2296 13.8 -10.3 -38.7 5.4 7.7 6.6 8.1 14.3 40 0.3 0.6 -90082200.OUN 357 1.50 3350 16.6 -5.5 -30.6 6.1 6.6 3.1 3.3 5.7 -7 0.3 0.6 -90082200.AHN 246 1.50 3275 16.5 -6.8 -30.8 6.5 6.3 6.0 8.7 15.8 48 0.4 0.6 -90071000.DEN 1611 1.50 3504 13.5 -8.2 -34.3 8.0 7.0 16.7 25.4 20.1 41 1.9 2.5 -90041100.AHN 246 1.50 1096 11.5 -14.0 -40.0 6.4 7.1 19.0 25.4 25.8 343 0.7 0.6 -90040200.GSO 277 1.50 984 8.7 -17.4 -45.5 6.8 7.8 19.9 29.7 37.4 210 0.8 2.0 -89060200.AHN 246 1.50 1996 13.2 -7.3 -34.8 6.1 7.3 3.2 2.6 1.6 18 0.2 -999.0 -06071100.DNR 1625 1.50 1192 10.1 -7.9 -33.7 7.6 6.9 12.2 16.2 27.0 79 0.3 1.7 -06053000.SGF 387 1.50 2988 15.0 -9.3 -34.7 6.5 6.9 4.0 2.7 12.8 27 0.4 0.6 -06052200.LBF 849 1.50 1420 8.2 -11.1 -41.1 7.7 8.1 14.8 15.2 22.6 199 0.5 1.3 -06042117.JAN 101 1.50 1486 13.4 -12.9 -37.5 6.5 6.7 6.4 17.4 11.7 58 0.7 0.6 -03091800.INL 361 1.50 1863 13.7 -13.5 -38.9 7.5 7.0 15.3 24.7 29.2 384 1.5 -999.0 -03031700.MHX 11 1.50 1241 12.1 -13.1 -39.9 5.4 7.3 11.5 19.1 32.8 37 0.5 0.7 -02072500.LCH 10 1.50 5453 20.2 -7.3 -31.7 5.9 6.4 5.5 8.5 11.3 66 0.6 0.6 -02042200.ILN 317 1.50 623 10.3 -13.3 -37.4 6.8 6.6 31.2 36.0 43.5 525 0.4 2.1 -01062600.RNK 654 1.50 1653 11.1 -11.9 -39.7 5.7 7.5 8.3 13.7 30.3 88 0.4 2.1 -01062600.GSO 270 1.50 929 11.9 -11.7 -40.1 6.0 7.7 10.4 17.8 25.6 106 0.3 0.6 -00090200.SLC 1288 1.50 1641 9.1 -14.7 -41.9 8.4 7.4 20.1 16.1 24.8 101 0.9 1.7 -00051800.GSO 270 1.50 1767 11.9 -13.7 -40.9 6.5 7.4 7.6 16.4 31.1 124 0.7 1.6 -94062500.GSO 277 1.25 2334 15.9 -5.4 -31.3 5.6 6.9 12.9 9.9 5.2 103 0.2 0.6 -90041400.OUN 357 1.25 1408 10.8 -18.2 -46.0 7.9 7.7 17.5 23.5 33.0 146 1.2 2.0 -06072800.FGZ 2192 1.25 3100 13.5 -5.3 -30.7 8.1 6.7 14.1 22.7 18.3 193 1.0 2.7 -06072700.ILX 178 1.25 4385 20.7 -4.3 -31.7 5.7 7.2 14.7 12.7 19.1 318 0.6 0.6 -06070400.GRB 214 1.25 1881 14.1 -10.1 -36.5 6.6 7.1 14.0 22.8 40.7 132 0.9 0.6 -06061200.DNR 1625 1.25 942 6.0 -9.9 -38.5 9.4 7.8 7.4 17.1 22.2 130 0.4 0.6 -06060312.LBF 849 1.25 988 7.7 -11.9 -40.5 9.0 7.9 10.8 19.5 17.8 699 0.5 1.0 -06060300.ILX 178 1.25 1218 10.0 -14.5 -42.9 5.9 7.8 14.1 20.0 22.7 87 0.5 1.5 -06052600.FFC 244 1.25 1711 12.1 -12.1 -36.7 7.1 6.6 4.1 8.7 3.3 46 0.4 1.1 -06052000.BOI 874 1.25 1070 7.4 -13.5 -39.9 8.4 7.2 9.2 15.9 25.9 95 0.5 0.8 -06051500.TLH 53 1.25 1279 10.8 -13.7 -41.5 7.1 7.6 18.5 24.7 23.2 104 0.8 1.7 -05100123.LMN 317 1.25 2672 15.9 -9.9 -36.7 7.0 7.2 14.1 21.4 26.0 276 1.3 -999.0 -05090600.LBF 849 1.25 2252 13.0 -9.1 -33.7 8.1 6.7 6.3 14.1 27.2 28 0.7 2.9 -05030700.MAF 872 1.25 547 8.0 -16.7 -46.3 6.9 8.2 16.9 34.3 40.4 177 0.4 1.9 -04100400.AMA 1099 1.25 1672 10.5 -13.5 -40.1 7.6 7.2 10.7 23.5 31.9 28 1.1 2.4 -04032700.RAP 1029 1.25 2052 8.5 -15.5 -43.5 8.0 7.7 12.6 19.0 17.5 161 1.3 1.5 -03090800.PHX 384 1.25 2268 12.1 -6.7 -35.1 6.7 7.5 8.2 10.7 16.8 90 0.3 1.2 -03090800.FGZ 2192 1.25 663 8.3 -8.3 -35.1 7.7 7.1 11.2 15.0 17.0 130 0.2 1.2 -03090300.NKX 128 1.25 940 10.8 -5.9 -32.3 6.6 7.0 4.2 7.0 5.9 9 0.1 0.7 -03040500.ILN 317 1.25 1856 10.4 -15.7 -44.1 6.5 7.8 17.7 20.8 25.6 233 1.0 2.2 -02041200.TOP 270 1.25 1084 9.8 -16.5 -44.3 7.1 7.7 16.2 9.4 27.2 99 0.3 1.6 -00072000.LZK 165 1.25 3973 16.4 -6.7 -30.7 6.8 6.3 8.3 12.6 12.7 102 0.7 1.1 -00071100.DDC 790 1.25 4707 16.4 -4.1 -31.5 6.8 7.2 6.0 4.6 8.7 136 0.4 2.6 -00030400.BMX 178 1.25 1311 11.4 -14.9 -42.9 5.7 7.7 21.1 42.9 54.3 205 0.8 1.4 -99061200.ILN 317 1.00 3299 14.7 -8.3 -35.5 5.8 7.3 8.2 4.6 4.0 32 0.4 1.1 -98052200.BNA 180 1.00 3709 15.2 -10.7 -36.9 6.4 7.0 10.4 9.2 7.9 83 0.8 0.9 -97081800.FFC 244 1.00 3564 18.4 -6.1 -31.1 6.1 6.6 4.4 2.5 2.0 37 0.3 0.6 -97081700.PIT 373 1.00 3951 18.3 -7.9 -31.9 6.9 6.4 15.4 12.7 23.0 224 0.9 0.6 -97081700.DVN 229 1.00 5790 20.8 -8.3 -34.9 7.5 7.1 12.3 14.3 11.8 137 1.7 1.0 -93092500.OUN 381 1.00 2895 16.1 -6.7 -32.0 6.2 6.8 16.0 24.5 27.2 264 1.0 0.6 -91060500.CKL 140 1.00 3345 16.9 -7.5 -32.0 6.3 6.5 9.2 5.0 4.8 52 0.4 0.6 -91060500.AHN 246 1.00 3036 15.3 -8.1 -31.7 6.7 6.3 11.6 5.7 13.0 72 0.4 0.6 -90101800.GGG 124 1.00 1619 14.2 -10.6 -37.1 6.4 7.1 12.5 20.0 27.9 114 0.7 0.6 -90100800.GGG 124 1.00 2689 16.8 -6.0 -32.5 5.8 7.0 8.9 14.2 17.2 70 0.4 0.6 -90092900.MAF 873 1.00 1606 12.2 -8.0 -36.1 6.0 7.5 11.3 15.0 28.7 35 0.3 0.8 -90083000.GSO 277 1.00 3552 16.4 -9.3 -33.8 6.0 6.6 14.1 20.1 18.2 37 1.3 0.6 -90082300.HTS 246 1.00 707 15.2 -7.7 -33.3 6.2 6.8 3.6 7.0 8.5 -4 0.1 0.6 -90082100.OUN 357 1.00 5290 19.2 -6.7 -31.0 6.9 6.4 6.2 8.3 3.4 38 0.7 0.6 -90081900.AMA 1095 1.00 2596 13.6 -7.9 -32.0 7.0 6.5 3.8 5.1 5.1 45 0.3 0.8 -90080200.MAF 873 1.00 1702 14.4 -6.2 -31.8 6.1 6.8 2.8 9.7 12.2 27 0.2 0.6 -90072600.GGW 696 1.00 1514 10.2 -10.6 -37.7 7.0 7.3 7.9 15.6 16.6 55 0.5 1.8 -90072500.DDC 791 1.00 1703 11.9 -8.0 -34.0 6.8 7.0 10.1 14.0 17.5 208 0.4 1.4 -90072200.TBW 13 1.00 3409 17.8 -5.7 -31.9 6.0 6.9 3.6 4.6 7.8 35 0.3 0.6 -90072000.DEN 1611 1.00 1698 11.7 -7.2 -32.2 7.4 6.7 14.0 16.1 20.8 182 0.4 2.1 -90071800.AMA 1095 1.00 1482 11.4 -6.5 -33.5 6.7 7.2 8.4 14.8 26.1 98 0.3 1.1 -90071100.GSO 277 1.00 3487 15.2 -6.6 -32.6 5.9 6.9 7.5 3.5 9.1 38 0.3 0.6 -90070900.GSO 277 1.00 4051 17.6 -5.3 -32.6 5.6 7.2 6.1 10.2 10.5 73 0.4 0.8 -90062400.OUN 357 1.00 1571 11.9 -10.8 -34.1 8.2 6.3 14.1 26.8 24.9 186 1.1 1.9 -90062300.HTS 246 1.00 1346 14.5 -8.5 -33.5 5.8 6.6 19.1 27.1 36.9 231 0.6 0.6 -90061000.GSO 277 1.00 2409 15.3 -8.8 -32.8 6.1 6.4 11.1 9.7 14.5 145 0.4 0.6 -90050400.CKL 140 1.00 1534 14.0 -10.6 -33.4 6.4 6.0 10.8 20.1 25.8 141 0.7 0.6 -89082700.DDC 791 1.00 4549 16.9 -7.4 -32.1 7.6 6.6 1.4 11.3 24.3 11 0.9 2.1 -89082000.UMN 438 1.00 3524 17.3 -6.0 -31.1 6.2 6.6 13.6 20.6 14.9 350 0.9 0.8 -89080600.OUN 357 1.00 3439 16.3 -5.4 -31.1 6.8 6.8 9.7 10.2 12.1 101 0.4 0.8 -89073100.GTF 1118 1.00 1858 9.5 -9.3 -36.7 8.9 7.4 10.3 10.8 21.7 106 0.4 1.2 -89072800.DAY 298 1.00 2617 16.4 -7.8 -34.6 5.7 7.2 7.5 13.5 11.3 83 0.5 0.6 -89072400.VCT 33 1.00 2953 14.8 -9.6 -37.2 6.2 7.4 9.5 7.7 13.3 120 0.4 0.6 -89071200.TOP 268 1.00 3182 16.6 -8.1 -30.9 7.6 6.1 13.2 12.6 8.2 157 0.8 1.6 -89070600.OUN 357 1.00 1373 12.9 -6.0 -34.0 6.2 7.4 11.3 6.0 12.2 64 0.1 0.6 -89062900.AMA 1095 1.00 2035 12.6 -8.2 -31.3 8.6 6.2 13.0 14.8 26.0 165 0.6 2.3 -89062800.HTS 246 1.00 3659 17.6 -8.0 -31.7 5.8 6.4 7.4 15.4 21.4 62 0.8 0.6 -89061900.CKL 140 1.00 3363 16.7 -9.6 -36.6 6.4 7.3 12.2 14.5 12.2 103 1.0 0.6 -89061600.TBW 13 1.00 3463 16.4 -7.6 -32.3 5.7 6.5 5.9 10.2 6.4 36 0.5 0.6 -89061400.JAN 91 1.00 3274 16.0 -11.5 -35.2 7.1 6.4 9.4 11.3 8.2 57 1.0 1.0 -89061200.JAN 91 1.00 3616 17.7 -9.1 -31.2 6.5 5.9 7.5 15.3 5.8 84 1.1 0.6 -89060500.1M1 172 1.00 2493 15.8 -8.2 -35.8 6.0 7.4 10.3 14.7 13.0 19 0.6 0.6 -06092900.FFC 244 1.00 705 10.8 -11.1 -40.1 4.6 7.9 18.9 19.1 33.4 85 0.2 0.6 -06091200.ILX 178 1.00 1642 13.6 -11.1 -38.9 6.4 7.5 8.6 12.9 23.9 56 0.5 0.6 -06090800.LBF 849 1.00 880 7.9 -14.1 -40.7 7.5 7.3 6.9 11.1 19.9 20 0.3 0.9 -06090800.ABR 396 1.00 1406 9.5 -14.3 -42.3 7.5 7.7 10.6 9.4 9.1 163 0.4 1.7 -06081000.TUS 779 1.00 1913 13.4 -6.3 -29.9 7.3 6.3 1.2 3.1 6.2 12 0.2 0.6 -06080100.PIT 357 1.00 3456 18.6 -4.5 -30.1 5.8 6.8 10.1 12.7 7.9 104 0.5 0.6 -06072800.OAX 350 1.00 2714 15.6 -5.3 -34.3 6.0 7.7 9.3 16.8 22.8 92 0.5 0.6 -06072800.ABR 396 1.00 1956 12.7 -6.1 -34.7 6.4 7.6 16.1 23.5 29.4 149 0.5 1.4 -06072700.RAP 1029 1.00 694 8.7 -8.7 -33.7 8.3 6.7 13.4 16.3 21.8 157 0.2 0.9 -06072300.ABQ 1620 1.00 1267 9.6 -4.9 -32.1 7.8 7.2 2.8 5.7 11.2 -9 0.1 1.0 -06072200.RNK 654 1.00 3249 16.5 -6.1 -31.1 6.0 6.6 7.2 7.0 9.1 100 0.3 0.6 -06072000.RNK 654 1.00 2160 14.2 -8.5 -31.1 5.9 6.1 11.1 9.1 3.0 113 0.3 1.0 -06071800.DNR 1625 1.00 1197 9.1 -6.9 -32.3 8.0 6.9 3.5 7.7 6.2 83 0.1 1.1 -06071300.BIS 506 1.00 966 9.0 -8.7 -35.3 8.1 7.1 5.9 7.7 14.5 108 0.1 0.7 -06070500.GSO 270 1.00 2335 15.2 -7.3 -33.1 6.1 6.8 7.6 9.6 6.1 96 0.3 0.6 -06070300.IAD 93 1.00 3195 14.8 -9.3 -36.5 5.9 7.3 10.7 10.7 13.6 60 0.6 0.9 -06070200.LBF 849 1.00 2554 12.2 -8.5 -35.5 8.0 7.3 17.1 20.5 17.9 223 1.0 2.0 -06070200.FWD 171 1.00 1806 12.8 -9.9 -36.5 7.2 7.2 1.6 6.1 11.2 20 0.3 0.6 -06070200.FFC 244 1.00 1552 11.2 -9.7 -38.3 6.3 7.7 1.2 6.5 9.5 4 0.2 0.9 -06062900.TOP 270 1.00 959 8.5 -12.3 -40.9 7.1 7.8 8.1 12.7 14.7 120 0.3 1.0 -06062900.PIT 357 1.00 925 10.9 -13.7 -38.3 6.4 6.7 7.1 21.3 35.7 17 0.5 1.6 -06062800.GRB 214 1.00 1049 9.4 -15.5 -44.5 6.1 8.0 8.1 13.8 20.6 34 0.4 1.6 -06062700.FFC 244 1.00 2376 15.4 -6.9 -33.5 5.6 7.0 9.3 12.6 21.6 23 0.4 0.6 -06062300.DDC 790 1.00 987 11.0 -11.1 -33.3 7.2 6.0 9.3 17.7 17.5 78 0.4 1.3 -06062300.BNA 210 1.00 3023 15.6 -10.1 -34.7 7.3 6.6 8.0 10.6 3.6 71 0.8 0.6 -06062300.BMX 178 1.00 1595 12.5 -7.1 -34.3 6.2 7.2 1.9 5.1 4.3 -10 0.1 0.6 -06062200.JAN 101 1.00 2595 15.3 -8.7 -34.7 7.0 7.0 4.6 3.0 2.5 -15 0.4 0.6 -06062100.BNA 210 1.00 2387 14.1 -9.3 -35.3 6.8 6.9 6.8 6.7 3.3 43 0.3 0.6 -06061900.GRB 214 1.00 2397 14.0 -11.7 -38.1 6.2 7.2 12.4 15.9 20.9 74 0.9 1.9 -06061200.BNA 210 1.00 1539 13.6 -6.7 -34.3 5.6 7.4 9.1 15.2 7.0 107 0.3 0.6 -06060800.LBF 849 1.00 2368 10.8 -6.9 -36.5 7.7 7.9 11.2 20.5 22.3 244 0.7 1.7 -06060712.RAP 1029 1.00 1110 7.9 -10.3 -38.1 8.7 7.6 9.9 12.3 19.2 131 0.3 1.3 -06060700.SHV 79 1.00 2252 14.6 -10.3 -34.3 7.4 6.4 15.1 25.4 14.5 164 1.4 0.6 -06060500.FFC 244 1.00 1475 11.0 -12.5 -39.5 5.9 7.4 5.7 11.7 22.4 18 0.3 2.1 -06060400.ILN 317 1.00 1032 8.3 -18.1 -46.9 6.5 8.0 6.7 8.5 11.1 35 0.3 1.2 -06060300.GRB 214 1.00 1314 8.8 -18.9 -45.5 7.1 7.4 12.0 16.3 19.5 77 0.7 1.6 -06060200.BNA 210 1.00 2055 14.2 -7.9 -34.3 5.4 7.1 8.6 5.5 12.6 -2 0.2 0.6 -06053100.GGW 700 1.00 570 5.6 -21.1 -50.3 7.4 8.3 2.8 5.0 8.1 30 0.2 0.9 -06052700.JAX 9 1.00 2879 15.0 -9.9 -36.5 6.1 7.2 11.0 13.7 13.1 117 0.8 0.8 -06052700.BIS 506 1.00 2274 9.4 -11.9 -40.3 8.5 7.7 20.2 22.0 21.3 198 1.3 1.3 -06052600.JAX 9 1.00 1856 13.3 -10.7 -37.3 6.6 7.2 10.5 15.3 20.8 70 0.6 0.6 -06052600.GSO 270 1.00 1743 11.9 -10.1 -36.3 6.1 7.0 8.4 14.4 11.4 82 0.4 0.8 -06052600.AMA 1099 1.00 1911 7.9 -11.3 -38.3 9.9 7.3 11.8 16.9 12.6 262 0.9 0.7 -06052300.RAP 1029 1.00 2536 9.6 -10.3 -39.5 8.5 7.9 5.6 9.7 18.1 43 0.6 1.3 -06051800.IAD 93 1.00 1009 8.4 -20.5 -45.9 6.7 7.2 11.9 16.0 20.3 66 0.6 1.3 -06051600.DTX 329 1.00 519 8.7 -20.5 -49.7 6.1 8.2 7.2 5.0 17.9 -7 0.1 0.7 -06041400.PIT 357 1.00 390 6.2 -20.1 -48.7 7.0 8.1 18.8 18.6 40.0 220 0.3 0.9 -06041400.BUF 215 1.00 383 6.2 -23.3 -49.9 7.6 7.6 21.6 26.8 55.7 237 0.5 1.4 -06011200.GSO 270 1.00 1374 9.5 -19.1 -46.5 7.5 7.7 21.9 15.6 28.9 253 0.8 2.5 -06010300.ILN 317 1.00 791 9.0 -19.3 -46.1 7.5 7.5 7.8 16.0 23.8 140 0.5 1.4 -05092900.FWD 171 1.00 1553 12.7 -5.9 -29.7 6.4 6.3 8.5 10.1 13.0 39 0.2 0.6 -05082700.EPZ 1252 1.00 2162 11.1 -6.5 -31.9 8.5 6.8 4.0 4.9 6.7 21 0.2 1.0 -05081800.LMN 317 1.00 3655 17.7 -4.1 -30.3 6.0 6.8 13.3 22.3 17.3 221 0.9 0.6 -05081700.GGW 700 1.00 1042 9.2 -11.1 -36.7 7.8 6.9 16.7 27.6 40.5 265 0.6 1.7 -05081100.GGW 700 1.00 805 10.1 -13.7 -37.9 7.4 6.5 15.6 30.5 38.9 170 0.6 2.1 -05050600.EPZ 1252 1.00 1672 8.0 -12.7 -40.3 8.6 7.5 15.0 27.7 28.8 178 1.3 1.2 -05050412.TBW 13 1.00 1839 14.1 -13.5 -39.3 7.3 7.0 10.0 15.8 33.3 187 0.9 1.0 -05030400.SGF 387 1.00 823 5.9 -25.9 -52.1 7.1 7.5 13.0 24.2 27.9 151 1.0 0.7 -04082800.OUN 357 1.00 4225 16.0 -7.1 -32.5 7.4 6.7 7.0 3.8 3.0 101 0.5 1.5 -04081700.TUS 779 1.00 2027 13.1 -8.9 -34.5 7.1 6.9 8.8 13.2 13.3 96 0.5 1.0 -04080900.TOP 270 1.00 2676 14.3 -11.5 -36.3 7.4 6.7 5.9 11.9 15.6 82 0.9 0.9 -04051200.AMA 1099 1.00 1922 9.7 -11.5 -38.7 8.0 7.4 19.1 15.0 8.4 282 0.7 1.6 -04051000.FFC 244 1.00 2006 11.4 -11.1 -38.3 5.4 7.4 4.0 4.7 11.0 -15 0.2 1.9 -04032100.FWD 171 1.00 2648 13.1 -15.5 -42.9 8.2 7.5 4.9 12.9 20.8 29 1.4 2.8 -04031500.DRT 313 1.00 1498 11.6 -15.5 -43.1 7.0 7.6 6.6 16.8 24.5 123 0.8 1.4 -03111712.TOP 270 1.00 1641 11.5 -17.3 -45.7 7.3 7.9 17.8 25.6 32.6 329 1.4 2.7 -03090900.TUS 779 1.00 2363 11.5 -8.3 -34.9 7.3 7.1 2.8 7.9 11.8 12 0.3 1.1 -03060900.RNK 654 1.00 2965 15.0 -9.1 -36.7 6.2 7.4 18.9 24.1 29.2 134 1.3 1.2 -03060200.DDC 790 1.00 1960 11.1 -9.5 -35.3 7.9 6.9 11.9 17.5 20.6 222 0.7 2.0 -03052700.ABQ 1620 1.00 713 7.1 -9.9 -37.1 8.3 7.3 3.1 14.7 20.6 12 0.2 0.6 -03052600.TFX 1131 1.00 994 8.3 -10.9 -37.7 8.0 7.3 9.1 16.0 15.9 59 0.4 1.3 -03051800.XMR 3 1.00 3602 16.0 -9.5 -35.9 7.0 7.1 5.6 8.6 10.7 -7 0.7 0.9 -03051800.TBW 13 1.00 3839 16.1 -8.7 -36.5 6.5 7.5 6.2 5.7 11.9 3 0.5 1.1 -03051200.JAX 9 1.00 3060 15.9 -7.9 -33.5 6.9 6.8 10.1 13.2 20.0 48 0.7 -999.0 -03051100.MHX 11 1.00 3585 16.0 -9.3 -37.7 7.3 7.6 11.9 16.2 15.0 104 1.3 0.9 -03050312.BMX 178 1.00 1402 9.7 -16.1 -41.9 7.5 7.1 7.9 13.8 38.5 72 0.6 1.8 -03050212.BNA 210 1.00 1865 10.3 -15.3 -44.9 7.0 8.2 12.1 13.0 18.0 55 0.7 2.2 -03050100.FFC 244 1.00 1429 11.1 -13.5 -40.1 6.6 7.2 1.0 6.9 6.4 5 0.2 1.6 -03043000.OAX 350 1.00 1064 8.9 -16.3 -44.3 7.4 7.8 18.4 29.1 32.0 353 0.9 1.9 -03042800.MFL 5 1.00 2735 16.7 -10.7 -35.7 6.4 6.7 12.3 11.7 25.5 83 0.7 0.6 -03042400.SHV 79 1.00 1456 13.1 -12.9 -38.9 7.2 7.1 15.2 26.1 36.8 278 1.1 0.6 -03041800.DNR 1625 1.00 1063 5.3 -18.1 -47.9 8.6 8.3 5.9 11.0 43.9 41 0.5 0.6 -03040500.LZK 78 1.00 1751 10.7 -14.9 -42.5 6.6 7.6 12.6 27.4 33.1 65 1.2 2.3 -03032100.DTX 329 1.00 1602 8.7 -21.3 -48.3 6.6 7.7 7.7 13.3 27.1 80 0.8 1.1 -03032000.ILX 178 1.00 713 8.0 -21.9 -36.7 6.9 4.2 5.4 3.5 11.4 -26 0.2 1.4 -03031500.TBW 13 1.00 3398 15.9 -13.7 -38.1 7.0 6.6 3.9 18.6 27.3 32 1.9 0.9 -02080400.SGF 387 1.00 4328 17.7 -5.5 -34.5 6.5 7.7 3.8 1.1 7.6 -11 0.3 1.5 -02080300.BMX 178 1.00 5098 18.4 -6.5 -35.1 5.8 7.6 11.5 9.6 10.8 33 0.6 1.4 -02072900.AMA 1099 1.00 3610 13.6 -6.5 -32.3 7.8 6.9 13.6 12.5 12.2 164 0.7 2.0 -02072700.RAP 1029 1.00 1688 9.4 -9.3 -37.5 7.5 7.6 14.5 21.0 28.6 139 0.7 1.3 -02072600.TOP 270 1.00 3390 13.8 -5.9 -33.9 7.5 7.4 11.9 16.9 16.9 168 0.8 2.2 -02072000.JAN 133 1.00 3501 17.6 -6.7 -31.9 6.1 6.7 5.7 6.1 7.9 58 0.3 0.6 -02070300.LBF 849 1.00 3367 14.1 -5.9 -35.3 7.5 7.8 11.5 14.0 6.2 158 0.7 1.2 -02070200.FFC 244 1.00 4268 16.3 -9.7 -36.1 6.6 7.1 7.3 7.8 4.3 46 0.7 0.6 -02060700.ABR 396 1.00 2252 9.0 -14.7 -43.9 8.1 8.1 8.2 12.4 18.1 118 0.9 1.2 -02060400.CHS 15 1.00 3170 15.2 -10.1 -34.9 7.6 6.7 11.7 9.7 10.8 33 0.8 0.6 -02052700.AMA 1099 1.00 2332 9.7 -11.1 -37.9 7.2 7.3 13.0 14.5 11.8 198 0.7 1.4 -02051800.CRP 13 1.00 5902 20.3 -10.5 -36.9 7.4 7.1 10.7 22.6 23.2 86 3.4 1.6 -02042300.OAX 350 1.00 614 6.4 -23.3 -46.3 7.9 6.5 15.2 26.3 36.6 133 0.8 1.4 -02012400.LZK 78 1.00 1343 13.1 -12.7 -41.1 6.6 7.8 20.2 32.5 40.7 290 0.9 0.6 -01062600.LBF 849 1.00 3931 12.7 -8.1 -35.3 8.1 7.3 8.1 9.3 8.1 119 0.7 1.5 -01062100.ABR 396 1.00 1118 8.1 -19.3 -47.7 7.0 7.9 3.6 4.2 12.4 14 0.3 1.3 -01061900.JAX 9 1.00 2584 17.2 -9.5 -35.5 6.1 7.0 5.0 4.8 8.3 13 0.3 0.6 -00080700.TOP 270 1.00 4476 17.3 -7.5 -33.1 7.2 6.7 11.7 17.8 22.9 72 1.4 1.8 -00072900.ILN 317 1.00 2735 14.3 -11.5 -37.7 6.7 7.1 8.0 13.4 21.0 68 0.9 0.6 -00072900.CHS 15 1.00 2462 16.1 -7.5 -34.9 5.6 7.3 3.3 9.3 13.2 4 0.3 0.6 -00072800.TOP 270 1.00 3666 15.3 -10.3 -35.3 7.6 6.8 9.1 22.0 26.4 115 2.1 2.6 -00072800.LBF 849 1.00 5581 17.1 -7.7 -35.5 8.1 7.5 9.6 25.0 21.1 187 2.8 3.1 -00072700.JAN 101 1.00 2066 12.5 -10.7 -35.7 6.4 6.7 4.2 8.0 8.4 -50 0.3 1.0 -00072300.OTX 728 1.00 2088 9.0 -12.3 -42.7 8.2 8.3 7.8 17.2 21.1 43 0.9 1.2 -00071900.GYX 125 1.00 997 11.4 -13.3 -37.7 6.0 6.6 18.8 27.0 36.1 107 0.6 1.0 -00071700.TOP 270 1.00 3927 15.9 -8.7 -31.7 7.9 6.1 14.5 8.9 14.1 198 0.8 2.4 -00071500.SHV 79 1.00 4004 17.2 -5.9 -31.1 6.0 6.7 6.2 4.6 8.6 46 0.3 0.6 -00071400.GRB 214 1.00 1743 12.0 -12.3 -37.9 6.9 6.9 13.4 21.5 42.9 195 0.9 1.7 -00071200.DDC 790 1.00 2941 14.4 -5.5 -30.7 7.2 6.7 10.8 11.3 11.7 196 0.4 1.4 -00070700.RAP 966 1.00 4065 14.2 -7.7 -35.3 8.6 7.3 10.8 29.4 33.3 111 2.3 2.1 -00070400.DDC 790 1.00 5142 18.1 -7.1 -30.7 7.6 6.4 11.4 9.7 19.2 114 0.9 2.4 -00070300.OAX 350 1.00 4633 18.5 -6.3 -32.3 6.9 6.9 9.9 10.6 19.6 133 0.7 1.9 -00070300.DDC 790 1.00 4558 17.2 -5.9 -30.9 7.5 6.7 11.7 13.6 22.7 66 0.9 2.4 -00070200.RAP 966 1.00 5621 15.6 -9.7 -36.3 8.7 7.3 15.9 21.5 22.7 263 3.3 2.2 -00070200.DDC 790 1.00 3566 16.2 -5.7 -34.7 6.6 7.7 5.5 14.2 21.9 38 0.6 1.3 -00063000.PIT 373 1.00 1086 9.9 -15.9 -40.5 5.5 6.8 8.1 22.0 37.9 77 0.5 1.8 -00062600.TOP 270 1.00 4052 17.8 -8.9 -32.7 7.6 6.4 2.4 1.3 23.9 26 0.6 2.3 -00062600.DDC 790 1.00 2618 13.5 -6.1 -32.3 6.7 6.9 14.3 15.8 16.9 51 0.5 1.6 -00062300.MHX 11 1.00 4167 18.6 -8.7 -34.1 6.1 6.8 9.7 6.0 6.1 89 0.5 0.6 -00062100.TBW 13 1.00 3180 17.1 -8.5 -32.1 6.4 6.4 8.9 12.2 19.0 49 0.7 0.6 -00060200.TOP 270 1.00 3517 16.1 -9.3 -34.5 6.9 6.7 4.9 10.4 16.3 39 0.8 0.8 -00060200.DVN 229 1.00 3451 16.4 -9.3 -35.5 7.3 7.0 14.2 14.1 11.0 175 1.1 0.6 -00060100.ILX 178 1.00 3208 16.1 -9.1 -37.7 7.0 7.7 20.7 17.9 15.6 163 1.2 1.8 -00053000.LBF 849 1.00 2258 9.9 -9.7 -37.9 9.2 7.6 16.9 27.2 31.9 294 1.4 1.1 -00051400.TLH 21 1.00 3542 15.9 -9.9 -37.7 6.9 7.5 5.4 4.2 4.2 -4 0.5 1.0 -00021800.JAN 101 0.88 1866 12.5 -14.9 -43.1 6.7 7.8 16.2 27.5 38.9 270 1.5 0.7 -00061100.DDC 790 0.88 3471 14.3 -7.9 -33.9 6.9 6.9 14.0 11.0 20.2 53 0.7 2.4 -00061800.RAP 966 0.88 1396 7.4 -18.9 -44.5 7.1 7.2 7.4 14.0 34.9 270 0.7 1.4 -00070600.DDC 790 0.88 2581 12.3 -7.5 -31.7 8.5 6.4 10.7 9.4 10.0 97 0.5 1.8 -00072800.BMX 178 0.88 2147 13.2 -9.5 -36.3 6.2 7.2 6.0 8.0 11.4 35 0.3 0.7 -00080200.DVN 229 0.88 4183 16.6 -9.7 -38.1 6.6 7.6 13.3 11.2 16.4 169 1.0 1.1 -00080300.PIT 373 0.88 2780 14.9 -9.7 -37.1 6.2 7.3 9.1 15.5 29.2 81 0.8 0.6 -00080400.BNA 180 0.88 3453 16.3 -9.9 -35.1 6.8 6.8 9.1 10.9 16.0 83 0.8 0.6 -00080500.LZK 165 0.88 3872 16.1 -6.3 -33.3 5.6 7.3 7.3 9.4 14.6 6 0.4 0.8 -00080700.DTX 329 0.88 4231 19.4 -7.3 -31.9 6.0 6.6 10.6 16.6 31.6 78 1.0 0.6 -00090300.OAX 350 0.88 3099 12.6 -10.1 -36.3 8.7 7.0 9.5 16.9 21.6 126 1.4 1.4 -01062200.DVN 229 0.88 1285 10.3 -18.1 -44.9 6.5 7.5 8.7 10.8 11.8 66 0.4 1.0 -01062600.CRP 13 0.88 3837 16.6 -8.5 -35.7 6.4 7.3 7.1 4.0 8.9 53 0.5 0.6 -02031000.GSO 270 0.88 819 11.0 -15.3 -41.3 5.8 7.2 19.8 24.6 29.7 236 0.5 1.2 -02052900.OAX 350 0.88 2754 13.0 -13.3 -40.9 7.1 7.5 10.0 7.5 7.0 127 0.6 2.6 -03031400.TLH 53 0.88 2141 11.6 -13.1 -43.3 6.3 8.3 5.7 10.5 9.0 39 0.5 1.1 -03042912.TOP 270 0.88 1617 10.6 -16.9 -43.9 7.8 7.5 11.0 16.7 22.5 238 0.9 2.8 -03050400.BIS 506 0.88 1467 8.2 -18.7 -47.3 7.4 8.0 8.8 15.4 16.1 86 0.8 1.6 -03060300.JAX 9 0.88 3513 16.1 -10.1 -36.5 7.6 7.1 11.4 11.1 10.3 111 1.0 0.6 -03060600.ABR 396 0.88 888 8.1 -19.9 -46.5 6.8 7.5 9.2 17.3 14.2 47 0.5 1.5 -03061600.TOP 270 0.88 1944 12.4 -11.9 -38.7 6.4 7.3 5.8 0.8 4.2 3 0.3 1.0 -03062000.GGW 700 0.88 1032 9.2 -9.7 -37.5 8.1 7.5 8.3 9.8 17.1 76 0.2 1.3 -03101712.JAN 101 0.88 1891 12.8 -11.5 -43.1 6.3 8.6 16.9 25.4 33.9 246 1.1 1.2 -03102600.CRP 13 0.88 3408 17.9 -9.9 -35.3 6.3 6.8 9.8 15.2 34.5 17 1.0 0.6 -03111800.OAX 350 0.88 957 10.0 -18.3 -43.3 6.8 6.9 20.0 41.2 58.6 88 0.8 2.5 -04040900.AMA 1099 0.88 1515 8.2 -16.7 -45.5 7.0 8.0 14.7 17.9 23.0 139 0.8 1.6 -04081800.PHX 384 0.88 1709 10.5 -9.1 -35.5 7.3 7.1 6.0 4.8 9.2 15 0.2 0.8 -04082700.ABR 396 0.88 1433 10.2 -15.1 -41.5 6.7 7.3 5.3 14.4 40.5 28 0.5 1.5 -04091900.LCH 10 0.88 2433 15.9 -6.9 -31.9 5.8 6.6 7.7 4.4 15.6 6 0.2 0.6 -04092000.OAK 3 0.88 242 7.3 -17.9 -36.7 5.5 5.2 6.5 27.4 30.4 56 0.2 0.7 -04100400.GSO 270 0.88 1385 13.2 -14.9 -40.1 6.5 6.9 10.4 15.2 26.8 101 0.6 1.4 -05081300.MAF 872 0.88 1568 12.8 -6.3 -31.7 6.5 6.8 6.9 11.8 13.7 82 0.2 0.6 -06013012.JAN 101 0.88 1058 10.0 -20.9 -45.9 7.1 7.0 18.9 38.7 46.0 71 1.1 2.6 -06032100.OUN 357 0.88 579 5.4 -25.5 -40.9 7.4 4.4 5.7 16.6 26.7 53 0.5 0.9 -06040700.FWD 171 0.88 2831 12.5 -12.5 -42.1 6.2 8.1 20.1 33.5 41.5 40 1.8 2.8 -06041200.TOP 270 0.88 726 8.4 -14.3 -42.9 7.0 7.9 23.1 33.2 37.2 232 0.5 2.0 -06043000.OTX 728 0.88 499 6.4 -17.9 -44.3 7.3 7.4 8.3 17.3 23.3 75 0.3 0.8 -89061200.AMA 1095 0.88 3301 13.2 -11.7 -39.3 8.7 7.5 9.2 12.9 25.2 167 1.4 2.3 -89062600.UMN 438 0.88 3812 16.2 -6.9 -33.3 6.3 7.0 2.0 0.7 10.8 -14 0.4 0.6 -89062700.DEN 1611 0.88 931 8.6 -11.1 -38.5 7.6 7.5 10.8 14.3 14.3 122 0.3 1.8 -89072700.AHN 246 0.88 3996 17.5 -6.9 -33.6 6.5 7.1 7.1 3.5 6.8 66 0.4 0.6 -89082500.AHN 246 0.88 3533 16.9 -5.1 -30.7 6.1 6.8 2.7 3.3 8.1 5 0.3 0.6 -89082600.AHN 246 0.88 3463 17.1 -5.6 -31.0 5.8 6.7 4.0 11.3 8.6 41 0.4 0.6 -89082900.GGG 124 0.88 3979 18.5 -4.6 -29.9 6.0 6.7 1.6 4.1 2.2 3 0.3 0.6 -90071000.PIT 360 0.88 3362 16.6 -6.7 -31.4 6.3 6.6 14.3 19.7 14.7 124 0.9 0.6 -90073000.AMA 1095 0.88 943 12.2 -7.5 -32.1 6.3 6.5 8.4 12.7 18.1 14 0.2 0.6 -90091900.OUN 357 0.88 3878 18.0 -6.7 -31.3 6.2 6.6 12.1 11.9 20.5 119 0.6 0.6 -97010900.SIL 8 0.88 909 13.1 -13.6 -37.2 6.7 6.4 33.7 39.7 37.0 511 0.7 -999.0 -98062500.DDC 790 0.88 2667 11.9 -7.3 -34.1 8.7 7.2 12.4 25.1 34.7 224 1.2 1.4 -90052100.SIL 8 0.85 3505 16.6 -10.6 -35.6 6.7 6.7 10.9 8.4 13.0 70 0.7 0.6 -03052100.TBW 13 0.80 2941 15.8 -9.5 -35.9 6.2 7.1 7.1 2.7 5.4 27 0.4 0.6 -91051700.JAN 91 0.80 2890 15.5 -8.9 -36.0 6.5 7.3 0.6 1.1 7.8 1 0.4 0.6 -00022400.LZK 165 0.75 1590 10.6 -18.1 -45.7 7.0 7.7 17.2 25.0 34.2 270 1.3 2.5 -00050300.JAN 101 0.75 1438 12.8 -12.9 -38.5 5.9 7.0 13.9 12.8 7.2 120 0.4 0.6 -00052200.LZK 165 0.75 2062 12.1 -13.5 -44.1 6.2 8.4 17.7 22.6 32.5 162 1.1 1.4 -00061800.JAX 9 0.75 2677 15.7 -7.9 -34.1 5.7 7.0 7.9 6.0 10.5 61 0.3 0.6 -00061900.WAL 41 0.75 2940 17.4 -7.9 -33.5 6.3 6.9 11.6 11.3 9.5 134 0.5 0.6 -00062500.JAX 9 0.75 2442 15.6 -10.1 -34.9 6.2 6.6 9.3 9.4 21.8 104 0.5 0.6 -00062900.GRB 214 0.75 860 8.9 -18.9 -47.9 6.4 8.1 14.1 17.0 24.4 108 0.5 1.1 -00071300.DDC 790 0.75 3064 15.1 -3.7 -31.1 6.1 7.2 9.2 6.2 10.6 0 0.2 0.6 -00071300.FWD 196 0.75 3103 14.9 -5.7 -31.9 6.5 6.9 13.9 10.6 11.4 120 0.4 0.8 -00071800.JAN 101 0.75 3305 15.8 -5.5 -29.7 6.0 6.3 13.1 13.9 14.4 -56 0.5 0.6 -00071900.JAN 101 0.75 3841 17.3 -6.1 -31.7 6.1 6.8 5.7 7.5 6.9 32 0.3 0.6 -00072100.TBW 13 0.75 4845 18.9 -6.9 -31.9 6.4 6.6 7.4 7.0 10.7 56 0.5 0.9 -00072300.GSO 270 0.75 2443 16.5 -9.1 -32.3 5.7 6.1 6.6 20.6 22.2 88 0.9 0.6 -00072400.GGW 700 0.75 3240 10.9 -11.1 -40.3 8.5 7.9 12.5 26.1 22.5 54 2.1 1.4 -00080400.LCH 10 0.75 3045 15.7 -7.5 -32.7 5.6 6.7 4.7 2.8 12.8 28 0.3 0.6 -00090200.SHV 79 0.75 1896 12.1 -7.5 -32.5 7.0 6.6 5.2 3.2 2.0 15 0.2 0.7 -01062400.BIS 506 0.75 4781 13.7 -10.9 -38.3 9.0 7.4 15.0 18.7 27.1 249 2.8 1.7 -02030812.ILX 178 0.75 533 7.2 -19.7 -48.7 6.9 8.2 16.1 31.5 49.1 599 0.5 1.3 -02051500.PIT 357 0.75 521 5.9 -27.9 -45.7 7.9 5.1 17.3 14.7 14.3 74 0.4 1.1 -02060400.JAX 9 0.75 3128 15.3 -8.1 -33.3 6.5 6.7 0.3 3.7 6.5 15 0.4 0.6 -02062500.LBF 849 0.75 3690 11.7 -10.3 -37.1 9.2 7.2 5.0 7.2 9.1 45 0.7 1.3 -02072000.LZK 78 0.75 6551 21.6 -8.5 -32.7 6.9 6.6 8.7 10.2 6.8 145 1.3 0.9 -03031500.OTX 728 0.75 801 6.3 -26.3 -49.9 7.5 6.8 18.3 24.9 28.7 240 1.0 1.5 -03032000.SGF 387 0.75 909 7.6 -22.1 -40.1 6.7 5.1 18.2 10.5 8.6 205 0.4 1.4 -03040922.XMR 3 0.75 2570 15.5 -10.3 -37.3 5.6 7.3 12.7 31.0 38.3 34 1.3 0.6 -03042300.DNR 1625 0.75 1183 6.7 -16.1 -46.5 7.9 8.5 12.2 19.1 35.2 265 0.7 1.2 -03050100.DNR 1625 0.75 1011 6.7 -20.1 -46.3 8.0 7.4 12.5 33.5 27.3 108 1.1 1.2 -03050200.BMX 178 0.75 2216 12.4 -12.9 -40.7 6.6 7.5 4.6 6.7 7.6 9 0.4 0.7 -03052400.PIT 357 0.75 707 10.0 -16.7 -44.5 6.5 7.7 12.1 26.5 23.6 65 0.5 1.0 -03060700.MFL 5 0.75 3041 18.2 -6.7 -31.3 5.6 6.5 0.9 2.8 9.3 5 0.3 0.6 -03061000.JAX 53 0.75 2482 16.0 -8.7 -33.9 6.7 6.7 10.8 11.3 22.4 13 0.5 0.6 -03061222.XMR 3 0.75 2144 17.1 -7.9 -32.5 6.1 6.5 5.2 4.6 6.1 65 0.2 0.6 -03061500.SHV 79 0.75 2511 16.2 -9.9 -33.9 6.3 6.4 13.5 21.1 32.8 91 1.1 0.6 -03061900.TFX 1131 0.75 1802 8.6 -9.3 -37.5 8.2 7.6 13.1 10.8 13.4 178 0.4 1.0 -03062000.BOI 874 0.75 491 7.0 -12.5 -39.7 8.2 7.4 17.9 23.3 18.1 141 0.3 1.0 -03062100.RAP 1029 0.75 2338 11.9 -10.3 -36.1 7.2 7.0 15.0 8.1 14.4 137 0.4 2.4 -03062200.IAD 93 0.75 1215 10.5 -17.1 -38.3 5.8 5.9 9.3 15.1 9.7 79 0.5 1.1 -03090900.GJT 1475 0.75 996 6.8 -12.3 -39.5 9.1 7.4 8.5 17.7 28.1 199 0.5 0.7 -03090900.MAF 872 0.75 2389 12.1 -7.9 -36.1 7.0 7.6 12.1 18.1 17.8 222 0.7 2.2 -03091000.JAN 101 0.75 1929 15.0 -9.5 -35.3 6.0 6.9 8.1 10.8 22.1 83 0.4 0.6 -03111300.BUF 215 0.75 418 8.1 -20.5 -44.7 6.7 6.8 18.0 46.9 65.5 335 0.4 1.5 -04030500.LZK 78 0.75 745 12.4 -10.1 -37.1 5.8 7.2 27.8 39.6 53.2 468 0.4 0.6 -04051300.OAX 350 0.75 1193 10.5 -13.7 -40.5 6.9 7.3 16.7 24.2 28.7 133 0.7 2.2 -04051700.FFC 244 0.75 2077 12.2 -12.1 -39.3 6.4 7.4 2.9 2.0 11.6 0 0.3 0.8 -04052300.BUF 215 0.75 1807 13.8 -10.6 -36.5 5.8 7.0 18.8 22.4 24.0 239 0.8 0.6 -04081700.PHX 384 0.75 2729 12.6 -7.9 -35.3 7.1 7.3 6.2 8.0 6.2 60 0.4 1.3 -04081900.DDC 790 0.75 2146 11.7 -6.3 -34.7 6.2 7.5 10.2 4.3 11.0 15 0.2 0.7 -04081900.OTX 728 0.75 1929 9.8 -11.3 -38.9 7.4 7.4 6.2 9.9 15.1 43 0.4 1.5 -04082800.JAN 101 0.75 3714 18.0 -7.5 -33.7 6.4 7.0 1.0 2.6 3.6 12 0.4 0.6 -04082800.PIT 357 0.75 3258 18.3 -6.1 -31.3 5.6 6.7 10.4 7.8 6.8 106 0.3 0.6 -04092800.DNR 1625 0.75 698 7.9 -13.9 -38.7 7.1 6.8 12.4 17.7 21.0 112 0.3 1.0 -04100400.CHS 15 0.75 1850 15.3 -10.7 -36.1 6.0 6.9 13.4 22.1 32.7 81 0.9 0.6 -05022200.BMX 178 0.75 1749 11.8 -15.9 -43.5 6.8 7.6 19.0 26.1 36.8 174 1.4 1.2 -05030700.OAX 350 0.75 324 5.7 -21.9 -50.1 7.4 7.9 13.6 14.9 9.6 156 0.2 0.9 -05042612.JAN 101 0.75 993 9.2 -17.3 -43.3 6.9 7.2 15.7 27.2 35.7 336 0.8 2.2 -05050500.OTX 728 0.75 1601 7.7 -19.1 -46.9 7.3 7.8 8.5 15.7 22.0 35 0.9 1.4 -05082100.OAX 350 0.75 2617 15.5 -6.9 -34.3 6.0 7.3 15.0 14.8 30.9 159 0.5 0.6 -05082400.SHV 79 0.75 3397 16.6 -5.3 -30.5 6.1 6.8 11.1 9.2 4.4 72 0.3 0.6 -06011400.JAX 9 0.75 1223 12.1 -15.1 -42.3 6.5 7.5 19.7 19.6 26.7 233 0.7 0.7 -89052800.CKL 140 0.75 2098 15.4 -8.1 -34.6 6.2 7.1 8.0 11.8 13.5 43 0.4 0.6 -89060400.PAH 126 0.75 3338 16.4 -9.7 -37.6 5.8 7.5 15.5 14.2 14.7 90 0.9 0.6 -89060700.AHN 246 0.75 2402 14.2 -13.0 -38.1 6.6 6.8 2.7 12.3 18.6 37 0.8 0.6 -89061300.CKL 140 0.75 2677 16.1 -8.6 -32.8 6.1 6.4 11.5 15.9 7.3 102 0.7 0.6 -89061500.AHN 246 0.75 1717 14.7 -7.5 -31.3 5.5 6.3 11.8 10.0 9.8 91 0.2 0.6 -89061600.ACY 23 0.75 2243 16.5 -7.6 -34.5 5.9 7.2 19.5 18.8 19.1 217 0.6 0.6 -89062200.CKL 140 0.75 2986 16.1 -10.1 -37.3 6.7 7.3 6.8 10.0 8.5 76 0.7 0.6 -89062300.GRB 210 0.75 1729 14.6 -8.4 -34.6 6.2 7.0 10.0 10.7 10.8 139 0.3 -999.0 -89062300.OUN 357 0.75 3217 16.0 -7.1 -34.1 5.9 7.2 6.9 12.8 14.9 113 0.6 0.6 -89062700.PIT 360 0.75 2924 16.0 -9.1 -33.7 6.8 6.6 7.9 8.1 4.9 69 0.5 0.6 -89070800.AHN 246 0.75 2876 16.8 -6.5 -32.3 5.8 6.8 4.3 4.1 4.8 33 0.2 0.6 -89071100.DDC 791 0.75 1858 11.9 -8.1 -35.3 7.6 7.3 12.4 8.5 14.0 249 0.3 2.1 -89072900.SIL 8 0.75 4031 18.8 -6.8 -31.8 6.3 6.6 3.9 4.1 4.4 37 0.4 0.6 -89073000.PAH 126 0.75 3630 17.9 -7.0 -33.2 6.4 7.0 7.4 11.4 9.0 58 0.6 0.6 -89073100.TOP 268 0.75 2685 14.5 -6.4 -31.4 6.7 6.7 12.0 9.8 13.0 117 0.4 0.6 -89081200.GRB 210 0.75 1782 11.3 -14.8 -41.6 6.7 7.3 3.9 4.1 9.5 39 0.3 0.6 -89081900.HON 392 0.75 984 13.1 -7.6 -33.3 7.1 6.8 12.1 14.0 17.9 244 0.2 -999.0 -89102800.OUN 357 0.75 1679 12.0 -12.7 -39.4 6.8 7.3 8.3 10.1 27.1 115 0.4 1.0 -90033100.TBW 13 0.75 2515 14.8 -10.0 -38.4 5.6 7.7 12.0 14.0 15.0 135 0.6 0.6 -90042100.OUN 362 0.75 1915 12.4 -14.1 -40.9 6.5 7.3 13.1 25.3 31.9 138 1.3 1.7 -90042200.SEP 399 0.75 2775 13.3 -11.7 -40.8 6.5 7.9 8.1 10.2 20.8 98 0.7 1.0 -90042400.1M1 172 0.75 2374 12.8 -12.6 -40.0 6.7 7.5 6.6 14.0 8.3 56 0.9 0.9 -90052500.MAF 873 0.75 3262 13.1 -7.2 -34.0 7.9 7.2 12.4 22.0 30.6 97 1.3 1.8 -90060400.PIT 360 0.75 390 9.5 -12.5 -36.7 5.6 6.5 14.6 26.0 37.7 57 0.2 0.6 -90060700.TBW 13 0.75 3262 17.0 -8.6 -34.5 6.0 6.9 4.1 1.6 7.3 8 0.4 0.6 -90061000.AHN 246 0.75 2847 14.8 -8.2 -33.4 5.9 6.7 5.6 8.6 9.9 50 0.4 0.6 -90070300.SLI 8 0.75 3250 18.4 -5.7 -32.8 5.8 7.2 7.5 11.8 14.5 79 0.4 0.6 -90070800.TBW 13 0.75 5452 20.0 -8.1 -31.6 6.5 6.2 5.9 7.8 15.4 11 0.7 0.6 -90072200.CHS 13 0.75 3537 18.4 -7.5 -32.4 6.2 6.7 7.1 8.3 10.2 88 0.4 0.6 -90072200.PAH 126 0.75 2541 16.9 -5.6 -30.4 5.7 6.6 11.4 13.3 15.3 80 0.4 0.6 -90072700.DDC 791 0.75 3550 14.7 -7.0 -32.7 7.6 6.8 6.0 7.6 7.2 84 0.5 2.2 -90072800.TOP 268 0.75 3231 16.5 -7.8 -32.8 6.7 6.6 9.8 8.8 11.3 281 0.5 0.9 -90073100.JAN 91 0.75 2834 14.6 -7.3 -33.8 6.1 7.0 0.7 5.1 4.3 -3 0.3 0.6 -90080400.STC 315 0.75 2284 13.1 -12.5 -34.8 7.3 6.0 8.7 5.3 20.0 45 0.5 1.4 -90081400.ALB 86 0.75 1251 14.6 -7.6 -33.8 5.7 7.0 20.7 31.1 21.6 261 0.5 0.6 -90081400.MAF 873 0.75 1598 13.7 -7.1 -32.0 6.2 6.6 2.3 4.4 16.6 35 0.2 0.6 -90081700.CHS 13 0.75 3949 19.5 -6.9 -32.2 5.7 6.7 11.2 14.2 20.9 101 0.7 0.6 -90081900.DEN 1611 0.75 1982 11.7 -7.8 -35.3 7.6 7.4 6.4 10.2 22.1 25 0.3 1.7 -90082000.PIA 200 0.75 4350 19.3 -6.5 -31.2 6.2 6.5 9.4 12.0 9.9 67 0.7 0.6 -90082200.BNA 180 0.75 2619 15.5 -6.1 -32.3 6.1 6.9 8.7 9.1 12.7 -10 0.3 0.6 -90082300.GGG 124 0.75 3016 16.2 -5.9 -30.3 6.0 6.4 5.3 1.3 5.5 35 0.2 0.6 -90082500.OUN 357 0.75 2800 15.7 -6.4 -31.1 6.6 6.6 5.3 5.0 11.9 63 0.3 0.6 -90082500.OVN 400 0.75 3418 17.2 -7.1 -33.6 6.4 7.0 10.0 12.0 21.9 181 0.6 0.7 -90083000.ACY 23 0.75 2413 15.2 -9.3 -34.4 5.8 6.8 9.0 13.9 22.7 62 0.6 0.6 -90101700.MAF 873 0.75 2870 12.3 -12.5 -40.6 8.0 7.7 7.7 14.9 16.2 78 1.3 2.3 -91051700.TBW 13 0.75 3306 16.1 -7.5 -34.7 5.4 7.2 3.8 4.0 0.9 -5 0.3 0.6 -91060600.CKL 140 0.75 2864 16.3 -8.6 -33.4 6.4 6.6 6.2 8.9 11.4 21 0.5 0.6 -94062400.GGG 124 0.75 3754 18.0 -5.5 -30.6 6.3 6.6 8.2 11.0 14.2 98 0.5 0.6 -94062400.HTS 246 0.75 2798 16.5 -5.5 -30.1 5.3 6.5 4.7 8.5 15.0 39 0.2 0.6 -94070200.LCH 5 0.75 2754 17.0 -6.8 -32.4 6.4 6.8 12.4 10.7 11.0 84 0.4 0.6 -97061700.BMX 178 0.75 3829 18.2 -6.9 -31.5 5.9 6.5 6.9 12.4 13.0 48 0.6 0.6 -97062400.MAF 872 0.75 3310 14.1 -9.9 -32.7 8.9 6.1 13.0 11.5 8.6 108 1.1 1.6 -97081700.TBW 13 0.75 3152 17.4 -7.3 -32.7 6.2 6.8 1.8 2.6 4.4 8 0.3 0.6 -97081800.SLC 1288 0.75 931 8.3 -10.3 -36.9 8.5 7.2 13.6 16.1 22.9 203 0.3 1.4 -97082200.ILN 317 0.75 520 9.6 -16.3 -41.3 5.8 6.9 3.9 17.5 30.9 50 0.2 0.7 -98062500.JAN 101 0.75 3507 17.3 -6.1 -32.3 6.0 7.0 7.1 2.3 8.6 -1 0.3 0.7 -98081000.SHV 79 0.75 3464 16.8 -6.5 -33.5 5.9 7.2 4.2 4.8 1.1 42 0.3 0.6 +DATE / RAOB ELEV REPORT MUCAPE MUMR 500TEMP 300 T 7-5 LR 5-3 LR 0-3SH 0-6SH 0-9SH SRH3 SHIP MODELb +95052300.DDC 791 6.00 4181 15.3 -9.6 -36.2 7.5 7.1 23.4 19.4 26.8 325 1.9 3.0 +91051100.MAF 873 6.00 4692 14.9 -10.8 -37.3 8.8 7.2 14.2 13.2 18.1 -37 1.9 2.7 +97061700.OUN 357 5.50 5751 18.8 -9.5 -36.1 7.4 7.1 14.5 23.6 45.9 116 3.1 3.5 +99012200.LZK 165 5.00 2240 12.3 -17.3 -41.7 7.6 6.8 23.0 26.3 32.1 294 2.3 3.0 +96061200.DDC 791 5.00 2820 13.7 -8.3 -34.7 7.6 7.1 12.9 20.3 15.8 142 1.2 2.5 +92072600.DDC 791 5.00 4794 17.4 -4.6 -31.2 6.8 7.0 18.2 17.4 14.6 176 1.0 0.8 +91052900.HON 392 5.00 3892 15.2 -12.3 -38.0 8.0 7.0 25.0 40.7 36.0 269 3.4 3.5 +90070800.BIS 504 5.00 3717 16.6 -9.8 -33.6 7.7 6.4 12.5 29.8 42.2 202 2.4 2.4 +57070300.RAP 966 5.00 4359 15.8 -6.7 -36.0 7.7 7.8 13.9 22.9 39.3 130 1.7 3.4 +06040300.LZK 78 5.00 3819 13.7 -14.9 -44.7 8.0 8.2 20.9 26.6 32.6 251 3.9 3.4 +99060100.DDC 790 4.75 4387 15.9 -11.3 -38.7 8.0 7.4 15.3 27.7 38.0 209 3.5 3.5 +96102100.OUN 362 4.50 2995 12.7 -12.9 -42.6 7.5 8.1 15.6 20.3 28.4 71 1.8 3.0 +96081100.LBF 847 4.50 2360 13.3 -8.4 -34.4 6.2 7.0 26.5 26.1 22.0 326 1.0 2.6 +96062700.TFX 1130 4.50 3835 13.9 -10.9 -37.2 8.3 7.1 21.8 37.1 44.3 297 3.0 1.6 +96051000.TOP 268 4.50 3884 15.6 -11.1 -40.4 8.8 8.0 22.1 18.3 22.3 234 2.2 3.3 +96050500.IAD 85 4.50 2432 12.1 -15.2 -41.7 7.2 7.3 15.9 25.0 25.5 36 1.9 1.9 +96030700.JAN 91 4.50 2362 14.0 -12.5 -38.9 6.8 7.2 16.8 34.9 36.9 196 1.8 0.6 +95060900.MAF 873 4.50 5653 17.8 -8.1 -37.7 8.1 8.0 12.8 18.7 33.5 83 2.2 2.9 +95060500.MAF 873 4.50 4358 14.9 -8.6 -40.7 7.6 8.7 16.0 23.2 32.0 181 2.1 2.9 +95051700.DDC 791 4.50 4878 15.6 -10.8 -39.2 8.5 7.7 8.9 26.6 40.7 43 3.8 2.6 +94060800.LBF 847 4.50 3400 13.0 -9.5 -37.5 7.8 7.6 8.1 18.7 18.4 109 1.5 2.4 +94042600.SEP 399 4.50 4409 16.3 -11.5 -41.9 7.4 8.3 21.2 26.7 26.2 138 3.3 3.3 +94040300.OUN 362 4.50 2075 10.1 -17.0 -44.2 7.6 7.5 18.7 31.2 39.3 163 1.9 2.1 +93101800.SEP 428 4.50 3958 15.7 -10.6 -34.9 7.0 6.5 23.2 31.7 30.5 441 2.6 2.2 +93101300.SEP 428 4.50 3151 14.2 -13.1 -36.5 8.0 6.3 15.0 22.3 31.8 307 2.4 2.9 +93092200.TOP 270 4.50 3665 16.8 -8.1 -37.9 6.5 8.0 21.3 21.3 37.9 502 1.3 1.3 +93092200.OVN 486 4.50 3685 15.4 -11.1 -40.4 8.1 7.9 23.5 31.9 33.2 492 2.9 4.0 +93072400.BIS 505 4.50 3597 15.3 -9.8 -38.4 5.8 7.7 14.9 21.0 33.2 263 1.4 2.3 +93062700.OVN 400 4.50 3720 15.0 -10.0 -38.2 6.3 7.6 9.4 22.3 28.9 140 1.7 3.1 +93060800.OUN 431 4.50 4917 17.0 -9.1 -34.9 7.1 6.9 9.7 30.6 26.7 195 2.8 2.6 +93050100.DDC 790 4.50 3206 11.1 -16.5 -44.2 8.0 7.7 15.4 24.0 29.9 194 2.7 3.7 +92073000.TOP 268 4.50 4074 16.6 -10.0 -37.8 7.5 7.5 11.8 22.5 22.1 164 2.2 2.4 +92073000.OVN 400 4.50 4366 16.6 -11.4 -38.3 7.4 7.3 13.9 22.3 23.7 216 2.7 3.2 +92062900.SEP 399 4.50 3761 17.4 -9.6 -33.8 7.8 6.6 13.7 21.8 15.6 248 2.0 2.8 +92062800.DDC 791 4.50 2750 13.8 -11.3 -34.2 7.8 6.2 15.2 20.6 41.3 315 1.6 2.9 +92062800.AMA 1095 4.50 4069 16.0 -10.3 -36.1 7.9 6.9 16.9 22.8 27.5 150 2.4 3.2 +91081400.GTF 1118 4.50 2524 11.5 -13.2 -37.4 8.5 6.6 15.3 25.8 28.9 213 2.0 2.0 +91072100.HON 392 4.50 5826 20.1 -6.1 -32.2 6.8 6.9 14.3 22.8 33.9 180 1.8 1.9 +91042912.BRO 7 4.50 4471 19.5 -9.8 -38.2 7.7 7.6 13.7 23.1 24.2 254 2.5 -999.0 +91032800.FNT 236 4.50 1860 11.3 -17.3 -44.0 7.6 7.4 26.8 47.0 45.4 431 1.8 2.9 +90051600.OUN 357 4.50 4398 16.7 -9.0 -36.4 7.6 7.3 23.2 25.5 44.9 180 2.5 3.1 +89080400.INL 359 4.50 3953 17.4 -11.5 -30.6 8.3 5.1 7.3 18.6 29.2 36 2.3 1.0 +89070300.SEP 399 4.50 5261 18.5 -7.6 -28.8 8.4 5.6 12.9 22.6 1.2 222 2.5 2.9 +89062700.GSO 277 4.50 4349 17.6 -7.3 -33.8 6.3 7.1 7.8 14.2 6.4 52 0.9 0.9 +89060700.SEP 399 4.50 3510 15.6 -7.9 -33.9 7.0 7.0 9.0 24.8 47.4 130 1.6 2.4 +89060400.MAF 873 4.50 3939 14.0 -10.0 -36.2 8.5 7.1 6.6 20.6 33.6 58 2.2 2.2 +02043000.FWD 171 4.50 5853 19.4 -10.9 -33.7 8.0 6.1 14.6 29.7 37.1 151 4.4 3.1 +02042900.IAD 93 4.50 2553 13.6 -16.7 -41.9 7.3 6.9 24.9 21.1 33.9 373 2.1 2.9 +08020600.SHV 79 4.25 2312 13.5 -14.1 -42.1 7.3 7.7 25.8 32.4 43.7 212 2.1 1.8 +07080400.RAP 1029 4.25 2983 15.6 -4.1 -30.9 6.2 7.1 18.3 22.7 35.8 270 0.7 0.9 +05042200.SGF 387 4.25 2944 12.6 -13.3 -42.7 6.8 8.0 15.1 21.3 15.6 193 1.7 2.2 +05042000.LBF 849 4.25 2460 10.1 -15.7 -43.9 8.9 7.8 16.6 15.3 22.3 255 1.4 2.9 +05031400.JAN 101 4.25 1382 11.1 -15.7 -40.7 7.6 6.8 19.2 25.5 49.7 161 1.1 2.8 +04081000.DNR 1625 4.25 3415 12.9 -9.1 -38.9 8.0 8.1 16.2 15.0 15.4 270 1.2 3.2 +04071318.ILX 178 4.25 6811 22.1 -10.9 -36.3 7.9 6.8 15.5 18.7 21.9 131 3.6 2.6 +04071300.LBF 849 4.25 7183 19.5 -7.3 -35.7 8.6 7.5 10.3 14.7 20.5 68 2.1 3.7 +04071200.GGW 700 4.25 2390 11.0 -13.7 -41.1 8.6 7.5 17.1 22.3 32.0 99 1.7 1.9 +04062200.AMA 1099 4.25 3828 13.8 -8.9 -36.5 8.0 7.4 17.8 26.2 40.5 141 2.3 2.3 +04053000.OUN 357 4.25 4526 16.8 -7.5 -36.5 7.8 7.7 15.8 24.4 40.4 224 2.1 -999.0 +04052200.AMA 1099 4.25 4265 13.7 -8.7 -36.3 7.9 7.4 13.6 21.5 23.9 176 2.0 2.1 +04040400.MAF 872 4.25 2746 12.0 -14.7 -43.1 7.0 7.8 14.4 19.5 31.1 262 1.6 2.7 +03051000.MHX 11 4.25 4373 17.1 -10.5 -35.1 7.3 6.6 14.1 22.7 23.2 146 2.5 2.1 +03050518.BNA 210 4.25 2730 16.0 -12.9 -36.4 7.1 6.5 18.3 37.0 37.2 239 2.2 -999.0 +03050500.SGF 387 4.25 5169 15.7 -13.5 -40.7 7.6 7.4 30.0 38.4 50.7 348 4.6 2.9 +03040600.FWD 171 4.25 2487 12.4 -14.3 -41.7 7.3 7.5 17.1 31.5 51.8 341 2.1 2.9 +01070300.LBF 849 4.25 5584 16.7 -8.7 -37.3 8.5 7.8 14.2 18.0 24.7 154 2.4 4.2 +98063000.TOP 270 4.00 6490 21.8 -5.3 -30.5 7.2 6.6 18.1 24.4 32.6 230 2.0 1.7 +98050800.FFC 244 4.00 4120 17.3 -12.3 -36.1 7.7 6.4 17.1 31.0 51.6 172 3.4 2.2 +97082200.LBF 849 4.00 3974 15.7 -9.7 -35.9 7.4 7.1 17.4 26.4 37.5 321 2.4 3.3 +96052300.LBF 847 4.00 2915 13.5 -11.1 -38.2 8.0 7.3 18.5 27.8 43.7 303 2.3 2.9 +95102700.SGF 394 4.00 2166 12.5 -13.8 -41.6 6.9 7.6 25.7 21.9 29.4 267 1.3 1.6 +95072600.DDC 791 4.00 5696 18.3 -10.1 -32.2 8.8 5.9 17.1 21.3 19.2 238 3.5 3.3 +95072500.FTD 196 4.00 2897 15.4 -10.0 -30.5 9.2 5.5 12.8 19.1 19.8 168 1.7 -999.0 +95051600.JAN 91 4.00 4861 17.9 -10.9 -37.6 7.8 7.2 8.6 14.9 18.5 -35 2.0 2.5 +95050600.FTD 196 4.00 2036 15.1 -11.1 -34.7 7.1 6.4 20.8 21.2 37.5 304 1.1 0.6 +93072300.HON 443 4.00 3720 15.7 -8.1 -37.4 6.0 7.8 15.4 19.1 22.5 130 1.1 1.5 +93071600.RAP 966 4.00 3230 14.1 -7.5 -34.9 7.7 7.3 18.6 25.0 35.8 97 1.5 3.2 +91041300.SEP 399 4.00 5008 16.9 -10.6 -40.5 6.8 8.1 12.2 21.8 27.4 137 2.6 3.4 +90090200.RAP 966 4.00 1762 11.3 -7.4 -33.9 7.5 7.0 14.1 23.6 32.7 181 0.6 2.1 +90070100.DAY 298 4.00 3541 16.6 -9.4 -33.6 7.1 6.5 8.6 19.9 24.5 154 1.5 1.8 +90060900.TOP 268 4.00 5571 18.5 -10.1 -39.2 7.3 7.8 14.8 22.6 16.4 252 3.0 2.7 +90051900.AMA 1095 4.00 2732 11.5 -9.3 -38.2 7.7 7.8 18.5 26.1 30.4 301 1.4 2.1 +90051500.AMA 1095 4.00 4543 14.8 -9.9 -36.2 8.2 7.1 19.2 24.7 33.8 473 2.9 2.2 +89071800.LBF 847 4.00 3622 15.4 -9.4 -35.6 8.1 7.0 22.9 38.9 37.6 361 2.4 2.9 +89062700.DDC 791 4.00 2840 14.3 -8.4 -36.6 7.6 7.5 12.7 19.4 19.2 167 1.1 2.2 +89061100.AMA 1095 4.00 3666 15.8 -8.7 -35.4 7.6 7.2 11.1 11.0 19.2 87 0.9 -999.0 +06092221.SGF 387 4.00 5071 17.6 -6.7 -36.1 5.3 7.9 21.0 31.6 37.0 202 1.6 1.1 +06071700.INL 361 4.00 3719 14.1 -11.1 -38.3 8.4 7.4 19.9 26.3 29.8 328 3.0 2.4 +06050600.MAF 872 4.00 3533 12.4 -12.3 -40.1 8.2 7.5 19.3 33.6 48.0 174 2.8 2.0 +04071318.DVN 229 4.00 6090 20.8 -11.1 -37.3 8.4 7.1 22.5 25.9 22.3 191 4.7 2.8 +03050300.BMX 178 4.00 4593 15.2 -15.7 -40.1 7.9 6.7 8.1 32.4 30.5 51 5.0 2.9 +02061300.DDC 790 4.00 6234 19.5 -6.9 -31.9 7.6 6.6 17.2 19.8 32.7 126 2.1 3.7 +02042000.MAF 872 4.00 2974 12.9 -8.1 -36.7 6.9 7.6 19.0 24.3 41.7 133 1.2 2.5 +95051900.BMX 178 3.75 3370 16.5 -9.9 -35.7 6.6 7.0 16.9 20.6 25.5 246 1.5 0.6 +03040400.OUN 357 3.75 2640 11.9 -15.1 -42.7 7.3 7.6 13.4 24.0 23.9 187 2.0 2.3 +99072600.LBF 849 3.65 4375 16.4 -6.7 -30.5 7.9 6.4 9.5 12.9 16.1 60 1.0 2.6 +99050400.OUN 357 3.65 5195 15.6 -14.9 -44.1 8.4 8.0 16.5 21.3 22.0 343 4.5 4.7 +99030600.LZK 165 3.65 1922 11.7 -18.5 -46.3 8.2 7.7 21.4 22.8 39.2 360 1.9 2.1 +98052200.SGF 387 3.65 4719 17.1 -9.9 -36.5 7.8 7.2 13.8 22.4 23.1 232 2.6 2.3 +98040800.ILX 178 3.65 1354 10.2 -19.7 -46.5 7.2 7.5 20.1 21.2 25.1 180 1.1 2.6 +03062300.OAX 350 3.65 6203 18.7 -9.3 -36.9 8.6 7.5 12.3 13.6 22.9 237 2.2 4.2 +02091900.OUN 357 3.65 4268 15.7 -6.1 -36.9 6.7 8.2 17.8 20.8 23.4 308 1.2 3.0 +02062400.ABR 396 3.65 5093 17.2 -10.5 -35.7 8.2 6.8 16.9 26.3 30.9 187 3.7 3.5 +02060500.RNK 654 3.65 5399 17.9 -9.7 -34.9 6.9 6.7 8.7 4.0 7.3 54 0.8 3.2 +02051200.TOP 270 3.65 4489 15.8 -11.9 -38.9 8.1 7.3 13.7 26.0 26.5 224 3.6 3.3 +02051100.MAF 872 3.65 4658 14.5 -9.3 -35.9 8.4 7.2 14.8 23.1 40.3 132 2.7 2.2 +01072100.GGW 700 3.65 3114 13.5 -10.7 -38.5 7.7 7.5 15.8 28.3 30.5 354 2.2 2.8 +01071800.ABR 396 3.65 5177 17.5 -9.9 -36.7 8.4 7.2 9.6 19.5 28.2 136 2.7 3.9 +01062100.DDC 790 3.65 4428 15.2 -10.7 -37.5 7.8 7.3 13.4 19.0 25.2 400 2.3 3.2 +01061400.DDC 790 3.65 5244 15.7 -8.9 -36.7 8.0 7.5 19.8 28.1 28.2 384 3.2 2.5 +01052500.JAN 101 3.65 3446 13.5 -15.1 -42.5 7.5 7.5 17.4 21.8 31.4 240 2.7 2.7 +01051800.AMA 1099 3.65 4695 13.9 -10.5 -38.9 8.6 7.7 16.1 13.2 22.8 86 1.8 2.1 +01050700.SHV 79 3.65 2945 14.8 -12.5 -39.3 6.5 7.3 9.0 15.7 22.1 110 1.2 1.7 +01050700.LZK 78 3.65 3512 14.7 -12.9 -40.5 5.9 7.5 7.3 18.7 26.3 77 1.6 3.4 +01041500.DDC 790 3.65 3892 13.1 -18.3 -43.1 9.0 6.9 24.4 43.1 54.7 233 5.4 2.5 +01040400.SGF 387 3.65 3277 12.8 -15.1 -43.1 8.3 7.7 17.2 22.4 28.9 310 2.8 3.1 +98062000.OUN 357 3.50 6048 19.0 -7.1 -35.9 7.8 7.7 13.7 15.4 11.2 209 1.7 3.9 +98052500.OUN 357 3.50 5688 18.0 -10.7 -39.7 8.1 7.8 9.9 21.9 28.7 172 3.5 4.2 +98052100.TOP 270 3.50 4680 16.5 -12.5 -38.1 8.4 7.0 9.8 10.5 23.7 100 1.7 3.8 +97062100.LBF 849 3.50 6058 17.3 -9.3 -35.7 8.8 7.2 13.9 23.1 25.1 129 3.7 3.7 +96062000.OAX 350 3.50 4081 16.3 -9.8 -37.1 8.6 7.4 18.9 19.0 24.4 271 2.1 -999.0 +90061900.BIS 504 3.50 1968 11.1 -13.5 -40.9 8.2 7.5 17.4 28.4 38.0 257 1.5 2.9 +90060900.IAD 85 3.50 3994 17.2 -10.9 -35.5 7.1 6.7 18.3 23.7 20.0 203 2.4 0.9 +90040600.SEP 399 3.50 3764 12.4 -14.9 -45.3 7.8 8.4 15.4 25.2 36.8 305 3.3 2.3 +90031400.OUN 357 3.50 3950 14.6 -16.1 -39.5 7.2 6.4 12.3 20.2 49.4 169 3.0 2.9 +89070300.STC 315 3.50 3556 15.6 -8.2 -35.9 7.0 7.4 8.5 15.8 21.4 128 1.1 1.4 +02081200.DDC 790 3.50 3415 14.0 -8.7 -34.3 8.0 6.9 10.7 15.7 27.7 157 1.2 3.1 +01061500.FWD 171 3.50 4260 17.3 -9.7 -33.7 7.9 6.5 11.1 15.1 9.7 74 1.6 2.2 +01041000.SGF 387 3.50 3476 13.0 -14.5 -41.3 7.9 7.4 12.5 21.6 30.3 141 2.7 2.6 +91060500.DDC 791 3.25 4631 16.9 -7.9 -35.5 6.5 7.4 11.0 15.3 15.4 74 1.2 3.5 +06070200.GRB 214 3.25 3255 15.4 -9.3 -35.9 6.6 7.1 14.7 17.0 24.9 99 1.1 1.5 +99060200.FWD 196 3.00 4928 17.3 -11.5 -37.3 8.8 7.0 15.3 15.0 30.3 171 2.4 4.5 +98062900.TOP 270 3.00 6895 22.0 -7.7 -33.1 7.0 6.8 19.3 20.6 27.3 335 2.5 2.4 +98062500.BIS 506 3.00 4591 15.5 -13.3 -41.3 8.1 7.7 15.5 15.9 15.4 89 2.5 3.0 +98062500.ABR 396 3.00 4448 16.3 -13.7 -40.5 8.8 7.3 11.2 17.4 28.7 42 3.0 3.7 +98061400.OAX 350 3.00 2830 13.3 -10.5 -39.5 7.7 7.9 15.3 24.4 45.4 219 1.8 3.4 +98052400.DDC 790 3.00 2630 11.6 -12.9 -41.5 6.7 7.8 9.8 22.0 27.7 101 1.4 2.3 +97061000.FWD 196 3.00 2699 15.6 -9.9 -34.9 7.0 6.7 10.9 18.7 24.1 98 1.1 1.3 +97052600.OUN 357 3.00 5143 17.2 -7.7 -38.5 5.9 8.3 15.0 30.4 32.4 148 2.0 2.6 +96070800.LBF 847 3.00 3341 15.3 -6.4 -32.5 7.0 6.9 20.6 30.0 41.5 390 1.3 2.2 +96062012.LBF 847 3.00 3418 15.2 -8.6 -35.4 7.9 7.3 16.5 22.6 25.0 380 1.7 3.3 +96061400.UNR 1037 3.00 3801 13.1 -11.0 -37.6 8.4 7.2 12.4 18.0 14.8 63 2.0 2.0 +96052700.OUN 362 3.00 3034 15.2 -9.4 -36.2 6.9 7.2 22.5 29.8 33.6 330 1.7 2.0 +96042000.ILX 178 3.00 2394 12.9 -14.6 -41.1 7.1 7.3 16.4 27.0 39.5 249 2.1 -999.0 +96033100.SHV 84 3.00 2891 12.7 -17.1 -46.6 7.6 8.2 20.1 27.4 35.5 163 3.0 3.1 +95082700.GGW 696 3.00 3094 11.7 -12.6 -38.7 8.3 7.1 13.6 26.8 41.0 162 2.4 1.7 +95082300.INL 359 3.00 3023 15.4 -11.6 -36.2 8.0 6.7 25.4 30.9 26.5 694 2.5 2.1 +95072400.DDC 791 3.00 3645 15.9 -9.9 -33.5 8.2 6.3 11.8 18.2 32.6 31 1.7 3.6 +95071500.LBF 847 3.00 3052 14.4 -7.0 -32.9 6.5 6.9 13.9 15.9 24.7 159 0.7 2.1 +95062300.LBF 847 3.00 2962 12.9 -11.1 -36.7 7.9 7.0 15.3 21.0 19.8 220 1.7 2.8 +95043000.FTD 196 3.00 4416 15.0 -13.3 -43.2 8.1 8.2 15.6 21.9 31.7 166 3.4 3.4 +95021400.PBI 6 3.00 2433 16.5 -11.0 -41.1 5.9 8.1 13.8 27.1 33.4 117 1.4 0.6 +94060600.DDC 791 3.00 4882 14.8 -8.8 -37.2 8.7 7.6 13.1 15.6 18.6 248 1.9 2.1 +94052600.FNT 236 3.00 2240 10.8 -16.3 -46.6 6.1 8.4 12.8 17.8 25.8 113 1.0 2.4 +94032800.CKL 140 3.00 2066 15.3 -9.6 -33.7 6.3 6.4 30.5 38.6 36.3 429 1.1 0.6 +93091900.DDC 824 3.00 1954 12.4 -10.4 -35.2 7.2 6.7 16.8 29.5 46.6 233 1.2 2.8 +93091900.AMA 1094 3.00 1911 12.4 -9.0 -33.5 7.7 6.5 16.5 32.7 35.4 264 1.1 2.4 +93082300.DDC 790 3.00 2608 13.3 -7.8 -33.0 7.7 6.8 13.1 19.5 27.0 83 1.0 2.0 +93070900.OVN 487 3.00 5546 19.7 -6.8 -30.3 6.9 6.2 16.9 29.4 24.3 345 2.3 0.6 +93070200.DDC 816 3.00 4895 17.1 -5.2 -33.2 7.2 7.4 13.3 16.4 21.4 237 1.0 2.8 +93060600.HAT 4 3.00 4948 16.0 -13.5 -38.7 8.3 6.9 12.6 15.5 17.2 70 2.8 3.9 +93050600.MAF 873 3.00 3784 13.9 -9.6 -37.2 7.2 7.4 18.6 27.0 25.4 149 2.3 2.5 +92070500.OVN 400 3.00 5051 17.3 -9.3 -36.1 7.4 7.2 16.1 21.8 33.3 243 2.5 3.5 +92062700.MAF 873 3.00 3224 13.9 -8.2 -32.9 7.7 6.6 13.0 23.7 38.8 253 1.6 2.5 +92032600.TBW 13 3.00 2104 12.6 -14.0 -43.1 6.5 8.0 18.6 32.2 37.0 195 1.5 1.1 +91052700.DDC 791 3.00 5493 17.0 -10.5 -38.1 8.4 7.4 13.3 21.7 29.3 81 3.4 2.9 +91040912.1M1 172 3.00 3450 14.2 -15.2 -42.3 8.0 7.5 11.5 19.7 20.8 134 2.7 -999.0 +91032700.TOP 268 3.00 2763 12.7 -12.3 -39.3 6.8 7.4 21.6 27.7 31.7 279 1.9 2.5 +90052700.OUN 357 3.00 4621 17.5 -8.8 -37.3 7.6 7.7 20.4 23.8 25.1 255 2.4 3.2 +90051500.OUN 357 3.00 4798 16.8 -10.7 -38.4 7.8 7.5 12.5 19.8 29.7 186 2.6 4.2 +89060700.AMA 1095 3.00 4752 15.4 -9.5 -33.5 8.5 6.4 21.7 30.5 55.6 303 3.3 2.4 +89060500.OUN 357 3.00 1640 12.5 -11.6 -39.9 7.0 7.7 8.8 15.7 23.9 53 0.6 0.7 +72081200.YRM 988 3.00 1989 10.9 -14.2 -40.4 8.3 7.1 14.0 24.6 35.0 132 1.5 2.4 +06052800.BIS 506 3.00 3434 12.5 -11.1 -38.7 8.1 7.5 10.5 11.3 12.7 74 1.0 1.8 +06052700.BNA 210 3.00 3535 16.1 -8.3 -35.3 5.9 7.2 17.7 12.8 17.2 196 0.7 0.7 +06052500.SGF 387 3.00 3470 15.6 -11.1 -37.1 7.6 7.0 13.6 14.3 7.3 162 1.4 2.0 +06042500.OUN 357 3.00 4007 15.5 -12.3 -39.3 8.6 7.3 15.4 20.1 21.2 105 2.8 3.3 +06042412.LMN 317 3.00 3248 14.1 -12.9 -39.7 8.2 7.3 16.6 25.4 28.7 413 2.8 3.2 +04081000.DDC 790 3.00 3147 14.6 -9.7 -36.3 7.7 7.1 13.0 21.0 22.0 222 1.6 3.0 +04070200.AMA 1099 3.00 5137 16.9 -8.1 -37.7 7.4 7.9 18.0 14.0 16.6 80 1.4 3.0 +04052300.OAX 350 3.00 4333 15.6 -12.3 -40.7 7.6 7.8 19.6 32.4 28.9 289 3.6 3.0 +04051700.DDC 790 3.00 2200 10.0 -11.9 -41.3 8.4 8.0 20.5 31.7 30.2 390 1.6 1.5 +04042200.OUN 357 3.00 2363 12.2 -13.5 -39.5 7.0 7.1 16.9 24.3 33.8 385 1.6 2.7 +04041900.OAX 350 3.00 3136 11.9 -15.1 -40.5 8.2 7.0 20.5 33.8 44.9 394 3.0 1.9 +03062800.DDC 790 3.00 2329 11.4 -9.3 -38.9 6.7 8.0 10.8 16.9 26.8 138 0.7 2.2 +03062400.LBF 849 3.00 6189 18.6 -8.7 -38.9 8.1 8.1 21.7 30.8 31.6 381 3.8 4.8 +03050420.SGF 387 3.00 4524 15.8 -11.9 -40.7 7.1 7.8 25.2 35.4 47.9 480 3.3 3.2 +03042100.SHV 79 3.00 2947 15.5 -13.5 -38.7 7.5 6.8 14.3 24.0 38.0 110 2.3 0.9 +01090900.FWD 171 3.00 4304 17.1 -8.9 -35.7 8.2 7.1 7.7 14.1 12.0 97 1.4 2.7 +01053000.AMA 1099 3.00 5827 16.4 -9.7 -38.5 8.2 7.7 25.0 26.1 29.7 268 3.9 2.8 +01051900.LZK 78 3.00 4269 16.6 -12.5 -37.3 8.1 6.7 9.9 18.5 25.8 98 2.6 2.7 +00080600.OAX 350 3.00 5525 19.0 -7.1 -33.1 7.5 6.9 9.4 15.0 22.8 56 1.4 3.1 +00062900.MAF 872 3.00 3565 14.8 -6.3 -31.1 6.3 6.6 9.6 10.5 16.7 29 0.5 1.8 +00050400.FWD 196 3.00 2731 13.2 -14.3 -40.3 6.3 7.1 19.0 21.7 28.5 327 1.7 3.0 +99081800.LBF 849 2.75 5554 18.3 -8.9 -32.5 7.8 6.4 10.7 23.7 25.1 143 2.9 3.4 +99070100.MAF 872 2.75 3989 13.7 -2.5 -33.9 7.5 8.3 10.5 14.9 13.7 146 0.8 2.0 +99061900.DDC 790 2.75 4141 13.9 -11.3 -40.3 7.3 7.9 13.4 22.5 29.0 346 2.5 2.4 +99061200.AMA 1099 2.75 4400 14.7 -10.3 -36.3 7.7 7.0 18.8 26.2 36.6 210 3.0 2.4 +99060300.AMA 1099 2.75 5087 15.6 -10.3 -36.5 8.7 7.1 15.5 18.6 49.2 289 2.7 2.5 +98061400.OUN 357 2.75 6689 20.5 -6.5 -32.5 7.7 6.9 17.9 32.8 42.7 262 2.9 4.0 +98052500.DDC 790 2.75 2688 12.5 -12.1 -40.7 7.2 7.8 13.7 27.9 32.0 180 1.9 2.7 +98040900.BMX 178 2.75 3341 15.8 -13.9 -39.5 7.9 7.0 25.9 40.1 51.5 296 3.2 2.0 +97061600.DDC 790 2.75 3187 13.5 -10.9 -36.5 7.7 6.9 11.9 23.3 39.3 26 2.0 2.7 +97061200.TOP 270 2.75 1552 12.6 -11.7 -38.7 7.1 7.3 11.6 23.5 30.2 141 0.9 0.9 +97052700.SGF 387 2.75 4440 16.3 -9.9 -38.1 7.0 7.6 16.3 22.6 25.0 276 2.3 2.6 +97052700.OUN 357 2.75 5907 18.0 -8.7 -37.7 6.4 7.8 17.6 17.5 23.9 271 1.9 3.7 +97042100.SGF 387 2.75 1773 9.4 -16.5 -45.7 7.4 8.1 23.3 25.4 23.9 405 1.4 2.0 +97041100.MAF 873 2.75 4076 11.9 -15.0 -45.9 8.2 8.5 20.8 23.7 30.7 260 3.3 2.1 +97032900.BNA 180 2.75 1618 11.1 -15.6 -42.6 7.4 7.4 18.1 25.2 15.3 389 1.3 3.0 +97012500.SIL 8 2.75 2563 13.0 -16.5 -46.0 7.5 8.2 18.3 18.3 25.8 145 1.8 2.8 +96092100.FTD 196 2.75 2870 16.4 -9.4 -37.2 6.5 7.4 15.7 26.4 32.6 136 1.5 -999.0 +96083000.DEN 1611 2.75 2478 11.7 -9.1 -36.2 7.8 7.3 17.6 26.2 28.9 86 1.3 2.3 +96080100.DEN 1611 2.75 3920 13.5 -7.8 -34.9 8.5 7.3 15.0 22.6 26.3 276 1.9 2.1 +96072400.DDC 791 2.75 3068 14.3 -11.1 -36.0 8.6 6.7 16.8 27.6 36.6 203 2.6 2.7 +96062500.AMA 1095 2.75 3778 13.9 -9.4 -33.2 8.5 6.4 7.0 22.9 28.2 123 2.2 1.9 +96061400.LBF 847 2.75 2384 12.4 -8.6 -36.2 6.5 7.4 12.0 15.4 25.0 102 0.6 2.2 +96061300.FFC 246 2.75 2727 13.7 -9.1 -36.5 5.7 7.4 12.9 12.9 13.1 152 0.6 1.0 +96061200.AMA 1095 2.75 3079 11.9 -8.8 -38.1 8.0 7.9 18.3 24.3 30.2 373 1.5 1.9 +96060300.SGF 394 2.75 2739 11.7 -15.9 -42.2 7.1 7.2 14.8 26.4 35.9 90 2.3 2.1 +96060200.JAN 91 2.75 1863 16.1 -7.5 -32.6 5.5 6.8 11.3 12.7 20.3 168 0.3 0.6 +96060100.ABR 397 2.75 2276 12.6 -13.4 -40.4 6.2 7.4 24.6 22.4 27.2 370 1.3 2.2 +96053000.MAF 873 2.75 3675 14.9 -7.0 -32.9 7.7 6.9 19.0 35.1 40.6 321 1.7 2.5 +96052600.MAF 873 2.75 3464 14.1 -6.2 -36.5 7.7 8.1 22.5 28.7 42.1 240 1.4 2.9 +96052500.AMA 1095 2.75 3927 13.5 -11.3 -36.6 9.1 6.9 16.4 20.3 4.9 101 2.6 1.9 +96051800.OAX 350 2.75 4523 15.3 -11.1 -39.7 8.8 7.8 12.9 16.0 21.2 68 2.3 -999.0 +96051700.UNR 1037 2.75 4365 14.8 -8.1 -37.0 8.0 7.8 15.0 25.5 28.7 219 2.3 2.5 +96042200.TOP 268 2.75 1574 10.9 -16.6 -42.6 7.3 7.2 14.6 45.6 54.3 145 1.3 2.3 +96042200.OUN 362 2.75 2260 12.7 -10.9 -36.6 5.9 7.0 18.5 38.3 48.8 500 1.2 2.3 +96031600.FFC 246 2.75 890 9.6 -19.2 -39.7 7.8 5.7 20.5 28.8 55.2 353 0.9 2.2 +95081800.BIS 503 2.75 5585 18.4 -7.0 -34.2 7.7 7.3 10.6 10.6 17.3 142 1.0 3.3 +95072400.AMA 1095 2.75 2225 13.3 -7.8 -30.1 8.5 6.0 13.1 21.6 25.1 124 1.0 2.9 +95071500.GRB 210 2.75 5409 19.0 -8.5 -30.8 8.1 5.9 8.0 12.1 9.0 69 1.5 3.0 +95071200.OKX 20 2.75 2900 13.9 -15.6 -43.2 6.9 7.6 8.1 12.7 13.6 48 1.3 2.4 +95070300.DDC 791 2.75 2905 14.2 -9.6 -38.9 6.8 7.9 12.3 18.2 21.4 111 1.1 2.3 +95070300.AMA 1095 2.75 3838 14.7 -11.5 -36.5 8.8 6.8 8.2 22.8 29.0 115 2.9 2.5 +95062800.LBF 847 2.75 2880 12.4 -10.1 -37.2 7.7 7.3 13.9 22.0 19.7 208 1.5 2.5 +95062100.OKX 20 2.75 3918 17.1 -9.8 -34.9 7.1 6.7 11.4 18.4 25.8 18 1.6 1.0 +95060300.AMA 1095 2.75 3024 12.4 -9.6 -36.5 8.2 7.2 15.7 22.4 37.2 346 1.6 2.0 +95052200.LBF 847 2.75 2027 10.4 -14.9 -42.1 7.4 7.4 18.7 28.3 33.3 221 1.6 2.1 +95051400.UMN 438 2.75 5278 16.5 -10.3 -38.0 6.9 7.5 22.3 28.0 26.2 211 3.3 3.2 +95042000.FTD 196 2.75 2621 14.6 -13.3 -38.5 7.7 6.8 25.8 39.5 59.2 498 2.3 2.4 +95040900.TOP 268 2.75 2836 10.7 -17.5 -44.5 9.2 7.5 16.5 21.4 31.9 120 2.6 1.9 +94070700.HON 392 2.75 3051 16.5 -8.8 -35.7 7.2 7.2 10.2 20.5 18.6 159 1.3 0.6 +94070200.OAX 350 2.75 5257 18.5 -10.1 -33.0 8.0 6.2 15.5 26.5 25.4 416 3.6 3.2 +94070100.STC 315 2.75 3701 14.3 -11.6 -39.6 7.3 7.6 19.0 27.2 25.1 399 2.7 2.7 +94062600.JAN 106 2.75 2842 16.1 -9.5 -35.0 6.4 6.8 12.4 24.0 32.8 130 1.3 0.9 +94062500.HON 392 2.75 1962 11.8 -10.8 -39.7 6.4 7.8 15.4 27.8 33.5 211 1.0 2.2 +94061900.JAN 91 2.75 3177 16.8 -7.5 -32.7 5.9 6.7 3.8 11.5 12.4 42 0.5 0.6 +94061800.AMA 1095 2.75 2676 11.9 -7.0 -33.1 8.2 6.9 10.7 11.0 11.3 171 0.5 1.6 +94061200.TOP 268 2.75 2320 13.9 -9.5 -36.5 6.6 7.3 15.8 23.9 24.4 117 1.1 0.9 +94061200.AMA 1095 2.75 4015 14.7 -8.0 -33.7 7.8 6.9 18.4 26.7 19.9 302 2.2 2.7 +94061100.AMA 1095 2.75 2164 12.3 -8.3 -36.1 7.3 7.5 16.6 19.5 20.3 229 0.7 2.8 +94060600.TOP 268 2.75 3953 16.5 -9.3 -35.1 8.1 6.9 15.4 16.1 27.7 394 1.5 2.5 +94060500.HON 392 2.75 3871 14.2 -11.6 -38.7 8.5 7.4 12.0 21.4 19.2 202 2.6 2.4 +94053000.SEP 399 2.75 5032 17.5 -10.6 -36.6 8.2 7.0 16.1 27.0 23.8 291 3.8 3.9 +94052500.OUN 362 2.75 3912 15.0 -11.5 -38.1 7.4 7.2 13.2 22.0 36.2 122 2.4 3.0 +94041100.UMN 438 2.75 2040 12.6 -16.5 -41.0 7.6 6.7 19.9 37.8 45.4 486 2.1 2.5 +94012700.GGG 124 2.75 2167 13.2 -15.9 -42.4 6.8 7.3 17.5 31.0 32.3 306 2.0 0.7 +93102000.DRT 313 2.75 3433 15.5 -8.9 -36.3 6.4 7.4 13.4 25.4 34.0 35 1.6 1.6 +93101900.GGG 124 2.75 3105 15.7 -9.8 -36.9 6.9 7.3 10.3 23.5 33.9 105 1.6 0.7 +93101300.CRP 14 2.75 4367 17.3 -8.6 -37.2 6.3 7.7 14.8 20.2 29.8 227 1.5 1.5 +93090400.IAD 85 2.75 2779 15.6 -5.9 -32.6 5.7 7.1 12.4 15.2 15.6 149 0.5 0.6 +93070700.DDC 790 2.75 5334 17.0 -6.0 -36.1 7.2 8.0 16.5 27.9 28.2 154 2.0 3.1 +93070700.AMA 1094 2.75 5327 17.0 -4.7 -32.2 7.8 7.3 11.4 21.3 20.0 127 1.6 3.8 +93070500.DDC 790 2.75 4186 17.1 -5.4 -31.1 6.7 6.8 16.6 30.6 34.9 146 1.3 1.2 +93062400.LBF 849 2.75 3944 16.0 -8.6 -37.5 8.1 7.7 18.1 21.9 33.8 178 2.0 2.8 +93062400.DEN 1611 2.75 3442 11.7 -9.6 -38.0 8.8 7.8 15.8 32.0 42.3 211 2.2 1.8 +93061900.AMA 1094 2.75 2140 12.8 -7.8 -33.2 7.0 6.7 14.4 22.7 23.3 146 0.8 1.9 +93051600.DDC 790 2.75 3614 12.8 -9.8 -40.4 6.6 8.3 12.6 19.4 23.7 161 1.4 2.5 +93050600.AMA 1094 2.75 4478 13.2 -13.6 -38.2 8.6 6.7 16.6 34.6 38.4 340 4.5 2.0 +93050100.AMA 1095 2.75 4085 11.6 -14.5 -42.9 8.1 7.8 15.3 25.7 15.8 234 3.4 1.9 +93042900.MAF 873 2.75 2435 11.7 -10.9 -36.0 7.1 6.8 20.8 29.3 37.4 551 1.4 2.2 +93042800.MAF 873 2.75 1494 10.4 -10.6 -38.7 6.9 7.6 12.9 19.6 25.8 150 0.6 1.8 +93042500.UMN 438 2.75 2317 11.4 -14.6 -42.2 6.9 7.6 18.2 25.2 33.1 198 1.6 2.4 +93042000.GGG 168 2.75 2342 12.4 -13.3 -42.9 8.0 8.1 17.5 26.7 28.4 156 2.0 2.7 +93040200.WAL 13 2.75 1625 10.9 -18.5 -46.2 7.3 7.7 26.8 30.7 48.4 200 1.5 2.4 +93033100.UMN 440 2.75 2598 11.1 -16.5 -43.6 6.4 7.5 19.7 29.7 28.9 117 2.0 2.1 +93033100.1M1 204 2.75 2471 11.9 -15.1 -43.9 7.2 8.0 17.8 30.2 27.1 54 2.1 2.8 +92101600.SEP 399 2.75 3654 14.6 -12.1 -37.5 7.7 6.9 12.6 16.4 22.7 227 1.8 2.9 +92073000.LBF 847 2.75 3544 15.0 -10.3 -38.2 7.9 7.5 22.0 25.7 33.8 335 2.4 3.0 +92062700.AMA 1095 2.75 3165 14.1 -10.0 -34.2 7.7 6.5 12.4 16.6 29.9 191 1.3 2.9 +92061900.DDC 791 2.75 2598 12.8 -8.3 -34.7 7.9 7.1 15.7 25.1 40.5 114 1.3 2.7 +92061900.BIS 504 2.75 1791 11.0 -14.4 -39.4 6.9 6.9 13.0 27.4 24.4 106 1.3 2.5 +92061300.AMA 1095 2.75 2821 14.7 -8.8 -34.4 7.2 6.9 12.0 19.1 36.4 165 1.1 2.7 +92061200.MAF 873 2.75 2387 13.8 -8.2 -32.3 7.4 6.4 13.3 26.7 34.6 178 1.3 2.0 +92060500.AMA 1095 2.75 2870 13.4 -9.4 -37.0 7.5 7.4 12.2 17.5 25.9 249 1.1 2.6 +92030600.1M1 172 2.75 2572 11.5 -21.1 -44.4 7.2 6.5 17.3 22.5 26.7 194 2.4 2.3 +92021500.UMN 438 2.75 1724 10.2 -16.9 -44.0 6.4 7.5 24.2 33.2 28.2 289 1.3 2.2 +91072200.HON 392 2.75 4474 19.3 -6.8 -31.8 7.2 6.7 11.1 17.3 24.1 198 1.2 -999.0 +91070500.GGW 696 2.75 2308 11.4 -9.9 -38.5 7.0 7.7 6.7 17.5 23.9 144 0.8 2.2 +91070500.BIS 504 2.75 2941 13.3 -9.3 -37.6 6.4 7.6 19.3 21.4 26.6 206 1.2 2.4 +91062000.HON 392 2.75 2691 13.9 -10.5 -37.0 7.0 7.2 16.1 22.1 20.0 282 1.4 1.2 +91061900.LBF 847 2.75 3600 13.0 -12.0 -40.0 8.6 7.6 13.5 15.2 20.9 219 1.7 2.6 +91061500.GRB 210 2.75 3430 17.6 -8.7 -32.3 6.7 6.3 21.7 13.9 17.0 161 0.9 0.6 +91061500.BIS 504 2.75 2379 13.0 -11.9 -35.8 6.6 6.5 13.2 22.5 25.2 152 1.3 2.6 +91060500.OVN 400 2.75 2813 14.6 -10.1 -31.5 6.5 5.7 8.4 17.1 19.6 177 1.0 3.1 +91053000.RAP 966 2.75 2814 10.9 -15.7 -43.2 8.1 7.6 13.0 14.5 28.4 159 1.4 2.0 +91053000.OVN 400 2.75 4446 16.8 -10.2 -36.3 6.8 7.0 14.3 18.2 19.0 31 1.8 2.7 +91052500.AMA 1095 2.75 3416 13.7 -10.5 -37.1 7.0 7.2 17.0 17.4 13.8 124 1.4 2.5 +91051800.UMN 438 2.75 3444 15.1 -11.0 -34.2 7.4 6.2 9.4 11.9 21.0 59 1.1 1.2 +91051700.UMN 438 2.75 3299 15.9 -10.6 -35.6 7.6 6.7 14.4 16.1 11.8 174 1.4 1.9 +91051200.RAP 966 2.75 4430 14.1 -11.0 -39.1 7.9 7.6 26.6 23.5 33.5 437 2.9 2.5 +91051100.AMA 1095 2.75 5629 15.6 -10.7 -37.8 9.0 7.3 14.5 16.5 21.5 314 2.9 2.5 +91042800.GGG 124 2.75 4554 18.9 -10.5 -37.7 7.2 7.3 15.4 29.5 19.6 140 3.0 2.2 +91042700.OUN 357 2.75 4751 16.6 -11.5 -41.7 7.0 8.2 20.6 23.6 26.4 376 2.9 3.7 +91042700.GGG 124 2.75 5164 18.9 -10.7 -38.1 8.2 7.5 12.4 18.9 27.6 209 2.8 2.7 +91041300.OUN 357 2.75 4063 14.1 -13.7 -42.3 8.0 7.8 17.1 22.0 25.1 205 3.2 2.9 +91040300.OUN 357 2.75 1560 10.1 -19.8 -43.3 7.3 6.6 15.1 22.6 41.7 275 1.3 1.5 +91032700.DDC 791 2.75 3132 12.4 -14.2 -40.5 8.2 7.2 18.9 40.7 44.0 160 2.9 2.1 +91032200.UMN 438 2.75 2632 11.5 -15.3 -44.0 7.0 7.9 18.8 33.0 35.3 371 2.1 2.5 +90090600.STC 315 2.75 4899 19.5 -6.8 -33.9 6.2 7.2 14.7 21.0 17.1 294 1.4 1.0 +90082800.SSM 221 2.75 5115 18.2 -8.5 -36.7 6.2 7.5 20.5 31.6 29.9 334 2.4 1.1 +90081100.LBF 847 2.75 3971 14.8 -9.0 -36.8 7.5 7.5 14.3 25.6 21.5 282 2.2 2.9 +90070700.BIS 504 2.75 3274 14.9 -7.5 -34.7 6.9 7.3 12.9 19.0 25.7 316 1.0 2.2 +90070300.BIS 504 2.75 6982 21.3 -6.3 -31.9 8.2 6.8 14.9 23.0 29.6 172 2.7 4.6 +90061900.LBF 847 2.75 7070 19.2 -6.1 -35.5 8.4 7.9 18.5 30.2 38.1 266 3.2 3.6 +90060200.STC 315 2.75 2697 13.4 -13.3 -39.7 8.5 7.2 10.4 18.6 17.2 132 1.8 2.2 +90060200.LBF 847 2.75 3719 13.6 -10.8 -39.9 7.9 7.9 16.4 15.6 29.4 89 1.6 2.4 +90053100.GGG 124 2.75 4743 19.3 -5.7 -33.3 6.1 7.3 21.5 27.2 25.7 317 1.4 0.7 +90052000.OUN 357 2.75 4565 15.3 -10.8 -39.0 7.1 7.6 12.1 13.7 14.7 94 1.6 3.1 +90051900.LBF 847 2.75 3954 12.1 -13.9 -42.1 8.6 7.8 16.2 25.1 24.6 398 3.4 2.0 +90051700.GGG 124 2.75 3234 17.5 -8.3 -36.2 7.2 7.4 17.6 24.7 35.1 304 1.5 0.6 +90050100.AHN 246 2.75 4557 14.9 -12.6 -41.5 7.7 7.9 19.7 14.7 9.3 92 2.1 3.4 +90042800.GGG 124 2.75 2263 12.9 -14.9 -41.0 6.6 7.1 12.8 14.1 25.3 84 1.0 2.8 +90041700.OUN 357 2.75 3717 13.6 -15.0 -44.3 8.3 8.1 17.2 11.5 20.5 152 1.7 3.8 +90031400.PIA 200 2.75 2115 12.4 -14.4 -41.2 6.9 7.4 15.3 18.1 24.1 206 1.1 2.6 +90021600.JAN 91 2.75 2047 15.2 -10.9 -40.4 6.6 8.0 18.9 20.9 34.6 124 1.0 -999.0 +89090400.LBF 847 2.75 4599 17.3 -8.6 -36.0 8.3 7.3 8.6 29.6 38.8 223 2.9 3.3 +89082900.STC 315 2.75 1959 14.6 -10.0 -35.2 6.8 6.8 18.0 26.3 44.7 147 1.1 1.1 +89082200.STC 315 2.75 3346 16.2 -11.1 -35.6 6.9 6.7 11.9 20.6 30.6 173 1.7 1.2 +89082200.OMA 400 2.75 4223 17.9 -8.3 -30.9 7.0 6.0 15.0 22.2 45.4 138 1.8 0.9 +89082200.HON 392 2.75 4160 15.6 -9.4 -38.2 6.9 7.8 14.8 22.9 28.9 107 2.0 3.3 +89081600.AMA 1095 2.75 2669 12.8 -7.1 -34.8 6.9 7.4 10.5 17.0 24.9 158 0.7 2.5 +89062600.RAP 966 2.75 2246 11.5 -13.8 -40.7 7.8 7.4 20.0 31.3 30.4 301 1.8 2.6 +89061300.AMA 1095 2.75 3611 14.4 -10.8 -36.6 8.1 7.0 9.9 15.8 22.1 79 1.6 3.0 +89060300.TOP 268 2.75 2623 13.7 -12.6 -38.3 7.0 7.0 12.4 19.5 39.7 118 1.5 2.0 +89060300.MAF 873 2.75 2291 11.9 -8.4 -34.6 7.6 7.0 13.3 19.3 32.2 147 0.8 2.2 +89060200.MAF 873 2.75 3193 14.1 -10.4 -34.9 7.9 6.6 8.5 24.5 27.4 104 2.1 2.8 +58042200.FWH 180 2.75 3338 13.3 -16.1 -39.0 7.8 6.3 25.5 37.0 49.4 276 3.6 2.4 +07021400.BMX 178 2.75 1032 9.9 -19.1 -44.7 7.0 7.1 19.5 20.7 36.3 245 0.7 2.4 +06082600.DDC 790 2.75 3488 16.5 -5.5 -31.7 6.5 6.9 17.6 20.2 26.5 141 0.8 0.8 +06081000.BIS 506 2.75 2589 13.0 -8.9 -35.7 7.5 7.2 8.8 19.1 18.8 147 1.0 2.6 +06062200.DDC 790 2.75 2406 12.7 -8.7 -34.9 8.1 7.0 11.0 21.1 24.9 175 1.1 2.4 +06050800.MAF 872 2.75 2440 11.9 -12.5 -36.9 8.0 6.6 22.1 33.3 51.2 327 1.9 2.3 +06050718.CHS 15 2.75 2580 12.9 -12.5 -40.1 6.0 7.5 15.9 17.7 18.8 177 1.1 2.0 +06050500.MAF 872 2.75 3709 11.5 -12.1 -42.7 8.1 8.4 21.7 27.6 34.4 372 2.7 1.7 +06050300.DRT 313 2.75 3549 13.7 -12.1 -37.1 8.5 6.8 5.1 14.2 19.0 74 1.7 2.1 +06042000.BMX 178 2.75 2242 13.1 -11.9 -37.1 7.1 6.8 11.3 21.7 27.0 122 1.3 2.1 +06041400.DVN 229 2.75 1524 11.2 -15.7 -35.1 8.3 5.6 15.8 30.6 30.3 263 1.4 3.4 +06031218.TOP 270 2.75 2814 12.6 -17.9 -44.3 8.5 7.3 33.9 44.8 54.9 723 3.5 2.7 +05092300.ILX 178 2.75 1858 14.1 -8.1 -33.3 6.9 6.7 11.5 21.5 16.8 121 0.7 0.8 +05051000.FWD 171 2.75 4841 15.5 -11.5 -42.1 6.7 8.3 9.5 18.0 25.9 152 2.2 2.9 +05042300.JAN 101 2.75 2558 13.6 -14.7 -39.7 7.1 6.9 19.9 28.5 34.1 183 2.3 2.7 +05042100.DDC 790 2.75 4722 13.2 -15.3 -43.5 8.6 7.7 15.2 16.1 14.9 174 3.1 2.1 +05041800.AMA 1099 2.75 1767 9.4 -17.3 -43.3 8.7 7.2 15.5 19.6 22.9 211 1.4 1.9 +05022200.FFC 244 2.75 1389 11.4 -16.3 -43.1 7.0 7.4 20.7 28.5 35.4 225 1.2 1.7 +04070500.DDC 790 2.75 3819 14.3 -10.3 -37.7 8.3 7.4 14.4 18.6 30.5 161 2.0 2.5 +04060300.FWD 171 2.75 4767 16.9 -11.1 -36.5 8.7 6.9 14.1 19.1 24.1 157 2.9 -999.0 +04053000.TOP 270 2.75 3882 15.9 -12.9 -39.3 8.7 7.1 14.8 22.4 15.3 295 3.2 3.2 +04051300.OUN 357 2.75 5740 16.8 -11.5 -40.5 8.2 7.9 12.4 15.2 20.9 131 2.7 3.6 +04051223.LMN 317 2.75 4076 15.9 -10.5 -40.3 7.4 8.1 21.9 22.7 30.4 304 2.3 2.4 +04051100.DNR 1625 2.75 3995 10.6 -12.9 -41.1 9.2 7.8 18.2 28.3 16.6 379 3.4 1.5 +04050600.WAL 12 2.75 1861 9.3 -21.3 -47.5 7.2 7.4 21.3 20.2 28.3 239 1.5 1.4 +04040500.CRP 13 2.75 2478 14.9 -12.1 -39.1 6.7 7.3 7.0 22.4 20.6 184 1.5 0.6 +04032800.OUN 357 2.75 2904 12.6 -15.9 -44.3 7.8 7.8 16.4 23.3 31.1 315 2.5 2.8 +04032718.DDC 790 2.75 4133 13.2 -17.3 -42.1 8.0 6.9 14.4 24.6 26.6 143 4.4 2.3 +03100600.AMA 1099 2.75 2542 12.2 -10.3 -39.3 6.4 7.8 12.9 24.1 30.2 50 1.2 2.5 +03091100.MAF 872 2.75 2808 13.3 -6.5 -32.5 6.8 6.9 7.4 10.3 9.0 80 0.4 1.4 +03091000.DDC 790 2.75 3620 14.8 -7.7 -34.7 7.5 7.2 11.3 12.1 15.8 233 0.8 3.0 +03061400.AMA 1099 2.75 3153 12.3 -13.3 -39.3 8.3 7.1 13.7 21.7 24.7 35 2.2 2.1 +03060500.AMA 1099 2.75 2647 11.9 -11.9 -36.9 7.6 6.8 13.1 23.0 28.5 167 1.5 2.1 +03051700.SHV 79 2.75 3995 16.3 -10.9 -37.3 7.4 7.2 19.6 23.2 13.9 242 2.4 2.7 +03051600.AMA 1099 2.75 3706 14.1 -10.3 -37.5 8.9 7.4 34.9 42.9 37.7 632 3.0 -999.0 +03051400.SHV 79 2.75 3920 16.7 -9.5 -38.5 7.2 7.8 19.3 27.2 37.0 389 2.3 0.8 +03051000.OUN 357 2.75 5328 16.8 -11.1 -38.1 8.3 7.3 16.8 27.5 34.8 182 4.3 3.6 +03050700.FWD 171 2.75 5303 17.8 -9.7 -37.7 7.1 7.5 8.4 30.4 36.2 126 3.2 3.5 +03050618.SGF 387 2.75 5492 15.6 -14.7 -43.9 7.7 8.0 17.8 32.0 40.6 313 5.5 2.8 +03050100.TOP 270 2.75 3922 13.0 -14.1 -43.5 7.8 8.1 13.9 17.2 19.6 117 2.3 2.7 +03042900.SGF 387 2.75 3399 13.1 -16.7 -43.3 8.5 7.3 4.8 5.0 19.6 53 1.1 2.8 +03042600.BMX 178 2.75 3921 14.2 -13.3 -41.1 6.2 7.6 26.6 35.8 33.5 89 2.8 2.7 +03042500.LZK 78 2.75 3423 13.8 -15.7 -43.1 7.6 7.6 20.0 20.9 31.0 212 2.8 3.3 +03040618.LZK 78 2.75 2556 13.1 -15.9 -41.3 7.6 7.0 28.4 35.1 38.9 600 2.6 3.1 +03031300.SHV 79 2.75 2901 13.5 -15.3 -43.1 7.1 7.7 11.0 17.1 24.1 162 1.7 2.0 +02081200.LBF 849 2.75 3735 13.3 -9.9 -37.1 8.7 7.3 10.5 13.1 11.8 222 1.3 2.1 +02072700.TOP 270 2.75 6406 19.3 -5.3 -32.5 6.9 7.1 9.1 18.2 19.3 131 1.4 2.6 +02072000.TOP 270 2.75 4986 17.5 -7.5 -32.9 7.3 6.8 8.5 10.0 12.7 197 0.9 2.7 +02062500.ABR 396 2.75 4208 15.1 -7.1 -37.7 6.8 8.2 11.1 19.1 19.3 20 1.3 3.1 +02062400.BIS 506 2.75 3559 16.0 -9.7 -34.1 6.8 6.6 25.2 28.0 24.8 298 2.1 2.4 +02061300.AMA 1099 2.75 3027 13.7 -8.5 -31.9 8.4 6.3 18.7 29.6 33.0 65 1.9 2.5 +02060500.AMA 1099 2.75 2947 13.2 -11.5 -38.3 7.6 7.3 17.9 32.1 45.0 309 2.2 2.7 +02052400.AMA 1099 2.75 4729 13.8 -13.3 -39.9 8.3 7.2 18.5 28.8 21.8 258 4.5 2.3 +02051800.DRT 313 2.75 5077 16.0 -10.5 -37.1 8.1 7.2 5.2 8.8 6.3 15 1.2 2.6 +01112418.BMX 178 2.75 2902 15.1 -11.3 -39.7 6.1 7.7 22.2 26.9 31.9 328 1.7 0.8 +01072500.GGW 700 2.75 1714 11.5 -11.3 -36.3 6.9 6.8 18.2 26.7 32.1 350 1.0 2.2 +01071900.BIS 506 2.75 5738 17.8 -9.9 -36.1 8.6 7.1 14.1 21.8 28.8 183 3.4 2.9 +01071900.ABR 396 2.75 5356 17.5 -10.5 -35.1 8.8 6.6 3.4 18.1 22.7 35 2.9 2.7 +01071800.INL 361 2.75 4580 17.0 -12.9 -37.7 7.8 6.7 11.8 11.9 12.8 154 1.8 0.8 +01070100.RAP 1029 2.75 3235 14.3 -10.7 -35.7 7.7 6.8 12.9 30.8 40.7 114 2.3 2.6 +01061900.MPX 287 2.75 5114 15.6 -11.9 -39.3 9.2 7.5 19.0 33.1 31.9 154 4.9 3.4 +01061700.TOP 270 2.75 4594 15.7 -13.7 -41.9 8.5 7.8 15.7 22.1 26.6 214 3.8 3.4 +01061700.LMN 317 2.75 4093 14.1 -10.7 -37.9 8.0 7.3 9.3 19.4 26.9 195 2.2 3.5 +01061400.OAX 350 2.75 4956 17.2 -11.3 -38.5 9.0 7.4 18.5 20.4 25.5 153 3.3 3.8 +01061000.ABR 396 2.75 3453 13.8 -12.1 -39.9 7.8 7.5 16.6 24.6 32.3 158 2.6 3.6 +01060800.DNR 1625 2.75 3440 13.9 -8.7 -36.7 7.2 7.6 7.4 25.3 21.9 -26 1.8 3.1 +01060600.AMA 1099 2.75 4665 14.9 -8.9 -36.7 7.2 7.5 11.9 15.8 15.6 191 1.5 2.3 +01052500.FFC 244 2.75 2338 11.7 -14.5 -43.1 6.4 7.9 19.6 18.1 21.4 240 1.1 2.5 +01050620.LMN 317 2.75 4496 15.4 -16.1 -43.1 7.3 7.5 7.3 11.5 20.9 60 2.0 3.1 +01042100.OAX 350 2.75 3283 12.4 -15.3 -43.1 7.7 7.7 23.5 28.1 32.7 282 3.1 2.4 +01040400.LZK 78 2.75 4223 15.2 -15.1 -42.1 8.5 7.4 11.9 18.1 24.8 105 3.2 3.1 +00121618.BMX 178 2.75 2219 13.2 -14.1 -42.7 6.7 7.9 25.0 32.9 45.8 266 1.8 0.9 +00072700.OAX 350 2.75 5048 18.5 -9.7 -35.3 8.0 6.9 16.7 21.8 23.2 215 2.8 2.6 +00072500.LBF 849 2.75 5901 17.1 -8.9 -38.1 8.5 7.8 22.2 24.5 29.4 162 3.5 2.9 +00072100.LBF 849 2.75 3073 15.3 -11.3 -37.5 7.8 7.1 16.9 26.5 39.4 223 2.3 2.0 +00071700.MHX 11 2.75 2929 15.1 -12.3 -36.1 7.2 6.4 7.9 18.2 29.9 81 1.5 2.3 +00071000.LBF 849 2.75 5871 18.1 -5.5 -32.5 7.8 7.2 10.7 14.3 19.9 146 1.2 3.5 +00071000.GGW 700 2.75 3180 15.6 -10.9 -35.1 7.0 6.5 23.2 18.4 13.5 248 1.5 2.6 +00062000.LBF 849 2.75 4028 14.9 -8.5 -37.9 6.8 7.9 11.9 18.8 23.9 96 1.4 3.0 +00061400.AMA 1099 2.75 5758 16.5 -4.9 -34.9 7.6 7.9 19.9 23.8 32.0 244 1.8 2.5 +00061200.BIS 506 2.75 2000 11.3 -13.1 -39.9 7.5 7.4 10.2 22.0 28.0 306 1.2 2.5 +00052700.OUN 357 2.75 5870 18.3 -10.1 -37.9 8.4 7.5 12.8 21.5 32.8 117 3.5 4.0 +00051300.DTX 329 2.75 4524 16.9 -8.5 -37.3 7.7 7.7 20.2 24.1 18.5 328 2.3 2.4 +00022500.AMA 1099 2.75 3614 10.3 -18.5 -46.1 8.5 7.7 13.1 26.8 48.5 107 4.0 1.7 +98071100.DDC 790 2.50 4323 18.9 -4.3 -29.9 6.2 6.8 16.0 12.7 15.2 230 0.6 0.6 +96072200.LBF 847 2.50 4756 18.4 -6.5 -34.7 7.2 7.5 19.0 20.0 29.4 94 1.4 2.1 +96071900.GRB 210 2.50 4746 20.7 -7.5 -31.3 6.4 6.3 20.0 26.3 26.2 164 1.9 0.7 +96062100.DEN 1611 2.50 5603 15.2 -8.1 -36.1 9.6 7.6 8.8 27.5 33.4 155 3.8 2.2 +96061200.LBF 847 2.50 2310 11.7 -9.9 -37.5 7.5 7.4 12.7 16.7 22.2 122 0.8 2.4 +96060300.AMA 1095 2.50 2356 11.0 -10.5 -39.7 6.9 7.9 18.0 27.6 31.6 256 1.2 2.0 +96060100.DDC 791 2.50 2888 13.3 -10.9 -38.5 8.3 7.4 13.9 13.3 19.3 111 1.1 2.5 +96051800.MPX 287 2.50 4406 16.3 -8.9 -38.5 8.2 8.0 20.7 13.0 23.4 259 1.4 3.4 +96042200.FTD 196 2.50 1872 12.0 -12.6 -38.7 8.2 7.1 18.3 27.1 34.0 298 1.5 -999.0 +96030700.TLH 26 2.50 2615 15.4 -10.4 -39.0 6.0 7.7 20.7 20.9 23.7 320 1.1 0.6 +95081212.MPX 287 2.50 3361 19.1 -6.3 -31.3 7.2 6.7 23.0 20.6 36.8 164 1.0 -999.0 +95061600.TFX 1130 2.50 3142 13.0 -12.0 -37.7 8.4 7.0 23.8 27.7 35.6 277 2.7 2.3 +95060700.DEN 1611 2.50 3137 12.3 -10.8 -35.7 9.2 6.8 20.7 37.2 35.9 284 2.4 2.0 +95052912.MAF 873 2.50 1617 13.0 -11.3 -37.2 7.5 7.0 13.7 27.6 22.0 284 1.1 1.9 +95051900.GSO 277 2.50 1758 13.4 -11.8 -35.2 7.9 6.3 23.6 25.3 27.1 83 1.3 -999.0 +95051600.MAF 873 2.50 3261 13.6 -7.8 -34.0 8.4 7.1 10.3 21.7 28.8 134 1.5 1.8 +95050900.TOP 268 2.50 1495 10.0 -19.3 -39.2 6.9 5.6 21.2 19.3 22.8 126 1.0 1.2 +95050800.LCH 5 2.50 3259 17.9 -9.9 -35.6 7.1 6.9 10.2 16.7 31.1 119 1.2 0.6 +95050800.FTD 196 2.50 2700 16.5 -10.4 -38.9 7.7 7.7 24.5 30.8 30.8 407 1.9 0.8 +94062600.TOP 268 2.50 4265 16.4 -8.6 -35.2 8.4 7.1 21.6 25.2 45.9 418 2.5 2.9 +94032800.AHN 246 2.50 2627 14.4 -10.5 -35.7 6.2 6.8 30.4 34.5 24.7 518 1.5 0.7 +93070300.TOP 270 2.50 4019 18.5 -7.2 -31.5 7.1 6.5 15.2 15.8 16.4 202 1.0 0.7 +93070200.HON 392 2.50 2619 14.6 -11.3 -39.6 7.0 7.7 12.6 28.3 40.3 143 1.8 0.8 +93061400.TOP 270 2.50 4195 16.5 -8.5 -35.1 7.7 7.1 10.7 12.5 17.8 65 1.1 2.8 +93033000.DRT 314 2.50 2680 12.7 -13.4 -39.4 8.2 7.1 26.0 39.6 44.0 411 2.4 2.8 +92070200.DEN 1611 2.50 2313 11.7 -11.2 -35.2 8.0 6.5 20.0 27.6 29.9 362 1.6 2.5 +92041600.AMA 1095 2.50 3362 11.1 -13.4 -40.9 7.6 7.5 12.0 16.0 17.8 127 1.5 1.7 +92030400.SEP 399 2.50 2676 12.7 -15.3 -44.8 7.7 8.1 9.2 20.1 27.2 133 1.9 2.3 +91080200.CAR 191 2.50 1891 12.3 -13.7 -41.6 6.3 7.6 11.9 19.6 33.3 223 0.9 1.8 +91071800.STC 315 2.50 4956 18.2 -8.7 -32.0 7.3 6.3 21.9 18.7 20.1 104 1.9 2.5 +91053100.DEN 1611 2.50 3551 12.0 -12.1 -39.1 9.5 7.4 10.7 27.3 45.8 149 3.1 1.9 +91052700.LBF 847 2.50 2669 11.9 -13.4 -38.4 7.9 6.8 13.0 13.9 32.3 35 1.1 2.1 +91051200.AMA 1095 2.50 4539 14.3 -10.8 -37.8 8.5 7.3 16.7 12.4 14.9 208 1.7 2.3 +91050800.MAF 873 2.50 3415 11.2 -14.8 -41.4 8.4 7.3 25.4 31.1 36.7 280 3.1 1.6 +91042100.AYS 44 2.50 2563 11.8 -16.9 -41.9 7.4 6.9 10.3 13.4 30.0 76 1.2 1.7 +91041900.SEP 399 2.50 5996 17.6 -13.2 -38.3 7.4 6.8 13.0 13.5 44.8 24 2.6 3.1 +90083100.CHS 13 2.50 2477 16.0 -8.5 -33.3 6.5 6.6 8.3 17.0 17.7 67 0.8 0.6 +90070200.GSO 277 2.50 3963 14.8 -10.0 -35.9 7.2 7.0 10.7 26.0 16.3 100 2.4 2.2 +90062200.ALB 86 2.50 1833 12.6 -14.1 -41.8 6.7 7.6 20.6 32.5 29.1 203 1.4 1.6 +90061500.DDC 791 2.50 4667 16.0 -6.5 -35.9 7.9 7.8 15.7 28.4 30.1 306 2.1 2.7 +90060700.DEN 1611 2.50 2393 10.9 -8.2 -36.5 9.0 7.6 19.6 26.3 23.9 170 1.2 1.6 +90060300.PAH 126 2.50 3663 17.8 -7.6 -36.2 7.0 7.6 29.8 24.0 25.9 367 1.5 0.6 +08110600.OUN 357 2.50 1623 11.4 -12.5 -39.9 6.9 7.5 24.8 29.8 32.7 317 1.0 2.4 +06071123.LMN 317 2.50 2996 16.5 -5.9 -29.5 6.7 6.2 9.4 12.6 11.2 110 0.5 0.6 +06062500.DNR 1625 2.50 987 7.1 -11.5 -38.9 8.9 7.4 12.5 26.1 26.5 -172 0.7 0.9 +06061400.RAP 1029 2.50 2691 11.5 -7.7 -35.5 8.3 7.5 15.3 17.3 24.5 248 0.8 1.6 +06052600.SGF 387 2.50 3409 13.9 -9.5 -39.1 6.5 8.0 18.8 18.9 23.2 262 1.3 2.5 +06050900.JAN 101 2.50 3303 16.1 -13.3 -38.7 7.3 6.9 14.9 28.4 39.9 170 2.8 1.9 +05050700.MAF 872 2.50 3257 10.7 -12.3 -41.3 8.0 7.9 11.2 20.3 24.6 48 1.7 1.6 +05050322.XMR 3 2.50 2165 13.4 -13.9 -38.9 7.6 6.8 21.5 23.3 41.5 82 1.7 1.2 +04102400.JAN 101 2.50 1938 15.8 -6.9 -33.5 5.3 7.1 19.3 30.8 27.8 328 0.6 0.6 +04091500.LBF 849 2.50 1474 12.8 -10.7 -38.3 8.0 7.4 20.5 35.4 39.8 306 1.0 -999.0 +04080700.ABR 396 2.50 2792 13.1 -9.3 -36.7 6.7 7.4 12.1 21.0 25.9 240 1.1 2.5 +04040400.EPZ 1252 2.50 4482 12.1 -17.9 -46.3 8.2 7.9 11.6 29.1 25.4 203 5.1 2.1 +04032718.OUN 357 2.50 2825 12.6 -14.9 -42.3 7.3 7.6 11.5 21.1 32.3 199 2.0 2.1 +03062200.RAP 1029 2.50 3380 10.6 -13.7 -39.5 8.0 7.1 18.7 27.5 42.2 189 2.6 1.5 +03051500.SHV 79 2.50 4260 16.8 -9.9 -36.1 6.8 7.1 16.3 33.7 42.9 246 2.5 0.8 +02072500.ABR 396 2.50 3995 15.0 -11.5 -38.9 7.9 7.5 13.8 28.3 28.6 207 3.2 3.0 +02051700.AMA 1099 2.50 5036 13.8 -12.7 -40.5 8.7 7.6 17.4 21.9 26.5 216 3.9 2.2 +02041900.DVN 229 2.50 2861 12.3 -14.5 -39.9 8.2 7.0 15.9 14.1 20.0 213 1.4 2.5 +02041212.AMA 1099 2.50 2907 12.2 -13.7 -42.7 7.5 7.9 14.6 20.4 25.1 184 1.8 2.8 +02040300.JAX 9 2.50 3327 14.8 -14.3 -41.7 7.2 7.4 11.8 11.5 30.9 80 1.3 1.5 +01101000.DDC 790 2.50 3299 12.9 -9.7 -40.3 6.4 8.3 16.4 18.8 18.3 275 1.2 2.5 +01082400.AMA 1099 2.50 4318 15.4 -6.7 -34.3 7.4 7.4 21.0 24.0 28.1 158 1.7 2.8 +01070500.LBF 849 2.50 3571 14.5 -7.7 -36.3 7.7 7.6 17.1 26.0 27.0 313 1.8 2.9 +01070400.RAP 1029 2.50 3145 13.2 -11.1 -37.9 8.3 7.3 12.9 25.2 26.1 144 2.3 2.6 +01052620.LMN 317 2.50 4355 14.1 -13.5 -40.9 6.4 7.5 20.2 27.3 33.2 233 3.3 2.9 +01052500.BMX 178 2.50 2388 11.9 -14.9 -43.1 6.7 7.7 23.5 29.2 27.4 436 1.8 2.7 +01050400.MAF 872 2.50 3866 13.7 -11.3 -36.7 7.2 6.9 11.4 12.8 33.8 101 1.3 2.7 +01050100.OAX 350 2.50 2265 10.4 -16.9 -44.5 7.7 7.7 19.2 17.4 17.0 226 1.3 2.2 +01042200.DDC 790 2.50 3749 13.3 -12.1 -41.1 7.3 7.9 24.2 33.4 45.3 510 2.8 2.7 +01041700.MAF 872 2.50 4552 13.9 -12.1 -39.1 7.5 7.3 8.0 16.2 30.6 100 2.2 2.2 +00091100.MPX 287 2.50 4554 16.6 -10.3 -39.5 7.0 7.9 18.4 22.0 24.0 271 2.4 3.2 +00080500.BIS 506 2.50 4830 17.0 -8.7 -35.1 6.9 7.2 4.0 17.2 22.9 86 1.6 3.3 +00070600.LBF 849 2.50 5506 18.2 -7.1 -32.3 8.3 6.6 11.8 25.3 35.5 155 2.6 3.5 +00070200.ABR 396 2.50 5952 17.8 -10.3 -38.1 8.4 7.5 8.1 12.2 23.4 147 2.0 3.9 +00062400.OAX 350 2.50 4783 17.5 -8.7 -35.5 7.2 7.2 14.9 18.7 28.2 195 1.8 2.3 +00061000.RAP 966 2.50 3610 13.2 -8.1 -37.9 7.8 8.0 11.9 14.3 21.1 70 1.0 2.1 +00052300.MHX 11 2.50 3613 15.1 -13.5 -41.7 6.5 7.7 10.5 15.3 26.5 79 1.6 2.4 +00051200.DVN 229 2.50 4865 15.6 -8.1 -39.3 7.4 8.4 19.3 24.8 24.9 225 2.3 3.4 +00050100.FWD 196 2.50 3593 14.3 -13.1 -41.5 7.2 7.8 19.0 17.3 18.5 401 1.9 1.7 +00032700.SGF 387 2.50 1766 9.8 -18.3 -45.1 7.5 7.4 21.4 34.3 43.9 350 1.7 2.2 +00021400.LZK 165 2.50 2091 10.7 -20.3 -45.7 6.4 7.1 22.2 21.1 24.5 245 1.5 2.1 +00061300.OAX 350 2.25 5453 17.7 -11.5 -38.7 8.5 7.3 12.9 15.8 19.3 206 2.7 4.0 +99053100.TOP 270 2.00 2215 13.1 -10.9 -39.7 6.8 7.8 14.7 18.6 12.2 189 1.0 1.4 +99050400.DRT 307 2.00 5609 17.4 -10.1 -40.7 7.5 8.3 21.2 40.5 38.9 342 3.7 4.6 +98063000.BUF 215 2.00 2615 14.5 -10.5 -38.3 6.1 7.5 8.5 23.6 28.2 86 1.3 1.7 +98062500.APX 448 2.00 3453 15.8 -11.3 -34.3 7.3 6.2 21.9 28.9 35.4 348 2.5 3.3 +98033100.FWD 196 2.00 2873 13.3 -14.3 -40.7 7.2 7.2 17.6 29.6 57.5 93 2.5 2.9 +90091400.STC 315 2.00 2123 13.1 -10.9 -38.5 7.4 7.5 23.2 27.8 39.0 564 1.4 -999.0 +90072600.TBW 13 2.00 4330 18.4 -6.3 -31.8 5.7 6.8 6.3 3.5 8.5 7 0.4 0.6 +90061400.PIA 200 2.00 3570 18.1 -7.0 -32.9 7.0 6.9 9.5 16.5 23.4 134 0.9 0.6 +90060900.PIT 360 2.00 4095 16.7 -9.5 -35.8 6.7 7.0 18.8 18.1 13.6 236 1.5 1.0 +89103000.OUN 357 2.00 2163 12.5 -14.7 -42.6 6.6 7.6 13.1 18.0 18.1 195 1.1 1.6 +89082100.LBF 847 2.00 3307 14.8 -9.1 -35.7 7.1 7.1 8.0 28.0 44.7 83 1.9 3.0 +89071100.HON 392 2.00 3126 15.7 -7.0 -31.9 6.9 6.6 12.3 14.6 18.6 151 0.7 1.2 +89052800.ELP 1199 2.00 2569 11.2 -6.8 -34.2 8.0 7.3 14.9 11.3 17.1 232 0.4 1.4 +06090100.DDC 790 2.00 1972 12.2 -7.7 -34.9 7.1 7.2 13.9 15.6 27.4 363 0.5 1.6 +06062700.ILX 178 2.00 2025 12.2 -15.7 -43.1 6.4 7.6 5.2 3.5 11.7 15 0.4 1.2 +06061400.TFX 1131 2.00 2827 12.3 -9.7 -36.9 8.1 7.3 14.3 15.9 28.9 65 1.0 2.1 +06052400.DDC 790 2.00 1607 10.2 -8.7 -36.9 7.6 7.6 17.0 22.4 19.3 189 0.6 1.8 +06051600.MFL 5 2.00 2473 15.8 -11.1 -35.3 6.8 6.6 18.7 26.6 21.2 227 1.6 0.6 +06050800.DDC 790 2.00 1674 9.5 -17.1 -43.7 8.9 7.4 16.1 16.8 27.8 248 1.1 2.6 +06041600.TOP 270 2.00 2191 12.2 -12.9 -37.7 8.2 6.7 28.5 37.2 42.6 533 1.8 2.9 +06040700.TOP 270 2.00 2249 11.0 -15.1 -41.9 7.4 7.4 15.8 35.7 27.3 206 1.8 2.1 +05050900.LMN 317 2.00 2971 12.0 -16.1 -42.3 7.8 7.2 15.9 15.1 29.6 290 1.6 2.2 +05050700.LBF 849 2.00 3058 9.7 -14.3 -42.7 8.2 7.9 6.1 12.5 21.7 135 1.2 1.4 +05022100.SGF 387 2.00 1128 9.1 -18.9 -48.7 6.8 8.3 17.1 27.7 36.6 97 1.0 1.9 +04091200.GRB 214 2.00 2256 12.3 -14.9 -39.7 7.2 6.8 11.6 14.7 24.8 64 1.0 1.0 +04082400.BIS 506 2.00 2596 13.4 -11.1 -36.5 7.6 6.9 16.4 21.3 22.3 208 1.5 2.2 +04072300.TOP 270 2.00 3276 16.0 -7.7 -31.5 6.4 6.3 11.4 15.8 19.6 158 0.8 0.7 +04062400.GRB 214 2.00 1604 10.4 -16.9 -45.3 6.3 7.9 16.4 25.3 36.9 128 1.1 2.4 +04052200.DDC 790 2.00 3809 13.5 -9.7 -37.9 8.1 7.6 20.3 21.0 27.0 297 2.0 2.2 +04043000.JAN 101 2.00 1469 13.6 -12.7 -38.7 6.5 7.0 18.1 27.4 22.8 184 1.1 0.6 +03051900.TBW 13 2.00 3797 17.1 -10.9 -35.3 6.8 6.6 4.0 5.9 5.0 -4 0.6 1.0 +02062600.MPX 287 2.00 6228 19.6 -9.7 -37.1 7.1 7.4 9.2 18.6 21.8 120 2.6 3.2 +02061300.DVN 229 2.00 3501 17.3 -11.9 -35.7 7.4 6.5 10.0 26.3 38.7 100 2.6 1.1 +02052800.LZK 78 2.00 3284 15.1 -12.3 -37.7 6.5 6.9 2.6 4.4 12.3 13 0.6 0.6 +02041800.OAX 350 2.00 2113 11.4 -14.5 -43.5 7.6 8.0 24.0 33.9 35.5 376 1.7 2.2 +01101000.OUN 357 2.00 3485 15.6 -12.9 -39.9 7.9 7.3 23.9 24.4 28.2 447 2.8 2.5 +01090800.TOP 270 2.00 4174 17.8 -11.3 -34.9 8.1 6.4 24.5 26.2 26.7 274 3.2 1.7 +01090800.OUN 357 2.00 4351 17.6 -8.7 -33.7 7.8 6.7 21.8 26.1 21.2 151 2.5 2.3 +01082400.DDC 790 2.00 4283 16.4 -7.5 -33.9 7.7 7.0 11.9 14.7 16.3 77 1.2 3.1 +01082300.TOP 270 2.00 4361 16.7 -9.7 -33.7 7.6 6.5 13.6 9.9 23.0 192 1.0 2.3 +01072000.RAP 1029 2.00 4486 15.1 -8.7 -35.5 8.4 7.2 10.9 15.4 26.3 71 1.6 2.4 +01071300.GGW 700 2.00 3042 14.5 -10.1 -36.3 8.1 7.1 7.9 16.5 34.2 19 1.3 3.5 +01063000.FWD 171 2.00 4122 16.8 -9.7 -36.7 6.9 7.3 9.2 11.2 19.2 133 1.0 1.6 +01062100.DNR 1625 2.00 2544 10.8 -11.5 -39.3 7.5 7.5 20.5 21.4 23.2 192 1.2 2.1 +01053100.LCH 10 2.00 3988 17.4 -8.3 -37.7 7.0 7.9 0.8 8.3 13.9 8 0.6 2.4 +01053100.FWD 171 2.00 4571 15.8 -12.3 -40.5 8.7 7.7 13.7 12.4 20.6 106 2.0 3.9 +01053000.DDC 790 2.00 2892 15.2 -12.1 -35.1 8.0 6.2 14.8 19.5 26.6 388 1.8 1.8 +01052800.OUN 357 2.00 4910 16.5 -10.7 -40.3 7.6 8.0 16.9 29.7 38.8 113 3.5 3.1 +01052700.DDC 790 2.00 2853 11.3 -12.1 -40.1 6.7 7.6 19.3 30.6 37.1 184 1.7 1.8 +01051200.OUN 357 2.00 3098 13.2 -13.9 -40.5 7.1 7.3 8.7 10.0 10.8 132 1.0 2.1 +01050702.LZK 78 2.00 2759 14.2 -12.9 -40.5 5.9 7.5 7.3 18.7 26.3 77 1.3 2.0 +01050700.SGF 387 2.00 4025 14.5 -13.7 -42.3 6.1 7.9 10.5 8.8 17.0 202 1.0 3.1 +01050600.FWD 171 2.00 3092 15.4 -12.7 -38.7 6.8 7.1 19.4 32.7 34.4 170 2.3 2.1 +01042200.MAF 872 2.00 4543 13.7 -12.3 -39.7 8.4 7.5 12.3 27.4 36.2 164 4.1 2.2 +01042200.AMA 1099 2.00 6059 14.1 -15.3 -41.1 9.2 5.4 16.6 35.7 38.3 320 7.4 3.3 +00072300.LBF 849 2.00 2926 13.2 -11.5 -38.1 7.1 7.2 13.6 25.2 27.3 91 1.9 2.8 +00071500.BIS 506 2.00 5132 16.5 -9.5 -35.1 8.1 6.9 14.6 27.6 34.1 152 3.4 2.7 +00071100.GGW 700 2.00 3230 14.2 -11.3 -38.9 6.9 7.5 16.9 30.1 48.1 88 2.2 3.0 +00061500.JAX 9 2.00 4801 17.9 -8.7 -34.3 6.4 6.9 3.6 6.2 13.3 55 0.6 1.1 +00061300.LBF 849 2.00 4790 13.9 -9.9 -37.9 8.3 7.5 9.9 16.6 18.6 159 2.1 2.0 +00061200.AMA 1099 2.00 5720 16.8 -10.3 -34.7 8.3 6.6 15.7 16.1 28.7 88 2.6 2.7 +00032800.JAX 9 2.00 2135 12.5 -14.5 -43.3 6.3 7.9 25.7 29.1 24.7 268 1.6 0.9 +00031600.LMN 317 2.00 1478 9.5 -17.3 -45.5 7.1 7.8 12.9 22.1 10.9 164 1.0 2.2 +00030300.FWD 196 2.00 2589 12.3 -14.3 -41.7 6.2 7.5 20.2 33.4 29.1 239 1.8 2.7 +98062500.FFC 244 1.75 3224 15.8 -8.9 -34.3 7.3 6.8 5.6 4.2 9.9 54 0.5 0.6 +97100900.OUN 357 1.75 3628 16.5 -7.5 -35.9 6.0 7.5 16.6 20.0 29.9 205 1.1 0.8 +94071700.HAT 4 1.75 2973 16.5 -6.0 -31.3 5.7 6.7 4.4 5.9 3.1 33 0.2 0.6 +94071700.1M1 172 1.75 3339 17.7 -6.4 -31.8 5.8 6.7 19.1 12.5 11.3 164 0.5 0.6 +94070100.1M1 172 1.75 4820 18.6 -8.1 -33.0 6.1 6.7 12.6 20.0 18.5 342 1.5 1.0 +94062600.PBI 6 1.75 4199 17.7 -9.1 -34.2 6.6 6.7 5.2 4.9 6.6 10 0.6 1.8 +92051500.1M1 172 1.75 2877 13.3 -11.3 -39.9 6.4 7.8 7.9 11.4 16.3 54 0.7 1.5 +91060600.RAP 966 1.75 2001 13.1 -11.5 -36.7 7.1 6.8 11.9 13.2 19.7 170 0.7 1.4 +91060600.JAN 91 1.75 3344 16.3 -9.1 -33.5 6.8 6.5 3.1 9.5 9.6 12 0.6 0.6 +91053100.AHN 246 1.75 3505 16.3 -6.9 -32.1 5.9 6.7 3.2 3.9 4.1 15 0.3 0.6 +91051700.GGG 124 1.75 5081 18.4 -10.4 -36.4 7.5 7.0 10.5 7.9 11.2 157 1.0 0.9 +91051300.HON 392 1.75 3615 14.7 -9.5 -38.2 7.2 7.7 13.0 14.2 22.7 97 1.1 2.8 +91051300.BIS 504 1.75 1867 13.8 -11.5 -36.7 6.8 6.8 15.8 26.9 19.8 -79 1.3 0.7 +91032700.DAY 298 1.75 1310 10.7 -13.1 -42.1 6.4 7.9 24.3 30.2 30.6 531 0.8 1.8 +90091100.AHN 246 1.75 2857 15.1 -8.6 -34.0 5.9 6.8 6.3 7.9 7.6 80 0.4 0.6 +90090200.MAF 873 1.75 3597 14.9 -6.2 -32.1 6.8 6.8 7.5 17.2 18.3 58 0.8 2.5 +90082600.HON 392 1.75 5529 17.9 -11.5 -38.5 9.1 7.4 9.9 14.7 28.6 156 2.7 -999.0 +90082600.BIS 504 1.75 3187 13.7 -13.2 -42.0 8.6 7.9 13.2 22.2 23.1 190 2.6 2.5 +90082400.OVN 400 1.75 5016 18.7 -7.4 -31.7 6.8 6.5 9.4 7.4 14.7 100 0.6 0.7 +90082100.AMA 1095 1.75 2833 14.6 -5.7 -30.1 6.6 6.5 10.6 11.7 11.3 75 0.4 1.2 +90081500.DDC 791 1.75 3012 15.1 -6.6 -32.5 5.6 6.9 9.9 9.0 15.8 59 0.3 0.6 +90081000.AHN 246 1.75 2234 14.9 -9.4 -35.2 6.2 6.9 6.4 13.3 26.7 33 0.6 0.8 +90080200.LCH 5 1.75 3223 18.4 -7.3 -32.2 6.4 6.6 3.1 6.5 2.0 14 0.3 0.6 +90073100.GGG 124 1.75 3254 16.1 -7.5 -31.9 6.4 6.5 1.2 7.9 5.4 3 0.4 0.6 +90072700.AMA 1095 1.75 3104 14.3 -5.8 -31.4 7.3 6.8 11.1 7.7 7.9 117 0.3 2.2 +90072600.OUN 357 1.75 3546 16.6 -6.8 -32.6 6.2 6.8 11.1 10.8 14.7 206 0.5 0.7 +90072100.ABQ 1619 1.75 1327 10.9 -5.9 -28.5 8.3 6.1 9.8 7.9 14.5 145 0.1 1.3 +90071800.LBF 847 1.75 3138 12.3 -7.7 -36.8 8.2 7.8 10.0 17.7 16.6 115 1.0 1.6 +90071700.FNT 236 1.75 1393 11.9 -12.5 -40.9 6.5 7.7 13.2 15.5 25.3 176 0.5 0.6 +90071400.ABQ 1619 1.75 1588 10.4 -9.4 -32.2 8.7 6.2 4.4 18.9 32.6 70 0.6 1.2 +90071300.CRP 12 1.75 1658 13.3 -6.5 -31.6 6.5 6.7 14.6 12.8 9.3 121 0.3 0.6 +90071100.CKL 145 1.75 2544 15.4 -8.1 -32.3 6.4 6.4 2.1 5.1 4.6 9 0.3 0.6 +90070900.GRB 210 1.75 2962 16.9 -6.5 -31.5 6.5 6.6 12.1 18.2 22.7 82 0.7 0.6 +90070500.LCH 5 1.75 3315 17.6 -8.5 -32.0 6.6 6.3 11.6 15.3 2.5 58 0.9 0.6 +90061800.PIA 200 1.75 4567 19.5 -8.1 -33.4 7.4 6.7 14.1 17.0 25.7 94 1.5 1.0 +90061300.STC 315 1.75 2789 16.2 -10.4 -33.4 7.2 6.2 14.2 36.6 42.0 139 1.8 0.7 +90061100.CHS 13 1.75 4050 17.7 -8.1 -33.2 6.6 6.7 6.4 8.1 19.1 102 0.6 0.6 +90061000.OUN 357 1.75 3242 15.1 -8.5 -33.0 7.8 6.6 10.9 10.1 1.3 21 0.7 2.5 +90061000.IAD 85 1.75 2818 14.9 -9.2 -34.3 6.5 6.7 18.0 16.4 19.3 175 0.9 0.6 +90052800.SIL 8 1.75 3916 18.0 -10.0 -34.5 6.8 6.6 10.4 19.3 10.6 48 1.7 0.8 +90052300.HON 392 1.75 1984 10.9 -14.0 -42.8 7.2 7.9 15.0 22.3 33.6 107 1.2 2.4 +90052100.UMN 438 1.75 3661 14.8 -13.1 -43.5 7.6 8.3 15.3 15.4 23.7 181 1.8 3.4 +90052100.HAT 4 1.75 2891 15.8 -9.7 -37.4 5.6 7.5 12.4 13.8 19.5 182 0.7 0.6 +90051900.SEP 399 1.75 3246 17.0 -9.1 -34.7 6.6 6.8 15.6 20.9 27.2 387 1.3 0.6 +90051600.IAD 85 1.75 2004 13.4 -14.0 -39.9 7.0 7.1 12.7 16.7 27.7 102 1.0 -999.0 +90051200.SEP 399 1.75 2282 13.6 -9.2 -37.7 6.9 7.7 14.5 34.8 47.4 134 1.3 -999.0 +90050600.OUN 357 1.75 836 7.6 -20.1 -41.8 7.2 6.0 5.8 18.3 48.8 30 0.6 1.4 +90042900.AYS 44 1.75 2333 13.0 -12.2 -40.9 6.2 7.8 19.1 30.6 23.2 243 1.5 2.3 +90042600.DRT 314 1.75 3699 14.6 -13.8 -39.4 8.1 7.0 11.1 25.7 33.2 101 3.4 4.3 +90042200.OUN 357 1.75 2748 11.1 -13.3 -46.8 6.6 9.3 7.3 12.2 14.9 48 0.8 2.0 +90040200.BRO 7 1.75 3494 16.2 -9.3 -36.7 7.1 7.4 15.2 25.7 37.2 65 1.9 0.9 +90031300.OUN 357 1.75 3211 12.7 -13.6 -43.5 7.8 8.2 19.4 24.2 18.1 286 2.5 2.8 +90031000.AMA 1095 1.75 2468 11.1 -16.0 -40.7 8.6 6.8 9.9 13.1 18.2 106 1.2 1.9 +90022800.MAF 873 1.75 607 9.7 -16.2 -42.9 6.6 7.4 5.1 16.4 23.8 55 0.3 1.2 +89090800.DEN 1611 1.75 1350 10.1 -6.8 -33.1 8.3 7.1 15.4 24.1 24.0 366 0.5 2.0 +89090200.1M1 172 1.75 3818 18.3 -4.8 -29.4 6.1 6.5 8.2 16.2 14.1 64 0.7 0.6 +89083100.DDC 791 1.75 2956 16.5 -5.7 -31.4 6.6 6.9 13.3 13.6 22.5 346 0.5 0.8 +89083000.OUN 357 1.75 3864 17.3 -5.6 -30.2 6.0 6.5 11.8 13.1 24.2 112 0.6 0.6 +89082900.TOP 268 1.75 4842 19.8 -6.3 -32.1 6.6 6.8 13.2 15.4 21.1 156 1.0 0.6 +89082800.UMN 438 1.75 3603 17.3 -6.1 -30.3 6.5 6.4 2.6 7.8 5.6 28 0.4 0.6 +89082700.OMA 400 1.75 3452 17.8 -6.6 -33.4 6.1 7.1 15.2 19.5 33.1 142 0.9 0.6 +89082500.RAP 966 1.75 1899 10.6 -7.1 -34.2 7.6 7.2 2.7 7.7 7.6 55 0.2 1.0 +89081300.TBW 13 1.75 2617 16.4 -8.6 -33.3 6.0 6.6 10.1 18.1 18.2 65 0.8 0.6 +89080600.UMN 438 1.75 5563 19.0 -6.9 -31.4 7.0 6.5 8.8 11.7 11.3 99 1.0 0.8 +89073000.JAN 91 1.75 3940 18.0 -7.7 -34.5 6.7 7.2 2.1 1.9 3.1 9 0.5 0.6 +89072900.HON 392 1.75 2092 14.0 -5.9 -34.4 6.0 7.6 6.4 12.0 17.9 105 0.3 0.8 +89071500.LBF 847 1.75 2675 14.3 -6.9 -33.4 6.1 7.0 5.5 6.1 8.4 27 0.3 0.6 +89071300.OUN 357 1.75 4127 19.0 -5.4 -31.1 6.9 6.8 13.0 13.8 19.1 196 0.7 -999.0 +89071300.DDC 791 1.75 3239 15.1 -4.9 -31.6 6.9 7.1 7.9 5.1 7.2 81 0.3 1.2 +89070800.PIT 360 1.75 2732 15.4 -9.1 -36.1 6.8 7.3 12.8 17.5 15.7 81 1.0 1.5 +89062800.BUF 218 1.75 2385 15.2 -8.2 -33.3 5.3 6.8 9.8 20.1 22.3 82 0.7 0.6 +89062700.PIA 200 1.75 2460 15.7 -7.9 -33.9 6.6 6.9 5.3 13.2 12.4 87 0.5 0.7 +89062600.IAD 85 1.75 3138 16.2 -8.6 -36.4 6.1 7.4 12.1 14.3 23.0 108 0.8 0.7 +89062200.AHN 246 1.75 1517 15.5 -7.6 -33.7 5.8 6.9 14.9 12.6 15.8 112 0.3 0.6 +89061900.BNA 180 1.75 1755 13.9 -10.2 -36.1 6.3 6.9 6.8 9.7 7.8 86 0.4 0.6 +89061400.GGG 124 1.75 3674 17.2 -11.0 -35.3 6.9 6.6 4.3 15.4 23.3 61 1.4 -999.0 +89060600.JAN 91 1.75 3336 16.3 -11.3 -37.4 6.7 7.0 10.4 20.8 25.3 103 1.7 0.8 +89060600.GSO 277 1.75 2078 14.8 -9.1 -34.5 5.9 6.8 10.0 8.1 6.7 93 0.3 0.6 +89060100.TOP 268 1.75 2810 15.8 -10.9 -35.3 7.9 6.6 7.9 10.6 26.9 90 0.8 -999.0 +06100400.MPX 287 1.75 3011 13.7 -12.1 -41.5 7.4 8.1 23.9 34.0 30.2 514 2.4 2.9 +06091600.DDC 790 1.75 2738 14.4 -6.9 -34.5 6.6 7.4 21.6 29.7 39.0 378 1.1 2.2 +06091400.EPZ 1252 1.75 1589 11.7 -10.3 -32.9 7.6 6.1 13.1 17.4 23.7 167 0.6 2.0 +06091100.AMA 1099 1.75 1812 12.5 -8.9 -37.1 7.1 7.6 13.7 14.9 33.3 51 0.5 2.1 +06082300.RAP 1029 1.75 1757 8.3 -9.5 -39.1 9.1 8.0 12.7 21.3 28.7 108 0.8 0.8 +06082100.ABR 396 1.75 1851 12.5 -9.9 -36.9 6.8 7.3 15.5 21.9 39.5 257 0.8 2.1 +06080900.TUS 779 1.75 1640 11.9 -4.7 -30.5 6.6 6.8 6.6 5.1 8.2 25 0.1 0.6 +06080700.TOP 270 1.75 1693 12.5 -6.7 -31.1 7.0 6.4 3.2 7.6 6.8 35 0.2 0.6 +06072600.TUS 779 1.75 1725 11.2 -5.7 -31.7 7.4 7.0 8.5 15.0 18.3 36 0.3 0.9 +06072200.LZK 78 1.75 2480 14.1 -8.1 -31.3 7.3 6.2 7.7 6.9 5.8 67 0.3 0.6 +06071900.JAN 101 1.75 2280 15.2 -6.9 -33.5 6.5 7.1 9.0 11.1 11.1 88 0.4 0.6 +06071300.DDC 790 1.75 1575 12.8 -5.9 -30.5 6.9 6.5 7.4 12.7 13.7 99 0.2 0.8 +06071200.DDC 790 1.75 1068 11.8 -8.7 -29.3 8.0 5.5 11.8 15.4 21.8 12 0.3 1.0 +06070100.BNA 210 1.75 2750 13.5 -11.5 -39.1 6.7 7.5 11.5 10.8 7.8 41 0.7 1.5 +06062900.DDC 790 1.75 919 7.7 -10.1 -38.7 7.7 7.7 1.9 17.9 17.9 16 0.3 0.8 +06062400.LBF 849 1.75 1400 10.7 -12.1 -38.5 7.4 7.2 13.6 26.6 25.0 272 0.9 2.1 +06062400.BIS 506 1.75 942 8.3 -15.3 -41.9 7.0 7.3 16.7 22.7 27.2 167 0.6 1.6 +06062100.CHS 15 1.75 4007 17.0 -10.1 -35.5 6.4 6.9 7.1 12.9 19.3 66 1.1 0.7 +06061800.FWD 171 1.75 2286 14.3 -10.9 -34.3 8.2 6.2 11.6 13.9 24.6 134 0.9 2.3 +06052700.GSO 270 1.75 2136 12.7 -9.9 -37.3 5.8 7.4 17.1 17.4 21.2 217 0.6 1.5 +06052500.TLH 53 1.75 2619 14.8 -10.5 -36.5 6.4 7.0 9.2 7.3 7.5 56 0.4 0.6 +06052300.SGF 387 1.75 3032 14.4 -11.9 -37.7 7.1 7.0 8.3 9.0 15.5 91 0.7 1.6 +06051800.ILX 178 1.75 713 8.0 -17.5 -46.5 6.9 8.1 16.9 28.8 29.6 226 0.6 2.1 +06051412.SHV 79 1.75 2270 12.4 -14.9 -41.3 7.8 7.2 15.5 16.8 26.2 84 1.3 2.8 +06051100.LCH 10 1.75 4564 18.5 -12.3 -35.7 8.9 6.4 12.2 22.9 22.0 38 3.7 1.7 +06050912.SGF 387 1.75 2144 12.9 -12.9 -39.7 6.7 7.3 10.1 20.3 18.4 144 1.2 1.8 +06050900.DDC 790 1.75 1630 9.6 -13.3 -40.5 7.9 7.4 15.1 27.2 27.8 179 1.2 2.0 +06050600.LCH 10 1.75 2655 14.9 -10.3 -39.3 5.8 7.8 15.8 23.1 25.2 64 1.2 0.6 +06050400.SHV 79 1.75 3310 15.0 -12.1 -39.1 6.7 7.3 5.8 8.0 14.3 85 0.7 0.6 +06042300.DTX 329 1.75 609 6.7 -24.1 -43.7 7.4 5.5 14.0 17.7 27.4 50 0.5 1.8 +06041900.BMX 178 1.75 1805 12.0 -11.1 -39.9 6.3 7.7 5.4 14.2 22.0 62 0.5 0.7 +06041600.WAL 12 1.75 2234 10.9 -16.5 -44.7 7.2 7.8 17.2 17.7 48.2 81 1.2 2.3 +06041600.IAD 93 1.75 2181 10.2 -16.7 -43.9 7.0 7.5 16.6 27.7 43.3 48 1.8 1.8 +06041300.LZK 78 1.75 1294 11.0 -13.5 -41.1 7.2 7.6 6.0 12.6 20.8 34 0.4 -999.0 +06040900.JAX 9 1.75 2254 13.6 -13.7 -38.1 6.6 6.6 19.5 20.4 22.0 178 1.3 2.1 +06040400.CHS 15 1.75 2165 11.6 -16.9 -42.5 8.1 7.0 26.6 31.6 39.3 207 2.2 2.6 +05082700.AMA 1099 1.75 2765 13.6 -5.5 -32.3 7.4 7.1 10.0 11.5 11.5 31 0.4 2.0 +05082400.RAP 1029 1.75 2040 11.3 -11.3 -38.9 8.6 7.5 13.6 11.6 19.1 116 0.6 -999.0 +05031500.TLH 53 1.75 1338 12.4 -14.1 -38.5 7.1 6.6 12.7 28.4 53.2 41 1.1 1.1 +05030400.AMA 1099 1.75 697 4.3 -23.3 -51.5 8.7 8.0 13.1 22.7 36.0 142 0.8 1.3 +04092500.AMA 1099 1.75 2465 11.2 -11.9 -40.7 6.9 7.8 12.0 15.1 24.9 38 0.8 2.0 +04092300.AMA 1099 1.75 1887 12.8 -10.1 -35.5 6.7 6.9 19.6 23.5 21.8 374 0.9 1.3 +04082600.BIS 506 1.75 3083 12.5 -13.1 -41.7 7.1 7.8 13.9 16.6 18.9 101 1.4 2.4 +04081900.ILX 178 1.75 3685 15.1 -9.1 -36.3 5.9 7.3 19.7 19.9 28.2 371 1.3 1.3 +04071200.TOP 270 1.75 3709 17.7 -7.3 -32.5 6.8 6.7 11.9 13.6 9.1 204 0.8 0.6 +04051600.EPZ 1252 1.75 2888 10.4 -11.5 -39.9 8.7 7.8 4.1 12.2 7.0 93 0.9 1.6 +04051000.LBF 849 1.75 4026 11.6 -13.9 -41.1 9.0 7.5 3.0 13.9 17.5 38 1.9 1.6 +04042900.DRT 313 1.75 1834 12.4 -12.9 -40.9 6.4 7.7 16.1 20.0 31.6 217 0.9 1.3 +04040700.FWD 171 1.75 835 10.4 -16.3 -40.1 6.7 6.6 11.8 28.3 27.2 87 0.6 1.0 +04032100.MAF 872 1.75 2053 10.0 -12.9 -41.3 7.9 7.7 5.5 9.6 21.3 39 0.5 1.5 +04032100.FFC 244 1.75 942 7.9 -17.3 -44.1 7.5 7.4 11.3 12.0 13.4 154 0.4 1.1 +04030100.TOP 270 1.75 487 6.3 -28.7 -42.5 8.7 3.9 20.1 32.0 35.0 171 0.9 1.6 +04022512.LIX 8 1.75 837 10.3 -17.7 -40.5 6.7 6.3 25.2 31.9 48.7 340 0.7 2.4 +03092100.DDC 790 1.75 1784 10.2 -10.9 -38.5 7.3 7.5 21.8 20.1 23.8 257 0.7 2.0 +03091100.DDC 790 1.75 3112 14.8 -7.5 -31.9 6.9 6.6 15.7 22.3 30.8 259 1.2 2.2 +03091000.MAF 872 1.75 3038 12.9 -7.3 -34.1 7.4 7.1 8.6 8.3 12.7 79 0.4 2.1 +03090500.DRA 1009 1.75 1966 11.3 -8.3 -34.1 8.1 6.9 5.0 3.7 9.2 33 0.2 1.2 +03062500.MAF 872 1.75 4621 16.5 -6.7 -29.9 7.7 6.2 11.9 8.7 16.8 45 0.7 2.1 +03062100.MAF 872 1.75 1489 10.7 -7.7 -33.7 7.0 6.9 6.5 14.5 29.4 74 0.3 1.9 +03061700.RAP 1029 1.75 1501 10.1 -11.1 -38.5 7.1 7.4 2.9 5.7 17.5 92 0.2 1.9 +03061700.FFC 244 1.75 2826 16.3 -8.5 -33.7 6.2 6.8 5.5 7.0 13.0 32 0.3 0.6 +03061500.LBF 849 1.75 1717 10.7 -11.3 -39.3 6.3 7.6 6.6 10.6 12.0 51 0.3 1.7 +03061500.FWD 171 1.75 2433 14.3 -11.3 -37.9 6.9 7.2 5.3 12.1 2.8 32 0.7 1.7 +03061300.LBF 849 1.75 2759 12.0 -11.3 -40.9 7.2 8.0 13.0 15.4 16.3 179 1.0 2.6 +03061100.OUN 357 1.75 3045 14.5 -9.3 -35.7 7.2 7.1 12.1 17.8 13.1 135 1.2 2.0 +03060400.LCH 10 1.75 4988 19.7 -6.7 -34.5 5.8 7.4 7.3 13.3 17.2 44 0.8 0.6 +03051312.FWD 171 1.75 1814 12.6 -10.3 -36.9 7.3 7.1 16.8 17.7 24.7 205 0.7 1.2 +03050700.BMX 178 1.75 4489 17.4 -10.5 -36.9 7.0 7.1 12.2 26.5 28.4 101 2.8 2.1 +03050200.FFC 244 1.75 3289 13.7 -13.5 -41.1 6.5 7.5 7.5 9.8 9.5 55 0.9 0.9 +03043000.BNA 210 1.75 3359 12.4 -15.3 -42.5 7.2 7.5 4.1 4.3 5.5 30 0.8 1.3 +03042900.MAF 872 1.75 2325 9.8 -13.5 -39.1 8.4 7.0 15.5 23.4 21.0 165 1.6 1.4 +03042900.AMA 1099 1.75 2549 9.6 -14.5 -41.5 8.3 7.4 16.5 25.3 33.7 237 2.0 1.6 +03032600.SHV 79 1.75 1723 11.3 -18.3 -45.5 8.5 7.6 8.0 17.7 18.0 108 1.3 1.4 +03032600.LZK 78 1.75 2073 11.3 -18.5 -46.3 6.7 7.8 9.5 14.3 15.4 67 1.0 2.2 +03031500.BMX 178 1.75 1555 10.9 -19.1 -43.3 7.4 6.8 12.3 8.5 21.2 94 0.5 1.3 +02082300.LBF 849 1.75 6193 17.8 -10.1 -38.1 8.0 7.5 3.8 12.9 28.1 10 2.1 3.1 +02072800.DDC 790 1.75 2480 12.9 -5.3 -31.3 7.4 6.8 10.7 10.6 11.1 155 0.3 1.4 +02072518.TBW 13 1.75 4523 18.9 -8.5 -34.7 6.7 7.0 2.0 7.8 6.3 7 0.7 0.6 +02070200.AMA 1099 1.75 2393 12.2 -6.5 -35.3 7.3 7.6 20.8 18.4 11.3 353 0.6 1.6 +02062600.DTX 329 1.75 3079 14.5 -8.9 -34.7 6.1 7.0 1.4 1.9 7.2 -1 0.4 0.7 +02061200.TOP 270 1.75 5029 19.6 -8.9 -32.9 7.6 6.4 15.6 21.1 24.7 224 2.3 0.7 +02060700.MPX 287 1.75 1952 9.2 -15.1 -43.7 7.7 7.9 16.2 22.8 25.3 758 1.4 1.5 +02060402.CHS 15 1.75 2637 13.7 -10.1 -34.9 7.6 6.7 11.7 9.7 10.8 33 0.6 0.8 +02052900.TOP 270 1.75 2661 12.8 -13.7 -40.1 6.8 7.2 7.3 4.2 10.7 48 0.5 1.3 +02052800.MAF 872 1.75 3115 12.7 -11.1 -37.5 8.0 7.1 16.4 20.6 24.7 103 1.7 2.1 +02052800.LBF 849 1.75 3387 11.3 -15.1 -41.3 9.0 7.2 11.6 18.8 30.1 184 2.3 1.9 +02050400.CHS 15 1.75 3255 15.9 -10.7 -35.7 6.6 6.7 16.6 21.1 29.5 19 1.6 0.9 +02041800.FWD 171 1.75 3343 15.9 -9.9 -35.9 6.4 7.0 5.6 12.4 34.6 61 0.9 -999.0 +02041600.PIT 357 1.75 1856 11.5 -14.9 -41.7 7.3 7.4 15.8 17.9 18.1 245 1.0 1.6 +01062000.DTX 329 1.75 3813 14.9 -12.5 -37.3 6.9 6.7 15.0 8.4 17.6 -45 0.9 2.8 +01061800.TBW 13 1.75 3469 15.9 -9.7 -34.9 5.9 6.8 1.5 4.6 6.6 23 0.5 0.8 +00090400.LBF 849 1.75 2441 11.2 -9.5 -35.5 7.8 7.0 18.5 21.4 24.1 309 1.0 1.5 +00080800.OAX 350 1.75 4679 16.3 -8.1 -32.7 7.8 6.5 10.8 16.4 25.1 185 1.6 3.0 +00080200.GGW 700 1.75 2057 10.8 -8.9 -37.9 8.0 7.8 15.0 24.6 35.3 148 0.9 1.8 +00073100.JAX 9 1.75 3581 17.6 -8.9 -33.5 6.0 6.6 4.7 6.6 5.5 27 0.4 0.6 +00072900.GSO 270 1.75 2081 14.3 -9.7 -35.1 6.2 6.8 6.5 6.2 16.1 43 0.3 0.6 +00072700.LBF 849 1.75 5178 18.1 -8.9 -36.7 8.7 7.5 12.2 17.5 26.1 351 2.3 2.2 +00072600.MPX 287 1.75 3240 15.3 -13.1 -36.3 7.6 6.4 10.1 21.4 12.4 139 2.2 3.0 +00072600.MFL 5 1.75 4079 18.3 -8.5 -33.5 6.6 6.7 2.4 5.2 5.6 18 0.5 0.6 +00072500.ABR 396 1.75 4195 15.6 -12.3 -38.3 8.9 7.1 10.9 15.3 19.8 113 2.3 3.1 +00072200.LBF 849 1.75 3031 12.8 -11.5 -38.5 7.6 7.3 14.5 27.5 23.7 247 2.2 2.6 +00072100.FFC 244 1.75 2149 14.3 -6.9 -30.5 6.4 6.2 9.1 9.2 10.4 63 0.3 0.6 +00071800.AMA 1099 1.75 3660 14.4 -4.7 -32.7 6.9 7.4 5.9 9.1 7.7 79 0.4 1.5 +00071500.IAD 98 1.75 2186 13.9 -12.3 -36.3 6.8 6.5 9.3 17.8 17.7 118 1.1 2.0 +00071300.ABR 396 1.75 2305 13.6 -8.7 -36.1 6.7 7.3 21.7 29.3 44.3 278 1.2 2.0 +00070600.GGW 700 1.75 2743 11.7 -14.1 -40.7 8.5 7.3 13.0 29.6 40.4 165 2.4 1.9 +00062400.LBF 849 1.75 4723 14.8 -9.7 -37.3 8.6 7.4 9.8 17.4 29.6 126 2.2 2.0 +00062400.DDC 790 1.75 3499 14.8 -7.3 -33.9 7.7 7.2 12.0 23.2 30.2 237 1.5 2.7 +00062200.DDC 790 1.75 3602 14.3 -8.7 -37.5 7.0 7.7 16.2 15.4 23.4 157 1.1 2.9 +00061100.AMA 1099 1.75 3932 14.0 -7.9 -33.5 7.8 6.8 9.4 14.8 19.1 128 1.2 2.1 +00060300.ABQ 1620 1.75 1267 9.4 -8.7 -34.3 8.2 6.9 7.6 10.3 17.5 70 0.2 1.4 +00052900.GSO 270 1.75 1988 14.3 -11.1 -37.1 6.2 7.0 17.6 28.7 35.1 139 1.2 1.2 +00051900.FWD 196 1.75 3610 16.2 -10.9 -37.7 7.4 7.2 6.7 25.2 32.9 75 2.4 0.6 +00051200.TOP 270 1.75 5329 16.7 -7.3 -39.3 6.5 8.6 21.0 25.1 29.2 216 2.1 3.7 +00033000.SHV 79 1.75 3548 15.4 -15.9 -44.1 7.6 7.8 23.8 31.6 50.3 323 3.8 2.8 +94070100.GSO 277 1.50 2296 13.8 -10.3 -38.7 5.4 7.7 6.6 8.1 14.3 40 0.3 0.6 +90082200.OUN 357 1.50 3350 16.6 -5.5 -30.6 6.1 6.6 3.1 3.3 5.7 -7 0.3 0.6 +90082200.AHN 246 1.50 3275 16.5 -6.8 -30.8 6.5 6.3 6.0 8.7 15.8 48 0.4 0.6 +90071000.DEN 1611 1.50 3504 13.5 -8.2 -34.3 8.0 7.0 16.7 25.4 20.1 41 1.9 2.5 +90041100.AHN 246 1.50 1096 11.5 -14.0 -40.0 6.4 7.1 19.0 25.4 25.8 343 0.7 0.6 +90040200.GSO 277 1.50 984 8.7 -17.4 -45.5 6.8 7.8 19.9 29.7 37.4 210 0.8 2.0 +89060200.AHN 246 1.50 1996 13.2 -7.3 -34.8 6.1 7.3 3.2 2.6 1.6 18 0.2 -999.0 +06071100.DNR 1625 1.50 1192 10.1 -7.9 -33.7 7.6 6.9 12.2 16.2 27.0 79 0.3 1.7 +06053000.SGF 387 1.50 2988 15.0 -9.3 -34.7 6.5 6.9 4.0 2.7 12.8 27 0.4 0.6 +06052200.LBF 849 1.50 1420 8.2 -11.1 -41.1 7.7 8.1 14.8 15.2 22.6 199 0.5 1.3 +06042117.JAN 101 1.50 1486 13.4 -12.9 -37.5 6.5 6.7 6.4 17.4 11.7 58 0.7 0.6 +03091800.INL 361 1.50 1863 13.7 -13.5 -38.9 7.5 7.0 15.3 24.7 29.2 384 1.5 -999.0 +03031700.MHX 11 1.50 1241 12.1 -13.1 -39.9 5.4 7.3 11.5 19.1 32.8 37 0.5 0.7 +02072500.LCH 10 1.50 5453 20.2 -7.3 -31.7 5.9 6.4 5.5 8.5 11.3 66 0.6 0.6 +02042200.ILN 317 1.50 623 10.3 -13.3 -37.4 6.8 6.6 31.2 36.0 43.5 525 0.4 2.1 +01062600.RNK 654 1.50 1653 11.1 -11.9 -39.7 5.7 7.5 8.3 13.7 30.3 88 0.4 2.1 +01062600.GSO 270 1.50 929 11.9 -11.7 -40.1 6.0 7.7 10.4 17.8 25.6 106 0.3 0.6 +00090200.SLC 1288 1.50 1641 9.1 -14.7 -41.9 8.4 7.4 20.1 16.1 24.8 101 0.9 1.7 +00051800.GSO 270 1.50 1767 11.9 -13.7 -40.9 6.5 7.4 7.6 16.4 31.1 124 0.7 1.6 +94062500.GSO 277 1.25 2334 15.9 -5.4 -31.3 5.6 6.9 12.9 9.9 5.2 103 0.2 0.6 +90041400.OUN 357 1.25 1408 10.8 -18.2 -46.0 7.9 7.7 17.5 23.5 33.0 146 1.2 2.0 +06072800.FGZ 2192 1.25 3100 13.5 -5.3 -30.7 8.1 6.7 14.1 22.7 18.3 193 1.0 2.7 +06072700.ILX 178 1.25 4385 20.7 -4.3 -31.7 5.7 7.2 14.7 12.7 19.1 318 0.6 0.6 +06070400.GRB 214 1.25 1881 14.1 -10.1 -36.5 6.6 7.1 14.0 22.8 40.7 132 0.9 0.6 +06061200.DNR 1625 1.25 942 6.0 -9.9 -38.5 9.4 7.8 7.4 17.1 22.2 130 0.4 0.6 +06060312.LBF 849 1.25 988 7.7 -11.9 -40.5 9.0 7.9 10.8 19.5 17.8 699 0.5 1.0 +06060300.ILX 178 1.25 1218 10.0 -14.5 -42.9 5.9 7.8 14.1 20.0 22.7 87 0.5 1.5 +06052600.FFC 244 1.25 1711 12.1 -12.1 -36.7 7.1 6.6 4.1 8.7 3.3 46 0.4 1.1 +06052000.BOI 874 1.25 1070 7.4 -13.5 -39.9 8.4 7.2 9.2 15.9 25.9 95 0.5 0.8 +06051500.TLH 53 1.25 1279 10.8 -13.7 -41.5 7.1 7.6 18.5 24.7 23.2 104 0.8 1.7 +05100123.LMN 317 1.25 2672 15.9 -9.9 -36.7 7.0 7.2 14.1 21.4 26.0 276 1.3 -999.0 +05090600.LBF 849 1.25 2252 13.0 -9.1 -33.7 8.1 6.7 6.3 14.1 27.2 28 0.7 2.9 +05030700.MAF 872 1.25 547 8.0 -16.7 -46.3 6.9 8.2 16.9 34.3 40.4 177 0.4 1.9 +04100400.AMA 1099 1.25 1672 10.5 -13.5 -40.1 7.6 7.2 10.7 23.5 31.9 28 1.1 2.4 +04032700.RAP 1029 1.25 2052 8.5 -15.5 -43.5 8.0 7.7 12.6 19.0 17.5 161 1.3 1.5 +03090800.PHX 384 1.25 2268 12.1 -6.7 -35.1 6.7 7.5 8.2 10.7 16.8 90 0.3 1.2 +03090800.FGZ 2192 1.25 663 8.3 -8.3 -35.1 7.7 7.1 11.2 15.0 17.0 130 0.2 1.2 +03090300.NKX 128 1.25 940 10.8 -5.9 -32.3 6.6 7.0 4.2 7.0 5.9 9 0.1 0.7 +03040500.ILN 317 1.25 1856 10.4 -15.7 -44.1 6.5 7.8 17.7 20.8 25.6 233 1.0 2.2 +02041200.TOP 270 1.25 1084 9.8 -16.5 -44.3 7.1 7.7 16.2 9.4 27.2 99 0.3 1.6 +00072000.LZK 165 1.25 3973 16.4 -6.7 -30.7 6.8 6.3 8.3 12.6 12.7 102 0.7 1.1 +00071100.DDC 790 1.25 4707 16.4 -4.1 -31.5 6.8 7.2 6.0 4.6 8.7 136 0.4 2.6 +00030400.BMX 178 1.25 1311 11.4 -14.9 -42.9 5.7 7.7 21.1 42.9 54.3 205 0.8 1.4 +99061200.ILN 317 1.00 3299 14.7 -8.3 -35.5 5.8 7.3 8.2 4.6 4.0 32 0.4 1.1 +98052200.BNA 180 1.00 3709 15.2 -10.7 -36.9 6.4 7.0 10.4 9.2 7.9 83 0.8 0.9 +97081800.FFC 244 1.00 3564 18.4 -6.1 -31.1 6.1 6.6 4.4 2.5 2.0 37 0.3 0.6 +97081700.PIT 373 1.00 3951 18.3 -7.9 -31.9 6.9 6.4 15.4 12.7 23.0 224 0.9 0.6 +97081700.DVN 229 1.00 5790 20.8 -8.3 -34.9 7.5 7.1 12.3 14.3 11.8 137 1.7 1.0 +93092500.OUN 381 1.00 2895 16.1 -6.7 -32.0 6.2 6.8 16.0 24.5 27.2 264 1.0 0.6 +91060500.CKL 140 1.00 3345 16.9 -7.5 -32.0 6.3 6.5 9.2 5.0 4.8 52 0.4 0.6 +91060500.AHN 246 1.00 3036 15.3 -8.1 -31.7 6.7 6.3 11.6 5.7 13.0 72 0.4 0.6 +90101800.GGG 124 1.00 1619 14.2 -10.6 -37.1 6.4 7.1 12.5 20.0 27.9 114 0.7 0.6 +90100800.GGG 124 1.00 2689 16.8 -6.0 -32.5 5.8 7.0 8.9 14.2 17.2 70 0.4 0.6 +90092900.MAF 873 1.00 1606 12.2 -8.0 -36.1 6.0 7.5 11.3 15.0 28.7 35 0.3 0.8 +90083000.GSO 277 1.00 3552 16.4 -9.3 -33.8 6.0 6.6 14.1 20.1 18.2 37 1.3 0.6 +90082300.HTS 246 1.00 707 15.2 -7.7 -33.3 6.2 6.8 3.6 7.0 8.5 -4 0.1 0.6 +90082100.OUN 357 1.00 5290 19.2 -6.7 -31.0 6.9 6.4 6.2 8.3 3.4 38 0.7 0.6 +90081900.AMA 1095 1.00 2596 13.6 -7.9 -32.0 7.0 6.5 3.8 5.1 5.1 45 0.3 0.8 +90080200.MAF 873 1.00 1702 14.4 -6.2 -31.8 6.1 6.8 2.8 9.7 12.2 27 0.2 0.6 +90072600.GGW 696 1.00 1514 10.2 -10.6 -37.7 7.0 7.3 7.9 15.6 16.6 55 0.5 1.8 +90072500.DDC 791 1.00 1703 11.9 -8.0 -34.0 6.8 7.0 10.1 14.0 17.5 208 0.4 1.4 +90072200.TBW 13 1.00 3409 17.8 -5.7 -31.9 6.0 6.9 3.6 4.6 7.8 35 0.3 0.6 +90072000.DEN 1611 1.00 1698 11.7 -7.2 -32.2 7.4 6.7 14.0 16.1 20.8 182 0.4 2.1 +90071800.AMA 1095 1.00 1482 11.4 -6.5 -33.5 6.7 7.2 8.4 14.8 26.1 98 0.3 1.1 +90071100.GSO 277 1.00 3487 15.2 -6.6 -32.6 5.9 6.9 7.5 3.5 9.1 38 0.3 0.6 +90070900.GSO 277 1.00 4051 17.6 -5.3 -32.6 5.6 7.2 6.1 10.2 10.5 73 0.4 0.8 +90062400.OUN 357 1.00 1571 11.9 -10.8 -34.1 8.2 6.3 14.1 26.8 24.9 186 1.1 1.9 +90062300.HTS 246 1.00 1346 14.5 -8.5 -33.5 5.8 6.6 19.1 27.1 36.9 231 0.6 0.6 +90061000.GSO 277 1.00 2409 15.3 -8.8 -32.8 6.1 6.4 11.1 9.7 14.5 145 0.4 0.6 +90050400.CKL 140 1.00 1534 14.0 -10.6 -33.4 6.4 6.0 10.8 20.1 25.8 141 0.7 0.6 +89082700.DDC 791 1.00 4549 16.9 -7.4 -32.1 7.6 6.6 1.4 11.3 24.3 11 0.9 2.1 +89082000.UMN 438 1.00 3524 17.3 -6.0 -31.1 6.2 6.6 13.6 20.6 14.9 350 0.9 0.8 +89080600.OUN 357 1.00 3439 16.3 -5.4 -31.1 6.8 6.8 9.7 10.2 12.1 101 0.4 0.8 +89073100.GTF 1118 1.00 1858 9.5 -9.3 -36.7 8.9 7.4 10.3 10.8 21.7 106 0.4 1.2 +89072800.DAY 298 1.00 2617 16.4 -7.8 -34.6 5.7 7.2 7.5 13.5 11.3 83 0.5 0.6 +89072400.VCT 33 1.00 2953 14.8 -9.6 -37.2 6.2 7.4 9.5 7.7 13.3 120 0.4 0.6 +89071200.TOP 268 1.00 3182 16.6 -8.1 -30.9 7.6 6.1 13.2 12.6 8.2 157 0.8 1.6 +89070600.OUN 357 1.00 1373 12.9 -6.0 -34.0 6.2 7.4 11.3 6.0 12.2 64 0.1 0.6 +89062900.AMA 1095 1.00 2035 12.6 -8.2 -31.3 8.6 6.2 13.0 14.8 26.0 165 0.6 2.3 +89062800.HTS 246 1.00 3659 17.6 -8.0 -31.7 5.8 6.4 7.4 15.4 21.4 62 0.8 0.6 +89061900.CKL 140 1.00 3363 16.7 -9.6 -36.6 6.4 7.3 12.2 14.5 12.2 103 1.0 0.6 +89061600.TBW 13 1.00 3463 16.4 -7.6 -32.3 5.7 6.5 5.9 10.2 6.4 36 0.5 0.6 +89061400.JAN 91 1.00 3274 16.0 -11.5 -35.2 7.1 6.4 9.4 11.3 8.2 57 1.0 1.0 +89061200.JAN 91 1.00 3616 17.7 -9.1 -31.2 6.5 5.9 7.5 15.3 5.8 84 1.1 0.6 +89060500.1M1 172 1.00 2493 15.8 -8.2 -35.8 6.0 7.4 10.3 14.7 13.0 19 0.6 0.6 +06092900.FFC 244 1.00 705 10.8 -11.1 -40.1 4.6 7.9 18.9 19.1 33.4 85 0.2 0.6 +06091200.ILX 178 1.00 1642 13.6 -11.1 -38.9 6.4 7.5 8.6 12.9 23.9 56 0.5 0.6 +06090800.LBF 849 1.00 880 7.9 -14.1 -40.7 7.5 7.3 6.9 11.1 19.9 20 0.3 0.9 +06090800.ABR 396 1.00 1406 9.5 -14.3 -42.3 7.5 7.7 10.6 9.4 9.1 163 0.4 1.7 +06081000.TUS 779 1.00 1913 13.4 -6.3 -29.9 7.3 6.3 1.2 3.1 6.2 12 0.2 0.6 +06080100.PIT 357 1.00 3456 18.6 -4.5 -30.1 5.8 6.8 10.1 12.7 7.9 104 0.5 0.6 +06072800.OAX 350 1.00 2714 15.6 -5.3 -34.3 6.0 7.7 9.3 16.8 22.8 92 0.5 0.6 +06072800.ABR 396 1.00 1956 12.7 -6.1 -34.7 6.4 7.6 16.1 23.5 29.4 149 0.5 1.4 +06072700.RAP 1029 1.00 694 8.7 -8.7 -33.7 8.3 6.7 13.4 16.3 21.8 157 0.2 0.9 +06072300.ABQ 1620 1.00 1267 9.6 -4.9 -32.1 7.8 7.2 2.8 5.7 11.2 -9 0.1 1.0 +06072200.RNK 654 1.00 3249 16.5 -6.1 -31.1 6.0 6.6 7.2 7.0 9.1 100 0.3 0.6 +06072000.RNK 654 1.00 2160 14.2 -8.5 -31.1 5.9 6.1 11.1 9.1 3.0 113 0.3 1.0 +06071800.DNR 1625 1.00 1197 9.1 -6.9 -32.3 8.0 6.9 3.5 7.7 6.2 83 0.1 1.1 +06071300.BIS 506 1.00 966 9.0 -8.7 -35.3 8.1 7.1 5.9 7.7 14.5 108 0.1 0.7 +06070500.GSO 270 1.00 2335 15.2 -7.3 -33.1 6.1 6.8 7.6 9.6 6.1 96 0.3 0.6 +06070300.IAD 93 1.00 3195 14.8 -9.3 -36.5 5.9 7.3 10.7 10.7 13.6 60 0.6 0.9 +06070200.LBF 849 1.00 2554 12.2 -8.5 -35.5 8.0 7.3 17.1 20.5 17.9 223 1.0 2.0 +06070200.FWD 171 1.00 1806 12.8 -9.9 -36.5 7.2 7.2 1.6 6.1 11.2 20 0.3 0.6 +06070200.FFC 244 1.00 1552 11.2 -9.7 -38.3 6.3 7.7 1.2 6.5 9.5 4 0.2 0.9 +06062900.TOP 270 1.00 959 8.5 -12.3 -40.9 7.1 7.8 8.1 12.7 14.7 120 0.3 1.0 +06062900.PIT 357 1.00 925 10.9 -13.7 -38.3 6.4 6.7 7.1 21.3 35.7 17 0.5 1.6 +06062800.GRB 214 1.00 1049 9.4 -15.5 -44.5 6.1 8.0 8.1 13.8 20.6 34 0.4 1.6 +06062700.FFC 244 1.00 2376 15.4 -6.9 -33.5 5.6 7.0 9.3 12.6 21.6 23 0.4 0.6 +06062300.DDC 790 1.00 987 11.0 -11.1 -33.3 7.2 6.0 9.3 17.7 17.5 78 0.4 1.3 +06062300.BNA 210 1.00 3023 15.6 -10.1 -34.7 7.3 6.6 8.0 10.6 3.6 71 0.8 0.6 +06062300.BMX 178 1.00 1595 12.5 -7.1 -34.3 6.2 7.2 1.9 5.1 4.3 -10 0.1 0.6 +06062200.JAN 101 1.00 2595 15.3 -8.7 -34.7 7.0 7.0 4.6 3.0 2.5 -15 0.4 0.6 +06062100.BNA 210 1.00 2387 14.1 -9.3 -35.3 6.8 6.9 6.8 6.7 3.3 43 0.3 0.6 +06061900.GRB 214 1.00 2397 14.0 -11.7 -38.1 6.2 7.2 12.4 15.9 20.9 74 0.9 1.9 +06061200.BNA 210 1.00 1539 13.6 -6.7 -34.3 5.6 7.4 9.1 15.2 7.0 107 0.3 0.6 +06060800.LBF 849 1.00 2368 10.8 -6.9 -36.5 7.7 7.9 11.2 20.5 22.3 244 0.7 1.7 +06060712.RAP 1029 1.00 1110 7.9 -10.3 -38.1 8.7 7.6 9.9 12.3 19.2 131 0.3 1.3 +06060700.SHV 79 1.00 2252 14.6 -10.3 -34.3 7.4 6.4 15.1 25.4 14.5 164 1.4 0.6 +06060500.FFC 244 1.00 1475 11.0 -12.5 -39.5 5.9 7.4 5.7 11.7 22.4 18 0.3 2.1 +06060400.ILN 317 1.00 1032 8.3 -18.1 -46.9 6.5 8.0 6.7 8.5 11.1 35 0.3 1.2 +06060300.GRB 214 1.00 1314 8.8 -18.9 -45.5 7.1 7.4 12.0 16.3 19.5 77 0.7 1.6 +06060200.BNA 210 1.00 2055 14.2 -7.9 -34.3 5.4 7.1 8.6 5.5 12.6 -2 0.2 0.6 +06053100.GGW 700 1.00 570 5.6 -21.1 -50.3 7.4 8.3 2.8 5.0 8.1 30 0.2 0.9 +06052700.JAX 9 1.00 2879 15.0 -9.9 -36.5 6.1 7.2 11.0 13.7 13.1 117 0.8 0.8 +06052700.BIS 506 1.00 2274 9.4 -11.9 -40.3 8.5 7.7 20.2 22.0 21.3 198 1.3 1.3 +06052600.JAX 9 1.00 1856 13.3 -10.7 -37.3 6.6 7.2 10.5 15.3 20.8 70 0.6 0.6 +06052600.GSO 270 1.00 1743 11.9 -10.1 -36.3 6.1 7.0 8.4 14.4 11.4 82 0.4 0.8 +06052600.AMA 1099 1.00 1911 7.9 -11.3 -38.3 9.9 7.3 11.8 16.9 12.6 262 0.9 0.7 +06052300.RAP 1029 1.00 2536 9.6 -10.3 -39.5 8.5 7.9 5.6 9.7 18.1 43 0.6 1.3 +06051800.IAD 93 1.00 1009 8.4 -20.5 -45.9 6.7 7.2 11.9 16.0 20.3 66 0.6 1.3 +06051600.DTX 329 1.00 519 8.7 -20.5 -49.7 6.1 8.2 7.2 5.0 17.9 -7 0.1 0.7 +06041400.PIT 357 1.00 390 6.2 -20.1 -48.7 7.0 8.1 18.8 18.6 40.0 220 0.3 0.9 +06041400.BUF 215 1.00 383 6.2 -23.3 -49.9 7.6 7.6 21.6 26.8 55.7 237 0.5 1.4 +06011200.GSO 270 1.00 1374 9.5 -19.1 -46.5 7.5 7.7 21.9 15.6 28.9 253 0.8 2.5 +06010300.ILN 317 1.00 791 9.0 -19.3 -46.1 7.5 7.5 7.8 16.0 23.8 140 0.5 1.4 +05092900.FWD 171 1.00 1553 12.7 -5.9 -29.7 6.4 6.3 8.5 10.1 13.0 39 0.2 0.6 +05082700.EPZ 1252 1.00 2162 11.1 -6.5 -31.9 8.5 6.8 4.0 4.9 6.7 21 0.2 1.0 +05081800.LMN 317 1.00 3655 17.7 -4.1 -30.3 6.0 6.8 13.3 22.3 17.3 221 0.9 0.6 +05081700.GGW 700 1.00 1042 9.2 -11.1 -36.7 7.8 6.9 16.7 27.6 40.5 265 0.6 1.7 +05081100.GGW 700 1.00 805 10.1 -13.7 -37.9 7.4 6.5 15.6 30.5 38.9 170 0.6 2.1 +05050600.EPZ 1252 1.00 1672 8.0 -12.7 -40.3 8.6 7.5 15.0 27.7 28.8 178 1.3 1.2 +05050412.TBW 13 1.00 1839 14.1 -13.5 -39.3 7.3 7.0 10.0 15.8 33.3 187 0.9 1.0 +05030400.SGF 387 1.00 823 5.9 -25.9 -52.1 7.1 7.5 13.0 24.2 27.9 151 1.0 0.7 +04082800.OUN 357 1.00 4225 16.0 -7.1 -32.5 7.4 6.7 7.0 3.8 3.0 101 0.5 1.5 +04081700.TUS 779 1.00 2027 13.1 -8.9 -34.5 7.1 6.9 8.8 13.2 13.3 96 0.5 1.0 +04080900.TOP 270 1.00 2676 14.3 -11.5 -36.3 7.4 6.7 5.9 11.9 15.6 82 0.9 0.9 +04051200.AMA 1099 1.00 1922 9.7 -11.5 -38.7 8.0 7.4 19.1 15.0 8.4 282 0.7 1.6 +04051000.FFC 244 1.00 2006 11.4 -11.1 -38.3 5.4 7.4 4.0 4.7 11.0 -15 0.2 1.9 +04032100.FWD 171 1.00 2648 13.1 -15.5 -42.9 8.2 7.5 4.9 12.9 20.8 29 1.4 2.8 +04031500.DRT 313 1.00 1498 11.6 -15.5 -43.1 7.0 7.6 6.6 16.8 24.5 123 0.8 1.4 +03111712.TOP 270 1.00 1641 11.5 -17.3 -45.7 7.3 7.9 17.8 25.6 32.6 329 1.4 2.7 +03090900.TUS 779 1.00 2363 11.5 -8.3 -34.9 7.3 7.1 2.8 7.9 11.8 12 0.3 1.1 +03060900.RNK 654 1.00 2965 15.0 -9.1 -36.7 6.2 7.4 18.9 24.1 29.2 134 1.3 1.2 +03060200.DDC 790 1.00 1960 11.1 -9.5 -35.3 7.9 6.9 11.9 17.5 20.6 222 0.7 2.0 +03052700.ABQ 1620 1.00 713 7.1 -9.9 -37.1 8.3 7.3 3.1 14.7 20.6 12 0.2 0.6 +03052600.TFX 1131 1.00 994 8.3 -10.9 -37.7 8.0 7.3 9.1 16.0 15.9 59 0.4 1.3 +03051800.XMR 3 1.00 3602 16.0 -9.5 -35.9 7.0 7.1 5.6 8.6 10.7 -7 0.7 0.9 +03051800.TBW 13 1.00 3839 16.1 -8.7 -36.5 6.5 7.5 6.2 5.7 11.9 3 0.5 1.1 +03051200.JAX 9 1.00 3060 15.9 -7.9 -33.5 6.9 6.8 10.1 13.2 20.0 48 0.7 -999.0 +03051100.MHX 11 1.00 3585 16.0 -9.3 -37.7 7.3 7.6 11.9 16.2 15.0 104 1.3 0.9 +03050312.BMX 178 1.00 1402 9.7 -16.1 -41.9 7.5 7.1 7.9 13.8 38.5 72 0.6 1.8 +03050212.BNA 210 1.00 1865 10.3 -15.3 -44.9 7.0 8.2 12.1 13.0 18.0 55 0.7 2.2 +03050100.FFC 244 1.00 1429 11.1 -13.5 -40.1 6.6 7.2 1.0 6.9 6.4 5 0.2 1.6 +03043000.OAX 350 1.00 1064 8.9 -16.3 -44.3 7.4 7.8 18.4 29.1 32.0 353 0.9 1.9 +03042800.MFL 5 1.00 2735 16.7 -10.7 -35.7 6.4 6.7 12.3 11.7 25.5 83 0.7 0.6 +03042400.SHV 79 1.00 1456 13.1 -12.9 -38.9 7.2 7.1 15.2 26.1 36.8 278 1.1 0.6 +03041800.DNR 1625 1.00 1063 5.3 -18.1 -47.9 8.6 8.3 5.9 11.0 43.9 41 0.5 0.6 +03040500.LZK 78 1.00 1751 10.7 -14.9 -42.5 6.6 7.6 12.6 27.4 33.1 65 1.2 2.3 +03032100.DTX 329 1.00 1602 8.7 -21.3 -48.3 6.6 7.7 7.7 13.3 27.1 80 0.8 1.1 +03032000.ILX 178 1.00 713 8.0 -21.9 -36.7 6.9 4.2 5.4 3.5 11.4 -26 0.2 1.4 +03031500.TBW 13 1.00 3398 15.9 -13.7 -38.1 7.0 6.6 3.9 18.6 27.3 32 1.9 0.9 +02080400.SGF 387 1.00 4328 17.7 -5.5 -34.5 6.5 7.7 3.8 1.1 7.6 -11 0.3 1.5 +02080300.BMX 178 1.00 5098 18.4 -6.5 -35.1 5.8 7.6 11.5 9.6 10.8 33 0.6 1.4 +02072900.AMA 1099 1.00 3610 13.6 -6.5 -32.3 7.8 6.9 13.6 12.5 12.2 164 0.7 2.0 +02072700.RAP 1029 1.00 1688 9.4 -9.3 -37.5 7.5 7.6 14.5 21.0 28.6 139 0.7 1.3 +02072600.TOP 270 1.00 3390 13.8 -5.9 -33.9 7.5 7.4 11.9 16.9 16.9 168 0.8 2.2 +02072000.JAN 133 1.00 3501 17.6 -6.7 -31.9 6.1 6.7 5.7 6.1 7.9 58 0.3 0.6 +02070300.LBF 849 1.00 3367 14.1 -5.9 -35.3 7.5 7.8 11.5 14.0 6.2 158 0.7 1.2 +02070200.FFC 244 1.00 4268 16.3 -9.7 -36.1 6.6 7.1 7.3 7.8 4.3 46 0.7 0.6 +02060700.ABR 396 1.00 2252 9.0 -14.7 -43.9 8.1 8.1 8.2 12.4 18.1 118 0.9 1.2 +02060400.CHS 15 1.00 3170 15.2 -10.1 -34.9 7.6 6.7 11.7 9.7 10.8 33 0.8 0.6 +02052700.AMA 1099 1.00 2332 9.7 -11.1 -37.9 7.2 7.3 13.0 14.5 11.8 198 0.7 1.4 +02051800.CRP 13 1.00 5902 20.3 -10.5 -36.9 7.4 7.1 10.7 22.6 23.2 86 3.4 1.6 +02042300.OAX 350 1.00 614 6.4 -23.3 -46.3 7.9 6.5 15.2 26.3 36.6 133 0.8 1.4 +02012400.LZK 78 1.00 1343 13.1 -12.7 -41.1 6.6 7.8 20.2 32.5 40.7 290 0.9 0.6 +01062600.LBF 849 1.00 3931 12.7 -8.1 -35.3 8.1 7.3 8.1 9.3 8.1 119 0.7 1.5 +01062100.ABR 396 1.00 1118 8.1 -19.3 -47.7 7.0 7.9 3.6 4.2 12.4 14 0.3 1.3 +01061900.JAX 9 1.00 2584 17.2 -9.5 -35.5 6.1 7.0 5.0 4.8 8.3 13 0.3 0.6 +00080700.TOP 270 1.00 4476 17.3 -7.5 -33.1 7.2 6.7 11.7 17.8 22.9 72 1.4 1.8 +00072900.ILN 317 1.00 2735 14.3 -11.5 -37.7 6.7 7.1 8.0 13.4 21.0 68 0.9 0.6 +00072900.CHS 15 1.00 2462 16.1 -7.5 -34.9 5.6 7.3 3.3 9.3 13.2 4 0.3 0.6 +00072800.TOP 270 1.00 3666 15.3 -10.3 -35.3 7.6 6.8 9.1 22.0 26.4 115 2.1 2.6 +00072800.LBF 849 1.00 5581 17.1 -7.7 -35.5 8.1 7.5 9.6 25.0 21.1 187 2.8 3.1 +00072700.JAN 101 1.00 2066 12.5 -10.7 -35.7 6.4 6.7 4.2 8.0 8.4 -50 0.3 1.0 +00072300.OTX 728 1.00 2088 9.0 -12.3 -42.7 8.2 8.3 7.8 17.2 21.1 43 0.9 1.2 +00071900.GYX 125 1.00 997 11.4 -13.3 -37.7 6.0 6.6 18.8 27.0 36.1 107 0.6 1.0 +00071700.TOP 270 1.00 3927 15.9 -8.7 -31.7 7.9 6.1 14.5 8.9 14.1 198 0.8 2.4 +00071500.SHV 79 1.00 4004 17.2 -5.9 -31.1 6.0 6.7 6.2 4.6 8.6 46 0.3 0.6 +00071400.GRB 214 1.00 1743 12.0 -12.3 -37.9 6.9 6.9 13.4 21.5 42.9 195 0.9 1.7 +00071200.DDC 790 1.00 2941 14.4 -5.5 -30.7 7.2 6.7 10.8 11.3 11.7 196 0.4 1.4 +00070700.RAP 966 1.00 4065 14.2 -7.7 -35.3 8.6 7.3 10.8 29.4 33.3 111 2.3 2.1 +00070400.DDC 790 1.00 5142 18.1 -7.1 -30.7 7.6 6.4 11.4 9.7 19.2 114 0.9 2.4 +00070300.OAX 350 1.00 4633 18.5 -6.3 -32.3 6.9 6.9 9.9 10.6 19.6 133 0.7 1.9 +00070300.DDC 790 1.00 4558 17.2 -5.9 -30.9 7.5 6.7 11.7 13.6 22.7 66 0.9 2.4 +00070200.RAP 966 1.00 5621 15.6 -9.7 -36.3 8.7 7.3 15.9 21.5 22.7 263 3.3 2.2 +00070200.DDC 790 1.00 3566 16.2 -5.7 -34.7 6.6 7.7 5.5 14.2 21.9 38 0.6 1.3 +00063000.PIT 373 1.00 1086 9.9 -15.9 -40.5 5.5 6.8 8.1 22.0 37.9 77 0.5 1.8 +00062600.TOP 270 1.00 4052 17.8 -8.9 -32.7 7.6 6.4 2.4 1.3 23.9 26 0.6 2.3 +00062600.DDC 790 1.00 2618 13.5 -6.1 -32.3 6.7 6.9 14.3 15.8 16.9 51 0.5 1.6 +00062300.MHX 11 1.00 4167 18.6 -8.7 -34.1 6.1 6.8 9.7 6.0 6.1 89 0.5 0.6 +00062100.TBW 13 1.00 3180 17.1 -8.5 -32.1 6.4 6.4 8.9 12.2 19.0 49 0.7 0.6 +00060200.TOP 270 1.00 3517 16.1 -9.3 -34.5 6.9 6.7 4.9 10.4 16.3 39 0.8 0.8 +00060200.DVN 229 1.00 3451 16.4 -9.3 -35.5 7.3 7.0 14.2 14.1 11.0 175 1.1 0.6 +00060100.ILX 178 1.00 3208 16.1 -9.1 -37.7 7.0 7.7 20.7 17.9 15.6 163 1.2 1.8 +00053000.LBF 849 1.00 2258 9.9 -9.7 -37.9 9.2 7.6 16.9 27.2 31.9 294 1.4 1.1 +00051400.TLH 21 1.00 3542 15.9 -9.9 -37.7 6.9 7.5 5.4 4.2 4.2 -4 0.5 1.0 +00021800.JAN 101 0.88 1866 12.5 -14.9 -43.1 6.7 7.8 16.2 27.5 38.9 270 1.5 0.7 +00061100.DDC 790 0.88 3471 14.3 -7.9 -33.9 6.9 6.9 14.0 11.0 20.2 53 0.7 2.4 +00061800.RAP 966 0.88 1396 7.4 -18.9 -44.5 7.1 7.2 7.4 14.0 34.9 270 0.7 1.4 +00070600.DDC 790 0.88 2581 12.3 -7.5 -31.7 8.5 6.4 10.7 9.4 10.0 97 0.5 1.8 +00072800.BMX 178 0.88 2147 13.2 -9.5 -36.3 6.2 7.2 6.0 8.0 11.4 35 0.3 0.7 +00080200.DVN 229 0.88 4183 16.6 -9.7 -38.1 6.6 7.6 13.3 11.2 16.4 169 1.0 1.1 +00080300.PIT 373 0.88 2780 14.9 -9.7 -37.1 6.2 7.3 9.1 15.5 29.2 81 0.8 0.6 +00080400.BNA 180 0.88 3453 16.3 -9.9 -35.1 6.8 6.8 9.1 10.9 16.0 83 0.8 0.6 +00080500.LZK 165 0.88 3872 16.1 -6.3 -33.3 5.6 7.3 7.3 9.4 14.6 6 0.4 0.8 +00080700.DTX 329 0.88 4231 19.4 -7.3 -31.9 6.0 6.6 10.6 16.6 31.6 78 1.0 0.6 +00090300.OAX 350 0.88 3099 12.6 -10.1 -36.3 8.7 7.0 9.5 16.9 21.6 126 1.4 1.4 +01062200.DVN 229 0.88 1285 10.3 -18.1 -44.9 6.5 7.5 8.7 10.8 11.8 66 0.4 1.0 +01062600.CRP 13 0.88 3837 16.6 -8.5 -35.7 6.4 7.3 7.1 4.0 8.9 53 0.5 0.6 +02031000.GSO 270 0.88 819 11.0 -15.3 -41.3 5.8 7.2 19.8 24.6 29.7 236 0.5 1.2 +02052900.OAX 350 0.88 2754 13.0 -13.3 -40.9 7.1 7.5 10.0 7.5 7.0 127 0.6 2.6 +03031400.TLH 53 0.88 2141 11.6 -13.1 -43.3 6.3 8.3 5.7 10.5 9.0 39 0.5 1.1 +03042912.TOP 270 0.88 1617 10.6 -16.9 -43.9 7.8 7.5 11.0 16.7 22.5 238 0.9 2.8 +03050400.BIS 506 0.88 1467 8.2 -18.7 -47.3 7.4 8.0 8.8 15.4 16.1 86 0.8 1.6 +03060300.JAX 9 0.88 3513 16.1 -10.1 -36.5 7.6 7.1 11.4 11.1 10.3 111 1.0 0.6 +03060600.ABR 396 0.88 888 8.1 -19.9 -46.5 6.8 7.5 9.2 17.3 14.2 47 0.5 1.5 +03061600.TOP 270 0.88 1944 12.4 -11.9 -38.7 6.4 7.3 5.8 0.8 4.2 3 0.3 1.0 +03062000.GGW 700 0.88 1032 9.2 -9.7 -37.5 8.1 7.5 8.3 9.8 17.1 76 0.2 1.3 +03101712.JAN 101 0.88 1891 12.8 -11.5 -43.1 6.3 8.6 16.9 25.4 33.9 246 1.1 1.2 +03102600.CRP 13 0.88 3408 17.9 -9.9 -35.3 6.3 6.8 9.8 15.2 34.5 17 1.0 0.6 +03111800.OAX 350 0.88 957 10.0 -18.3 -43.3 6.8 6.9 20.0 41.2 58.6 88 0.8 2.5 +04040900.AMA 1099 0.88 1515 8.2 -16.7 -45.5 7.0 8.0 14.7 17.9 23.0 139 0.8 1.6 +04081800.PHX 384 0.88 1709 10.5 -9.1 -35.5 7.3 7.1 6.0 4.8 9.2 15 0.2 0.8 +04082700.ABR 396 0.88 1433 10.2 -15.1 -41.5 6.7 7.3 5.3 14.4 40.5 28 0.5 1.5 +04091900.LCH 10 0.88 2433 15.9 -6.9 -31.9 5.8 6.6 7.7 4.4 15.6 6 0.2 0.6 +04092000.OAK 3 0.88 242 7.3 -17.9 -36.7 5.5 5.2 6.5 27.4 30.4 56 0.2 0.7 +04100400.GSO 270 0.88 1385 13.2 -14.9 -40.1 6.5 6.9 10.4 15.2 26.8 101 0.6 1.4 +05081300.MAF 872 0.88 1568 12.8 -6.3 -31.7 6.5 6.8 6.9 11.8 13.7 82 0.2 0.6 +06013012.JAN 101 0.88 1058 10.0 -20.9 -45.9 7.1 7.0 18.9 38.7 46.0 71 1.1 2.6 +06032100.OUN 357 0.88 579 5.4 -25.5 -40.9 7.4 4.4 5.7 16.6 26.7 53 0.5 0.9 +06040700.FWD 171 0.88 2831 12.5 -12.5 -42.1 6.2 8.1 20.1 33.5 41.5 40 1.8 2.8 +06041200.TOP 270 0.88 726 8.4 -14.3 -42.9 7.0 7.9 23.1 33.2 37.2 232 0.5 2.0 +06043000.OTX 728 0.88 499 6.4 -17.9 -44.3 7.3 7.4 8.3 17.3 23.3 75 0.3 0.8 +89061200.AMA 1095 0.88 3301 13.2 -11.7 -39.3 8.7 7.5 9.2 12.9 25.2 167 1.4 2.3 +89062600.UMN 438 0.88 3812 16.2 -6.9 -33.3 6.3 7.0 2.0 0.7 10.8 -14 0.4 0.6 +89062700.DEN 1611 0.88 931 8.6 -11.1 -38.5 7.6 7.5 10.8 14.3 14.3 122 0.3 1.8 +89072700.AHN 246 0.88 3996 17.5 -6.9 -33.6 6.5 7.1 7.1 3.5 6.8 66 0.4 0.6 +89082500.AHN 246 0.88 3533 16.9 -5.1 -30.7 6.1 6.8 2.7 3.3 8.1 5 0.3 0.6 +89082600.AHN 246 0.88 3463 17.1 -5.6 -31.0 5.8 6.7 4.0 11.3 8.6 41 0.4 0.6 +89082900.GGG 124 0.88 3979 18.5 -4.6 -29.9 6.0 6.7 1.6 4.1 2.2 3 0.3 0.6 +90071000.PIT 360 0.88 3362 16.6 -6.7 -31.4 6.3 6.6 14.3 19.7 14.7 124 0.9 0.6 +90073000.AMA 1095 0.88 943 12.2 -7.5 -32.1 6.3 6.5 8.4 12.7 18.1 14 0.2 0.6 +90091900.OUN 357 0.88 3878 18.0 -6.7 -31.3 6.2 6.6 12.1 11.9 20.5 119 0.6 0.6 +97010900.SIL 8 0.88 909 13.1 -13.6 -37.2 6.7 6.4 33.7 39.7 37.0 511 0.7 -999.0 +98062500.DDC 790 0.88 2667 11.9 -7.3 -34.1 8.7 7.2 12.4 25.1 34.7 224 1.2 1.4 +90052100.SIL 8 0.85 3505 16.6 -10.6 -35.6 6.7 6.7 10.9 8.4 13.0 70 0.7 0.6 +03052100.TBW 13 0.80 2941 15.8 -9.5 -35.9 6.2 7.1 7.1 2.7 5.4 27 0.4 0.6 +91051700.JAN 91 0.80 2890 15.5 -8.9 -36.0 6.5 7.3 0.6 1.1 7.8 1 0.4 0.6 +00022400.LZK 165 0.75 1590 10.6 -18.1 -45.7 7.0 7.7 17.2 25.0 34.2 270 1.3 2.5 +00050300.JAN 101 0.75 1438 12.8 -12.9 -38.5 5.9 7.0 13.9 12.8 7.2 120 0.4 0.6 +00052200.LZK 165 0.75 2062 12.1 -13.5 -44.1 6.2 8.4 17.7 22.6 32.5 162 1.1 1.4 +00061800.JAX 9 0.75 2677 15.7 -7.9 -34.1 5.7 7.0 7.9 6.0 10.5 61 0.3 0.6 +00061900.WAL 41 0.75 2940 17.4 -7.9 -33.5 6.3 6.9 11.6 11.3 9.5 134 0.5 0.6 +00062500.JAX 9 0.75 2442 15.6 -10.1 -34.9 6.2 6.6 9.3 9.4 21.8 104 0.5 0.6 +00062900.GRB 214 0.75 860 8.9 -18.9 -47.9 6.4 8.1 14.1 17.0 24.4 108 0.5 1.1 +00071300.DDC 790 0.75 3064 15.1 -3.7 -31.1 6.1 7.2 9.2 6.2 10.6 0 0.2 0.6 +00071300.FWD 196 0.75 3103 14.9 -5.7 -31.9 6.5 6.9 13.9 10.6 11.4 120 0.4 0.8 +00071800.JAN 101 0.75 3305 15.8 -5.5 -29.7 6.0 6.3 13.1 13.9 14.4 -56 0.5 0.6 +00071900.JAN 101 0.75 3841 17.3 -6.1 -31.7 6.1 6.8 5.7 7.5 6.9 32 0.3 0.6 +00072100.TBW 13 0.75 4845 18.9 -6.9 -31.9 6.4 6.6 7.4 7.0 10.7 56 0.5 0.9 +00072300.GSO 270 0.75 2443 16.5 -9.1 -32.3 5.7 6.1 6.6 20.6 22.2 88 0.9 0.6 +00072400.GGW 700 0.75 3240 10.9 -11.1 -40.3 8.5 7.9 12.5 26.1 22.5 54 2.1 1.4 +00080400.LCH 10 0.75 3045 15.7 -7.5 -32.7 5.6 6.7 4.7 2.8 12.8 28 0.3 0.6 +00090200.SHV 79 0.75 1896 12.1 -7.5 -32.5 7.0 6.6 5.2 3.2 2.0 15 0.2 0.7 +01062400.BIS 506 0.75 4781 13.7 -10.9 -38.3 9.0 7.4 15.0 18.7 27.1 249 2.8 1.7 +02030812.ILX 178 0.75 533 7.2 -19.7 -48.7 6.9 8.2 16.1 31.5 49.1 599 0.5 1.3 +02051500.PIT 357 0.75 521 5.9 -27.9 -45.7 7.9 5.1 17.3 14.7 14.3 74 0.4 1.1 +02060400.JAX 9 0.75 3128 15.3 -8.1 -33.3 6.5 6.7 0.3 3.7 6.5 15 0.4 0.6 +02062500.LBF 849 0.75 3690 11.7 -10.3 -37.1 9.2 7.2 5.0 7.2 9.1 45 0.7 1.3 +02072000.LZK 78 0.75 6551 21.6 -8.5 -32.7 6.9 6.6 8.7 10.2 6.8 145 1.3 0.9 +03031500.OTX 728 0.75 801 6.3 -26.3 -49.9 7.5 6.8 18.3 24.9 28.7 240 1.0 1.5 +03032000.SGF 387 0.75 909 7.6 -22.1 -40.1 6.7 5.1 18.2 10.5 8.6 205 0.4 1.4 +03040922.XMR 3 0.75 2570 15.5 -10.3 -37.3 5.6 7.3 12.7 31.0 38.3 34 1.3 0.6 +03042300.DNR 1625 0.75 1183 6.7 -16.1 -46.5 7.9 8.5 12.2 19.1 35.2 265 0.7 1.2 +03050100.DNR 1625 0.75 1011 6.7 -20.1 -46.3 8.0 7.4 12.5 33.5 27.3 108 1.1 1.2 +03050200.BMX 178 0.75 2216 12.4 -12.9 -40.7 6.6 7.5 4.6 6.7 7.6 9 0.4 0.7 +03052400.PIT 357 0.75 707 10.0 -16.7 -44.5 6.5 7.7 12.1 26.5 23.6 65 0.5 1.0 +03060700.MFL 5 0.75 3041 18.2 -6.7 -31.3 5.6 6.5 0.9 2.8 9.3 5 0.3 0.6 +03061000.JAX 53 0.75 2482 16.0 -8.7 -33.9 6.7 6.7 10.8 11.3 22.4 13 0.5 0.6 +03061222.XMR 3 0.75 2144 17.1 -7.9 -32.5 6.1 6.5 5.2 4.6 6.1 65 0.2 0.6 +03061500.SHV 79 0.75 2511 16.2 -9.9 -33.9 6.3 6.4 13.5 21.1 32.8 91 1.1 0.6 +03061900.TFX 1131 0.75 1802 8.6 -9.3 -37.5 8.2 7.6 13.1 10.8 13.4 178 0.4 1.0 +03062000.BOI 874 0.75 491 7.0 -12.5 -39.7 8.2 7.4 17.9 23.3 18.1 141 0.3 1.0 +03062100.RAP 1029 0.75 2338 11.9 -10.3 -36.1 7.2 7.0 15.0 8.1 14.4 137 0.4 2.4 +03062200.IAD 93 0.75 1215 10.5 -17.1 -38.3 5.8 5.9 9.3 15.1 9.7 79 0.5 1.1 +03090900.GJT 1475 0.75 996 6.8 -12.3 -39.5 9.1 7.4 8.5 17.7 28.1 199 0.5 0.7 +03090900.MAF 872 0.75 2389 12.1 -7.9 -36.1 7.0 7.6 12.1 18.1 17.8 222 0.7 2.2 +03091000.JAN 101 0.75 1929 15.0 -9.5 -35.3 6.0 6.9 8.1 10.8 22.1 83 0.4 0.6 +03111300.BUF 215 0.75 418 8.1 -20.5 -44.7 6.7 6.8 18.0 46.9 65.5 335 0.4 1.5 +04030500.LZK 78 0.75 745 12.4 -10.1 -37.1 5.8 7.2 27.8 39.6 53.2 468 0.4 0.6 +04051300.OAX 350 0.75 1193 10.5 -13.7 -40.5 6.9 7.3 16.7 24.2 28.7 133 0.7 2.2 +04051700.FFC 244 0.75 2077 12.2 -12.1 -39.3 6.4 7.4 2.9 2.0 11.6 0 0.3 0.8 +04052300.BUF 215 0.75 1807 13.8 -10.6 -36.5 5.8 7.0 18.8 22.4 24.0 239 0.8 0.6 +04081700.PHX 384 0.75 2729 12.6 -7.9 -35.3 7.1 7.3 6.2 8.0 6.2 60 0.4 1.3 +04081900.DDC 790 0.75 2146 11.7 -6.3 -34.7 6.2 7.5 10.2 4.3 11.0 15 0.2 0.7 +04081900.OTX 728 0.75 1929 9.8 -11.3 -38.9 7.4 7.4 6.2 9.9 15.1 43 0.4 1.5 +04082800.JAN 101 0.75 3714 18.0 -7.5 -33.7 6.4 7.0 1.0 2.6 3.6 12 0.4 0.6 +04082800.PIT 357 0.75 3258 18.3 -6.1 -31.3 5.6 6.7 10.4 7.8 6.8 106 0.3 0.6 +04092800.DNR 1625 0.75 698 7.9 -13.9 -38.7 7.1 6.8 12.4 17.7 21.0 112 0.3 1.0 +04100400.CHS 15 0.75 1850 15.3 -10.7 -36.1 6.0 6.9 13.4 22.1 32.7 81 0.9 0.6 +05022200.BMX 178 0.75 1749 11.8 -15.9 -43.5 6.8 7.6 19.0 26.1 36.8 174 1.4 1.2 +05030700.OAX 350 0.75 324 5.7 -21.9 -50.1 7.4 7.9 13.6 14.9 9.6 156 0.2 0.9 +05042612.JAN 101 0.75 993 9.2 -17.3 -43.3 6.9 7.2 15.7 27.2 35.7 336 0.8 2.2 +05050500.OTX 728 0.75 1601 7.7 -19.1 -46.9 7.3 7.8 8.5 15.7 22.0 35 0.9 1.4 +05082100.OAX 350 0.75 2617 15.5 -6.9 -34.3 6.0 7.3 15.0 14.8 30.9 159 0.5 0.6 +05082400.SHV 79 0.75 3397 16.6 -5.3 -30.5 6.1 6.8 11.1 9.2 4.4 72 0.3 0.6 +06011400.JAX 9 0.75 1223 12.1 -15.1 -42.3 6.5 7.5 19.7 19.6 26.7 233 0.7 0.7 +89052800.CKL 140 0.75 2098 15.4 -8.1 -34.6 6.2 7.1 8.0 11.8 13.5 43 0.4 0.6 +89060400.PAH 126 0.75 3338 16.4 -9.7 -37.6 5.8 7.5 15.5 14.2 14.7 90 0.9 0.6 +89060700.AHN 246 0.75 2402 14.2 -13.0 -38.1 6.6 6.8 2.7 12.3 18.6 37 0.8 0.6 +89061300.CKL 140 0.75 2677 16.1 -8.6 -32.8 6.1 6.4 11.5 15.9 7.3 102 0.7 0.6 +89061500.AHN 246 0.75 1717 14.7 -7.5 -31.3 5.5 6.3 11.8 10.0 9.8 91 0.2 0.6 +89061600.ACY 23 0.75 2243 16.5 -7.6 -34.5 5.9 7.2 19.5 18.8 19.1 217 0.6 0.6 +89062200.CKL 140 0.75 2986 16.1 -10.1 -37.3 6.7 7.3 6.8 10.0 8.5 76 0.7 0.6 +89062300.GRB 210 0.75 1729 14.6 -8.4 -34.6 6.2 7.0 10.0 10.7 10.8 139 0.3 -999.0 +89062300.OUN 357 0.75 3217 16.0 -7.1 -34.1 5.9 7.2 6.9 12.8 14.9 113 0.6 0.6 +89062700.PIT 360 0.75 2924 16.0 -9.1 -33.7 6.8 6.6 7.9 8.1 4.9 69 0.5 0.6 +89070800.AHN 246 0.75 2876 16.8 -6.5 -32.3 5.8 6.8 4.3 4.1 4.8 33 0.2 0.6 +89071100.DDC 791 0.75 1858 11.9 -8.1 -35.3 7.6 7.3 12.4 8.5 14.0 249 0.3 2.1 +89072900.SIL 8 0.75 4031 18.8 -6.8 -31.8 6.3 6.6 3.9 4.1 4.4 37 0.4 0.6 +89073000.PAH 126 0.75 3630 17.9 -7.0 -33.2 6.4 7.0 7.4 11.4 9.0 58 0.6 0.6 +89073100.TOP 268 0.75 2685 14.5 -6.4 -31.4 6.7 6.7 12.0 9.8 13.0 117 0.4 0.6 +89081200.GRB 210 0.75 1782 11.3 -14.8 -41.6 6.7 7.3 3.9 4.1 9.5 39 0.3 0.6 +89081900.HON 392 0.75 984 13.1 -7.6 -33.3 7.1 6.8 12.1 14.0 17.9 244 0.2 -999.0 +89102800.OUN 357 0.75 1679 12.0 -12.7 -39.4 6.8 7.3 8.3 10.1 27.1 115 0.4 1.0 +90033100.TBW 13 0.75 2515 14.8 -10.0 -38.4 5.6 7.7 12.0 14.0 15.0 135 0.6 0.6 +90042100.OUN 362 0.75 1915 12.4 -14.1 -40.9 6.5 7.3 13.1 25.3 31.9 138 1.3 1.7 +90042200.SEP 399 0.75 2775 13.3 -11.7 -40.8 6.5 7.9 8.1 10.2 20.8 98 0.7 1.0 +90042400.1M1 172 0.75 2374 12.8 -12.6 -40.0 6.7 7.5 6.6 14.0 8.3 56 0.9 0.9 +90052500.MAF 873 0.75 3262 13.1 -7.2 -34.0 7.9 7.2 12.4 22.0 30.6 97 1.3 1.8 +90060400.PIT 360 0.75 390 9.5 -12.5 -36.7 5.6 6.5 14.6 26.0 37.7 57 0.2 0.6 +90060700.TBW 13 0.75 3262 17.0 -8.6 -34.5 6.0 6.9 4.1 1.6 7.3 8 0.4 0.6 +90061000.AHN 246 0.75 2847 14.8 -8.2 -33.4 5.9 6.7 5.6 8.6 9.9 50 0.4 0.6 +90070300.SLI 8 0.75 3250 18.4 -5.7 -32.8 5.8 7.2 7.5 11.8 14.5 79 0.4 0.6 +90070800.TBW 13 0.75 5452 20.0 -8.1 -31.6 6.5 6.2 5.9 7.8 15.4 11 0.7 0.6 +90072200.CHS 13 0.75 3537 18.4 -7.5 -32.4 6.2 6.7 7.1 8.3 10.2 88 0.4 0.6 +90072200.PAH 126 0.75 2541 16.9 -5.6 -30.4 5.7 6.6 11.4 13.3 15.3 80 0.4 0.6 +90072700.DDC 791 0.75 3550 14.7 -7.0 -32.7 7.6 6.8 6.0 7.6 7.2 84 0.5 2.2 +90072800.TOP 268 0.75 3231 16.5 -7.8 -32.8 6.7 6.6 9.8 8.8 11.3 281 0.5 0.9 +90073100.JAN 91 0.75 2834 14.6 -7.3 -33.8 6.1 7.0 0.7 5.1 4.3 -3 0.3 0.6 +90080400.STC 315 0.75 2284 13.1 -12.5 -34.8 7.3 6.0 8.7 5.3 20.0 45 0.5 1.4 +90081400.ALB 86 0.75 1251 14.6 -7.6 -33.8 5.7 7.0 20.7 31.1 21.6 261 0.5 0.6 +90081400.MAF 873 0.75 1598 13.7 -7.1 -32.0 6.2 6.6 2.3 4.4 16.6 35 0.2 0.6 +90081700.CHS 13 0.75 3949 19.5 -6.9 -32.2 5.7 6.7 11.2 14.2 20.9 101 0.7 0.6 +90081900.DEN 1611 0.75 1982 11.7 -7.8 -35.3 7.6 7.4 6.4 10.2 22.1 25 0.3 1.7 +90082000.PIA 200 0.75 4350 19.3 -6.5 -31.2 6.2 6.5 9.4 12.0 9.9 67 0.7 0.6 +90082200.BNA 180 0.75 2619 15.5 -6.1 -32.3 6.1 6.9 8.7 9.1 12.7 -10 0.3 0.6 +90082300.GGG 124 0.75 3016 16.2 -5.9 -30.3 6.0 6.4 5.3 1.3 5.5 35 0.2 0.6 +90082500.OUN 357 0.75 2800 15.7 -6.4 -31.1 6.6 6.6 5.3 5.0 11.9 63 0.3 0.6 +90082500.OVN 400 0.75 3418 17.2 -7.1 -33.6 6.4 7.0 10.0 12.0 21.9 181 0.6 0.7 +90083000.ACY 23 0.75 2413 15.2 -9.3 -34.4 5.8 6.8 9.0 13.9 22.7 62 0.6 0.6 +90101700.MAF 873 0.75 2870 12.3 -12.5 -40.6 8.0 7.7 7.7 14.9 16.2 78 1.3 2.3 +91051700.TBW 13 0.75 3306 16.1 -7.5 -34.7 5.4 7.2 3.8 4.0 0.9 -5 0.3 0.6 +91060600.CKL 140 0.75 2864 16.3 -8.6 -33.4 6.4 6.6 6.2 8.9 11.4 21 0.5 0.6 +94062400.GGG 124 0.75 3754 18.0 -5.5 -30.6 6.3 6.6 8.2 11.0 14.2 98 0.5 0.6 +94062400.HTS 246 0.75 2798 16.5 -5.5 -30.1 5.3 6.5 4.7 8.5 15.0 39 0.2 0.6 +94070200.LCH 5 0.75 2754 17.0 -6.8 -32.4 6.4 6.8 12.4 10.7 11.0 84 0.4 0.6 +97061700.BMX 178 0.75 3829 18.2 -6.9 -31.5 5.9 6.5 6.9 12.4 13.0 48 0.6 0.6 +97062400.MAF 872 0.75 3310 14.1 -9.9 -32.7 8.9 6.1 13.0 11.5 8.6 108 1.1 1.6 +97081700.TBW 13 0.75 3152 17.4 -7.3 -32.7 6.2 6.8 1.8 2.6 4.4 8 0.3 0.6 +97081800.SLC 1288 0.75 931 8.3 -10.3 -36.9 8.5 7.2 13.6 16.1 22.9 203 0.3 1.4 +97082200.ILN 317 0.75 520 9.6 -16.3 -41.3 5.8 6.9 3.9 17.5 30.9 50 0.2 0.7 +98062500.JAN 101 0.75 3507 17.3 -6.1 -32.3 6.0 7.0 7.1 2.3 8.6 -1 0.3 0.7 +98081000.SHV 79 0.75 3464 16.8 -6.5 -33.5 5.9 7.2 4.2 4.8 1.1 42 0.3 0.6 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/sup.txt b/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/sup.txt index cca2be1f0a..6556f7df38 100755 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/sup.txt +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/localization/ncep/nsharp/sup.txt @@ -1,939 +1,939 @@ -FILENAME CAT MLMIXR ML CAPE ML CIN MLCL(MAGL) 0-1SRH 0-6KT STPC 500 T (C) 500DIR 7-5 LR 0-3(KT) 0-9(KT) 0-3 KM SRH (M2/S2) -00042320.TXK 2 12.9 1702 -1 657 134 61.7 2.3 -14.0 250 6.5 32.8 76.6 166 -00042001.PPF 2 13.5 2614 -50 1216 227 59.9 4.7 -12.9 234 7.5 39.7 73.5 244 -00032900.FTW 2 13.1 2058 -42 1069 83 49.7 1.3 -15.2 245 8.0 21.9 87.1 126 -00032304.SJT 2 11.9 1680 -119 896 119 61.1 1.1 -15.5 212 9.1 38.4 66.9 217 -00031622.ATT 2 9.4 1019 -7 1566 12 45.8 0.0 -17.5 249 8.0 34.4 53.7 159 -00021323.LRF 2 9.2 1256 -9 1066 82 46.9 0.8 -21.2 249 7.5 32.3 51.4 114 -00010323.MEI 2 13.4 1148 -15 769 241 57.2 2.6 -10.0 226 6.1 38.8 71.2 288 -00010319.GWO 2 12.8 1168 -9 770 202 66.4 2.4 -13.0 223 7.5 47.3 75.1 246 -03050500.UMN 2 13.8 2392 -10 773 341 66.3 8.2 -13.4 237 7.7 49.1 93.8 411 -03050500.JBR 2 15.7 2713 -22 862 266 57.8 6.9 -10.7 240 7.1 50.5 82.9 440 -03050421.TUL 2 16.1 3621 -15 843 147 63.1 5.3 -11.7 230 7.3 45.6 100.2 160 -03050421.MKC 2 13.7 2002 -67 478 479 68.4 8.5 -14.6 224 7.9 48.1 89.8 508 -03050420.P#F 2 15.7 3397 -1 660 166 58.5 5.5 -12.7 230 7.8 34.3 100.9 195 -03050321.P#T 2 12.7 3156 -2 1967 61 36.2 0.0 -9.8 247 7.5 27.2 67.1 207 -03042503.JAN 2 13.5 2568 -27 924 257 44.3 4.9 -15.4 255 7.7 41.1 76.9 279 -03041922.PNC 2 11.5 1157 -40 665 212 87.9 2.5 -17.9 223 7.3 46.5 111.5 242 -03041523.CDS 2 10.7 1020 -106 1534 326 74.0 1.0 -12.4 234 7.5 56.1 83.8 531 -03041522.LBB 2 8.8 883 -53 1986 116 77.2 0.0 -11.7 243 7.5 48.5 87.4 276 -03040702.CLN 2 13.1 488 -133 780 363 62.7 0.8 -11.4 244 7.1 33.6 74.1 411 -03040623.ESF 2 15.8 1847 -29 621 166 51.8 2.6 -11.0 246 6.8 26.8 50.8 161 -03032722.MIA 2 12.4 299 -31 1074 187 48.8 0.4 -10.5 261 5.8 20.5 87.0 197 -01061900.ROS 2 13.6 2218 -30 1076 140 67.7 2.9 -11.1 250 8.2 40.5 73.6 279 -01061401.LNK 2 17.2 4665 -15 1190 173 39.2 4.3 -10.5 215 8.3 32.6 50.7 217 -01061120.ILL 2 14.7 3400 -120 1255 270 56.1 3.4 -10.8 259 8.6 41.9 54.8 448 -01060222.LOZ 2 9.7 164 -10 898 117 51.4 0.2 -13.4 270 5.3 39.8 66.8 189 -01053000.AMA 2 13.0 2887 -76 1322 166 48.4 2.2 -10.1 246 8.4 38.6 50.6 216 -01052902.LHX 2 10.9 1698 -120 1285 185 52.1 1.0 -10.0 251 8.2 38.9 60.5 365 -01052118.OZW 2 12.5 494 -2 775 133 33.4 0.4 -10.3 188 5.6 34.2 36.9 174 -01052022.MIN 2 16.9 3331 -2 711 122 47.8 3.2 -11.0 244 7.3 36.0 67.7 201 -01051022.MIW 2 12.8 2912 -24 1091 65 36.4 1.0 -16.0 255 7.9 28.8 43.0 141 -01051001.FBL 2 9.5 2106 -90 1776 330 50.0 1.0 -16.6 265 8.2 42.9 50.3 516 -01050200.AUM 2 11.2 1434 -74 1331 179 38.8 0.9 -13.3 251 7.5 36.0 52.3 237 -01042202.GBD 2 12.6 2145 -40 777 165 61.8 3.5 -13.6 229 7.8 41.6 62.6 328 -01041423.P28 2 12.3 2168 -54 827 145 76.4 3.1 -16.2 256 8.3 45.0 89.5 235 -01041117.LWD 2 11.9 968 -3 632 282 77.0 2.7 -15.1 208 7.5 38.2 81.4 327 -01040918.BVI 2 10.7 1326 -11 1210 102 57.2 1.0 -15.4 266 7.7 32.1 32.1 174 -01022422.SGT 2 11.8 1020 -15 967 335 52.8 3.0 -14.3 213 7.7 53.6 64.9 450 -00110820.HEZ 2 15.9 2158 -6 881 236 47.1 4.0 -8.5 204 6.2 29.0 68.5 266 -00103122.HLC 2 11.0 1274 -14 954 110 47.4 1.1 -14.1 202 7.4 32.6 74.4 169 -00092022.DAY 2 13.9 1299 -7 971 215 63.4 2.8 -8.2 237 6.1 37.5 61.0 237 -00072601.OTG 2 14.5 2869 -49 1055 88 42.5 1.7 -12.6 290 7.2 33.4 41.3 161 -00072523.RWF 2 14.6 2791 -13 1068 96 39.4 1.6 -12.0 275 7.0 29.2 35.8 163 -00071122.BKX 2 14.7 1167 -47 944 134 42.8 1.1 -7.8 261 6.8 27.2 67.9 205 -00070601.SNY 2 13.6 2847 -18 1681 52 57.5 0.5 -7.4 248 8.1 19.0 74.4 122 -00052319.BWG 2 13.7 2114 -41 1128 167 38.6 2.0 -11.4 294 6.9 36.9 62.8 278 -00051722.LXN 2 14.0 3552 -16 910 111 27.5 1.8 -13.9 169 8.4 28.1 44.5 170 -00051200.ALO 2 16.5 4382 -13 1110 168 51.1 5.6 -7.9 254 6.7 33.2 51.6 199 -00050101.MWL 2 13.0 2207 -103 1176 253 47.3 2.4 -12.4 227 8.2 40.3 37.8 297 -00042323.SHV 2 13.4 2001 -19 928 216 58.9 4.2 -13.0 261 6.7 41.9 60.0 296 -04051923.GFK 2 11.2 967 -44 828 233 54.9 2.1 -16.6 243 7.2 39.5 86.1 229 -04051302.ICT 2 15.9 3157 -12 538 223 36.4 4.3 -9.4 232 6.4 23.8 51.5 245 -04051101.LIC 2 9.0 1549 -59 1592 233 43.4 1.0 -11.5 244 8.4 35.1 46.6 395 -04042022.PIA 2 12.4 1852 -11 728 320 36.4 3.6 -14.7 235 6.2 38.5 40.1 488 -04032718.DDC 2 10.0 1332 -8 893 190 41.4 1.7 -16.6 206 7.5 30.8 47.5 198 -04030418.ABI 2 10.7 626 -20 1108 319 46.5 1.4 -13.7 196 7.0 40.3 84.2 350 -03111718.HOU 2 16.4 1980 -1 445 137 48.2 2.2 -12.4 207 6.6 24.0 77.0 158 -03111223.MFD 2 8.3 64 -56 890 219 99.1 0.1 -15.7 261 5.7 55.1 123.1 275 -03111220.MIE 2 9.7 388 -1 757 123 91.0 0.5 -15.6 258 5.7 47.1 117.3 205 -03082201.JXN 2 17.2 3046 -36 1091 255 31.0 3.6 -5.9 285 6.6 34.4 33.2 304 -03072122.AVP 2 14.3 1810 -16 1228 162 51.1 1.9 -7.9 239 5.6 45.7 49.9 148 -03072104.CID 2 17.8 2344 -22 462 187 48.9 3.6 -7.0 291 7.0 34.2 63.6 237 -03072101.ALO 2 15.0 1859 -107 921 156 49.6 1.5 -8.0 297 7.0 28.2 58.2 248 -03062500.HON 2 17.0 3737 -23 1021 335 52.2 10.7 -7.4 227 7.5 43.4 61.6 550 -03062422.MHE 2 19.5 5088 -22 717 256 55.5 12.1 -8.0 228 7.9 40.9 58.4 422 -03062421.MHE 2 17.5 3584 -16 768 252 56.0 8.4 -7.9 220 7.8 38.8 57.2 348 -03062302.P#8 2 16.8 3414 -169 1003 367 38.7 1.7 -6.8 227 7.6 30.2 57.1 437 -03062223.P#8 2 17.7 4366 -39 972 253 38.8 7.2 -8.3 246 8.6 34.3 54.7 387 -03061001.P#9 2 12.6 2103 -97 1467 421 51.0 2.8 -11.2 266 7.9 45.5 63.9 651 -03053103.CMI 2 12.6 701 -119 899 482 64.7 1.8 -11.6 292 6.3 36.9 85.1 523 -03053101.ILX 2 12.4 784 -55 1108 474 76.0 3.2 -8.5 294 5.0 45.0 90.9 524 -03051100.UIN 2 14.7 2093 -27 738 302 63.1 6.3 -11.7 240 7.7 43.7 97.9 354 -03051004.C34 2 17.3 3493 -14 749 452 53.6 14.1 -8.8 228 7.7 32.1 77.0 511 -03050923.HBR 2 11.1 1389 -64 2135 137 56.8 0.0 -9.1 231 7.7 35.8 78.1 219 -03050900.C30 2 14.6 1749 -112 819 321 69.8 3.3 -8.9 227 6.8 57.0 72.2 306 -03050823.C34 2 17.9 3605 -25 669 342 65.2 12.3 -7.2 233 7.1 42.3 72.0 318 -03050822.W#N 2 17.4 3730 -13 635 141 70.0 5.3 -10.1 228 7.6 45.5 81.3 173 -03050821.LW1 2 19.1 5309 -6 876 145 63.2 7.7 -8.7 235 7.4 31.6 71.3 182 -03050807.ADM 2 17.1 3114 -53 730 439 47.4 10.6 -9.3 253 8.0 50.2 61.5 608 -03050805.SPS 2 16.0 2409 -148 836 382 44.4 2.4 -9.1 262 7.9 43.1 59.0 798 -03050703.PAH 2 15.8 2873 -49 602 390 36.8 6.9 -13.6 237 7.9 35.3 70.1 454 -03050701.CGI 2 15.1 2935 -47 799 431 61.0 12.6 -14.4 269 7.8 32.8 83.2 580 -03050504.MKL 2 15.6 2334 -16 833 615 59.6 14.3 -9.9 251 7.1 62.0 77.1 842 -03050501.LZK 2 15.9 2390 -18 719 361 67.0 8.6 -11.0 237 7.4 41.7 97.3 397 -99120301.GOK 2 10.2 1811 -12 858 234 47.2 3.3 -21.1 202 8.2 32.4 63.0 262 -99081601.JMS 2 13.6 1255 -165 1044 130 48.5 0.3 -9.9 240 8.1 30.2 89.4 174 -99070900.ONA 2 18.4 3379 -18 992 385 46.0 10.0 -5.8 275 6.5 42.9 49.4 571 -99070400.OSC 2 15.9 1760 -27 1078 101 26.7 0.7 -6.7 320 6.2 28.3 31.6 163 -99060620.HCO 2 14.6 3241 -5 904 65 29.6 1.0 -16.1 175 8.1 26.8 70.8 115 -99060500.IEN 2 12.1 2533 -37 1323 70 52.4 1.0 -11.4 201 8.2 32.9 60.1 191 -99060400.HLC 2 15.7 4348 -16 1101 154 38.3 3.9 -9.3 240 7.5 36.9 40.6 277 -99060200.TBN 2 14.9 2338 -19 838 136 37.3 2.0 -10.3 259 6.5 40.0 21.6 223 -99060123.MKO 2 17.3 3739 0 888 68 38.1 1.6 -10.6 279 7.9 32.2 23.0 135 -99060100.LIC 2 9.1 1877 -49 1439 56 56.8 0.6 -13.7 249 9.2 34.3 62.4 140 -99051621.OMA 2 16.1 4691 0 824 102 38.6 3.1 -14.5 223 8.8 33.7 41.5 176 -99051122.BMQ 2 15.0 3545 -92 1026 40 35.1 0.6 -12.3 259 8.0 21.8 29.6 59 -99050408.JCT 2 13.0 2082 -218 838 355 55.0 0.0 -11.2 254 8.3 46.8 58.7 506 -99050402.GOK 2 13.9 3154 -61 723 366 51.4 9.2 -14.6 240 8.2 36.8 57.5 441 -99050401.ICT 2 12.6 2748 -7 1016 257 31.8 3.7 -14.7 227 7.9 40.5 70.4 415 -99050323.OKC 2 15.2 4117 -15 733 308 43.5 9.2 -13.2 243 7.8 43.2 70.1 401 -99050300.HSI 2 8.0 203 -4 845 168 41.5 0.2 -17.7 222 6.7 28.6 32.1 221 -99042200.END 2 12.7 3301 -34 1156 225 46.1 4.8 -15.4 236 8.1 35.1 48.2 242 -04082700.RDD 2 18.4 3706 -37 940 184 41.0 4.7 -6.9 255 7.1 28.7 60.7 258 -04071823.GFK 2 16.7 3575 -36 1246 117 45.4 2.4 -7.9 310 6.8 35.1 45.5 292 -04071302.GRI 2 15.9 3090 -197 1538 152 29.0 0.0 -7.9 298 8.5 13.8 50.5 173 -04062402.OSH 2 11.1 1428 -30 700 187 62.2 2.7 -16.7 257 6.5 50.9 79.3 234 -04061620.LAA 2 12.3 1494 -63 908 129 51.4 1.5 -9.4 252 7.7 34.1 57.1 369 -04061300.W#N 2 16.4 3866 -17 1255 231 34.6 3.8 -9.2 251 7.9 37.4 44.2 387 -04060701.MOT 2 10.4 295 -316 1541 461 68.3 0.0 -8.4 254 6.7 33.2 82.6 561 -04060621.C02 2 9.9 1824 -59 2285 83 55.5 0.0 -10.8 234 7.9 39.7 69.2 64 -04053023.IND 2 17.3 2618 -10 577 361 58.6 9.2 -9.1 248 6.9 35.7 45.1 369 -04053020.SDF 2 16.6 2653 -2 807 250 52.4 5.8 -9.4 245 6.8 37.1 41.1 317 -04053002.OKC 2 15.5 2559 -32 1162 314 55.7 6.2 -7.3 244 7.0 35.6 70.5 434 -04053002.ICT 2 16.1 3240 -98 992 315 44.2 5.1 -10.4 245 7.9 25.8 56.2 399 -04053000.MCI 2 16.0 3437 -5 863 239 36.5 5.0 -12.8 232 8.3 27.4 42.9 372 -04052922.C33 2 16.5 4081 -4 1356 126 51.4 2.8 -7.8 244 7.4 36.9 74.7 248 -04052921.TOP 2 16.1 3843 -13 936 78 32.5 1.6 -12.5 233 8.0 17.3 39.0 190 -04052421.STJ 2 15.6 3982 -40 991 76 40.4 2.0 -11.9 234 7.7 26.3 67.6 270 -04052300.P#8 2 15.0 3882 -47 1262 228 54.5 5.9 -10.5 233 7.9 34.1 69.9 334 -04052221.MCK 2 13.2 3453 -37 1185 103 72.0 2.9 -12.3 231 8.6 35.5 82.5 224 -04052219.GLD 2 9.9 1898 -54 1700 22 59.0 0.1 -12.7 233 8.4 12.6 69.5 76 -04052122.CID 2 15.4 2960 -48 971 309 36.6 5.6 -11.5 268 7.4 36.1 50.0 390 -53031321.FWH 2 10.8 727 -98 981 119 51.2 0.5 -16.3 248 8.1 30.6 80.9 266 V -55052521.LTS 2 15.0 4060 -25 1509 322 66.4 6.4 -12.3 225 8.6 37.0 53.5 355 V -56041521.GUN 2 11.7 1189 -11 1302 251 72.4 2.1 -13.6 230 7.3 55.7 66.8 370 V -57040221.FWH 2 13.2 3580 -3 942 94 35.8 2.0 -15.8 189 7.9 26.1 52.8 122 V -57052021.TOP 2 14.0 2801 -2 920 142 55.7 3.7 -13.8 207 7.7 48.0 77.2 228 V -57052121.BYH 2 15.7 2854 -5 1106 236 49.7 5.0 -10.9 230 7.2 33.0 92.5 240 V -57061418.PIA 2 15.9 2118 -6 986 394 50.0 7.0 -8.6 252 6.9 52.8 52.1 496 V -59040100.FWH 2 12.6 3068 -26 987 124 42.8 2.7 -17.6 247 9.0 28.0 61.5 142 V -61050800.FSM 2 14.5 2844 -7 1215 261 61.7 5.8 -11.4 240 7.5 42.2 65.9 323 V -61050600.FSM 2 14.3 2667 -12 1121 245 65.5 5.8 -13.1 240 8.3 61.7 43.1 430 V -62052600.OKC 2 14.3 4171 -76 1591 154 33.3 1.2 -12.0 264 8.6 25.3 43.2 228 V -62080700.TOP 2 20.6 6024 -12 1167 160 42.3 5.7 -7.3 250 7.7 32.4 60.6 243 V -64050600.OMA 2 12.7 2395 -61 1048 349 68.6 7.4 -13.8 224 8.8 54.6 89.3 498 V -65041200.FNT 2 11.2 1814 -1 974 166 91.0 3.0 -17.7 250 7.7 46.4 91.6 372 V -66042800.FWH 2 14.1 3342 -17 1291 148 38.0 2.2 -11.8 265 7.2 39.3 49.0 269 V -66030400.HKS 2 12.2 1434 -10 831 138 47.6 1.6 -14.0 234 7.6 49.0 77.8 142 V -67061100.OKC 2 14.4 3497 0 1569 144 32.2 1.2 -11.0 235 8.7 35.0 51.1 260 V -68110400.VPS 2 12.8 1596 -2 812 129 50.5 1.7 -13.4 251 5.9 30.3 72.0 184 V -69041806.VPS 2 15.2 1013 -8 445 370 55.8 3.5 -11.0 248 6.9 42.3 73.3 439 V -69062400.TIK 2 18.4 4403 -4 776 317 37.5 8.7 -9.4 240 7.5 45.3 56.2 431 V -70100600.TIK 2 13.7 1865 -3 772 241 41.1 3.1 -12.2 230 6.7 35.4 55.6 335 V -71022200.JAN 2 12.8 938 -4 930 470 74.7 4.4 -11.8 211 6.7 57.8 77.3 590 V -73052800.MGM 2 16.4 2337 -2 1017 293 53.5 6.0 -7.9 239 6.2 45.6 45.2 386 V -73041600.VCT 2 15.4 2861 -37 1272 385 48.1 6.4 -12.9 231 8.1 35.7 72.2 377 V -74040400.MGM 2 14.8 2955 -2 1017 161 52.0 4.1 -12.8 235 8.2 39.5 59.4 253 V -74040400.BNA 2 14.6 2744 -31 970 209 77.8 5.7 -13.3 238 7.8 57.0 80.2 301 V -74040400.DAY 2 12.8 2185 -7 986 619 90.8 13.5 -13.1 235 7.1 71.9 91.6 919 V -75042500.UMN 2 15.7 5306 -1 837 145 53.3 6.8 -13.8 255 7.3 41.6 61.8 185 V -74060900.UMN 2 17.0 3643 -2 987 363 37.0 8.1 -6.7 231 7.6 41.4 27.5 508 V -75063000.BIS 2 13.6 3158 -76 1566 198 41.8 1.6 -12.3 233 8.6 26.8 55.7 204 V -76042000.SEP 2 13.7 3326 0 1092 305 45.1 6.9 -14.1 240 7.6 33.7 48.9 358 V -77040418.CKL 2 14.1 1633 0 994 247 66.8 4.0 -9.8 231 6.0 52.7 80.0 333 V -78060100.TOP 2 16.2 4279 -1 1160 267 35.7 5.7 -12.7 233 7.6 36.3 57.0 349 V -79041021.SEP 2 12.8 2186 -9 912 345 48.2 6.1 -13.1 228 8.1 42.9 54.3 468 V -79050300.OKC 2 13.9 2775 -4 877 218 73.2 6.0 -12.3 246 7.2 57.7 103.2 279 V -79033000.OMA 2 10.1 1322 -24 1155 223 56.4 2.4 -15.8 232 7.1 49.1 52.9 345 V -80040800.UMN 2 10.2 2256 -3 1473 97 39.6 0.8 -18.5 236 8.4 39.7 92.1 247 V -84060800.TOP 2 16.2 2284 -16 918 560 74.0 12.8 -6.0 237 6.2 49.1 84.6 705 V -84031600.1M1 2 12.2 2339 -1 1056 250 47.1 4.3 -14.9 251 6.9 30.4 55.5 292 V -86072900.OMA 2 16.4 4252 -21 1667 112 48.4 1.3 -10.6 268 8.6 28.2 81.3 151 V -87111600.GGG 2 12.8 1593 -8 723 298 61.9 4.8 -15.3 178 7.9 43.3 65.2 326 V -90061600.LBF 2 16.1 3827 -1 1050 21 42.1 0.5 -10.6 185 8.5 24.5 74.1 95 V -90060300.PAH 2 15.6 2246 -3 1039 274 47.1 4.7 -7.6 251 7.0 57.8 49.8 384 V -91042700.OUN 2 15.8 4387 -8 898 195 50.3 7.2 -11.5 242 7.0 44.2 54.9 370 V -92062800.AMA 2 14.6 3148 -3 1020 83 44.3 1.9 -10.3 249 7.9 32.7 52.7 220 V -92061700.OVN 2 18.7 4878 -1 1119 262 50.4 9.5 -6.5 237 6.9 46.6 64.6 473 V -93042500.OUN 2 11.6 2675 0 1209 113 49.6 2.0 -14.6 235 6.9 35.5 65.5 168 V -93050700.TOP 2 13.7 2046 -7 666 484 58.8 9.7 -13.1 217 7.0 55.4 51.4 644 V -93060700.LBF 2 15.9 4738 0 930 328 59.3 15.3 -8.6 229 7.6 41.9 67.6 583 V -94042600.SEP 2 12.9 2562 -34 1365 201 51.9 2.8 -11.5 258 7.4 41.3 51.0 198 V -95051900.BMX 2 15.7 2868 -5 989 239 39.3 4.5 -9.9 247 6.7 31.9 49.1 230 V -98040900.BMX 2 14.6 2259 -18 642 136 77.9 3.1 -13.9 240 7.9 50.3 100.1 290 V -98041700.BMX 2 14.7 2038 0 704 263 73.4 5.4 -11.9 245 6.8 36.3 98.6 327 V -99050400.OUN 2 13.4 3644 -22 1050 271 41.4 6.5 -14.9 225 8.4 32.0 37.7 343 V -00121618.BMX 2 12.0 1369 -1 737 279 66.9 3.8 -14.1 220 6.7 51.3 90.8 339 V -00092100.ILN 2 12.5 747 -19 1280 611 75.3 3.3 -7.5 240 5.4 64.7 73.0 810 V -01061400.OAX 2 16.8 4639 -1 1278 127 38.6 2.8 -11.3 215 9.0 35.2 48.5 145 V -01112412.JAN 2 13.0 1392 -2 773 366 50.4 4.3 -10.1 225 5.7 52.4 48.8 504 V -01112418.BMX 2 13.4 1498 -1 655 227 52.0 3.0 -11.3 220 6.1 43.1 61.9 319 V -02111018.ILN 2 11.3 1239 0 734 385 54.4 4.3 -13.7 230 6.6 49.5 103.8 417 V -02062400.ABR 2 17.1 4378 0 1112 85 50.6 2.8 -10.5 245 8.2 29.8 57.9 153 V -03050900.OUN 2 17.0 3871 -32 990 336 62.0 13.0 -6.9 235 6.3 53.9 80.1 364 V -94032718.CKL 2 15.5 1965 0 743 344 72.9 6.8 -9.1 233 6.3 54.7 56.0 403 V -81052300.OKC 2 13.1 2411 -70 1142 203 49.1 3.0 -13.7 235 9.0 37.6 49.1 249 V -65041100.LIT 2 12.7 1815 -1 1365 140 52.3 1.4 -11.1 248 7.2 39.4 64.4 212 V -53051121.FWH 2 13.2 1452 -55 1150 122 53.0 1.3 -11.2 248 7.3 40.4 64.4 209 V -90082900.PIA 2 21.0 6470 -2 974 110 33.6 4.0 -7.3 297 7.1 23.3 54.6 147 V -55042411.GUN 2 13.1 1784 -7 917 345 68.7 6.2 -12.7 248 7.1 44.1 85.9 375 V -56040321.HKS 2 13.0 1491 -14 1212 173 82.1 2.0 -12.4 221 7.5 52.1 107.5 267 V -56051221.MTC 2 13.8 2444 -8 1001 124 69.2 3.0 -14.4 266 7.5 25.2 94.3 162 V -60052000.TOP 2 14.3 3120 -23 1112 167 43.1 3.3 -13.3 213 8.2 32.6 58.1 244 V -66060900.TOP 2 15.9 2226 -24 819 296 59.5 6.5 -8.6 223 7.1 47.3 69.8 397 V -68082000.GRB 2 16.1 2780 -11 1217 173 50.0 3.1 -7.3 258 6.4 27.0 43.6 195 V -74040318.BNA 2 13.0 2906 -5 1157 205 63.1 5.0 -15.5 229 8.2 48.6 76.4 333 V -61051500.PIA 2 12.4 1259 -2 817 196 68.7 2.5 -13.0 202 6.6 36.7 80.9 205 V -54050121.TIK 2 13.0 1988 -17 709 242 56.2 4.5 -13.5 203 8.0 39.2 73.2 282 V -55060421.SLN 2 13.4 3594 -5 1422 36 25.3 0.3 -12.7 225 7.9 23.8 30.4 152 V -70061300.COU 2 16.5 3499 -11 949 204 64.2 7.2 -7.8 246 5.5 49.6 57.1 318 V -76032700.1M1 2 11.8 1820 -17 961 187 41.8 2.4 -17.1 230 8.2 57.3 71.8 243 V -04071318.ILX 2 19.0 4958 -10 1102 117 37.5 3.3 -10.9 305 7.9 33.8 45.3 197 V -68051600.LIT 2 15.6 2612 -4 971 250 52.8 5.7 -11.7 260 8.6 45.5 72.5 337 V -65031700.OKC 2 11.1 1628 -3 687 269 91.0 4.4 -17.9 235 7.1 58.8 114.4 325 V -00061300.DIK 1 11.1 1786 -3 1286 88 51.7 1.0 -13.3 237 7.5 40.6 50.2 180 -00061122.MOT 1 11.3 2235 -22 1420 120 55.4 1.4 -14.8 231 7.6 39.0 57.9 252 -00060802.JDN 1 7.4 755 -232 3045 106 49.5 0.0 -10.8 230 8.9 34.6 71.9 282 -00060402.OFK 1 10.0 668 -199 1628 156 44.9 0.0 -11.7 284 7.7 38.1 49.1 406 -00060402.NFW 1 16.8 1734 -9 639 117 28.9 1.0 -7.5 270 5.9 23.5 32.0 202 -00052719.MAR 1 16.0 4104 -12 1610 26 26.6 0.2 -12.4 258 8.8 17.5 43.3 95 -00052700.THK 1 14.7 3226 -62 1771 46 35.7 0.2 -9.0 238 8.3 28.1 55.2 83 -00052700.ADK 1 15.9 4170 -7 1457 60 38.4 0.9 -10.1 248 7.9 22.8 55.2 91 -00051202.LWC 1 16.0 3233 -93 1098 243 43.4 3.7 -7.0 245 6.5 28.2 57.5 246 -00050802.RWF 1 11.7 1550 -17 1609 79 45.4 0.4 -12.5 230 7.1 29.3 54.1 203 -00050702.TOR 1 8.6 1203 -94 1663 106 57.4 0.3 -15.3 235 9.1 39.5 72.5 258 -00042622.ONL 1 6.5 337 -109 1466 129 40.6 0.1 -21.7 284 8.4 30.1 73.0 229 -00042118.EZF 1 10.3 898 -4 877 28 58.9 0.3 -17.2 220 6.6 30.7 62.4 94 -00032902.CRS 1 14.5 2234 -6 743 161 50.8 3.0 -14.0 258 7.8 26.8 92.5 244 -00032823.DTO 1 12.9 2286 -24 1256 75 45.3 1.0 -14.5 246 7.7 20.6 88.2 121 -00032701.BAZ 1 14.1 1797 -31 945 101 61.6 1.8 -10.9 294 7.0 32.6 86.8 184 -00032623.MLC 1 11.7 1998 -24 1176 73 50.5 1.0 -14.4 296 6.9 29.7 68.1 193 -00032221.UPT 1 11.4 2370 -12 1181 167 63.0 3.2 -15.3 196 8.2 44.6 83.1 213 -00032207.ODO 1 11.4 1900 -1 561 280 54.6 4.9 -16.5 195 8.4 45.8 80.2 519 -00032207.DRT 1 13.4 2593 -107 837 215 40.0 2.3 -14.9 225 8.9 40.7 64.3 569 -00032201.DYS 1 9.6 140 -194 1028 77 44.2 0.0 -12.2 197 6.4 33.8 61.9 126 -00031523.END 1 9.1 877 -2 1153 56 37.8 0.3 -16.7 241 6.6 26.4 36.5 119 -00031023.BMQ 1 12.1 2702 -18 1209 70 48.2 1.2 -14.5 275 7.6 28.5 52.2 143 -00030823.MKE 1 11.0 1510 -13 1038 185 54.8 2.5 -16.1 213 6.7 42.7 47.9 221 -00030208.MAF 1 11.4 1969 -62 631 373 64.7 6.7 -16.7 225 8.8 39.2 68.5 410 -00022502.ARN 1 11.3 2487 -19 846 226 54.1 5.1 -16.8 208 8.1 38.3 67.9 247 -00022303.DLF 1 8.7 884 -128 1728 29 68.1 0.0 -16.1 277 7.8 32.4 70.9 86 -01042100.SUX 1 8.8 765 -22 1661 84 43.9 0.2 -16.8 206 7.9 27.0 64.5 204 -01041123.BIV 1 12.3 587 -74 777 368 64.3 1.8 -11.6 220 5.9 42.8 48.1 410 -01041107.ADH 1 11.8 556 -140 952 259 56.9 0.5 -12.1 207 7.2 40.1 68.6 271 -01041100.SUS 1 13.7 2171 -35 926 93 64.4 2.0 -12.3 258 6.5 38.6 74.7 252 -01041022.SZL 1 14.3 2693 -55 696 170 63.3 4.4 -12.9 245 6.7 37.7 83.2 242 -01040923.PIA 1 11.9 2755 -12 1469 63 57.1 0.9 -15.8 272 7.5 28.4 73.8 164 -00111220.HYI 1 15.0 1358 0 575 130 66.4 1.8 -11.5 257 7.0 30.5 99.4 240 -00110822.TUP 1 14.5 1023 -4 743 229 62.2 2.3 -9.9 225 6.6 34.8 71.9 291 -00110121.BIS 1 8.9 739 -22 512 134 42.6 0.7 -21.9 135 8.3 30.9 61.9 177 -00103122.FNB 1 12.8 1776 -6 916 106 37.0 1.2 -13.0 217 6.9 22.0 45.0 157 -00102922.LNK 1 10.2 657 -14 724 192 49.1 1.0 -16.4 188 6.2 32.0 43.8 218 -00102919.AUH 1 8.7 191 -3 740 83 38.8 0.1 -16.4 158 6.1 31.7 39.6 118 -00102900.JCT 1 12.1 704 -63 868 232 49.5 1.2 -10.5 218 7.0 32.5 72.8 338 -00102818.GOV 1 11.9 922 -5 443 156 35.8 0.9 -12.3 192 6.7 29.9 31.1 195 -00102423.ODO 1 12.0 1308 -7 918 73 40.2 0.6 -11.4 215 7.4 30.0 51.0 103 -00102300.TIK 1 13.8 1236 -5 453 143 32.3 1.0 -11.8 212 6.3 24.0 44.2 171 -00102123.WLT 1 12.4 655 -43 561 114 29.4 0.4 -11.7 196 5.0 24.0 39.6 153 -00090201.GXY 1 10.1 1399 -61 1894 64 48.6 0.1 -8.8 219 8.0 24.5 58.2 133 -00081501.OEO 1 16.6 2661 -111 1084 275 47.1 3.1 -7.7 281 7.5 38.3 69.3 408 -00072500.ANW 1 14.5 3660 -50 1579 99 43.1 1.1 -9.2 307 8.3 23.5 62.3 152 -00072302.LAA 1 11.0 1368 -108 1806 33 48.7 0.0 -8.9 325 7.7 25.9 61.1 115 -00072104.P28 1 14.3 1660 -216 1167 146 41.4 0.0 -9.2 286 7.8 30.2 58.9 374 -00072004.GLD 1 12.8 1625 -153 1450 69 50.3 0.2 -8.9 286 8.4 26.3 57.9 113 -00071823.SUS 1 17.9 2488 -23 946 101 35.0 1.5 -7.4 262 6.2 32.7 35.7 194 -00071023.GGW 1 11.5 1838 -22 1490 19 53.5 0.2 -11.1 239 6.6 29.9 73.1 81 -00070823.RPD 1 18.8 4320 -44 798 124 39.2 3.5 -8.3 282 6.7 21.3 43.9 183 -00070802.LJF 1 19.5 4388 -7 680 348 43.9 11.2 -9.0 258 8.4 34.1 50.6 438 -00070600.OVE 1 7.4 115 -46 1571 14 34.5 0.0 -17.8 243 7.0 10.2 60.4 40 -00070400.MCK 1 14.2 1661 -19 1452 131 41.3 0.8 -6.2 236 6.6 26.2 46.5 200 -00070222.RYV 1 15.9 2122 -22 737 96 36.0 1.2 -9.2 288 5.9 30.2 35.4 223 -00062923.GLD 1 11.9 2724 -35 2040 95 44.6 0.0 -10.0 295 8.8 34.1 62.4 180 -00062522.AMA 1 13.7 3217 -9 2155 26 36.2 0.0 -6.9 271 8.3 18.7 36.3 97 -00062501.HAO 1 13.1 422 -35 1552 152 35.2 0.2 -7.7 249 5.7 29.2 32.5 226 -00062019.MTO 1 15.3 938 -10 830 185 29.7 0.9 -7.9 246 6.3 38.8 17.7 268 -00062001.HSI 1 14.0 1763 -84 1164 234 40.3 1.8 -8.2 248 7.0 27.7 49.5 343 -00061621.IPT 1 16.3 2224 -6 898 126 25.2 1.2 -7.2 258 5.6 34.7 21.7 251 -00061323.PRT 1 14.6 3313 -86 1730 52 37.5 0.2 -7.5 265 8.2 21.9 60.1 117 -00061321.RDK 1 17.0 3477 -23 902 260 35.7 5.4 -9.8 237 7.9 30.5 30.4 304 -00061300.LBF 1 10.3 2216 -34 2374 46 34.8 0.0 -10.3 241 8.4 19.0 34.1 135 -00061300.GFK 1 11.1 1031 -80 1371 163 45.4 0.6 -13.5 239 7.2 30.8 40.7 248 -03031919.CSV 1 9.7 329 -12 552 167 68.4 0.6 -16.4 213 7.0 45.4 103.6 306 -03031917.CSV 1 9.6 129 -21 493 196 62.6 0.3 -16.0 222 6.7 61.8 100.8 422 -03031915.HSV 1 10.9 546 0 538 221 80.9 1.2 -16.0 224 6.4 51.0 103.8 393 -03031800.FSI 1 11.0 983 -10 789 157 47.9 1.2 -17.1 242 7.4 21.2 84.6 148 -03031722.SPS 1 10.7 981 -38 1183 127 34.3 0.6 -15.4 236 7.3 19.3 95.8 139 -03031721.HBR 1 10.6 1028 -46 917 133 27.4 0.6 -15.9 217 7.1 22.3 90.0 154 -01062101.DEN 1 8.5 516 -90 1464 2 57.2 0.0 -10.9 293 7.2 41.8 50.9 136 -01061403.DDC 1 14.7 4480 -83 1698 161 58.3 1.7 -11.1 234 9.3 30.0 58.2 280 -01061323.PQN 1 15.8 3695 -5 1047 117 31.9 2.2 -10.3 212 8.0 28.2 46.4 193 -01061000.MBS 1 8.3 401 -7 1604 78 43.1 0.1 -16.3 312 6.3 19.1 70.0 124 -01060923.BIS 1 13.0 2950 -51 1333 25 50.8 0.4 -12.4 272 7.7 30.4 52.9 158 -01060521.P28 1 15.5 2749 -10 880 99 38.9 1.8 -11.4 241 8.1 28.3 45.3 182 -01060521.CDS 1 15.0 3410 -11 1645 9 34.8 0.1 -9.6 266 8.0 23.5 28.9 110 -01060421.LIC 1 8.2 167 -117 1162 92 45.0 0.1 -12.6 233 7.5 32.1 65.5 170 -01060402.WLD 1 15.9 3250 -135 778 339 39.0 3.1 -9.4 254 8.1 35.7 49.4 535 -01060121.MXO 1 8.9 416 -12 968 81 51.7 0.3 -17.7 275 6.4 33.3 51.6 153 -01053000.CDS 1 13.5 2478 -201 1327 184 58.9 0.0 -9.9 240 8.4 43.6 59.7 269 -01052423.JCT 1 11.1 2121 -41 2081 21 42.8 0.0 -12.9 298 8.3 34.2 39.7 254 -01052423.BHM 1 10.8 1036 -32 1179 118 47.3 0.8 -14.7 258 6.9 44.8 49.5 280 -01051022.OLZ 1 11.3 1843 -33 1200 61 42.2 0.6 -15.7 256 7.4 31.2 46.0 179 -01050823.CNK 1 8.0 560 -40 1902 58 51.8 0.0 -16.7 317 7.3 21.6 51.7 171 -01050621.ILE 1 16.4 3719 -9 838 53 30.9 1.0 -13.1 261 7.0 24.3 54.4 118 -01050621.1F0 1 14.4 2826 -1 776 124 27.7 1.6 -13.9 256 6.8 24.7 55.3 157 -01050602.COT 1 16.2 2790 -11 863 180 42.4 3.6 -10.7 247 7.2 33.3 76.0 223 -01050601.HBR 1 10.8 1071 -47 991 113 60.9 1.2 -14.6 218 6.8 35.4 66.2 149 -01050600.WLD 1 10.9 813 -3 986 94 45.9 0.6 -13.4 211 6.5 34.0 50.5 174 -01050521.ACT 1 14.9 2393 -3 716 65 41.0 1.1 -11.6 229 6.7 21.6 53.3 125 -01050422.FNB 1 13.2 1315 -10 654 80 33.2 0.6 -12.0 205 5.5 25.5 43.0 144 -01050412.SPS 1 13.3 1511 -11 818 233 45.0 2.6 -11.2 211 5.9 37.5 53.7 290 -01050223.CDS 1 12.5 3652 -132 1895 166 31.7 0.2 -13.0 217 9.2 26.5 37.9 210 -01050123.RPD 1 11.7 2374 -31 1338 213 46.8 2.6 -14.3 249 7.2 38.7 54.2 348 -01050123.RGK 1 12.1 2710 -41 1464 239 44.1 2.6 -14.6 250 7.7 37.9 54.3 370 -01050100.TQE 1 9.6 1164 -13 1373 125 29.7 0.5 -16.8 267 7.6 24.5 30.9 158 -01050100.BGD 1 8.6 1497 -7 2135 23 54.7 0.0 -14.0 327 8.0 22.4 64.0 136 -01042300.OAX 1 11.5 527 -10 586 257 62.9 1.4 -12.4 193 5.9 51.0 62.5 288 -03060800.ECG 1 15.9 456 -52 671 256 26.7 0.5 -5.9 244 4.7 33.3 37.0 264 -03060500.CVS 1 8.5 804 -116 2160 108 56.7 0.0 -9.7 295 8.0 53.0 55.1 313 -03060422.TCC 1 10.6 1847 -48 1858 84 47.9 0.2 -10.4 290 8.6 41.0 53.3 227 -03060103.BFF 1 11.3 1434 -103 1288 72 46.7 0.4 -9.1 291 7.2 22.6 47.7 113 -03052820.PIA 1 11.7 1566 -31 860 135 36.1 1.3 -16.6 318 7.2 30.1 54.2 203 -03052323.V#L 1 10.7 657 -22 998 134 47.6 0.7 -13.2 312 7.1 36.4 63.1 269 -03051401.TXK 1 13.6 1354 -97 1023 210 48.8 1.5 -11.3 301 7.8 39.5 74.4 571 -03051323.C04 1 12.3 338 -272 641 212 57.3 0.0 -12.4 299 8.0 32.1 67.8 353 -03050920.FVX 1 13.5 1153 -108 1077 253 59.2 1.6 -11.6 288 7.8 44.4 56.6 335 -03050918.CHO 1 15.0 1961 -22 782 298 58.7 5.7 -11.4 296 7.3 46.4 63.9 473 -03050800.ABI 1 11.7 1368 -77 2113 150 68.5 0.0 -6.9 244 6.8 41.7 79.4 428 -03050721.ANB 1 14.0 798 -104 694 354 51.0 1.5 -9.4 268 6.5 39.0 46.7 422 -03050719.BMX 1 15.8 2069 -6 591 233 43.2 3.5 -10.7 274 6.8 31.7 48.0 302 -03050700.FAM 1 13.4 2397 -56 1026 270 72.9 6.1 -14.5 269 7.6 38.6 77.4 402 -03050518.MKL 1 15.9 2561 0 610 165 70.0 4.2 -11.5 253 7.0 46.3 90.9 195 -03050423.C35 1 15.5 2257 -12 619 309 68.9 7.0 -11.1 234 7.3 35.2 111.6 297 -03050421.ADM 1 16.6 3573 -3 898 108 77.1 3.9 -8.7 238 6.2 51.9 109.7 213 -03050320.BFF 1 7.9 1569 -35 1574 91 55.3 0.6 -17.6 237 9.1 30.0 121.3 150 -03050121.TUL 1 15.3 4038 -2 592 93 35.5 2.2 -13.9 263 7.7 27.5 53.2 205 -03043023.FOE 1 13.9 4015 -6 1059 116 26.7 2.0 -14.3 236 7.7 24.7 34.3 165 -03042821.BYI 1 4.3 220 -74 1877 74 40.4 0.0 -21.3 217 8.4 19.6 47.5 151 -03042522.MGM 1 13.1 2112 -13 1028 106 63.3 2.2 -14.2 266 6.8 41.2 42.5 199 -03042521.LWT 1 6.2 193 -34 1157 84 33.2 0.1 -19.0 194 7.6 23.8 44.0 191 -03042518.TCL 1 11.3 524 -50 815 216 66.5 1.1 -14.0 256 6.7 54.5 74.3 295 -03042423.PIB 1 13.2 710 -91 552 278 47.4 1.1 -13.2 256 7.3 29.9 47.5 367 -03042422.FOE 1 9.2 537 -24 443 119 31.9 0.3 -19.7 184 6.7 33.6 18.6 155 -03042419.BTR 1 14.3 2208 -2 816 43 52.0 0.8 -13.0 244 7.4 27.5 46.2 86 -03041923.MLC 1 12.8 1448 -52 744 271 64.7 3.9 -11.2 230 5.7 51.5 81.0 283 -03040618.JAN 1 12.9 801 -40 747 201 51.3 1.4 -14.4 243 7.5 28.4 87.0 298 -03040614.MLU 1 13.4 517 -86 382 358 50.8 1.2 -13.9 229 7.4 36.9 73.2 428 -03040601.FWD 1 11.1 461 -111 865 325 67.8 0.9 -13.5 245 6.9 40.1 93.4 563 -03040420.SPI 1 11.2 1687 -7 802 102 38.9 1.1 -17.7 252 7.6 39.5 59.0 176 -03032721.PBI 1 12.4 384 -64 873 185 47.9 0.5 -12.0 240 6.3 8.1 99.7 189 -03032720.TMB 1 13.5 878 -5 1007 102 59.6 0.9 -10.7 241 5.9 21.4 97.6 157 -04040822.ROW 1 7.6 885 -35 1457 25 42.6 0.1 -16.3 225 7.7 31.8 52.9 136 -04040616.VCT 1 13.2 671 0 457 159 42.0 0.8 -12.5 228 5.9 29.4 48.5 233 -04040615.CRP 1 14.5 1276 0 405 109 39.2 0.9 -12.3 238 7.0 30.2 44.3 209 -04032723.C33 1 12.5 2394 -14 752 342 44.2 6.0 -15.0 235 7.2 45.6 56.4 529 -04032721.C33 1 12.5 2248 -11 742 183 42.7 2.9 -14.5 230 7.1 29.5 50.7 257 -04032718.GAG 1 11.6 1959 -2 705 243 43.2 3.4 -16.1 217 7.9 33.2 51.9 263 -04020601.TCL 1 11.9 190 -48 628 310 45.1 0.4 -12.7 222 6.4 48.7 58.2 536 -03111803.GLS 1 16.5 1327 -28 566 364 46.5 3.8 -8.7 230 6.1 33.7 77.0 402 -03111722.GLS 1 10.1 1092 -23 682 103 65.1 1.1 -18.5 220 7.2 45.6 115.8 218 -03110520.IAD 1 13.7 626 -17 1058 109 35.5 0.4 -9.7 248 6.0 23.4 50.7 109 -03100923.GLS 1 18.1 1654 -5 454 164 35.3 1.6 -5.9 253 5.5 26.9 46.4 209 -03100523.C10 1 11.8 1332 -9 1262 56 39.6 0.4 -7.5 295 5.6 37.5 47.9 168 -03090807.MAF 1 11.7 777 -160 1418 169 29.0 0.1 -10.5 282 7.9 18.5 32.7 262 -03082523.RAD 1 12.0 1595 -36 1379 139 56.3 1.3 -11.7 280 6.3 16.2 82.0 142 -03080122.MIE 1 14.8 2465 -19 976 39 23.4 0.0 -10.9 251 6.4 10.2 49.8 63 -03072100.SUX 1 21.5 6268 -16 748 130 47.0 6.4 -7.5 313 7.3 28.4 42.4 175 -03072022.SUX 1 20.7 5887 -14 863 100 42.2 4.2 -7.3 304 7.8 47.1 46.8 375 -03072022.OFK 1 19.2 6004 -19 1398 33 31.9 0.6 -7.5 313 8.2 30.8 31.8 166 -03071922.STC 1 15.2 2711 -22 1042 103 46.1 2.1 -10.6 310 7.0 34.7 54.6 221 -03071102.NHK 1 16.5 987 -67 757 159 22.6 0.0 -7.7 240 6.4 20.9 29.8 187 -03070921.RWF 1 13.6 1319 -19 765 52 42.5 0.5 -10.8 262 7.0 23.9 51.9 91 -03070919.P#3 1 13.7 1228 -1 615 65 49.7 0.7 -10.0 258 6.5 18.9 58.3 80 -03070902.ATH 1 11.5 2088 -216 2152 184 48.4 0.0 -8.0 269 9.4 34.4 71.3 315 -03062823.BRD 1 10.3 984 -41 828 98 44.5 0.7 -16.0 285 5.9 30.4 65.1 168 -03062820.BJI 1 8.9 792 -1 1152 76 36.4 0.3 -17.5 276 6.2 21.6 57.0 122 -03062802.C22 1 8.5 251 -78 1075 74 33.2 0.1 -17.0 302 6.9 33.5 39.2 110 -03062800.P11 1 8.9 130 -58 757 94 34.6 0.1 -16.9 294 6.8 32.0 41.6 182 -03062223.GRI 1 18.1 5092 -19 1060 137 41.0 4.5 -7.9 238 8.0 29.8 45.3 215 -03062119.GCC 1 9.0 940 -32 1043 126 52.6 1.0 -13.9 234 7.3 37.7 61.9 271 -03061423.GLD 1 11.1 1240 -11 1151 21 28.6 0.1 -11.5 347 7.2 20.2 27.1 107 -03061202.9V9 1 11.9 1311 -150 1237 252 55.7 0.8 -12.0 277 7.7 34.4 64.5 403 -03061123.PIR 1 12.2 2019 -91 1257 201 52.8 1.9 -12.8 252 7.7 30.1 78.9 352 -03060922.AIH 1 12.2 3211 -62 1638 201 43.3 1.6 -13.0 253 9.0 35.4 67.6 306 -04052223.P#A 1 15.1 2952 -11 774 39 53.1 1.0 -12.0 243 7.6 22.0 68.8 112 -04052223.OAX 1 13.7 2734 -22 1169 83 52.1 1.6 -11.3 232 7.4 29.5 77.9 274 -04052201.OFK 1 14.7 3647 -8 1268 198 35.6 3.1 -11.0 240 7.8 35.9 59.8 310 -04052201.AIH 1 12.5 2491 -49 1041 183 43.4 3.2 -12.7 241 8.1 37.2 66.0 201 -04052122.GEG 1 8.3 1152 -51 831 61 20.9 0.0 -20.3 270 7.3 16.0 22.9 86 -04051821.PIA 1 13.2 1154 -20 811 45 38.0 0.3 -11.1 240 5.6 36.6 42.0 114 -04051701.C07 1 9.6 1682 -36 2011 261 50.5 0.0 -10.9 271 7.9 35.3 62.3 740 -04051700.GRI 1 11.3 1410 -72 1036 313 44.9 2.7 -14.9 227 8.2 36.5 55.1 498 -04051420.MBS 1 13.4 793 -7 834 109 40.9 0.6 -10.0 223 5.5 35.3 48.3 177 -04051416.SBN 1 13.7 499 0 429 86 47.3 0.3 -10.0 213 5.3 45.7 43.4 226 -04051323.G#4 1 15.5 3158 -12 977 153 38.7 3.1 -11.1 260 7.5 26.9 14.0 223 -04051223.C32 1 11.4 2949 -2 1894 52 53.9 0.2 -12.4 230 8.0 35.8 51.2 184 -04051117.VCT 1 16.3 1839 0 387 110 21.6 0.0 -10.4 236 6.4 21.8 22.3 236 -04043018.SPS 1 12.8 1694 -16 674 115 47.0 1.5 -14.9 221 8.0 24.4 40.3 122 -04042921.CDS 1 9.5 1110 -130 1817 -14 26.8 0.0 -14.5 244 8.2 30.9 40.8 112 -04042900.DRT 1 11.7 872 -12 771 192 46.2 1.3 -13.3 241 6.5 37.1 66.5 291 -04042320.SPS 1 14.3 3037 -1 1026 34 40.0 0.7 -13.4 226 7.4 18.9 49.8 60 -04042317.C11 1 10.4 439 -226 1267 41 38.3 0.0 -12.0 218 8.0 22.5 52.0 77 -04042300.FYV 1 11.8 1066 -33 829 252 39.7 1.8 -14.3 264 7.5 32.0 68.1 287 -04042222.TUL 1 13.0 1845 -5 720 136 58.2 2.4 -14.9 261 7.6 42.3 60.4 262 -04042220.P#P 1 13.3 2326 -1 748 134 58.8 3.1 -15.9 266 8.0 37.4 58.0 199 -04042200.GAG 1 10.8 1625 -5 908 47 32.4 0.4 -16.4 262 7.4 23.8 78.1 203 -04042122.G#1 1 7.3 762 -3 1736 51 74.4 0.1 -18.1 267 7.9 29.6 109.6 287 -04042100.TUL 1 10.6 632 -70 1159 363 52.0 1.5 -13.5 244 6.5 34.2 55.8 403 -04042023.GVS 1 10.8 283 0 524 272 32.9 0.4 -14.5 241 5.8 36.7 31.1 351 -04042022.C34 1 11.4 1441 -8 1212 105 50.3 1.0 -12.2 244 6.3 35.5 57.3 152 -04042019.HUF 1 9.9 107 -34 769 282 37.1 0.2 -14.7 239 5.8 35.7 36.3 292 -04042001.G#1 1 10.9 1585 -37 948 193 46.4 2.4 -14.6 237 7.8 39.5 70.5 374 -04041923.AMA 1 10.3 1602 -8 1272 103 41.6 0.8 -12.3 237 6.8 29.9 68.2 173 -04041823.HYR 1 9.5 788 -51 1551 610 67.8 2.1 -14.2 237 6.6 48.6 102.0 685 -04041822.YKN 1 8.5 781 -30 1937 -47 67.4 0.0 -14.5 231 7.3 50.2 99.2 231 -04041820.STC 1 9.5 1332 -37 1772 54 48.6 0.1 -15.2 231 8.6 26.3 87.5 167 -04041803.MCW 1 11.3 1606 -164 1042 529 61.4 2.0 -14.5 249 8.2 51.8 78.3 736 -04041800.FRM 1 6.2 0 -9999 2233 126 60.4 0.0 -15.8 250 8.3 48.2 86.0 376 -04041318.MHX 1 14.5 829 -6 376 471 48.2 3.1 -10.4 209 5.7 50.3 59.5 492 -04041101.HOU 1 14.2 1196 -29 574 -14 42.4 -0.1 -12.2 228 6.1 21.1 49.7 59 -04040922.MLC 1 9.5 826 -4 1253 59 50.6 0.3 -15.2 263 6.2 30.9 65.3 245 -04081001.LIC 1 13.1 2627 -14 833 10 31.8 0.1 -7.6 302 6.9 29.5 39.6 240 -04080923.LIC 1 12.3 2929 -24 1366 16 34.5 0.2 -7.1 291 7.3 33.3 41.5 174 -04080222.BH5 1 9.0 780 -79 2692 -22 40.8 0.0 -7.8 269 8.3 36.1 53.6 117 -04080101.FSD 1 15.5 3162 -71 1296 126 42.1 1.7 -10.0 298 7.7 29.5 43.5 211 -04071502.PWD 1 11.6 1241 -85 1817 -10 41.6 0.0 -9.7 293 7.4 25.5 68.5 104 -04071421.NHK 1 15.8 2262 -34 1229 29 22.0 0.0 -9.0 266 6.6 17.0 40.9 95 -04070822.CDR 1 8.4 1172 -184 2535 65 52.1 0.0 -10.6 252 9.0 39.8 58.2 155 -04070800.RSL 1 16.8 3857 -81 950 330 43.6 7.3 -6.9 302 7.3 32.9 43.0 525 -04062401.MSN 1 11.0 1731 -10 1132 139 52.2 1.8 -15.8 264 6.6 37.4 69.1 149 -04062202.AMA 1 14.9 2631 -32 851 69 48.2 1.5 -9.3 256 8.0 30.2 68.7 322 -04062201.AMA 1 13.9 2569 -24 1161 158 51.4 2.9 -9.1 264 8.2 37.1 79.6 378 -04062123.AMA 1 14.3 3017 -3 1129 34 46.0 0.7 -9.8 253 7.9 30.1 66.4 233 -04062100.LAA 1 13.7 2855 -58 1180 172 53.2 3.4 -9.9 265 8.0 19.8 59.2 173 -04062021.PUB 1 9.4 1660 -152 1943 219 45.3 0.1 -10.7 255 9.0 31.5 55.0 312 -04062019.COS 1 10.8 2562 -34 1009 45 38.2 0.7 -12.0 275 8.7 28.8 54.8 98 -04061501.HYS 1 14.0 3081 -123 1665 173 58.2 0.9 -9.0 287 8.2 39.1 57.5 526 -04061401.RDD 1 12.6 881 -112 1018 143 43.3 0.5 -9.7 283 6.4 45.8 43.1 223 -04061322.LNK 1 10.8 941 -69 1877 47 38.4 0.0 -9.3 287 5.7 33.3 45.8 183 -04061318.RQB 1 13.7 1000 -12 900 139 52.4 1.2 -10.7 233 6.1 36.9 55.2 229 -04061121.FRM 1 16.5 2686 -15 680 177 37.0 2.9 -11.0 219 7.7 18.6 49.4 252 -04061103.HSI 1 12.4 1209 -300 1522 316 36.6 0.0 -10.8 210 9.0 34.1 53.9 333 -04060921.APA 1 8.8 1388 -12 2068 90 27.2 0.0 -10.0 186 8.8 22.9 47.8 104 -04053022.SLO 1 18.2 3905 -16 909 156 45.8 4.6 -9.2 240 6.9 43.6 52.3 241 -04052701.PNC 1 15.4 2665 -48 1261 221 69.9 4.4 -8.5 266 6.3 33.5 88.2 272 -04052623.G011 1 12.4 1626 -109 1852 49 70.8 0.1 -9.9 262 7.1 37.0 94.0 147 -04052622.P#T 1 11.9 1612 -29 2366 155 49.7 0.0 -7.5 252 7.6 30.5 79.4 164 -04052602.ABI 1 14.8 1459 -96 876 180 51.9 1.6 -7.9 237 7.1 20.8 85.8 179 -04052500.FDR 1 16.4 3848 -41 1381 227 52.9 4.8 -10.3 248 8.8 44.6 77.8 373 -04052421.MCI 1 15.5 3926 -27 1068 147 47.7 4.3 -11.9 239 7.8 31.2 69.7 377 -04052421.CDS 1 11.5 2298 -45 2458 72 49.8 0.0 -9.7 246 8.0 26.4 75.8 113 -04052420.HSI 1 15.0 4625 -31 1086 83 34.0 2.0 -15.1 231 9.5 23.3 61.8 166 -04052420.BGM 1 11.0 1383 -50 1291 107 43.0 0.8 -13.2 261 6.4 38.3 57.1 215 -04052400.MKX 1 12.6 2101 -6 936 253 43.7 3.9 -15.6 243 8.0 47.2 76.4 303 -04052302.P#8 1 14.4 3064 -83 1357 338 64.2 5.2 -12.5 243 8.9 33.2 52.0 372 -04052301.P#A 1 15.3 2427 -11 641 38 43.9 0.7 -11.1 235 7.5 24.0 58.7 130 -04052301.OMA 1 15.2 2700 -10 801 171 47.0 3.6 -10.9 219 7.5 25.3 68.4 216 -99060823.N60 1 13.7 3155 -15 1051 78 41.1 1.6 -13.0 219 8.3 21.8 42.4 152 -99060620.MIW 1 16.5 2747 -2 728 95 46.5 2.0 -11.3 215 7.4 25.8 54.4 126 -99060619.DVL 1 13.3 2802 -18 814 23 14.6 0.0 -16.8 148 8.2 13.8 14.2 55 -99060522.LRJ 1 15.2 2964 -17 1289 56 44.7 0.9 -10.3 227 8.2 27.6 63.5 157 -99060405.VTN 1 12.9 2518 -114 1075 129 40.8 1.2 -11.7 252 8.4 33.9 47.9 180 -99060300.GTF 1 7.5 3 -80 1259 78 32.1 0.0 -12.7 166 6.6 32.1 44.8 172 -99060300.AMA 1 12.9 2756 -67 1541 95 38.7 0.7 -10.0 227 8.6 29.5 72.3 208 -99060123.SPI 1 14.9 2287 -19 881 194 49.6 3.7 -12.9 240 7.2 40.7 42.9 303 -99060110.MLC 1 16.0 1956 -157 477 193 43.7 0.8 -10.8 251 8.4 34.4 54.4 257 -99060101.RSL 1 13.0 1705 -20 907 93 50.1 1.3 -12.2 250 8.3 32.2 70.0 179 -99060100.SJT 1 10.8 1391 -136 2395 53 45.7 0.0 -8.1 279 8.0 23.3 44.1 151 -99060100.CSM 1 13.8 2748 -119 1593 116 55.1 0.7 -10.4 262 8.3 31.9 59.4 205 -99053122.LBL 1 12.8 2910 -27 1574 106 61.1 1.3 -11.1 247 8.1 34.8 75.6 204 -99053023.LXN 1 11.3 1917 -2 1506 20 24.9 0.0 -12.7 282 7.1 22.6 26.3 85 -99052700.INK 1 10.3 1701 -31 1781 9 53.5 0.0 -13.0 263 8.4 26.7 60.4 107 -99052521.ROW 1 8.6 1056 -1 2099 26 43.2 0.0 -11.4 250 7.4 17.0 57.8 56 -99051701.P28 1 14.1 3996 -25 1498 52 41.4 0.7 -12.2 235 7.9 28.4 44.1 137 -99050922.P07 1 10.6 1793 -96 2053 72 29.7 0.0 -11.9 197 8.5 25.8 74.2 77 -99050419.EWK 1 9.8 1172 -30 1060 87 56.5 0.9 -17.0 185 7.4 27.6 56.8 112 -99050401.ONL 1 9.2 1561 -17 1532 160 31.3 0.6 -15.4 205 7.3 24.3 33.6 208 -99050220.HDE 1 8.7 687 -3 649 100 31.9 0.4 -19.2 208 7.1 21.5 23.0 124 -99050122.MAF 1 12.3 1710 -9 776 232 56.9 3.8 -11.2 237 6.8 32.4 76.7 295 -99043021.INK 1 13.0 2707 -11 1033 174 50.2 3.8 -11.8 197 7.3 35.6 67.7 236 -99042421.AGS 1 9.7 443 -32 1749 52 54.7 0.1 -12.4 292 6.7 37.3 65.4 176 -99042300.MKO 1 13.6 2181 -13 1003 243 55.3 4.9 -11.4 253 7.8 35.3 67.1 248 -04082522.FOE 1 16.3 3285 -59 1225 128 33.5 1.7 -8.6 243 6.8 34.0 42.4 233 -04082423.DPA 1 15.3 616 -29 685 237 28.3 0.7 -6.6 213 5.2 26.6 21.5 254 -04082401.FOE 1 17.3 2862 -33 582 300 33.1 4.7 -7.7 274 6.8 24.8 34.1 345 -04082200.C07 1 12.4 2025 -24 1364 108 27.4 0.6 -7.7 278 6.6 14.0 41.6 288 -04081522.ATH 1 10.0 1320 -50 1754 133 37.4 0.3 -10.5 325 7.6 38.4 41.5 249 -04081420.HAT 1 16.9 1221 -20 693 281 41.3 2.4 -6.1 204 4.5 32.5 54.5 312 -04081219.FAY 1 15.4 835 -29 887 115 48.5 0.8 -7.1 211 5.4 29.3 50.5 134 -04081215.CAE 1 16.3 1332 -11 579 78 38.5 0.7 -8.3 217 5.9 37.1 28.4 136 -99112300.TUL 1 11.8 1383 -12 847 203 54.3 2.5 -15.7 217 6.9 37.0 60.1 264 -99092823.LAF 1 14.3 1880 -26 925 44 46.4 0.6 -9.8 226 5.9 31.8 53.4 131 -99092700.ICT 1 13.7 1942 -99 1005 119 45.8 1.2 -7.8 271 6.2 28.6 45.7 170 -99092003.OGD 1 5.9 7 -95 1490 6 35.4 0.0 -14.8 306 7.3 17.3 39.8 59 -99091023.OKM 1 14.1 1578 -173 1285 75 38.5 0.1 -9.8 284 6.9 29.7 41.2 205 -99090400.AKO 1 11.6 1401 -21 1298 3 44.8 0.0 -8.1 221 7.3 26.8 60.0 143 -99081920.SME 1 11.4 1158 -29 2080 34 42.9 0.0 -10.2 267 6.9 18.4 33.8 78 -99081621.GLD 1 14.3 3184 -9 1787 78 34.9 0.3 -7.0 231 7.7 23.6 46.0 131 -99081503.JDN 1 7.8 368 -225 2152 37 52.5 0.0 -11.9 242 8.0 36.8 72.2 220 -99080923.MKT 1 16.2 2484 -10 814 229 44.4 4.2 -9.7 289 7.7 38.9 63.1 274 -99073100.DMH 1 14.4 2057 -58 1629 66 38.0 0.3 -8.8 331 7.0 18.2 55.7 83 -99072800.COQ 1 11.9 957 -73 1267 208 61.5 1.2 -12.4 294 7.3 37.9 75.1 349 -99072300.ABR 1 15.9 3073 -48 1643 51 26.1 0.2 -7.9 237 7.7 10.4 43.4 60 -99072201.GGW 1 8.8 1107 -147 2618 58 49.5 0.0 -11.3 230 8.7 27.6 92.9 163 -99072022.OLZ 1 19.5 3709 -2 737 170 42.4 4.4 -5.2 268 5.5 29.8 44.8 294 -99071400.MOT 1 10.3 1025 -92 1759 96 63.9 0.2 -11.0 284 7.1 34.6 66.5 248 -99070300.LBF 1 18.3 5887 -62 1227 118 33.7 2.8 -6.4 235 9.0 23.9 55.3 163 -99070123.IPT 1 14.7 908 -27 884 203 33.0 1.0 -6.8 229 5.6 30.6 31.5 243 -99062922.GUY 1 13.7 3266 -87 2035 154 43.7 0.0 -7.8 283 9.0 32.3 53.8 237 -99062802.OGA 1 12.3 1529 -168 1178 203 64.3 0.5 -9.7 266 8.8 33.4 87.6 253 -99062701.MCK 1 16.5 3830 -43 1226 55 34.0 0.9 -7.8 258 8.2 20.8 57.0 152 -99062700.SNY 1 12.1 2217 -42 1612 24 49.9 0.2 -8.9 251 8.2 28.2 77.8 141 -99062300.MHE 1 14.1 1832 -74 977 196 23.4 0.0 -9.7 239 7.3 17.5 18.0 213 -00050901.AIZ 0 13.1 1987 -68 1453 84 35.7 0.5 -11.3 241 8.5 41.9 28.1 204 -00050722.SNY 0 9.8 2015 -39 1845 23 56.1 0.1 -12.4 245 8.7 34.2 64.8 128 -00050707.OGA 0 11.6 1205 -190 787 34 39.5 0.0 -11.3 236 8.2 22.0 47.2 115 -00050323.RBD 0 11.2 940 -3 1077 54 42.9 0.3 -14.6 290 6.2 28.9 58.4 174 -00043001.ABI 0 11.9 2549 -66 1686 111 39.6 0.5 -11.8 268 8.4 26.8 40.5 228 -00042423.LAA 0 5.4 613 -132 2566 97 54.0 0.0 -16.3 278 8.9 29.1 72.7 192 -00042422.EHA 0 6.7 706 -56 2143 58 53.8 0.0 -15.2 295 8.1 25.8 83.4 159 -00042021.BWG 0 11.2 1126 -13 1162 167 52.1 1.4 -13.5 240 7.4 46.8 53.8 253 -00042021.BNA 0 11.2 989 -26 1114 165 53.6 1.3 -13.7 242 7.7 45.4 65.0 244 -00042001.MCI 0 12.4 2093 -43 1300 141 61.9 2.1 -12.3 226 7.0 33.4 81.4 163 -00042000.JCT 0 13.1 2950 -156 1701 170 51.7 0.4 -9.4 253 8.2 40.5 71.8 240 -00041822.SJT 0 7.1 414 -185 3169 -7 49.4 0.0 -9.5 243 8.2 32.3 60.6 45 -00041620.SUS 0 9.5 579 -1 968 46 41.8 0.2 -18.1 247 6.6 30.2 69.5 154 -00041602.GRA 0 10.2 901 -182 1269 251 56.8 0.2 -17.0 244 8.6 34.1 76.8 276 -00033000.SHV 0 12.6 1635 -14 797 147 57.7 2.3 -15.2 267 7.2 33.9 91.9 219 -00032900.HYI 0 15.8 2875 -10 771 106 60.6 3.0 -11.6 251 7.3 36.4 82.8 192 -00032522.BNA 0 8.3 268 -8 1461 34 37.5 0.0 -16.9 270 6.2 23.2 61.3 60 -00032207.MAF 0 11.5 1952 0 562 249 54.6 4.4 -16.4 196 8.3 45.0 77.8 468 -00031600.CSM 0 8.3 808 -99 1327 59 34.5 0.1 -17.7 251 7.6 25.7 34.3 101 -00031022.BHM 0 10.3 614 -95 1034 103 48.9 0.4 -15.8 238 7.0 33.1 49.4 179 -00030923.LRD 0 13.5 2701 -7 1360 -13 41.3 -0.2 -12.5 256 7.5 20.8 59.4 95 -00030920.GFL 0 7.1 1 -425 1416 88 63.6 0.0 -18.7 242 8.1 39.6 77.0 165 -00030900.UNU 0 9.9 1306 -11 1121 172 50.6 1.7 -17.3 203 6.6 39.6 44.1 206 -00030900.CLI 0 9.4 673 -29 1009 196 53.3 1.2 -16.9 202 6.6 39.4 53.8 226 -00030302.PWG 0 12.0 1469 -17 1106 252 60.9 3.3 -12.2 259 6.1 45.0 75.3 323 -00030222.AFW 0 11.1 999 -6 913 256 68.3 2.6 -13.5 238 6.5 36.9 80.1 345 -00022606.CRS 0 13.3 2158 -10 637 191 48.7 3.3 -14.8 239 6.9 25.4 69.2 184 -00022523.FSD 0 7.3 495 -2 929 82 38.3 0.3 -21.9 172 7.7 30.1 52.5 83 -00022405.FAM 0 9.2 437 -46 772 315 46.8 1.1 -18.0 235 6.3 29.2 42.2 331 -00072222.BBW 0 11.9 1462 -1 1218 36 35.2 0.2 -11.1 328 6.5 26.6 43.9 124 -00072220.GLD 0 10.6 1162 -15 1699 26 39.9 0.1 -10.2 319 7.4 19.8 55.8 82 -00072122.BFF 0 9.8 1738 -8 2036 34 42.0 0.0 -9.9 297 7.7 36.2 48.9 131 -00072022.AKO 0 14.0 3465 -7 1063 22 46.2 0.6 -10.2 278 8.3 29.1 64.7 106 -00072000.BVX 0 17.4 3847 -11 1674 30 36.4 0.2 -7.1 298 6.9 26.0 29.2 130 -00071022.RCA 0 13.2 1916 -28 1452 23 41.1 0.2 -9.2 238 7.6 21.4 68.1 95 -00071001.LBF 0 14.7 2947 -100 1740 24 28.1 0.1 -5.6 239 7.8 23.6 37.9 109 -00070922.MHE 0 16.8 3556 -34 1430 6 40.7 0.1 -6.1 258 6.7 18.8 41.5 109 -00070922.GGW 0 13.3 2242 -12 1039 31 46.6 0.5 -11.4 226 7.4 18.7 71.4 74 -00070901.LWT 0 8.7 874 -65 1998 38 58.4 0.0 -11.5 232 8.1 32.4 92.6 236 -00070805.LVN 0 18.2 2722 -69 530 388 37.6 5.8 -9.2 261 8.1 22.9 53.3 407 -00070803.JDN 0 7.6 57 -220 2275 33 69.9 0.0 -11.7 240 7.8 39.2 84.5 167 -00070601.CUT 0 11.7 2058 -14 1543 37 55.5 0.3 -9.9 245 8.5 28.5 78.8 136 -00070523.MCK 0 16.4 3979 -55 1631 151 45.4 1.6 -6.8 254 8.1 24.5 59.5 231 -00070521.RAP 0 14.5 3135 -2 1289 15 44.0 0.3 -10.0 233 8.0 19.5 68.5 93 -00070501.2WX 0 11.2 1574 -93 1339 -29 47.6 -0.2 -12.4 230 8.6 28.2 78.4 64 -00070421.JDN 0 8.1 1033 -47 1927 -17 41.2 0.0 -15.0 209 7.9 26.2 68.3 49 -00070302.GGW 0 10.6 1484 -86 1685 121 67.7 0.4 -12.6 252 7.9 36.1 78.0 267 -00070222.FOD 0 17.4 3585 -43 1097 53 23.7 0.0 -9.5 292 7.5 16.4 31.4 91 -00070201.ABR 0 14.2 3411 -108 1790 100 24.5 0.0 -10.0 259 8.3 16.6 39.9 145 -00070123.ELO 0 13.3 2835 -49 1339 117 57.8 2.1 -13.1 291 7.7 31.9 66.7 228 -00070122.ABI 0 13.9 1505 -15 1776 40 26.6 0.1 -5.4 261 5.7 21.4 25.5 120 -00070100.JLN 0 15.5 2255 -3 786 81 43.6 1.3 -7.6 313 5.9 25.5 56.4 208 -00062923.ELM 0 8.8 332 -11 1098 19 33.4 0.0 -16.5 253 6.2 19.9 82.5 60 -00062923.D07 0 9.6 1600 -26 1649 30 42.4 0.1 -15.7 295 7.7 30.2 50.5 90 -00062901.LAM 0 11.8 506 -57 1728 28 25.5 0.0 -6.5 268 6.3 18.5 25.2 126 -00062519.AIO 0 14.7 2632 -77 1269 122 38.0 1.2 -10.6 279 7.3 29.0 32.0 250 -00062402.RCA 0 11.5 1507 -76 1200 0 40.3 0.0 -11.0 273 7.9 29.4 67.6 159 -00062322.SDA 0 16.8 4294 -9 1398 56 28.6 0.7 -9.2 284 7.3 21.1 46.7 160 -00061522.OKV 0 14.5 746 -31 749 130 32.3 0.5 -8.8 240 6.0 35.1 29.5 198 -00061323.P28 0 14.3 3106 -53 1734 60 41.3 0.3 -10.0 260 8.0 15.7 31.7 91 -00061122.DFS 0 13.5 3143 -11 1597 67 28.6 0.4 -8.2 251 7.7 28.8 45.0 62 -00060400.GLD 0 9.0 1430 -74 2560 51 35.6 0.0 -10.7 313 8.7 29.0 38.3 146 -00060221.CEF 0 12.1 326 -141 1452 156 38.5 0.1 -9.8 279 6.6 44.9 47.0 277 -00052701.SZL 0 13.7 1477 -23 1157 198 50.0 2.1 -9.7 244 6.7 38.9 69.4 232 -00052501.PPA 0 15.2 3731 -83 1597 78 46.6 0.7 -8.0 249 8.4 33.0 60.7 288 -00052501.ADK 0 16.3 4569 -134 1861 108 40.3 0.2 -7.8 255 8.7 36.4 49.3 291 -00052219.AVC 0 10.1 628 -1 1000 2 52.8 0.0 -13.8 256 5.9 28.0 59.1 95 -00052021.VPC 0 13.0 805 -6 1196 15 39.2 0.1 -9.8 231 6.1 19.7 47.6 87 -00050922.IRS 0 12.0 729 -2 928 68 49.6 0.4 -13.6 230 6.9 46.6 41.5 178 -01041105.JCT 0 14.1 1545 -229 832 346 71.9 0.0 -9.7 230 8.5 44.0 97.0 386 -01041004.IND 0 11.4 1318 -107 1240 185 57.8 1.1 -13.8 292 7.2 35.6 68.3 216 -01040321.UNO 0 12.3 1279 -42 722 107 57.2 1.3 -13.7 270 7.4 36.3 60.7 225 -01040300.BFF 0 5.0 0 -9999 1708 161 63.5 0.0 -17.8 241 7.5 37.7 81.7 433 -01032404.ABI 0 10.8 1700 -61 813 65 27.5 0.5 -18.2 289 8.0 17.4 46.6 180 -01031202.FTW 0 11.7 1341 -9 490 161 53.1 1.9 -17.9 240 7.3 37.5 47.3 201 -01031123.BWD 0 10.1 846 -18 912 76 47.4 0.5 -17.4 245 7.7 31.1 69.7 133 -01022500.TOP 0 7.3 153 -15 715 148 78.6 0.2 -21.3 203 6.8 32.9 92.4 170 -00110907.GZH 0 15.4 1005 -3 768 172 47.3 1.4 -7.8 213 6.0 36.2 52.6 220 -00110906.EET 0 14.9 674 -3 539 277 52.5 1.6 -8.6 217 5.7 41.9 58.8 327 -00110121.CID 0 12.2 1537 -17 1087 164 40.8 1.6 -12.1 210 6.0 36.7 41.3 225 -00102323.ELP 0 9.8 1432 -3 1298 24 68.0 0.2 -14.2 201 7.5 36.8 65.9 132 -00102212.MWL 0 13.4 1016 -7 525 152 31.3 0.8 -11.5 208 6.2 22.4 43.6 149 -00101423.INK 0 8.5 757 -27 2381 63 29.5 0.0 -10.8 243 7.2 27.3 48.1 91 -00101408.CNM 0 11.5 1524 -124 1147 79 34.2 0.3 -10.4 246 7.2 29.4 55.6 119 -00101400.SLN 0 11.5 577 -49 879 26 58.0 0.1 -11.3 234 5.7 28.9 63.6 76 -00100401.GCK 0 8.5 341 -281 1869 -16 53.4 0.0 -11.5 263 8.5 38.0 70.8 124 -00090523.GTF 0 7.6 277 -43 1393 8 65.8 0.0 -15.8 219 7.4 34.7 93.3 112 -00090300.ISN 0 10.7 654 -10 754 62 42.1 0.3 -13.8 225 6.8 27.3 72.5 95 -00090120.SLC 0 5.7 78 -67 2129 29 41.1 0.0 -14.3 198 7.4 15.4 53.6 53 -00081820.BUY 0 15.3 1702 -37 1351 58 34.7 0.4 -8.2 275 6.5 38.7 13.2 134 -00081723.IND 0 19.2 4115 -13 791 158 47.3 5.1 -7.9 275 6.9 37.5 49.8 224 -00081720.LEX 0 16.6 2579 -6 1129 81 36.5 1.1 -6.7 284 5.9 24.9 42.3 141 -00081420.AIT 0 16.2 2299 -120 690 282 52.2 3.0 -9.8 267 8.0 37.9 69.5 368 -00080623.CDJ 0 14.7 1350 -119 1250 43 35.9 0.1 -6.8 272 6.3 24.5 54.6 88 -00080601.HNR 0 18.6 4073 -16 990 54 37.6 1.4 -7.0 271 7.3 25.9 55.8 92 -00080522.AIA 0 7.8 312 -3 2875 0 43.4 0.0 -8.3 272 7.7 22.1 49.4 52 -00080502.PIR 0 14.4 2629 -128 1844 202 48.0 0.3 -7.4 270 7.5 30.4 64.1 318 -00080502.ANW 0 11.5 1035 -228 2157 138 37.9 0.0 -6.3 276 7.6 25.6 46.8 227 -00080222.FKL 0 13.7 1168 -22 892 104 26.2 0.5 -9.1 253 5.9 27.0 55.7 145 -00080202.LWT 0 8.3 700 -130 2701 50 46.5 0.0 -8.4 286 8.6 19.4 78.7 94 -00080202.GGW 0 10.8 1193 -207 1955 94 51.1 0.0 -9.6 293 8.0 25.1 71.3 230 -00072622.AIO 0 16.7 3711 -2 964 67 44.8 1.9 -10.2 324 7.6 29.1 43.1 186 -00072501.HON 0 13.9 2463 -99 1314 85 29.5 0.5 -11.1 271 8.3 13.2 40.3 91 -01060123.LWC 0 11.2 1268 -25 1421 113 62.6 0.8 -13.2 305 6.4 37.6 79.8 249 -01060122.P28 0 11.4 1141 -69 1552 80 51.2 0.3 -9.7 308 6.6 21.4 62.5 156 -01053100.CVN 0 8.5 1309 -86 2195 -18 45.9 0.0 -10.8 289 8.3 24.1 38.5 138 -01052801.END 0 13.1 2369 -85 1258 150 47.1 1.6 -12.5 280 8.2 39.8 67.4 370 -01052400.OKF 0 7.6 314 -55 2200 85 59.2 0.0 -15.3 298 7.1 43.3 63.3 244 -01052022.GRK 0 15.6 2852 -21 1408 32 40.1 0.4 -7.9 242 6.8 30.2 75.1 60 -01051801.RUL 0 11.1 1624 -134 2428 24 25.8 0.0 -8.5 258 8.1 18.9 46.6 76 -01051623.BIE 0 13.4 3208 -41 1905 35 30.0 0.1 -10.4 274 7.5 20.5 32.1 103 -01051218.DDH 0 8.9 325 -25 1493 21 36.4 0.0 -16.2 229 6.4 25.9 46.8 102 -01051000.OLU 0 9.6 2423 -73 2081 70 30.6 0.0 -15.8 265 8.8 23.7 36.8 157 -01050823.GBD 0 8.1 447 -90 1828 55 44.5 0.0 -15.8 323 7.4 25.4 50.6 207 -01050701.COT 0 15.9 3113 -16 1068 4 34.1 0.1 -12.2 267 8.1 10.5 56.5 73 -01050700.ADS 0 14.6 2915 -5 1038 115 37.4 2.0 -13.7 248 7.3 23.1 63.5 148 -01050623.BMQ 0 16.4 4217 -12 955 48 38.2 1.3 -13.0 257 7.5 27.3 64.9 143 -01050501.COT 0 14.3 1453 -9 1075 113 48.9 1.2 -9.9 226 7.0 33.1 73.5 169 -01050200.AUD 0 10.0 1544 -80 1896 85 31.2 0.1 -14.7 266 8.2 22.1 40.9 170 -01050101.SLN 0 10.5 1695 -66 1383 122 37.1 0.7 -16.7 295 8.0 24.3 61.4 188 -01050100.P28 0 9.9 1422 -94 1553 70 45.7 0.2 -15.7 309 7.8 24.3 54.0 188 -01042317.STE 0 9.5 775 -5 970 86 55.4 0.6 -18.0 210 6.8 38.9 110.9 170 -01042304.JCT 0 14.1 2210 -11 659 190 53.5 3.8 -11.8 248 7.8 31.4 55.1 214 -01042222.MWL 0 11.8 1193 -8 1373 116 46.2 0.7 -10.2 212 6.2 33.4 58.0 105 -01042123.PIA 0 12.1 1857 -13 1175 79 41.0 0.8 -13.4 257 7.5 25.7 51.8 94 -01042123.CDS 0 10.3 2000 -70 2105 81 55.8 0.0 -11.8 230 7.9 27.2 70.8 141 -01042102.SLN 0 11.5 2072 -206 1218 280 50.2 0.0 -15.1 239 8.7 44.2 73.5 374 -01041702.SJT 0 13.0 1793 -30 989 96 38.8 1.1 -10.9 296 7.0 26.3 65.2 260 -01041700.LBB 0 8.1 406 -65 1861 42 46.3 0.0 -12.1 288 7.1 32.9 80.6 256 -01041500.ABI 0 12.6 2222 -121 1474 76 59.9 0.5 -13.2 249 8.7 28.8 78.5 130 -01041423.ADM 0 14.2 1613 -86 524 248 67.7 3.1 -14.2 254 8.6 38.9 90.8 310 -01041422.PCS 0 13.6 2872 -90 1455 5 57.7 0.1 -10.8 245 8.2 21.5 77.6 85 -01041422.EMP 0 8.9 652 -15 1486 57 59.4 0.2 -16.8 254 7.2 31.9 84.7 218 -01041421.HBR 0 13.9 2647 -29 786 167 70.6 4.4 -14.3 255 8.2 39.1 91.1 239 -03050100.BRL 0 12.7 2707 -10 1047 121 47.3 2.5 -15.8 247 8.2 27.0 50.9 270 -03043021.AIA 0 12.3 2247 -53 863 158 49.0 2.8 -15.7 243 8.1 37.1 49.5 276 -03043003.LIC 0 8.7 1228 -82 574 264 52.2 2.2 -15.9 216 8.8 43.9 59.2 676 -03042900.APA 0 6.3 1056 -56 1639 56 35.9 0.1 -15.6 239 8.3 10.6 65.7 63 -03042600.HRL 0 12.4 1634 -219 1994 5 43.7 0.0 -11.1 286 8.3 25.0 72.5 36 -03042522.FTY 0 11.2 645 -12 811 160 61.6 1.0 -14.4 253 6.7 33.8 66.6 259 -03042520.ANB 0 11.5 783 -1 777 164 64.0 1.3 -14.0 259 6.2 36.4 64.7 319 -03042400.SEP 0 14.4 2485 -6 558 393 62.4 9.8 -14.6 238 7.9 39.1 92.6 485 -03042022.MKL 0 12.5 1017 -22 789 92 57.6 0.9 -14.3 251 6.9 29.0 70.2 188 -03042019.MEM 0 13.1 1682 -6 857 78 50.6 1.1 -14.2 252 7.3 29.0 57.0 148 -03041922.P#0 0 11.7 1623 -17 730 127 72.6 2.1 -19.4 223 7.9 35.5 102.9 148 -03041920.END 0 10.6 1171 -12 629 144 57.4 1.6 -21.0 215 8.4 39.0 99.4 219 -03041907.FDR 0 12.6 1046 -418 613 365 65.8 0.0 -13.9 207 8.9 40.5 101.8 352 -03040720.HOU 0 16.5 2215 -1 373 67 57.9 1.4 -11.4 231 7.6 30.3 77.2 191 -03040718.BPT 0 13.8 933 -139 741 16 59.0 0.1 -12.1 226 7.4 26.5 91.0 110 -03040717.LFT 0 14.1 780 -168 559 29 50.5 0.0 -12.0 233 7.3 29.3 84.8 74 -03040605.C12 0 11.3 655 -128 639 328 69.4 1.0 -14.6 250 7.3 45.3 111.0 697 -03040601.C11 0 12.1 2056 -4 832 109 75.1 2.2 -15.3 251 7.6 26.4 93.3 198 -03040400.LW1 0 13.3 2761 -1 682 153 54.3 3.8 -15.1 242 7.6 32.9 52.2 224 -03040322.HBR 0 9.5 1315 -38 1655 57 42.4 0.2 -14.8 235 7.5 33.0 47.0 130 -03032821.MBS 0 7.7 95 -1 1423 199 68.1 0.1 -17.6 223 6.6 48.9 65.7 252 -03032819.AZO 0 8.9 146 -2 830 200 60.9 0.3 -17.3 225 6.7 54.5 64.3 255 -03031722.SPS 0 10.7 981 -38 1183 127 34.3 0.6 -15.4 236 7.3 19.3 95.8 139 -03031720.SPS 0 10.2 947 -44 1140 35 24.3 0.0 -16.7 216 7.4 15.4 100.9 42 -03031221.PBI 0 14.2 1790 -2 1215 21 36.5 0.2 -12.1 258 7.7 2.8 67.6 -23 -03031218.FPR 0 15.8 2760 -2 892 -28 38.6 -0.5 -14.1 256 8.0 11.8 71.6 86 -01062102.ICT 0 13.9 1917 -38 976 89 37.8 1.1 -11.3 291 7.3 26.8 48.8 202 -01061623.JMS 0 8.9 600 -4 1096 41 40.5 0.2 -18.1 283 7.1 25.4 84.9 82 -01061122.RGK 0 14.3 3269 -77 1618 201 51.8 1.8 -10.9 265 8.4 35.2 56.2 397 -01060502.CSM 0 15.8 3992 -79 1412 107 34.9 1.2 -8.4 251 8.1 28.3 40.7 227 -01060501.LHX 0 8.3 615 -248 1957 94 44.0 0.0 -11.2 243 9.0 29.0 49.3 127 -03062823.RST 0 8.8 203 -71 1471 26 40.8 0.0 -12.1 287 4.8 15.4 60.6 57 -03062822.BH4 0 6.7 253 -82 2374 15 53.7 0.0 -12.2 288 8.0 39.8 64.9 352 -03062820.WSC 0 9.5 432 -25 1288 24 38.2 0.1 -13.2 292 5.0 20.7 57.7 45 -03062800.C07 0 9.3 1323 -51 2202 29 36.5 0.0 -9.3 311 7.4 12.9 41.7 81 -03062800.8V7 0 10.5 2208 -13 2023 82 42.3 0.0 -8.2 320 7.8 44.3 44.0 293 -03062722.8V7 0 11.1 2543 -6 1821 66 38.6 0.2 -8.4 315 7.5 40.0 47.0 258 -03062721.C07 0 8.9 1146 -29 2232 32 35.4 0.0 -9.2 306 7.2 11.7 50.1 74 -03062401.CYS 0 10.5 1054 -23 891 146 67.4 1.5 -8.4 210 6.6 44.6 77.5 258 -03062022.ROW 0 10.0 1448 -1 2438 18 41.2 0.0 -8.3 220 7.9 29.6 51.3 74 -03062022.CVS 0 12.0 1680 -21 1220 96 32.9 0.7 -8.5 224 7.2 20.3 41.0 110 -03062020.CVS 0 12.3 2087 -2 1100 14 22.8 0.0 -9.4 233 7.4 10.8 35.9 48 -03061501.CNM 0 11.3 2677 -1 2178 -48 31.4 0.0 -11.2 338 8.5 17.4 38.2 109 -03061423.HOB 0 9.6 1525 -68 2132 7 32.6 0.0 -11.5 330 8.5 14.0 32.3 24 -03061223.C11 0 20.9 5150 -8 501 190 32.5 5.3 -8.9 269 8.0 41.4 58.8 339 -03061221.AGC 0 13.1 691 -9 1032 158 35.1 0.6 -8.8 227 5.9 34.2 44.2 256 -03060401.TCC 0 11.4 1746 -91 1622 -15 59.6 -0.1 -9.6 288 8.2 44.8 48.7 398 -03060322.LBB 0 13.6 2239 -128 1199 80 45.2 0.5 -9.1 302 7.9 31.8 57.3 316 -03060302.LRD 0 17.3 3023 -81 1418 -4 35.4 0.0 -5.0 285 7.3 27.3 67.7 -12 -03053121.ILM 0 13.5 1237 -102 1265 394 58.4 2.3 -10.4 275 6.3 47.7 74.8 576 -03052001.ADM 0 16.8 3033 -19 1155 81 33.3 1.2 -8.4 288 7.5 14.5 61.0 188 -03051922.FSI 0 15.9 2088 -80 836 131 37.4 1.4 -8.3 246 8.1 40.1 50.7 385 -03051409.C12 0 13.9 2056 -415 1151 505 44.5 0.0 -12.7 290 9.5 25.4 80.3 466 -03051406.LW1 0 15.8 3351 -219 819 259 50.4 0.0 -11.8 274 8.3 12.9 74.5 238 -03051401.C11 0 13.9 3239 -178 1774 132 58.3 0.1 -9.9 286 8.2 22.1 60.4 192 -03051322.CDS 0 12.4 3323 -92 2274 79 49.1 0.0 -10.1 280 8.6 18.1 68.8 98 -03051223.MRF 0 11.6 1914 -2 1612 41 42.7 0.2 -6.0 279 6.7 33.9 49.2 174 -03051019.MLC 0 14.5 849 -221 615 158 58.7 0.0 -8.7 240 7.6 34.0 74.3 199 -03051017.P#Q 0 16.5 2801 -34 619 97 68.4 2.7 -9.2 235 7.2 32.3 77.8 168 -03051000.P#J 0 16.2 3929 -21 888 74 55.8 2.7 -12.5 247 7.6 33.6 64.7 227 -03050922.LEX 0 15.5 2304 -3 715 119 55.3 2.5 -9.5 278 7.4 32.8 69.7 185 -03050921.COU 0 16.1 4338 -12 941 67 45.4 2.2 -11.8 246 7.4 35.8 73.5 264 -03050920.SDF 0 15.2 2300 -15 871 88 52.2 1.8 -10.2 268 7.2 36.6 70.7 247 -03050520.MKL 0 15.8 2332 -17 581 247 71.6 5.8 -11.9 263 7.3 40.2 88.1 300 -03050223.BMX 0 15.4 3487 -10 686 61 44.2 1.6 -13.2 283 6.8 21.9 38.7 114 -03050221.HSV 0 13.0 2237 -40 946 139 42.3 2.2 -13.8 264 7.0 27.8 33.8 201 -03050221.ABL 0 13.6 3056 -5 1063 81 40.9 1.6 -14.7 280 7.2 27.0 27.0 130 -03050219.SJT 0 15.1 4252 -2 1189 17 38.9 0.4 -12.5 277 8.1 4.7 61.7 18 -03050219.ABL 0 12.9 2572 -28 1072 45 27.2 0.5 -13.7 261 6.7 22.6 36.0 82 -03050218.MSL 0 13.0 2367 -24 912 19 25.5 0.2 -14.5 257 7.4 24.2 40.8 60 -03050201.ACT 0 13.6 2339 -88 1301 -44 31.1 -0.3 -11.9 280 8.3 21.3 53.8 -77 -03050102.END 0 14.0 3853 -58 1033 227 43.6 5.8 -13.5 250 7.4 27.5 43.5 247 -03071221.AVL 0 11.9 710 -2 1196 56 37.5 0.2 -8.5 266 5.6 31.7 43.3 103 -03071201.FOE 0 16.7 3598 -41 1289 -96 59.4 -2.4 -10.2 313 7.9 33.9 54.8 89 -03071200.FOE 0 16.2 3683 -11 1441 -16 63.8 -0.3 -11.0 315 7.7 31.9 59.2 109 -03071123.P#H 0 12.6 927 -26 1632 97 59.9 0.3 -9.9 322 7.2 45.3 55.0 319 -03070904.PHP 0 14.6 2161 -292 1066 549 72.4 0.0 -8.6 260 8.8 53.5 55.7 683 -03070900.BH3 0 8.3 1108 -106 2627 277 55.8 0.0 -7.9 250 8.4 55.7 68.2 568 -03070723.LVS 0 8.8 850 -179 2135 85 20.0 0.0 -6.4 329 8.7 24.3 27.9 305 -03070720.DSM 0 18.0 4261 -35 1012 20 39.2 0.6 -9.9 262 8.0 13.2 34.7 79 -03070719.LVS 0 9.9 1337 -68 1800 12 22.3 0.0 -7.2 336 8.0 27.0 21.0 98 -03070600.VTN 0 11.6 1572 -201 1584 157 52.8 0.0 -9.5 273 8.2 30.3 50.1 293 -03070521.RAP 0 8.7 803 -208 2327 67 22.6 0.0 -11.2 272 8.5 6.7 33.0 46 -03070521.P#7 0 10.3 1147 -137 2084 84 43.4 0.0 -10.3 249 8.1 22.9 55.2 239 -03070517.BH3 0 8.9 1171 -147 2263 -14 27.2 0.0 -12.5 293 9.1 15.8 39.6 51 -03070305.GDV 0 9.1 634 -206 1972 120 22.6 0.0 -13.9 250 8.7 30.3 58.1 255 -03063018.AUG 0 11.8 1327 -56 1152 60 42.9 0.5 -12.3 267 5.3 24.4 72.0 118 -03081800.BH5 0 9.0 725 -5 2392 -33 27.4 0.0 -9.3 180 7.6 12.2 31.3 76 -03081322.XRW 0 16.6 1031 -16 519 88 21.6 0.0 -6.2 187 5.5 23.7 39.1 164 -03081202.SEP 0 12.7 373 -104 1300 -113 55.9 -0.2 -8.4 345 6.8 38.0 68.0 -12 -03081200.FWD 0 12.2 1050 -51 2135 -30 50.2 0.0 -8.8 339 6.7 35.0 52.7 68 -03081023.P#9 0 13.9 1702 0 1195 30 41.7 0.3 -9.2 346 6.8 25.8 56.8 104 -03080902.P#C 0 15.5 3216 -71 1472 8 27.4 0.1 -6.4 277 7.9 17.3 40.8 199 -03080900.MIB 0 15.0 3325 -48 1477 39 33.2 0.4 -9.0 291 7.7 10.7 43.9 102 -03080900.P#C 0 14.4 3127 -1 1826 10 25.0 0.0 -5.8 262 7.5 12.2 42.3 64 -03080622.GLD 0 12.9 3132 -2 2338 21 28.1 0.0 -7.1 306 8.2 14.7 32.7 115 -03080601.CNU 0 15.8 2262 -28 1629 -18 34.6 -0.1 -5.1 317 6.6 25.1 42.1 49 -03080600.SUX 0 15.5 1945 -3 996 54 38.2 0.7 -8.6 321 7.0 35.9 44.6 171 -03080521.TOP 0 16.0 2857 -24 1592 -7 30.8 0.0 -6.8 308 6.3 19.6 40.9 101 -03080520.DAN 0 15.0 2224 -8 858 8 18.6 0.0 -10.1 275 6.4 27.6 30.4 121 -03080422.P#R 0 15.1 1771 -64 1131 59 51.1 0.7 -8.5 326 6.5 23.7 72.7 144 -03080401.BVX 0 16.9 2856 -38 1072 96 33.8 1.4 -8.7 308 6.7 18.2 47.9 100 -03080202.LUS 0 9.3 520 -170 1828 -21 47.7 0.0 -8.2 291 7.9 30.7 60.7 11 -03080123.CRL 0 13.5 2544 -8 1131 18 35.3 0.2 -12.9 299 7.9 26.6 36.1 109 -03080103.MCW 0 11.0 914 -111 1515 8 24.1 0.0 -12.2 281 7.0 26.6 47.8 60 -03073123.C31 0 8.6 251 -238 2988 79 50.4 0.0 -8.0 311 8.0 29.8 74.4 268 -03073120.TVL 0 10.6 1275 -24 1488 33 34.5 0.1 -7.4 90 7.8 32.3 17.1 170 -03072700.IWD 0 15.1 1598 -19 1386 149 42.6 1.0 -6.1 276 5.9 27.7 60.4 150 -03071802.BH1 0 13.9 2073 -132 1543 52 64.4 0.2 -6.9 291 7.8 47.0 77.9 171 -03071721.RAP 0 14.6 3713 -127 1972 107 39.2 0.0 -6.2 280 8.5 31.5 54.8 181 -03071320.MSL 0 16.4 2839 -21 1060 37 23.4 0.0 -9.3 310 7.1 4.1 36.8 35 -03071320.DIK 0 9.2 2113 -26 3189 -19 27.9 0.0 -9.3 266 9.0 11.0 36.6 31 -04040721.P#U 0 11.2 1509 -10 1060 103 47.1 1.2 -15.7 268 6.4 35.8 60.8 191 -04040702.SPS 0 8.6 230 -53 980 110 36.0 0.2 -17.3 236 6.3 19.0 53.3 110 -04040700.FTW 0 10.4 641 -8 948 43 57.7 0.3 -14.3 228 6.4 22.9 60.1 83 -04040422.LRD 0 13.8 2148 -1 827 171 49.4 3.0 -12.9 244 7.0 31.5 38.8 217 -04040421.ALI 0 13.2 1124 -3 718 10 40.8 0.1 -13.2 238 7.0 18.0 35.9 100 -04032701.DHT 0 9.5 1004 -128 1142 153 30.2 0.3 -13.4 233 8.2 31.2 63.3 235 -04032623.RAP 0 8.7 1651 -52 1568 172 42.5 0.9 -15.5 205 8.0 26.0 46.8 264 -04031802.FSM 0 8.0 442 -99 1939 211 48.0 0.0 -17.1 278 7.5 37.8 72.5 338 -04031800.P#P 0 9.4 1357 -30 1585 127 45.0 0.5 -17.4 288 7.7 34.4 66.4 269 -04030121.ORD 0 7.2 534 -1 908 208 58.9 1.1 -23.3 222 6.6 37.3 72.6 297 -04030120.RFD 0 6.8 505 -7 892 172 55.3 0.8 -24.3 220 6.8 34.8 71.1 256 -04022416.MCO 0 13.1 534 -37 687 121 47.0 0.5 -10.8 255 5.0 28.8 81.9 156 -04022407.G#5 0 10.5 962 -124 801 -16 47.4 -0.1 -18.2 218 7.7 31.4 83.7 14 -04022316.MSY 0 11.3 0 -9999 417 436 51.3 0.0 -11.2 240 6.1 44.9 86.2 531 -04020601.BTR 0 11.7 57 -172 540 186 69.9 0.0 -13.3 214 7.0 48.1 87.1 199 -04020514.LFT 0 11.1 165 -244 1109 583 49.0 0.0 -11.7 217 6.5 46.0 63.5 611 -04020512.LCH 0 13.6 1421 -64 497 282 49.1 3.0 -12.5 222 6.8 41.7 68.1 319 -04011921.VRB 0 10.3 196 -20 878 -16 82.2 0.0 -14.0 242 5.1 46.9 123.3 207 -03112718.RUE 0 10.5 681 0 396 4 92.3 0.0 -20.1 238 7.0 35.8 100.8 153 -03110923.SAC 0 6.9 156 -14 892 38 24.7 0.0 -25.3 234 7.5 14.4 91.8 77 -03102818.CTY 0 16.5 1074 -53 594 181 37.6 1.2 -7.8 217 6.3 23.6 51.5 193 -03100822.VAD 0 14.1 1355 -7 765 -4 27.1 0.0 -11.2 277 6.4 13.9 52.0 68 -03092718.CBE 0 11.6 969 -2 1256 109 40.4 0.5 -12.3 213 6.1 33.1 58.2 137 -03092620.UIN 0 12.7 1139 -3 844 177 50.2 1.7 -14.6 266 7.9 42.7 77.1 266 -03092619.BRL 0 11.1 906 -34 824 125 50.2 1.0 -14.9 256 6.9 40.9 76.6 149 -03091200.MRF 0 9.8 747 -2 1645 9 36.3 0.0 -6.8 276 6.2 25.5 49.1 163 -03090900.MAF 0 9.9 1214 -1 2565 13 32.3 0.0 -8.4 313 7.4 22.4 35.6 163 -03083123.HUF 0 14.8 27 -163 471 268 39.8 0.0 -6.8 243 6.3 41.6 43.2 340 -03082601.P#4 0 12.9 980 -231 1606 140 42.5 0.0 -9.4 277 7.1 39.4 44.3 283 -03082600.ABR 0 14.2 3471 -76 1925 104 37.8 0.1 -11.4 289 8.6 27.8 43.9 143 -03082221.LOL 0 9.6 944 -94 1467 89 64.9 0.3 -12.3 188 8.3 46.4 77.0 299 -03082119.APX 0 14.4 2077 -120 1359 80 36.1 0.3 -8.3 255 7.1 34.1 35.4 132 -03082100.DLH 0 16.1 2503 -11 1009 166 39.5 2.7 -8.1 226 6.2 24.3 46.3 201 -04051501.PUB 0 3.9 204 -85 2585 153 55.2 0.0 -18.2 268 8.8 42.0 78.8 355 -04051423.COS 0 4.6 230 -87 1664 52 57.1 0.0 -18.0 274 8.2 45.2 68.4 179 -04051300.HBR 0 14.0 4148 -28 1710 172 41.2 1.4 -11.1 244 7.8 44.0 46.5 333 -04051100.LUS 0 8.3 917 -69 1429 204 53.5 0.8 -11.5 237 7.4 28.1 44.2 323 -04050923.CVS 0 5.9 554 -61 3040 -32 23.7 0.0 -12.6 309 9.6 17.1 15.5 78 -04050921.STC 0 9.9 1302 -52 1737 185 49.7 0.5 -14.2 264 7.5 46.1 49.8 400 -04050900.P#A 0 13.8 2438 -42 1008 193 29.0 2.3 -12.7 278 7.7 19.9 36.2 251 -04050822.BH3 0 5.3 996 -6 3054 49 48.0 0.0 -15.0 280 9.6 8.9 60.8 58 -04050522.RIC 0 8.3 824 -38 1493 133 43.8 0.4 -20.4 310 7.1 34.9 60.9 251 -04050101.FWD 0 13.9 2471 -39 907 158 44.9 2.9 -14.8 225 8.3 23.0 58.2 185 -04043021.C12 0 13.3 2483 -8 1029 37 45.1 0.7 -14.1 236 7.9 32.8 46.0 48 -04043020.DYS 0 14.1 2950 -10 638 71 52.3 1.8 -14.3 236 7.8 34.1 51.0 143 -04043018.ABI 0 12.0 2372 -1 1211 -3 32.6 0.0 -13.6 230 7.7 22.8 40.3 -22 -04042920.MLU 0 12.9 972 0 744 72 46.0 0.5 -14.5 232 6.6 29.2 45.8 176 -04042821.G#2 0 10.1 747 -3 1175 139 56.7 0.8 -14.7 252 7.4 32.3 53.8 179 -04042521.CDS 0 7.1 679 -5 2042 20 45.4 0.0 -17.7 276 7.7 27.7 76.8 88 -04042300.SGF 0 9.8 113 -134 794 263 69.4 0.1 -15.2 267 7.5 51.1 79.0 572 -04042300.P#P 0 14.6 2114 -9 448 155 49.9 2.7 -13.6 245 7.2 26.3 46.7 258 -04042223.C12 0 12.6 1615 -11 1173 56 54.8 0.7 -10.8 266 6.6 36.5 68.7 191 -04042222.UMN 0 10.5 412 -29 663 220 60.2 0.9 -17.5 254 8.2 45.7 67.6 357 -04042221.C34 0 11.2 1504 -22 1170 72 53.8 0.8 -15.5 265 7.8 38.9 55.3 252 -04042200.ADM 0 11.7 1347 -25 1310 194 51.9 1.6 -13.2 269 6.8 28.4 68.1 339 -04042122.C12 0 11.5 1550 -3 1449 83 53.3 0.6 -13.2 261 6.6 30.3 65.8 168 -04041921.HOB 0 11.3 2173 -1 1395 86 53.9 1.0 -10.9 235 6.7 32.7 83.0 143 -04041801.MFD 0 10.8 1224 -65 1060 185 23.7 0.0 -16.5 288 8.0 29.7 50.0 245 -04041723.MFD 0 11.9 2519 -15 1046 104 26.5 1.1 -15.5 303 7.2 29.2 37.6 184 -04041105.MFE 0 15.8 2222 -37 402 26 39.9 0.4 -11.6 248 7.5 2.1 69.3 23 -04041019.ILM 0 9.2 180 -45 1165 111 41.2 0.1 -16.1 267 6.0 29.7 69.5 345 -04041001.PRX 0 8.8 516 -75 1780 210 42.3 0.1 -14.1 270 6.7 37.6 59.1 314 -04040818.DAB 0 13.2 1058 -19 810 73 56.2 0.7 -15.8 264 7.7 33.6 94.9 186 -04040815.DHN 0 11.9 877 -2 522 78 53.9 0.6 -15.8 257 6.5 30.9 87.6 111 -04071305.CHE 0 17.6 3151 -107 771 181 49.7 2.9 -8.9 301 7.9 29.7 60.2 300 -04070104.HBR 0 15.7 1988 -45 801 174 24.0 0.0 -8.2 259 7.0 25.9 23.7 276 -04062402.FNT 0 10.0 608 -67 1046 219 50.4 1.0 -15.3 260 6.5 32.1 72.4 270 -04062222.BIS 0 7.2 504 -14 1518 9 56.3 0.0 -18.7 301 6.3 28.7 75.6 88 -04062023.DHT 0 8.4 905 -127 2633 107 47.8 0.0 -9.3 270 8.8 36.3 67.8 192 -04061902.G#1 0 13.2 1631 -27 1122 144 35.1 1.2 -8.6 284 7.3 37.4 58.3 408 -04061900.HDN 0 6.4 316 -26 1668 -40 51.4 0.0 -13.3 257 8.3 36.5 73.3 29 -04061820.FAM 0 15.9 1842 -13 923 65 31.0 0.6 -7.0 271 5.7 23.9 35.7 131 -04061800.LHX 0 12.7 2059 -86 777 206 47.3 2.5 -11.2 235 8.4 37.4 49.6 651 -04052700.CHE 0 8.9 347 -4 1255 145 31.1 0.2 -14.7 268 6.1 31.0 44.9 228 -04052623.TYS 0 14.7 1654 -44 919 199 50.1 2.8 -9.7 275 5.9 37.8 71.9 255 -04052623.OKC 0 15.9 3047 -69 1198 124 56.8 2.5 -7.9 261 6.8 24.4 82.9 79 -04052622.FSD 0 9.4 835 -34 1187 143 35.4 0.6 -17.3 267 7.3 33.1 47.2 271 -04052621.CSV 0 14.4 1608 -15 870 176 59.8 2.8 -9.3 268 6.2 35.9 58.7 237 -04052621.C33 0 13.6 2405 -23 1847 104 55.5 0.4 -9.6 256 7.5 30.4 80.9 72 -04052603.CAI 0 15.4 1463 -14 609 129 47.0 1.5 -11.0 277 7.2 31.6 59.9 153 -04052402.P#7 0 7.8 400 -213 1358 246 41.2 0.0 -15.5 247 8.2 35.3 62.4 412 -04052400.STL 0 16.1 3087 -3 604 162 45.4 3.8 -12.7 253 8.0 28.6 58.7 195 -04052400.CDR 0 5.8 117 -187 2181 178 56.7 0.0 -14.5 256 8.0 30.8 66.1 338 -04052323.BGM 0 14.6 2244 0 781 156 41.1 2.4 -11.9 272 7.8 30.1 44.7 249 -04052320.PIN 0 12.0 1300 -3 1376 120 33.7 0.6 -11.8 267 6.7 36.9 31.3 199 -04052300.ELM 0 12.4 1089 -41 1163 226 43.8 1.5 -9.7 281 5.7 46.2 46.0 359 -04052201.G#1 0 12.3 2404 -84 1771 261 33.8 0.6 -8.2 246 7.9 36.9 50.5 385 -04052201.SNY 0 7.0 484 -214 2287 78 62.8 0.0 -12.7 227 9.0 42.4 81.2 214 -04052123.HYS 0 12.7 3460 -27 2109 75 39.7 0.0 -10.8 236 8.6 29.0 45.1 157 -04052100.FKL 0 14.7 2440 -9 772 269 42.7 4.7 -10.6 299 6.4 28.6 49.2 346 -04052100.DEN 0 9.0 1781 -3 1934 76 49.3 0.1 -11.5 231 8.4 30.6 60.1 225 -04051723.DSM 0 13.3 1669 -24 854 23 36.8 0.2 -11.5 251 6.5 26.2 51.1 132 -04051723.PUB 0 9.2 546 -83 1212 147 55.3 0.5 -11.9 251 7.8 44.9 72.1 222 -04051601.9V9 0 7.5 608 -65 1315 120 61.8 0.5 -19.3 286 7.0 35.7 85.8 189 -04051521.PIR 0 6.8 724 -30 1545 91 60.8 0.3 -21.3 289 7.3 36.7 70.4 224 -04051520.Y26 0 7.0 965 -32 1206 89 60.4 0.7 -23.7 287 7.8 40.0 67.1 217 -99053023.P07 0 12.1 2286 -113 1897 53 39.7 0.1 -8.5 315 7.8 22.5 45.3 165 -99052800.FTW 0 12.2 1104 -4 954 41 33.8 0.3 -12.6 256 6.8 24.6 36.5 103 -99052503.FST 0 10.3 1116 -185 1882 122 53.5 0.0 -9.7 271 8.3 44.1 67.4 157 -99052502.INK 0 11.4 1576 -110 1665 119 56.3 0.4 -10.0 270 7.8 39.9 60.4 191 -99052420.ABQ 0 8.1 781 -71 1338 71 34.2 0.2 -13.9 212 8.5 24.7 44.7 132 -99052220.TUL 0 16.0 3471 -3 869 32 31.1 0.6 -12.1 269 7.3 20.4 36.1 91 -99052200.SNY 0 8.7 1439 -7 1674 53 48.7 0.2 -12.8 266 7.7 28.2 65.4 147 -99052123.RAP 0 8.6 1729 -70 1711 131 43.6 0.4 -16.2 256 8.7 23.0 67.0 178 -99052001.MOT 0 8.0 903 -1 1506 2 27.5 0.0 -17.4 240 7.0 14.4 59.7 47 -99051700.LAA 0 7.5 817 -141 1731 124 65.0 0.1 -15.0 234 8.6 43.8 78.0 361 -99050519.MVN 0 12.9 1777 -10 790 108 57.7 1.8 -14.1 237 6.6 41.0 44.8 194 -99043001.INK 0 12.4 2333 -60 967 95 52.8 1.8 -11.4 237 8.1 32.9 71.8 280 -99042900.BIL 0 6.5 60 -143 1109 133 46.8 0.0 -17.8 182 7.5 39.8 84.0 324 -99042800.EVV 0 9.5 305 -3 1146 22 26.2 0.0 -15.6 225 6.4 18.9 38.1 56 -99042701.OKC 0 8.9 873 -24 1056 47 27.4 0.2 -20.3 275 7.9 23.0 44.2 88 -99042322.LOZ 0 12.8 1995 -5 979 77 37.3 1.0 -11.6 287 6.9 30.4 44.4 71 -99042319.EZF 0 10.2 1142 -51 1722 106 57.2 0.3 -14.2 276 6.9 38.0 68.5 172 -99042203.GOK 0 12.3 2307 -132 894 364 53.9 3.4 -16.0 254 8.5 31.2 54.6 401 -99042123.BMI 0 11.6 1687 -24 839 261 53.4 3.9 -16.4 252 7.8 45.9 57.4 408 -04083002.GCK 0 10.7 1029 -108 1687 204 32.5 0.2 -8.1 315 6.8 29.0 26.2 278 -04083000.SUX 0 10.7 779 -7 1471 199 42.6 0.6 -12.9 289 6.7 36.3 45.9 296 -04082622.C23 0 10.2 983 -43 1349 25 41.1 0.1 -15.8 254 7.2 17.8 70.6 46 -04082621.MCW 0 15.4 2478 -27 1087 26 46.1 0.5 -9.9 239 7.0 37.9 68.9 181 -04082522.FSM 0 18.2 3688 -45 1240 101 33.9 1.6 -6.7 244 6.2 16.5 39.6 113 -04082522.BIS 0 10.2 2077 -41 1811 74 38.1 0.2 -15.2 230 8.4 22.8 43.2 103 -04082503.MHK 0 19.2 4217 -59 627 274 31.2 5.7 -7.9 224 7.5 31.4 51.8 392 -04082501.MHK 0 18.9 4262 -45 721 150 29.9 3.2 -7.4 240 7.1 28.3 50.9 241 -04082020.BGM 0 14.6 1425 -21 712 95 53.2 1.2 -9.5 238 5.9 38.1 53.7 106 -04082018.ORH 0 15.1 2067 -19 1051 47 40.0 0.6 -8.9 256 6.1 29.0 39.9 132 -04081918.LBE 0 14.4 1183 -7 597 105 39.9 0.8 -8.7 270 5.6 40.5 44.4 152 -04081901.PIA 0 13.9 1294 -107 1203 377 40.4 1.6 -7.9 277 5.6 39.8 43.3 465 -04081822.BRL 0 15.3 2600 -41 963 377 41.3 6.8 -9.4 276 6.6 42.5 42.9 508 -04081421.LIC 0 9.9 1288 -66 1242 15 32.2 0.1 -10.2 333 7.8 25.5 42.7 65 -04080321.OAX 0 18.7 4816 -44 1389 92 36.9 1.7 -5.9 259 7.0 23.6 38.1 189 -04080202.Y26 0 15.4 3187 -169 1209 336 55.2 1.6 -9.3 291 8.1 28.5 83.2 385 -04080123.Y22 0 8.5 1290 -28 3011 -1 45.9 0.0 -10.5 298 8.6 30.2 71.2 158 -04073101.GAG 0 14.4 2006 -116 1300 54 42.0 0.3 -6.2 308 6.7 14.8 44.7 98 -04072102.FSD 0 19.9 4659 -49 869 261 26.0 5.3 -5.9 278 7.3 28.0 37.4 426 -99081101.HLC 0 17.4 3928 -33 1289 71 38.3 1.3 -5.1 243 6.7 21.0 34.5 152 -99081023.AKO 0 14.9 2910 -32 1271 87 33.9 1.0 -6.5 232 7.6 22.7 45.7 163 -99080901.DIK 0 12.0 2409 -98 1891 48 58.5 0.1 -10.8 267 8.5 29.7 54.5 94 -99080822.2WX 0 10.3 1972 -32 2526 39 44.1 0.0 -8.8 262 8.3 27.2 41.0 117 -99080702.RAP 0 12.7 921 -36 1200 35 33.6 0.1 -6.6 268 6.3 20.0 48.7 72 -99080301.LWT 0 8.5 449 -155 1772 53 48.3 0.0 -10.3 278 7.8 29.4 70.4 131 -99073100.JKL 0 15.8 3605 -30 1833 89 22.3 0.0 -5.9 355 6.7 22.8 19.6 158 -99073020.IPT 0 15.0 2685 -12 1238 32 34.0 0.4 -8.7 319 6.3 16.0 50.7 72 -99072922.FVX 0 14.5 1431 -13 1556 81 34.3 0.3 -6.0 327 5.6 22.6 48.0 117 -99072902.XVG 0 12.7 1459 -186 1710 319 58.3 0.1 -9.5 302 7.7 41.9 73.8 381 -99072900.ADG 0 14.8 1974 -6 1415 63 37.3 0.5 -9.4 298 7.1 21.7 66.3 118 -99072420.MHT 0 14.8 1594 -17 1088 66 27.8 0.5 -9.7 275 6.5 25.2 56.1 134 -99072319.RAP 0 10.6 1320 -19 2145 52 38.7 0.0 -7.5 263 7.3 22.5 54.0 87 -99072300.FAR 0 16.2 2819 -34 1355 81 35.4 0.9 -8.5 247 7.6 27.9 55.9 137 -99071923.GDV 0 11.9 1807 -31 1654 21 41.3 0.1 -11.2 254 7.9 18.9 69.4 67 -99071302.FAR 0 12.1 1948 -48 1552 125 38.2 0.7 -12.5 297 7.2 27.2 61.0 158 -99071302.DVL 0 10.4 1453 -76 1761 69 42.5 0.1 -13.5 288 7.5 28.3 62.4 124 -99071300.OLF 0 9.2 1101 -38 2374 25 49.7 0.0 -10.3 281 7.3 26.5 65.7 106 -99071202.AIA 0 9.4 1094 -73 1844 -8 27.8 0.0 -11.3 327 8.0 26.7 47.0 79 -99070804.GDV 0 14.2 2058 -209 1364 472 61.7 0.0 -7.6 251 8.0 40.8 78.6 551 -99070421.ERY 0 19.1 3756 -61 791 95 32.9 1.8 -6.7 267 8.2 22.2 36.6 98 -99070207.SFD 0 9.5 32 -374 1535 254 82.4 0.0 -10.7 263 7.4 45.0 92.7 464 -99070103.SWO 0 18.3 2994 -18 703 229 51.1 5.8 -4.6 303 6.4 25.9 51.9 297 -99070103.GCK 0 15.2 2113 -124 873 95 73.0 1.0 -6.5 294 7.5 37.6 74.8 319 -99063023.LBF 0 9.7 291 -114 1136 0 76.3 0.0 -12.3 289 6.9 54.3 115.6 214 -99062801.BGD 0 13.8 2864 -63 2251 73 37.7 0.0 -5.0 266 8.5 22.5 43.1 130 -99062522.DIK 0 12.8 2775 -1 1732 -52 57.7 -0.4 -10.3 230 8.2 35.4 58.9 132 -99062501.VTN 0 11.7 1035 -41 1545 55 41.3 0.2 -8.2 282 6.6 23.6 41.7 120 -99062400.BGD 0 12.2 2544 -17 2195 10 13.6 0.0 -6.5 288 7.8 22.6 35.1 91 -99060601.P07 0 11.8 1543 -130 1771 -31 45.2 0.0 -8.7 243 7.9 18.4 58.3 32 -99060523.LBF 0 10.7 2070 -28 1957 91 62.6 0.1 -12.9 197 8.5 25.9 90.4 131 -99060302.IML 0 10.0 869 -198 1657 237 43.7 0.0 -11.0 225 8.5 39.8 66.5 421 -99060202.GCC 0 6.3 226 -83 1883 18 41.3 0.0 -15.4 262 8.3 26.0 42.6 126 -99060200.FTW 0 16.8 3982 -31 1338 62 35.0 1.0 -11.1 275 8.5 25.7 60.3 144 -99053102.MHK 0 11.6 903 -51 1360 108 32.8 0.3 -11.3 270 6.9 30.0 24.5 179 -99120303.ADM 0 9.7 1355 -50 974 250 42.8 2.4 -22.1 217 8.5 35.9 65.7 332 -99112303.RBD 0 13.2 1077 -16 789 138 48.1 1.2 -13.6 235 6.4 25.1 60.9 176 -99112302.HBR 0 8.7 124 -124 660 53 47.7 0.0 -17.1 219 6.7 41.5 75.7 132 -99100823.FSI 0 10.1 649 -14 1313 5 36.2 0.0 -13.6 219 6.3 14.3 67.9 56 -99092600.GKY 0 13.1 1483 -15 1429 43 28.0 0.2 -9.4 340 6.3 21.5 55.3 182 -99092522.D07 0 6.4 163 -199 2219 136 65.7 0.0 -15.8 242 8.3 31.8 105.7 206 -99092004.RRC 0 11.2 292 -200 1044 70 37.2 0.0 -11.2 270 6.7 28.8 60.6 216 -99092000.OKC 0 11.1 1068 -42 1896 56 39.5 0.0 -10.1 290 6.8 29.0 60.9 190 -99091923.CSM 0 11.9 1645 -3 1885 18 41.3 0.0 -9.8 280 7.0 27.5 64.0 178 -99091920.CGZ 0 11.2 802 -16 1905 19 39.1 0.0 -8.7 245 6.5 16.0 60.3 61 -99091207.SLP 0 15.6 2094 -69 507 92 45.4 1.3 -10.8 271 8.2 16.8 55.8 121 -99091200.LBL 0 11.9 1180 -121 1590 31 43.2 0.1 -9.0 275 7.8 25.7 65.5 84 -99091122.HLC 0 12.4 1517 -36 1221 59 37.8 0.4 -11.3 253 7.4 21.0 66.2 94 -99091101.AFW 0 13.1 1250 -24 1970 21 29.5 0.0 -7.4 297 6.2 21.7 52.8 139 -99082300.ABR 0 11.7 1432 -38 1851 61 40.1 0.1 -9.6 289 6.9 20.3 45.5 101 -99082104.HON 0 13.3 1187 -244 1155 197 38.1 0.0 -8.9 281 7.4 31.4 54.2 238 -99082100.LBF 0 9.8 20 -311 1794 44 34.8 0.0 -7.8 321 7.1 19.7 46.1 126 -99082022.DIK 0 11.7 1445 -10 1669 21 33.6 0.1 -7.8 298 6.3 17.8 36.0 58 -99081922.MLS 0 7.1 393 -105 3278 19 33.8 0.0 -10.0 244 8.6 22.0 37.3 120 -99081800.RRT 0 11.4 1524 -26 847 90 49.2 1.1 -17.7 268 7.3 32.2 62.0 126 -99081400.ALB 0 16.8 1843 -4 701 196 38.5 2.3 -6.3 249 5.8 29.9 48.4 252 -99081202.GCC 0 10.6 877 -99 1162 63 34.5 0.2 -10.2 218 7.5 17.7 54.6 98 +FILENAME CAT MLMIXR ML CAPE ML CIN MLCL(MAGL) 0-1SRH 0-6KT STPC 500 T (C) 500DIR 7-5 LR 0-3(KT) 0-9(KT) 0-3 KM SRH (M2/S2) +00042320.TXK 2 12.9 1702 -1 657 134 61.7 2.3 -14.0 250 6.5 32.8 76.6 166 +00042001.PPF 2 13.5 2614 -50 1216 227 59.9 4.7 -12.9 234 7.5 39.7 73.5 244 +00032900.FTW 2 13.1 2058 -42 1069 83 49.7 1.3 -15.2 245 8.0 21.9 87.1 126 +00032304.SJT 2 11.9 1680 -119 896 119 61.1 1.1 -15.5 212 9.1 38.4 66.9 217 +00031622.ATT 2 9.4 1019 -7 1566 12 45.8 0.0 -17.5 249 8.0 34.4 53.7 159 +00021323.LRF 2 9.2 1256 -9 1066 82 46.9 0.8 -21.2 249 7.5 32.3 51.4 114 +00010323.MEI 2 13.4 1148 -15 769 241 57.2 2.6 -10.0 226 6.1 38.8 71.2 288 +00010319.GWO 2 12.8 1168 -9 770 202 66.4 2.4 -13.0 223 7.5 47.3 75.1 246 +03050500.UMN 2 13.8 2392 -10 773 341 66.3 8.2 -13.4 237 7.7 49.1 93.8 411 +03050500.JBR 2 15.7 2713 -22 862 266 57.8 6.9 -10.7 240 7.1 50.5 82.9 440 +03050421.TUL 2 16.1 3621 -15 843 147 63.1 5.3 -11.7 230 7.3 45.6 100.2 160 +03050421.MKC 2 13.7 2002 -67 478 479 68.4 8.5 -14.6 224 7.9 48.1 89.8 508 +03050420.P#F 2 15.7 3397 -1 660 166 58.5 5.5 -12.7 230 7.8 34.3 100.9 195 +03050321.P#T 2 12.7 3156 -2 1967 61 36.2 0.0 -9.8 247 7.5 27.2 67.1 207 +03042503.JAN 2 13.5 2568 -27 924 257 44.3 4.9 -15.4 255 7.7 41.1 76.9 279 +03041922.PNC 2 11.5 1157 -40 665 212 87.9 2.5 -17.9 223 7.3 46.5 111.5 242 +03041523.CDS 2 10.7 1020 -106 1534 326 74.0 1.0 -12.4 234 7.5 56.1 83.8 531 +03041522.LBB 2 8.8 883 -53 1986 116 77.2 0.0 -11.7 243 7.5 48.5 87.4 276 +03040702.CLN 2 13.1 488 -133 780 363 62.7 0.8 -11.4 244 7.1 33.6 74.1 411 +03040623.ESF 2 15.8 1847 -29 621 166 51.8 2.6 -11.0 246 6.8 26.8 50.8 161 +03032722.MIA 2 12.4 299 -31 1074 187 48.8 0.4 -10.5 261 5.8 20.5 87.0 197 +01061900.ROS 2 13.6 2218 -30 1076 140 67.7 2.9 -11.1 250 8.2 40.5 73.6 279 +01061401.LNK 2 17.2 4665 -15 1190 173 39.2 4.3 -10.5 215 8.3 32.6 50.7 217 +01061120.ILL 2 14.7 3400 -120 1255 270 56.1 3.4 -10.8 259 8.6 41.9 54.8 448 +01060222.LOZ 2 9.7 164 -10 898 117 51.4 0.2 -13.4 270 5.3 39.8 66.8 189 +01053000.AMA 2 13.0 2887 -76 1322 166 48.4 2.2 -10.1 246 8.4 38.6 50.6 216 +01052902.LHX 2 10.9 1698 -120 1285 185 52.1 1.0 -10.0 251 8.2 38.9 60.5 365 +01052118.OZW 2 12.5 494 -2 775 133 33.4 0.4 -10.3 188 5.6 34.2 36.9 174 +01052022.MIN 2 16.9 3331 -2 711 122 47.8 3.2 -11.0 244 7.3 36.0 67.7 201 +01051022.MIW 2 12.8 2912 -24 1091 65 36.4 1.0 -16.0 255 7.9 28.8 43.0 141 +01051001.FBL 2 9.5 2106 -90 1776 330 50.0 1.0 -16.6 265 8.2 42.9 50.3 516 +01050200.AUM 2 11.2 1434 -74 1331 179 38.8 0.9 -13.3 251 7.5 36.0 52.3 237 +01042202.GBD 2 12.6 2145 -40 777 165 61.8 3.5 -13.6 229 7.8 41.6 62.6 328 +01041423.P28 2 12.3 2168 -54 827 145 76.4 3.1 -16.2 256 8.3 45.0 89.5 235 +01041117.LWD 2 11.9 968 -3 632 282 77.0 2.7 -15.1 208 7.5 38.2 81.4 327 +01040918.BVI 2 10.7 1326 -11 1210 102 57.2 1.0 -15.4 266 7.7 32.1 32.1 174 +01022422.SGT 2 11.8 1020 -15 967 335 52.8 3.0 -14.3 213 7.7 53.6 64.9 450 +00110820.HEZ 2 15.9 2158 -6 881 236 47.1 4.0 -8.5 204 6.2 29.0 68.5 266 +00103122.HLC 2 11.0 1274 -14 954 110 47.4 1.1 -14.1 202 7.4 32.6 74.4 169 +00092022.DAY 2 13.9 1299 -7 971 215 63.4 2.8 -8.2 237 6.1 37.5 61.0 237 +00072601.OTG 2 14.5 2869 -49 1055 88 42.5 1.7 -12.6 290 7.2 33.4 41.3 161 +00072523.RWF 2 14.6 2791 -13 1068 96 39.4 1.6 -12.0 275 7.0 29.2 35.8 163 +00071122.BKX 2 14.7 1167 -47 944 134 42.8 1.1 -7.8 261 6.8 27.2 67.9 205 +00070601.SNY 2 13.6 2847 -18 1681 52 57.5 0.5 -7.4 248 8.1 19.0 74.4 122 +00052319.BWG 2 13.7 2114 -41 1128 167 38.6 2.0 -11.4 294 6.9 36.9 62.8 278 +00051722.LXN 2 14.0 3552 -16 910 111 27.5 1.8 -13.9 169 8.4 28.1 44.5 170 +00051200.ALO 2 16.5 4382 -13 1110 168 51.1 5.6 -7.9 254 6.7 33.2 51.6 199 +00050101.MWL 2 13.0 2207 -103 1176 253 47.3 2.4 -12.4 227 8.2 40.3 37.8 297 +00042323.SHV 2 13.4 2001 -19 928 216 58.9 4.2 -13.0 261 6.7 41.9 60.0 296 +04051923.GFK 2 11.2 967 -44 828 233 54.9 2.1 -16.6 243 7.2 39.5 86.1 229 +04051302.ICT 2 15.9 3157 -12 538 223 36.4 4.3 -9.4 232 6.4 23.8 51.5 245 +04051101.LIC 2 9.0 1549 -59 1592 233 43.4 1.0 -11.5 244 8.4 35.1 46.6 395 +04042022.PIA 2 12.4 1852 -11 728 320 36.4 3.6 -14.7 235 6.2 38.5 40.1 488 +04032718.DDC 2 10.0 1332 -8 893 190 41.4 1.7 -16.6 206 7.5 30.8 47.5 198 +04030418.ABI 2 10.7 626 -20 1108 319 46.5 1.4 -13.7 196 7.0 40.3 84.2 350 +03111718.HOU 2 16.4 1980 -1 445 137 48.2 2.2 -12.4 207 6.6 24.0 77.0 158 +03111223.MFD 2 8.3 64 -56 890 219 99.1 0.1 -15.7 261 5.7 55.1 123.1 275 +03111220.MIE 2 9.7 388 -1 757 123 91.0 0.5 -15.6 258 5.7 47.1 117.3 205 +03082201.JXN 2 17.2 3046 -36 1091 255 31.0 3.6 -5.9 285 6.6 34.4 33.2 304 +03072122.AVP 2 14.3 1810 -16 1228 162 51.1 1.9 -7.9 239 5.6 45.7 49.9 148 +03072104.CID 2 17.8 2344 -22 462 187 48.9 3.6 -7.0 291 7.0 34.2 63.6 237 +03072101.ALO 2 15.0 1859 -107 921 156 49.6 1.5 -8.0 297 7.0 28.2 58.2 248 +03062500.HON 2 17.0 3737 -23 1021 335 52.2 10.7 -7.4 227 7.5 43.4 61.6 550 +03062422.MHE 2 19.5 5088 -22 717 256 55.5 12.1 -8.0 228 7.9 40.9 58.4 422 +03062421.MHE 2 17.5 3584 -16 768 252 56.0 8.4 -7.9 220 7.8 38.8 57.2 348 +03062302.P#8 2 16.8 3414 -169 1003 367 38.7 1.7 -6.8 227 7.6 30.2 57.1 437 +03062223.P#8 2 17.7 4366 -39 972 253 38.8 7.2 -8.3 246 8.6 34.3 54.7 387 +03061001.P#9 2 12.6 2103 -97 1467 421 51.0 2.8 -11.2 266 7.9 45.5 63.9 651 +03053103.CMI 2 12.6 701 -119 899 482 64.7 1.8 -11.6 292 6.3 36.9 85.1 523 +03053101.ILX 2 12.4 784 -55 1108 474 76.0 3.2 -8.5 294 5.0 45.0 90.9 524 +03051100.UIN 2 14.7 2093 -27 738 302 63.1 6.3 -11.7 240 7.7 43.7 97.9 354 +03051004.C34 2 17.3 3493 -14 749 452 53.6 14.1 -8.8 228 7.7 32.1 77.0 511 +03050923.HBR 2 11.1 1389 -64 2135 137 56.8 0.0 -9.1 231 7.7 35.8 78.1 219 +03050900.C30 2 14.6 1749 -112 819 321 69.8 3.3 -8.9 227 6.8 57.0 72.2 306 +03050823.C34 2 17.9 3605 -25 669 342 65.2 12.3 -7.2 233 7.1 42.3 72.0 318 +03050822.W#N 2 17.4 3730 -13 635 141 70.0 5.3 -10.1 228 7.6 45.5 81.3 173 +03050821.LW1 2 19.1 5309 -6 876 145 63.2 7.7 -8.7 235 7.4 31.6 71.3 182 +03050807.ADM 2 17.1 3114 -53 730 439 47.4 10.6 -9.3 253 8.0 50.2 61.5 608 +03050805.SPS 2 16.0 2409 -148 836 382 44.4 2.4 -9.1 262 7.9 43.1 59.0 798 +03050703.PAH 2 15.8 2873 -49 602 390 36.8 6.9 -13.6 237 7.9 35.3 70.1 454 +03050701.CGI 2 15.1 2935 -47 799 431 61.0 12.6 -14.4 269 7.8 32.8 83.2 580 +03050504.MKL 2 15.6 2334 -16 833 615 59.6 14.3 -9.9 251 7.1 62.0 77.1 842 +03050501.LZK 2 15.9 2390 -18 719 361 67.0 8.6 -11.0 237 7.4 41.7 97.3 397 +99120301.GOK 2 10.2 1811 -12 858 234 47.2 3.3 -21.1 202 8.2 32.4 63.0 262 +99081601.JMS 2 13.6 1255 -165 1044 130 48.5 0.3 -9.9 240 8.1 30.2 89.4 174 +99070900.ONA 2 18.4 3379 -18 992 385 46.0 10.0 -5.8 275 6.5 42.9 49.4 571 +99070400.OSC 2 15.9 1760 -27 1078 101 26.7 0.7 -6.7 320 6.2 28.3 31.6 163 +99060620.HCO 2 14.6 3241 -5 904 65 29.6 1.0 -16.1 175 8.1 26.8 70.8 115 +99060500.IEN 2 12.1 2533 -37 1323 70 52.4 1.0 -11.4 201 8.2 32.9 60.1 191 +99060400.HLC 2 15.7 4348 -16 1101 154 38.3 3.9 -9.3 240 7.5 36.9 40.6 277 +99060200.TBN 2 14.9 2338 -19 838 136 37.3 2.0 -10.3 259 6.5 40.0 21.6 223 +99060123.MKO 2 17.3 3739 0 888 68 38.1 1.6 -10.6 279 7.9 32.2 23.0 135 +99060100.LIC 2 9.1 1877 -49 1439 56 56.8 0.6 -13.7 249 9.2 34.3 62.4 140 +99051621.OMA 2 16.1 4691 0 824 102 38.6 3.1 -14.5 223 8.8 33.7 41.5 176 +99051122.BMQ 2 15.0 3545 -92 1026 40 35.1 0.6 -12.3 259 8.0 21.8 29.6 59 +99050408.JCT 2 13.0 2082 -218 838 355 55.0 0.0 -11.2 254 8.3 46.8 58.7 506 +99050402.GOK 2 13.9 3154 -61 723 366 51.4 9.2 -14.6 240 8.2 36.8 57.5 441 +99050401.ICT 2 12.6 2748 -7 1016 257 31.8 3.7 -14.7 227 7.9 40.5 70.4 415 +99050323.OKC 2 15.2 4117 -15 733 308 43.5 9.2 -13.2 243 7.8 43.2 70.1 401 +99050300.HSI 2 8.0 203 -4 845 168 41.5 0.2 -17.7 222 6.7 28.6 32.1 221 +99042200.END 2 12.7 3301 -34 1156 225 46.1 4.8 -15.4 236 8.1 35.1 48.2 242 +04082700.RDD 2 18.4 3706 -37 940 184 41.0 4.7 -6.9 255 7.1 28.7 60.7 258 +04071823.GFK 2 16.7 3575 -36 1246 117 45.4 2.4 -7.9 310 6.8 35.1 45.5 292 +04071302.GRI 2 15.9 3090 -197 1538 152 29.0 0.0 -7.9 298 8.5 13.8 50.5 173 +04062402.OSH 2 11.1 1428 -30 700 187 62.2 2.7 -16.7 257 6.5 50.9 79.3 234 +04061620.LAA 2 12.3 1494 -63 908 129 51.4 1.5 -9.4 252 7.7 34.1 57.1 369 +04061300.W#N 2 16.4 3866 -17 1255 231 34.6 3.8 -9.2 251 7.9 37.4 44.2 387 +04060701.MOT 2 10.4 295 -316 1541 461 68.3 0.0 -8.4 254 6.7 33.2 82.6 561 +04060621.C02 2 9.9 1824 -59 2285 83 55.5 0.0 -10.8 234 7.9 39.7 69.2 64 +04053023.IND 2 17.3 2618 -10 577 361 58.6 9.2 -9.1 248 6.9 35.7 45.1 369 +04053020.SDF 2 16.6 2653 -2 807 250 52.4 5.8 -9.4 245 6.8 37.1 41.1 317 +04053002.OKC 2 15.5 2559 -32 1162 314 55.7 6.2 -7.3 244 7.0 35.6 70.5 434 +04053002.ICT 2 16.1 3240 -98 992 315 44.2 5.1 -10.4 245 7.9 25.8 56.2 399 +04053000.MCI 2 16.0 3437 -5 863 239 36.5 5.0 -12.8 232 8.3 27.4 42.9 372 +04052922.C33 2 16.5 4081 -4 1356 126 51.4 2.8 -7.8 244 7.4 36.9 74.7 248 +04052921.TOP 2 16.1 3843 -13 936 78 32.5 1.6 -12.5 233 8.0 17.3 39.0 190 +04052421.STJ 2 15.6 3982 -40 991 76 40.4 2.0 -11.9 234 7.7 26.3 67.6 270 +04052300.P#8 2 15.0 3882 -47 1262 228 54.5 5.9 -10.5 233 7.9 34.1 69.9 334 +04052221.MCK 2 13.2 3453 -37 1185 103 72.0 2.9 -12.3 231 8.6 35.5 82.5 224 +04052219.GLD 2 9.9 1898 -54 1700 22 59.0 0.1 -12.7 233 8.4 12.6 69.5 76 +04052122.CID 2 15.4 2960 -48 971 309 36.6 5.6 -11.5 268 7.4 36.1 50.0 390 +53031321.FWH 2 10.8 727 -98 981 119 51.2 0.5 -16.3 248 8.1 30.6 80.9 266 V +55052521.LTS 2 15.0 4060 -25 1509 322 66.4 6.4 -12.3 225 8.6 37.0 53.5 355 V +56041521.GUN 2 11.7 1189 -11 1302 251 72.4 2.1 -13.6 230 7.3 55.7 66.8 370 V +57040221.FWH 2 13.2 3580 -3 942 94 35.8 2.0 -15.8 189 7.9 26.1 52.8 122 V +57052021.TOP 2 14.0 2801 -2 920 142 55.7 3.7 -13.8 207 7.7 48.0 77.2 228 V +57052121.BYH 2 15.7 2854 -5 1106 236 49.7 5.0 -10.9 230 7.2 33.0 92.5 240 V +57061418.PIA 2 15.9 2118 -6 986 394 50.0 7.0 -8.6 252 6.9 52.8 52.1 496 V +59040100.FWH 2 12.6 3068 -26 987 124 42.8 2.7 -17.6 247 9.0 28.0 61.5 142 V +61050800.FSM 2 14.5 2844 -7 1215 261 61.7 5.8 -11.4 240 7.5 42.2 65.9 323 V +61050600.FSM 2 14.3 2667 -12 1121 245 65.5 5.8 -13.1 240 8.3 61.7 43.1 430 V +62052600.OKC 2 14.3 4171 -76 1591 154 33.3 1.2 -12.0 264 8.6 25.3 43.2 228 V +62080700.TOP 2 20.6 6024 -12 1167 160 42.3 5.7 -7.3 250 7.7 32.4 60.6 243 V +64050600.OMA 2 12.7 2395 -61 1048 349 68.6 7.4 -13.8 224 8.8 54.6 89.3 498 V +65041200.FNT 2 11.2 1814 -1 974 166 91.0 3.0 -17.7 250 7.7 46.4 91.6 372 V +66042800.FWH 2 14.1 3342 -17 1291 148 38.0 2.2 -11.8 265 7.2 39.3 49.0 269 V +66030400.HKS 2 12.2 1434 -10 831 138 47.6 1.6 -14.0 234 7.6 49.0 77.8 142 V +67061100.OKC 2 14.4 3497 0 1569 144 32.2 1.2 -11.0 235 8.7 35.0 51.1 260 V +68110400.VPS 2 12.8 1596 -2 812 129 50.5 1.7 -13.4 251 5.9 30.3 72.0 184 V +69041806.VPS 2 15.2 1013 -8 445 370 55.8 3.5 -11.0 248 6.9 42.3 73.3 439 V +69062400.TIK 2 18.4 4403 -4 776 317 37.5 8.7 -9.4 240 7.5 45.3 56.2 431 V +70100600.TIK 2 13.7 1865 -3 772 241 41.1 3.1 -12.2 230 6.7 35.4 55.6 335 V +71022200.JAN 2 12.8 938 -4 930 470 74.7 4.4 -11.8 211 6.7 57.8 77.3 590 V +73052800.MGM 2 16.4 2337 -2 1017 293 53.5 6.0 -7.9 239 6.2 45.6 45.2 386 V +73041600.VCT 2 15.4 2861 -37 1272 385 48.1 6.4 -12.9 231 8.1 35.7 72.2 377 V +74040400.MGM 2 14.8 2955 -2 1017 161 52.0 4.1 -12.8 235 8.2 39.5 59.4 253 V +74040400.BNA 2 14.6 2744 -31 970 209 77.8 5.7 -13.3 238 7.8 57.0 80.2 301 V +74040400.DAY 2 12.8 2185 -7 986 619 90.8 13.5 -13.1 235 7.1 71.9 91.6 919 V +75042500.UMN 2 15.7 5306 -1 837 145 53.3 6.8 -13.8 255 7.3 41.6 61.8 185 V +74060900.UMN 2 17.0 3643 -2 987 363 37.0 8.1 -6.7 231 7.6 41.4 27.5 508 V +75063000.BIS 2 13.6 3158 -76 1566 198 41.8 1.6 -12.3 233 8.6 26.8 55.7 204 V +76042000.SEP 2 13.7 3326 0 1092 305 45.1 6.9 -14.1 240 7.6 33.7 48.9 358 V +77040418.CKL 2 14.1 1633 0 994 247 66.8 4.0 -9.8 231 6.0 52.7 80.0 333 V +78060100.TOP 2 16.2 4279 -1 1160 267 35.7 5.7 -12.7 233 7.6 36.3 57.0 349 V +79041021.SEP 2 12.8 2186 -9 912 345 48.2 6.1 -13.1 228 8.1 42.9 54.3 468 V +79050300.OKC 2 13.9 2775 -4 877 218 73.2 6.0 -12.3 246 7.2 57.7 103.2 279 V +79033000.OMA 2 10.1 1322 -24 1155 223 56.4 2.4 -15.8 232 7.1 49.1 52.9 345 V +80040800.UMN 2 10.2 2256 -3 1473 97 39.6 0.8 -18.5 236 8.4 39.7 92.1 247 V +84060800.TOP 2 16.2 2284 -16 918 560 74.0 12.8 -6.0 237 6.2 49.1 84.6 705 V +84031600.1M1 2 12.2 2339 -1 1056 250 47.1 4.3 -14.9 251 6.9 30.4 55.5 292 V +86072900.OMA 2 16.4 4252 -21 1667 112 48.4 1.3 -10.6 268 8.6 28.2 81.3 151 V +87111600.GGG 2 12.8 1593 -8 723 298 61.9 4.8 -15.3 178 7.9 43.3 65.2 326 V +90061600.LBF 2 16.1 3827 -1 1050 21 42.1 0.5 -10.6 185 8.5 24.5 74.1 95 V +90060300.PAH 2 15.6 2246 -3 1039 274 47.1 4.7 -7.6 251 7.0 57.8 49.8 384 V +91042700.OUN 2 15.8 4387 -8 898 195 50.3 7.2 -11.5 242 7.0 44.2 54.9 370 V +92062800.AMA 2 14.6 3148 -3 1020 83 44.3 1.9 -10.3 249 7.9 32.7 52.7 220 V +92061700.OVN 2 18.7 4878 -1 1119 262 50.4 9.5 -6.5 237 6.9 46.6 64.6 473 V +93042500.OUN 2 11.6 2675 0 1209 113 49.6 2.0 -14.6 235 6.9 35.5 65.5 168 V +93050700.TOP 2 13.7 2046 -7 666 484 58.8 9.7 -13.1 217 7.0 55.4 51.4 644 V +93060700.LBF 2 15.9 4738 0 930 328 59.3 15.3 -8.6 229 7.6 41.9 67.6 583 V +94042600.SEP 2 12.9 2562 -34 1365 201 51.9 2.8 -11.5 258 7.4 41.3 51.0 198 V +95051900.BMX 2 15.7 2868 -5 989 239 39.3 4.5 -9.9 247 6.7 31.9 49.1 230 V +98040900.BMX 2 14.6 2259 -18 642 136 77.9 3.1 -13.9 240 7.9 50.3 100.1 290 V +98041700.BMX 2 14.7 2038 0 704 263 73.4 5.4 -11.9 245 6.8 36.3 98.6 327 V +99050400.OUN 2 13.4 3644 -22 1050 271 41.4 6.5 -14.9 225 8.4 32.0 37.7 343 V +00121618.BMX 2 12.0 1369 -1 737 279 66.9 3.8 -14.1 220 6.7 51.3 90.8 339 V +00092100.ILN 2 12.5 747 -19 1280 611 75.3 3.3 -7.5 240 5.4 64.7 73.0 810 V +01061400.OAX 2 16.8 4639 -1 1278 127 38.6 2.8 -11.3 215 9.0 35.2 48.5 145 V +01112412.JAN 2 13.0 1392 -2 773 366 50.4 4.3 -10.1 225 5.7 52.4 48.8 504 V +01112418.BMX 2 13.4 1498 -1 655 227 52.0 3.0 -11.3 220 6.1 43.1 61.9 319 V +02111018.ILN 2 11.3 1239 0 734 385 54.4 4.3 -13.7 230 6.6 49.5 103.8 417 V +02062400.ABR 2 17.1 4378 0 1112 85 50.6 2.8 -10.5 245 8.2 29.8 57.9 153 V +03050900.OUN 2 17.0 3871 -32 990 336 62.0 13.0 -6.9 235 6.3 53.9 80.1 364 V +94032718.CKL 2 15.5 1965 0 743 344 72.9 6.8 -9.1 233 6.3 54.7 56.0 403 V +81052300.OKC 2 13.1 2411 -70 1142 203 49.1 3.0 -13.7 235 9.0 37.6 49.1 249 V +65041100.LIT 2 12.7 1815 -1 1365 140 52.3 1.4 -11.1 248 7.2 39.4 64.4 212 V +53051121.FWH 2 13.2 1452 -55 1150 122 53.0 1.3 -11.2 248 7.3 40.4 64.4 209 V +90082900.PIA 2 21.0 6470 -2 974 110 33.6 4.0 -7.3 297 7.1 23.3 54.6 147 V +55042411.GUN 2 13.1 1784 -7 917 345 68.7 6.2 -12.7 248 7.1 44.1 85.9 375 V +56040321.HKS 2 13.0 1491 -14 1212 173 82.1 2.0 -12.4 221 7.5 52.1 107.5 267 V +56051221.MTC 2 13.8 2444 -8 1001 124 69.2 3.0 -14.4 266 7.5 25.2 94.3 162 V +60052000.TOP 2 14.3 3120 -23 1112 167 43.1 3.3 -13.3 213 8.2 32.6 58.1 244 V +66060900.TOP 2 15.9 2226 -24 819 296 59.5 6.5 -8.6 223 7.1 47.3 69.8 397 V +68082000.GRB 2 16.1 2780 -11 1217 173 50.0 3.1 -7.3 258 6.4 27.0 43.6 195 V +74040318.BNA 2 13.0 2906 -5 1157 205 63.1 5.0 -15.5 229 8.2 48.6 76.4 333 V +61051500.PIA 2 12.4 1259 -2 817 196 68.7 2.5 -13.0 202 6.6 36.7 80.9 205 V +54050121.TIK 2 13.0 1988 -17 709 242 56.2 4.5 -13.5 203 8.0 39.2 73.2 282 V +55060421.SLN 2 13.4 3594 -5 1422 36 25.3 0.3 -12.7 225 7.9 23.8 30.4 152 V +70061300.COU 2 16.5 3499 -11 949 204 64.2 7.2 -7.8 246 5.5 49.6 57.1 318 V +76032700.1M1 2 11.8 1820 -17 961 187 41.8 2.4 -17.1 230 8.2 57.3 71.8 243 V +04071318.ILX 2 19.0 4958 -10 1102 117 37.5 3.3 -10.9 305 7.9 33.8 45.3 197 V +68051600.LIT 2 15.6 2612 -4 971 250 52.8 5.7 -11.7 260 8.6 45.5 72.5 337 V +65031700.OKC 2 11.1 1628 -3 687 269 91.0 4.4 -17.9 235 7.1 58.8 114.4 325 V +00061300.DIK 1 11.1 1786 -3 1286 88 51.7 1.0 -13.3 237 7.5 40.6 50.2 180 +00061122.MOT 1 11.3 2235 -22 1420 120 55.4 1.4 -14.8 231 7.6 39.0 57.9 252 +00060802.JDN 1 7.4 755 -232 3045 106 49.5 0.0 -10.8 230 8.9 34.6 71.9 282 +00060402.OFK 1 10.0 668 -199 1628 156 44.9 0.0 -11.7 284 7.7 38.1 49.1 406 +00060402.NFW 1 16.8 1734 -9 639 117 28.9 1.0 -7.5 270 5.9 23.5 32.0 202 +00052719.MAR 1 16.0 4104 -12 1610 26 26.6 0.2 -12.4 258 8.8 17.5 43.3 95 +00052700.THK 1 14.7 3226 -62 1771 46 35.7 0.2 -9.0 238 8.3 28.1 55.2 83 +00052700.ADK 1 15.9 4170 -7 1457 60 38.4 0.9 -10.1 248 7.9 22.8 55.2 91 +00051202.LWC 1 16.0 3233 -93 1098 243 43.4 3.7 -7.0 245 6.5 28.2 57.5 246 +00050802.RWF 1 11.7 1550 -17 1609 79 45.4 0.4 -12.5 230 7.1 29.3 54.1 203 +00050702.TOR 1 8.6 1203 -94 1663 106 57.4 0.3 -15.3 235 9.1 39.5 72.5 258 +00042622.ONL 1 6.5 337 -109 1466 129 40.6 0.1 -21.7 284 8.4 30.1 73.0 229 +00042118.EZF 1 10.3 898 -4 877 28 58.9 0.3 -17.2 220 6.6 30.7 62.4 94 +00032902.CRS 1 14.5 2234 -6 743 161 50.8 3.0 -14.0 258 7.8 26.8 92.5 244 +00032823.DTO 1 12.9 2286 -24 1256 75 45.3 1.0 -14.5 246 7.7 20.6 88.2 121 +00032701.BAZ 1 14.1 1797 -31 945 101 61.6 1.8 -10.9 294 7.0 32.6 86.8 184 +00032623.MLC 1 11.7 1998 -24 1176 73 50.5 1.0 -14.4 296 6.9 29.7 68.1 193 +00032221.UPT 1 11.4 2370 -12 1181 167 63.0 3.2 -15.3 196 8.2 44.6 83.1 213 +00032207.ODO 1 11.4 1900 -1 561 280 54.6 4.9 -16.5 195 8.4 45.8 80.2 519 +00032207.DRT 1 13.4 2593 -107 837 215 40.0 2.3 -14.9 225 8.9 40.7 64.3 569 +00032201.DYS 1 9.6 140 -194 1028 77 44.2 0.0 -12.2 197 6.4 33.8 61.9 126 +00031523.END 1 9.1 877 -2 1153 56 37.8 0.3 -16.7 241 6.6 26.4 36.5 119 +00031023.BMQ 1 12.1 2702 -18 1209 70 48.2 1.2 -14.5 275 7.6 28.5 52.2 143 +00030823.MKE 1 11.0 1510 -13 1038 185 54.8 2.5 -16.1 213 6.7 42.7 47.9 221 +00030208.MAF 1 11.4 1969 -62 631 373 64.7 6.7 -16.7 225 8.8 39.2 68.5 410 +00022502.ARN 1 11.3 2487 -19 846 226 54.1 5.1 -16.8 208 8.1 38.3 67.9 247 +00022303.DLF 1 8.7 884 -128 1728 29 68.1 0.0 -16.1 277 7.8 32.4 70.9 86 +01042100.SUX 1 8.8 765 -22 1661 84 43.9 0.2 -16.8 206 7.9 27.0 64.5 204 +01041123.BIV 1 12.3 587 -74 777 368 64.3 1.8 -11.6 220 5.9 42.8 48.1 410 +01041107.ADH 1 11.8 556 -140 952 259 56.9 0.5 -12.1 207 7.2 40.1 68.6 271 +01041100.SUS 1 13.7 2171 -35 926 93 64.4 2.0 -12.3 258 6.5 38.6 74.7 252 +01041022.SZL 1 14.3 2693 -55 696 170 63.3 4.4 -12.9 245 6.7 37.7 83.2 242 +01040923.PIA 1 11.9 2755 -12 1469 63 57.1 0.9 -15.8 272 7.5 28.4 73.8 164 +00111220.HYI 1 15.0 1358 0 575 130 66.4 1.8 -11.5 257 7.0 30.5 99.4 240 +00110822.TUP 1 14.5 1023 -4 743 229 62.2 2.3 -9.9 225 6.6 34.8 71.9 291 +00110121.BIS 1 8.9 739 -22 512 134 42.6 0.7 -21.9 135 8.3 30.9 61.9 177 +00103122.FNB 1 12.8 1776 -6 916 106 37.0 1.2 -13.0 217 6.9 22.0 45.0 157 +00102922.LNK 1 10.2 657 -14 724 192 49.1 1.0 -16.4 188 6.2 32.0 43.8 218 +00102919.AUH 1 8.7 191 -3 740 83 38.8 0.1 -16.4 158 6.1 31.7 39.6 118 +00102900.JCT 1 12.1 704 -63 868 232 49.5 1.2 -10.5 218 7.0 32.5 72.8 338 +00102818.GOV 1 11.9 922 -5 443 156 35.8 0.9 -12.3 192 6.7 29.9 31.1 195 +00102423.ODO 1 12.0 1308 -7 918 73 40.2 0.6 -11.4 215 7.4 30.0 51.0 103 +00102300.TIK 1 13.8 1236 -5 453 143 32.3 1.0 -11.8 212 6.3 24.0 44.2 171 +00102123.WLT 1 12.4 655 -43 561 114 29.4 0.4 -11.7 196 5.0 24.0 39.6 153 +00090201.GXY 1 10.1 1399 -61 1894 64 48.6 0.1 -8.8 219 8.0 24.5 58.2 133 +00081501.OEO 1 16.6 2661 -111 1084 275 47.1 3.1 -7.7 281 7.5 38.3 69.3 408 +00072500.ANW 1 14.5 3660 -50 1579 99 43.1 1.1 -9.2 307 8.3 23.5 62.3 152 +00072302.LAA 1 11.0 1368 -108 1806 33 48.7 0.0 -8.9 325 7.7 25.9 61.1 115 +00072104.P28 1 14.3 1660 -216 1167 146 41.4 0.0 -9.2 286 7.8 30.2 58.9 374 +00072004.GLD 1 12.8 1625 -153 1450 69 50.3 0.2 -8.9 286 8.4 26.3 57.9 113 +00071823.SUS 1 17.9 2488 -23 946 101 35.0 1.5 -7.4 262 6.2 32.7 35.7 194 +00071023.GGW 1 11.5 1838 -22 1490 19 53.5 0.2 -11.1 239 6.6 29.9 73.1 81 +00070823.RPD 1 18.8 4320 -44 798 124 39.2 3.5 -8.3 282 6.7 21.3 43.9 183 +00070802.LJF 1 19.5 4388 -7 680 348 43.9 11.2 -9.0 258 8.4 34.1 50.6 438 +00070600.OVE 1 7.4 115 -46 1571 14 34.5 0.0 -17.8 243 7.0 10.2 60.4 40 +00070400.MCK 1 14.2 1661 -19 1452 131 41.3 0.8 -6.2 236 6.6 26.2 46.5 200 +00070222.RYV 1 15.9 2122 -22 737 96 36.0 1.2 -9.2 288 5.9 30.2 35.4 223 +00062923.GLD 1 11.9 2724 -35 2040 95 44.6 0.0 -10.0 295 8.8 34.1 62.4 180 +00062522.AMA 1 13.7 3217 -9 2155 26 36.2 0.0 -6.9 271 8.3 18.7 36.3 97 +00062501.HAO 1 13.1 422 -35 1552 152 35.2 0.2 -7.7 249 5.7 29.2 32.5 226 +00062019.MTO 1 15.3 938 -10 830 185 29.7 0.9 -7.9 246 6.3 38.8 17.7 268 +00062001.HSI 1 14.0 1763 -84 1164 234 40.3 1.8 -8.2 248 7.0 27.7 49.5 343 +00061621.IPT 1 16.3 2224 -6 898 126 25.2 1.2 -7.2 258 5.6 34.7 21.7 251 +00061323.PRT 1 14.6 3313 -86 1730 52 37.5 0.2 -7.5 265 8.2 21.9 60.1 117 +00061321.RDK 1 17.0 3477 -23 902 260 35.7 5.4 -9.8 237 7.9 30.5 30.4 304 +00061300.LBF 1 10.3 2216 -34 2374 46 34.8 0.0 -10.3 241 8.4 19.0 34.1 135 +00061300.GFK 1 11.1 1031 -80 1371 163 45.4 0.6 -13.5 239 7.2 30.8 40.7 248 +03031919.CSV 1 9.7 329 -12 552 167 68.4 0.6 -16.4 213 7.0 45.4 103.6 306 +03031917.CSV 1 9.6 129 -21 493 196 62.6 0.3 -16.0 222 6.7 61.8 100.8 422 +03031915.HSV 1 10.9 546 0 538 221 80.9 1.2 -16.0 224 6.4 51.0 103.8 393 +03031800.FSI 1 11.0 983 -10 789 157 47.9 1.2 -17.1 242 7.4 21.2 84.6 148 +03031722.SPS 1 10.7 981 -38 1183 127 34.3 0.6 -15.4 236 7.3 19.3 95.8 139 +03031721.HBR 1 10.6 1028 -46 917 133 27.4 0.6 -15.9 217 7.1 22.3 90.0 154 +01062101.DEN 1 8.5 516 -90 1464 2 57.2 0.0 -10.9 293 7.2 41.8 50.9 136 +01061403.DDC 1 14.7 4480 -83 1698 161 58.3 1.7 -11.1 234 9.3 30.0 58.2 280 +01061323.PQN 1 15.8 3695 -5 1047 117 31.9 2.2 -10.3 212 8.0 28.2 46.4 193 +01061000.MBS 1 8.3 401 -7 1604 78 43.1 0.1 -16.3 312 6.3 19.1 70.0 124 +01060923.BIS 1 13.0 2950 -51 1333 25 50.8 0.4 -12.4 272 7.7 30.4 52.9 158 +01060521.P28 1 15.5 2749 -10 880 99 38.9 1.8 -11.4 241 8.1 28.3 45.3 182 +01060521.CDS 1 15.0 3410 -11 1645 9 34.8 0.1 -9.6 266 8.0 23.5 28.9 110 +01060421.LIC 1 8.2 167 -117 1162 92 45.0 0.1 -12.6 233 7.5 32.1 65.5 170 +01060402.WLD 1 15.9 3250 -135 778 339 39.0 3.1 -9.4 254 8.1 35.7 49.4 535 +01060121.MXO 1 8.9 416 -12 968 81 51.7 0.3 -17.7 275 6.4 33.3 51.6 153 +01053000.CDS 1 13.5 2478 -201 1327 184 58.9 0.0 -9.9 240 8.4 43.6 59.7 269 +01052423.JCT 1 11.1 2121 -41 2081 21 42.8 0.0 -12.9 298 8.3 34.2 39.7 254 +01052423.BHM 1 10.8 1036 -32 1179 118 47.3 0.8 -14.7 258 6.9 44.8 49.5 280 +01051022.OLZ 1 11.3 1843 -33 1200 61 42.2 0.6 -15.7 256 7.4 31.2 46.0 179 +01050823.CNK 1 8.0 560 -40 1902 58 51.8 0.0 -16.7 317 7.3 21.6 51.7 171 +01050621.ILE 1 16.4 3719 -9 838 53 30.9 1.0 -13.1 261 7.0 24.3 54.4 118 +01050621.1F0 1 14.4 2826 -1 776 124 27.7 1.6 -13.9 256 6.8 24.7 55.3 157 +01050602.COT 1 16.2 2790 -11 863 180 42.4 3.6 -10.7 247 7.2 33.3 76.0 223 +01050601.HBR 1 10.8 1071 -47 991 113 60.9 1.2 -14.6 218 6.8 35.4 66.2 149 +01050600.WLD 1 10.9 813 -3 986 94 45.9 0.6 -13.4 211 6.5 34.0 50.5 174 +01050521.ACT 1 14.9 2393 -3 716 65 41.0 1.1 -11.6 229 6.7 21.6 53.3 125 +01050422.FNB 1 13.2 1315 -10 654 80 33.2 0.6 -12.0 205 5.5 25.5 43.0 144 +01050412.SPS 1 13.3 1511 -11 818 233 45.0 2.6 -11.2 211 5.9 37.5 53.7 290 +01050223.CDS 1 12.5 3652 -132 1895 166 31.7 0.2 -13.0 217 9.2 26.5 37.9 210 +01050123.RPD 1 11.7 2374 -31 1338 213 46.8 2.6 -14.3 249 7.2 38.7 54.2 348 +01050123.RGK 1 12.1 2710 -41 1464 239 44.1 2.6 -14.6 250 7.7 37.9 54.3 370 +01050100.TQE 1 9.6 1164 -13 1373 125 29.7 0.5 -16.8 267 7.6 24.5 30.9 158 +01050100.BGD 1 8.6 1497 -7 2135 23 54.7 0.0 -14.0 327 8.0 22.4 64.0 136 +01042300.OAX 1 11.5 527 -10 586 257 62.9 1.4 -12.4 193 5.9 51.0 62.5 288 +03060800.ECG 1 15.9 456 -52 671 256 26.7 0.5 -5.9 244 4.7 33.3 37.0 264 +03060500.CVS 1 8.5 804 -116 2160 108 56.7 0.0 -9.7 295 8.0 53.0 55.1 313 +03060422.TCC 1 10.6 1847 -48 1858 84 47.9 0.2 -10.4 290 8.6 41.0 53.3 227 +03060103.BFF 1 11.3 1434 -103 1288 72 46.7 0.4 -9.1 291 7.2 22.6 47.7 113 +03052820.PIA 1 11.7 1566 -31 860 135 36.1 1.3 -16.6 318 7.2 30.1 54.2 203 +03052323.V#L 1 10.7 657 -22 998 134 47.6 0.7 -13.2 312 7.1 36.4 63.1 269 +03051401.TXK 1 13.6 1354 -97 1023 210 48.8 1.5 -11.3 301 7.8 39.5 74.4 571 +03051323.C04 1 12.3 338 -272 641 212 57.3 0.0 -12.4 299 8.0 32.1 67.8 353 +03050920.FVX 1 13.5 1153 -108 1077 253 59.2 1.6 -11.6 288 7.8 44.4 56.6 335 +03050918.CHO 1 15.0 1961 -22 782 298 58.7 5.7 -11.4 296 7.3 46.4 63.9 473 +03050800.ABI 1 11.7 1368 -77 2113 150 68.5 0.0 -6.9 244 6.8 41.7 79.4 428 +03050721.ANB 1 14.0 798 -104 694 354 51.0 1.5 -9.4 268 6.5 39.0 46.7 422 +03050719.BMX 1 15.8 2069 -6 591 233 43.2 3.5 -10.7 274 6.8 31.7 48.0 302 +03050700.FAM 1 13.4 2397 -56 1026 270 72.9 6.1 -14.5 269 7.6 38.6 77.4 402 +03050518.MKL 1 15.9 2561 0 610 165 70.0 4.2 -11.5 253 7.0 46.3 90.9 195 +03050423.C35 1 15.5 2257 -12 619 309 68.9 7.0 -11.1 234 7.3 35.2 111.6 297 +03050421.ADM 1 16.6 3573 -3 898 108 77.1 3.9 -8.7 238 6.2 51.9 109.7 213 +03050320.BFF 1 7.9 1569 -35 1574 91 55.3 0.6 -17.6 237 9.1 30.0 121.3 150 +03050121.TUL 1 15.3 4038 -2 592 93 35.5 2.2 -13.9 263 7.7 27.5 53.2 205 +03043023.FOE 1 13.9 4015 -6 1059 116 26.7 2.0 -14.3 236 7.7 24.7 34.3 165 +03042821.BYI 1 4.3 220 -74 1877 74 40.4 0.0 -21.3 217 8.4 19.6 47.5 151 +03042522.MGM 1 13.1 2112 -13 1028 106 63.3 2.2 -14.2 266 6.8 41.2 42.5 199 +03042521.LWT 1 6.2 193 -34 1157 84 33.2 0.1 -19.0 194 7.6 23.8 44.0 191 +03042518.TCL 1 11.3 524 -50 815 216 66.5 1.1 -14.0 256 6.7 54.5 74.3 295 +03042423.PIB 1 13.2 710 -91 552 278 47.4 1.1 -13.2 256 7.3 29.9 47.5 367 +03042422.FOE 1 9.2 537 -24 443 119 31.9 0.3 -19.7 184 6.7 33.6 18.6 155 +03042419.BTR 1 14.3 2208 -2 816 43 52.0 0.8 -13.0 244 7.4 27.5 46.2 86 +03041923.MLC 1 12.8 1448 -52 744 271 64.7 3.9 -11.2 230 5.7 51.5 81.0 283 +03040618.JAN 1 12.9 801 -40 747 201 51.3 1.4 -14.4 243 7.5 28.4 87.0 298 +03040614.MLU 1 13.4 517 -86 382 358 50.8 1.2 -13.9 229 7.4 36.9 73.2 428 +03040601.FWD 1 11.1 461 -111 865 325 67.8 0.9 -13.5 245 6.9 40.1 93.4 563 +03040420.SPI 1 11.2 1687 -7 802 102 38.9 1.1 -17.7 252 7.6 39.5 59.0 176 +03032721.PBI 1 12.4 384 -64 873 185 47.9 0.5 -12.0 240 6.3 8.1 99.7 189 +03032720.TMB 1 13.5 878 -5 1007 102 59.6 0.9 -10.7 241 5.9 21.4 97.6 157 +04040822.ROW 1 7.6 885 -35 1457 25 42.6 0.1 -16.3 225 7.7 31.8 52.9 136 +04040616.VCT 1 13.2 671 0 457 159 42.0 0.8 -12.5 228 5.9 29.4 48.5 233 +04040615.CRP 1 14.5 1276 0 405 109 39.2 0.9 -12.3 238 7.0 30.2 44.3 209 +04032723.C33 1 12.5 2394 -14 752 342 44.2 6.0 -15.0 235 7.2 45.6 56.4 529 +04032721.C33 1 12.5 2248 -11 742 183 42.7 2.9 -14.5 230 7.1 29.5 50.7 257 +04032718.GAG 1 11.6 1959 -2 705 243 43.2 3.4 -16.1 217 7.9 33.2 51.9 263 +04020601.TCL 1 11.9 190 -48 628 310 45.1 0.4 -12.7 222 6.4 48.7 58.2 536 +03111803.GLS 1 16.5 1327 -28 566 364 46.5 3.8 -8.7 230 6.1 33.7 77.0 402 +03111722.GLS 1 10.1 1092 -23 682 103 65.1 1.1 -18.5 220 7.2 45.6 115.8 218 +03110520.IAD 1 13.7 626 -17 1058 109 35.5 0.4 -9.7 248 6.0 23.4 50.7 109 +03100923.GLS 1 18.1 1654 -5 454 164 35.3 1.6 -5.9 253 5.5 26.9 46.4 209 +03100523.C10 1 11.8 1332 -9 1262 56 39.6 0.4 -7.5 295 5.6 37.5 47.9 168 +03090807.MAF 1 11.7 777 -160 1418 169 29.0 0.1 -10.5 282 7.9 18.5 32.7 262 +03082523.RAD 1 12.0 1595 -36 1379 139 56.3 1.3 -11.7 280 6.3 16.2 82.0 142 +03080122.MIE 1 14.8 2465 -19 976 39 23.4 0.0 -10.9 251 6.4 10.2 49.8 63 +03072100.SUX 1 21.5 6268 -16 748 130 47.0 6.4 -7.5 313 7.3 28.4 42.4 175 +03072022.SUX 1 20.7 5887 -14 863 100 42.2 4.2 -7.3 304 7.8 47.1 46.8 375 +03072022.OFK 1 19.2 6004 -19 1398 33 31.9 0.6 -7.5 313 8.2 30.8 31.8 166 +03071922.STC 1 15.2 2711 -22 1042 103 46.1 2.1 -10.6 310 7.0 34.7 54.6 221 +03071102.NHK 1 16.5 987 -67 757 159 22.6 0.0 -7.7 240 6.4 20.9 29.8 187 +03070921.RWF 1 13.6 1319 -19 765 52 42.5 0.5 -10.8 262 7.0 23.9 51.9 91 +03070919.P#3 1 13.7 1228 -1 615 65 49.7 0.7 -10.0 258 6.5 18.9 58.3 80 +03070902.ATH 1 11.5 2088 -216 2152 184 48.4 0.0 -8.0 269 9.4 34.4 71.3 315 +03062823.BRD 1 10.3 984 -41 828 98 44.5 0.7 -16.0 285 5.9 30.4 65.1 168 +03062820.BJI 1 8.9 792 -1 1152 76 36.4 0.3 -17.5 276 6.2 21.6 57.0 122 +03062802.C22 1 8.5 251 -78 1075 74 33.2 0.1 -17.0 302 6.9 33.5 39.2 110 +03062800.P11 1 8.9 130 -58 757 94 34.6 0.1 -16.9 294 6.8 32.0 41.6 182 +03062223.GRI 1 18.1 5092 -19 1060 137 41.0 4.5 -7.9 238 8.0 29.8 45.3 215 +03062119.GCC 1 9.0 940 -32 1043 126 52.6 1.0 -13.9 234 7.3 37.7 61.9 271 +03061423.GLD 1 11.1 1240 -11 1151 21 28.6 0.1 -11.5 347 7.2 20.2 27.1 107 +03061202.9V9 1 11.9 1311 -150 1237 252 55.7 0.8 -12.0 277 7.7 34.4 64.5 403 +03061123.PIR 1 12.2 2019 -91 1257 201 52.8 1.9 -12.8 252 7.7 30.1 78.9 352 +03060922.AIH 1 12.2 3211 -62 1638 201 43.3 1.6 -13.0 253 9.0 35.4 67.6 306 +04052223.P#A 1 15.1 2952 -11 774 39 53.1 1.0 -12.0 243 7.6 22.0 68.8 112 +04052223.OAX 1 13.7 2734 -22 1169 83 52.1 1.6 -11.3 232 7.4 29.5 77.9 274 +04052201.OFK 1 14.7 3647 -8 1268 198 35.6 3.1 -11.0 240 7.8 35.9 59.8 310 +04052201.AIH 1 12.5 2491 -49 1041 183 43.4 3.2 -12.7 241 8.1 37.2 66.0 201 +04052122.GEG 1 8.3 1152 -51 831 61 20.9 0.0 -20.3 270 7.3 16.0 22.9 86 +04051821.PIA 1 13.2 1154 -20 811 45 38.0 0.3 -11.1 240 5.6 36.6 42.0 114 +04051701.C07 1 9.6 1682 -36 2011 261 50.5 0.0 -10.9 271 7.9 35.3 62.3 740 +04051700.GRI 1 11.3 1410 -72 1036 313 44.9 2.7 -14.9 227 8.2 36.5 55.1 498 +04051420.MBS 1 13.4 793 -7 834 109 40.9 0.6 -10.0 223 5.5 35.3 48.3 177 +04051416.SBN 1 13.7 499 0 429 86 47.3 0.3 -10.0 213 5.3 45.7 43.4 226 +04051323.G#4 1 15.5 3158 -12 977 153 38.7 3.1 -11.1 260 7.5 26.9 14.0 223 +04051223.C32 1 11.4 2949 -2 1894 52 53.9 0.2 -12.4 230 8.0 35.8 51.2 184 +04051117.VCT 1 16.3 1839 0 387 110 21.6 0.0 -10.4 236 6.4 21.8 22.3 236 +04043018.SPS 1 12.8 1694 -16 674 115 47.0 1.5 -14.9 221 8.0 24.4 40.3 122 +04042921.CDS 1 9.5 1110 -130 1817 -14 26.8 0.0 -14.5 244 8.2 30.9 40.8 112 +04042900.DRT 1 11.7 872 -12 771 192 46.2 1.3 -13.3 241 6.5 37.1 66.5 291 +04042320.SPS 1 14.3 3037 -1 1026 34 40.0 0.7 -13.4 226 7.4 18.9 49.8 60 +04042317.C11 1 10.4 439 -226 1267 41 38.3 0.0 -12.0 218 8.0 22.5 52.0 77 +04042300.FYV 1 11.8 1066 -33 829 252 39.7 1.8 -14.3 264 7.5 32.0 68.1 287 +04042222.TUL 1 13.0 1845 -5 720 136 58.2 2.4 -14.9 261 7.6 42.3 60.4 262 +04042220.P#P 1 13.3 2326 -1 748 134 58.8 3.1 -15.9 266 8.0 37.4 58.0 199 +04042200.GAG 1 10.8 1625 -5 908 47 32.4 0.4 -16.4 262 7.4 23.8 78.1 203 +04042122.G#1 1 7.3 762 -3 1736 51 74.4 0.1 -18.1 267 7.9 29.6 109.6 287 +04042100.TUL 1 10.6 632 -70 1159 363 52.0 1.5 -13.5 244 6.5 34.2 55.8 403 +04042023.GVS 1 10.8 283 0 524 272 32.9 0.4 -14.5 241 5.8 36.7 31.1 351 +04042022.C34 1 11.4 1441 -8 1212 105 50.3 1.0 -12.2 244 6.3 35.5 57.3 152 +04042019.HUF 1 9.9 107 -34 769 282 37.1 0.2 -14.7 239 5.8 35.7 36.3 292 +04042001.G#1 1 10.9 1585 -37 948 193 46.4 2.4 -14.6 237 7.8 39.5 70.5 374 +04041923.AMA 1 10.3 1602 -8 1272 103 41.6 0.8 -12.3 237 6.8 29.9 68.2 173 +04041823.HYR 1 9.5 788 -51 1551 610 67.8 2.1 -14.2 237 6.6 48.6 102.0 685 +04041822.YKN 1 8.5 781 -30 1937 -47 67.4 0.0 -14.5 231 7.3 50.2 99.2 231 +04041820.STC 1 9.5 1332 -37 1772 54 48.6 0.1 -15.2 231 8.6 26.3 87.5 167 +04041803.MCW 1 11.3 1606 -164 1042 529 61.4 2.0 -14.5 249 8.2 51.8 78.3 736 +04041800.FRM 1 6.2 0 -9999 2233 126 60.4 0.0 -15.8 250 8.3 48.2 86.0 376 +04041318.MHX 1 14.5 829 -6 376 471 48.2 3.1 -10.4 209 5.7 50.3 59.5 492 +04041101.HOU 1 14.2 1196 -29 574 -14 42.4 -0.1 -12.2 228 6.1 21.1 49.7 59 +04040922.MLC 1 9.5 826 -4 1253 59 50.6 0.3 -15.2 263 6.2 30.9 65.3 245 +04081001.LIC 1 13.1 2627 -14 833 10 31.8 0.1 -7.6 302 6.9 29.5 39.6 240 +04080923.LIC 1 12.3 2929 -24 1366 16 34.5 0.2 -7.1 291 7.3 33.3 41.5 174 +04080222.BH5 1 9.0 780 -79 2692 -22 40.8 0.0 -7.8 269 8.3 36.1 53.6 117 +04080101.FSD 1 15.5 3162 -71 1296 126 42.1 1.7 -10.0 298 7.7 29.5 43.5 211 +04071502.PWD 1 11.6 1241 -85 1817 -10 41.6 0.0 -9.7 293 7.4 25.5 68.5 104 +04071421.NHK 1 15.8 2262 -34 1229 29 22.0 0.0 -9.0 266 6.6 17.0 40.9 95 +04070822.CDR 1 8.4 1172 -184 2535 65 52.1 0.0 -10.6 252 9.0 39.8 58.2 155 +04070800.RSL 1 16.8 3857 -81 950 330 43.6 7.3 -6.9 302 7.3 32.9 43.0 525 +04062401.MSN 1 11.0 1731 -10 1132 139 52.2 1.8 -15.8 264 6.6 37.4 69.1 149 +04062202.AMA 1 14.9 2631 -32 851 69 48.2 1.5 -9.3 256 8.0 30.2 68.7 322 +04062201.AMA 1 13.9 2569 -24 1161 158 51.4 2.9 -9.1 264 8.2 37.1 79.6 378 +04062123.AMA 1 14.3 3017 -3 1129 34 46.0 0.7 -9.8 253 7.9 30.1 66.4 233 +04062100.LAA 1 13.7 2855 -58 1180 172 53.2 3.4 -9.9 265 8.0 19.8 59.2 173 +04062021.PUB 1 9.4 1660 -152 1943 219 45.3 0.1 -10.7 255 9.0 31.5 55.0 312 +04062019.COS 1 10.8 2562 -34 1009 45 38.2 0.7 -12.0 275 8.7 28.8 54.8 98 +04061501.HYS 1 14.0 3081 -123 1665 173 58.2 0.9 -9.0 287 8.2 39.1 57.5 526 +04061401.RDD 1 12.6 881 -112 1018 143 43.3 0.5 -9.7 283 6.4 45.8 43.1 223 +04061322.LNK 1 10.8 941 -69 1877 47 38.4 0.0 -9.3 287 5.7 33.3 45.8 183 +04061318.RQB 1 13.7 1000 -12 900 139 52.4 1.2 -10.7 233 6.1 36.9 55.2 229 +04061121.FRM 1 16.5 2686 -15 680 177 37.0 2.9 -11.0 219 7.7 18.6 49.4 252 +04061103.HSI 1 12.4 1209 -300 1522 316 36.6 0.0 -10.8 210 9.0 34.1 53.9 333 +04060921.APA 1 8.8 1388 -12 2068 90 27.2 0.0 -10.0 186 8.8 22.9 47.8 104 +04053022.SLO 1 18.2 3905 -16 909 156 45.8 4.6 -9.2 240 6.9 43.6 52.3 241 +04052701.PNC 1 15.4 2665 -48 1261 221 69.9 4.4 -8.5 266 6.3 33.5 88.2 272 +04052623.G011 1 12.4 1626 -109 1852 49 70.8 0.1 -9.9 262 7.1 37.0 94.0 147 +04052622.P#T 1 11.9 1612 -29 2366 155 49.7 0.0 -7.5 252 7.6 30.5 79.4 164 +04052602.ABI 1 14.8 1459 -96 876 180 51.9 1.6 -7.9 237 7.1 20.8 85.8 179 +04052500.FDR 1 16.4 3848 -41 1381 227 52.9 4.8 -10.3 248 8.8 44.6 77.8 373 +04052421.MCI 1 15.5 3926 -27 1068 147 47.7 4.3 -11.9 239 7.8 31.2 69.7 377 +04052421.CDS 1 11.5 2298 -45 2458 72 49.8 0.0 -9.7 246 8.0 26.4 75.8 113 +04052420.HSI 1 15.0 4625 -31 1086 83 34.0 2.0 -15.1 231 9.5 23.3 61.8 166 +04052420.BGM 1 11.0 1383 -50 1291 107 43.0 0.8 -13.2 261 6.4 38.3 57.1 215 +04052400.MKX 1 12.6 2101 -6 936 253 43.7 3.9 -15.6 243 8.0 47.2 76.4 303 +04052302.P#8 1 14.4 3064 -83 1357 338 64.2 5.2 -12.5 243 8.9 33.2 52.0 372 +04052301.P#A 1 15.3 2427 -11 641 38 43.9 0.7 -11.1 235 7.5 24.0 58.7 130 +04052301.OMA 1 15.2 2700 -10 801 171 47.0 3.6 -10.9 219 7.5 25.3 68.4 216 +99060823.N60 1 13.7 3155 -15 1051 78 41.1 1.6 -13.0 219 8.3 21.8 42.4 152 +99060620.MIW 1 16.5 2747 -2 728 95 46.5 2.0 -11.3 215 7.4 25.8 54.4 126 +99060619.DVL 1 13.3 2802 -18 814 23 14.6 0.0 -16.8 148 8.2 13.8 14.2 55 +99060522.LRJ 1 15.2 2964 -17 1289 56 44.7 0.9 -10.3 227 8.2 27.6 63.5 157 +99060405.VTN 1 12.9 2518 -114 1075 129 40.8 1.2 -11.7 252 8.4 33.9 47.9 180 +99060300.GTF 1 7.5 3 -80 1259 78 32.1 0.0 -12.7 166 6.6 32.1 44.8 172 +99060300.AMA 1 12.9 2756 -67 1541 95 38.7 0.7 -10.0 227 8.6 29.5 72.3 208 +99060123.SPI 1 14.9 2287 -19 881 194 49.6 3.7 -12.9 240 7.2 40.7 42.9 303 +99060110.MLC 1 16.0 1956 -157 477 193 43.7 0.8 -10.8 251 8.4 34.4 54.4 257 +99060101.RSL 1 13.0 1705 -20 907 93 50.1 1.3 -12.2 250 8.3 32.2 70.0 179 +99060100.SJT 1 10.8 1391 -136 2395 53 45.7 0.0 -8.1 279 8.0 23.3 44.1 151 +99060100.CSM 1 13.8 2748 -119 1593 116 55.1 0.7 -10.4 262 8.3 31.9 59.4 205 +99053122.LBL 1 12.8 2910 -27 1574 106 61.1 1.3 -11.1 247 8.1 34.8 75.6 204 +99053023.LXN 1 11.3 1917 -2 1506 20 24.9 0.0 -12.7 282 7.1 22.6 26.3 85 +99052700.INK 1 10.3 1701 -31 1781 9 53.5 0.0 -13.0 263 8.4 26.7 60.4 107 +99052521.ROW 1 8.6 1056 -1 2099 26 43.2 0.0 -11.4 250 7.4 17.0 57.8 56 +99051701.P28 1 14.1 3996 -25 1498 52 41.4 0.7 -12.2 235 7.9 28.4 44.1 137 +99050922.P07 1 10.6 1793 -96 2053 72 29.7 0.0 -11.9 197 8.5 25.8 74.2 77 +99050419.EWK 1 9.8 1172 -30 1060 87 56.5 0.9 -17.0 185 7.4 27.6 56.8 112 +99050401.ONL 1 9.2 1561 -17 1532 160 31.3 0.6 -15.4 205 7.3 24.3 33.6 208 +99050220.HDE 1 8.7 687 -3 649 100 31.9 0.4 -19.2 208 7.1 21.5 23.0 124 +99050122.MAF 1 12.3 1710 -9 776 232 56.9 3.8 -11.2 237 6.8 32.4 76.7 295 +99043021.INK 1 13.0 2707 -11 1033 174 50.2 3.8 -11.8 197 7.3 35.6 67.7 236 +99042421.AGS 1 9.7 443 -32 1749 52 54.7 0.1 -12.4 292 6.7 37.3 65.4 176 +99042300.MKO 1 13.6 2181 -13 1003 243 55.3 4.9 -11.4 253 7.8 35.3 67.1 248 +04082522.FOE 1 16.3 3285 -59 1225 128 33.5 1.7 -8.6 243 6.8 34.0 42.4 233 +04082423.DPA 1 15.3 616 -29 685 237 28.3 0.7 -6.6 213 5.2 26.6 21.5 254 +04082401.FOE 1 17.3 2862 -33 582 300 33.1 4.7 -7.7 274 6.8 24.8 34.1 345 +04082200.C07 1 12.4 2025 -24 1364 108 27.4 0.6 -7.7 278 6.6 14.0 41.6 288 +04081522.ATH 1 10.0 1320 -50 1754 133 37.4 0.3 -10.5 325 7.6 38.4 41.5 249 +04081420.HAT 1 16.9 1221 -20 693 281 41.3 2.4 -6.1 204 4.5 32.5 54.5 312 +04081219.FAY 1 15.4 835 -29 887 115 48.5 0.8 -7.1 211 5.4 29.3 50.5 134 +04081215.CAE 1 16.3 1332 -11 579 78 38.5 0.7 -8.3 217 5.9 37.1 28.4 136 +99112300.TUL 1 11.8 1383 -12 847 203 54.3 2.5 -15.7 217 6.9 37.0 60.1 264 +99092823.LAF 1 14.3 1880 -26 925 44 46.4 0.6 -9.8 226 5.9 31.8 53.4 131 +99092700.ICT 1 13.7 1942 -99 1005 119 45.8 1.2 -7.8 271 6.2 28.6 45.7 170 +99092003.OGD 1 5.9 7 -95 1490 6 35.4 0.0 -14.8 306 7.3 17.3 39.8 59 +99091023.OKM 1 14.1 1578 -173 1285 75 38.5 0.1 -9.8 284 6.9 29.7 41.2 205 +99090400.AKO 1 11.6 1401 -21 1298 3 44.8 0.0 -8.1 221 7.3 26.8 60.0 143 +99081920.SME 1 11.4 1158 -29 2080 34 42.9 0.0 -10.2 267 6.9 18.4 33.8 78 +99081621.GLD 1 14.3 3184 -9 1787 78 34.9 0.3 -7.0 231 7.7 23.6 46.0 131 +99081503.JDN 1 7.8 368 -225 2152 37 52.5 0.0 -11.9 242 8.0 36.8 72.2 220 +99080923.MKT 1 16.2 2484 -10 814 229 44.4 4.2 -9.7 289 7.7 38.9 63.1 274 +99073100.DMH 1 14.4 2057 -58 1629 66 38.0 0.3 -8.8 331 7.0 18.2 55.7 83 +99072800.COQ 1 11.9 957 -73 1267 208 61.5 1.2 -12.4 294 7.3 37.9 75.1 349 +99072300.ABR 1 15.9 3073 -48 1643 51 26.1 0.2 -7.9 237 7.7 10.4 43.4 60 +99072201.GGW 1 8.8 1107 -147 2618 58 49.5 0.0 -11.3 230 8.7 27.6 92.9 163 +99072022.OLZ 1 19.5 3709 -2 737 170 42.4 4.4 -5.2 268 5.5 29.8 44.8 294 +99071400.MOT 1 10.3 1025 -92 1759 96 63.9 0.2 -11.0 284 7.1 34.6 66.5 248 +99070300.LBF 1 18.3 5887 -62 1227 118 33.7 2.8 -6.4 235 9.0 23.9 55.3 163 +99070123.IPT 1 14.7 908 -27 884 203 33.0 1.0 -6.8 229 5.6 30.6 31.5 243 +99062922.GUY 1 13.7 3266 -87 2035 154 43.7 0.0 -7.8 283 9.0 32.3 53.8 237 +99062802.OGA 1 12.3 1529 -168 1178 203 64.3 0.5 -9.7 266 8.8 33.4 87.6 253 +99062701.MCK 1 16.5 3830 -43 1226 55 34.0 0.9 -7.8 258 8.2 20.8 57.0 152 +99062700.SNY 1 12.1 2217 -42 1612 24 49.9 0.2 -8.9 251 8.2 28.2 77.8 141 +99062300.MHE 1 14.1 1832 -74 977 196 23.4 0.0 -9.7 239 7.3 17.5 18.0 213 +00050901.AIZ 0 13.1 1987 -68 1453 84 35.7 0.5 -11.3 241 8.5 41.9 28.1 204 +00050722.SNY 0 9.8 2015 -39 1845 23 56.1 0.1 -12.4 245 8.7 34.2 64.8 128 +00050707.OGA 0 11.6 1205 -190 787 34 39.5 0.0 -11.3 236 8.2 22.0 47.2 115 +00050323.RBD 0 11.2 940 -3 1077 54 42.9 0.3 -14.6 290 6.2 28.9 58.4 174 +00043001.ABI 0 11.9 2549 -66 1686 111 39.6 0.5 -11.8 268 8.4 26.8 40.5 228 +00042423.LAA 0 5.4 613 -132 2566 97 54.0 0.0 -16.3 278 8.9 29.1 72.7 192 +00042422.EHA 0 6.7 706 -56 2143 58 53.8 0.0 -15.2 295 8.1 25.8 83.4 159 +00042021.BWG 0 11.2 1126 -13 1162 167 52.1 1.4 -13.5 240 7.4 46.8 53.8 253 +00042021.BNA 0 11.2 989 -26 1114 165 53.6 1.3 -13.7 242 7.7 45.4 65.0 244 +00042001.MCI 0 12.4 2093 -43 1300 141 61.9 2.1 -12.3 226 7.0 33.4 81.4 163 +00042000.JCT 0 13.1 2950 -156 1701 170 51.7 0.4 -9.4 253 8.2 40.5 71.8 240 +00041822.SJT 0 7.1 414 -185 3169 -7 49.4 0.0 -9.5 243 8.2 32.3 60.6 45 +00041620.SUS 0 9.5 579 -1 968 46 41.8 0.2 -18.1 247 6.6 30.2 69.5 154 +00041602.GRA 0 10.2 901 -182 1269 251 56.8 0.2 -17.0 244 8.6 34.1 76.8 276 +00033000.SHV 0 12.6 1635 -14 797 147 57.7 2.3 -15.2 267 7.2 33.9 91.9 219 +00032900.HYI 0 15.8 2875 -10 771 106 60.6 3.0 -11.6 251 7.3 36.4 82.8 192 +00032522.BNA 0 8.3 268 -8 1461 34 37.5 0.0 -16.9 270 6.2 23.2 61.3 60 +00032207.MAF 0 11.5 1952 0 562 249 54.6 4.4 -16.4 196 8.3 45.0 77.8 468 +00031600.CSM 0 8.3 808 -99 1327 59 34.5 0.1 -17.7 251 7.6 25.7 34.3 101 +00031022.BHM 0 10.3 614 -95 1034 103 48.9 0.4 -15.8 238 7.0 33.1 49.4 179 +00030923.LRD 0 13.5 2701 -7 1360 -13 41.3 -0.2 -12.5 256 7.5 20.8 59.4 95 +00030920.GFL 0 7.1 1 -425 1416 88 63.6 0.0 -18.7 242 8.1 39.6 77.0 165 +00030900.UNU 0 9.9 1306 -11 1121 172 50.6 1.7 -17.3 203 6.6 39.6 44.1 206 +00030900.CLI 0 9.4 673 -29 1009 196 53.3 1.2 -16.9 202 6.6 39.4 53.8 226 +00030302.PWG 0 12.0 1469 -17 1106 252 60.9 3.3 -12.2 259 6.1 45.0 75.3 323 +00030222.AFW 0 11.1 999 -6 913 256 68.3 2.6 -13.5 238 6.5 36.9 80.1 345 +00022606.CRS 0 13.3 2158 -10 637 191 48.7 3.3 -14.8 239 6.9 25.4 69.2 184 +00022523.FSD 0 7.3 495 -2 929 82 38.3 0.3 -21.9 172 7.7 30.1 52.5 83 +00022405.FAM 0 9.2 437 -46 772 315 46.8 1.1 -18.0 235 6.3 29.2 42.2 331 +00072222.BBW 0 11.9 1462 -1 1218 36 35.2 0.2 -11.1 328 6.5 26.6 43.9 124 +00072220.GLD 0 10.6 1162 -15 1699 26 39.9 0.1 -10.2 319 7.4 19.8 55.8 82 +00072122.BFF 0 9.8 1738 -8 2036 34 42.0 0.0 -9.9 297 7.7 36.2 48.9 131 +00072022.AKO 0 14.0 3465 -7 1063 22 46.2 0.6 -10.2 278 8.3 29.1 64.7 106 +00072000.BVX 0 17.4 3847 -11 1674 30 36.4 0.2 -7.1 298 6.9 26.0 29.2 130 +00071022.RCA 0 13.2 1916 -28 1452 23 41.1 0.2 -9.2 238 7.6 21.4 68.1 95 +00071001.LBF 0 14.7 2947 -100 1740 24 28.1 0.1 -5.6 239 7.8 23.6 37.9 109 +00070922.MHE 0 16.8 3556 -34 1430 6 40.7 0.1 -6.1 258 6.7 18.8 41.5 109 +00070922.GGW 0 13.3 2242 -12 1039 31 46.6 0.5 -11.4 226 7.4 18.7 71.4 74 +00070901.LWT 0 8.7 874 -65 1998 38 58.4 0.0 -11.5 232 8.1 32.4 92.6 236 +00070805.LVN 0 18.2 2722 -69 530 388 37.6 5.8 -9.2 261 8.1 22.9 53.3 407 +00070803.JDN 0 7.6 57 -220 2275 33 69.9 0.0 -11.7 240 7.8 39.2 84.5 167 +00070601.CUT 0 11.7 2058 -14 1543 37 55.5 0.3 -9.9 245 8.5 28.5 78.8 136 +00070523.MCK 0 16.4 3979 -55 1631 151 45.4 1.6 -6.8 254 8.1 24.5 59.5 231 +00070521.RAP 0 14.5 3135 -2 1289 15 44.0 0.3 -10.0 233 8.0 19.5 68.5 93 +00070501.2WX 0 11.2 1574 -93 1339 -29 47.6 -0.2 -12.4 230 8.6 28.2 78.4 64 +00070421.JDN 0 8.1 1033 -47 1927 -17 41.2 0.0 -15.0 209 7.9 26.2 68.3 49 +00070302.GGW 0 10.6 1484 -86 1685 121 67.7 0.4 -12.6 252 7.9 36.1 78.0 267 +00070222.FOD 0 17.4 3585 -43 1097 53 23.7 0.0 -9.5 292 7.5 16.4 31.4 91 +00070201.ABR 0 14.2 3411 -108 1790 100 24.5 0.0 -10.0 259 8.3 16.6 39.9 145 +00070123.ELO 0 13.3 2835 -49 1339 117 57.8 2.1 -13.1 291 7.7 31.9 66.7 228 +00070122.ABI 0 13.9 1505 -15 1776 40 26.6 0.1 -5.4 261 5.7 21.4 25.5 120 +00070100.JLN 0 15.5 2255 -3 786 81 43.6 1.3 -7.6 313 5.9 25.5 56.4 208 +00062923.ELM 0 8.8 332 -11 1098 19 33.4 0.0 -16.5 253 6.2 19.9 82.5 60 +00062923.D07 0 9.6 1600 -26 1649 30 42.4 0.1 -15.7 295 7.7 30.2 50.5 90 +00062901.LAM 0 11.8 506 -57 1728 28 25.5 0.0 -6.5 268 6.3 18.5 25.2 126 +00062519.AIO 0 14.7 2632 -77 1269 122 38.0 1.2 -10.6 279 7.3 29.0 32.0 250 +00062402.RCA 0 11.5 1507 -76 1200 0 40.3 0.0 -11.0 273 7.9 29.4 67.6 159 +00062322.SDA 0 16.8 4294 -9 1398 56 28.6 0.7 -9.2 284 7.3 21.1 46.7 160 +00061522.OKV 0 14.5 746 -31 749 130 32.3 0.5 -8.8 240 6.0 35.1 29.5 198 +00061323.P28 0 14.3 3106 -53 1734 60 41.3 0.3 -10.0 260 8.0 15.7 31.7 91 +00061122.DFS 0 13.5 3143 -11 1597 67 28.6 0.4 -8.2 251 7.7 28.8 45.0 62 +00060400.GLD 0 9.0 1430 -74 2560 51 35.6 0.0 -10.7 313 8.7 29.0 38.3 146 +00060221.CEF 0 12.1 326 -141 1452 156 38.5 0.1 -9.8 279 6.6 44.9 47.0 277 +00052701.SZL 0 13.7 1477 -23 1157 198 50.0 2.1 -9.7 244 6.7 38.9 69.4 232 +00052501.PPA 0 15.2 3731 -83 1597 78 46.6 0.7 -8.0 249 8.4 33.0 60.7 288 +00052501.ADK 0 16.3 4569 -134 1861 108 40.3 0.2 -7.8 255 8.7 36.4 49.3 291 +00052219.AVC 0 10.1 628 -1 1000 2 52.8 0.0 -13.8 256 5.9 28.0 59.1 95 +00052021.VPC 0 13.0 805 -6 1196 15 39.2 0.1 -9.8 231 6.1 19.7 47.6 87 +00050922.IRS 0 12.0 729 -2 928 68 49.6 0.4 -13.6 230 6.9 46.6 41.5 178 +01041105.JCT 0 14.1 1545 -229 832 346 71.9 0.0 -9.7 230 8.5 44.0 97.0 386 +01041004.IND 0 11.4 1318 -107 1240 185 57.8 1.1 -13.8 292 7.2 35.6 68.3 216 +01040321.UNO 0 12.3 1279 -42 722 107 57.2 1.3 -13.7 270 7.4 36.3 60.7 225 +01040300.BFF 0 5.0 0 -9999 1708 161 63.5 0.0 -17.8 241 7.5 37.7 81.7 433 +01032404.ABI 0 10.8 1700 -61 813 65 27.5 0.5 -18.2 289 8.0 17.4 46.6 180 +01031202.FTW 0 11.7 1341 -9 490 161 53.1 1.9 -17.9 240 7.3 37.5 47.3 201 +01031123.BWD 0 10.1 846 -18 912 76 47.4 0.5 -17.4 245 7.7 31.1 69.7 133 +01022500.TOP 0 7.3 153 -15 715 148 78.6 0.2 -21.3 203 6.8 32.9 92.4 170 +00110907.GZH 0 15.4 1005 -3 768 172 47.3 1.4 -7.8 213 6.0 36.2 52.6 220 +00110906.EET 0 14.9 674 -3 539 277 52.5 1.6 -8.6 217 5.7 41.9 58.8 327 +00110121.CID 0 12.2 1537 -17 1087 164 40.8 1.6 -12.1 210 6.0 36.7 41.3 225 +00102323.ELP 0 9.8 1432 -3 1298 24 68.0 0.2 -14.2 201 7.5 36.8 65.9 132 +00102212.MWL 0 13.4 1016 -7 525 152 31.3 0.8 -11.5 208 6.2 22.4 43.6 149 +00101423.INK 0 8.5 757 -27 2381 63 29.5 0.0 -10.8 243 7.2 27.3 48.1 91 +00101408.CNM 0 11.5 1524 -124 1147 79 34.2 0.3 -10.4 246 7.2 29.4 55.6 119 +00101400.SLN 0 11.5 577 -49 879 26 58.0 0.1 -11.3 234 5.7 28.9 63.6 76 +00100401.GCK 0 8.5 341 -281 1869 -16 53.4 0.0 -11.5 263 8.5 38.0 70.8 124 +00090523.GTF 0 7.6 277 -43 1393 8 65.8 0.0 -15.8 219 7.4 34.7 93.3 112 +00090300.ISN 0 10.7 654 -10 754 62 42.1 0.3 -13.8 225 6.8 27.3 72.5 95 +00090120.SLC 0 5.7 78 -67 2129 29 41.1 0.0 -14.3 198 7.4 15.4 53.6 53 +00081820.BUY 0 15.3 1702 -37 1351 58 34.7 0.4 -8.2 275 6.5 38.7 13.2 134 +00081723.IND 0 19.2 4115 -13 791 158 47.3 5.1 -7.9 275 6.9 37.5 49.8 224 +00081720.LEX 0 16.6 2579 -6 1129 81 36.5 1.1 -6.7 284 5.9 24.9 42.3 141 +00081420.AIT 0 16.2 2299 -120 690 282 52.2 3.0 -9.8 267 8.0 37.9 69.5 368 +00080623.CDJ 0 14.7 1350 -119 1250 43 35.9 0.1 -6.8 272 6.3 24.5 54.6 88 +00080601.HNR 0 18.6 4073 -16 990 54 37.6 1.4 -7.0 271 7.3 25.9 55.8 92 +00080522.AIA 0 7.8 312 -3 2875 0 43.4 0.0 -8.3 272 7.7 22.1 49.4 52 +00080502.PIR 0 14.4 2629 -128 1844 202 48.0 0.3 -7.4 270 7.5 30.4 64.1 318 +00080502.ANW 0 11.5 1035 -228 2157 138 37.9 0.0 -6.3 276 7.6 25.6 46.8 227 +00080222.FKL 0 13.7 1168 -22 892 104 26.2 0.5 -9.1 253 5.9 27.0 55.7 145 +00080202.LWT 0 8.3 700 -130 2701 50 46.5 0.0 -8.4 286 8.6 19.4 78.7 94 +00080202.GGW 0 10.8 1193 -207 1955 94 51.1 0.0 -9.6 293 8.0 25.1 71.3 230 +00072622.AIO 0 16.7 3711 -2 964 67 44.8 1.9 -10.2 324 7.6 29.1 43.1 186 +00072501.HON 0 13.9 2463 -99 1314 85 29.5 0.5 -11.1 271 8.3 13.2 40.3 91 +01060123.LWC 0 11.2 1268 -25 1421 113 62.6 0.8 -13.2 305 6.4 37.6 79.8 249 +01060122.P28 0 11.4 1141 -69 1552 80 51.2 0.3 -9.7 308 6.6 21.4 62.5 156 +01053100.CVN 0 8.5 1309 -86 2195 -18 45.9 0.0 -10.8 289 8.3 24.1 38.5 138 +01052801.END 0 13.1 2369 -85 1258 150 47.1 1.6 -12.5 280 8.2 39.8 67.4 370 +01052400.OKF 0 7.6 314 -55 2200 85 59.2 0.0 -15.3 298 7.1 43.3 63.3 244 +01052022.GRK 0 15.6 2852 -21 1408 32 40.1 0.4 -7.9 242 6.8 30.2 75.1 60 +01051801.RUL 0 11.1 1624 -134 2428 24 25.8 0.0 -8.5 258 8.1 18.9 46.6 76 +01051623.BIE 0 13.4 3208 -41 1905 35 30.0 0.1 -10.4 274 7.5 20.5 32.1 103 +01051218.DDH 0 8.9 325 -25 1493 21 36.4 0.0 -16.2 229 6.4 25.9 46.8 102 +01051000.OLU 0 9.6 2423 -73 2081 70 30.6 0.0 -15.8 265 8.8 23.7 36.8 157 +01050823.GBD 0 8.1 447 -90 1828 55 44.5 0.0 -15.8 323 7.4 25.4 50.6 207 +01050701.COT 0 15.9 3113 -16 1068 4 34.1 0.1 -12.2 267 8.1 10.5 56.5 73 +01050700.ADS 0 14.6 2915 -5 1038 115 37.4 2.0 -13.7 248 7.3 23.1 63.5 148 +01050623.BMQ 0 16.4 4217 -12 955 48 38.2 1.3 -13.0 257 7.5 27.3 64.9 143 +01050501.COT 0 14.3 1453 -9 1075 113 48.9 1.2 -9.9 226 7.0 33.1 73.5 169 +01050200.AUD 0 10.0 1544 -80 1896 85 31.2 0.1 -14.7 266 8.2 22.1 40.9 170 +01050101.SLN 0 10.5 1695 -66 1383 122 37.1 0.7 -16.7 295 8.0 24.3 61.4 188 +01050100.P28 0 9.9 1422 -94 1553 70 45.7 0.2 -15.7 309 7.8 24.3 54.0 188 +01042317.STE 0 9.5 775 -5 970 86 55.4 0.6 -18.0 210 6.8 38.9 110.9 170 +01042304.JCT 0 14.1 2210 -11 659 190 53.5 3.8 -11.8 248 7.8 31.4 55.1 214 +01042222.MWL 0 11.8 1193 -8 1373 116 46.2 0.7 -10.2 212 6.2 33.4 58.0 105 +01042123.PIA 0 12.1 1857 -13 1175 79 41.0 0.8 -13.4 257 7.5 25.7 51.8 94 +01042123.CDS 0 10.3 2000 -70 2105 81 55.8 0.0 -11.8 230 7.9 27.2 70.8 141 +01042102.SLN 0 11.5 2072 -206 1218 280 50.2 0.0 -15.1 239 8.7 44.2 73.5 374 +01041702.SJT 0 13.0 1793 -30 989 96 38.8 1.1 -10.9 296 7.0 26.3 65.2 260 +01041700.LBB 0 8.1 406 -65 1861 42 46.3 0.0 -12.1 288 7.1 32.9 80.6 256 +01041500.ABI 0 12.6 2222 -121 1474 76 59.9 0.5 -13.2 249 8.7 28.8 78.5 130 +01041423.ADM 0 14.2 1613 -86 524 248 67.7 3.1 -14.2 254 8.6 38.9 90.8 310 +01041422.PCS 0 13.6 2872 -90 1455 5 57.7 0.1 -10.8 245 8.2 21.5 77.6 85 +01041422.EMP 0 8.9 652 -15 1486 57 59.4 0.2 -16.8 254 7.2 31.9 84.7 218 +01041421.HBR 0 13.9 2647 -29 786 167 70.6 4.4 -14.3 255 8.2 39.1 91.1 239 +03050100.BRL 0 12.7 2707 -10 1047 121 47.3 2.5 -15.8 247 8.2 27.0 50.9 270 +03043021.AIA 0 12.3 2247 -53 863 158 49.0 2.8 -15.7 243 8.1 37.1 49.5 276 +03043003.LIC 0 8.7 1228 -82 574 264 52.2 2.2 -15.9 216 8.8 43.9 59.2 676 +03042900.APA 0 6.3 1056 -56 1639 56 35.9 0.1 -15.6 239 8.3 10.6 65.7 63 +03042600.HRL 0 12.4 1634 -219 1994 5 43.7 0.0 -11.1 286 8.3 25.0 72.5 36 +03042522.FTY 0 11.2 645 -12 811 160 61.6 1.0 -14.4 253 6.7 33.8 66.6 259 +03042520.ANB 0 11.5 783 -1 777 164 64.0 1.3 -14.0 259 6.2 36.4 64.7 319 +03042400.SEP 0 14.4 2485 -6 558 393 62.4 9.8 -14.6 238 7.9 39.1 92.6 485 +03042022.MKL 0 12.5 1017 -22 789 92 57.6 0.9 -14.3 251 6.9 29.0 70.2 188 +03042019.MEM 0 13.1 1682 -6 857 78 50.6 1.1 -14.2 252 7.3 29.0 57.0 148 +03041922.P#0 0 11.7 1623 -17 730 127 72.6 2.1 -19.4 223 7.9 35.5 102.9 148 +03041920.END 0 10.6 1171 -12 629 144 57.4 1.6 -21.0 215 8.4 39.0 99.4 219 +03041907.FDR 0 12.6 1046 -418 613 365 65.8 0.0 -13.9 207 8.9 40.5 101.8 352 +03040720.HOU 0 16.5 2215 -1 373 67 57.9 1.4 -11.4 231 7.6 30.3 77.2 191 +03040718.BPT 0 13.8 933 -139 741 16 59.0 0.1 -12.1 226 7.4 26.5 91.0 110 +03040717.LFT 0 14.1 780 -168 559 29 50.5 0.0 -12.0 233 7.3 29.3 84.8 74 +03040605.C12 0 11.3 655 -128 639 328 69.4 1.0 -14.6 250 7.3 45.3 111.0 697 +03040601.C11 0 12.1 2056 -4 832 109 75.1 2.2 -15.3 251 7.6 26.4 93.3 198 +03040400.LW1 0 13.3 2761 -1 682 153 54.3 3.8 -15.1 242 7.6 32.9 52.2 224 +03040322.HBR 0 9.5 1315 -38 1655 57 42.4 0.2 -14.8 235 7.5 33.0 47.0 130 +03032821.MBS 0 7.7 95 -1 1423 199 68.1 0.1 -17.6 223 6.6 48.9 65.7 252 +03032819.AZO 0 8.9 146 -2 830 200 60.9 0.3 -17.3 225 6.7 54.5 64.3 255 +03031722.SPS 0 10.7 981 -38 1183 127 34.3 0.6 -15.4 236 7.3 19.3 95.8 139 +03031720.SPS 0 10.2 947 -44 1140 35 24.3 0.0 -16.7 216 7.4 15.4 100.9 42 +03031221.PBI 0 14.2 1790 -2 1215 21 36.5 0.2 -12.1 258 7.7 2.8 67.6 -23 +03031218.FPR 0 15.8 2760 -2 892 -28 38.6 -0.5 -14.1 256 8.0 11.8 71.6 86 +01062102.ICT 0 13.9 1917 -38 976 89 37.8 1.1 -11.3 291 7.3 26.8 48.8 202 +01061623.JMS 0 8.9 600 -4 1096 41 40.5 0.2 -18.1 283 7.1 25.4 84.9 82 +01061122.RGK 0 14.3 3269 -77 1618 201 51.8 1.8 -10.9 265 8.4 35.2 56.2 397 +01060502.CSM 0 15.8 3992 -79 1412 107 34.9 1.2 -8.4 251 8.1 28.3 40.7 227 +01060501.LHX 0 8.3 615 -248 1957 94 44.0 0.0 -11.2 243 9.0 29.0 49.3 127 +03062823.RST 0 8.8 203 -71 1471 26 40.8 0.0 -12.1 287 4.8 15.4 60.6 57 +03062822.BH4 0 6.7 253 -82 2374 15 53.7 0.0 -12.2 288 8.0 39.8 64.9 352 +03062820.WSC 0 9.5 432 -25 1288 24 38.2 0.1 -13.2 292 5.0 20.7 57.7 45 +03062800.C07 0 9.3 1323 -51 2202 29 36.5 0.0 -9.3 311 7.4 12.9 41.7 81 +03062800.8V7 0 10.5 2208 -13 2023 82 42.3 0.0 -8.2 320 7.8 44.3 44.0 293 +03062722.8V7 0 11.1 2543 -6 1821 66 38.6 0.2 -8.4 315 7.5 40.0 47.0 258 +03062721.C07 0 8.9 1146 -29 2232 32 35.4 0.0 -9.2 306 7.2 11.7 50.1 74 +03062401.CYS 0 10.5 1054 -23 891 146 67.4 1.5 -8.4 210 6.6 44.6 77.5 258 +03062022.ROW 0 10.0 1448 -1 2438 18 41.2 0.0 -8.3 220 7.9 29.6 51.3 74 +03062022.CVS 0 12.0 1680 -21 1220 96 32.9 0.7 -8.5 224 7.2 20.3 41.0 110 +03062020.CVS 0 12.3 2087 -2 1100 14 22.8 0.0 -9.4 233 7.4 10.8 35.9 48 +03061501.CNM 0 11.3 2677 -1 2178 -48 31.4 0.0 -11.2 338 8.5 17.4 38.2 109 +03061423.HOB 0 9.6 1525 -68 2132 7 32.6 0.0 -11.5 330 8.5 14.0 32.3 24 +03061223.C11 0 20.9 5150 -8 501 190 32.5 5.3 -8.9 269 8.0 41.4 58.8 339 +03061221.AGC 0 13.1 691 -9 1032 158 35.1 0.6 -8.8 227 5.9 34.2 44.2 256 +03060401.TCC 0 11.4 1746 -91 1622 -15 59.6 -0.1 -9.6 288 8.2 44.8 48.7 398 +03060322.LBB 0 13.6 2239 -128 1199 80 45.2 0.5 -9.1 302 7.9 31.8 57.3 316 +03060302.LRD 0 17.3 3023 -81 1418 -4 35.4 0.0 -5.0 285 7.3 27.3 67.7 -12 +03053121.ILM 0 13.5 1237 -102 1265 394 58.4 2.3 -10.4 275 6.3 47.7 74.8 576 +03052001.ADM 0 16.8 3033 -19 1155 81 33.3 1.2 -8.4 288 7.5 14.5 61.0 188 +03051922.FSI 0 15.9 2088 -80 836 131 37.4 1.4 -8.3 246 8.1 40.1 50.7 385 +03051409.C12 0 13.9 2056 -415 1151 505 44.5 0.0 -12.7 290 9.5 25.4 80.3 466 +03051406.LW1 0 15.8 3351 -219 819 259 50.4 0.0 -11.8 274 8.3 12.9 74.5 238 +03051401.C11 0 13.9 3239 -178 1774 132 58.3 0.1 -9.9 286 8.2 22.1 60.4 192 +03051322.CDS 0 12.4 3323 -92 2274 79 49.1 0.0 -10.1 280 8.6 18.1 68.8 98 +03051223.MRF 0 11.6 1914 -2 1612 41 42.7 0.2 -6.0 279 6.7 33.9 49.2 174 +03051019.MLC 0 14.5 849 -221 615 158 58.7 0.0 -8.7 240 7.6 34.0 74.3 199 +03051017.P#Q 0 16.5 2801 -34 619 97 68.4 2.7 -9.2 235 7.2 32.3 77.8 168 +03051000.P#J 0 16.2 3929 -21 888 74 55.8 2.7 -12.5 247 7.6 33.6 64.7 227 +03050922.LEX 0 15.5 2304 -3 715 119 55.3 2.5 -9.5 278 7.4 32.8 69.7 185 +03050921.COU 0 16.1 4338 -12 941 67 45.4 2.2 -11.8 246 7.4 35.8 73.5 264 +03050920.SDF 0 15.2 2300 -15 871 88 52.2 1.8 -10.2 268 7.2 36.6 70.7 247 +03050520.MKL 0 15.8 2332 -17 581 247 71.6 5.8 -11.9 263 7.3 40.2 88.1 300 +03050223.BMX 0 15.4 3487 -10 686 61 44.2 1.6 -13.2 283 6.8 21.9 38.7 114 +03050221.HSV 0 13.0 2237 -40 946 139 42.3 2.2 -13.8 264 7.0 27.8 33.8 201 +03050221.ABL 0 13.6 3056 -5 1063 81 40.9 1.6 -14.7 280 7.2 27.0 27.0 130 +03050219.SJT 0 15.1 4252 -2 1189 17 38.9 0.4 -12.5 277 8.1 4.7 61.7 18 +03050219.ABL 0 12.9 2572 -28 1072 45 27.2 0.5 -13.7 261 6.7 22.6 36.0 82 +03050218.MSL 0 13.0 2367 -24 912 19 25.5 0.2 -14.5 257 7.4 24.2 40.8 60 +03050201.ACT 0 13.6 2339 -88 1301 -44 31.1 -0.3 -11.9 280 8.3 21.3 53.8 -77 +03050102.END 0 14.0 3853 -58 1033 227 43.6 5.8 -13.5 250 7.4 27.5 43.5 247 +03071221.AVL 0 11.9 710 -2 1196 56 37.5 0.2 -8.5 266 5.6 31.7 43.3 103 +03071201.FOE 0 16.7 3598 -41 1289 -96 59.4 -2.4 -10.2 313 7.9 33.9 54.8 89 +03071200.FOE 0 16.2 3683 -11 1441 -16 63.8 -0.3 -11.0 315 7.7 31.9 59.2 109 +03071123.P#H 0 12.6 927 -26 1632 97 59.9 0.3 -9.9 322 7.2 45.3 55.0 319 +03070904.PHP 0 14.6 2161 -292 1066 549 72.4 0.0 -8.6 260 8.8 53.5 55.7 683 +03070900.BH3 0 8.3 1108 -106 2627 277 55.8 0.0 -7.9 250 8.4 55.7 68.2 568 +03070723.LVS 0 8.8 850 -179 2135 85 20.0 0.0 -6.4 329 8.7 24.3 27.9 305 +03070720.DSM 0 18.0 4261 -35 1012 20 39.2 0.6 -9.9 262 8.0 13.2 34.7 79 +03070719.LVS 0 9.9 1337 -68 1800 12 22.3 0.0 -7.2 336 8.0 27.0 21.0 98 +03070600.VTN 0 11.6 1572 -201 1584 157 52.8 0.0 -9.5 273 8.2 30.3 50.1 293 +03070521.RAP 0 8.7 803 -208 2327 67 22.6 0.0 -11.2 272 8.5 6.7 33.0 46 +03070521.P#7 0 10.3 1147 -137 2084 84 43.4 0.0 -10.3 249 8.1 22.9 55.2 239 +03070517.BH3 0 8.9 1171 -147 2263 -14 27.2 0.0 -12.5 293 9.1 15.8 39.6 51 +03070305.GDV 0 9.1 634 -206 1972 120 22.6 0.0 -13.9 250 8.7 30.3 58.1 255 +03063018.AUG 0 11.8 1327 -56 1152 60 42.9 0.5 -12.3 267 5.3 24.4 72.0 118 +03081800.BH5 0 9.0 725 -5 2392 -33 27.4 0.0 -9.3 180 7.6 12.2 31.3 76 +03081322.XRW 0 16.6 1031 -16 519 88 21.6 0.0 -6.2 187 5.5 23.7 39.1 164 +03081202.SEP 0 12.7 373 -104 1300 -113 55.9 -0.2 -8.4 345 6.8 38.0 68.0 -12 +03081200.FWD 0 12.2 1050 -51 2135 -30 50.2 0.0 -8.8 339 6.7 35.0 52.7 68 +03081023.P#9 0 13.9 1702 0 1195 30 41.7 0.3 -9.2 346 6.8 25.8 56.8 104 +03080902.P#C 0 15.5 3216 -71 1472 8 27.4 0.1 -6.4 277 7.9 17.3 40.8 199 +03080900.MIB 0 15.0 3325 -48 1477 39 33.2 0.4 -9.0 291 7.7 10.7 43.9 102 +03080900.P#C 0 14.4 3127 -1 1826 10 25.0 0.0 -5.8 262 7.5 12.2 42.3 64 +03080622.GLD 0 12.9 3132 -2 2338 21 28.1 0.0 -7.1 306 8.2 14.7 32.7 115 +03080601.CNU 0 15.8 2262 -28 1629 -18 34.6 -0.1 -5.1 317 6.6 25.1 42.1 49 +03080600.SUX 0 15.5 1945 -3 996 54 38.2 0.7 -8.6 321 7.0 35.9 44.6 171 +03080521.TOP 0 16.0 2857 -24 1592 -7 30.8 0.0 -6.8 308 6.3 19.6 40.9 101 +03080520.DAN 0 15.0 2224 -8 858 8 18.6 0.0 -10.1 275 6.4 27.6 30.4 121 +03080422.P#R 0 15.1 1771 -64 1131 59 51.1 0.7 -8.5 326 6.5 23.7 72.7 144 +03080401.BVX 0 16.9 2856 -38 1072 96 33.8 1.4 -8.7 308 6.7 18.2 47.9 100 +03080202.LUS 0 9.3 520 -170 1828 -21 47.7 0.0 -8.2 291 7.9 30.7 60.7 11 +03080123.CRL 0 13.5 2544 -8 1131 18 35.3 0.2 -12.9 299 7.9 26.6 36.1 109 +03080103.MCW 0 11.0 914 -111 1515 8 24.1 0.0 -12.2 281 7.0 26.6 47.8 60 +03073123.C31 0 8.6 251 -238 2988 79 50.4 0.0 -8.0 311 8.0 29.8 74.4 268 +03073120.TVL 0 10.6 1275 -24 1488 33 34.5 0.1 -7.4 90 7.8 32.3 17.1 170 +03072700.IWD 0 15.1 1598 -19 1386 149 42.6 1.0 -6.1 276 5.9 27.7 60.4 150 +03071802.BH1 0 13.9 2073 -132 1543 52 64.4 0.2 -6.9 291 7.8 47.0 77.9 171 +03071721.RAP 0 14.6 3713 -127 1972 107 39.2 0.0 -6.2 280 8.5 31.5 54.8 181 +03071320.MSL 0 16.4 2839 -21 1060 37 23.4 0.0 -9.3 310 7.1 4.1 36.8 35 +03071320.DIK 0 9.2 2113 -26 3189 -19 27.9 0.0 -9.3 266 9.0 11.0 36.6 31 +04040721.P#U 0 11.2 1509 -10 1060 103 47.1 1.2 -15.7 268 6.4 35.8 60.8 191 +04040702.SPS 0 8.6 230 -53 980 110 36.0 0.2 -17.3 236 6.3 19.0 53.3 110 +04040700.FTW 0 10.4 641 -8 948 43 57.7 0.3 -14.3 228 6.4 22.9 60.1 83 +04040422.LRD 0 13.8 2148 -1 827 171 49.4 3.0 -12.9 244 7.0 31.5 38.8 217 +04040421.ALI 0 13.2 1124 -3 718 10 40.8 0.1 -13.2 238 7.0 18.0 35.9 100 +04032701.DHT 0 9.5 1004 -128 1142 153 30.2 0.3 -13.4 233 8.2 31.2 63.3 235 +04032623.RAP 0 8.7 1651 -52 1568 172 42.5 0.9 -15.5 205 8.0 26.0 46.8 264 +04031802.FSM 0 8.0 442 -99 1939 211 48.0 0.0 -17.1 278 7.5 37.8 72.5 338 +04031800.P#P 0 9.4 1357 -30 1585 127 45.0 0.5 -17.4 288 7.7 34.4 66.4 269 +04030121.ORD 0 7.2 534 -1 908 208 58.9 1.1 -23.3 222 6.6 37.3 72.6 297 +04030120.RFD 0 6.8 505 -7 892 172 55.3 0.8 -24.3 220 6.8 34.8 71.1 256 +04022416.MCO 0 13.1 534 -37 687 121 47.0 0.5 -10.8 255 5.0 28.8 81.9 156 +04022407.G#5 0 10.5 962 -124 801 -16 47.4 -0.1 -18.2 218 7.7 31.4 83.7 14 +04022316.MSY 0 11.3 0 -9999 417 436 51.3 0.0 -11.2 240 6.1 44.9 86.2 531 +04020601.BTR 0 11.7 57 -172 540 186 69.9 0.0 -13.3 214 7.0 48.1 87.1 199 +04020514.LFT 0 11.1 165 -244 1109 583 49.0 0.0 -11.7 217 6.5 46.0 63.5 611 +04020512.LCH 0 13.6 1421 -64 497 282 49.1 3.0 -12.5 222 6.8 41.7 68.1 319 +04011921.VRB 0 10.3 196 -20 878 -16 82.2 0.0 -14.0 242 5.1 46.9 123.3 207 +03112718.RUE 0 10.5 681 0 396 4 92.3 0.0 -20.1 238 7.0 35.8 100.8 153 +03110923.SAC 0 6.9 156 -14 892 38 24.7 0.0 -25.3 234 7.5 14.4 91.8 77 +03102818.CTY 0 16.5 1074 -53 594 181 37.6 1.2 -7.8 217 6.3 23.6 51.5 193 +03100822.VAD 0 14.1 1355 -7 765 -4 27.1 0.0 -11.2 277 6.4 13.9 52.0 68 +03092718.CBE 0 11.6 969 -2 1256 109 40.4 0.5 -12.3 213 6.1 33.1 58.2 137 +03092620.UIN 0 12.7 1139 -3 844 177 50.2 1.7 -14.6 266 7.9 42.7 77.1 266 +03092619.BRL 0 11.1 906 -34 824 125 50.2 1.0 -14.9 256 6.9 40.9 76.6 149 +03091200.MRF 0 9.8 747 -2 1645 9 36.3 0.0 -6.8 276 6.2 25.5 49.1 163 +03090900.MAF 0 9.9 1214 -1 2565 13 32.3 0.0 -8.4 313 7.4 22.4 35.6 163 +03083123.HUF 0 14.8 27 -163 471 268 39.8 0.0 -6.8 243 6.3 41.6 43.2 340 +03082601.P#4 0 12.9 980 -231 1606 140 42.5 0.0 -9.4 277 7.1 39.4 44.3 283 +03082600.ABR 0 14.2 3471 -76 1925 104 37.8 0.1 -11.4 289 8.6 27.8 43.9 143 +03082221.LOL 0 9.6 944 -94 1467 89 64.9 0.3 -12.3 188 8.3 46.4 77.0 299 +03082119.APX 0 14.4 2077 -120 1359 80 36.1 0.3 -8.3 255 7.1 34.1 35.4 132 +03082100.DLH 0 16.1 2503 -11 1009 166 39.5 2.7 -8.1 226 6.2 24.3 46.3 201 +04051501.PUB 0 3.9 204 -85 2585 153 55.2 0.0 -18.2 268 8.8 42.0 78.8 355 +04051423.COS 0 4.6 230 -87 1664 52 57.1 0.0 -18.0 274 8.2 45.2 68.4 179 +04051300.HBR 0 14.0 4148 -28 1710 172 41.2 1.4 -11.1 244 7.8 44.0 46.5 333 +04051100.LUS 0 8.3 917 -69 1429 204 53.5 0.8 -11.5 237 7.4 28.1 44.2 323 +04050923.CVS 0 5.9 554 -61 3040 -32 23.7 0.0 -12.6 309 9.6 17.1 15.5 78 +04050921.STC 0 9.9 1302 -52 1737 185 49.7 0.5 -14.2 264 7.5 46.1 49.8 400 +04050900.P#A 0 13.8 2438 -42 1008 193 29.0 2.3 -12.7 278 7.7 19.9 36.2 251 +04050822.BH3 0 5.3 996 -6 3054 49 48.0 0.0 -15.0 280 9.6 8.9 60.8 58 +04050522.RIC 0 8.3 824 -38 1493 133 43.8 0.4 -20.4 310 7.1 34.9 60.9 251 +04050101.FWD 0 13.9 2471 -39 907 158 44.9 2.9 -14.8 225 8.3 23.0 58.2 185 +04043021.C12 0 13.3 2483 -8 1029 37 45.1 0.7 -14.1 236 7.9 32.8 46.0 48 +04043020.DYS 0 14.1 2950 -10 638 71 52.3 1.8 -14.3 236 7.8 34.1 51.0 143 +04043018.ABI 0 12.0 2372 -1 1211 -3 32.6 0.0 -13.6 230 7.7 22.8 40.3 -22 +04042920.MLU 0 12.9 972 0 744 72 46.0 0.5 -14.5 232 6.6 29.2 45.8 176 +04042821.G#2 0 10.1 747 -3 1175 139 56.7 0.8 -14.7 252 7.4 32.3 53.8 179 +04042521.CDS 0 7.1 679 -5 2042 20 45.4 0.0 -17.7 276 7.7 27.7 76.8 88 +04042300.SGF 0 9.8 113 -134 794 263 69.4 0.1 -15.2 267 7.5 51.1 79.0 572 +04042300.P#P 0 14.6 2114 -9 448 155 49.9 2.7 -13.6 245 7.2 26.3 46.7 258 +04042223.C12 0 12.6 1615 -11 1173 56 54.8 0.7 -10.8 266 6.6 36.5 68.7 191 +04042222.UMN 0 10.5 412 -29 663 220 60.2 0.9 -17.5 254 8.2 45.7 67.6 357 +04042221.C34 0 11.2 1504 -22 1170 72 53.8 0.8 -15.5 265 7.8 38.9 55.3 252 +04042200.ADM 0 11.7 1347 -25 1310 194 51.9 1.6 -13.2 269 6.8 28.4 68.1 339 +04042122.C12 0 11.5 1550 -3 1449 83 53.3 0.6 -13.2 261 6.6 30.3 65.8 168 +04041921.HOB 0 11.3 2173 -1 1395 86 53.9 1.0 -10.9 235 6.7 32.7 83.0 143 +04041801.MFD 0 10.8 1224 -65 1060 185 23.7 0.0 -16.5 288 8.0 29.7 50.0 245 +04041723.MFD 0 11.9 2519 -15 1046 104 26.5 1.1 -15.5 303 7.2 29.2 37.6 184 +04041105.MFE 0 15.8 2222 -37 402 26 39.9 0.4 -11.6 248 7.5 2.1 69.3 23 +04041019.ILM 0 9.2 180 -45 1165 111 41.2 0.1 -16.1 267 6.0 29.7 69.5 345 +04041001.PRX 0 8.8 516 -75 1780 210 42.3 0.1 -14.1 270 6.7 37.6 59.1 314 +04040818.DAB 0 13.2 1058 -19 810 73 56.2 0.7 -15.8 264 7.7 33.6 94.9 186 +04040815.DHN 0 11.9 877 -2 522 78 53.9 0.6 -15.8 257 6.5 30.9 87.6 111 +04071305.CHE 0 17.6 3151 -107 771 181 49.7 2.9 -8.9 301 7.9 29.7 60.2 300 +04070104.HBR 0 15.7 1988 -45 801 174 24.0 0.0 -8.2 259 7.0 25.9 23.7 276 +04062402.FNT 0 10.0 608 -67 1046 219 50.4 1.0 -15.3 260 6.5 32.1 72.4 270 +04062222.BIS 0 7.2 504 -14 1518 9 56.3 0.0 -18.7 301 6.3 28.7 75.6 88 +04062023.DHT 0 8.4 905 -127 2633 107 47.8 0.0 -9.3 270 8.8 36.3 67.8 192 +04061902.G#1 0 13.2 1631 -27 1122 144 35.1 1.2 -8.6 284 7.3 37.4 58.3 408 +04061900.HDN 0 6.4 316 -26 1668 -40 51.4 0.0 -13.3 257 8.3 36.5 73.3 29 +04061820.FAM 0 15.9 1842 -13 923 65 31.0 0.6 -7.0 271 5.7 23.9 35.7 131 +04061800.LHX 0 12.7 2059 -86 777 206 47.3 2.5 -11.2 235 8.4 37.4 49.6 651 +04052700.CHE 0 8.9 347 -4 1255 145 31.1 0.2 -14.7 268 6.1 31.0 44.9 228 +04052623.TYS 0 14.7 1654 -44 919 199 50.1 2.8 -9.7 275 5.9 37.8 71.9 255 +04052623.OKC 0 15.9 3047 -69 1198 124 56.8 2.5 -7.9 261 6.8 24.4 82.9 79 +04052622.FSD 0 9.4 835 -34 1187 143 35.4 0.6 -17.3 267 7.3 33.1 47.2 271 +04052621.CSV 0 14.4 1608 -15 870 176 59.8 2.8 -9.3 268 6.2 35.9 58.7 237 +04052621.C33 0 13.6 2405 -23 1847 104 55.5 0.4 -9.6 256 7.5 30.4 80.9 72 +04052603.CAI 0 15.4 1463 -14 609 129 47.0 1.5 -11.0 277 7.2 31.6 59.9 153 +04052402.P#7 0 7.8 400 -213 1358 246 41.2 0.0 -15.5 247 8.2 35.3 62.4 412 +04052400.STL 0 16.1 3087 -3 604 162 45.4 3.8 -12.7 253 8.0 28.6 58.7 195 +04052400.CDR 0 5.8 117 -187 2181 178 56.7 0.0 -14.5 256 8.0 30.8 66.1 338 +04052323.BGM 0 14.6 2244 0 781 156 41.1 2.4 -11.9 272 7.8 30.1 44.7 249 +04052320.PIN 0 12.0 1300 -3 1376 120 33.7 0.6 -11.8 267 6.7 36.9 31.3 199 +04052300.ELM 0 12.4 1089 -41 1163 226 43.8 1.5 -9.7 281 5.7 46.2 46.0 359 +04052201.G#1 0 12.3 2404 -84 1771 261 33.8 0.6 -8.2 246 7.9 36.9 50.5 385 +04052201.SNY 0 7.0 484 -214 2287 78 62.8 0.0 -12.7 227 9.0 42.4 81.2 214 +04052123.HYS 0 12.7 3460 -27 2109 75 39.7 0.0 -10.8 236 8.6 29.0 45.1 157 +04052100.FKL 0 14.7 2440 -9 772 269 42.7 4.7 -10.6 299 6.4 28.6 49.2 346 +04052100.DEN 0 9.0 1781 -3 1934 76 49.3 0.1 -11.5 231 8.4 30.6 60.1 225 +04051723.DSM 0 13.3 1669 -24 854 23 36.8 0.2 -11.5 251 6.5 26.2 51.1 132 +04051723.PUB 0 9.2 546 -83 1212 147 55.3 0.5 -11.9 251 7.8 44.9 72.1 222 +04051601.9V9 0 7.5 608 -65 1315 120 61.8 0.5 -19.3 286 7.0 35.7 85.8 189 +04051521.PIR 0 6.8 724 -30 1545 91 60.8 0.3 -21.3 289 7.3 36.7 70.4 224 +04051520.Y26 0 7.0 965 -32 1206 89 60.4 0.7 -23.7 287 7.8 40.0 67.1 217 +99053023.P07 0 12.1 2286 -113 1897 53 39.7 0.1 -8.5 315 7.8 22.5 45.3 165 +99052800.FTW 0 12.2 1104 -4 954 41 33.8 0.3 -12.6 256 6.8 24.6 36.5 103 +99052503.FST 0 10.3 1116 -185 1882 122 53.5 0.0 -9.7 271 8.3 44.1 67.4 157 +99052502.INK 0 11.4 1576 -110 1665 119 56.3 0.4 -10.0 270 7.8 39.9 60.4 191 +99052420.ABQ 0 8.1 781 -71 1338 71 34.2 0.2 -13.9 212 8.5 24.7 44.7 132 +99052220.TUL 0 16.0 3471 -3 869 32 31.1 0.6 -12.1 269 7.3 20.4 36.1 91 +99052200.SNY 0 8.7 1439 -7 1674 53 48.7 0.2 -12.8 266 7.7 28.2 65.4 147 +99052123.RAP 0 8.6 1729 -70 1711 131 43.6 0.4 -16.2 256 8.7 23.0 67.0 178 +99052001.MOT 0 8.0 903 -1 1506 2 27.5 0.0 -17.4 240 7.0 14.4 59.7 47 +99051700.LAA 0 7.5 817 -141 1731 124 65.0 0.1 -15.0 234 8.6 43.8 78.0 361 +99050519.MVN 0 12.9 1777 -10 790 108 57.7 1.8 -14.1 237 6.6 41.0 44.8 194 +99043001.INK 0 12.4 2333 -60 967 95 52.8 1.8 -11.4 237 8.1 32.9 71.8 280 +99042900.BIL 0 6.5 60 -143 1109 133 46.8 0.0 -17.8 182 7.5 39.8 84.0 324 +99042800.EVV 0 9.5 305 -3 1146 22 26.2 0.0 -15.6 225 6.4 18.9 38.1 56 +99042701.OKC 0 8.9 873 -24 1056 47 27.4 0.2 -20.3 275 7.9 23.0 44.2 88 +99042322.LOZ 0 12.8 1995 -5 979 77 37.3 1.0 -11.6 287 6.9 30.4 44.4 71 +99042319.EZF 0 10.2 1142 -51 1722 106 57.2 0.3 -14.2 276 6.9 38.0 68.5 172 +99042203.GOK 0 12.3 2307 -132 894 364 53.9 3.4 -16.0 254 8.5 31.2 54.6 401 +99042123.BMI 0 11.6 1687 -24 839 261 53.4 3.9 -16.4 252 7.8 45.9 57.4 408 +04083002.GCK 0 10.7 1029 -108 1687 204 32.5 0.2 -8.1 315 6.8 29.0 26.2 278 +04083000.SUX 0 10.7 779 -7 1471 199 42.6 0.6 -12.9 289 6.7 36.3 45.9 296 +04082622.C23 0 10.2 983 -43 1349 25 41.1 0.1 -15.8 254 7.2 17.8 70.6 46 +04082621.MCW 0 15.4 2478 -27 1087 26 46.1 0.5 -9.9 239 7.0 37.9 68.9 181 +04082522.FSM 0 18.2 3688 -45 1240 101 33.9 1.6 -6.7 244 6.2 16.5 39.6 113 +04082522.BIS 0 10.2 2077 -41 1811 74 38.1 0.2 -15.2 230 8.4 22.8 43.2 103 +04082503.MHK 0 19.2 4217 -59 627 274 31.2 5.7 -7.9 224 7.5 31.4 51.8 392 +04082501.MHK 0 18.9 4262 -45 721 150 29.9 3.2 -7.4 240 7.1 28.3 50.9 241 +04082020.BGM 0 14.6 1425 -21 712 95 53.2 1.2 -9.5 238 5.9 38.1 53.7 106 +04082018.ORH 0 15.1 2067 -19 1051 47 40.0 0.6 -8.9 256 6.1 29.0 39.9 132 +04081918.LBE 0 14.4 1183 -7 597 105 39.9 0.8 -8.7 270 5.6 40.5 44.4 152 +04081901.PIA 0 13.9 1294 -107 1203 377 40.4 1.6 -7.9 277 5.6 39.8 43.3 465 +04081822.BRL 0 15.3 2600 -41 963 377 41.3 6.8 -9.4 276 6.6 42.5 42.9 508 +04081421.LIC 0 9.9 1288 -66 1242 15 32.2 0.1 -10.2 333 7.8 25.5 42.7 65 +04080321.OAX 0 18.7 4816 -44 1389 92 36.9 1.7 -5.9 259 7.0 23.6 38.1 189 +04080202.Y26 0 15.4 3187 -169 1209 336 55.2 1.6 -9.3 291 8.1 28.5 83.2 385 +04080123.Y22 0 8.5 1290 -28 3011 -1 45.9 0.0 -10.5 298 8.6 30.2 71.2 158 +04073101.GAG 0 14.4 2006 -116 1300 54 42.0 0.3 -6.2 308 6.7 14.8 44.7 98 +04072102.FSD 0 19.9 4659 -49 869 261 26.0 5.3 -5.9 278 7.3 28.0 37.4 426 +99081101.HLC 0 17.4 3928 -33 1289 71 38.3 1.3 -5.1 243 6.7 21.0 34.5 152 +99081023.AKO 0 14.9 2910 -32 1271 87 33.9 1.0 -6.5 232 7.6 22.7 45.7 163 +99080901.DIK 0 12.0 2409 -98 1891 48 58.5 0.1 -10.8 267 8.5 29.7 54.5 94 +99080822.2WX 0 10.3 1972 -32 2526 39 44.1 0.0 -8.8 262 8.3 27.2 41.0 117 +99080702.RAP 0 12.7 921 -36 1200 35 33.6 0.1 -6.6 268 6.3 20.0 48.7 72 +99080301.LWT 0 8.5 449 -155 1772 53 48.3 0.0 -10.3 278 7.8 29.4 70.4 131 +99073100.JKL 0 15.8 3605 -30 1833 89 22.3 0.0 -5.9 355 6.7 22.8 19.6 158 +99073020.IPT 0 15.0 2685 -12 1238 32 34.0 0.4 -8.7 319 6.3 16.0 50.7 72 +99072922.FVX 0 14.5 1431 -13 1556 81 34.3 0.3 -6.0 327 5.6 22.6 48.0 117 +99072902.XVG 0 12.7 1459 -186 1710 319 58.3 0.1 -9.5 302 7.7 41.9 73.8 381 +99072900.ADG 0 14.8 1974 -6 1415 63 37.3 0.5 -9.4 298 7.1 21.7 66.3 118 +99072420.MHT 0 14.8 1594 -17 1088 66 27.8 0.5 -9.7 275 6.5 25.2 56.1 134 +99072319.RAP 0 10.6 1320 -19 2145 52 38.7 0.0 -7.5 263 7.3 22.5 54.0 87 +99072300.FAR 0 16.2 2819 -34 1355 81 35.4 0.9 -8.5 247 7.6 27.9 55.9 137 +99071923.GDV 0 11.9 1807 -31 1654 21 41.3 0.1 -11.2 254 7.9 18.9 69.4 67 +99071302.FAR 0 12.1 1948 -48 1552 125 38.2 0.7 -12.5 297 7.2 27.2 61.0 158 +99071302.DVL 0 10.4 1453 -76 1761 69 42.5 0.1 -13.5 288 7.5 28.3 62.4 124 +99071300.OLF 0 9.2 1101 -38 2374 25 49.7 0.0 -10.3 281 7.3 26.5 65.7 106 +99071202.AIA 0 9.4 1094 -73 1844 -8 27.8 0.0 -11.3 327 8.0 26.7 47.0 79 +99070804.GDV 0 14.2 2058 -209 1364 472 61.7 0.0 -7.6 251 8.0 40.8 78.6 551 +99070421.ERY 0 19.1 3756 -61 791 95 32.9 1.8 -6.7 267 8.2 22.2 36.6 98 +99070207.SFD 0 9.5 32 -374 1535 254 82.4 0.0 -10.7 263 7.4 45.0 92.7 464 +99070103.SWO 0 18.3 2994 -18 703 229 51.1 5.8 -4.6 303 6.4 25.9 51.9 297 +99070103.GCK 0 15.2 2113 -124 873 95 73.0 1.0 -6.5 294 7.5 37.6 74.8 319 +99063023.LBF 0 9.7 291 -114 1136 0 76.3 0.0 -12.3 289 6.9 54.3 115.6 214 +99062801.BGD 0 13.8 2864 -63 2251 73 37.7 0.0 -5.0 266 8.5 22.5 43.1 130 +99062522.DIK 0 12.8 2775 -1 1732 -52 57.7 -0.4 -10.3 230 8.2 35.4 58.9 132 +99062501.VTN 0 11.7 1035 -41 1545 55 41.3 0.2 -8.2 282 6.6 23.6 41.7 120 +99062400.BGD 0 12.2 2544 -17 2195 10 13.6 0.0 -6.5 288 7.8 22.6 35.1 91 +99060601.P07 0 11.8 1543 -130 1771 -31 45.2 0.0 -8.7 243 7.9 18.4 58.3 32 +99060523.LBF 0 10.7 2070 -28 1957 91 62.6 0.1 -12.9 197 8.5 25.9 90.4 131 +99060302.IML 0 10.0 869 -198 1657 237 43.7 0.0 -11.0 225 8.5 39.8 66.5 421 +99060202.GCC 0 6.3 226 -83 1883 18 41.3 0.0 -15.4 262 8.3 26.0 42.6 126 +99060200.FTW 0 16.8 3982 -31 1338 62 35.0 1.0 -11.1 275 8.5 25.7 60.3 144 +99053102.MHK 0 11.6 903 -51 1360 108 32.8 0.3 -11.3 270 6.9 30.0 24.5 179 +99120303.ADM 0 9.7 1355 -50 974 250 42.8 2.4 -22.1 217 8.5 35.9 65.7 332 +99112303.RBD 0 13.2 1077 -16 789 138 48.1 1.2 -13.6 235 6.4 25.1 60.9 176 +99112302.HBR 0 8.7 124 -124 660 53 47.7 0.0 -17.1 219 6.7 41.5 75.7 132 +99100823.FSI 0 10.1 649 -14 1313 5 36.2 0.0 -13.6 219 6.3 14.3 67.9 56 +99092600.GKY 0 13.1 1483 -15 1429 43 28.0 0.2 -9.4 340 6.3 21.5 55.3 182 +99092522.D07 0 6.4 163 -199 2219 136 65.7 0.0 -15.8 242 8.3 31.8 105.7 206 +99092004.RRC 0 11.2 292 -200 1044 70 37.2 0.0 -11.2 270 6.7 28.8 60.6 216 +99092000.OKC 0 11.1 1068 -42 1896 56 39.5 0.0 -10.1 290 6.8 29.0 60.9 190 +99091923.CSM 0 11.9 1645 -3 1885 18 41.3 0.0 -9.8 280 7.0 27.5 64.0 178 +99091920.CGZ 0 11.2 802 -16 1905 19 39.1 0.0 -8.7 245 6.5 16.0 60.3 61 +99091207.SLP 0 15.6 2094 -69 507 92 45.4 1.3 -10.8 271 8.2 16.8 55.8 121 +99091200.LBL 0 11.9 1180 -121 1590 31 43.2 0.1 -9.0 275 7.8 25.7 65.5 84 +99091122.HLC 0 12.4 1517 -36 1221 59 37.8 0.4 -11.3 253 7.4 21.0 66.2 94 +99091101.AFW 0 13.1 1250 -24 1970 21 29.5 0.0 -7.4 297 6.2 21.7 52.8 139 +99082300.ABR 0 11.7 1432 -38 1851 61 40.1 0.1 -9.6 289 6.9 20.3 45.5 101 +99082104.HON 0 13.3 1187 -244 1155 197 38.1 0.0 -8.9 281 7.4 31.4 54.2 238 +99082100.LBF 0 9.8 20 -311 1794 44 34.8 0.0 -7.8 321 7.1 19.7 46.1 126 +99082022.DIK 0 11.7 1445 -10 1669 21 33.6 0.1 -7.8 298 6.3 17.8 36.0 58 +99081922.MLS 0 7.1 393 -105 3278 19 33.8 0.0 -10.0 244 8.6 22.0 37.3 120 +99081800.RRT 0 11.4 1524 -26 847 90 49.2 1.1 -17.7 268 7.3 32.2 62.0 126 +99081400.ALB 0 16.8 1843 -4 701 196 38.5 2.3 -6.3 249 5.8 29.9 48.4 252 +99081202.GCC 0 10.6 877 -99 1162 63 34.5 0.2 -10.2 218 7.5 17.7 54.6 98 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/basics.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/basics.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/basics.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/basics.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/decoder.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/decoder.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/decoder.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/decoder.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_acars_times.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_acars_times.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_gem_times.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_gem_times.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_mdl_time.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_mdl_time.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_pfc_snd.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/get_pfc_snd.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/mapdraw.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/mapdraw.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/mapmark.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/mapmark.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/mapw.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/mapw.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/nsharp.mk b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/nsharp.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/readdata.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/readdata.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/readdata.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/readdata.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/sharp95.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/sharp95.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/skparams.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/skparams.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/skparams.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/skparams.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/sndata.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/sndata.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/so_new.csh b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/so_new.csh old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/thermo.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/thermo.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/thermo.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/thermo.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/winds.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/winds.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/winds.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/winds.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid1.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid1.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid2.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid2.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid3.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid3.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid4.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid4.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid5.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/nsharp_c/xwvid5.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml b/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml index 2c4287afde..fde8107b31 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml @@ -58,5 +58,15 @@ name="gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor"> - + + + + diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigHashMapAdaptor.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigHashMapAdaptor.java new file mode 100644 index 0000000000..5d25ac1327 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigHashMapAdaptor.java @@ -0,0 +1,78 @@ +package gov.noaa.nws.ncep.ui.nsharp; +/** + * + * gov.noaa.nws.ncep.ui.nsharp.NsharpConfigHashMapAdaptor + * + * + * 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 java.util.HashMap; +import java.util.Map.Entry; + +import javax.xml.bind.annotation.adapters.XmlAdapter; + + +public class NsharpConfigHashMapAdaptor extends + XmlAdapter> { + +/* + * (non-Javadoc) + * + * @see + * javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object) + */ + @Override + public NsharpLinePropertySerializable marshal( + HashMap v) throws Exception { + if (v == null) { + return null; + } + NsharpLinePropertySerializable serializable = new NsharpLinePropertySerializable(); + NsharpLinePropertySerializable.LinePropertyItem[] items = new NsharpLinePropertySerializable.LinePropertyItem[v + .size()]; + int i = 0; + for (Entry entry : v.entrySet()) { + items[i] = new NsharpLinePropertySerializable.LinePropertyItem(); + items[i].lineName = entry.getKey(); + items[i].lineProperty = entry.getValue(); + i++; + } + serializable.items = items; + return serializable; + } + + /* + * (non-Javadoc) + * + * @see + * javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object) + */ + @Override + public HashMap unmarshal( + NsharpLinePropertySerializable v) throws Exception { + HashMap map = null; + if (v.items == null) { + map = new HashMap(0); + } else { + map = new HashMap(v.items.length); + for (NsharpLinePropertySerializable.LinePropertyItem item : v.items) { + map.put(item.lineName, item.lineProperty); + } + } + + return map; + } +} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigManager.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigManager.java new file mode 100644 index 0000000000..59b25e436d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigManager.java @@ -0,0 +1,163 @@ +/** + * + * gov.noaa.nws.ncep.ui.nsharp.NsharpConfigManager + * + * This java class performs the surface station locator functions. + * This code has been developed by the SIB for use in the AWIPS2 system. + * + * This class handle Nsharp configuration saving and retrieving from file system. It also manages + * current configuration information. + *
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    	Engineer    Description
    + * -------		------- 	-------- 	-----------
    + * 03/13/2012   			Chin Chen	Initial coding
    + * 										
    + *
    + * 
    + * + * @author Chin Chen + * @version 1.0 + */ +package gov.noaa.nws.ncep.ui.nsharp; + +import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpGraphConfigDialog; +import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpLineConfigDialog; +import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; + +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.LocalizationFile; +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.localization.exception.LocalizationOpFailedException; +import com.raytheon.uf.common.serialization.SerializationException; +import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.viz.core.exception.VizException; + +public class NsharpConfigManager { + + private NsharpConfigStore nsharpConfigStore=null; + private static NsharpConfigManager instance=null; + + private NsharpConfigManager() { + instance = this; + } + + public static NsharpConfigManager getInstance() { + if(instance==null){ + new NsharpConfigManager(); + } + return instance; + } + + public NsharpConfigStore getNsharpConfigStore() { + return nsharpConfigStore; + } + + public void setNsharpConfigStore(NsharpConfigStore nsharpConfigStore) { + this.nsharpConfigStore = nsharpConfigStore; + } + private Map listFiles( IPathManager pthmgr, + String name, String[] filter, boolean recursive, boolean filesOnly ) { + LocalizationContext[] contexts = pthmgr.getLocalSearchHierarchy( LocalizationType.CAVE_STATIC ); + + Map lFileMap = new HashMap(); + + List lFilesList = + Arrays.asList( + pthmgr.listFiles( contexts, name, filter, recursive, filesOnly ) ); + + // loop thru the files and add them to the map if there is not already a file + // present from a higher level. + // + for( LocalizationFile lFile : lFilesList ) { + String lName = lFile.getName(); + LocalizationLevel lLvl = lFile.getContext().getLocalizationLevel(); + + if( !lFileMap.containsKey( lName ) || + (lFileMap.get( lName ).getContext().getLocalizationLevel().compareTo( lLvl ) < 0) ) { + //System.out.println("listFiles "+lFile.getFile().getAbsolutePath()); + lFileMap.put( lFile.getName(), lFile ); + } + + } + + return lFileMap; + } + //retrieve from file system + public NsharpConfigStore retrieveNsharpConfigStoreFromFs() { + if(nsharpConfigStore == null){ + // get configuration from nsharpConfig.xml + IPathManager pthmgr = PathManagerFactory.getPathManager(); + Map nsharpFiles =listFiles( pthmgr, + NcPathConstants.NSHARP_CONFIG, + new String[]{ ".xml" }, true, true ); + + for( LocalizationFile lFile : nsharpFiles.values() ) { + try { + //System.out.println("lFile name="+ lFile.getName()); + + Object xmlObj = SerializationUtil.jaxbUnmarshalFromXmlFile( + lFile.getFile().getAbsolutePath() ); + + if( xmlObj instanceof NsharpConfigStore ) { + nsharpConfigStore = (NsharpConfigStore)xmlObj; + break; + + } + } catch (SerializationException e) { + System.out.println("Error unmarshalling file: " + lFile.getFile().getAbsolutePath() ); + System.out.println( e.getMessage() ); + } + } + } + + if(nsharpConfigStore== null){ + // could not find configuration nsharpConfig.xml file + nsharpConfigStore = new NsharpConfigStore(); + nsharpConfigStore = NsharpGraphConfigDialog.setDefaultGraphConfig(nsharpConfigStore); + nsharpConfigStore=NsharpLineConfigDialog.setDefaultLineConfig(nsharpConfigStore); + } + return nsharpConfigStore; + } + //save to file system + public boolean saveConfigStoreToFs(NsharpConfigStore nsharpConfigStore) throws VizException{ + this.nsharpConfigStore = nsharpConfigStore; + // create a localization file for the plotModel + // + IPathManager pthmgr = PathManagerFactory.getPathManager(); + LocalizationContext userCntxt = pthmgr.getContext( + LocalizationType.CAVE_STATIC, LocalizationLevel.USER ); + + LocalizationFile + lFile = pthmgr.getLocalizationFile( userCntxt, + NcPathConstants.NSHARP_CONFIG ); + + + File configFile = lFile.getFile(); + + try { + SerializationUtil.jaxbMarshalToXmlFile( nsharpConfigStore, + configFile.getAbsolutePath() ); + + lFile.save(); + + } catch (LocalizationOpFailedException e) { + throw new VizException( e ); + } catch (SerializationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return true; + } +} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigStore.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigStore.java new file mode 100644 index 0000000000..6ce304b30b --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConfigStore.java @@ -0,0 +1,77 @@ +/** + * + * gov.noaa.nws.ncep.ui.nsharp.NsharpConfigStore + * + * This java class performs the surface station locator functions. + * This code has been developed by the SIB for use in the AWIPS2 system. + * + *
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    	Engineer    Description
    + * -------		------- 	-------- 	-----------
    + * 03/13/2012   			Chin Chen	Initial coding
    + * 										
    + *
    + * 
    + * + * @author Chin Chen + * @version 1.0 + */ +package gov.noaa.nws.ncep.ui.nsharp; + +import java.util.HashMap; +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 com.raytheon.uf.common.serialization.ISerializableObject; + +@XmlRootElement(name = "NsharpConfigStore") +@XmlAccessorType(XmlAccessType.NONE) +public class NsharpConfigStore implements ISerializableObject{ + + //@XmlElement(name = "NsharpLineProperty", required = true) + //private NsharpLineProperty lp; + + + //public NsharpLineProperty getLp() { + // return lp; + //} + + //public void setLp(NsharpLineProperty lp) { + // this.lp = lp; + //} + + @XmlElement + private NsharpGraphProperty graphProperty = new NsharpGraphProperty(); + + @XmlElement + //@XmlJavaTypeAdapter(NsharpConfigHashMapAdaptor.class) + @XmlJavaTypeAdapter(value = NsharpConfigHashMapAdaptor.class) + private HashMap linePropertyMap = new HashMap(); + + + + public HashMap getLinePropertyMap() { + return linePropertyMap; + } + + public void setLinePropertyMap( + HashMap linePropertyMap) { + this.linePropertyMap = linePropertyMap; + + } + + public NsharpGraphProperty getGraphProperty() { + return graphProperty; + } + + public void setGraphProperty(NsharpGraphProperty graphProperty) { + this.graphProperty = graphProperty; + } + + +} 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 37dc254ac4..00e925d3a8 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 @@ -28,10 +28,11 @@ import javax.measure.unit.SI; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; -import com.raytheon.uf.common.sounding.WxMath; +import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; public class NsharpConstants { public static Rectangle NSHARP_SkewTRectangle = new Rectangle(0, 0, 3200, 1850); + public static Rectangle NSHARP_HodoRectangle = new Rectangle(0, 0, 100, 100); public static final int DEFAULT_CANVAS_HEIGHT=700; public static final int DEFAULT_CANVAS_WIDTH=1100; //public static double TEMPERATURE_MIN = -115.0; @@ -67,6 +68,31 @@ public class NsharpConstants { public static final double[] PRESSURE_NUMBERING_LEVELS = { 1000, 850, 700, 500, 300, 200, 100 }; + //Icing pressure level 1000, 900,800,700,600, 500,400, 300 + public static final double ICING_PRESSURE_LEVEL_BOTTOM = 1000; + public static final double ICING_PRESSURE_LEVEL_TOP = 300; + public static final double ICING_PRESSURE_LEVEL_INC = 100; + //Icing relative humidity 100, 90,80,70,60, 50,40, 30,20,10,0 + public static final double ICING_RELATIVE_HUMIDITY_LEFT = 0; + public static final double ICING_RELATIVE_HUMIDITY_RIGHT = 100; + public static final double ICING_RELATIVE_HUMIDITY_INC = 10; + //Icing temperature (C) 25,20,15,10,5,0,-5,-10, -15,-20,-25 + public static final double ICING_TEMPERATURE_RIGHT = 25; + public static final double ICING_TEMPERATURE_LEFT = -25; + public static final double ICING_TEMPERATURE_INC = 5; + + //Turbulence pressure level 1000, 900,800,700,600, 500,400, 300, 200, 100 + public static final double TURBULENCE_PRESSURE_LEVEL_TOP =100; + public static final double TURBULENCE_PRESSURE_LEVEL_BOTTOM =1000; + public static final double TURBULENCE_PRESSURE_LEVEL_INC =100; + //Turbulence LN Richardson Number -2,-1, 0, 1,2,3,4,5,6,7,8 + public static final double TURBULENCE_LN_RICHARDSON_NUMBER_LEFT =8; + public static final double TURBULENCE_LN_RICHARDSON_NUMBER_RIGHT =-2; + public static final double TURBULENCE_LN_RICHARDSON_NUMBER_INC =-1; + //Turbulence wind shear TKE 50,45,40,35,30,25,20,15,10,5,0 + public static final double TURBULENCE_WIND_SHEAR_TKE_LEFT = 0; + public static final double TURBULENCE_WIND_SHEAR_TKE_RIGHT = 50; + public static final double TURBULENCE_WIND_SHEAR_TKE_INC = 5; // lightGray. public static final RGB backgroundColor = new RGB(191, 191, 191); @@ -139,9 +165,9 @@ public class NsharpConstants { public static final int LABEL_PADDING = 5; - public static double bottom = WxMath.getSkewTXY(1050, 0).y; + public static double bottom = NsharpWxMath.getSkewTXY(1050, 0).y; - public static double top = WxMath.getSkewTXY(100, 0).y; + public static double top = NsharpWxMath.getSkewTXY(100, 0).y; public static double height = top - bottom; @@ -168,6 +194,7 @@ public class NsharpConstants { 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_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); @@ -184,12 +211,27 @@ public class NsharpConstants { 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 }; - public static final int SKEWT_REC_X_ORIG = 300;//400; - public static final int SKEWT_REC_Y_ORIG = 150; + public static final int OMEGA_X_TOP = -40; + public static final int OMEGA_Y_TOP = 200;//225; + public static final int SKEWT_REC_X_ORIG = OMEGA_X_TOP + 160; + public static final int SKEWT_REC_Y_ORIG = OMEGA_Y_TOP-75; public static final int SKEWT_REC_WIDTH = 1000; public static final int SKEWT_REC_HEIGHT = 1002; public static final int SKEWT_VIEW_X_END = SKEWT_REC_X_ORIG + SKEWT_REC_WIDTH; public static final int SKEWT_VIEW_Y_END = SKEWT_REC_Y_ORIG + SKEWT_REC_HEIGHT; + public static final int OMEGA_Y_BOT = SKEWT_VIEW_Y_END-15; + public static final int ICING_REC_X_ORIG =SKEWT_REC_X_ORIG; + public static final int ICING_REC_Y_ORIG = SKEWT_REC_Y_ORIG; + public static final int ICING_REC_WIDTH = SKEWT_REC_WIDTH; + public static final int ICING_REC_HEIGHT = SKEWT_REC_HEIGHT-50; + public static final int ICING_VIEW_X_END = ICING_REC_X_ORIG + ICING_REC_WIDTH; + public static final int ICING_VIEW_Y_END = ICING_REC_Y_ORIG + ICING_REC_HEIGHT; + public static final int TURB_REC_X_ORIG =SKEWT_REC_X_ORIG; + public static final int TURB_REC_Y_ORIG = SKEWT_REC_Y_ORIG ; + public static final int TURB_REC_WIDTH = SKEWT_REC_WIDTH; + public static final int TURB_REC_HEIGHT = SKEWT_REC_HEIGHT -50; + public static final int TURB_VIEW_X_END = TURB_REC_X_ORIG + TURB_REC_WIDTH; + public static final int TURB_VIEW_Y_END = TURB_REC_Y_ORIG + TURB_REC_HEIGHT; public static final int DATAPANEL_REC_WIDTH = 750; public static final int DATAPANEL_REC_HEIGHT = 630; public static final int INSET_REC_WIDTH = DATAPANEL_REC_WIDTH/2;//250;//300; @@ -219,53 +261,10 @@ public class NsharpConstants { public static final int WIND_MOTION_REC_HEIGHT = 150; public static final int WIND_MOTION_VIEW_X_END = WIND_MOTION_REC_X_ORIG+WIND_MOTION_REC_WIDTH; public static final int WIND_MOTION_VIEW_Y_END = WIND_MOTION_REC_Y_ORIG+WIND_MOTION_REC_HEIGHT; - /* - public static final int THETAH_REC_X_ORIG = HODO_REC_X_ORIG; - public static final int THETAH_REC_Y_ORIG = HODO_VIEW_Y_END; - public static final int THETAH_REC_WIDTH = INSET_REC_WIDTH; - public static final int THETAH_REC_HEIGHT = INSET_REC_HEIGHT; - public static final int THETAH_VIEW_X_END = THETAH_REC_X_ORIG+THETAH_REC_WIDTH; - public static final int THETAH_VIEW_Y_END = THETAH_REC_Y_ORIG+THETAH_REC_HEIGHT; - - public static final int THETAP_REC_X_ORIG = THETAH_VIEW_X_END; - public static final int THETAP_REC_Y_ORIG = THETAH_REC_Y_ORIG; - public static final int THETAP_REC_WIDTH = INSET_REC_WIDTH; - public static final int THETAP_REC_HEIGHT = INSET_REC_HEIGHT; - public static final int THETAP_VIEW_X_END = THETAP_REC_X_ORIG+THETAP_REC_WIDTH; - public static final int THETAP_VIEW_Y_END = THETAP_REC_Y_ORIG+THETAP_REC_HEIGHT; - public static final int SRWINDS_REC_X_ORIG = THETAP_VIEW_X_END; - public static final int SRWINDS_REC_Y_ORIG = THETAP_REC_Y_ORIG; - public static final int SRWINDS_REC_WIDTH = INSET_REC_WIDTH; - public static final int SRWINDS_REC_HEIGHT = INSET_REC_HEIGHT; - public static final int SRWINDS_VIEW_X_END = SRWINDS_REC_X_ORIG+SRWINDS_REC_WIDTH; - public static final int SRWINDS_VIEW_Y_END = SRWINDS_REC_Y_ORIG+SRWINDS_REC_HEIGHT; - - - public static final int SRWINDVTRS_REC_X_ORIG = HODO_VIEW_X_END; - public static final int SRWINDVTRS_REC_Y_ORIG = HODO_REC_Y_ORIG; - public static final int SRWINDVTRS_REC_WIDTH = INSET_REC_WIDTH; - public static final int SRWINDVTRS_REC_HEIGHT = INSET_REC_HEIGHT; - public static final int SRWINDVTRS_VIEW_X_END = SRWINDVTRS_REC_X_ORIG+SRWINDVTRS_REC_WIDTH; - public static final int SRWINDVTRS_VIEW_Y_END = SRWINDVTRS_REC_Y_ORIG+SRWINDVTRS_REC_HEIGHT; - - public static final int STORMSLINKY_REC_X_ORIG = SRWINDVTRS_REC_X_ORIG; - public static final int STORMSLINKY_REC_Y_ORIG = SRWINDVTRS_VIEW_Y_END; - public static final int STORMSLINKY_REC_WIDTH = INSET_REC_WIDTH; - public static final int STORMSLINKY_REC_HEIGHT = INSET_REC_HEIGHT; - public static final int STORMSLINKY_VIEW_X_END = STORMSLINKY_REC_X_ORIG+STORMSLINKY_REC_WIDTH; - public static final int STORMSLINKY_VIEW_Y_END = STORMSLINKY_REC_Y_ORIG+STORMSLINKY_REC_HEIGHT; - - public static final int PSBLWATCH_REC_X_ORIG = STORMSLINKY_REC_X_ORIG; - public static final int PSBLWATCH_REC_Y_ORIG = STORMSLINKY_VIEW_Y_END; - public static final int PSBLWATCH_REC_WIDTH = INSET_REC_WIDTH; - public static final int PSBLWATCH_REC_HEIGHT = INSET_REC_HEIGHT; - public static final int PSBLWATCH_VIEW_X_END = PSBLWATCH_REC_X_ORIG+PSBLWATCH_REC_WIDTH; - public static final int PSBLWATCH_VIEW_Y_END = PSBLWATCH_REC_Y_ORIG+PSBLWATCH_REC_HEIGHT;*/ - public static final int DATA_TIMELINE_REC_X_ORIG = HODO_VIEW_X_END; public static final int DATA_TIMELINE_REC_Y_ORIG = HODO_REC_Y_ORIG; - public static final int DATA_TIMELINE_REC_WIDTH = 280;//330;//280; + public static final int DATA_TIMELINE_REC_WIDTH =330;//280; public static final int DATA_TIMELINE_REC_HEIGHT = SKEWT_REC_HEIGHT-90; public static final int DATA_TIMELINE_VIEW_X_END = DATA_TIMELINE_REC_X_ORIG+DATA_TIMELINE_REC_WIDTH; public static final int DATA_TIMELINE_VIEW_Y_END = DATA_TIMELINE_REC_Y_ORIG+DATA_TIMELINE_REC_HEIGHT; @@ -274,7 +273,7 @@ public class NsharpConstants { public static final int DATA_TIMELINE_SORT_X_START = DATA_TIMELINE_REC_X_ORIG+(7*DATA_TIMELINE_REC_WIDTH/18); public static final int STATION_ID_REC_X_ORIG = DATA_TIMELINE_VIEW_X_END; public static final int STATION_ID_REC_Y_ORIG = DATA_TIMELINE_REC_Y_ORIG; - public static final int STATION_ID_REC_WIDTH = 100;//160; + public static final int STATION_ID_REC_WIDTH = 300; public static final int STATION_ID_REC_HEIGHT = DATA_TIMELINE_REC_HEIGHT; public static final int STATION_ID_VIEW_X_END = STATION_ID_REC_X_ORIG+STATION_ID_REC_WIDTH; public static final int STATION_ID_VIEW_Y_END = STATION_ID_REC_Y_ORIG+STATION_ID_REC_HEIGHT; @@ -286,11 +285,8 @@ public class NsharpConstants { public static final int COLOR_NOTATION_VIEW_X_END = COLOR_NOTATION_REC_X_ORIG+COLOR_NOTATION_REC_WIDTH; public static final int COLOR_NOTATION_VIEW_Y_END = COLOR_NOTATION_REC_Y_ORIG+COLOR_NOTATION_REC_HEIGHT; - public static final int OMEGA_X_TOP = SKEWT_REC_X_ORIG-160; - public static final int OMEGA_Y_TOP = SKEWT_REC_Y_ORIG+ 75; - public static final int OMEGA_Y_BOT = SKEWT_VIEW_Y_END-15; - public static final int DATAPANEL1_REC_X_ORIG = OMEGA_X_TOP-80; + public static final int DATAPANEL1_REC_X_ORIG = OMEGA_X_TOP+150; public static final int DATAPANEL1_REC_Y_ORIG = SKEWT_VIEW_Y_END + 50; public static final int DATAPANEL1_REC_WIDTH = DATAPANEL_REC_WIDTH; public static final int DATAPANEL1_REC_HEIGHT = DATAPANEL_REC_HEIGHT; @@ -371,11 +367,16 @@ public class NsharpConstants { public static int btnGapX = 5; public static int btnGapY = 5; public static int listWidth = 160; - public static int listHeight = 100; + public static int listHeight = 80; public static int filelistWidth = 120; public static int filelistHeight = 100; public static int dsiplayPanelSize = 2; + public static int GRAPH_SKEWT = 0; + public static int GRAPH_ICING = 1; + public static int GRAPH_TURB = 2; + public static int MAX_GRAPH_MODE = 3; + public static String getNlistFile() { return NcPathManager.getInstance().getStaticFile( NcPathConstants.NSHARP_NLIST_FILE ).getAbsolutePath(); @@ -384,4 +385,60 @@ public class NsharpConstants { return NcPathManager.getInstance().getStaticFile( NcPathConstants.NSHARP_SUP_FILE ).getAbsolutePath(); } + + //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","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 = 1; + public static int LINE_PARCEL = 2; + public static int LINE_VIRTUAL_TEMP =3; + public static int LINE_WETBULB = 4; + public static int LINE_WIND_BARB = 5; + public static int LINE_OVERLAY1 = 6; + public static int LINE_OVERLAY2= 7; + public static int LINE_COMP1 = 8; + public static int LINE_COMP2 = 9; + public static int LINE_COMP3 = 10; + public static int LINE_COMP4 = 11; + public static int LINE_COMP5 = 12; + public static int LINE_COMP6 = 13; + public static int LINE_COMP7 = 14; + public static int LINE_COMP8 = 15; + public static int LINE_COMP9 = 16; + public static int LINE_COMP10 = 17; + public static int LINE_ICING_RH = 18; + public static int LINE_ICING_TEMP= 19; + public static int LINE_ICING_EPI=20; + public static int LINE_TURBULENCE_LN = 21; + public static int LINE_TURBULENCE_WS = 22; + + //defaultLineProperty should be listed in sync with lineNameArray for each line + public static NsharpLineProperty[] defaultLineProperty = + { + new NsharpLineProperty(LineStyle.SOLID, 2,color_red ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_green ), + new NsharpLineProperty(LineStyle.SHORT_DASHED, 1,color_white ), + new NsharpLineProperty(LineStyle.SHORT_DASHED, 2,color_red ), + new NsharpLineProperty(LineStyle.SOLID, 1,wetBulbColor ), + new NsharpLineProperty(LineStyle.SOLID, 1,color_yellow ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_red ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_green ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_red ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_green ), + new NsharpLineProperty(LineStyle.SOLID, 2, new RGB (155, 0, 220) ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (30, 144, 255) ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (255, 215, 0) ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (0, 255, 255) ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (139, 71, 38) ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (139, 0, 139) ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (0, 139, 0) ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (144, 238, 144) ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_green ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_red ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_magenta ), + new NsharpLineProperty(LineStyle.SOLID, 2,color_magenta ), + new NsharpLineProperty(LineStyle.SOLID, 2,new RGB (255, 174, 185) ) + + }; } 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 new file mode 100644 index 0000000000..2dc631b04c --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGraphProperty.java @@ -0,0 +1,262 @@ +package gov.noaa.nws.ncep.ui.nsharp; +/** + * + * gov.noaa.nws.ncep.ui.nsharp.NsharpGraphProperty + * + * + * 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 javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +import com.raytheon.uf.common.serialization.ISerializableObject; +@XmlRootElement(name = "NsharpGraphProperty") +@XmlAccessorType(XmlAccessType.NONE) +public class NsharpGraphProperty implements ISerializableObject{ + @XmlAttribute + private boolean temp; + + @XmlAttribute + private boolean dewp; + + @XmlAttribute + private boolean parcel; + + @XmlAttribute + private boolean VTemp; + + @XmlAttribute + private boolean wetBulb; + + @XmlAttribute + private boolean mixratio; + + @XmlAttribute + private boolean dryAdiabat; + + @XmlAttribute + private boolean moistAdiabat; + + @XmlAttribute + private boolean effLayer; + + @XmlAttribute + private boolean cloud; + + @XmlAttribute + private boolean hodo; + + @XmlAttribute + private boolean meanWind; + + @XmlAttribute + private boolean smv3075; + + @XmlAttribute + private boolean smv1585; + + @XmlAttribute + private boolean smvBunkersR; + + @XmlAttribute + private boolean smvBunkersL; + + @XmlAttribute + private boolean omega; + + @XmlAttribute + private boolean corfidiV; + + @XmlAttribute + private boolean windBarb; + + @XmlAttribute + private int windBarbDistance; + + @XmlAttribute + private int tempOffset; + + + public boolean isTemp() { + return temp; + } + + public void setTemp(boolean temp) { + this.temp = temp; + } + + public boolean isDewp() { + return dewp; + } + + public void setDewp(boolean dewp) { + this.dewp = dewp; + } + + public boolean isParcel() { + return parcel; + } + + public void setParcel(boolean parcel) { + this.parcel = parcel; + } + + public boolean isVTemp() { + return VTemp; + } + + public void setVTemp(boolean vTemp) { + VTemp = vTemp; + } + + public boolean isWetBulb() { + return wetBulb; + } + + public void setWetBulb(boolean wetBulb) { + this.wetBulb = wetBulb; + } + + public boolean isMixratio() { + return mixratio; + } + + public void setMixratio(boolean mixratio) { + this.mixratio = mixratio; + } + + public boolean isDryAdiabat() { + return dryAdiabat; + } + + public void setDryAdiabat(boolean dryAdiabat) { + this.dryAdiabat = dryAdiabat; + } + + public boolean isMoistAdiabat() { + return moistAdiabat; + } + + public void setMoistAdiabat(boolean moistAdiabat) { + this.moistAdiabat = moistAdiabat; + } + + public boolean isEffLayer() { + return effLayer; + } + + public void setEffLayer(boolean effLayer) { + this.effLayer = effLayer; + } + + public boolean isCloud() { + return cloud; + } + + public void setCloud(boolean cloud) { + this.cloud = cloud; + } + + public boolean isHodo() { + return hodo; + } + + public void setHodo(boolean hodo) { + this.hodo = hodo; + } + + public boolean isMeanWind() { + return meanWind; + } + + public void setMeanWind(boolean meanWind) { + this.meanWind = meanWind; + } + + public boolean isSmv3075() { + return smv3075; + } + + public void setSmv3075(boolean smv3075) { + this.smv3075 = smv3075; + } + + public boolean isSmv1585() { + return smv1585; + } + + public void setSmv1585(boolean smv1585) { + this.smv1585 = smv1585; + } + + public boolean isSmvBunkersR() { + return smvBunkersR; + } + + public void setSmvBunkersR(boolean smvBunkersR) { + this.smvBunkersR = smvBunkersR; + } + + public boolean isSmvBunkersL() { + return smvBunkersL; + } + + public void setSmvBunkersL(boolean smvBunkersL) { + this.smvBunkersL = smvBunkersL; + } + + public boolean isOmega() { + return omega; + } + + public void setOmega(boolean omega) { + this.omega = omega; + } + + + public boolean isCorfidiV() { + return corfidiV; + } + + public void setCorfidiV(boolean corfidiV) { + this.corfidiV = corfidiV; + } + + public boolean isWindBarb() { + return windBarb; + } + + public void setWindBarb(boolean windBarb) { + this.windBarb = windBarb; + } + + public int getWindBarbDistance() { + return windBarbDistance; + } + + public void setWindBarbDistance(int windBarbDistance) { + this.windBarbDistance = windBarbDistance; + } + + public int getTempOffset() { + return tempOffset; + } + + public void setTempOffset(int tempOffset) { + this.tempOffset = tempOffset; + } +} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpLineProperty.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpLineProperty.java new file mode 100644 index 0000000000..bf0221135c --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpLineProperty.java @@ -0,0 +1,82 @@ +/** + * + * gov.noaa.nws.ncep.ui.nsharp.NsharpLineProperty + * + * This java class performs the surface station locator functions. + * This code has been developed by the SIB for use in the AWIPS2 system. + * + *
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    	Engineer    Description
    + * -------		------- 	-------- 	-----------
    + * 03/13/2012   			Chin Chen	Initial coding
    + *
    + * 
    + * + * @author Chin Chen + * @version 1.0 + */ +package gov.noaa.nws.ncep.ui.nsharp; + +import gov.noaa.nws.ncep.viz.common.RGBColorAdapter; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +import org.eclipse.swt.graphics.RGB; + +import com.raytheon.uf.common.serialization.ISerializableObject; +import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; + +@XmlRootElement(name = "NsharpLineProperty") +@XmlAccessorType(XmlAccessType.NONE) +public class NsharpLineProperty implements ISerializableObject{ + //@XmlAttribute + //private String lineName=""; + @XmlAttribute + private LineStyle lineStyle; + @XmlAttribute + private int lineWidth; + @XmlElement + @XmlJavaTypeAdapter(RGBColorAdapter.class) + private RGB lineColor; + + public NsharpLineProperty() { + super(); + lineWidth = 1; + lineColor = NsharpConstants.color_white; + lineStyle = LineStyle.SOLID; + } + + public NsharpLineProperty(LineStyle lineStyle, int lineWidth, RGB lineColor) { + super(); + this.lineStyle = lineStyle; + this.lineWidth = lineWidth; + this.lineColor = lineColor; + } + + public LineStyle getLineStyle() { + return lineStyle; + } + public void setLineStyle(LineStyle lineStyle) { + this.lineStyle = lineStyle; + } + public int getLineWidth() { + return lineWidth; + } + public void setLineWidth(int lineWidth) { + this.lineWidth = lineWidth; + } + public RGB getLineColor() { + return lineColor; + } + public void setLineColor(RGB lineColor) { + this.lineColor = lineColor; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpLinePropertySerializable.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpLinePropertySerializable.java new file mode 100644 index 0000000000..9304cdf028 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpLinePropertySerializable.java @@ -0,0 +1,42 @@ +package gov.noaa.nws.ncep.ui.nsharp; +/** + * + * gov.noaa.nws.ncep.ui.nsharp.NsharpLinePropertySerializable + * + * This java class performs the surface station locator functions. + * This code has been developed by the SIB for use in the AWIPS2 system. + * + *
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    	Engineer    Description
    + * -------		------- 	-------- 	-----------
    + * 03/13/2012   			Chin Chen	Initial coding
    + *
    + * 
    + * + * @author Chin Chen + * @version 1.0 + */ +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +@XmlAccessorType(XmlAccessType.NONE) +public class NsharpLinePropertySerializable { + @XmlElement(name = "Line") + public LinePropertyItem[] items; + + @XmlType(name = "lineItem") + public static class LinePropertyItem { + @XmlAttribute(name = "lineName") + public String lineName; + + @XmlElement(name = "lineProperty") + public NsharpLineProperty lineProperty; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpStationInfo.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpStationInfo.java index 301727e706..d019dd2402 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpStationInfo.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpStationInfo.java @@ -21,19 +21,58 @@ package gov.noaa.nws.ncep.ui.nsharp; import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; public class NsharpStationInfo { - protected float latitude; - protected float longitude; - //protected float elevation; - protected Timestamp reftime; + public class timeLineSpecific { + Timestamp tiemLine; + String displayInfo; + public Timestamp getTiemLine() { + return tiemLine; + } + public void setTiemLine(Timestamp tiemLine) { + this.tiemLine = tiemLine; + } + public String getDisplayInfo() { + return displayInfo; + } + public void setDisplayInfo(String displayInfo) { + this.displayInfo = displayInfo; + } + + } + protected List timeLineSpList = new ArrayList(); + //Chin PER protected float latitude; + //protected float longitude; + protected double latitude; + protected double longitude; + protected Timestamp reftime; //uair (same as Synoptictime in uair) protected Timestamp rangestarttime; //rangestart used by model sounding e.g. PFC sounding, or uair (same as Synoptictime in uair) - //protected List dbId = new ArrayList(); // used by observed data (e.g uair) only protected String stnDisplayInfo; - //protected String datauri; protected String sndType; + protected String stnId; + + public String getStnId() { + return stnId; + } + public void setStnId(String stnId) { + this.stnId = stnId; + } + public List getTimeLineSpList() { + return timeLineSpList; + } + public void setTimeLineSpList(List timeLineSpList) { + this.timeLineSpList = timeLineSpList; + } + public void addToTimeLineSpList(timeLineSpecific timeLineSpInfo,int index ) { + this.timeLineSpList.add(index,timeLineSpInfo); + } + public void addToTimeLineSpList(timeLineSpecific timeLineSpInfo) { + this.timeLineSpList.add(timeLineSpInfo); + } public String getSndType() { return sndType; } @@ -46,12 +85,6 @@ public class NsharpStationInfo { public void setRangestarttime(Timestamp rangestarttime) { this.rangestarttime = rangestarttime; } - //public String getDatauri() { - // return datauri; - //} - //public void setDatauri(String datauri) { - //// this.datauri = datauri; - //} public Timestamp getReftime() { return reftime; } @@ -64,29 +97,17 @@ public class NsharpStationInfo { public void setStnDisplayInfo(String stnDisplayInfo) { this.stnDisplayInfo = stnDisplayInfo; } - //public List getDbId() { - // return dbId; - //} - //public void setDbId(List dbId) { - // this.dbId = dbId; - //} - public float getLatitude() { + public double getLatitude() { return latitude; } - public void setLatitude(float latitude) { + public void setLatitude(double latitude) { this.latitude = latitude; } - public float getLongitude() { + public double getLongitude() { return longitude; } - public void setLongitude(float longitude) { + public void setLongitude(double longitude) { this.longitude = longitude; } - //public float getElevation() { - // return elevation; - //} - //public void setElevation(float elevation) { - // this.elevation = elevation; - //} - + } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpWxMath.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpWxMath.java new file mode 100644 index 0000000000..94e6995f26 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpWxMath.java @@ -0,0 +1,70 @@ +package gov.noaa.nws.ncep.ui.nsharp; +/** + * + * gov.noaa.nws.ncep.ui.nsharp.NsharpWxMath + * + * This java class performs the surface station locator functions. + * This code has been developed by the SIB for use in the AWIPS2 system. + * + *
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    	Engineer    Description
    + * -------		------- 	-------- 	-----------
    + * 03/13/2012   			Chin Chen	Initial coding, port from WxMath class
    + * 										using Nsharp own configured tempOffset
    + *
    + * 
    + * + * @author Chin Chen + * @version 1.0 + */ +import com.vividsolutions.jts.geom.Coordinate; + +public class NsharpWxMath { + public static int tempOffset = 0; + + public static void setTempOffset(int tempOffset) { + NsharpWxMath.tempOffset = tempOffset; + } + + /** + * Convert a pressure and temperature to a skew-t x,y coordinate in + * centimeters where 0,0 occurs at 1000 hPa and 0 degrees Celsius. + * + * @param pressure + * The pressure in hectoPascals (millibars). + * @param temperature + * The temperature in degrees Celsius. + * @return The calculated coordinate in centimeters. + */ + public static final Coordinate getSkewTXY(double pressure, + double temperature) { + temperature -= tempOffset; + Coordinate point = new Coordinate(); + + point.y = 132.182 - 44.061 * Math.log10(pressure); + point.x = (0.54 * temperature) + (0.90692 * point.y); + + return point; + } + + /** + * Reverse a skewT coordinate (in centimeters) to the corresponding + * temperature and pressure. + * + * @param point + * @return The temperature and pressure. coordinate.x = temperature in + * Celsius, coordinate.y = the pressure in hectoPascals (millibars). + */ + public static final Coordinate reverseSkewTXY(Coordinate point) { + Coordinate tempPressure = new Coordinate(); + tempPressure.y = Math.pow(10, ((point.y - 132.182) / -44.061)); + tempPressure.x = (point.x - (0.90692 * point.y)) / 0.54; + + tempPressure.x += tempOffset; + + return tempPressure; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/SurfaceStationPointData.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/SurfaceStationPointData.java index 569f2398d9..9d08b68a16 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/SurfaceStationPointData.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/SurfaceStationPointData.java @@ -1,6 +1,6 @@ /** * - * gov.noaa.nws.ncep.viz.ui.locator.resource.SurfaceStationPointData + * gov.noaa.nws.ncep.ui.nsharp.SurfaceStationPointData * * This java class performs the surface station locator functions. * This code has been developed by the SIB for use in the AWIPS2 system. 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 index b40bc4566a..36079d6f9d 100644 --- 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 @@ -36,10 +36,15 @@ 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; @@ -51,7 +56,6 @@ public class NsharpMapMouseHandler extends InputHandlerDefaultImpl { public NsharpMapMouseHandler() { instance = this; - } //private NsharpSkewTDisplay renderableDisplay=null; @@ -502,19 +506,21 @@ using hdf5 obj lib */ @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 ){ - //TBD NCMapEditor mapEditor = NmapUiUtils.getActiveNatlCntrsEditor(); 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){ + 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); @@ -534,23 +540,28 @@ using hdf5 obj lib } 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){ + if(stnPtDataLineLst!= null && stnPtDataLineLst.size() > 0){ //System.out.println("MapMouseHandler creating NsharpSkewTDisplay"); //hash map, use stn display info as key Map> soundingLysLstMap = new HashMap>(); - int activeLoadType = loadDia.getActiveLoadSoundingType(); + //String soundingType; - if(activeLoadType == NsharpLoadDialog.OBSER_SND){ + if(activeLoadType == NsharpLoadDialog.OBSER_SND){ + NsharpMapResource.startWaitCursor(); NsharpObservedSoundingQuery.getObservedSndData(stnPtDataLineLst,loadDia.getObsDialog().isRawData(),soundingLysLstMap); + NsharpMapResource.stopWaitCursor(); } else if (activeLoadType == NsharpLoadDialog.PFC_SND){ - NsharpPfcSoundingQuery.getPfcSndData(stnPtDataLineLst,soundingLysLstMap); - //soundingType= loadDia.getPfcDialog().getCurrentSndType().toString(); + NsharpMapResource.startWaitCursor(); + NsharpPfcSoundingQuery.getPfcSndDataBySndTmRange(stnPtDataLineLst,soundingLysLstMap); + NsharpMapResource.stopWaitCursor(); } else return false; @@ -580,6 +591,7 @@ using hdf5 obj lib if (mapEditor != null) { mapEditor.refresh(); } + bringSkewTEdToTop(); } else { @@ -596,7 +608,30 @@ using hdf5 obj lib } - return true; + 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(); } /** @@ -611,7 +646,6 @@ using hdf5 obj lib double minDistance = NctextuiPointMinDistance; GeodeticCalculator gc; List thePoints = new ArrayList(); - //TBD NCMapEditor mapEditor = NmapUiUtils.getActiveNatlCntrsEditor(); NCMapEditor mapEditor = NsharpMapResource.getMapEditor(); if(mapEditor != null){ IMapDescriptor desc = (IMapDescriptor) mapEditor.getActiveDisplayPane().getRenderableDisplay().getDescriptor(); 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 index ff4950a554..c89ed97334 100644 --- 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 @@ -11,7 +11,7 @@ * Date Ticket# Engineer Description * ------- ------- -------- ----------- * 03/23/2010 229 Chin Chen Initial coding - * + * * * * @author Chin Chen @@ -25,7 +25,13 @@ 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; @@ -40,6 +46,7 @@ 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; @@ -51,6 +58,7 @@ 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; @@ -63,10 +71,13 @@ public class NsharpMapResource extends AbstractVizResource 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()); - List coords= new ArrayList(); - Coordinate coord = new Coordinate(StnPt.getLongitude(),StnPt.getLatitude()); - coords.add(coord); - //testing - /*Coordinate coord = new Coordinate(91.93000030517578, 21.43000030517578); - coords.add(coord); - coord = new Coordinate(91.80999755859375, 22.350000381469727); - coords.add(coord); - coord = new Coordinate(90.36000061035156, 22.75); - coords.add(coord); - coord = new Coordinate(89.16000366210938, 23.18000030517578); - coords.add(coord); - coord = new Coordinate(90.37999725341797, 23.760000228881836); - coords.add(coord); - coord = new Coordinate(89.05000305175781, 24.1299991607666); - coords.add(coord); - coord = new Coordinate(91.87999725341797, 24.899999618530273); - coords.add(coord); - coord = new Coordinate(89.36000061035156, 24.850000381469727); - coords.add(coord);*/ - NcSoundingCube cube = NcSoundingQuery.soundingQueryByLatLon(StnPt.getReftime().getTime(), coords, StnPt.getSndType(), - NcSoundingLayer.DataType.ALLDATA, !rawData, "-1"); - if(cube != null && cube.getRtnStatus()==NcSoundingCube.QueryStatus.OK){ - 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) - soundingLysLstMap.put(StnPt.getStnDisplayInfo(), rtnSndLst); + 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()); } - } // end for loop of stnPtsLst + + } + 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 index c7230e95b2..18935e96aa 100644 --- 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 @@ -13,7 +13,7 @@ package gov.noaa.nws.ncep.ui.nsharp.maprsc; * ------- ------- -------- ----------- * 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 @@ -28,6 +28,9 @@ 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 { @@ -52,38 +55,91 @@ public class NsharpPfcSoundingQuery { } */ //Chin-T public static void getPfcSndData(List stnPtDataLineLst, Map> soundingLysLstMap) { - public static void getPfcSndData(List stnPtDataLineLst, Map> soundingLysLstMap) { - String pickedStnInfo = ""; - + /*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 - float[][] latLon = {{StnPt.getLatitude(), StnPt.getLongitude()}}; - NcSoundingCube cube = NcSoundingQuery.pfcSoundingQueryByLatLon(StnPt.getReftime().getTime(),StnPt.getRangestarttime().getTime(), latLon, StnPt.getSndType(), NcSoundingLayer.DataType.ALLDATA, false, "-1"); - 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){ - if(pickedStnInfo == ""){ - //use as first stn to show - pickedStnInfo = StnPt.getStnDisplayInfo(); + 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()); + } } - //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) - soundingLysLstMap.put(StnPt.getStnDisplayInfo(), rtnSndLst); - //System.out.println(StnPt.getStnDisplayInfo() + " with sound layer size of "+ soundLyLst.size()); } } } 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 index 7ec2cfa321..3fdac0bdaa 100644 --- 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 @@ -21,6 +21,7 @@ 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; @@ -44,6 +45,7 @@ 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; @@ -69,6 +71,8 @@ public class ModelSoundingDialogContents { 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; @@ -78,10 +82,14 @@ public class ModelSoundingDialogContents { 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() { @@ -95,12 +103,15 @@ public class ModelSoundingDialogContents { 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()); @@ -115,6 +126,7 @@ public class ModelSoundingDialogContents { //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){ @@ -128,6 +140,7 @@ public class ModelSoundingDialogContents { } } + ldDia.stopWaitCursor(); } else System.out.println("SQL: query return null"); @@ -139,9 +152,13 @@ public class ModelSoundingDialogContents { 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()){ @@ -150,8 +167,9 @@ public class ModelSoundingDialogContents { //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()); - - String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", cal); + long vHour = (cal.getTimeInMillis()- reftimeMs)/3600000; + String gmtTimeStr = String.format("%1$ty%1$tm%1$td/%1$tHV%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; @@ -173,16 +191,22 @@ public class ModelSoundingDialogContents { } } } - + 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",timeLine, latLon, gribDecoderName,selectedModel, false, "-1"); + 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"); @@ -240,7 +264,7 @@ public class ModelSoundingDialogContents { //return; } } - + ldDia.stopWaitCursor(); NsharpSkewTDisplay renderableDisplay; NsharpSkewTEditor skewtEdt = NsharpSkewTEditor.createOrOpenSkewTEditor(); renderableDisplay = (NsharpSkewTDisplay) skewtEdt.getActiveDisplayPane().getRenderableDisplay(); @@ -253,7 +277,7 @@ public class ModelSoundingDialogContents { stnInfo.setLongitude(lon); skewRsc.addRsc(soundingLysLstMap, stnInfo); skewRsc.setSoundingType(selectedModel); - + NsharpSkewTEditor.bringSkewTEditorToTop(); } private void createModelTypeList(){ if(modelTypeList!=null) @@ -262,27 +286,48 @@ public class ModelSoundingDialogContents { sndTimeList.removeAll(); if(availableFileList!=null) availableFileList.removeAll(); - Object[] mdlNames = NcSoundingQuery.soundingModelNameQuery(gribDecoderName); + 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 ) ); - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - ldDia.setShellSize(true); + 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.filelistHeight ); + 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); @@ -304,33 +349,54 @@ public class ModelSoundingDialogContents { } ); 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 ); - ncgribBtn.setSelection(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(); + } } ); - - timeBtn = new Button(parent, SWT.CHECK | SWT.BORDER); + /* + 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() { @@ -348,17 +414,19 @@ public class ModelSoundingDialogContents { } } ); - bottomGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - bottomGp.setLayout( new GridLayout( 2, false ) ); + //bottomGp = new Group(topGp,SWT.SHADOW_ETCHED_IN); + //bottomGp.setLayout( new GridLayout( 2, false ) ); - availableFileGp = new Group(bottomGp,SWT.SHADOW_ETCHED_IN); + 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.filelistHeight ); + 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(); @@ -373,11 +441,13 @@ public class ModelSoundingDialogContents { } ); //create Sounding Times widget list - sndTimeListGp = new Group(bottomGp,SWT.SHADOW_ETCHED_IN); + 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.setBounds(sndTimeListGp.getBounds().x, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight ); + 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) { @@ -394,14 +464,14 @@ public class ModelSoundingDialogContents { } }); locationMainGp= new Group(parent,SWT.SHADOW_ETCHED_IN); - locationMainGp.setLayout( new GridLayout( 2, false ) ); + locationMainGp.setLayout( new GridLayout( 5, false ) ); locationMainGp.setText("Location"); - //latlonBtn.setBounds(x, y, width, height); - //locationTypeGp = new Group(locationMainGp,SWT.SHADOW_ETCHED_IN); + locationMainGp.setFont(newFont); latlonBtn = new Button(locationMainGp, SWT.RADIO | SWT.BORDER); - latlonBtn.setText("Lat/Lon "); + latlonBtn.setText("Lat/Lon"); + latlonBtn.setFont(newFont); latlonBtn.setEnabled(true); - //latlonBtn.setBounds(locationMainGp.getBounds().x+ NsharpConstants.btnGapX, locationMainGp.getBounds().y + NsharpConstants.labelGap, bottomGp.getBounds().width/2, NsharpConstants.btnHeight); + //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) { @@ -410,9 +480,9 @@ public class ModelSoundingDialogContents { } } ); stationBtn = new Button(locationMainGp, SWT.RADIO | SWT.BORDER); - stationBtn.setText("Station "); + stationBtn.setText("Station"); stationBtn.setEnabled(true); - //stationBtn.setBounds(locationMainGp.getBounds().x+latlonBtn.getBounds().width+ NsharpConstants.btnGapX, latlonBtn.getBounds().y, bottomGp.getBounds().width/2,NsharpConstants.btnHeight); + stationBtn.setFont(newFont); stationBtn.addListener( SWT.MouseUp, new Listener() { public void handleEvent(Event event) { currentLocType = LocationType.STATION; @@ -423,11 +493,13 @@ public class ModelSoundingDialogContents { 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; @@ -453,6 +525,7 @@ public class ModelSoundingDialogContents { 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() { @@ -524,6 +597,21 @@ 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; + + } + } ); + */ } public void cleanup(){ @@ -562,18 +650,15 @@ public class ModelSoundingDialogContents { 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(topGp!= null){ - topGp.dispose(); - topGp = null; - } - if(timeBtn != null){ - timeBtn.removeListener(SWT.MouseUp, timeBtn.getListeners(SWT.MouseUp)[0]); - timeBtn.dispose(); - timeBtn = null; - } @@ -600,6 +685,11 @@ public class ModelSoundingDialogContents { 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(); @@ -629,5 +719,11 @@ public class ModelSoundingDialogContents { 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 index 6fd67c2332..32f6eab56c 100644 --- 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 @@ -205,7 +205,6 @@ public class NsharpHandleArchiveFile { } //System.out.println("total line " + i); //System.out.println("time line " + timeLine + " stn disp info = " + stnDispInfo); - //Chin do we need this???? TBD timeList.add(timeLine); 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()); 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 index f64f42cb40..3b697675f8 100644 --- 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 @@ -28,7 +28,11 @@ 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; @@ -42,7 +46,7 @@ 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 = 620; + private final static int DIALOG_HEIGHT = 920; protected Composite top; private static Composite dialogParent; @@ -50,14 +54,14 @@ public class NsharpLoadDialog extends Dialog { private static Shell shell; private org.eclipse.swt.widgets.List soundingTypeList; public static final String[] soundingTypeStringArray = { - "Observed Soundings" , "Model Soundings", "PFC Soundings", "ACARS Soundings", "Archive Files" + "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 ACARS_SND = 3; - public static final int ARCHIVE = 4; + public static final int ARCHIVE = 3; + public static final int ACARS_SND = 4; private ObservedSoundingDialogContents obsDialog; private PfcSoundingDialogContents pfcDialog; private ModelSoundingDialogContents mdlDialog; @@ -65,8 +69,12 @@ public class NsharpLoadDialog extends Dialog { 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; } @@ -93,9 +101,11 @@ public class NsharpLoadDialog extends Dialog { 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.listWidth, NsharpConstants.listHeight+30); - for(String loadStr : soundingTypeStringArray){ + 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 @@ -119,6 +129,7 @@ public class NsharpLoadDialog extends Dialog { 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(); @@ -151,13 +162,24 @@ public class NsharpLoadDialog extends Dialog { } + } + 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); + //setShellSize(false); acarsGp = new Group(dialogParent,SWT.SHADOW_ETCHED_IN); acarsGp.setLayout( new GridLayout( 1, false ) ); createSndTypeList(acarsGp); @@ -170,18 +192,6 @@ public class NsharpLoadDialog extends Dialog { } } - 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(); - } - - } - } } }); @@ -257,7 +267,7 @@ public class NsharpLoadDialog extends Dialog { //System.out.println("loadDia constructed"); activeLoadSoundingType = OBSER_SND; - + } /* @@ -269,13 +279,20 @@ public class NsharpLoadDialog extends Dialog { protected void configureShell( Shell shell ) { super.configureShell( shell ); NsharpLoadDialog.shell = shell; - setShellSize(false); + 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) { @@ -287,100 +304,24 @@ public class NsharpLoadDialog extends Dialog { rsc.cleanUpRsc(); editor.refresh(); } - //System.out.println("createLoadContents called"); - //NsharpMapModalTool.setModal(); - //nsharpMapResource. dialogParent = parent; - - /* - topLoadGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - topLoadGp.setLayout( new GridLayout( 2, false ) ); - createSndTypeList(topLoadGp); - - */ - //dialogParent.setBounds(x, y, width, height); obsDialog = new ObservedSoundingDialogContents(dialogParent); pfcDialog = new PfcSoundingDialogContents(dialogParent); mdlDialog = new ModelSoundingDialogContents(dialogParent); - obsDialog.createObsvdDialogContents(); - //mdlDialog.createMdlDialogContents(); - // set default selection to observed sounding - soundingTypeList.setSelection(0); - activeLoadSoundingType = OBSER_SND; - //soundingTypeList.setSelection(MODEL_SND); - //activeLoadType = MODEL_SND; - /* - //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]; - - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - - if(selectedProduct.equals(soundingTypeStringArray[OBSER_SND])){ - //System.out.println("OBSER_SND enter"); - if(activeLoadType != OBSER_SND){ - cleanupDialog(activeLoadType); //clean up before resetting activeLoadType - activeLoadType = OBSER_SND; - obsDialog.createObsvdDialogContents(); - dialogParent.pack(); - dialogParent.layout(true); - dialogParent.redraw(); - } - } - else if(selectedProduct.equals(soundingTypeStringArray[MODEL_SND])){ - //System.out.println("MODEL_SND enter"); - if(activeLoadType != MODEL_SND) { - cleanupDialog(activeLoadType);//clean up before resetting activeLoadType - activeLoadType = MODEL_SND; - mdlDialog.createMdlDialogContents(); - dialogParent.pack(); - dialogParent.layout(true); - dialogParent.redraw(); - } - } - else if(selectedProduct.equals(soundingTypeStringArray[PFC_SND])){ - //System.out.println("PFC_SND enter"); - if(activeLoadType != PFC_SND){ - cleanupDialog(activeLoadType); //clean up before resetting activeLoadType - activeLoadType = PFC_SND; - pfcDialog.createPfcDialogContents(); - dialogParent.pack(); - dialogParent.layout(true); - dialogParent.redraw(); - } - - } - else if(selectedProduct.equals(soundingTypeStringArray[ACARS_SND])){ - //System.out.println("ACARS_SND enter"); - if(activeLoadType != ACARS_SND) { - cleanupDialog(activeLoadType);//clean up before resetting activeLoadType - activeLoadType = ACARS_SND; - //Not supported now!! - text1 = new Text(topLoadGp, SWT.MULTI | SWT.BORDER | SWT.WRAP ); - text1.setText("Acars Soundings\nis still under\ndevelopment!"); - topLoadGp.pack(); - topLoadGp.layout(true); - topLoadGp.redraw(); - } - } - else if(selectedProduct.equals(soundingTypeStringArray[ARCHIVE])){ - //System.out.println("ARCHIVE enter"); - if(activeLoadType != ARCHIVE) { - cleanupDialog(activeLoadType);//clean up before resetting activeLoadType - activeLoadType = ARCHIVE; - NsharpHandleArchiveFile.openArchiveFile(shell); - close(); - } - - } - - } - } - });*/ + 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); } @@ -397,11 +338,13 @@ public class NsharpLoadDialog extends Dialog { mainLayout.marginHeight = 3; mainLayout.marginWidth = 3; - top.setLayout(mainLayout); - + //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; } @@ -427,9 +370,14 @@ public class NsharpLoadDialog extends Dialog { //System.out.println("loadDia closed"); cleanSelf(); cleanupDialog(activeLoadSoundingType); - INSTANCE = null; + //INSTANCE = null; + if(waitCursor!=null) + waitCursor.dispose(); + waitCursor=null; + newFont.dispose(); return (super.close()); } + public boolean closeDiaOnly() { cleanSelf(); return (super.close()); @@ -438,9 +386,14 @@ public class NsharpLoadDialog extends Dialog { //Only use Cancel button but NOT ok button @Override public void createButtonsForButtonBar(Composite parent) { + // create Cancel buttons by default, but use close label - createButton(parent, IDialogConstants.CANCEL_ID, + 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()); } @@ -460,13 +413,19 @@ public class NsharpLoadDialog extends Dialog { } - public void setShellSize(boolean big){ - if(big == true) { - shell.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); - } - else { - shell.setSize(DIALOG_WIDTH, DIALOG_HEIGHT-100); - } + //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/ObservedSoundingDialogContents.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/ObservedSoundingDialogContents.java index b2c1016353..a37cca41b4 100644 --- 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 @@ -36,6 +36,8 @@ import java.util.List; import java.util.TimeZone; import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; @@ -46,19 +48,19 @@ import org.eclipse.swt.widgets.Listener; public class ObservedSoundingDialogContents { private Composite parent; private org.eclipse.swt.widgets.List sndTimeList; - private Group btnGp, sndTimeListGp, topGp; - private boolean timeLimit = false; + private Group btnGp, sndTimeListGp, topGp, midGp; + private boolean timeLimit = false, newtab=false; private boolean rawData = false; - private Button timeBtn, browseBtn, tamBtn, bufruaBtn, uairBtn, rawBtn;//, ncuairBtn; + private Button timeBtn, browseBtn, tamBtn, bufruaBtn, uairBtn, rawBtn, newTabBtn; private String FILE_UAIR = "UAIR"; private String FILE_BUFRUA = "BUFRUA"; //private String FILE_DROP = "DROP"; private String FILE_TAMDAR = "TAMDAR"; private String FILE_BROWSE = "BROWSE"; private NcSoundingProfile.ObsSndType currentSndType = NcSoundingProfile.ObsSndType.NONE; - + private NsharpLoadDialog ldDia; private List selectedTimeList = new ArrayList(); - + private Font newFont; public boolean isRawData() { return rawData; } @@ -67,21 +69,25 @@ public class ObservedSoundingDialogContents { } 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:%1$tS", cal); + String gmtTimeStr = String.format("%1$ty%1$tm%1$td/%1$tH", cal); + //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"); @@ -95,18 +101,21 @@ public class ObservedSoundingDialogContents { } } } + 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(); - float lat, lon; + //Chin float lat, lon; + double lat, lon; String stnInfoStr; //use NcSoundingQuery to query stn info - NcSoundingStnInfoCollection sndStnInfoCol = NcSoundingQuery.soundingStnInfoQuery(currentSndType.toString(),selectedSndTime); + NcSoundingStnInfoCollection sndStnInfoCol = NcSoundingQuery.soundingStnInfoQuery(currentSndType.toString(),selectTimetr); if(sndStnInfoCol != null && sndStnInfoCol.getStationInfo() != null){ NcSoundingStnInfo[] stnInfoAry = sndStnInfoCol.getStationInfo(); @@ -130,6 +139,7 @@ public class ObservedSoundingDialogContents { 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()); @@ -157,18 +167,18 @@ public class ObservedSoundingDialogContents { rawData = false; topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); topGp.setLayout( new GridLayout( 2, false ) ); - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - ldDia.setShellSize(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(); @@ -182,7 +192,7 @@ public class ObservedSoundingDialogContents { 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(); @@ -216,13 +226,13 @@ public class ObservedSoundingDialogContents { 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(); @@ -233,19 +243,20 @@ public class ObservedSoundingDialogContents { 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; } - } ); - - timeBtn = new Button(parent, SWT.CHECK | SWT.BORDER); + } ); */ + 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()) @@ -261,9 +272,12 @@ public class ObservedSoundingDialogContents { } } ); - rawBtn = new Button(parent, SWT.CHECK | SWT.BORDER); + 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()) @@ -275,9 +289,11 @@ public class ObservedSoundingDialogContents { //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 ); - //create a selection listener to handle user's selection on list + 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) { @@ -285,16 +301,32 @@ public class ObservedSoundingDialogContents { 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); 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){ @@ -316,7 +348,11 @@ public class ObservedSoundingDialogContents { rawBtn.dispose(); rawBtn= null; } - if(browseBtn != null){ + if(midGp!= null){ + midGp.dispose(); + midGp = null; + } + /*if(browseBtn != null){ browseBtn.removeListener(SWT.MouseUp, browseBtn.getListeners(SWT.MouseUp)[0]); browseBtn.dispose(); browseBtn = null; @@ -328,11 +364,7 @@ public class ObservedSoundingDialogContents { tamBtn.dispose(); tamBtn = null; } - /*if(ncuairBtn != null){ - ncuairBtn.removeListener(SWT.MouseUp, ncuairBtn.getListeners(SWT.MouseUp)[0]); - ncuairBtn.dispose(); - ncuairBtn = null; - }*/ + */ if(bufruaBtn != null){ bufruaBtn.removeListener(SWT.MouseUp, bufruaBtn.getListeners(SWT.MouseUp)[0]); bufruaBtn.dispose(); @@ -347,6 +379,11 @@ public class ObservedSoundingDialogContents { 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){ 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 index ee616dede2..5e1b9aaaf6 100644 --- 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 @@ -35,6 +35,7 @@ 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; @@ -46,12 +47,14 @@ 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, ruc2Btn, rucpBtn, browseBtn,timeBtn; - private boolean timeLimit = false; + private Button namBtn, gfsBtn, newTabBtn,timeBtn; + private boolean timeLimit = false, newtab=false; private List selectedFileList = new ArrayList(); - private List selectedTimeList = 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; } @@ -59,7 +62,8 @@ public class PfcSoundingDialogContents { } public PfcSoundingDialogContents (Composite parent) { this.parent = parent; - + ldDia = NsharpLoadDialog.getAccess(); + newFont = ldDia.getNewFont(); } private void createPFCAvailableFileList() { sndTimeList.removeAll();; @@ -67,6 +71,7 @@ public class PfcSoundingDialogContents { //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){ @@ -80,6 +85,7 @@ public class PfcSoundingDialogContents { } } + ldDia.stopWaitCursor(); } else System.out.println("SQL: query return null"); @@ -90,9 +96,15 @@ public class PfcSoundingDialogContents { //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); - NcSoundingTimeLines timeLines = NcSoundingQuery.soundingRangeTimeLineQuery(currentSndType.toString(), fl); + 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; @@ -100,10 +112,13 @@ public class PfcSoundingDialogContents { //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()); - - String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", cal); + 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$tHV%2$03d %3$s", cal, vHour,dispSndStr); + //gmtTimeStr = gmtTimeStr+ String.format("V%03d", vHour); 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; } @@ -119,23 +134,24 @@ public class PfcSoundingDialogContents { } } } - + ldDia.stopWaitCursor(); } public void createPfcDialogContents(){ + selectedFileList.clear(); topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); topGp.setLayout( new GridLayout( 2, false ) ); - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - ldDia.setShellSize(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; @@ -146,19 +162,19 @@ public class PfcSoundingDialogContents { 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; @@ -169,7 +185,7 @@ public class PfcSoundingDialogContents { 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; @@ -180,19 +196,19 @@ public class PfcSoundingDialogContents { 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.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) @@ -201,7 +217,7 @@ public class PfcSoundingDialogContents { timeLimit = true; //refresh sounding list if file type is selected already - if(!currentSndType.equals("NA") && selectedFileList.size() > 0){ + if(!currentSndType.equals("NA") && selectedFileList.size() > 0 ){ createPFCSndTimeList(selectedFileList); } @@ -213,9 +229,11 @@ public class PfcSoundingDialogContents { 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.filelistHeight ); - //create a selection listener to handle user's selection on list + 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; @@ -235,64 +253,110 @@ public class PfcSoundingDialogContents { //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.setBounds(sndTimeListGp.getBounds().x, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight ); + 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); - selectedTimeList.clear(); + //.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); - queryAndMarkStn(selectedSndTime); - selectedTimeList.add(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); + } } - //NsharpMapMouseHandler.getAccess().setSelectedTimeList(selectedTimeList); + + 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 queryAndMarkStn(String selectedSndTime) { + + 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 - NcSoundingStnInfoCollection sndStnInfoCol = NcSoundingQuery.soundingStnInfoQuery(currentSndType.toString(),selectedSndTime); + String sndTypeStr = currentSndType.toString(); + NcSoundingStnInfoCollection sndStnInfoCol = NcSoundingQuery.soundingStnInfoQuery(sndTypeStr,rangeStartStr, refTimeStr); if(sndStnInfoCol != null && sndStnInfoCol.getStationInfo() != null){ NcSoundingStnInfo[] stnInfoAry = sndStnInfoCol.getStationInfo(); NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); - - //System.out.println("queryAndMarkStn stn num ="+ stnInfoAry.length); - //Note: A same station may have many reports + //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(); - stn.setStnDisplayInfo(stnInfo.getStnId() + " " + selectedSndTime); + 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.setRangestarttime(stnInfo.getRangeStartTime()); - stn.setSndType(currentSndType.toString()); - //System.out.println( " currentSndType "+currentSndType); - //stn.setElevation(stnInfo.getStationElevation()); - nsharpMapResource.addPoint(stn); + stn.setStnId(stnInfo.getStnId()); + stn.setSndType(sndTypeStr); + //if(i <10) + // System.out.println( "disP="+dispInfo+" refT= "+stnInfo.getSynopTime()+ " rangSt="+stnInfo.getRangeStartTime()); + stnPoints.add(stn); + ; } - NsharpMapResource.bringMapEditorToTop(); - /* Chin test if(NsharpMapResource.getMapEditor() != null){ - - - 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(); } } @@ -307,7 +371,7 @@ public class PfcSoundingDialogContents { gfsBtn.dispose(); gfsBtn = null; } - if(ruc2Btn != null){ + /*if(ruc2Btn != null){ ruc2Btn.removeListener(SWT.MouseUp, ruc2Btn.getListeners(SWT.MouseUp)[0]); ruc2Btn.dispose(); ruc2Btn = null; @@ -322,7 +386,7 @@ public class PfcSoundingDialogContents { browseBtn.dispose(); browseBtn = null; - } + } */ NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); ldDia.cleanSndTypeList(); if(topGp!= null){ @@ -365,5 +429,10 @@ public class PfcSoundingDialogContents { 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 7453359431..d6d20ad106 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 @@ -230,6 +230,67 @@ public class NsharpNative { } + + + 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"}; + public static class CloudInfoStr extends Structure { + /* FM: Fred Mosher's Algorithm */ + public int sizeFM; + public float[] preStartFM= new float[MAX_CLOUD_LAYER]; + public float[] preEndFM= new float[MAX_CLOUD_LAYER]; + public int[] cloudTypeFM= new int[MAX_CLOUD_LAYER]; + /* CE: Chernykh and Eskridge Algorithm */ + public int sizeCE; + public float[] preStartCE= new float[MAX_CLOUD_LAYER]; + public float[] preEndCE= new float[MAX_CLOUD_LAYER]; + + public CloudInfoStr() { + super(); + sizeFM=0; + sizeCE=0; + } + + protected ByReference newByReference() { return new ByReference(); } + protected ByValue newByValue() { return new ByValue(); } + protected CloudInfoStr newInstance() { return new CloudInfoStr(); } + public static class ByReference extends CloudInfoStr implements Structure.ByReference { + + } + public static class ByValue extends CloudInfoStr implements Structure.ByValue { + + } + public int getSizeFM() { + return sizeFM; + } + + public int[] getCloudTypeFM() { + return cloudTypeFM; + } + + public int getSizeCE() { + return sizeCE; + } + + public float[] getPreStartCE() { + return preStartCE; + } + + public float[] getPreEndCE() { + return preEndCE; + } + + public float[] getPreStartFM() { + return preStartFM; + } + + public float[] getPreEndFM() { + return preEndFM; + } + + + } public static class StormSlinkyStr extends Structure { public int size; public float tottim; @@ -241,16 +302,7 @@ public class NsharpNative { super(); size=-1; } - /// @param tsuv C type : float[200][2] - /*public StormSlinkyStr(int size, float tottim, float angl, float tsuv[]) { - super(); - this.size = size; - this.tottim = tottim; - this.angl = angl; - if (tsuv.length != this.tsuv.length) - throw new java.lang.IllegalArgumentException("Wrong array size !"); - this.tsuv = tsuv; - }*/ + protected ByReference newByReference() { return new ByReference(); } protected ByValue newByValue() { return new ByValue(); } protected StormSlinkyStr newInstance() { return new StormSlinkyStr(); } @@ -307,6 +359,7 @@ public class NsharpNative { void get_storm(FloatByReference speed, FloatByReference direction); 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 ); //float cave_bulk_rich ( float lplpres, float bplus,FloatByReference brnshear ); float cave_bulk_rich2 ( FloatByReference brnshear ); float cave_ship(); 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 76c2cce255..a9849153f6 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 @@ -398,5 +398,8 @@ public static final String OPC_MIXINGPRESSURE_MISSING = "Mixing Pressure public static final String STORM_MOTION_VECTOR_BUNKERS_L = "Bunkers L Storm Motion Vector"; public static final String CORFIDI_VECTORS = "Corfidi Vectors"; public static final String HODOGRAPH = "Hodograph Trace"; - + public static final String EFFECTIVE_LAYER = "Effective Layer"; + public static final String CLOUD = "Cloud"; + public static final String WINDBARB = "WindBarb Density(min dist betw barbs, m)"; + public static final int WINDBARB_DISTANCE_DEFAULT= 400; // in meters } 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 new file mode 100644 index 0000000000..fb8db60f08 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpConfigDialog.java @@ -0,0 +1,145 @@ +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 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; + + +public class NsharpConfigDialog extends Dialog { + private Button graphBtn, lineBtn; + private static NsharpConfigDialog thisDialog=null; + private static NsharpGraphConfigDialog graphDialog = null; + private static NsharpLineConfigDialog lineDialog = 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){ + + graphBtn = new Button(parent, SWT.PUSH); + graphBtn.setText("Parameters Selection"); + graphBtn.setEnabled( true ); + //graphBtn.setSize(btnWidth,pushbtnHeight); + graphBtn.addListener( SWT.MouseUp, new Listener() { + public void handleEvent(Event event) { + + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + graphDialog = NsharpGraphConfigDialog.getInstance(shell); + + if ( graphDialog != null ) { + + lineBtn.setEnabled(false); + graphDialog.open(); + lineBtn.setEnabled(true); + } + } + } ); + lineBtn = new Button(parent, SWT.PUSH); + lineBtn.setText("Data Display"); + lineBtn.setEnabled( true ); + //lineBtn.setSize(btnWidth,pushbtnHeight); + lineBtn.addListener( SWT.MouseUp, new Listener() { + public void handleEvent(Event event) { + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + + lineDialog = NsharpLineConfigDialog.getInstance(shell); + + if ( lineDialog != null ) { + + graphBtn.setEnabled(false); + lineDialog.open(); + graphBtn.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, false); + 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, 200); + } + @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/NsharpGraphConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpGraphConfigDialog.java index a415ec76b2..b0e901151b 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpGraphConfigDialog.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpGraphConfigDialog.java @@ -19,9 +19,14 @@ package gov.noaa.nws.ncep.ui.nsharp.palette; * @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; @@ -33,12 +38,18 @@ 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 NsharpGraphConfigDialog extends Dialog { private static NsharpGraphConfigDialog 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; @@ -46,13 +57,49 @@ public class NsharpGraphConfigDialog extends Dialog { private int btnGapY = 5; private Button tempBtn, dewpBtn, parcelBtn, vTempBtn, wetBulbBtn, mixingRatioBtn, dryAdiabatBtn,moisAdiabatBtn,omegaBtn, meanWindVectorBtn, stormMVector3075Btn, stormMVector1585Btn, - stormMVectorBunkersRightBtn,stormMVectorBunkersLeftBtn, corfidiVectorBtn, hodoBtn; + 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; + 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; } @@ -124,6 +171,17 @@ public class NsharpGraphConfigDialog extends Dialog { public boolean isWetBulb() { return wetBulb; } + + + public boolean isWindBarb() { + return windBarb; + } + + + public int getWindBarbDistance() { + return windBarbDistance; + } + public static NsharpGraphConfigDialog getInstance( Shell parShell){ @@ -144,10 +202,66 @@ public class NsharpGraphConfigDialog extends Dialog { public static NsharpGraphConfigDialog getAccess() { return thisDialog; } - - protected NsharpGraphConfigDialog(Shell parentShell) throws VizException { + 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 NsharpGraphConfigDialog(Shell parentShell) throws VizException { super(parentShell); thisDialog = this; + mgr =NsharpConfigManager.getInstance(); + configStore = mgr.retrieveNsharpConfigStoreFromFs(); + //if(configStore== null){ + // configStore = new NsharpConfigStore(); + // configStore = setDefaultGraphConfig(configStore); + // configStore=NsharpLineConfigDialog.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){ @@ -167,6 +281,7 @@ public class NsharpGraphConfigDialog extends Dialog { temp=false; else temp=true; + applyChange(); } } ); dewpBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -183,6 +298,7 @@ public class NsharpGraphConfigDialog extends Dialog { dewp=false; else dewp=true; + applyChange(); } } ); parcelBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -199,6 +315,7 @@ public class NsharpGraphConfigDialog extends Dialog { parcel=false; else parcel=true; + applyChange(); } } ); vTempBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -215,6 +332,7 @@ public class NsharpGraphConfigDialog extends Dialog { vTemp=false; else vTemp=true; + applyChange(); } } ); @@ -232,6 +350,7 @@ public class NsharpGraphConfigDialog extends Dialog { wetBulb=false; else wetBulb=true; + applyChange(); } } ); @@ -249,6 +368,7 @@ public class NsharpGraphConfigDialog extends Dialog { mixratio=false; else mixratio=true; + applyChange(); } } ); dryAdiabatBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -265,6 +385,7 @@ public class NsharpGraphConfigDialog extends Dialog { dryAdiabat=false; else dryAdiabat=true; + applyChange(); } } ); @@ -282,13 +403,47 @@ public class NsharpGraphConfigDialog extends Dialog { 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, moisAdiabatBtn.getBounds().y + moisAdiabatBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); + hodoBtn.setBounds(btnGp.getBounds().x+ btnGapX, cloudBtn.getBounds().y + cloudBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); if(hodo == true) hodoBtn.setSelection(true); else @@ -299,6 +454,7 @@ public class NsharpGraphConfigDialog extends Dialog { hodo=false; else hodo=true; + applyChange(); } } ); meanWindVectorBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -315,6 +471,7 @@ public class NsharpGraphConfigDialog extends Dialog { meanWind=false; else meanWind=true; + applyChange(); } } ); stormMVector3075Btn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -331,6 +488,7 @@ public class NsharpGraphConfigDialog extends Dialog { smv3075=false; else smv3075=true; + applyChange(); } } ); stormMVector1585Btn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -347,6 +505,7 @@ public class NsharpGraphConfigDialog extends Dialog { smv1585=false; else smv1585=true; + applyChange(); } } ); stormMVectorBunkersRightBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -363,6 +522,7 @@ public class NsharpGraphConfigDialog extends Dialog { smvBunkersR=false; else smvBunkersR=true; + applyChange(); } } ); stormMVectorBunkersLeftBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); @@ -379,6 +539,7 @@ public class NsharpGraphConfigDialog extends Dialog { smvBunkersL=false; else smvBunkersL=true; + applyChange(); } } ); @@ -396,16 +557,88 @@ public class NsharpGraphConfigDialog extends Dialog { 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, corfidiVectorBtn.getBounds().y + corfidiVectorBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); + omegaBtn.setBounds(btnGp.getBounds().x+ btnGapX, tempOffsetLbl.getBounds().y + tempOffsetLbl.getBounds().height+ btnGapY, btnWidth,btnHeight); if(omega == true) omegaBtn.setSelection(true); else @@ -416,30 +649,80 @@ public class NsharpGraphConfigDialog extends Dialog { omega=false; else omega=true; + applyChange(); } } ); } } + @Override public void createButtonsForButtonBar(Composite parent) { - // create OK and Cancel buttons by default - - createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, + // 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() { - //System.out.println("OK is pressed"); - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor().getSkewtResource(); - rsc.createRscPressTempCurveShapeAll(); - editor.refresh(); - } - close(); + //"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); } /* @@ -450,7 +733,7 @@ public class NsharpGraphConfigDialog extends Dialog { @Override protected void configureShell( Shell shell ) { super.configureShell( shell ); - shell.setText( "Graphs Configuration" ); + shell.setText( "Nsharp Parameters Selection" ); } @Override @@ -484,10 +767,35 @@ public class NsharpGraphConfigDialog extends Dialog { @Override public boolean close() { tempBtn= dewpBtn= parcelBtn= vTempBtn= wetBulbBtn= mixingRatioBtn= - dryAdiabatBtn=moisAdiabatBtn=omegaBtn= meanWindVectorBtn= stormMVector3075Btn= stormMVector1585Btn= - stormMVectorBunkersRightBtn=stormMVectorBunkersLeftBtn= corfidiVectorBtn= hodoBtn=null; + 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/NsharpLineConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpLineConfigDialog.java new file mode 100644 index 0000000000..cb011aa50a --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpLineConfigDialog.java @@ -0,0 +1,586 @@ +package gov.noaa.nws.ncep.ui.nsharp.palette; +/** + * + * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpLineConfigDialog + * + * + * 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 NsharpLineConfigDialog 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 String curLineName; + private static NsharpLineConfigDialog 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 NsharpLineConfigDialog getInstance(Shell parentShell) { + if(instance == null) + instance = new NsharpLineConfigDialog(parentShell); + return instance; + } + + public NsharpLineConfigDialog(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=NsharpGraphConfigDialog.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/NsharpPaletteWindow.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaletteWindow.java index d1c30f6f6a..156ec5593d 100644 --- 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 @@ -19,10 +19,12 @@ */ 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; @@ -31,11 +33,16 @@ 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; @@ -49,28 +56,42 @@ 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, compareBtn, graphEditBtn; + protected Button loadBtn, unloadBtn, overlayBtn, interpBtn,dataEditBtn, compareBtn, graphEditBtn,graphModeBtnSkew, graphModeBtnIcing,graphModeBtnTurb; private Shell shell; private boolean overlayIsOn=false, compareIsOn=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_OFF= "Compare(off)"; - private static String COMP_ON= "Compare(on) "; - private static String OVLY_OFF= "Ovrlay2(off)"; - private static String OVLY_ON= "Ovrlay2(on)"; + private static String COMP_ON= "Compare(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) { @@ -85,16 +106,14 @@ DisposeListener, IPartListener{ } public NsharpPaletteWindow() { super(); - //nsharpPaletteWindow = this; + instance = this; //System.out.println("NsharpPaletteWindow condtructed!!"); printHandle = NsharpPrintHandle.getPrintHandle(); shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); mb = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK ); - mb.setMessage( "Data is not loaded yet!"); - } /** @@ -115,6 +134,7 @@ DisposeListener, IPartListener{ 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 not. @@ -133,38 +153,45 @@ DisposeListener, IPartListener{ * Disposes resource. invoked by the workbench */ public void dispose() { - super.dispose(); - //System.out.println("NsharpPaletteWindow disposed!!"); - 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); + //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); + } } - //System.out.println("rp "+ rp.getResource().getName()); - } } - } - //nsharpPaletteWindow = null; + 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) { - /* - * remove the workbench part listener - */ - page.removePartListener(this); - - try{ - if(NsharpLoadDialog.getAccess()!= null){ - NsharpLoadDialog.getAccess().close(); } - }catch (Exception e) { - + instance= null; } } protected boolean checkLoadedData() { @@ -199,8 +226,16 @@ DisposeListener, IPartListener{ 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); @@ -218,6 +253,7 @@ DisposeListener, IPartListener{ } ); unloadBtn = new Button(textModeGp, SWT.PUSH); + unloadBtn.setFont(newFont); unloadBtn.setText(" UnLoad "); unloadBtn.setEnabled( true ); //loadBtn.setSize(btnWidth,pushbtnHeight); @@ -238,6 +274,7 @@ DisposeListener, IPartListener{ } ); // Push buttons for SAVE Button saveBtn = new Button(textModeGp, SWT.PUSH); + saveBtn.setFont(newFont); saveBtn.setText(" Save "); saveBtn.setEnabled( true ); //saveBtn.setSize(btnWidth,pushbtnHeight); @@ -254,24 +291,26 @@ DisposeListener, IPartListener{ // 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(); - if(checkLoadedData()) { - NsharpGraphConfigDialog dia = NsharpGraphConfigDialog.getInstance(shell); - + //CHin, new develop if(checkLoadedData()) { + //NsharpGraphConfigDialog dia = NsharpGraphConfigDialog.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() { @@ -288,7 +327,10 @@ DisposeListener, IPartListener{ 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 @@ -308,6 +350,7 @@ DisposeListener, IPartListener{ } ); Button parcelBtn = new Button(textModeGp, SWT.PUSH); + parcelBtn.setFont(newFont); parcelBtn.setText(" Parcel "); parcelBtn.setEnabled( true ); //parcelBtn.setSize(btnWidth,pushbtnHeight); @@ -328,6 +371,7 @@ DisposeListener, IPartListener{ // 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() { @@ -349,7 +393,8 @@ DisposeListener, IPartListener{ // Push buttons for NEXT INSET PAGE info Button nextInsetBtn = new Button(textModeGp, SWT.PUSH); - nextInsetBtn.setText(" Next Inset "); + nextInsetBtn.setFont(newFont); + nextInsetBtn.setText(" Next Inset "); nextInsetBtn.setEnabled(true); nextInsetBtn.addListener( SWT.MouseUp, new Listener() { public void handleEvent(Event event) { @@ -371,7 +416,7 @@ DisposeListener, IPartListener{ // Push buttons for interpolate interpBtn = new Button(textModeGp, SWT.PUSH); - + interpBtn.setFont(newFont); interpBtn.setEnabled( true ); if(interpolateIsOn) { interpBtn.setText(INTP_ON); @@ -416,6 +461,7 @@ DisposeListener, IPartListener{ // Push buttons for OVERLAY info overlayBtn = new Button(textModeGp, SWT.PUSH); + overlayBtn.setFont(newFont); if(overlayIsOn){ overlayBtn.setText(OVLY_ON); overlayBtn.setEnabled( true ); @@ -455,7 +501,7 @@ DisposeListener, IPartListener{ } ); // Push buttons for OVERLAY info compareBtn = new Button(textModeGp, SWT.PUSH); - + compareBtn.setFont(newFont); if(compareIsOn){ compareBtn.setText(COMP_ON); compareBtn.setEnabled( true ); @@ -498,7 +544,8 @@ DisposeListener, IPartListener{ } } } ); - Button dataEditBtn = new Button(textModeGp, SWT.PUSH); + dataEditBtn = new Button(textModeGp, SWT.PUSH); + dataEditBtn.setFont(newFont); dataEditBtn.setText(" Edit Data "); dataEditBtn.setEnabled( true ); dataEditBtn.addListener( SWT.MouseUp, new Listener() { @@ -514,6 +561,7 @@ DisposeListener, IPartListener{ } ); graphEditBtn = new Button(textModeGp, SWT.PUSH); + graphEditBtn.setFont(newFont); graphEditBtn.setEnabled( true ); if(editGraphOn) { graphEditBtn.setText(EDIT_GRAPH_ON); @@ -527,10 +575,16 @@ DisposeListener, IPartListener{ 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) @@ -560,6 +614,7 @@ DisposeListener, IPartListener{ // 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() { @@ -572,10 +627,94 @@ DisposeListener, IPartListener{ } } } ); - + 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() { @@ -590,6 +729,12 @@ DisposeListener, IPartListener{ } + 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 */ 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 index b4f75cd0b0..0646b9d774 100644 --- 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 @@ -487,7 +487,7 @@ public class NsharpParcelDialog extends Dialog { //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"); + //System.out.println("CR is pressed"); setReturnCode(OK); //close(); } 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 index ccd1447d0f..098cf53be5 100644 --- 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 @@ -53,6 +53,7 @@ public class NsharpShowTextDialog extends Dialog { private Shell shell; private Text text=null; private Group textGp; + private Font newFont ; private static boolean iAmClosed; private static String textToSave=""; public Text getText() { @@ -83,7 +84,7 @@ public class NsharpShowTextDialog extends Dialog { fontData[i].setHeight(12); fontData[i].setName("courier"); } - Font newFont = new Font(font.getDevice(), fontData); + newFont = new Font(font.getDevice(), fontData); text.setFont(newFont); } @@ -234,6 +235,10 @@ public class NsharpShowTextDialog extends Dialog { //System.out.println("ShowText close called"); iAmClosed = true; + if(newFont!= null){ + newFont.dispose(); + newFont=null; + } return (super.close()); } public static NsharpShowTextDialog getInstance( Shell parShell){ 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 index de2e7e4fbb..4c4ab4c36f 100644 --- 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 @@ -72,9 +72,11 @@ public class NsharpSkewTDisplay extends AbstractRenderableDisplay { 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 (){ 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 index dc304e80cb..31be81cb43 100644 --- 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 @@ -85,17 +85,18 @@ public class NsharpSkewTEditor extends AbstractEditor implements AddListener, //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. IWorkbenchPage activePage = PlatformUI.getWorkbench() @@ -108,11 +109,36 @@ public class NsharpSkewTEditor extends AbstractEditor implements AddListener, 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) @@ -373,7 +399,7 @@ public class NsharpSkewTEditor extends AbstractEditor implements AddListener, @Override public void notifyRemove(ResourcePair rp) throws VizException { - //TBD + // } /** @@ -412,17 +438,19 @@ public class NsharpSkewTEditor extends AbstractEditor implements AddListener, } return null; } + public static NsharpSkewTEditor createOrOpenSkewTEditor( ) { NsharpSkewTEditor editor = getActiveNsharpEditor(); if (editor != null) { - PlatformUI.getWorkbench().getActiveWorkbenchWindow() - .getActivePage().bringToTop(editor); + //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); @@ -434,6 +462,39 @@ public class NsharpSkewTEditor extends AbstractEditor implements AddListener, } } 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( 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 new file mode 100644 index 0000000000..2cbb9a3404 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpIcingBackground.java @@ -0,0 +1,183 @@ +/** + * + * 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/NsharpSkewTBackground.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpSkewTBackground.java index 6ab8678cbf..cc1419c754 100644 --- 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 @@ -22,7 +22,10 @@ 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.palette.NsharpGraphConfigDialog; import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; @@ -70,6 +73,8 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements private static final double Rd = 0.2870586d; private PixelExtent pe; + private NsharpGraphProperty graphConfigProperty; + private int tempOffset = 0; public NsharpSkewTBackground(NsharpSkewTDescriptor desc) { super(); @@ -84,6 +89,8 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements NsharpConstants.right, NsharpConstants.bottom); //System.out.println("NsharpSkewTBackground created"); this.desc = desc; + NsharpConfigManager configMgr = NsharpConfigManager.getInstance(); + graphConfigProperty = configMgr.retrieveNsharpConfigStoreFromFs().getGraphProperty(); } @@ -95,10 +102,10 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements private static List> getDryAdiabats(double startPressure, double stopPressure, double increment, double startTemp, - double endTemp, double tempOffset) { + double endTemp, double tempDist) { List> dryAdiabats = new ArrayList>(); - for (double t = startTemp; t < 100; t += tempOffset) { + for (double t = startTemp; t < 100; t += tempDist) { dryAdiabats.add(dryAdiabats(1000, 100, /*20*/increment, t + 273.15)); } return dryAdiabats; @@ -140,14 +147,14 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements .iterator(); iterator.hasNext();) { List points = iterator.next(); UAPoint firstPoint = points.get(0); - Coordinate startCoor = WxMath.getSkewTXY(firstPoint.pressure, + 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 = WxMath.getSkewTXY(p.pressure, + Coordinate endCoor = NsharpWxMath.getSkewTXY(p.pressure, NsharpConstants.kelvinToCelsius.convert(p.temperature)); gc.drawLine((int)world.mapX(startCoor.x), (int)world.mapY( @@ -166,8 +173,8 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements */ private void printTempLines(WGraphics world, GC gc) throws VizException { for (int i = 70; i > -200; i -= 10) { - Coordinate coorStart = WxMath.getSkewTXY(1050, i); - Coordinate coorEnd = WxMath.getSkewTXY(100, i); + 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)); @@ -229,12 +236,13 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements @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 = WxMath.getSkewTXY(1050, i); - Coordinate coorEnd = WxMath.getSkewTXY(100, i); + 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); @@ -248,11 +256,11 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements .iterator(); iterator.hasNext();) { List points = iterator.next(); UAPoint firstPoint = points.get(0); - Coordinate coor1 = WxMath.getSkewTXY(firstPoint.pressure, + Coordinate coor1 = NsharpWxMath.getSkewTXY(firstPoint.pressure, NsharpConstants.kelvinToCelsius.convert(firstPoint.temperature)); for (Iterator iter = points.iterator(); iter.hasNext();) { UAPoint p = iter.next(); - Coordinate coor2 = WxMath.getSkewTXY(p.pressure, + 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); @@ -267,11 +275,11 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements .iterator(); iterator.hasNext();) { List points = iterator.next(); UAPoint firstPoint = points.get(0); - Coordinate startCoor = WxMath.getSkewTXY(firstPoint.pressure, + Coordinate startCoor = NsharpWxMath.getSkewTXY(firstPoint.pressure, NsharpConstants.kelvinToCelsius.convert(firstPoint.temperature)); for (Iterator iter = points.iterator(); iter.hasNext();) { UAPoint p = iter.next(); - Coordinate endCoor = WxMath.getSkewTXY(p.pressure, + 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), @@ -288,8 +296,8 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements // get the location of the 850 pressure line... mixRatioShape = target.createWireframeShape(false,desc ); mixRatioShape.allocate(12); - Coordinate coorStart = WxMath.getSkewTXY(850, -50); - Coordinate coorEnd = WxMath.getSkewTXY(850, 50); + Coordinate coorStart = NsharpWxMath.getSkewTXY(850, -50); + Coordinate coorEnd = NsharpWxMath.getSkewTXY(850, 50); double startX = world.mapX(coorStart.x); double startY = world.mapY(coorStart.y); @@ -309,9 +317,9 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements .invMixingRatio(p1.pressure, ratio / 1000); p2.temperature = Equations .invMixingRatio(p2.pressure, ratio / 1000); - Coordinate coor1 = WxMath.getSkewTXY(p1.pressure, + Coordinate coor1 = NsharpWxMath.getSkewTXY(p1.pressure, p1.temperature - 273.15); - Coordinate coor2 = WxMath.getSkewTXY(p2.pressure, + 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); @@ -332,18 +340,21 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements 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 = WxMath.getSkewTXY(NsharpConstants.PRESSURE_MAIN_LEVELS[i],0); + 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 = WxMath.getSkewTXY(NsharpConstants.PRESSURE_MARK_LEVELS[i],0); + 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)}}; @@ -352,7 +363,7 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements 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 = WxMath.getSkewTXY(NsharpConstants.PRESSURE_NUMBERING_LEVELS[i],0); + 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); @@ -360,26 +371,33 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements } presslinesNumbersShape.compile(); - //temp number shape - tempNumbersShape = target.createWireframeShape(false,desc ); + 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}}; - //get temperature offset from /awips2/edex/data/utility/common_static/base/sounding/soundingPrefs.xml - int tempOffset=(int) SoundingPrefs.getSoundingPrefs().getTemperatureOffset(); - //System.out.println("Skew temp offset="+tempOffset); tempNumbersShape.addLineSegment(lines); + //int lowTemp = for (int i = 50+tempOffset; i > -40+tempOffset; i -= 10) { - Coordinate coorS = WxMath.getSkewTXY(1050, i); + 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 = WxMath.getSkewTXY(100, i); + Coordinate coorEnd1 = NsharpWxMath.getSkewTXY(100, i); //System.out.println("X = "+ startX + " Y = "+ startY); double endX1 = world.mapX(coorEnd1.x); @@ -390,20 +408,18 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements } tempNumbersShape.compile(); } - @Override public void paintInternal(IGraphicsTarget target, PaintProperties paintProps) throws VizException { target.setupClippingPlane(pe); - NsharpGraphConfigDialog configD = NsharpGraphConfigDialog.getAccess(); - if(configD != null ){ - if(configD.isMixratio() == true) + if(graphConfigProperty != null ){ + if(graphConfigProperty.isMixratio() == true) target.drawWireframeShape(mixRatioShape, NsharpConstants.mixingRatioColor, 1, LineStyle.DASHED,smallFont); - if(configD.isDryAdiabat() == true) + if(graphConfigProperty.isDryAdiabat() == true) target.drawWireframeShape(dryAdiabatsShape, NsharpConstants.dryAdiabatColor, 1, LineStyle.SOLID,smallFont); - if(configD.isMoistAdiabat() == true) + if(graphConfigProperty.isMoistAdiabat() == true) target.drawWireframeShape(moistAdiabatsShape, NsharpConstants.moistAdiabatColor, 1, LineStyle.DOTTED,smallFont); } else{ @@ -438,4 +454,12 @@ public class NsharpSkewTBackground extends NsharpAbstractBackground implements 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 new file mode 100644 index 0000000000..e684a22f68 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpTurbulenceBackground.java @@ -0,0 +1,170 @@ +/** + * + * 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 index ed79652f84..e322e6e542 100644 --- 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 @@ -22,10 +22,16 @@ 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; @@ -59,6 +65,8 @@ AbstractVizResource { private String sWindSpeed =""; private String sWindDirection=""; private NsharpSkewTBackground skewTBackground; + private NsharpIcingBackground icingBackground; + private NsharpTurbulenceBackground turbBackground; private NsharpHodoBackground hodoBackground; private NsharpInsetBackground thetaEHeightBackground; private NsharpInsetBackground srWindsBackground; @@ -75,7 +83,19 @@ AbstractVizResource { 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 @@ -211,6 +231,14 @@ AbstractVizResource { + public NsharpTurbulenceBackground getTurbBackground() { + return turbBackground; + } + + public NsharpIcingBackground getIcingBackground() { + return icingBackground; + } + public NsharpInsetBackground getThetaEHeightBackground() { return thetaEHeightBackground; } @@ -218,9 +246,11 @@ AbstractVizResource { public NsharpBackgroundResource(NsharpBkgResourceData rscData, LoadProperties loadProperties, NsharpSkewTDescriptor desc) { super(rscData, loadProperties); - //System.out.println("NsharpSkewTBackgroundResource constructor called"); + 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, @@ -252,6 +282,7 @@ AbstractVizResource { 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(). @@ -273,6 +304,8 @@ AbstractVizResource { //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() @@ -298,14 +331,23 @@ AbstractVizResource { //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 { - - skewTBackground.paint(target, paintProps); + 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); @@ -342,7 +384,7 @@ AbstractVizResource { // return ""; if (skewTBackground.contains(c)) { - c = WxMath.reverseSkewTXY(skewTBackground.getWorld() + c = NsharpWxMath.reverseSkewTXY(skewTBackground.getWorld() .unMap(c.x, c.y)); double p_mb = c.y; double t_C = c.x; // Celsius @@ -396,7 +438,7 @@ AbstractVizResource { //System.out.println(" updateDynamicData entered!!!!!C.x="+c.x + " c.y="+c.y); if (skewTBackground.contains(c)) { - c = WxMath.reverseSkewTXY(skewTBackground.getWorld() + c = NsharpWxMath.reverseSkewTXY(skewTBackground.getWorld() .unMap(c.x, c.y)); double p_mb = c.y; double t_C = c.x; // Celsius 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 index b69b94999f..96b3005bdb 100644 --- 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 @@ -23,9 +23,11 @@ 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.nsharp.skewt.NsharpSkewTEditor; import gov.noaa.nws.ncep.ui.pgen.tools.InputHandlerDefaultImpl; import org.eclipse.swt.SWT; @@ -228,9 +230,7 @@ public class NsharpSkewTMouseHandler extends InputHandlerDefaultImpl{//implement //System.out.println("handleMouseDown x "+((int)pointxy[0]-xdiff)+ " y "+((int)pointxy[1]-ydiff)); } - /* TBD else if(bkRsc.getWindMotionBackground().contains(c) == true) { - this.mode = Mode.HODO_WIND_MOTION_DOWN; - }*/ + else if(bkRsc.getHodoBackground().contains(c) == true) { if(graphEditOn){ @@ -440,6 +440,7 @@ public class NsharpSkewTMouseHandler extends InputHandlerDefaultImpl{//implement @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(); @@ -447,11 +448,7 @@ public class NsharpSkewTMouseHandler extends InputHandlerDefaultImpl{//implement // button 1 is left mouse button if (mouseButton == 1 ){ Coordinate c = editor.translateClick(x, y); - /* TBD if(bkRsc.getWindMotionBackground().contains(c) == true && mode == Mode.HODO_WIND_MOTION_DOWN) { - int index =((int)(c.y - NsharpConstants.WIND_MOTION_REC_Y_ORIG))/(NsharpConstants.WIND_MOTION_REC_HEIGHT/3); - skewRsc.setCurrentHodoWindMode(index); - } - else*/ if(bkRsc.getHodoBackground().contains(c) == true ) { + 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){ @@ -501,11 +498,11 @@ public class NsharpSkewTMouseHandler extends InputHandlerDefaultImpl{//implement } } this.mode = Mode.CREATE; - } /* else if(mouseButton == 3){ + } else if(mouseButton == 3){ //right mouse button - graphEditOn = !graphEditOn; - skewRsc.setGraphEditOn(graphEditOn); - }*/ + //System.out.println("skewtRsc handleMouseUp right button"); + NsharpMapResource.bringMapEditorToTop(); + } editor.refresh(); } 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 index c86c4a3356..7f10c90118 100644 --- 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 @@ -40,8 +40,13 @@ 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.NsharpStationInfo; +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; @@ -50,12 +55,14 @@ 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.NsharpGraphConfigDialog; +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; @@ -71,6 +78,7 @@ 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; @@ -90,8 +98,10 @@ 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; -public class NsharpSkewTResource extends - AbstractVizResource { +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; @@ -105,7 +115,14 @@ public class NsharpSkewTResource extends private static final int HODO_BNDRY= 3; private static final int HODO_MEANWIND= 4; private int currentHodoWindMode = HODO_MEANWIND; - + //private NsharpGraphConfigDialog graphConfigDialog; + //private NsharpLineConfigDialog lineConfigDialog; + //private NsharpConfigDialog configDialog; + private NsharpConfigManager configMgr; + private NsharpConfigStore configStore; + private NsharpGraphProperty graphConfigProperty; + private HashMap linePropertyMap; + private RGB pickedStnColor = NsharpConstants.color_green; private int parcelLinesInPhysicalPanelNumber = 1; private boolean overlayIsOn = false; private boolean interpolateIsOn = false; @@ -122,7 +139,183 @@ public class NsharpSkewTResource extends private double currentZoomLevel=1; private int currentCanvasBoundWidth= NsharpConstants.DEFAULT_CANVAS_WIDTH; private int currentCanvasBoundHeight= NsharpConstants.DEFAULT_CANVAS_HEIGHT; + //private int windBarbDistance = NsharpNativeConstants.WINDBARB_DISTANCE_DEFAULT; + 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 boolean compareSoundingIsOff = true; + private Coordinate interactiveTempPointCoordinate; + private int curTimeLinePage=1; + private int totalTimeLinePage=1; + private List intpSndLst = new ArrayList(); + public static final float INVALID_DATA = NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA; + //protected static final int TEMP_CHANGE_WINDOW = 4; + + protected static final double BARB_LENGTH = 3.5; + + private String soundingType= null; + + protected Map soundingMap; + + protected DataTime displayedSounding; + + private boolean sortByStn = true; + + 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 originalSoundingLys = 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 String preStnInfoStr; // previous picked stn info with time line, e.g. "ATLH 2010-12-12 12:00:00" + private NsharpStationInfo pickedStnInfo = null; + private int pickedDataTimeLineIndex=0; + private int preDataTimeLineIndex=0; + 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>(); + enum State { + PICKED, GROUPED, IDLE, OVERLAY//was , DISABLED + } + private static int PICKED_COLOR=1; + private static int GROUPED_COLOR=2; + private static int IDLE_COLOR=3; + private static int OVERLAY_COLOR=4; + //private static int DISABLED_COLOR=4; + private HashMap elementColorMap = new HashMap(); + public class ElementStateProperty { + String elementDescription; + State elementState; + Integer elementColor; + NsharpStationInfo stnInfo; + public NsharpStationInfo getStnInfo() { + return stnInfo; + } + public void setStnInfo(NsharpStationInfo stnInfo) { + this.stnInfo = stnInfo; + } + public String getElementDescription() { + return elementDescription; + } + public State getElementState() { + return elementState; + } + + } + //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=null; + public List getDataTimelineList() { + return dataTimelineList; + } + + //stationIdList derived from dataTimelineList, It only has station id info + private List stationIdList=null; + //timeLineGpList derived from dataTimelineList, It only has time line info + private List timeLineGpList=null; + + 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) @@ -172,8 +365,14 @@ public class NsharpSkewTResource extends } - public void setOverlayIsOn(boolean overlayIsOn) { - this.overlayIsOn = overlayIsOn; + public void setOverlayIsOn(boolean overlay) { + if(this.overlayIsOn && !overlay ){ + previousSoundingLys=null; + dataTimelineList.get(preDataTimeLineIndex).elementState = State.GROUPED; + dataTimelineList.get(preDataTimeLineIndex).elementColor = GROUPED_COLOR; + preDataTimeLineIndex = 0; + } + this.overlayIsOn = overlay; createRscHodoWindShapeAll(); createRscPressTempCurveShapeAll(); } @@ -182,6 +381,7 @@ public class NsharpSkewTResource extends } + public boolean isInterpolateIsOn() { return interpolateIsOn; } @@ -199,119 +399,19 @@ public class NsharpSkewTResource extends return editGraphOn; } - 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 boolean compareSoundingIsOff = true; - private Coordinate interactiveTempPointCoordinate; - private int curTimeLinePage=1; - private int totalTimeLinePage=1; - private List intpSndLst = new ArrayList(); - public static final float INVALID_DATA = NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA; - //protected static final int TEMP_CHANGE_WINDOW = 4; - - protected static final double BARB_LENGTH = 3.5; - private String soundingType= null; - - protected Map soundingMap; - - protected DataTime displayedSounding; - - - - private boolean sortByStn = true; - //protected boolean editable = false; - - - 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 originalSoundingLys = 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 String preStnInfoStr; // previous picked stn info with time line, e.g. "ATLH 2010-12-12 12:00:00" - private NsharpStationInfo pickedStnInfo = null; - private int pickedDataTimeLineIndex=0; - private int preDataTimeLineIndex=0; - 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>(); - enum State { - PICKED, GROUPED, IDLE//was , DISABLED - } - private static int PICKED_COLOR=1; - private static int GROUPED_COLOR=2; - private static int IDLE_COLOR=3; - //private static int DISABLED_COLOR=4; - private HashMap elementColorMap = new HashMap(); - public class ElementStateProperty { - String elementDescription; - State elementState; - Integer elementColor; - NsharpStationInfo stnInfo; - public NsharpStationInfo getStnInfo() { - return stnInfo; - } - public void setStnInfo(NsharpStationInfo stnInfo) { - this.stnInfo = stnInfo; - } - public String getElementDescription() { - return elementDescription; - } - } - //dataTimelineArray: 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=null; - public List getDataTimelineList() { - return dataTimelineList; + public int getCurrentGraphMode() { + return currentGraphMode; } - //stationIdList derived from dataTimelineArray, It only has station id info - private List stationIdList=null; - - private NsharpDrawPanels drawPanel; - - public class ParcelData{ - short parcelType; - float parcelLayerPressure; - - public short getParcelType() { - return parcelType; + public void setCurrentGraphMode(int currentGraphMode) { + this.currentGraphMode = currentGraphMode; + NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); + if (editor != null) { + editor.refresh(); } - 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; + } + public short getCurrentParcel() { return currentParcel; @@ -319,43 +419,6 @@ public class NsharpSkewTResource extends //native nsharp c/fortran lib //NsharpNative is native nsharp lib awips/lib/libnsharp.so wrapper class - 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 ShapeAndColor { - public IWireframeShape shape; - public RGB color; - } - //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 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 float getSmWindDir() { return smWindDir; @@ -379,30 +442,54 @@ public class NsharpSkewTResource extends } } - - - //private void setElementStatePropertyList(List eleList, State sta,int color ) { - // for (ElementStateProperty e: eleList){ - // e.elementState = sta; - // e.elementColor = color; - // } - //} - private void setStnDataTimelineStatus(String stn, State sta, int color) { + private void setStnDataTimelineStatus(String key, State sta, int color) { + String target; for (ElementStateProperty e: dataTimelineList){ - StringTokenizer st1 = new StringTokenizer(e.elementDescription); - String tok = st1.nextToken(); - if(tok.equals(stn)){ + if(sortByStn) + target = e.elementDescription.substring(0,e.elementDescription.indexOf(" ")); + else + target= e.elementDescription.substring(e.elementDescription.indexOf(" ")+1); + if(target.equals(key)){ e.elementState = sta; e.elementColor = color; } } } private void refreshPickedTimeLineState(){ + // reset previous overylay element + for(int i=0; i< dataTimelineList.size(); i++){ + if(dataTimelineList.get(i).elementState == State.OVERLAY){ + dataTimelineList.get(i).elementState = State.GROUPED; + dataTimelineList.get(i).elementColor = GROUPED_COLOR; + } + } dataTimelineList.get(pickedDataTimeLineIndex).elementState = State.PICKED; dataTimelineList.get(pickedDataTimeLineIndex).elementColor = PICKED_COLOR; if(preDataTimeLineIndex != pickedDataTimeLineIndex){ - dataTimelineList.get(preDataTimeLineIndex).elementState = State.GROUPED; - dataTimelineList.get(preDataTimeLineIndex).elementColor = GROUPED_COLOR; + if(!overlayIsOn){ + dataTimelineList.get(preDataTimeLineIndex).elementState = State.GROUPED; + dataTimelineList.get(preDataTimeLineIndex).elementColor = GROUPED_COLOR; + } + else { + dataTimelineList.get(preDataTimeLineIndex).elementState = State.OVERLAY; + dataTimelineList.get(preDataTimeLineIndex).elementColor = OVERLAY_COLOR; + } + } + } + private void resetAllTimeLineLists(){ + for(int i=0; i< dataTimelineList.size(); i++){ + if(dataTimelineList.get(i).elementState != State.PICKED){ + dataTimelineList.get(i).elementState = State.GROUPED; + dataTimelineList.get(i).elementColor = GROUPED_COLOR; + } + } + for(int i=0; i< stationIdList.size(); i++){ + stationIdList.get(i).elementState = State.GROUPED; + stationIdList.get(i).elementColor = GROUPED_COLOR; + } + for(int i=0; i< timeLineGpList.size(); i++){ + timeLineGpList.get(i).elementState = State.GROUPED; + timeLineGpList.get(i).elementColor = GROUPED_COLOR; } } public NsharpStationInfo getPickedStnInfo() { @@ -600,7 +687,6 @@ public class NsharpSkewTResource extends resetData(); } - @SuppressWarnings("deprecation") private synchronized void resetData(){ //System.out.println("resetData called"); //update active sounding layer and picked stn info @@ -665,53 +751,53 @@ public class NsharpSkewTResource extends } - //NOTE: this comparator is coded only for dataTimelineArray and stationIdList to use - //compare station name first, then day, then hour + //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 ElementComparatorNDH implements Comparator{ + public class ElementComparatorNameTime implements Comparator{ @Override public int compare(ElementStateProperty o1, ElementStateProperty o2) { - String s1tok1="", s1tok2="", s1tok3=""; - String s2tok1="", s2tok2="", s2tok3=""; + String s1tok1="", s1tok2="";//, s1tok3=""; + String s2tok1="", s2tok2="";//, s2tok3=""; StringTokenizer st1 = new StringTokenizer(o1.elementDescription); int tkCount1 = st1.countTokens(); - if(tkCount1 < 3) + //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(); //day - s1tok3 = st1.nextToken(); //hour + 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(); - if(tkCount2 < 3) + //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(); //day - s2tok3 = st2.nextToken(); //hour - + 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 - if(s1tok3.compareTo(s2tok3) == 0){ - //same hour - return 0; - }else if (s1tok3.compareTo(s2tok3) < 0){ - return 1; - } else if (s1tok3.compareTo(s2tok3) > 0) { - return -1; - } + return 0; }else if (s1tok2.compareTo(s2tok2) < 0){ return 1; } else if (s1tok2.compareTo(s2tok2) > 0) { @@ -726,55 +812,58 @@ public class NsharpSkewTResource extends return 0; } } - //NOTE: this comparator is coded only for dataTimelineArray to use - //compare day first, then hour, then station name - public class ElementComparatorDHN implements Comparator{ + //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(ElementStateProperty o1, ElementStateProperty o2) { - String s1tok1="", s1tok2="", s1tok3=""; - String s2tok1="", s2tok2="", s2tok3=""; + String s1tok1="", s1tok2=""; + String s2tok1="", s2tok2=""; StringTokenizer st1 = new StringTokenizer(o1.elementDescription); int tkCount1 = st1.countTokens(); - if(tkCount1 < 3) + //System.out.println("ElementComparatorDHN o1="+o1.elementDescription+"c1 = "+tkCount1); + if(tkCount1 < 2) { - return -1; + if(tkCount1==0) + s1tok1= o2.elementDescription; + else + s1tok1 = st1.nextToken(); } else{ s1tok1 = st1.nextToken(); //stn name - s1tok2 = st1.nextToken(); //day - s1tok3 = st1.nextToken(); //hour + s1tok2 = st1.nextToken(); // + } + //System.out.println("t1="+s1tok1+" t2="+s1tok2); StringTokenizer st2 = new StringTokenizer(o2.elementDescription); int tkCount2 = st2.countTokens(); - if(tkCount2 < 3) + //System.out.println("ElementComparatorDHN o2="+o2.elementDescription+"c2 = "+tkCount2); + if(tkCount2 < 2) { - return -1; + //return -1; + if(tkCount2==0) + s2tok1= o2.elementDescription; + else + s2tok1 = st2.nextToken(); } else{ s2tok1 = st2.nextToken(); //stn name - s2tok2 = st2.nextToken(); //day - s2tok3 = st2.nextToken(); //hour + s2tok2 = st2.nextToken(); // + } - - if(s1tok2.compareTo(s2tok2) == 0){ //compare day - //same day - if(s1tok3.compareTo(s2tok3) == 0){//compare hour - //same hour - if(s1tok1.compareTo(s2tok1) == 0){//compare stn - //same stn - return 0; - }else if (s1tok1.compareTo(s2tok1) < 0){ - return -1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return 1; - } - }else if (s1tok3.compareTo(s2tok3) < 0){ - return 1; - } else if (s1tok3.compareTo(s2tok3) > 0) { + //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){ @@ -785,15 +874,59 @@ public class NsharpSkewTResource extends return 0; } } - private void addStnIdToList(String stnId, NsharpStationInfo stnInfo){ + //NOTE: this comparator is coded only for timeLineGpList 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; + } + } + + private void addElementToList(String element, NsharpStationInfo stnInfo, List targetLst, boolean stn){ //System.out.println("stn to be added "+ stnId); - for(ElementStateProperty tempNameStr: stationIdList){ - if(tempNameStr.elementDescription.equals(stnId) ) + for(ElementStateProperty tempNameStr: targetLst){ + if(tempNameStr.elementDescription.equals(element) ) return; //nothing to do as already in list } //to here, this new stn is not in list ElementStateProperty newStnElem = new ElementStateProperty(); - newStnElem.elementDescription = stnId; + newStnElem.elementDescription = element; newStnElem.elementState = State.GROUPED;//State.PICKED; newStnElem.elementColor = GROUPED_COLOR;//PICKED_COLOR; newStnElem.stnInfo = new NsharpStationInfo(); @@ -801,8 +934,11 @@ public class NsharpSkewTResource extends newStnElem.stnInfo.setLongitude(stnInfo.getLongitude()); newStnElem.stnInfo.setSndType(stnInfo.getSndType()); - stationIdList.add(newStnElem); - Collections.sort(stationIdList, new ElementComparatorNDH()); + targetLst.add(newStnElem); + if(stn) + Collections.sort(targetLst, new ElementComparatorNameTime()); + else + Collections.sort(targetLst, new ElementComparatorTimeLine()); } private void findAndSetPickedTimeLine(){ //reset picked stn info if necessary @@ -859,16 +995,18 @@ public class NsharpSkewTResource extends } } } - //refresh stationIdList + //refresh stationIdList and timeLineGpList //Start by creating a new temporary map, using stn id (String) as key - String tok1=null; - StringTokenizer st1; Map tempStnIdMap = new HashMap(); + Map tempTmLineMap = new HashMap(); for(ElementStateProperty elm: dataTimelineList){ - st1 = new StringTokenizer(elm.elementDescription); - tok1 = st1.nextToken();//first token should be stn name - if(tok1!=null && tempStnIdMap.get(tok1)==null){ - tempStnIdMap.put(tok1, 1); // stn not in map, add it + String stnId = elm.elementDescription.substring(0,elm.elementDescription.indexOf(" ")); + String timeLine= elm.elementDescription.substring(elm.elementDescription.indexOf(" ")+1); + if(stnId!=null && tempStnIdMap.get(stnId)==null){ + tempStnIdMap.put(stnId, 1); // stn not in map, add it + } + if(timeLine!=null && tempTmLineMap.get(timeLine)==null){ + tempTmLineMap.put(timeLine, 1); // stn not in map, add it } } //refresh new stationIdList, by deleting element not found in map @@ -878,6 +1016,11 @@ public class NsharpSkewTResource extends if(tempStnIdMap.get(stn.elementDescription) == null) stationIdList.remove(i); } + for (int i = timeLineGpList.size()-1; i >= 0; i--){ + ElementStateProperty tml = timeLineGpList.get(i); + if(tempTmLineMap.get(tml.elementDescription) == null) + timeLineGpList.remove(i); + } //reinitRsc(); findAndSetPickedTimeLine(); @@ -887,9 +1030,8 @@ public class NsharpSkewTResource extends NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource(); nsharpMapResource.setPoints(null); cleanUpRsc(); - + //System.out.println("NsharpSkewTResource deleteRscAll() called"); } - @SuppressWarnings("deprecation") public void addRsc(Map> soundMap, NsharpStationInfo stnInfo){ //make sure not adding duplicated sounding data //System.out.println("NsharpSkewTResource addRsc called"); @@ -901,22 +1043,29 @@ public class NsharpSkewTResource extends 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()]); - //set current "picked" stn to become "grouped" + //set current and previously "picked" stn to become "grouped" if(pickedDataTimeLineIndex =2 ){ + // set new preDataTimeLineIndex + preDataTimeLineIndex = (pickedDataTimeLineIndex + 1)%dataTimelineList.size(); + dataTimelineList.get(preDataTimeLineIndex).elementState = State.OVERLAY; + dataTimelineList.get(preDataTimeLineIndex).elementColor = OVERLAY_COLOR; + } break; } } @@ -994,7 +1152,10 @@ public class NsharpSkewTResource extends 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) { @@ -1017,42 +1178,28 @@ public class NsharpSkewTResource extends public void setUserPickedStationId(Coordinate c) { int index =((int)(c.y - NsharpConstants.STATION_ID_REC_Y_ORIG-5))/ NsharpConstants.CHAR_HEIGHT; + List dispList; + if(sortByStn) + dispList = stationIdList; + else + dispList = timeLineGpList; //System.out.println("index="+index); - if( index < stationIdList.size() ){ - String picked = stationIdList.get(index).elementDescription; - switch(stationIdList.get(index).elementState) { + if( index < dispList.size() ){ + String picked = dispList.get(index).elementDescription; + switch(dispList.get(index).elementState) { case GROUPED: - stationIdList.get(index).elementState = State.IDLE; - stationIdList.get(index).elementColor = IDLE_COLOR; + dispList.get(index).elementState = State.IDLE; + dispList.get(index).elementColor = IDLE_COLOR; //set all time lines with same station to enabled setStnDataTimelineStatus(picked, State.IDLE, IDLE_COLOR); break; case IDLE: - stationIdList.get(index).elementState = State.GROUPED; - stationIdList.get(index).elementColor = GROUPED_COLOR; + dispList.get(index).elementState = State.GROUPED; + dispList.get(index).elementColor = GROUPED_COLOR; //set all time lines with same station to enabled setStnDataTimelineStatus(picked, State.GROUPED, GROUPED_COLOR); break; - /* was... - case GROUPED: - stationIdList.get(index).elementState = State.DISABLED; - stationIdList.get(index).elementColor = DISABLED_COLOR; - //set all time lines with same station to disabled - setStnDataTimelineStatus(picked, State.DISABLED, DISABLED_COLOR); - break; - case DISABLED: - stationIdList.get(index).elementState = State.IDLE; - stationIdList.get(index).elementColor = IDLE_COLOR; - //set all time lines with same station to enabled - setStnDataTimelineStatus(picked, State.IDLE, IDLE_COLOR); - break; - case IDLE: - stationIdList.get(index).elementState = State.GROUPED; - stationIdList.get(index).elementColor = GROUPED_COLOR; - //set all time lines with same station to enabled - setStnDataTimelineStatus(picked, State.GROUPED, GROUPED_COLOR); - break; - */ + default: break; } @@ -1086,14 +1233,15 @@ public class NsharpSkewTResource extends sortByStn=false; //System.out.println("re-sort by time first"); //resort data time line list by day, hour, station name - Collections.sort(dataTimelineList, new ElementComparatorDHN()); + Collections.sort(dataTimelineList, new ElementComparatorTimeName()); } else { sortByStn=true; //System.out.println("re-sort by stn first"); //resort data time line list by station name, day, hour - Collections.sort(dataTimelineList, new ElementComparatorNDH()); + Collections.sort(dataTimelineList, new ElementComparatorNameTime()); } + resetAllTimeLineLists(); } return; @@ -1163,7 +1311,6 @@ public class NsharpSkewTResource extends NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess(); if(textarea != null){ - // chin TBD textarea.refreshTextData(); textarea.updateTextFromWorkerThread(); } @@ -1262,7 +1409,7 @@ public class NsharpSkewTResource extends case LAST: //the future-est time, at top of time line shown. set to -1, so in while loop, it starts from 0 pickedDataTimeLineIndex=-1;// break; - case FIRST: //the oldest time, set to dataTimelineArray.length, so in while loop, it starts from dataTimelineArray.length-1 + case FIRST: //the oldest time, set to dataTimelineList.length, so in while loop, it starts from dataTimelineList.length-1 pickedDataTimeLineIndex = dataTimelineList.size(); break; } @@ -1376,7 +1523,7 @@ public class NsharpSkewTResource extends NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - Coordinate inC = WxMath.reverseSkewTXY(WGc.unMap(c)); + 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 ); @@ -1425,13 +1572,13 @@ public class NsharpSkewTResource extends double disTemp = Math.abs(pickedTemp- inTemp); double disDew = Math.abs(pickedDewpoint- inTemp); if(disTemp <= disDew){ - closeptC = WxMath.getSkewTXY(pickedPressure, pickedTemp); + closeptC = NsharpWxMath.getSkewTXY(pickedPressure, pickedTemp); closeptC = WGc.map(closeptC); currentTempCurveType = TEMP_TYPE; //System.out.println("picked pressure "+ pickedPressure + " temp " +pickedTemp); } else { - closeptC = WxMath.getSkewTXY(pickedPressure, pickedDewpoint); + closeptC = NsharpWxMath.getSkewTXY(pickedPressure, pickedDewpoint); closeptC = WGc.map(closeptC); currentTempCurveType = DEWPOINT_TYPE; //System.out.println("picked pressure "+ pickedPressure + " dewpoint " +pickedDewpoint); @@ -1485,12 +1632,12 @@ public class NsharpSkewTResource extends plotBelowT = belowLayerD; } - Coordinate c1 = WxMath.getSkewTXY(aboveLayerPressure, plotAboveT); + 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 = WxMath.getSkewTXY(belowLayerPressure,plotBelowT); + 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, @@ -1610,7 +1757,8 @@ public class NsharpSkewTResource extends */ public NsharpSkewTResource(AbstractResourceData resourceData, LoadProperties loadProperties) { - super(resourceData, loadProperties); + super(resourceData, loadProperties); + System.out.println("NsharpSkewTResource constructed"); this.dataTimes = new ArrayList(); this.soundingMap = new HashMap(); elementColorMap.put(new Integer(PICKED_COLOR),NsharpConstants.color_green); //green @@ -1620,7 +1768,7 @@ public class NsharpSkewTResource extends dataTimelineList = new ArrayList(); stationIdList = new ArrayList(); nsharpNative = new NsharpNative(); - //System.out.println("NsharpSkewTResource constructed"); + timeLineGpList = new ArrayList(); //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); @@ -1628,7 +1776,21 @@ public class NsharpSkewTResource extends 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(); + + //graphConfigDialog = NsharpGraphConfigDialog.getAccess(); + //if(graphConfigProperty!=null) + // windBarbDistance = graphConfigProperty.getWindBarbDistance(); + //else + // windBarbDistance = NsharpNativeConstants.WINDBARB_DISTANCE_DEFAULT; } public void cleanUpRsc(){ if(dataTimelineSndLysListMap!= null) @@ -1645,6 +1807,8 @@ public class NsharpSkewTResource extends dataTimelineList.clear(); if(stationIdList!= null) stationIdList.clear(); + if(timeLineGpList!= null) + timeLineGpList.clear(); if(intpSndLst!= null) intpSndLst.clear(); currentTextPage = 1; @@ -1653,7 +1817,8 @@ public class NsharpSkewTResource extends currentParcelLayerPressure = NsharpNativeConstants.MU_LAYER; curTimeLinePage=1; totalTimeLinePage=1; - + pickedDataTimeLineIndex = 0; + preDataTimeLineIndex = 0; } @Override protected void disposeInternal() { @@ -1688,6 +1853,7 @@ public class NsharpSkewTResource extends dataTimelineList= null; intpSndLst = null; stationIdList= null; + timeLineGpList= null; stormSlinkyColorMap = null; elementColorMap= null; disposeAllWireFrameShapes(); @@ -1779,6 +1945,101 @@ public class NsharpSkewTResource extends 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) * @@ -1803,6 +2064,7 @@ public class NsharpSkewTResource extends //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(); @@ -1814,6 +2076,7 @@ public class NsharpSkewTResource extends drawPanel.setMyFont(font10); bkRsc.getSkewTBackground().setCurrentFont(currentFont10Size); bkRsc.getHodoBackground().setCurrentFont(currentFont10Size); + bkRsc.getIcingBackground().setCurrentFont(currentFont10Size); } if(zoomLevel != currentZoomLevel) { @@ -1821,52 +2084,112 @@ public class NsharpSkewTResource extends magnifyFont(zoomLevel); bkRsc.getSkewTBackground().magnifyFont(zoomLevel); bkRsc.getHodoBackground().magnifyFont(zoomLevel); + bkRsc.getIcingBackground().magnifyFont(zoomLevel); } //System.out.println("canvas h="+paintProps.getCanvasBounds().height + " canvas w="+ paintProps.getCanvasBounds().width + " zoomlvl="+currentZoomLevel); WGraphics plotWorld; - + PixelExtent extent; + //configD = NsharpGraphConfigDialog.getAccess(); if((soundingLys != null) && (soundingLys.size()>= 4)) { + if(currentGraphMode== NsharpConstants.GRAPH_SKEWT){ + plotWorld = bkRsc.getSkewTBackground().getWorld(); - plotWorld = bkRsc.getSkewTBackground().getWorld(); - NsharpGraphConfigDialog configD = NsharpGraphConfigDialog.getAccess(); - PixelExtent 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(ShapeAndColor shapeNColor: pressureTempRscShapeList){ - target.drawWireframeShape(shapeNColor.shape, shapeNColor.color, commonLinewidth*2,commonLineStyle,font10); - } - if(configD != null ){ - if(configD.isTemp() == true && !compareIsOn){ - if(editGraphOn) - plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_red, TEMP_TYPE, this.soundingLys); + 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); } - // dew point curve - if(configD.isDewp() == true && !compareIsOn){ - if(editGraphOn) - plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_green, DEWPOINT_TYPE, this.soundingLys); - } - //plot wetbulb trace - if(configD.isWetBulb() == true && !compareIsOn) - target.drawWireframeShape(wetBulbTraceRscShape, NsharpConstants.color_cyan, commonLinewidth,commonLineStyle,font10); - //plot virtual temp trace - if(configD.isVTemp() == true && !compareIsOn) - target.drawWireframeShape(vtempTraceCurveRscShape, NsharpConstants.color_red, commonLinewidth*2, LineStyle.DASHED,font10); - // parcel trace curve - if(configD.isParcel() == true && !compareIsOn){ - if(soundingLys.size() > 0){ - for (IWireframeShape shape: parcelTraceRscShapeList){ - target.drawWireframeShape(shape, NsharpConstants.color_white, commonLinewidth, - LineStyle.DASHED,font10); + + + if(graphConfigProperty != null ){ + if(graphConfigProperty.isTemp() == true && !compareIsOn){ + if(editGraphOn) + plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_red, TEMP_TYPE, this.soundingLys); + } + // dew point curve + if(graphConfigProperty.isDewp() == true && !compareIsOn){ + if(editGraphOn) + plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_green, DEWPOINT_TYPE, this.soundingLys); + } + //plot wetbulb trace + if(graphConfigProperty.isWetBulb() == true && !compareIsOn){ + 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 && !compareIsOn){ + 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 && !compareIsOn){ + 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 && !compareIsOn) + //draw effective layer lines + drawEffectiveLayerLines(target); + + //cloud + if(graphConfigProperty.isCloud() == true && !compareIsOn){ + 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); } } } - if(configD.isOmega() == true){ + else{ + //by default, draw everything + if(!compareIsOn){ + 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 )){ @@ -1875,58 +2198,62 @@ public class NsharpSkewTResource extends target.drawWireframeShape(omegaBkgShape, NsharpConstants.color_violet_red, commonLinewidth, LineStyle.DASHED,font10); target.drawWireframeShape(omegaRscShape, NsharpConstants.color_cyan, commonLinewidth, - commonLineStyle,font10); + commonLineStyle,font10); } } - } - else{ - //by default, draw everything - if(!compareIsOn){ - 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 - target.drawWireframeShape(wetBulbTraceRscShape, NsharpConstants.color_cyan, commonLinewidth,LineStyle.DEFAULT,font10); - //plot virtual temp trace - target.drawWireframeShape(vtempTraceCurveRscShape, NsharpConstants.color_red, commonLinewidth*2, LineStyle.DASHED,font10); - // parcel trace curve - if(soundingLys.size() > 0){ - for (IWireframeShape shape: parcelTraceRscShapeList){ - target.drawWireframeShape(shape, NsharpConstants.color_white, commonLinewidth, - LineStyle.DASHED,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); + drawNsharpWindBarb(target, zoomLevel, plotWorld, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor(), this.previousSoundingLys, NsharpConstants.right - BARB_LENGTH * 2.5,100); + } + else{ + if(!compareIsOn ){ + 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); } } + } - 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(); + //drawHeightMark(target); + target.drawWireframeShape(heightMarkRscShape, NsharpConstants.color_red, 1, LineStyle.SOLID, font10); - // Wind Barb - if(!compareIsOn )//&& !overlayIsOn) - drawNsharpWindBarb(target, zoomLevel, plotWorld, NsharpConstants.color_yellow, this.soundingLys, NsharpConstants.right - BARB_LENGTH); - if(overlayIsOn == true && this.previousSoundingLys!=null) - drawNsharpWindBarb(target, zoomLevel, plotWorld, NsharpConstants.color_violet, this.previousSoundingLys, NsharpConstants.right - BARB_LENGTH * 2.5); + if(!compareIsOn){ + //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(ShapeAndColor shapeNColor: windBoxWindRscShapeList){ - target.drawWireframeShape(shapeNColor.shape, shapeNColor.color, commonLinewidth,commonLineStyle,font10); + for(ShapeAndLineProperty shapeNColor: windBoxWindRscShapeList){ + target.drawWireframeShape(shapeNColor.shape, shapeNColor.lp.getLineColor(), commonLinewidth,commonLineStyle,font10); } //plot vertical wind profile (advection layer) @@ -1946,38 +2273,19 @@ public class NsharpSkewTResource extends //data time title drawNsharpDataTimelineTitle(target); drawNsharpStationIdTitle(target); - //drawHeightMark(target); - target.drawWireframeShape(heightMarkRscShape, NsharpConstants.color_red, 1, LineStyle.SOLID, font10); - - if(!compareIsOn){ - //draw EL, LFC, LCL, FZL, -20C, -30C lines - drawLclLine(target); - - //draw effective layer lines - drawEffectiveLayerLines(target); - - // draw cursor data - if(cursorInSkewT== true){ - if(curseToggledFontLevel < CURSER_STRING_OFF) - drawNsharpSkewtCursorData(target); - //draw dynamic temp, theta, height - drawNsharpSkewtDynamicData(target, zoomLevel, plotWorld); - - } - } - drawNsharpDataFilelabel(target, zoomLevel, plotWorld); + drawNsharpDataFilelabel(target, zoomLevel); //plot HODO plotWorld = bkRsc.getHodoBackground().getWorld(); extent = new PixelExtent(bkRsc.getHodoBackground() .getRectangle()); target.setupClippingPlane(extent); - if(((configD != null )&& configD.isHodo())|| (configD == null)){ - for(ShapeAndColor shapeNColor: hodoWindRscShapeList){ - target.drawWireframeShape(shapeNColor.shape, shapeNColor.color, commonLinewidth*2,commonLineStyle,font10); + if(((graphConfigProperty != null )&& graphConfigProperty.isHodo())|| (graphConfigProperty == null)){ + for(ShapeAndLineProperty shapeNColor: hodoWindRscShapeList){ + target.drawWireframeShape(shapeNColor.shape, shapeNColor.lp.getLineColor(), commonLinewidth*2,commonLineStyle,font10); } } if(editGraphOn && !compareIsOn) @@ -2044,6 +2352,8 @@ public class NsharpSkewTResource extends plotWorld = bkRsc.getDataTimelineBackground().getWorld(); drawNsharpDataTimelines(target, plotWorld, bkRsc.getDataTimelineBackground().getRectangle()); + + //plot station id plotWorld = bkRsc.getStationIdBackground().getWorld(); drawNsharpStationId(target, plotWorld, bkRsc.getStationIdBackground().getRectangle()); @@ -2170,8 +2480,7 @@ public class NsharpSkewTResource extends return clipping; } - @SuppressWarnings("deprecation") - private void drawHodoDynamicData(IGraphicsTarget target, double zoomLevel, + 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(); @@ -2189,8 +2498,7 @@ public class NsharpSkewTResource extends VerticalAlignment.BOTTOM, null); } - @SuppressWarnings("deprecation") - private void drawNsharpSkewtDynamicData(IGraphicsTarget target, double zoomLevel, + private void drawNsharpSkewtDynamicData(IGraphicsTarget target, double zoomLevel, WGraphics world) throws VizException { NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); @@ -2234,81 +2542,71 @@ public class NsharpSkewTResource extends VerticalAlignment.BOTTOM, null); } - @SuppressWarnings("deprecation") - private void drawNsharpDataFilelabel(IGraphicsTarget target, double zoomLevel, - WGraphics world) + private void drawNsharpDataFilelabel(IGraphicsTarget target, double zoomLevel) throws VizException { - double X = NsharpConstants.SKEWT_REC_X_ORIG; + double X = NsharpConstants.SKEWT_REC_X_ORIG+20; double Y = /*NsharpConstants.top -*/ 15; target.drawString(font10, pickedStnInfoStr, X, Y, 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, + TextStyle.NORMAL, pickedStnColor, HorizontalAlignment.LEFT, VerticalAlignment.MIDDLE, null); - //Also draw stn lat/lon info string and sounding type string if(pickedStnInfo != null){ - String latlonStr = pickedStnInfo.getLatitude() + "," + pickedStnInfo.getLongitude(); + 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, NsharpConstants.color_white, HorizontalAlignment.LEFT, + TextStyle.NORMAL, pickedStnColor, HorizontalAlignment.LEFT, VerticalAlignment.MIDDLE, null); - target.drawString(font10, "Sounding Type", NsharpConstants.SKEWT_REC_X_ORIG - 300, Y, 0.0, + 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.SKEWT_REC_X_ORIG - 300,3* Y, 0.0, + target.drawString(font10, sndTypeStr, NsharpConstants.OMEGA_X_TOP,3* Y, 0.0, TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, VerticalAlignment.MIDDLE, null); } } - @SuppressWarnings("deprecation") - public void drawNsharpSkewtCursorData(IGraphicsTarget target) throws VizException{ + public void drawNsharpSkewtCursorData(IGraphicsTarget target) throws VizException{ IFont myFont; myFont = target.initializeFont("Monospace", curseToggledFontLevel, null); NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - Coordinate c = WxMath.reverseSkewTXY(WGc.unMap(cursorCor.x, cursorCor.y)); + 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 curStr, curStr1, curStr2; + String curStr3,curStr, curStr1, curStr2; VerticalAlignment vAli; HorizontalAlignment hAli; - //if(curseToggled == false) - { - 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.0fmb %5.0fft/%.0fm agl %2.0f%%\n"; - curStr = String.format(curStrFormat, p_mb,htFt,htM,relh); - } - else{ - curStrFormat= "%4.0fmb %5.0fft/%.0fm agl\n"; - curStr = String.format(curStrFormat, 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)); + 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.0fmb %5.0fft/%.0fm agl %2.0f%%\n"; + curStr = String.format(curStrFormat, p_mb,htFt,htM,relh); } - //else - { - //String tempS= String.format("%5.1f%cC ",temp,NsharpConstants.DEGREE_SYMBOL); - curStr2 =bkRsc.getSThetaInK()+" "+bkRsc.getSWThetaInK()+" "+bkRsc.getSEThetaInK(); - //float heightM = nsharpNative.nsharpLib.ihght((float)bkRsc.getDPressure()); - //String sHeightM = String.format("%.0fm",heightM); - //String sHeightFt = String.format("%.0fft/",NsharpConstants.metersToFeet.convert(heightM)); - //curStr = bkRsc.getSPressure()+ " "+ sHeightFt+sHeightM+"\n"; + else{ + curStrFormat= "%4.0fmb %5.0fft/%.0fm agl\n"; + curStr = String.format(curStrFormat, 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)); + + //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; @@ -2320,7 +2618,7 @@ public class NsharpSkewTResource extends hAli = HorizontalAlignment.CENTER; } vAli = VerticalAlignment.BOTTOM; - target.drawString(myFont,curStr+curStr1+curStr2, cursorCor.x, + target.drawString(myFont,curStr+curStr1+curStr2+curStr3, cursorCor.x, cursorCor.y, 0.0, TextStyle.NORMAL, NsharpConstants.color_yellow, hAli, vAli, null); @@ -2329,8 +2627,7 @@ public class NsharpSkewTResource extends /* * This function mostly follow display_effective_layer() of xwvid1.c */ - @SuppressWarnings("deprecation") - private void drawEffectiveLayerLines(IGraphicsTarget target) throws VizException{ + private void drawEffectiveLayerLines(IGraphicsTarget target) throws VizException{ NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); @@ -2351,22 +2648,22 @@ public class NsharpSkewTResource extends { botStr = String.format( "%.0fm", aglBot); } - double y = WGc.mapY(WxMath.getSkewTXY(botPF.getValue(), 10).y); + 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)+180, + target.drawString(font10,botStr, WGc.mapX(NsharpConstants.left)+300, y, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan_md, HorizontalAlignment.RIGHT, + NsharpConstants.color_cyan_md, HorizontalAlignment.LEFT, VerticalAlignment.MIDDLE, null); // Draw effective top level topStr = String.format( "%.0fm", aglTop); - double y1 = WGc.mapY(WxMath.getSkewTXY(topPF.getValue(), 10).y); + 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)+180, + target.drawString(font10,topStr, WGc.mapX(NsharpConstants.left)+300, y1, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan_md, HorizontalAlignment.RIGHT, + NsharpConstants.color_cyan_md, HorizontalAlignment.LEFT, VerticalAlignment.MIDDLE, null); //System.out.println("aglbot="+aglBot+" agltop="+aglTop); } @@ -2387,8 +2684,7 @@ public class NsharpSkewTResource extends VerticalAlignment.MIDDLE, null); } - @SuppressWarnings("deprecation") - private void drawLclLine(IGraphicsTarget target) throws VizException{ + private void drawLclLine(IGraphicsTarget target) throws VizException{ NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); @@ -2410,7 +2706,7 @@ public class NsharpSkewTResource extends 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(WxMath.getSkewTXY(pressure, 10).y); + 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, @@ -2424,7 +2720,7 @@ public class NsharpSkewTResource extends 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(WxMath.getSkewTXY(pressure, 10).y); + 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, @@ -2439,7 +2735,7 @@ public class NsharpSkewTResource extends 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(WxMath.getSkewTXY(pressure, 10).y); + 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, @@ -2455,7 +2751,7 @@ public class NsharpSkewTResource extends 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(WxMath.getSkewTXY(pressure, 10).y); + 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'"; @@ -2471,8 +2767,8 @@ public class NsharpSkewTResource extends 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(WxMath.getSkewTXY(pressure, -20).y); - //double x = WGc.mapX(WxMath.getSkewTXY(pressure, -20).x); + 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'"; @@ -2488,7 +2784,7 @@ public class NsharpSkewTResource extends 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(WxMath.getSkewTXY(pressure, 10).y); + 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'"; @@ -2508,7 +2804,7 @@ public class NsharpSkewTResource extends float meters = (float)NsharpConstants.feetToMeters.convert(NsharpConstants.HEIGHT_LEVEL_FEET[j]); double pressure = nsharpNative.nsharpLib.ipres(meters); - double y = world.mapY(WxMath.getSkewTXY(pressure, -50).y); + 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); @@ -2521,7 +2817,7 @@ public class NsharpSkewTResource extends int meters = NsharpConstants.HEIGHT_LEVEL_METERS[j]; double pressure = nsharpNative.nsharpLib.ipres(meters); - double y = world.mapY(WxMath.getSkewTXY(pressure, -50).y); + double y = world.mapY(NsharpWxMath.getSkewTXY(pressure, -50).y); gc.drawString( Integer.toString(meters/1000), (int)vxMax + 52, (int)y,false); @@ -2530,12 +2826,12 @@ public class NsharpSkewTResource extends gc.drawLine( (int)vxMax + 50,(int) y, (int) vxMax + 55,(int) y); } // print surface level mark - double y = world.mapY(WxMath.getSkewTXY(soundingLys.get(0).getPressure(), -50).y); + 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(WxMath.getSkewTXY(100, -50).y); + 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); @@ -2557,7 +2853,7 @@ public class NsharpSkewTResource extends 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 = WxMath.getSkewTXY(NsharpConstants.PRESSURE_MAIN_LEVELS[i],0); + Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_MAIN_LEVELS[i],0); gc.drawLine((int)vxMin, (int)world.mapY(coor.y), (int)vxMax, @@ -2566,7 +2862,7 @@ public class NsharpSkewTResource extends } 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 = WxMath.getSkewTXY(NsharpConstants.PRESSURE_MARK_LEVELS[i],0); + Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_MARK_LEVELS[i],0); gc.drawLine((int)vxMin, (int)world.mapY(coor.y), (int)vxMin+10, @@ -2576,7 +2872,7 @@ public class NsharpSkewTResource extends 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 = WxMath.getSkewTXY(NsharpConstants.PRESSURE_NUMBERING_LEVELS[i],0); + Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_NUMBERING_LEVELS[i],0); gc.drawString( s, (int)vxMin-20, (int)world.mapY(coor.y), false); @@ -2590,14 +2886,14 @@ public class NsharpSkewTResource extends */ public void printNsharpTempNumber(WGraphics world, GC gc) throws VizException { for (int i = 40; i > -50; i -= 10) { - Coordinate coorStart = WxMath.getSkewTXY(1050, i); + 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 = WxMath.getSkewTXY(100, i); + Coordinate coorEnd = NsharpWxMath.getSkewTXY(100, i); //System.out.println("X = "+ startX + " Y = "+ startY); double endX = world.mapX(coorEnd.x); @@ -2612,16 +2908,21 @@ public class NsharpSkewTResource extends * * @throws VizException */ - @SuppressWarnings("deprecation") - private void drawNsharpStationId(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { + private void drawNsharpStationId(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { PixelExtent extent = new PixelExtent(rect); RGB color; target.setupClippingPlane(extent); double x= NsharpConstants.STATION_ID_REC_X_ORIG + 5; double ly= NsharpConstants.STATION_ID_REC_Y_ORIG + 5; - for (int j = 0; j< stationIdList.size(); j++) + List dispList; + if(sortByStn) + dispList = stationIdList; + else + dispList = timeLineGpList; + + for (int j = 0; j< dispList.size(); j++) { - String s = stationIdList.get(j).elementDescription; + String s = dispList.get(j).elementDescription; //System.out.println("stationId: "+ s); ly = ly + NsharpConstants.CHAR_HEIGHT; @@ -2629,7 +2930,7 @@ public class NsharpSkewTResource extends //color = NsharpConstants.color_white; //mark user picked stn as green - color = elementColorMap.get(stationIdList.get(j).elementColor); + color = elementColorMap.get(dispList.get(j).elementColor); target.drawString(font10, s, x, ly, 0.0, IGraphicsTarget.TextStyle.NORMAL, @@ -2637,6 +2938,8 @@ public class NsharpSkewTResource extends HorizontalAlignment.LEFT, VerticalAlignment.BOTTOM, null); } + + /*plot notations: target.drawLine(NsharpConstants.STATION_ID_REC_X_ORIG, NsharpConstants.STATION_ID_NOTATION_Y_START, 0.0, NsharpConstants.STATION_ID_VIEW_X_END , NsharpConstants.STATION_ID_NOTATION_Y_START, 0.0, @@ -2667,10 +2970,13 @@ public class NsharpSkewTResource extends * * @throws VizException */ - @SuppressWarnings("deprecation") - private void drawNsharpStationIdTitle(IGraphicsTarget target) throws VizException { + private void drawNsharpStationIdTitle(IGraphicsTarget target) throws VizException { //darw title first - String s = stationIdList.size() + " stations"; + String s; + if(sortByStn) + s = stationIdList.size() + " stations"; + else + s = timeLineGpList.size() + " time line"; double x = NsharpConstants.STATION_ID_REC_X_ORIG; double y = NsharpConstants.STATION_ID_REC_Y_ORIG - 30; @@ -2682,8 +2988,8 @@ public class NsharpSkewTResource extends VerticalAlignment.MIDDLE, null); } - @SuppressWarnings({ "deprecation", "unused" }) - //To be used later... + //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); @@ -2737,15 +3043,15 @@ public class NsharpSkewTResource extends * * @throws VizException */ - @SuppressWarnings("deprecation") - private void drawNsharpDataTimelines(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { + 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", s1; + String s = "nextPage"; + String s1="", s2=""; target.drawString(font10, s, x, nextPageY, 0.0, IGraphicsTarget.TextStyle.NORMAL, @@ -2759,7 +3065,7 @@ public class NsharpSkewTResource extends 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=1; + int i = 1, colorIndex=NsharpConstants.LINE_COMP1;//1; for (int j = startIndex; j< dataTimelineList.size(); j++) { ElementStateProperty elm = dataTimelineList.get(j); @@ -2768,60 +3074,62 @@ public class NsharpSkewTResource extends //System.out.println("selectedTimeList: "+ s); double ly = NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END + NsharpConstants.CHAR_HEIGHT * i; - if(!compareIsOn) - color = elementColorMap.get(elm.elementColor); - else { - if(elm.elementState == State.PICKED ){ - color = NsharpConstants.COLOR_ARRAY[0]; - } else if(elm.elementState == State.GROUPED){ - color = NsharpConstants.COLOR_ARRAY[colorIndex]; - - } else { - color = elementColorMap.get(elm.elementColor);; - } - colorIndex++;//always increase index, no matter ploting this elm or not - if(colorIndex > NsharpConstants.COLOR_ARRAY.length-1) - colorIndex =1; + if(!compareIsOn){ + if(overlayIsOn == true && this.previousSoundingLys!=null){ + if(elm.elementState == State.PICKED ){ + color = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1]).getLineColor(); + + } + else if(elm.elementState == State.OVERLAY) + color = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor(); + + else + color = elementColorMap.get(elm.elementColor); + + } + else { + color = elementColorMap.get(elm.elementColor); + } } - //darw data time line, split string to make all lines in line vertically. - s = s.substring(0,s.length()-3); - String stok1, stok2, stok3; + else { + if(elm.elementState == State.PICKED || elm.elementState == 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 == State.PICKED){ + pickedStnColor = color; + } + StringTokenizer stoken = new StringTokenizer(s); - if(sortByStn){ - stok1 = stoken.nextToken(); //stn name, display upto 4 char - int nameLen= Math.min(4, stok1.length()); - s = stok1.substring(0,nameLen); - stok2 = stoken.nextToken(); //day - stok2 = stok2.substring(2); - stok3 = stoken.nextToken(); //hour - s1 = stok2.concat(" "+stok3.substring(0, 2)); - //x1 = x +130; + 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{ - stok3 = stoken.nextToken(); //stn name - int nameLen= Math.min(4, stok3.length()); - s1 = stok3.substring(0,nameLen); - stok1 = stoken.nextToken(); //day - stok1 = stok1.substring(2); - stok2 = stoken.nextToken(); //hour - s = stok1.concat(" "+stok2.substring(0, 2)); - - //x1 = x+ 165; - } - s= s+ " "+s1; + }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); - /*target.drawString(font10, s1, x1, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null);*/ i++; if (ly >= NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.CHAR_HEIGHT) @@ -2836,7 +3144,7 @@ public class NsharpSkewTResource extends x, NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, NsharpConstants.color_white,1, LineStyle.SOLID); color = NsharpConstants.color_yellow; - s = "by:"; + s = "list by:"; target.drawString(font10, s, x+2, nextPageY, 0.0, IGraphicsTarget.TextStyle.NORMAL, @@ -2851,10 +3159,10 @@ public class NsharpSkewTResource extends if(sortByStn){ color = NsharpConstants.color_green; - color1 = NsharpConstants.color_orange; + color1 = NsharpConstants.color_white; } else{ - color = NsharpConstants.color_orange; + color = NsharpConstants.color_white; color1 = NsharpConstants.color_green; } target.drawString(font10, s, x+10, @@ -2875,8 +3183,7 @@ public class NsharpSkewTResource extends * * @throws VizException */ - @SuppressWarnings("deprecation") - private void drawNsharpDataTimelineTitle(IGraphicsTarget target) throws VizException { + private void drawNsharpDataTimelineTitle(IGraphicsTarget target) throws VizException { String s = dataTimelineList.size() + " data time lines"; double x = NsharpConstants.DATA_TIMELINE_REC_X_ORIG; double y = NsharpConstants.DATA_TIMELINE_REC_Y_ORIG - 60; @@ -2902,8 +3209,7 @@ public class NsharpSkewTResource extends * * @throws VizException */ - @SuppressWarnings("deprecation") - private void drawNsharpColorNotation(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { + private void drawNsharpColorNotation(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { PixelExtent extent = new PixelExtent(rect); RGB color; target.setupClippingPlane(extent); @@ -2969,31 +3275,57 @@ public class NsharpSkewTResource extends * */ private void drawNsharpWindBarb(IGraphicsTarget target, double zoomLevel, - WGraphics world, RGB icolor, List sndLys, double xPosition)throws VizException { + WGraphics world, RGB icolor, List sndLys, double xPosition, double botPress)throws VizException { ArrayList> windList = new ArrayList>(); - double windX = xPosition;//NsharpConstants.right - BARB_LENGTH; + double windX = xPosition; float lastHeight = -999; - double windY; + double windY=0; + double barbScaleFactorx=1, barbScaleFactory=1; + //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 < 100 || spd < 0 ) { + if ( pressure < botPress || spd < 0 ) { continue; } if(spd > 140) spd = 140; - if ((layer.getGeoHeight() - lastHeight) < 400){ + if ((layer.getGeoHeight() - lastHeight) < graphConfigProperty.getWindBarbDistance()*zoomLevel){ continue; } // Get the vertical ordinate. - windY = WxMath.getSkewTXY(pressure, 0).y; + 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; + barbScaleFactory=3.5;//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;//experimental value: depends on the world coordinate size set + barbScaleFactory=5.5; + } + else + continue; + List barb = WindBarbFactory.getWindGraphics((double) (spd), (double) dir); if (barb != null) { - WindBarbFactory.scaleBarb(barb, zoomLevel); + // 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); } @@ -3003,6 +3335,7 @@ public class NsharpSkewTResource extends } 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); @@ -3041,7 +3374,7 @@ public class NsharpSkewTResource extends } // Get the vertical ordinate. - windY = world.mapY(WxMath.getSkewTXY(pressure, 0).y); + windY = world.mapY(NsharpWxMath.getSkewTXY(pressure, 0).y); List barb = WindBarbFactory.getWindGraphics( /*metersPerSecondToKnots.convert*/(double) (spd), (double) dir); @@ -3073,8 +3406,8 @@ public class NsharpSkewTResource extends } } } - gc.drawLine((int)windX,(int)world.mapY(WxMath.getSkewTXY(100, 0).y), - (int)windX,(int)world.mapY(WxMath.getSkewTXY(1000, 0).y)); + gc.drawLine((int)windX,(int)world.mapY(NsharpWxMath.getSkewTXY(100, 0).y), + (int)windX,(int)world.mapY(NsharpWxMath.getSkewTXY(1000, 0).y)); } /** @@ -3097,7 +3430,7 @@ public class NsharpSkewTResource extends t1 = nsharpNative.nsharpLib.wetbulb(layer.getPressure(), layer.getTemperature(), layer.getDewpoint()); - c1 = WxMath.getSkewTXY(layer.getPressure(), t1); + c1 = NsharpWxMath.getSkewTXY(layer.getPressure(), t1); c1.x = world.mapX(c1.x); c1.y = world.mapY(c1.y); if(c2!= null){ @@ -3124,13 +3457,13 @@ public class NsharpSkewTResource extends sfcpres = lpvls.pres; float vtemp = nsharpNative.nsharpLib.virtemp (sfcpres, sfctemp, sfcdwpt); - Coordinate c1 = WxMath.getSkewTXY(sfcpres, vtemp); + 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 = WxMath.getSkewTXY(p2.getValue(), vtemp); + Coordinate c2 = NsharpWxMath.getSkewTXY(p2.getValue(), vtemp); c2.x = world.mapX(c2.x); c2.y = world.mapY(c2.y); @@ -3143,7 +3476,7 @@ public class NsharpSkewTResource extends { t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), i); vtemp = nsharpNative.nsharpLib.virtemp (i, t3, t3); - c2 = WxMath.getSkewTXY(i, vtemp); + c2 = NsharpWxMath.getSkewTXY(i, vtemp); c2.x = world.mapX(c2.x); c2.y = world.mapY(c2.y); @@ -3153,7 +3486,7 @@ public class NsharpSkewTResource extends t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), 100); vtemp = nsharpNative.nsharpLib.virtemp (100, t3, t3); - c2 = WxMath.getSkewTXY(100, vtemp); + c2 = NsharpWxMath.getSkewTXY(100, vtemp); c2.x = world.mapX(c2.x); c2.y = world.mapY(c2.y); @@ -3179,9 +3512,9 @@ public class NsharpSkewTResource extends } private void plotPressureTempEditPoints(IGraphicsTarget target, WGraphics world, RGB color, int type, List soundingLys) throws VizException { - double maxPressure = WxMath.reverseSkewTXY(new Coordinate(0, world + double maxPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world .getWorldYmax())).y; - double minPressure = WxMath.reverseSkewTXY(new Coordinate(0, world + double minPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world .getWorldYmin())).y; PointStyle ps = PointStyle.CIRCLE; for (NcSoundingLayer layer : soundingLys) { @@ -3196,7 +3529,7 @@ public class NsharpSkewTResource extends if (t != INVALID_DATA && pressure >= minPressure && pressure <= maxPressure) { - Coordinate c1 = WxMath.getSkewTXY(pressure, t); + Coordinate c1 = NsharpWxMath.getSkewTXY(pressure, t); c1.x = world.mapX(c1.x); c1.y = world.mapY(c1.y); @@ -3217,9 +3550,9 @@ public class NsharpSkewTResource extends if((soundingLys == null) || (soundingLys.size()==0)) return; - double maxPressure = WxMath.reverseSkewTXY(new Coordinate(0, world + double maxPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world .getWorldYmax())).y; - double minPressure = WxMath.reverseSkewTXY(new Coordinate(0, world + double minPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world .getWorldYmin())).y; Coordinate c0 = null; for (NcSoundingLayer layer : soundingLys) { @@ -3234,7 +3567,7 @@ public class NsharpSkewTResource extends if (t != INVALID_DATA && pressure >= minPressure && pressure <= maxPressure) { - Coordinate c1 = WxMath.getSkewTXY(pressure, t); + Coordinate c1 = NsharpWxMath.getSkewTXY(pressure, t); c1.x = world.mapX(c1.x); c1.y = world.mapY(c1.y); @@ -3280,11 +3613,10 @@ public class NsharpSkewTResource extends /* * smvtype: 1: small circle, 2 large circle, 3: square */ - @SuppressWarnings("deprecation") - public void plotNsharpHodoVectors(IGraphicsTarget target, double zoomLevel, + public void plotNsharpHodoVectors(IGraphicsTarget target, double zoomLevel, WGraphics world, GC gc, boolean printEvent) throws VizException { double radiusUnit = 10; - NsharpGraphConfigDialog configD = NsharpGraphConfigDialog.getAccess(); + //NsharpGraphConfigDialog configD = NsharpGraphConfigDialog.getAccess(); Coordinate c; FloatByReference value1= new FloatByReference(-999); FloatByReference value2= new FloatByReference(-999); @@ -3294,7 +3626,7 @@ public class NsharpSkewTResource extends String textStr; //plot Mean Wind Vector, yellow square, by default plot it - if(((configD != null ) && (configD.isMeanWind()))||(configD == null)){ + 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()); @@ -3314,13 +3646,13 @@ public class NsharpSkewTResource extends } } //plot 15/85 and/or 30/75 SMV, by default dont plot it - if((configD != null ) && (configD.isSmv1585() || configD.isSmv3075())){ + 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(configD.isSmv3075()){ + 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; @@ -3342,7 +3674,7 @@ public class NsharpSkewTResource extends } } //----- Plot 15/85 Storm Motion Vector ----- small green color circle - if(configD.isSmv1585()){ + if(graphConfigProperty.isSmv1585()){ float dir = (wdir.getValue() + 15.0f)%360; float spd = wspd.getValue() * 0.85f; //System.out.println(spd + " "+ wspd.getValue()); @@ -3366,7 +3698,7 @@ public class NsharpSkewTResource extends } } //plot Corfidi Vectors, color_stellblue small circles, by default Not plot it - if((configD != null ) && configD.isCorfidiV()){ + if((graphConfigProperty != null ) && graphConfigProperty.isCorfidiV()){ //Upwind-Propagating MCS motion vector FloatByReference upwdir= new FloatByReference(-999); FloatByReference upwspd= new FloatByReference(-999); @@ -3403,7 +3735,7 @@ public class NsharpSkewTResource extends VerticalAlignment.BOTTOM, null); } //plot Bunkers Vector,by default plot them - if(((configD != null ) && configD.isSmvBunkersR())||(configD == null)){ + 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); @@ -3420,7 +3752,7 @@ public class NsharpSkewTResource extends TextStyle.NORMAL, color, HorizontalAlignment.RIGHT, VerticalAlignment.TOP, null); } - if(((configD != null ) && configD.isSmvBunkersL())||(configD == 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); @@ -3482,8 +3814,7 @@ public class NsharpSkewTResource extends } - @SuppressWarnings("deprecation") - private void plotNsharpSRWindVectors(IGraphicsTarget target, double zoomLevel, + private void plotNsharpSRWindVectors(IGraphicsTarget target, double zoomLevel, WGraphics world, Rectangle rect) throws VizException { /* * Chin:: NOTE::: @@ -3567,8 +3898,7 @@ public class NsharpSkewTResource extends VerticalAlignment.MIDDLE, null); } - @SuppressWarnings("deprecation") - private void plotNsharpStormSlinky(IGraphicsTarget target, double zoomLevel, + private void plotNsharpStormSlinky(IGraphicsTarget target, double zoomLevel, WGraphics world, Rectangle rect) throws VizException { /* * Chin:: NOTE::: @@ -3815,7 +4145,7 @@ public class NsharpSkewTResource extends /* NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - Coordinate inC = WxMath.reverseSkewTXY(bkRsc.getSkewTBackground().getWorld().unMap(interactiveTempPointCoordinate)); + Coordinate inC = NsharpWxMath.reverseSkewTXY(bkRsc.getSkewTBackground().getWorld().unMap(interactiveTempPointCoordinate)); double inPressure = inC.y; if(inPressure <= 100) { @@ -3839,6 +4169,10 @@ public class NsharpSkewTResource extends 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); @@ -3846,6 +4180,7 @@ public class NsharpSkewTResource extends hodoLayer.setWindSpeed((float)c1.x); hodoLayer.setWindDirection((float)c1.y); createRscHodoWindShapeAll(); + //createTurbulenceShapes(bkRsc.getTurbBackground().getWorld()); } } catch(Exception e) { @@ -3855,7 +4190,7 @@ public class NsharpSkewTResource extends public void applyInteractiveTempPoint(){ NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - Coordinate inC = WxMath.reverseSkewTXY(bkRsc.getSkewTBackground().getWorld().unMap(interactiveTempPointCoordinate)); + 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); @@ -3887,6 +4222,19 @@ public class NsharpSkewTResource extends //bkRsc.setSmSpd(stwspd.getValue()); 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); + } } @@ -3983,44 +4331,114 @@ public class NsharpSkewTResource extends hodoWindMotionBoxShape.dispose(); } private void disposeRscWireFrameShapes(){ - if(heightMarkRscShape!=null) + if(heightMarkRscShape!=null){ heightMarkRscShape.dispose(); - if(omegaRscShape!=null) + heightMarkRscShape=null; + } + if(omegaRscShape!=null){ omegaRscShape.dispose(); - if(wetBulbTraceRscShape!=null) + omegaRscShape=null; + } + if(wetBulbTraceRscShape!=null){ wetBulbTraceRscShape.dispose(); - if(vtempTraceCurveRscShape!=null) + wetBulbTraceRscShape=null; + } + if(vtempTraceCurveRscShape!=null){ vtempTraceCurveRscShape.dispose(); - if(thetaEPressureYRscShape!=null) + vtempTraceCurveRscShape=null; + } + if(thetaEPressureYRscShape!=null){ thetaEPressureYRscShape.dispose(); - if(thetaEPressureRRscShape!=null) + thetaEPressureYRscShape=null; + } + if(thetaEPressureRRscShape!=null){ thetaEPressureRRscShape.dispose(); - if(thetaEPressureWRscShape!=null) + thetaEPressureRRscShape=null; + } + if(thetaEPressureWRscShape!=null){ thetaEPressureWRscShape.dispose(); - if(thetaEHeightYRscShape!=null) + thetaEPressureWRscShape=null; + } + if(thetaEHeightYRscShape!=null){ thetaEHeightYRscShape.dispose(); - if(thetaEHeightWRscShape!=null) + thetaEHeightYRscShape=null; + } + if(thetaEHeightWRscShape!=null){ thetaEHeightWRscShape.dispose(); - if(thetaEHeightRRscShape!=null) + thetaEHeightWRscShape=null; + } + if(thetaEHeightRRscShape!=null){ thetaEHeightRRscShape.dispose(); - if(srWindBRscShape!=null) + thetaEHeightRRscShape=null; + } + if(srWindBRscShape!=null){ srWindBRscShape.dispose(); - if(srWindWRscShape!=null) + srWindBRscShape=null; + } + if(srWindWRscShape!=null){ srWindWRscShape.dispose(); - if(srWindRRscShape!=null) + srWindWRscShape=null; + } + if(srWindRRscShape!=null){ srWindRRscShape.dispose(); - if(srWindGRscShape!=null) + srWindRRscShape=null; + } + if(srWindGRscShape!=null){ srWindGRscShape.dispose(); - if(srWindMRscShape!=null) + srWindGRscShape=null; + } + if(srWindMRscShape!=null){ srWindMRscShape.dispose(); - if(psblWatchTypeBkgShape!=null) + srWindMRscShape=null; + } + if(psblWatchTypeBkgShape!=null){ psblWatchTypeBkgShape.dispose(); - if(verticalWindSbShape!=null) + psblWatchTypeBkgShape=null; + } + if(verticalWindSbShape!=null){ verticalWindSbShape.dispose(); - if(verticalWindLabelShape!=null) + verticalWindSbShape=null; + } + if(verticalWindLabelShape!=null){ verticalWindLabelShape.dispose(); - if(verticalWindRShape!=null) + 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(); @@ -4029,21 +4447,21 @@ public class NsharpSkewTResource extends } if(hodoWindRscShapeList.size()>0){ - for(ShapeAndColor shapeColor: hodoWindRscShapeList){ + for(ShapeAndLineProperty shapeColor: hodoWindRscShapeList){ shapeColor.shape.dispose(); } hodoWindRscShapeList.clear(); } if(pressureTempRscShapeList.size()>0){ - for(ShapeAndColor shapeColor: pressureTempRscShapeList){ + for(ShapeAndLineProperty shapeColor: pressureTempRscShapeList){ shapeColor.shape.dispose(); } pressureTempRscShapeList.clear(); } if(windBoxWindRscShapeList.size()>0){ - for(ShapeAndColor shapeColor: windBoxWindRscShapeList){ + for(ShapeAndLineProperty shapeColor: windBoxWindRscShapeList){ shapeColor.shape.dispose(); } windBoxWindRscShapeList.clear(); @@ -4054,7 +4472,10 @@ public class NsharpSkewTResource extends if((soundingLys == null) || (soundingLys.size()==0)) return; float t1; - + if(vtempTraceCurveRscShape!=null){ + vtempTraceCurveRscShape.dispose(); + vtempTraceCurveRscShape=null; + } Coordinate c2 = null; Coordinate c1; @@ -4065,7 +4486,7 @@ public class NsharpSkewTResource extends if ((layer.getTemperature() != INVALID_DATA) && (layer.getDewpoint() != INVALID_DATA) && layer.getPressure()>= 100){ t1 = nsharpNative.nsharpLib.ivtmp(layer.getPressure()); - c1 = WxMath.getSkewTXY(layer.getPressure(), t1); + c1 = NsharpWxMath.getSkewTXY(layer.getPressure(), t1); c1.x = world.mapX(c1.x); c1.y = world.mapY(c1.y); if(c2!= null){ @@ -4079,6 +4500,72 @@ public class NsharpSkewTResource extends } 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 @@ -4114,9 +4601,9 @@ public class NsharpSkewTResource extends float advt; x1 = NsharpConstants.VERTICAL_WIND_X_ORIG+ (NsharpConstants.VERTICAL_WIND_WIDTH/2); for (float pressure=Surfpressure.getValue(); pressure>=200; pressure-=100) { - y1 = WxMath.getSkewTXY(pressure, 0).y; + y1 = NsharpWxMath.getSkewTXY(pressure, 0).y; y1=WGc.mapY(y1); - y2 = WxMath.getSkewTXY(pressure-100, 0).y; + 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); @@ -4157,30 +4644,30 @@ public class NsharpSkewTResource extends //float lastHeight = -999; double windY, windBoxY; float xRatio = ((float)NsharpConstants.WIND_BOX_WIDTH) / 140.00F; - ShapeAndColor shNcolor = new ShapeAndColor(); + ShapeAndLineProperty shNcolor = new ShapeAndLineProperty(); IWireframeShape shapeR = shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeR.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_red; + shNcolor.lp.setLineColor(NsharpConstants.color_red); windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); IWireframeShape shapeG= shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeG.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_green; + shNcolor.lp.setLineColor(NsharpConstants.color_green); windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); IWireframeShape shapeY= shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeY.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_yellow; + shNcolor.lp.setLineColor(NsharpConstants.color_yellow); windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); IWireframeShape shapeC= shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeC.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_cyan; + shNcolor.lp.setLineColor(NsharpConstants.color_cyan); windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); IWireframeShape shapeV = shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeV.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_violet; + shNcolor.lp.setLineColor(NsharpConstants.color_violet); windBoxWindRscShapeList.add(shNcolor); for (NcSoundingLayer layer : soundingLys) { float pressure = layer.getPressure(); @@ -4196,7 +4683,7 @@ public class NsharpSkewTResource extends //} // Get the vertical ordinate. - windY = WxMath.getSkewTXY(pressure, 0).y; + windY = NsharpWxMath.getSkewTXY(pressure, 0).y; //plot wind speed vs height in the wind box windBoxY = world.mapY(windY); @@ -4227,41 +4714,41 @@ public class NsharpSkewTResource extends Coordinate c0 = null; Coordinate c1; - ShapeAndColor shNcolor; + 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 ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); shapeR = shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeR.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_red; + shNcolor.lp.setLineColor(NsharpConstants.color_red); hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); shapeG= shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeG.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_green; + shNcolor.lp.setLineColor(NsharpConstants.color_green); hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); shapeY= shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeY.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_yellow; + shNcolor.lp.setLineColor(NsharpConstants.color_yellow); hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); shapeC= shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeC.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_cyan; + shNcolor.lp.setLineColor(NsharpConstants.color_cyan); hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); shapeV = shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeV.allocate(soundingLys.size()*2); - shNcolor.color = NsharpConstants.color_violet; + shNcolor.lp.setLineColor(NsharpConstants.color_violet); hodoWindRscShapeList.add(shNcolor); } else{ - shNcolor = new ShapeAndColor(); + shNcolor = new ShapeAndLineProperty(); shapeIn = shNcolor.shape = target.createWireframeShape(false,descriptor ); shapeIn.allocate(soundingLys.size()*2); - shNcolor.color = incolor; + shNcolor.lp.setLineColor(incolor); hodoWindRscShapeList.add(shNcolor); } @@ -4308,7 +4795,7 @@ public class NsharpSkewTResource extends } public void createRscPressTempCurveShapeAll(){ if(pressureTempRscShapeList.size()>0){ - for(ShapeAndColor shapeColor: pressureTempRscShapeList){ + for(ShapeAndLineProperty shapeColor: pressureTempRscShapeList){ shapeColor.shape.dispose(); } pressureTempRscShapeList.clear(); @@ -4316,36 +4803,38 @@ public class NsharpSkewTResource extends NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); WGraphics WGc= bkRsc.getSkewTBackground().getWorld(); if(!compareIsOn){ - createRscPressTempCurveShape(WGc, this.soundingLys, null); - if(overlayIsOn == true && this.previousSoundingLys!=null) - createRscPressTempCurveShape(WGc, this.previousSoundingLys, NsharpConstants.color_violet); + if(overlayIsOn == true ){ + createRscPressTempCurveShape(WGc, this.soundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1])); + if(this.previousSoundingLys!=null){ + createRscPressTempCurveShape(WGc, this.previousSoundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2])); + } + + } + else { + createRscPressTempCurveShape(WGc, this.soundingLys, null); + } } else{ - int colorIndex =1; + int colorIndex =NsharpConstants.LINE_COMP1;//=0; for(ElementStateProperty elm: dataTimelineList) { List soundingLayeys = dataTimelineSndLysListMap.get(elm.elementDescription); - RGB color=null; - if(elm.elementState == State.PICKED ){ - color = NsharpConstants.COLOR_ARRAY[0]; - } else if(elm.elementState == State.GROUPED){ - color = NsharpConstants.COLOR_ARRAY[colorIndex]; - //System.out.println("COLORINDEX "+colorIndex); - } + NsharpLineProperty lp = linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]); + //} colorIndex++; //always increase index, no matter ploting this elm or not - if(colorIndex > NsharpConstants.COLOR_ARRAY.length-1) - colorIndex =1; + if(colorIndex > NsharpConstants.LINE_COMP10)//COLOR_ARRAY.length-1) + colorIndex =NsharpConstants.LINE_COMP1;//1; if(elm.elementState != State.PICKED && elm.elementState != State.GROUPED) continue; - createRscPressTempCurveShape(WGc, soundingLayeys, color); + createRscPressTempCurveShape(WGc, soundingLayeys, lp); } } } - private void createRscHodoWindShapeAll(){ + public void createRscHodoWindShapeAll(){ if(hodoWindRscShapeList.size()>0){ - for(ShapeAndColor shapeColor: hodoWindRscShapeList){ + for(ShapeAndLineProperty shapeColor: hodoWindRscShapeList){ shapeColor.shape.dispose(); } hodoWindRscShapeList.clear(); @@ -4353,25 +4842,29 @@ public class NsharpSkewTResource extends NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); WGraphics WGc= bkRsc.getHodoBackground().getWorld(); if(!compareIsOn){ - createRscHodoWindShape(WGc, this.soundingLys, null); - if(overlayIsOn == true && this.previousSoundingLys!=null) - createRscHodoWindShape(WGc, this.previousSoundingLys, NsharpConstants.color_violet); + + if(overlayIsOn == true && this.previousSoundingLys!=null){ + createRscHodoWindShape(WGc, this.soundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1]).getLineColor()); + createRscHodoWindShape(WGc, this.previousSoundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor()); + } + else { + createRscHodoWindShape(WGc, this.soundingLys, null); + } } else{ - int colorIndex =1; + int colorIndex =NsharpConstants.LINE_COMP1;//1; for(ElementStateProperty elm: dataTimelineList) { List soundingLayeys = dataTimelineSndLysListMap.get(elm.elementDescription); RGB color=null; - if(elm.elementState == State.PICKED ){ - color = NsharpConstants.COLOR_ARRAY[0]; - } else if(elm.elementState == State.GROUPED){ - color = NsharpConstants.COLOR_ARRAY[colorIndex]; - //System.out.println("COLORINDEX "+colorIndex); - } - colorIndex++; //always increase index, no matter ploting this elm or not - if(colorIndex > NsharpConstants.COLOR_ARRAY.length-1) - colorIndex =1; + if(elm.elementState == State.PICKED || elm.elementState == 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 != State.PICKED && elm.elementState != State.GROUPED) continue; createRscHodoWindShape(WGc, soundingLayeys, color); @@ -4395,13 +4888,13 @@ public class NsharpSkewTResource extends sfcpres = lpvls.pres; float vtemp = nsharpNative.nsharpLib.virtemp (sfcpres, sfctemp, sfcdwpt); - Coordinate c1 = WxMath.getSkewTXY(sfcpres, vtemp); + 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 = WxMath.getSkewTXY(p2.getValue(), vtemp); + Coordinate c2 = NsharpWxMath.getSkewTXY(p2.getValue(), vtemp); c2.x = world.mapX(c2.x); c2.y = world.mapY(c2.y); @@ -4416,7 +4909,7 @@ public class NsharpSkewTResource extends { t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), i); vtemp = nsharpNative.nsharpLib.virtemp (i, t3, t3); - c2 = WxMath.getSkewTXY(i, vtemp); + c2 = NsharpWxMath.getSkewTXY(i, vtemp); c2.x = world.mapX(c2.x); c2.y = world.mapY(c2.y); @@ -4428,7 +4921,7 @@ public class NsharpSkewTResource extends t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), 100); vtemp = nsharpNative.nsharpLib.virtemp (100, t3, t3); - c2 = WxMath.getSkewTXY(100, vtemp); + c2 = NsharpWxMath.getSkewTXY(100, vtemp); c2.x = world.mapX(c2.x); c2.y = world.mapY(c2.y); @@ -4538,12 +5031,12 @@ public class NsharpSkewTResource extends //draw lowest layer's height in meter and feet, line - y0 = world.mapY(WxMath.getSkewTXY(1050, 0).y); + y0 = world.mapY(NsharpWxMath.getSkewTXY(1050, 0).y); // draw wind speed vs height box double xtemp; - for (int i = 20; i < 140 ; i= i+20){ + 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); @@ -4564,19 +5057,19 @@ public class NsharpSkewTResource extends //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-40, yTop},{xAxisOrigin-40, yBot}}; - omegaBkgShape.addLineSegment(lines); + // double [][] lines = {{xAxisOrigin, yTop},{xAxisOrigin, yBot}}; + //omegaBkgShape.addLineSegment(lines); //center line - double [][] lines1 = {{xAxisOrigin, yTop},{xAxisOrigin, yBot}}; + double [][] lines1 = {{xAxisOrigin+40, yTop},{xAxisOrigin+40, yBot}}; omegaBkgShape.addLineSegment(lines1); //right dash line, -10 omega line - double [][] lines2 = {{xAxisOrigin+40, yTop},{xAxisOrigin+40, yBot}}; - omegaBkgShape.addLineSegment(lines2); - double [] lblXy = {xAxisOrigin, yTop-40}; + //double [][] lines2 = {{xAxisOrigin+80, yTop},{xAxisOrigin+80, yBot}}; + // omegaBkgShape.addLineSegment(lines2); + double [] lblXy = {xAxisOrigin+40, yTop-40}; omegaBkgShape.addLabel("OMEGA", lblXy); - double [] lblXy1 = {xAxisOrigin-55, yTop-5}; + double [] lblXy1 = {xAxisOrigin, yTop-5}; omegaBkgShape.addLabel("+10", lblXy1); - double [] lblXy2 = {xAxisOrigin+40, yTop-5}; + double [] lblXy2 = {xAxisOrigin+80, yTop-5}; omegaBkgShape.addLabel("-10", lblXy2); omegaBkgShape.compile(); @@ -4943,7 +5436,6 @@ public class NsharpSkewTResource extends //plot theta E difference double [] lblXy2= {dispX+150,dispY+100}; FloatByReference tempF= new FloatByReference(0); - @SuppressWarnings("deprecation") float thetaEDiff= nsharpNative.nsharpLib.ThetaE_diff(tempF); if(nsharpNative.nsharpLib.qc(thetaEDiff) == 1){ String thetaDiffStr = String.format("TEI = %.0f", thetaEDiff); @@ -5054,21 +5546,315 @@ public class NsharpSkewTResource extends thetaEPressureWRscShape.compile(); thetaEPressureRRscShape.compile(); } - private void createRscPressTempCurveShape(WGraphics WGc, List soundingLays, RGB incolor){ + /****************************************************************************************************************** + * 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); - ShapeAndColor shNcolorT = new ShapeAndColor(), shNcolorD=new ShapeAndColor(); - double maxPressure = WxMath.reverseSkewTXY(new Coordinate(0, WGc + ShapeAndLineProperty shNcolorT = new ShapeAndLineProperty(), shNcolorD=new ShapeAndLineProperty(); + double maxPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, WGc .getWorldYmax())).y; - double minPressure = WxMath.reverseSkewTXY(new Coordinate(0, WGc + double minPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, WGc .getWorldYmin())).y; boolean drawTemp=true, drawDew=true; - NsharpGraphConfigDialog configD = NsharpGraphConfigDialog.getAccess(); - if(configD!=null){ - drawTemp = configD.isTemp(); - drawDew = configD.isDewp(); + //NsharpGraphConfigDialog configD = NsharpGraphConfigDialog.getAccess(); + if(graphConfigProperty!=null){ + drawTemp = graphConfigProperty.isTemp(); + drawDew = graphConfigProperty.isDewp(); } Coordinate c0 = null, c01=null; for (NcSoundingLayer layer : soundingLays) { @@ -5080,7 +5866,7 @@ public class NsharpSkewTResource extends if (t != INVALID_DATA && pressure >= minPressure && pressure <= maxPressure) { - Coordinate c1 = WxMath.getSkewTXY(pressure, t); + Coordinate c1 = NsharpWxMath.getSkewTXY(pressure, t); c1.x = WGc.mapX(c1.x); c1.y = WGc.mapY(c1.y); @@ -5093,7 +5879,7 @@ public class NsharpSkewTResource extends if (d > -999 && pressure >= minPressure && pressure <= maxPressure) { - Coordinate c11 = WxMath.getSkewTXY(pressure, d); + Coordinate c11 = NsharpWxMath.getSkewTXY(pressure, d); c11.x = WGc.mapX(c11.x); c11.y = WGc.mapY(c11.y); @@ -5110,15 +5896,15 @@ public class NsharpSkewTResource extends shNcolorT.shape = shapeT; shNcolorD.shape = shapeD; - if(incolor == null){ + if(!overlayIsOn && !compareIsOn){ //use default color - shNcolorT.color = NsharpConstants.color_red; - shNcolorD.color = NsharpConstants.color_green; + 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.color = incolor; - shNcolorD.color = incolor; + 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) @@ -5131,6 +5917,10 @@ public class NsharpSkewTResource extends 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; @@ -5143,7 +5933,7 @@ public class NsharpSkewTResource extends t1 = nsharpNative.nsharpLib.wetbulb(layer.getPressure(), layer.getTemperature(), layer.getDewpoint()); - c1 = WxMath.getSkewTXY(layer.getPressure(), t1); + c1 = NsharpWxMath.getSkewTXY(layer.getPressure(), t1); c1.x = WGc.mapX(c1.x); c1.y = WGc.mapY(c1.y); if(c2!= null){ @@ -5169,11 +5959,11 @@ public class NsharpSkewTResource extends 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 = WxMath.getSkewTXY(p, t); + 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, c1.y},{xAxisOrigin + omega* 4, c1.y}}; + double [][] lines = {{xAxisOrigin+40, c1.y},{xAxisOrigin+40 + (omega* 4), c1.y}}; omegaRscShape.addLineSegment(lines); } } @@ -5187,8 +5977,8 @@ public class NsharpSkewTResource extends 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(WxMath.getSkewTXY(pressure, -50).y); - + 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}; @@ -5197,7 +5987,7 @@ public class NsharpSkewTResource extends // plot surface level mark{ if(soundingLys.get(0).getGeoHeight() != NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA) { - double y = WGc.mapY(WxMath.getSkewTXY(soundingLys.get(0).getPressure(), -50).y); + 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}; @@ -5236,6 +6026,7 @@ public class NsharpSkewTResource extends for (ParcelData parData: parcelList){ createRscParcelTraceShape( WGc, parData.parcelType,parData.parcelLayerPressure); } + createCloudsShape(WGc); createRscHodoWindShapeAll(); @@ -5259,6 +6050,17 @@ public class NsharpSkewTResource extends 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; + } + + } 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 b7557b4588..ed57357152 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 @@ -27,13 +27,16 @@ Require-Bundle: org.eclipse.ui, com.raytheon.viz.core.gl;bundle-version="1.12.1174" Bundle-ActivationPolicy: lazy Export-Package: gov.noaa.nws.ncep.ui.pgen, + gov.noaa.nws.ncep.ui.pgen.attrDialog, gov.noaa.nws.ncep.ui.pgen.contours, + gov.noaa.nws.ncep.ui.pgen.controls, gov.noaa.nws.ncep.ui.pgen.display, gov.noaa.nws.ncep.ui.pgen.elements, gov.noaa.nws.ncep.ui.pgen.elements.labeledLines, gov.noaa.nws.ncep.ui.pgen.elements.tcm, gov.noaa.nws.ncep.ui.pgen.file, gov.noaa.nws.ncep.ui.pgen.gfa, + gov.noaa.nws.ncep.ui.pgen.maps, gov.noaa.nws.ncep.ui.pgen.rsc, gov.noaa.nws.ncep.ui.pgen.sigmet, gov.noaa.nws.ncep.ui.pgen.tca, diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/gov.noaa.nws.ncep.ui.pgen.ecl b/ncep/gov.noaa.nws.ncep.ui.pgen/gov.noaa.nws.ncep.ui.pgen.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/TCAinfo.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/TCAinfo.xml index 3a453f6774..eaf49b8d75 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/TCAinfo.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/TCAinfo.xml @@ -27,6 +27,7 @@ CDT PST PDT + HST Tropical Storm diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/filterHour.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/filterHour.xml index 0b795c8ee8..85d753c698 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/filterHour.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/filterHour.xml @@ -5,14 +5,14 @@ --> - diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/forecasters.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/forecasters.xml new file mode 100644 index 0000000000..3d7d556396 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/forecasters.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/gfa.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/gfa.xml index abd4ef7a3e..3ec3f064a5 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/gfa.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/gfa.xml @@ -61,8 +61,9 @@ - - + + @@ -74,15 +75,15 @@ - + - + - + - + 30KT - 20KT + @@ -179,13 +180,13 @@ 4 types: snapshot, smear, outlook, and other. Hazard + type define the color. All the attributes are required . example: "3 Z" will be displayed as "3 17Z" in the "Fcst Hr" dropdown box if cycle is set to 14. --> - + - + + 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 c98a99ebdc..da51d4df4a 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 @@ -37,7 +37,7 @@
    File PurposePart of Standard  + Part of Standard
    Release
    File Location  + File Location
    (relative to installation directory)
    yes
    etc/BASE/serverConfig.py/awips2/edex/data/utility/edex_static/base/config/gfe
    Customized serverConfig.py
    no
    etc/SITE/serverConfig.py/awips2/edex/data/utility/edex_static/site/SITE_ID/config/gfe
    localConfig.py
    no
    etc/SITE/localConfig.py/awips2/edex/data/utility/edex_static/site/SITE_ID/config/gfe
    localWxConfig.py
    no
    /etc/SITE/localWxConfig.py
    Original Maps.py -
    yes
    -
    /etcBASE/Maps.py
    Customized Maps.py -
    no
    -
    etc/SITE/Maps.py
    localMaps.py -
    no
    -
    etc/SITE/localMaps.py
    Original MapFiles.py -
    yes
    -
    etc/BASE/MapFiles.py
    Customized localMapFiles.py -
    no
    -
    etc/SITE/localMapFiles.py/awips2/edex/data/utility/edex_static/site/SITE_ID/config/gfe
    Original yes
    etc/BASE/VTECPartners.py
    +
    /awips2/edex/data/utility/common_static/base/vtec
    no
    etc/SITE/localVTECPartners.py
    +
    /awips2/edex/data/utility/common_static/site/SITE_ID/vtec
    mapdata.canada
    - name + name_en Canada diff --git a/ncep/gov.noaa.nws.ncep.viz.overlays/src/gov/noaa/nws/ncep/viz/overlays/resources/OverlayResourceGroup.java b/ncep/gov.noaa.nws.ncep.viz.overlays/src/gov/noaa/nws/ncep/viz/overlays/resources/OverlayResourceGroup.java index bdc09eaf8f..5fb6eba34f 100644 --- a/ncep/gov.noaa.nws.ncep.viz.overlays/src/gov/noaa/nws/ncep/viz/overlays/resources/OverlayResourceGroup.java +++ b/ncep/gov.noaa.nws.ncep.viz.overlays/src/gov/noaa/nws/ncep/viz/overlays/resources/OverlayResourceGroup.java @@ -1,182 +1,182 @@ -/** - * - */ -package gov.noaa.nws.ncep.viz.overlays.resources; - -import gov.noaa.nws.ncep.viz.resources.INatlCntrsResource; - -import org.opengis.referencing.crs.CoordinateReferenceSystem; - -import com.raytheon.uf.viz.core.IGraphicsTarget; -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.map.MapDescriptor; -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.capabilities.ColorableCapability; -import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; -import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; - -/** - * - * Provides a capability to support homogenous (same color, style, etc.) maps as - * a single resource - * - *
    - * 
    - * SOFTWARE HISTORY
    +/**
      * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * 03/08/09                ghull       Created from MapResourceGroup
    - * 11/19/09                ghull       Incorporate to11d6 changes
    - * 
    - * 
    - * - * @author chammack - * @version 1.0 - */ -public class OverlayResourceGroup extends - AbstractVizResource - implements INatlCntrsResource { - - protected IGraphicsTarget lastTarget; - - protected OverlayResourceGroup(OverlayResourceGroupData data, - LoadProperties loadProperties) { - super(data, loadProperties); - - this.resourceData.getResourceList().addPreAddListener( - new ResourceList.AddListener() { - - @SuppressWarnings("unchecked") - @Override - public void notifyAdd(ResourcePair rp) throws VizException { - addListener((AbstractVizResource) rp - .getResource()); - } - - }); - - } - - protected void addListener(AbstractVizResource rsc) - throws VizException { - - if (descriptor != null) { - rsc.setDescriptor(descriptor); - } - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.rsc.capabilities.IProjectableResource#project(org - * .opengis.referencing.crs.CoordinateReferenceSystem) - */ - @Override - public void project(CoordinateReferenceSystem mapData) throws VizException { - for (ResourcePair rp : this.resourceData.getResourceList()) { - AbstractVizResource rsc = rp.getResource(); - rsc.project(mapData); - } - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.rsc.IVizResource#dispose() - */ - @Override - public void disposeInternal() { - lastTarget = null; - for (ResourcePair rp : this.resourceData.getResourceList()) { - rp.getResource().dispose(); - } - } - - /* - * (non-Javadoc) - * - * @seecom.raytheon.viz.core.rsc.IVizResource#init(com.raytheon.viz.core. - * IGraphicsTarget) - */ - @Override - public void initInternal(IGraphicsTarget target) throws VizException { - } - - /* - * (non-Javadoc) - * - * @seecom.raytheon.viz.core.rsc.IVizResource#paint(com.raytheon.viz.core. - * IGraphicsTarget, com.raytheon.viz.core.PixelExtent, double, float) - */ - @Override - public void paintInternal(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - - int displayWidth = (int) (descriptor.getMapWidth() * paintProps - .getZoomLevel()); - - for (ResourcePair rp : this.resourceData.getResourceList()) { - AbstractVizResource resource = rp.getResource(); - ResourceProperties properties = rp.getProperties(); - - if (properties.isDisplayable(displayWidth)) { - PaintProperties newProps = new PaintProperties(paintProps); - - // keep these in sync -/* - resource.getCapabilities().addCapability( - getCapability(ColorableCapability.class)); - resource.getCapabilities().addCapability( - getCapability(OutlineCapability.class)); - - if (resource.hasCapability(ImagingCapability.class)) { - paintProps.setAlpha(resource.getCapability( - ImagingCapability.class).getAlpha()); - } -*/ - resource.paint(target, newProps); - } - } - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.rsc.AbstractVizResource#setDescriptor(com.raytheon - * .uf.viz.core.drawables.IDescriptor) - */ - @SuppressWarnings("unchecked") - @Override - public void setDescriptor(MapDescriptor descriptor) { - - super.setDescriptor(descriptor); - for (ResourcePair rp : this.resourceData.getResourceList()) { - AbstractVizResource r = (AbstractVizResource) rp - .getResource(); - if (r != null) { - r.setDescriptor(descriptor); - } - } - } - - @Override - public void resourceAttrsModified() { - for (ResourcePair rp : this.resourceData.getResourceList()) { - INatlCntrsResource ncRsc = (INatlCntrsResource) rp.getResource(); - ncRsc.resourceAttrsModified(); - } - } - - @Override - public String toString() { - return this.resourceData.getResourceList().toString(); - } -} + */ +package gov.noaa.nws.ncep.viz.overlays.resources; + +import gov.noaa.nws.ncep.viz.resources.INatlCntrsResource; + +import org.opengis.referencing.crs.CoordinateReferenceSystem; + +import com.raytheon.uf.viz.core.IGraphicsTarget; +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.map.MapDescriptor; +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.capabilities.ColorableCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; + +/** + * + * Provides a capability to support homogenous (same color, style, etc.) maps as + * a single resource + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 03/08/09                ghull       Created from MapResourceGroup
    + * 11/19/09                ghull       Incorporate to11d6 changes
    + * 
    + * 
    + * + * @author chammack + * @version 1.0 + */ +public class OverlayResourceGroup extends + AbstractVizResource + implements INatlCntrsResource { + + protected IGraphicsTarget lastTarget; + + protected OverlayResourceGroup(OverlayResourceGroupData data, + LoadProperties loadProperties) { + super(data, loadProperties); + + this.resourceData.getResourceList().addPreAddListener( + new ResourceList.AddListener() { + + @SuppressWarnings("unchecked") + @Override + public void notifyAdd(ResourcePair rp) throws VizException { + addListener((AbstractVizResource) rp + .getResource()); + } + + }); + + } + + protected void addListener(AbstractVizResource rsc) + throws VizException { + + if (descriptor != null) { + rsc.setDescriptor(descriptor); + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.rsc.capabilities.IProjectableResource#project(org + * .opengis.referencing.crs.CoordinateReferenceSystem) + */ + @Override + public void project(CoordinateReferenceSystem mapData) throws VizException { + for (ResourcePair rp : this.resourceData.getResourceList()) { + AbstractVizResource rsc = rp.getResource(); + rsc.project(mapData); + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.rsc.IVizResource#dispose() + */ + @Override + public void disposeInternal() { + lastTarget = null; + for (ResourcePair rp : this.resourceData.getResourceList()) { + rp.getResource().dispose(); + } + } + + /* + * (non-Javadoc) + * + * @seecom.raytheon.viz.core.rsc.IVizResource#init(com.raytheon.viz.core. + * IGraphicsTarget) + */ + @Override + public void initInternal(IGraphicsTarget target) throws VizException { + } + + /* + * (non-Javadoc) + * + * @seecom.raytheon.viz.core.rsc.IVizResource#paint(com.raytheon.viz.core. + * IGraphicsTarget, com.raytheon.viz.core.PixelExtent, double, float) + */ + @Override + public void paintInternal(IGraphicsTarget target, PaintProperties paintProps) + throws VizException { + + int displayWidth = (int) (descriptor.getMapWidth() * paintProps + .getZoomLevel()); + + for (ResourcePair rp : this.resourceData.getResourceList()) { + AbstractVizResource resource = rp.getResource(); + ResourceProperties properties = rp.getProperties(); + + if (properties.isDisplayable(displayWidth)) { + PaintProperties newProps = new PaintProperties(paintProps); + + // keep these in sync +/* + resource.getCapabilities().addCapability( + getCapability(ColorableCapability.class)); + resource.getCapabilities().addCapability( + getCapability(OutlineCapability.class)); + + if (resource.hasCapability(ImagingCapability.class)) { + paintProps.setAlpha(resource.getCapability( + ImagingCapability.class).getAlpha()); + } +*/ + resource.paint(target, newProps); + } + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.rsc.AbstractVizResource#setDescriptor(com.raytheon + * .uf.viz.core.drawables.IDescriptor) + */ + @SuppressWarnings("unchecked") + @Override + public void setDescriptor(MapDescriptor descriptor) { + + super.setDescriptor(descriptor); + for (ResourcePair rp : this.resourceData.getResourceList()) { + AbstractVizResource r = (AbstractVizResource) rp + .getResource(); + if (r != null) { + r.setDescriptor(descriptor); + } + } + } + + @Override + public void resourceAttrsModified() { + for (ResourcePair rp : this.resourceData.getResourceList()) { + INatlCntrsResource ncRsc = (INatlCntrsResource) rp.getResource(); + ncRsc.resourceAttrsModified(); + } + } + + @Override + public String toString() { + return this.resourceData.getResourceList().toString(); + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.resourceManager/gov.noaa.nws.ncep.viz.resourceManager.ecl b/ncep/gov.noaa.nws.ncep.viz.resourceManager/gov.noaa.nws.ncep.viz.resourceManager.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/ResourceManagerDialog.java b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/ResourceManagerDialog.java index a59451fc1e..31838e22f2 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/ResourceManagerDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/ResourceManagerDialog.java @@ -110,8 +110,8 @@ public class ResourceManagerDialog extends Dialog { if( currEditor != null ) { RbdBundle rbdBndl = new RbdBundle(); - rbdBndl.setNcEditor( currEditor ); - rbdBndl.initFromEditor(); +// rbdBndl.setNcEditor( currEditor ); + rbdBndl.initFromEditor(currEditor); rbd_mngr.initFromRbdBundle( rbdBndl ); } 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 17059f5672..ced2048126 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 @@ -97,7 +97,8 @@ import com.raytheon.viz.ui.UiPlugin; * 08/20/11 #450 Greg Hull Use new SpfsManager * 10/22/11 #467 Greg Hull Add Modify button * 11/03/11 #??? B. Hebbard Add "Save Source Timestamp As:" Constant / Latest - * + * 02/15/2012 627 Archana Updated the call to addRbd() to accept + * a NCMapEditor object as one of the arguments * * * @author ghull @@ -235,7 +236,8 @@ public class CreateRbdControl extends Composite { } else if( newDomRsc.isAutoUpdateable() ){ auto_update_btn.setEnabled( true ); - auto_update_btn.setSelection( rbdMngr.isAutoUpdate() ); + //auto_update_btn.setSelection( rbdMngr.isAutoUpdate() ); + auto_update_btn.setSelection( true ); } else { auto_update_btn.setSelection(false); @@ -1581,7 +1583,7 @@ public class CreateRbdControl extends Composite { rbdMngr.setGeoSyncPanes( geo_sync_panes.getSelection() ); rbdMngr.setAutoUpdate( auto_update_btn.getSelection() ); - +// rbdMngr.setAutoUpdate( auto_update_btn.getEnabled() ); RbdBundle rbdBndl = rbdMngr.createRbdBundle( rbdName, timelineControl.getTimeMatcher() ); @@ -1667,9 +1669,9 @@ public class CreateRbdControl extends Composite { // vizWorkbenchManager.addListener(editor); editor.setApplicationName(rbdName); - rbdBndl.setNcEditor( editor ); +// rbdBndl.setNcEditor( editor ); - rbdLoader.addRBD( rbdBndl ); + rbdLoader.addRBD( rbdBndl, editor ); VizApp.runSync( rbdLoader ); @@ -1783,9 +1785,9 @@ public class CreateRbdControl extends Composite { } - rbdBndl.setNcEditor( editor ); +// rbdBndl.setNcEditor( editor ); - rbdLoader.addRBD( rbdBndl ); + rbdLoader.addRBD( rbdBndl, editor ); VizApp.runSync( rbdLoader ); } @@ -1822,8 +1824,8 @@ public class CreateRbdControl extends Composite { return; } impRbd = new RbdBundle(); - impRbd.setNcEditor( seldEditor ); - impRbd.initFromEditor(); +// impRbd.setNcEditor( seldEditor ); + impRbd.initFromEditor(seldEditor); } //boolean confirm = ( rbdMngr.getSelectedRscs().length > 1 ) || rbdMngr.isMultiPane(); diff --git a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/loadRbd/LoadRbdControl.java b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/loadRbd/LoadRbdControl.java index 9a5f3a4dd2..22d6816303 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/loadRbd/LoadRbdControl.java +++ b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/loadRbd/LoadRbdControl.java @@ -88,7 +88,9 @@ import com.raytheon.uf.viz.core.rsc.ResourceList; * 06/07/11 #445 Xilin Guo Data Manager Performance Improvements * 07/11/11 Greg Hull Back out changes for #416. * 08/04/11 #450 Greg Hull SpfsManager - * + * 02/15/2012 #627 Archana Updated the call to addRbd() to accept + * a NCMapEditor object as one of the arguments + * Removed the call to setNcEditor() * * * @author ghull @@ -531,9 +533,9 @@ public class LoadRbdControl extends Composite { StructuredSelection sel_rbds = (StructuredSelection)rbd_lviewer.getSelection(); RbdBundle rbdSel = (RbdBundle)sel_rbds.getFirstElement(); - if( rbdSel != null ) {// sanity check - rbdSel.setGeoSyncedPanes( geo_sync_panes.getSelection() ); - } +// if( rbdSel != null ) {// sanity check +// rbdSel.setGeoSyncedPanes( geo_sync_panes.getSelection() ); +// } // TODO ; if enabling then loop thru the panes and check if // any of the panes have a different Area and if so prompt the @@ -838,7 +840,7 @@ public class LoadRbdControl extends Composite { // newEditor.selectPane( newEditor.getDisplayPanes()[0], true ); } - rbdBndl.setNcEditor( newEditor ); +// rbdBndl.setNcEditor( newEditor ); // in the case where all rbds are selected initially and the user loads without // selecting the timeline, we need to load the default timeline based on the dflt @@ -846,7 +848,7 @@ public class LoadRbdControl extends Composite { // rbdBndl.getTimeMatcher().loadTimes(); - rbdLoader.addRBD( rbdBndl ); + rbdLoader.addRBD( rbdBndl, newEditor ); } catch (VizException e) { MessageBox mb = new MessageBox( NmapUiUtils.getCaveShell(), SWT.OK); diff --git a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/spf/ManageMultiSPFControl.java b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/spf/ManageMultiSPFControl.java index c2939c19ce..3be621069d 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/spf/ManageMultiSPFControl.java +++ b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/spf/ManageMultiSPFControl.java @@ -62,7 +62,8 @@ import com.raytheon.viz.ui.UiPlugin; * 04/29/11 #416 M. Gao Created * 07/11/11 Greg Hull Get Displays instead of storing RscBundleDisplayMngr * 08/04/11 #450 Greg Hull SpfsManager - * + * 02/15/2012 627 Archana Removed the call to setNcEditor() and updated initFromEditor(0 + * to take an editor as one of the arguments * * * @author @@ -347,9 +348,9 @@ public class ManageMultiSPFControl extends Composite { for( NCMapEditor display : displayList) { RbdBundle rbd = new RbdBundle(); - rbd.setNcEditor( display ); + // rbd.setNcEditor( display ); - rbd.initFromEditor(); + rbd.initFromEditor( display ); savedRbdName = rbd.getRbdName(); diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/gov.noaa.nws.ncep.viz.resources.ecl b/ncep/gov.noaa.nws.ncep.viz.resources/gov.noaa.nws.ncep.viz.resources.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/AbstractNatlCntrsResource.java b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/AbstractNatlCntrsResource.java index 6d97f3daa9..cb13f2abda 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/AbstractNatlCntrsResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/AbstractNatlCntrsResource.java @@ -24,6 +24,9 @@ import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.catalog.ScriptCreator; import com.raytheon.uf.viz.core.comm.Connector; import com.raytheon.uf.viz.core.drawables.AbstractDescriptor; +import com.raytheon.uf.viz.core.drawables.IDescriptor.FrameChangeMode; +import com.raytheon.uf.viz.core.drawables.IDescriptor.FrameChangeOperation; +import com.raytheon.uf.viz.core.drawables.IFrameCoordinator; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; @@ -44,6 +47,10 @@ import com.raytheon.uf.viz.core.rsc.ResourceType; * 30 Apr 2010 #276 Greg Hull Abstract the dataObject instead of assuming PluginDataObject. * 05 Dec 2011 Shova Gurung Added progDiscDone to check if progressive disclosure is run * for frames that are already populated + * 16 Feb 2012 #555 Shova Gurung Remove progDiscDone. Add call to setAllFramesAsPopulated() in queryRecords(). + * Remove frameData.setPopulated(true) from processNewRscDataList(). + * 20 Mar 2012 #700 B. Hebbard In processNewRscDataList(), when new frame(s) are created by auto update, + * set frame to LAST and issueRefresh() to force paint (per legacy; TTR 520). * * * @@ -96,12 +103,8 @@ public abstract class AbstractNatlCntrsResource(); currFrameTime = null; - // if requestable add a resourceChanged listener that is called by raytheon's + // if requestable add a resourceChanged listener that is called by Raytheon's // AbstractRequestableResource when update() is called. if( resourceData instanceof AbstractNatlCntrsRequestableResourceData ) { resourceData.addChangeListener(new IResourceDataChanged() { @@ -476,10 +472,10 @@ public abstract class AbstractNatlCntrsResource frameDataMap.firstKey()) @@ -597,6 +592,12 @@ public abstract class AbstractNatlCntrsResource * diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/attributes/AbstractEditResourceAttrsInteractiveDialog.java b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/attributes/AbstractEditResourceAttrsInteractiveDialog.java new file mode 100644 index 0000000000..eb3f8166b6 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/attributes/AbstractEditResourceAttrsInteractiveDialog.java @@ -0,0 +1,175 @@ +package gov.noaa.nws.ncep.viz.resources.attributes; + +import gov.noaa.nws.ncep.viz.resources.INatlCntrsResourceData; +import gov.noaa.nws.ncep.viz.ui.display.NmapUiUtils; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; + +/** + * An interface to edit resource attributes interactively. + * + * + *
    + * SOFTWARE HISTORY
    + * Date         Ticket#     Engineer    Description
    + * ------------ ----------  ----------- --------------------------
    + * 03/29/2012  #651        S. Gurung    Initial Creation.
    + * 
    + * 
    + * + * @author sgurung + * @version 1 + */ + +public class AbstractEditResourceAttrsInteractiveDialog extends AbstractEditResourceAttrsDialog { + + protected boolean isRscAttrSetChanged = false; + + public boolean isRscAttrSetChanged() { + return isRscAttrSetChanged; + } + + public void setRscAttrSetChanged(boolean isRscAttrSetChanged) { + this.isRscAttrSetChanged = isRscAttrSetChanged; + } + + public AbstractEditResourceAttrsInteractiveDialog(Shell parentShell, + INatlCntrsResourceData r, Boolean apply) { + super(parentShell, r, apply); + // TODO Auto-generated constructor stub + } + + @Override + public Composite createDialog(Composite topComp) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void initWidgets() { + // TODO Auto-generated method stub + + } + + @Override + public void createShell( ) { + int style = SWT.DIALOG_TRIM | SWT.RESIZE ; + if( !hasApplyBtn ) { + style |= SWT.APPLICATION_MODAL; + } + + shell = new Shell( getParent(), style ); + shell.setText( dlgTitle ); + //shell.setSize( 600, 800 ); // pack later + + GridLayout mainLayout = new GridLayout(1, true); + mainLayout.marginHeight = 1; + mainLayout.marginWidth = 1; + shell.setLayout(mainLayout); + + Composite topComp = new Composite( shell, SWT.NONE ); + topComp.setLayout( new GridLayout() ); + GridData gd = new GridData(); + gd.grabExcessHorizontalSpace = true; + gd.grabExcessVerticalSpace = true; + gd.horizontalAlignment = SWT.FILL; + gd.verticalAlignment = SWT.FILL; + topComp.setLayoutData( gd ); + + Composite editComp = createDialog( topComp ); + Label sep = new Label( shell, SWT.SEPARATOR | SWT.HORIZONTAL ); + gd = new GridData(); + gd.grabExcessHorizontalSpace = true; + gd.horizontalAlignment = SWT.FILL; + sep.setLayoutData( gd ); + + + Composite okCanComp = new Composite( shell, SWT.NONE ); + gd = new GridData(); + gd.grabExcessHorizontalSpace = true; + gd.horizontalAlignment = SWT.CENTER; + okCanComp.setLayoutData( gd ); + + okCanComp.setLayout( new GridLayout( (hasApplyBtn ? 3 : 2), true) ); + + Button canBtn = new Button( okCanComp, SWT.PUSH ); + canBtn.setText(" Cancel "); + + canBtn.addSelectionListener( new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + rscData.setRscAttrSet( new ResourceAttrSet(editedRscAttrSet)); + ok=false; + shell.dispose(); + } + }); + + /*if( hasApplyBtn ) { + Button applyBtn = new Button( okCanComp, SWT.PUSH ); + applyBtn.setText(" Apply "); + + applyBtn.addSelectionListener( new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + setRscAttrSetChanged(true); + + rscData.setRscAttrSet( new ResourceAttrSet( rscData.getRscAttrSet() )); + rscData.setIsEdited( true ); + NmapUiUtils.getActiveNatlCntrsEditor().refresh(); + } + }); + }*/ + + Button okBtn = new Button( okCanComp, SWT.PUSH ); + okBtn.setText(" OK "); + + okBtn.addSelectionListener( new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + + ok=true; + // get the + shell.dispose(); + } + }); + } + + @Override + public Object open() { + Display display = getParent().getDisplay(); + + // copy the attrSet + editedRscAttrSet = new ResourceAttrSet( rscData.getRscAttrSet() ); + + createShell(); + + initWidgets(); + + shell.pack(); + shell.open(); + + while( !shell.isDisposed() ) { + if( !display.readAndDispatch() ) { + display.sleep(); + } + } + // Uses Java Bean utils to set the attributes on the resource + if( ok ) { + editedRscAttrSet = new ResourceAttrSet( rscData.getRscAttrSet() ); + rscData.setRscAttrSet( editedRscAttrSet ); + rscData.setIsEdited( true ); + } + + dispose(); + + return null; + } + + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/attributes/EditResourceAttrsAction.java b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/attributes/EditResourceAttrsAction.java index f300c47f58..a07045bff1 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/attributes/EditResourceAttrsAction.java +++ b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/attributes/EditResourceAttrsAction.java @@ -17,6 +17,7 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Shell; import com.raytheon.uf.viz.core.VizApp; +import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; /** @@ -139,4 +140,9 @@ public class EditResourceAttrsAction extends AbstractRightClickAction { public String getText() { return "Edit " + ((INatlCntrsResourceData)selectedRsc.getResourceData()).getResourceName().toString() + " Attributes"; } + + @Override + public void setSelectedRsc(ResourcePair selectedRsc) { + super.setSelectedRsc(selectedRsc); + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/colorBar/ColorBarFromColorMapAttrsEditorComposite.java b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/colorBar/ColorBarFromColorMapAttrsEditorComposite.java new file mode 100644 index 0000000000..48ace21bdc --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/colorBar/ColorBarFromColorMapAttrsEditorComposite.java @@ -0,0 +1,1280 @@ +/* + * This code has been developed by NCEP-SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.viz.resources.colorBar; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; + +import javax.measure.converter.ConversionException; +import javax.measure.converter.UnitConverter; + +import gov.noaa.nws.ncep.viz.common.ColorMapUtil; +import gov.noaa.nws.ncep.viz.common.ui.color.ColorButtonSelector; +import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsResource; +import gov.noaa.nws.ncep.viz.resources.INatlCntrsResourceData; +import gov.noaa.nws.ncep.viz.resources.attributes.ResourceAttrSet; +import gov.noaa.nws.ncep.viz.resources.attributes.ResourceAttrSet.RscAttrValue; +import gov.noaa.nws.ncep.viz.ui.display.ColorBarFromColormap; +import gov.noaa.nws.ncep.viz.ui.display.IColorBar; +import gov.noaa.nws.ncep.viz.ui.display.IColorBar.ColorBarAnchorLocation; +import gov.noaa.nws.ncep.viz.ui.display.IColorBar.ColorBarOrientation; +import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; +import gov.noaa.nws.ncep.viz.ui.display.NmapUiUtils; + +import org.eclipse.core.commands.Command; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Device; +import org.eclipse.swt.graphics.Point; +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.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Scale; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Spinner; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.commands.ICommandService; +import org.eclipse.ui.handlers.IHandlerService; + +import org.eclipse.swt.graphics.Color; +import com.raytheon.uf.common.colormap.ColorMap; +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.drawables.ColorMapParameters; +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.ResourceList; +import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; +import com.raytheon.viz.core.imagery.ImageCombiner; +import com.raytheon.viz.core.imagery.ImageCombiner.IImageCombinerListener; +import com.raytheon.viz.ui.dialogs.colordialog.ColorUtil; + +/** + * + * Creates the widgets that constitute the dialogs for editing the color bar + * from a color map + * + *
    + * SOFTWARE HISTORY
    + * Date         Ticket#     Engineer    Description
    + * ------------ ----------  ----------- --------------------------
    + * 2/29/2012     651        Archana       Initial Creation
    + * 04/02/2012               S. Gurung     Increased height for colorBarLocOptionsGroup
    + * 04/06/2012    651        Archana       Added a call to refreshColorBar(), when the showLabelBtn
    + *                                        is toggled    
    + * 
    + * + * @author archana + * @version 1 + */ + +public class ColorBarFromColorMapAttrsEditorComposite extends Composite { + + private ColorBarAnchorLocation[] availAnchorLocs = new ColorBarAnchorLocation[] { + ColorBarAnchorLocation.UpperLeft, + ColorBarAnchorLocation.UpperRight, + ColorBarAnchorLocation.LowerLeft, ColorBarAnchorLocation.LowerRight }; + + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(ColorBarFromColorMapAttrsEditorComposite.class); + private String[] arrayOfSliderTextStrings = null; + private Float cmapMin = null; + private Float cmapMax = null; + private Float cmapWidth = null; + private Float cmapIncrement = null; + private Float currentMax = null; + private Float currentMin = null; + private ColorMapCapability cMapCapability; + private DecimalFormat format = null; + private ArrayList> imageResources; + private ArrayList> cmapResources; + private String selectedColorMapName = null; + private ColorMap theSelectedColorMap = null; + private ColorMapParameters cMapParam; + final Combo orientationCombo = null; + final Combo anchorCombo = null; + final Combo unitsCombo = null; + private IColorBar editedColorBar = null; + private String colorMapCategory = null; + private String colorMapName; + + private Scale minSlider = null; + private Scale maxSlider = null; + private Text minValueText = null; + private Text maxValueText = null; + private Scale brightnessScale = null; + private Label brightnessText = null; + private Scale contrastScale = null; + private Label contrastText = null; + private Scale alphaScale = null; + private Label alphaLabel = null; + private Label alphaText = null; + private Button interpolationChk = null; + private Button combineNextImage = null; + private NCMapEditor currEditor = null; + private INatlCntrsResourceData theResourceData; + private ResourceAttrSet resAttrSet = null; + private Button showColorBarEditOptionsBtn = null; + private int defaultDialogHeight = 205; + private int shellWidth = 764; + private Shell shell = null; + private FormData fd = null; + private IImageCombinerListener combineNextImageListener = new IImageCombinerListener() { + @Override + public void preferenceChanged(boolean newPref) { + combineNextImage.setSelection(newPref); + } + }; + + protected Color labelColor; + + protected Device colorDevice; + + public ColorBarFromColorMapAttrsEditorComposite(Composite parent, + int style, INatlCntrsResourceData resourceData) { + + super(parent, style); + theResourceData = resourceData; + colorDevice = parent.getDisplay(); + initialization(); + + Composite topForm = this; + FormData fd = new FormData(shellWidth, defaultDialogHeight); + 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()); + + topForm.setLayout( new GridLayout(1, true) ); + shell = parent.getShell(); + final Composite colorMapComp = new Composite(topForm, SWT.NONE); + createColorMapComboAndEditButton(colorMapComp); + + fd = new FormData(163, 30); + fd.left = new FormAttachment(colorMapComp, 525, SWT.RIGHT); + fd.top = new FormAttachment(colorMapComp, 15, SWT.BOTTOM); + showColorBarEditOptionsBtn = new Button(colorMapComp, SWT.PUSH); + showColorBarEditOptionsBtn.setLayoutData(fd); + showColorBarEditOptionsBtn.setText("Edit Color Bar Options ..."); + + Group imagingGrp = new Group(colorMapComp, SWT.NONE); + imagingGrp.setText("Image Properties"); + fd = new FormData(350, 120); + fd.left = new FormAttachment(colorMapComp, 10, SWT.RIGHT); + fd.top = new FormAttachment(colorMapComp, 60, SWT.BOTTOM); + + imagingGrp.setLayout(new FormLayout()); + imagingGrp.setLayoutData(fd); + + // Create the slider controls for Alpha, Brightness and Contrast + initializeABCControls(imagingGrp); + + Group minMaxValuesGroup = new Group(colorMapComp, SWT.NONE); + minMaxValuesGroup.setText("Colormap Range:"); + fd = new FormData(360, 75); + fd.left = new FormAttachment(imagingGrp, 20, SWT.RIGHT); + fd.top = new FormAttachment(colorMapComp, 65, SWT.BOTTOM); + minMaxValuesGroup.setLayout(new FormLayout()); + minMaxValuesGroup.setLayoutData(fd); + createColorMapRangeControlSliders(minMaxValuesGroup); + + + + final Group colorBarLocOptionsGroup = new Group(colorMapComp, + SWT.SHADOW_ETCHED_OUT); + colorBarLocOptionsGroup.setText("Edit Color Bar Options"); + + colorBarLocOptionsGroup.setLayout(new FormLayout()); + createColorBarLocationDimensionAndLabelDisplayControls(colorBarLocOptionsGroup); + showColorBarEditOptionsBtn.addSelectionListener( new SelectionAdapter() { + + + public void widgetSelected(SelectionEvent e){ + if ( ((Button)e.widget).getText().startsWith("Edit") ){ + ((Button)e.widget).setText("Hide ..."); + + shell.setSize(new Point ( shell.getSize().x, shell.getSize().y + colorBarLocOptionsGroup.getSize().y + 30)); + colorBarLocOptionsGroup.setVisible(true); + } + else{ + ((Button)e.widget).setText("Edit Color Bar Options ..."); + colorBarLocOptionsGroup.setVisible(false); + shell.setSize(new Point ( shell.getSize().x, shell.getSize().y - colorBarLocOptionsGroup.getSize().y - 30 )); + } + + } + }); + + fd = new FormData(730, 95); + + fd.left = new FormAttachment(colorMapComp, 10, SWT.RIGHT); + fd.top = new FormAttachment(imagingGrp, 20, SWT.BOTTOM); + colorBarLocOptionsGroup.setLayoutData(fd); + colorBarLocOptionsGroup.setVisible(false); + + } + + private void initialization() { + + imageResources = new ArrayList>(); + cmapResources = new ArrayList>(); + resAttrSet = theResourceData.getRscAttrSet(); + colorMapCategory = theResourceData.getResourceName().getRscCategory(); + colorMapName = (String)( resAttrSet.getRscAttr("colorMapName").getAttrValue()); + editedColorBar = (ColorBarFromColormap) resAttrSet.getRscAttr("colorBar").getAttrValue(); + + labelColor = new Color(colorDevice, editedColorBar.getLabelColor()); + currEditor = NmapUiUtils.getActiveNatlCntrsEditor(); + + if (currEditor != null) { + //TODO: might need to remove if we decide that we don't need the interpolation/image combiner + + ResourceList resList = currEditor.getActiveDisplayPane() + .getRenderableDisplay().getDescriptor().getResourceList(); + if (resList != null && resList.size() > 0) { + for (ResourcePair rp : resList) { + AbstractVizResource resource = rp.getResource(); + if (resource.hasCapability(ImagingCapability.class)) { + imageResources + .add((AbstractNatlCntrsResource) resource); + } else if (resource.hasCapability(ColorMapCapability.class)) { + cmapResources + .add((AbstractNatlCntrsResource) resource); + } + } + } + } + + } + + private void createColorBarLocationDimensionAndLabelDisplayControls( + Composite colorBarLocOptionsGroup) { + + Composite newComp = new Composite(colorBarLocOptionsGroup, SWT.NONE); + newComp.setLayout(new FormLayout()); + + Label orLabel = new Label(newComp, SWT.NONE); + orLabel.setText("Orientation"); + FormData fd = new FormData(); + fd.left = new FormAttachment(newComp, 8, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + orLabel.setLayoutData(fd); + + final Combo orientationCombo = new Combo(newComp, SWT.DROP_DOWN + | SWT.READ_ONLY); + fd = new FormData(); + fd.left = new FormAttachment(orLabel, 20, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + orientationCombo.setLayoutData(fd); + + Label anchorLabel = new Label(newComp, SWT.NONE); + anchorLabel.setText("Anchor"); + fd = new FormData(); + fd.left = new FormAttachment(newComp, 8, SWT.RIGHT); + fd.top = new FormAttachment(orientationCombo, 20, SWT.BOTTOM); + anchorLabel.setLayoutData(fd); + + final Combo anchorCombo = new Combo(newComp, SWT.DROP_DOWN + | SWT.READ_ONLY); + fd = new FormData(); + fd.left = new FormAttachment(anchorLabel, 45, SWT.RIGHT); + fd.top = new FormAttachment(orientationCombo, 20, SWT.BOTTOM); + anchorCombo.setLayoutData(fd); + + Label lengthLabel = new Label(newComp, SWT.NONE); + lengthLabel.setText("Length"); + fd = new FormData(); + fd.left = new FormAttachment(anchorCombo, 40, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + lengthLabel.setLayoutData(fd); + + final Spinner lenSpinner = new Spinner(newComp, SWT.BORDER); + fd = new FormData(); + fd.left = new FormAttachment(lengthLabel, 20, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + lenSpinner.setLayoutData(fd); + lenSpinner.setToolTipText("ColorBar length as a percentage of the screen size"); + + lenSpinner.setMinimum(10); + lenSpinner.setMaximum(100); + lenSpinner.setIncrement(5); + lenSpinner.setSelection((int)(editedColorBar.getLengthAsRatio()*100)); + lenSpinner.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + editedColorBar.setLengthAsRatio(((float) lenSpinner + .getSelection()) / 100f); + refreshColorBar(); + + } + }); + + Label percentLabel = new Label(newComp, SWT.NONE); + percentLabel.setText("%"); + fd = new FormData(); + fd.left = new FormAttachment(lenSpinner, 7, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + percentLabel.setLayoutData(fd); + + Label widthLabel = new Label(newComp, SWT.NONE); + widthLabel.setText("Width"); + fd = new FormData(); + fd.left = new FormAttachment(percentLabel, 40, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + widthLabel.setLayoutData(fd); + + final Spinner widthSpinner = new Spinner(newComp, SWT.BORDER); + + widthSpinner.setMinimum(2); + widthSpinner.setMaximum(50); + widthSpinner.setIncrement(1); + widthSpinner.setSelection( editedColorBar.getWidthInPixels()); + widthSpinner.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + editedColorBar.setWidthInPixels(widthSpinner.getSelection()); + refreshColorBar(); + } + }); + + fd = new FormData(); + fd.left = new FormAttachment(widthLabel, 20, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + widthSpinner.setLayoutData(fd); + + Label pixelLabel = new Label(newComp, SWT.NONE); + pixelLabel.setText("pixels"); + fd = new FormData(); + fd.left = new FormAttachment(widthSpinner, 7, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + pixelLabel.setLayoutData(fd); + + final Button showLabelsBtn = new Button(newComp, SWT.CHECK); + showLabelsBtn.setText("Show Label"); + fd = new FormData(); + fd.left = new FormAttachment(pixelLabel, 40, SWT.RIGHT); + fd.top = new FormAttachment(newComp, 20, SWT.BOTTOM); + showLabelsBtn.setLayoutData(fd); + showLabelsBtn.setSelection(editedColorBar.getShowLabels()); + + showLabelsBtn.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + editedColorBar.setShowLabels(showLabelsBtn.getSelection()); + refreshColorBar(); + } + }); + + Composite labelColorComp = new Composite(newComp, SWT.NONE); + labelColorComp.setLayout(new FormLayout()); + fd = new FormData(); + fd.left = new FormAttachment(pixelLabel, 10, SWT.RIGHT); + fd.top = new FormAttachment(showLabelsBtn, 20, SWT.BOTTOM); + labelColorComp.setLayoutData(fd); + final ColorButtonSelector labelColorSelector = new ColorButtonSelector( + labelColorComp, 50, 25); + labelColorSelector.setColorValue(labelColor.getRGB()); + labelColorSelector.addListener(new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + if (labelColor != null) { + labelColor.dispose(); + } + labelColor = new Color(colorDevice, labelColorSelector + .getColorValue()); + editedColorBar.setLabelColor(labelColor.getRGB()); + refreshColorBar(); + + } + }); + + Label labelColorLbl = new Label(newComp, SWT.NONE); + labelColorLbl.setText("Label Color"); + fd = new FormData(); + fd.left = new FormAttachment(pixelLabel, 65, SWT.RIGHT); + fd.top = new FormAttachment(showLabelsBtn, 20, SWT.BOTTOM); + labelColorLbl.setLayoutData(fd); + + orientationCombo.add(ColorBarOrientation.Vertical.name()); + orientationCombo.add(ColorBarOrientation.Horizontal.name()); + + orientationCombo + .select(editedColorBar.getOrientation() == ColorBarOrientation.Vertical ? 0 + : 1); + + orientationCombo.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + editedColorBar.setOrientation((orientationCombo + .getSelectionIndex() == 0 ? ColorBarOrientation.Vertical + : ColorBarOrientation.Horizontal)); + refreshColorBar(); + } + }); + + for (ColorBarAnchorLocation anchorLoc : availAnchorLocs) { + anchorCombo.add(anchorLoc.name()); + } + // + for (int a = 0; a < availAnchorLocs.length; a++) { + if (editedColorBar.getAnchorLoc() == availAnchorLocs[a]) { + anchorCombo.select(a); + } + } + + anchorCombo.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + editedColorBar.setAnchorLoc(availAnchorLocs[anchorCombo + .getSelectionIndex()]); + refreshColorBar(); + } + }); + } + + private void createColorMapRangeControlSliders(Composite theColorRangeGroup) { +// setColorBarFromColorMap(selectedColorMapName, false, true); + buildColorMapData(); + + Composite minMaxValues = new Composite(theColorRangeGroup, SWT.NONE); + minMaxValues.setLayout(new GridLayout(3, false)); + Label maxLabel = new Label(minMaxValues, SWT.None); + maxLabel.setText("Max:"); + + maxSlider = new Scale(minMaxValues, SWT.HORIZONTAL); + maxSlider.setMaximum(255); + maxSlider.setMinimum(0); + maxSlider.setIncrement(1); + maxSlider.setSelection(maxSlider.getMaximum()); + GridData layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + layoutData.minimumWidth = 250; + maxSlider.setLayoutData(layoutData); + + GridData labelLayoutData = new GridData(SWT.FILL, SWT.DEFAULT, false, + false); + // labelLayoutData.widthHint = convertWidthInCharsToPixels(10); + maxValueText = new Text(minMaxValues, SWT.SINGLE | SWT.BORDER + | SWT.RIGHT); + maxValueText.setLayoutData(labelLayoutData); + + Label minLabel = new Label(minMaxValues, SWT.None); + minLabel.setText("Min:"); + + minSlider = new Scale(minMaxValues, SWT.HORIZONTAL); + minSlider.setMaximum(255); + minSlider.setMinimum(0); + minSlider.setIncrement(1); + minSlider.setSelection(minSlider.getMinimum()); + layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + layoutData.minimumWidth = 250; + minSlider.setLayoutData(layoutData); + + labelLayoutData = new GridData(SWT.FILL, SWT.DEFAULT, false, false); + + minValueText = new Text(minMaxValues, SWT.SINGLE | SWT.BORDER + | SWT.RIGHT); + minValueText.setLayoutData(labelLayoutData); + + maxSlider.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (maxSlider.getSelection() <= minSlider.getSelection()) { + maxSlider.setSelection(minSlider.getSelection() + 1); + } + + changeMax(maxSlider.getSelection()); + maxValueText.setText(selectionToText(maxSlider.getSelection())); + } + }); + + minSlider.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (minSlider.getSelection() >= maxSlider.getSelection()) { + minSlider.setSelection(maxSlider.getSelection() - 1); + } + + changeMin(minSlider.getSelection()); + minValueText.setText(selectionToText(minSlider.getSelection())); + } + }); + + maxValueText.addKeyListener(new KeyListener() { + @Override + public void keyPressed(KeyEvent e) { + if (e.character == SWT.CR) { + maxTextChanged(); + } + } + + @Override + public void keyReleased(KeyEvent e) { + // TODO Auto-generated method stub + + } + }); + + minValueText.addKeyListener(new KeyListener() { + @Override + public void keyPressed(KeyEvent e) { + if (e.character == SWT.CR) { + minTextChanged(); + } + } + + @Override + public void keyReleased(KeyEvent e) { + // TODO Auto-generated method stub + + } + }); + + initializeMinMaxTextWithColorMapRanges(); + } + + private void initializeMinMaxTextWithColorMapRanges() { + if (cMapParam != null) { + currentMax = cMapParam.getColorMapMax(); + currentMin = cMapParam.getColorMapMin(); + maxSlider.setSelection(cmapToSelection(currentMax)); + minSlider.setSelection(cmapToSelection(currentMin)); + setMaxText(); + setMinText(); + } + } + + private void createColorMapComboAndEditButton(Composite colorMapComp) { + FormData fd = new FormData(); + colorMapComp.setLayout(new FormLayout()); + Label selectColorMapLabel = new Label(colorMapComp, SWT.NONE); + selectColorMapLabel.setText("Select ColorMap"); + fd = new FormData(); + fd.left = new FormAttachment(colorMapComp, 17, SWT.RIGHT); + fd.top = new FormAttachment(colorMapComp, 20, SWT.BOTTOM); + selectColorMapLabel.setLayoutData(fd); + selectColorMapLabel.setVisible(true); + final Combo colorMapNamesCombo = new Combo(colorMapComp, SWT.READ_ONLY + | SWT.DROP_DOWN); + fd = new FormData(); + fd.left = new FormAttachment(selectColorMapLabel, 20, SWT.RIGHT); + fd.top = new FormAttachment(colorMapComp, 17, SWT.BOTTOM); + colorMapNamesCombo.setLayoutData(fd); + + if (colorMapCategory != null && !colorMapCategory.isEmpty()) { + final String[] listOfColorMapNames = ColorMapUtil + .listColorMaps(colorMapCategory); + if (listOfColorMapNames != null && listOfColorMapNames.length > 0) { + colorMapNamesCombo.setItems(listOfColorMapNames); + + int seldColorMapIndx = -1; + if (colorMapName != null) { + for (int c = 0; c < listOfColorMapNames.length; c++) { + if (listOfColorMapNames[c].compareTo(colorMapName) == 0) { + colorMapNamesCombo.select(c); + selectedColorMapName = listOfColorMapNames[c]; + seldColorMapIndx = c; + } + } + + if (seldColorMapIndx == -1) { + System.out.println("The current colorMap '" + + colorMapName + "' was not found."); + seldColorMapIndx = 0; + colorMapNamesCombo.select(0); + } + } + + colorMapNamesCombo.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + // update the selected color map name in the attrSet and + // in the colorbar editor. + selectedColorMapName = new String( listOfColorMapNames[ colorMapNamesCombo.getSelectionIndex() ] ); + if ( ( selectedColorMapName != null && !selectedColorMapName.isEmpty() ) && ( colorMapName != null )) { + resAttrSet.getRscAttr( "colorMapName" ).setAttrValue( selectedColorMapName ); + theResourceData.setRscAttrSet(resAttrSet); + setColorBarFromColorMap(selectedColorMapName, true, false); + refreshColorBar(); + } + } + }); + + } + + } + + Button editColorsBtn = new Button(colorMapComp, SWT.PUSH); + editColorsBtn.setText("Edit Colors..."); + fd = new FormData(); + fd.left = new FormAttachment(colorMapNamesCombo, 20, SWT.RIGHT); + fd.top = new FormAttachment(colorMapComp, 17, SWT.BOTTOM); + editColorsBtn.setLayoutData(fd); + editColorsBtn.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent e) { + if (currEditor != null) { + String cmapEditorCmdStr = "gov.noaa.nws.ncep.viz.colorMapEditor"; + + ICommandService service = (ICommandService) currEditor + .getSite().getService(ICommandService.class); + Command cmd = service.getCommand(cmapEditorCmdStr); + if (cmd != null) { + try { + HashMap params = new HashMap(); + ExecutionEvent exec = new ExecutionEvent(cmd, + params, null, null); + cmd.executeWithChecks(exec); + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Error executing cmd: " + + cmapEditorCmdStr); + } + } + + if (currEditor != null) + currEditor.refresh(); + } + } + + }); + + } + + /** + * Creates the sliders to control the brightness and contrast of the image. + * Refactored from Raytheon's ImagingDialog class + * + * @param mainComp + */ + + private void initializeABCControls(Composite mainComp) { + Composite body = new Composite(mainComp, SWT.NONE); + body.setLayout(new GridLayout(3, false)); + Label label = new Label(body, SWT.BOLD); + label.setText("Brightness: "); + + brightnessScale = new Scale(body, SWT.NONE); + brightnessScale.setLayoutData(new GridData(200, SWT.DEFAULT)); + + brightnessText = new Label(body, SWT.NONE); + brightnessText.setLayoutData(new GridData(50, SWT.DEFAULT)); + + brightnessScale.setMinimum(0); + brightnessScale.setMaximum(100); + brightnessScale.setIncrement(1); + brightnessScale.setPageIncrement(5); + + brightnessScale.setSelection(((Float) resAttrSet.getRscAttr( + "brightness").getAttrValue()).intValue() * 100); + brightnessText.setText(brightnessScale.getSelection() + "%"); + + Label label2 = new Label(body, SWT.BOLD); + label2.setText("Contrast: "); + + contrastScale = new Scale(body, SWT.NONE); + contrastScale.setLayoutData(new GridData(200, SWT.DEFAULT)); + + contrastText = new Label(body, SWT.NONE); + contrastText.setLayoutData(new GridData(50, SWT.DEFAULT)); + + contrastScale.setMinimum(0); + contrastScale.setMaximum(100); + contrastScale.setIncrement(1); + contrastScale.setPageIncrement(5); + int contrastVal = ((Float) resAttrSet.getRscAttr("contrast") + .getAttrValue()).intValue() * 100; + contrastScale.setSelection(contrastVal); + contrastText.setText(contrastScale.getSelection() + "%"); + initializeAlphaScale(body); + + Composite checkBoxComp = new Composite(body, SWT.NONE); + checkBoxComp.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, + true, 3, 1)); + checkBoxComp.setLayout(new GridLayout(2, false)); + + interpolationChk = new Button(checkBoxComp, SWT.CHECK); + interpolationChk.setText("Interpolate"); + GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, true); + interpolationChk.setLayoutData(gd); + interpolationChk.setEnabled(false); + interpolationChk.setGrayed(true); + combineNextImage = new Button(checkBoxComp, SWT.CHECK); + combineNextImage.setText("Combine Next Image Load"); + gd = new GridData(SWT.LEFT, SWT.CENTER, true, true); + combineNextImage.setLayoutData(gd); + combineNextImage.setSelection(ImageCombiner.isCombineImages()); + combineNextImage.setEnabled(false); + combineNextImage.setGrayed(true); + combineNextImage.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + // Lets call our command + IHandlerService handlerService = (IHandlerService) PlatformUI + .getWorkbench().getActiveWorkbenchWindow() + .getService(IHandlerService.class); + try { + handlerService + .executeCommand( + "com.raytheon.uf.viz.d2d.ui.actions.imageCombination", + null); + } catch (Exception ex) { + + } + combineNextImage.setSelection(ImageCombiner.isCombineImages()); + if (currEditor != null) + currEditor.refresh(); + } + }); + + ImageCombiner.addListener(combineNextImageListener); + + brightnessScale.addSelectionListener(new SelectionAdapter() { + + /* + * (non-Javadoc) + * + * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org + * .eclipse.swt.events.SelectionEvent) + */ + @Override + public void widgetSelected(SelectionEvent e) { + + brightnessText.setText(brightnessScale.getSelection() + "%"); + + if (theResourceData != null) { + float brightnessValue = brightnessScale.getSelection()/100.0f; + resAttrSet.getRscAttr("brightness").setAttrValue( + brightnessValue); + theResourceData.setRscAttrSet(resAttrSet); + ImagingCapability imgCap = new ImagingCapability(); + imgCap.setBrightness(brightnessValue, false); + imgCap.setContrast(((Float) resAttrSet.getRscAttr( + "contrast").getAttrValue()).floatValue(), false); + imgCap.setAlpha(((Float) resAttrSet.getRscAttr("alpha") + .getAttrValue()).floatValue(), false); + ((AbstractResourceData) theResourceData) + .fireChangeListeners(ChangeType.CAPABILITY, imgCap); + + } + + } + + }); + + contrastScale.addSelectionListener(new SelectionAdapter() { + /* + * (non-Javadoc) + * + * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org + * .eclipse.swt.events.SelectionEvent) + */ + @Override + public void widgetSelected(SelectionEvent e) { + + contrastText.setText(contrastScale.getSelection() + "%"); + + if (theResourceData != null) { + float cValue = contrastScale.getSelection()/100.0f; + resAttrSet.getRscAttr("contrast").setAttrValue( + cValue); + theResourceData.setRscAttrSet(resAttrSet); + ImagingCapability imgCap = new ImagingCapability(); + imgCap.setContrast(cValue, false); + + imgCap.setBrightness(((Float) resAttrSet.getRscAttr( + "brightness").getAttrValue()).floatValue(), false); + imgCap.setAlpha(((Float) resAttrSet.getRscAttr("alpha") + .getAttrValue()).floatValue(), false); + ((AbstractResourceData) theResourceData) + .fireChangeListeners(ChangeType.CAPABILITY, imgCap); + + } + + } + + }); + + interpolationChk.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + if (imageResources != null) { + for (AbstractNatlCntrsResource rsc : imageResources) { + String rscCat = rsc.getResourceData().getResourceName() + .getRscCategory(); + if (rscCat.equalsIgnoreCase(colorMapCategory)) { + ImagingCapability imgcap = rsc + .getCapability(ImagingCapability.class); + imgcap.setInterpolationState(interpolationChk + .getSelection()); + } + } + + if (currEditor != null) + currEditor.refresh(); + } + } + + }); + } + + /*** + * Creates the slider for changing Alpha + * + * @param parent + */ + + private void initializeAlphaScale(Composite parent) { + alphaLabel = new Label(parent, SWT.BOLD); + alphaLabel.setText("Alpha: "); + alphaLabel.setLayoutData(new GridData()); + + alphaScale = new Scale(parent, SWT.NONE); + alphaScale.setLayoutData(new GridData(200, SWT.DEFAULT)); + + alphaText = new Label(parent, SWT.NONE); + alphaText.setLayoutData(new GridData(50, SWT.DEFAULT)); + + alphaScale.setMinimum(0); + alphaScale.setMaximum(100); + alphaScale.setIncrement(1); + alphaScale.setPageIncrement(5); + + RscAttrValue alphaRscAttrValue = resAttrSet.getRscAttr("alpha"); + int alphaVal = ((Float) alphaRscAttrValue.getAttrValue()).intValue(); + alphaScale.setSelection(alphaVal * 100); + alphaText.setText(alphaScale.getSelection() + "%"); + alphaScale.addSelectionListener(new SelectionAdapter() { + /* + * (non-Javadoc) + * + * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org + * .eclipse.swt.events.SelectionEvent) + */ + @Override + public void widgetSelected(SelectionEvent e) { + alphaText.setText(alphaScale.getSelection() + "%"); + + + float alphaValue = (float) (alphaScale.getSelection() / 100.0f); + resAttrSet.getRscAttr("alpha").setAttrValue( + alphaValue); + + theResourceData.setRscAttrSet(resAttrSet); + ImagingCapability imgCap = new ImagingCapability(); + imgCap.setAlpha(alphaValue, false); + imgCap.setBrightness(((Float) resAttrSet.getRscAttr( + "brightness").getAttrValue()).floatValue(), false); + imgCap.setContrast(((Float) resAttrSet.getRscAttr("contrast") + .getAttrValue()).floatValue(), false); + if (theResourceData != null) { + ((AbstractResourceData) theResourceData).fireChangeListeners(ChangeType.CAPABILITY, imgCap); + ColorMapCapability colorCap = new ColorMapCapability(); + if ( cMapParam != null ){ + colorCap.setColorMapParameters(cMapParam, false); + ((AbstractResourceData) theResourceData).fireChangeListeners(ChangeType.CAPABILITY, colorCap); + } + + } + + } + }); + } + + private void setColorBarFromColorMap(String cmapName, + boolean fireChangeListeners, boolean isFirstTimeSetup) { + + try { + if ((colorMapCategory != null && (!colorMapCategory.isEmpty())) + && (cmapName != null && (!cmapName.isEmpty())) + + ) { + theSelectedColorMap = (ColorMap) ColorMapUtil.loadColorMap( + colorMapCategory, cmapName); + } + } catch (VizException e) { + System.out.println(e.getMessage()); + return; + } + if (theSelectedColorMap != null) { + ((ColorBarFromColormap) editedColorBar) + .setColorMap(theSelectedColorMap); + resAttrSet.getRscAttr("colorMapName").setAttrValue(cmapName); + + cMapCapability = new ColorMapCapability(); + cMapParam = new ColorMapParameters(); + cMapParam.setColorMapMin(0); + cMapParam.setDataMax( 255 ); + cMapParam.setDataMin( 0 ); + cMapParam.setColorMapMax(255 ); + + // initializeAlphaMaskInColorMapParam(); + + cMapParam.setColorMap(theSelectedColorMap); + currentMax = cMapParam.getColorMapMax(); + currentMin = cMapParam.getColorMapMin(); + if(!isFirstTimeSetup){ + maxSlider.setSelection(cmapToSelection(currentMax)); + minSlider.setSelection(cmapToSelection(currentMin)); + setMaxText(); + setMinText(); + } + + cMapCapability.setColorMapParameters(cMapParam, false); + + + if (theResourceData != null && fireChangeListeners) { + + ((AbstractResourceData) theResourceData).fireChangeListeners( + ChangeType.CAPABILITY, cMapCapability); + } + + } + } + + private void refreshColorBar() { + if (theResourceData != null && editedColorBar != null) { + resAttrSet.setAttrValue("colorBar", editedColorBar); + theResourceData.setRscAttrSet(resAttrSet); + } + } + + private void buildColorMapData() { + arrayOfSliderTextStrings = new String[256]; + + if (cMapParam == null && ( colorMapName != null && !colorMapName.isEmpty() ) ){ + setColorBarFromColorMap(colorMapName, false, true ); + } + + if (cMapParam != null) { + + cmapMin = cMapParam.getDataMin(); + cmapMax = cMapParam.getDataMax(); + cmapWidth = cmapMax - cmapMin; + cmapIncrement = cmapWidth / ColorUtil.MAX_VALUE; + initializeAlphaMaskInColorMapParam(); + + float start = cmapMin.floatValue(); + String units = ""; + + UnitConverter unitConv = cMapParam.getImageToDisplayConverter(); + + Double lastVal = Double.NaN; + + for (int i = 0; i < arrayOfSliderTextStrings.length; ++i) { + double value = start; + + // handle precision errors + if (value > cmapMax) { + // if the difference is .1 the increment between steps + // assume + // that cmapMax is ok + if ((value - cmapMax) < (.1 * cmapIncrement)) { + value = cmapMax; + } + } + + String textStr = ""; + + if (cMapParam.isLogarithmic()) { + // TODO: Handle case where min/max go from neg to pos + if (cMapParam.getColorMapMax() >= 0 + && cMapParam.getColorMapMin() >= 0) { + double index = (i) / ColorUtil.MAX_VALUE; + value = Math + .pow(Math.E, (Math.log(cMapParam + .getColorMapMin()) + (index * (Math + .log(cMapParam.getColorMapMax()) - Math + .log(cMapParam.getColorMapMin()))))); + } + if (format == null) { + format = new DecimalFormat("0.000"); + } + } + + if (unitConv != null) { + value = unitConv.convert(value); + + /* + * Check if the last value is non a number. + */ + if (lastVal.isNaN()) { + // If value is not a number then set the text to + // "NO DATA". + if (((Double) value).isNaN()) { + textStr = "NO DATA"; + } + lastVal = value; + } else { + // If value is not a number then prepend ">" + // to the value. + if (((Double) value).isNaN()) { + textStr = "> " + lastVal; + } else { + lastVal = value; + } + } + } + + if (!Double.isNaN(value)) { + int zeros = 0; + String val = "" + value; + char[] vals = val.substring(val.indexOf(".") + 1) + .toCharArray(); + for (int j = 0; j < vals.length; ++j) { + if (vals[j] == '0') { + ++zeros; + } else { + ++zeros; + break; + } + } + zeros = Math.min(3, zeros); + + String f = "0."; + for (int j = 0; j < zeros; ++j) { + f += "0"; + } + + if (format == null) + format = new DecimalFormat(f); + } + + String txt; + if (textStr.length() == 0) { + txt = format.format(value); + } else { + txt = textStr; + } + + if (units != null && units.length() != 0) { + txt += " " + units; + } + + arrayOfSliderTextStrings[i] = txt; + start += cmapIncrement; + + } + + } + + } + + private void initializeAlphaMaskInColorMapParam(){ + + if ( cMapParam != null ){ +// int rangeStart = (int) cMapParam.getColorMapMin(); + int rangeEnd = (int) cMapParam.getColorMapMax(); + byte[] mask = cMapParam.getAlphaMask(); + if ( ( mask == null || mask.length == 0 ) && rangeEnd > 0 ){ + mask = new byte[rangeEnd]; + for (int i = 0; i < rangeEnd; ++i) { + mask[i] = 1; + } + } + else{ + for (int i = 0; i < mask.length; ++i) { + mask[i] = 1; + } + } + cMapParam.setAlphaMask(mask); + + } + } + + + private float selectionToCmap(int selection) { + float percentOffset = selection / 255.0f; + float value = percentOffset * cmapWidth + cmapMin; + return value; + } + + private int cmapToSelection(float value) { + int selection = (int) ((value - cmapMin) * 255.0f / cmapWidth); + return selection; + } + + private void changeMax(int position) { + // slider min and max is based on the color map, so position is the new + // color map max + currentMax = new Float(selectionToCmap(position)); + cMapParam.setColorMapMax(currentMax, true); + cMapCapability.setColorMapParameters(cMapParam); + if (theResourceData != null) { + ((AbstractResourceData) theResourceData).fireChangeListeners( + ChangeType.CAPABILITY, cMapCapability); + } + } + + private void changeMin(int position) { + // slider min and max is based on the color map, so position is the new + // color map min + currentMin = new Float(selectionToCmap(position)); + cMapParam.setColorMapMin(currentMin, true); + cMapCapability.setColorMapParameters(cMapParam); + if (theResourceData != null) { + ((AbstractResourceData) theResourceData).fireChangeListeners( + ChangeType.CAPABILITY, cMapCapability); + } + } + + private void setColorMapMax(float f) { + if (currentMax != f) { + currentMax = f; + cMapParam.setColorMapMax(f, true); + if (theResourceData != null) { + ((AbstractResourceData) theResourceData).fireChangeListeners( + ChangeType.CAPABILITY, cMapCapability); + } + } + } + + private void setColorMapMin(float f) { + if (currentMin != f) { + currentMin = f; + cMapParam.setColorMapMin(f, true); + if (theResourceData != null) { + ((AbstractResourceData) theResourceData).fireChangeListeners( + ChangeType.CAPABILITY, cMapCapability); + } + } + } + + private void setMaxText() { + maxValueText.setText(cmapToText(currentMax)); + } + + private void setMinText() { + minValueText.setText(cmapToText(currentMin)); + } + + private String cmapToText(double value) { + String txt = null; + + if (cMapParam != null) { + UnitConverter unitConv = cMapParam.getImageToDisplayConverter(); + String textStr = ""; + + if (unitConv != null) { + value = unitConv.convert(value); + if (((Double) value).isNaN()) { + textStr = "NO DATA"; + } + } + + if (textStr.length() == 0) { + txt = format.format(value); + } else { + txt = textStr; + } + + } + + return txt; + } + + private void maxTextChanged() { + String text = maxValueText.getText().trim().split(" ")[0]; + try { + float f = Float.valueOf(text); + UnitConverter unitConv = cMapParam.getImageToDisplayConverter(); + if (unitConv != null) { + f = (float) unitConv.inverse().convert(f); + } + if (currentMin >= f) { + statusHandler + .handle(Priority.ERROR, + "Maximum of colormap range cannot be below the minimum."); + setMaxText(); + } else if (f >= cmapMax) { + setColorMapMax(cmapMax); + maxSlider.setSelection(255); + setMaxText(); + } else { + setColorMapMax(f); + maxSlider.setSelection(cmapToSelection(f)); + } + } catch (NumberFormatException ex) { + statusHandler.handle(Priority.ERROR, + "Maximum of colormap range cannot be parsed: " + text); + setMaxText(); + } catch (ConversionException ex) { + statusHandler.handle(Priority.ERROR, "Unit converter error.", ex); + setMaxText(); + } + + } + + private void minTextChanged() { + String text = minValueText.getText().trim().split(" ")[0]; + try { + float f = Float.valueOf(text); + UnitConverter unitConv = cMapParam.getImageToDisplayConverter(); + if (unitConv != null) { + f = (float) unitConv.inverse().convert(f); + } + if (f >= currentMax) { + setMinText(); + statusHandler.handle(Priority.ERROR, + "Minimum of colormap range cannot exceed the maximum."); + } else if (cmapMin >= f) { + setColorMapMin(cmapMin); + minSlider.setSelection(0); + setMinText(); + } else { + setColorMapMin(f); + minSlider.setSelection(cmapToSelection(f)); + } + } catch (NumberFormatException ex) { + statusHandler.handle(Priority.ERROR, + "Minimum of colormap range cannot be parsed: " + text); + setMinText(); + } catch (ConversionException ex) { + statusHandler.handle(Priority.ERROR, "Unit converter error.", ex); + setMinText(); + } + } + + private String selectionToText(int selection) { + String rval = "ERR"; + + if (selection > -1 && selection < arrayOfSliderTextStrings.length) { + // exact match into sliderText array + rval = arrayOfSliderTextStrings[selection]; + } else { + statusHandler.handle(Priority.CRITICAL, "index " + selection + + " out of range, max " + + (arrayOfSliderTextStrings.length - 1)); + } + return rval; + } + + @Override + public void dispose() { + editedColorBar.dispose(); + super.dispose(); + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/colorBar/ColorBarResource.java b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/colorBar/ColorBarResource.java index 66ecdcd6f7..5b947f7ef8 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/colorBar/ColorBarResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/colorBar/ColorBarResource.java @@ -180,9 +180,10 @@ public class ColorBarResource extends AbstractVizResource 0) //check gets rid of the ghost outline if the colormap was cleared + target.drawRect(colorBarExtent, colorBar.getLabelColor(), 1.0f, 1.0d); } catch (VizException e) { } diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/RbdBundle.java b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/RbdBundle.java index cb61f5817e..c8abce62fe 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/RbdBundle.java +++ b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/RbdBundle.java @@ -98,7 +98,7 @@ public class RbdBundle implements ISerializableObject { @XmlAttribute protected String rbdName; - private NCMapEditor ncEditor; +// private NCMapEditor ncEditor; // true if edited from the LoadRbd dialog private Boolean isEdited = false; @@ -112,9 +112,9 @@ public class RbdBundle implements ISerializableObject { public void setAutoUpdate(boolean autoUpdate) { this.autoUpdate = autoUpdate; - if (this.ncEditor != null) { - this.ncEditor.setAutoUpdate(autoUpdate); - } +// if (this.ncEditor != null) { +// this.ncEditor.setAutoUpdate(autoUpdate); +// } for (NCMapRenderableDisplay disp : displays) { if (disp != null) { ((NCMapDescriptor) disp.getDescriptor()) @@ -168,27 +168,27 @@ public class RbdBundle implements ISerializableObject { */ public RbdBundle() { timeMatcher = null; - ncEditor = null; +// ncEditor = null; } // used when creating an RBD to be written out. public RbdBundle(PaneLayout paneLayout) { timeMatcher = null; - ncEditor = null; +// ncEditor = null; setPaneLayout(paneLayout); displays = new NCMapRenderableDisplay[paneLayout.getNumberOfPanes()];// numPaneRows*numPaneColumns]; } - public NCMapEditor getNcEditor() { - return ncEditor; - } +// public NCMapEditor getNcEditor() { +// return ncEditor; +// } +// +// public void setNcEditor(NCMapEditor ncEditor) { +// this.ncEditor = ncEditor; +// this.ncEditor.setAutoUpdate(isAutoUpdate()); +// } - public void setNcEditor(NCMapEditor ncEditor) { - this.ncEditor = ncEditor; - this.ncEditor.setAutoUpdate(isAutoUpdate()); - } - - public void initFromEditor() { + public void initFromEditor(NCMapEditor ncEditor) { if (ncEditor == null) { return; } diff --git a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/ResourceBndlLoader.java b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/ResourceBndlLoader.java index dadea5953b..ddb1a4953c 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/ResourceBndlLoader.java +++ b/ncep/gov.noaa.nws.ncep.viz.resources/src/gov/noaa/nws/ncep/viz/resources/manager/ResourceBndlLoader.java @@ -49,14 +49,55 @@ import com.raytheon.uf.viz.core.rsc.ResourceList; * 06/07/11 #445 Xilin Guo Data Manager Performance Improvements * 10/15/11 ? B. Yin Keep PGEN resource when loading RBDs. * 01/09/11 #561 Greg Hull rm code to add Locator Resource - * + * 02/15/11 #627 Archana Created the private class RbdBundleEditorWrapper, + * changed the seldRBDs queue to accept a RbdBundleEditorWrapper + * and updated the addRBD() to take a NCMapEditor as an additional + * argument. + * + * + * + * * * * @version 1 */ public class ResourceBndlLoader implements Runnable { // extends Job { + + private final class RbdBundleEditorWrapper{ + private RbdBundle rbdBundle; + private NCMapEditor mapEditor; + RbdBundleEditorWrapper(RbdBundle theRbdBundle, NCMapEditor theMapEditor){ + setRbdBundle( theRbdBundle); + setMapEditor( theMapEditor ); + } + /** + * @param rbdBundle the rbdBundle to set + */ + public void setRbdBundle(RbdBundle rbdBundle) { + this.rbdBundle = rbdBundle; + } + /** + * @return the rbdBundle + */ + public RbdBundle getRbdBundle() { + return rbdBundle; + } + /** + * @param mapEditor the mapEditor to set + */ + public void setMapEditor(NCMapEditor mapEditor) { + this.mapEditor = mapEditor; + } + /** + * @return the mapEditor + */ + public NCMapEditor getMapEditor() { + return mapEditor; + } + } - private final ConcurrentLinkedQueue seldRBDs; +// private final ConcurrentLinkedQueue seldRBDs; + private final ConcurrentLinkedQueue> seldRBDs; // when set we will only load the selected Pane private boolean loadSelectedPaneOnly = false; @@ -69,13 +110,18 @@ public class ResourceBndlLoader implements Runnable { // extends Job { seldRBDs.clear(); } - public void addRBD( RbdBundle newRBD ) { - seldRBDs.add( newRBD ); - } +// public void addRBD( RbdBundle newRBD ) { +// seldRBDs.add( newRBD ); +// } +// + public void addRBD( RbdBundle newRBD, NCMapEditor theEditor ) { + + seldRBDs.add( new RbdBundleEditorWrapper ( newRBD, theEditor ) ); +} public ResourceBndlLoader( String name ) { // name of the Job //super(name); - seldRBDs = new ConcurrentLinkedQueue(); + seldRBDs = new ConcurrentLinkedQueue>(); } private class ErrorMsg implements Runnable { @@ -116,95 +162,103 @@ public class ResourceBndlLoader implements Runnable { // extends Job { */ - RbdBundle[] rbdList = (RbdBundle[])seldRBDs.toArray( new RbdBundle[0] ); +// RbdBundle[] rbdList = (RbdBundle[])seldRBDs.toArray( new RbdBundle[0] ); + RbdBundleEditorWrapper[] wrapperClassArray= ( RbdBundleEditorWrapper[] ) seldRBDs.toArray ( new RbdBundleEditorWrapper[0] ); + if( loadSelectedPaneOnly ) { - if( rbdList.length > 1 ) { + if( wrapperClassArray.length > 1 ) { System.out.println("Warning: rbdLoader should only load one RBD when"+ "loadSelectedPaneOnly is true??" ); } } - - for( RbdBundle rbdBndl : rbdList ) { - // initialize the timeline if it has not already - // been initialized -// xguo,06/02/11. Not initialize time-line until the user selects it -// rbdBndl.initTimeline(); + + for ( RbdBundleEditorWrapper thisWrapper : wrapperClassArray ){ + + RbdBundle rbdBndl = thisWrapper.getRbdBundle(); - // the editor should have already be created with the right - // number of displays and matching paneLayouts - NCMapEditor editor = rbdBndl.getNcEditor(); - - if( editor == null ) { - System.out.println("??editor is null in rbdLoader?"); - continue; - } - - // If this editor currently has resources loaded, clear them out except for PGEN - for( IDisplayPane pane : editor.getDisplayPanes() ) { - List rlist = ((NCDisplayPane)pane).getRenderableDisplay().getDescriptor().getResourceList(); - Iterator it = rlist.iterator(); - - while( it.hasNext() ){ - ResourcePair rp = it.next(); - if ( !rp.getResource().getClass().getName().endsWith("PgenResource") ) { - rlist.remove(rp); - } - } - } - - editor.setGeoSyncPanesEnabled( rbdBndl.isGeoSyncedPanes() ); - editor.setHideShow(false); //init to false, means rsc on - - IDisplayPane displayPanes[] = editor.getDisplayPanes(); - - if( loadSelectedPaneOnly ) { - - if( editor.getPaneLayout().getRows() <= rbdBndl.getSelectedPaneId().getRow() || - editor.getPaneLayout().getColumns() <= rbdBndl.getSelectedPaneId().getColumn() ) { - - System.out.println("Error: The Active Display doesn't have enough Panes"+ - " for the selected Pane: "); - break; - } - } - else if( !editor.getPaneLayout().equals( rbdBndl.getPaneLayout() ) ) { - System.out.println("PaneLayouts of the RBD and Editor don't match?"); - continue; - } - - // loop thru the panes in the RBD - // - for( int r=0 ; r rlist = ((NCDisplayPane)pane).getRenderableDisplay().getDescriptor().getResourceList(); + Iterator it = rlist.iterator(); + + while( it.hasNext() ){ + ResourcePair rp = it.next(); + if ( !rp.getResource().getClass().getName().endsWith("PgenResource") ) { + rlist.remove(rp); + } + } + } + editor.setAutoUpdate(rbdBndl.isAutoUpdate() ); + editor.setGeoSyncPanesEnabled( rbdBndl.isGeoSyncedPanes() ); + editor.setHideShow(false); //init to false, means rsc on + + IDisplayPane displayPanes[] = editor.getDisplayPanes(); + + if( loadSelectedPaneOnly ) { + + if( editor.getPaneLayout().getRows() <= rbdBndl.getSelectedPaneId().getRow() || + editor.getPaneLayout().getColumns() <= rbdBndl.getSelectedPaneId().getColumn() ) { + + System.out.println("Error: The Active Display doesn't have enough Panes"+ + " for the selected Pane: "); + break; + } + } + else if( !editor.getPaneLayout().equals( rbdBndl.getPaneLayout() ) ) { + System.out.println("PaneLayouts of the RBD and Editor don't match?"); + continue; + } + + // loop thru the panes in the RBD + // + for( int r=0 ; r * * @author * @version 1 */ -public class SpfsManager { +public class SpfsManager implements ILocalizationFileObserver { private static SpfsManager instance = null; @@ -81,8 +74,6 @@ public class SpfsManager { private void findAvailSpfs() { spfsMap = new TreeMap>>(); -// spfsMap = new TreeMap(); -// rbdsMap = new TreeMap(); // This will find all the directories for SPFs and SPF groups as well // as the RBDs @@ -92,10 +83,11 @@ public class SpfsManager { // loop thru the LocalizationFiles and save to for( LocalizationFile lFile : spfsLFileMap.values() ) { + lFile.addFileUpdatedObserver(this); + String[] dirs = lFile.getName().split( File.separator ); - + // if this is a SPF Group or SPF directory - // if( lFile.getFile().isDirectory() ) { // if an SPF Group if( dirs.length < 3 ) { @@ -150,7 +142,6 @@ public class SpfsManager { if( !spfsMap.containsKey( grpName ) ) { spfsMap.put( grpName, new TreeMap>() ); } - } public void addSpf( String grpName, String spfName ) {//, LocalizationFile lFile ) { @@ -179,7 +170,6 @@ public class SpfsManager { Map sMap = gMap.get( spfName ); if( !sMap.containsKey( rbd.getRbdName() ) ) { - sMap.put( rbd.getRbdName(), rbd ); } } @@ -228,10 +218,6 @@ public class SpfsManager { return rbdNames; } -// public void createRBD() { -// -// } - // return a copy of the Rbds in the given SPF. public ArrayList getRbdsFromSpf( String grpName, String spfName, boolean resolveLatestCycleTimes ) throws VizException { @@ -364,6 +350,8 @@ public class SpfsManager { addRbd( grpName, spfName, rbd ); + lFile.addFileUpdatedObserver(this); + } catch (LocalizationOpFailedException e) { throw new VizException(e); } catch (SerializationException e) { @@ -388,4 +376,43 @@ public class SpfsManager { } } -} + + @Override + public void fileUpdated(FileUpdatedMessage message) { + + + String chgFile = message.getFileName(); + FileChangeType chgType = message.getChangeType(); + LocalizationContext chgContext = message.getContext(); + + if (chgType.toString().equals("ADDED")) { + + String[] dirsf = chgFile.split( File.separator); + + if( ! chgFile.endsWith(".xml" ) ) { + System.out.println("Non-xmlfile found under SPFs dir???:"+ chgFile ); + } + else if( dirsf.length != 5 ) { + System.out.println("xml file found in non-SPF directory? "+ chgFile ); + }else { + try { + LocalizationFile lFile = NcPathManager.getInstance().getLocalizationFile( + chgContext, chgFile ); + RbdBundle rbd = RbdBundle.unmarshalRBD( lFile.getFile(), null ); + //System.out.println("Add Rbd name is " + rbd.rbdName ); + rbd.setLocalizationFile( lFile ); + addRbd( dirsf[2], dirsf[3], rbd ); + } + catch (VizException e ) { + // log error + System.out.println("Error unmarshalling rbd: "+ chgFile + + "\n"+e.getMessage() ); + } + + } + } + + } + + +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.airmet/gov.noaa.nws.ncep.viz.rsc.airmet.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.airmet/gov.noaa.nws.ncep.viz.rsc.airmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.atcf/gov.noaa.nws.ncep.viz.rsc.atcf.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.atcf/gov.noaa.nws.ncep.viz.rsc.atcf.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.atcf/src/gov/noaa/nws/ncep/viz/rsc/atcf/rsc/AtcfResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.atcf/src/gov/noaa/nws/ncep/viz/rsc/atcf/rsc/AtcfResource.java index 856a73fb31..ce5ee03456 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.atcf/src/gov/noaa/nws/ncep/viz/rsc/atcf/rsc/AtcfResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.atcf/src/gov/noaa/nws/ncep/viz/rsc/atcf/rsc/AtcfResource.java @@ -61,6 +61,7 @@ import com.vividsolutions.jts.geom.Coordinate; * for time-matching * 11-Nov-2010 307 Greg Hull Use data with best timeMatch. adjust startTime in query. * 01-Mar-2011 Greg Hull frameInterval -> frameSpan + * 16 Feb 2012 555 S. Gurung Added call to setAllFramesAsPopulated() in queryRecords() * * @author archana * @@ -534,6 +535,7 @@ implements INatlCntrsResource{ frameStartTime.clear(); } + setAllFramesAsPopulated(); } catch (VizException e) { e.printStackTrace(); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.convsigmet/gov.noaa.nws.ncep.viz.rsc.convsigmet.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.convsigmet/gov.noaa.nws.ncep.viz.rsc.convsigmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.convsigmet/src/gov/noaa/nws/ncep/viz/rsc/convsigmet/rsc/ConvSigmetResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.convsigmet/src/gov/noaa/nws/ncep/viz/rsc/convsigmet/rsc/ConvSigmetResource.java index 171440e99c..2407692a4b 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.convsigmet/src/gov/noaa/nws/ncep/viz/rsc/convsigmet/rsc/ConvSigmetResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.convsigmet/src/gov/noaa/nws/ncep/viz/rsc/convsigmet/rsc/ConvSigmetResource.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import org.eclipse.swt.graphics.RGB; @@ -52,6 +53,10 @@ import com.raytheon.uf.viz.core.map.IMapDescriptor; * 03 Oct 2010 307 Greg Hull modify processRecords and updateFrameData to process * ConvSigmetRscDataObjs instead of ConvSigmetRecord * 22 Apr 2011 B. Hebbard Prevent label overlap where W&C or C&E Outlooks have coincident top points + * 09 Mar 2012 728 B. Hebbard Use postProcessFrameUpdate() to remove, for each frame, SIGMETs/Outlooks + * if superseded by any in that frame more recently issued for the same + * region (W/C/E) (TTR 143). + * * * * @author bhebbard @@ -62,10 +67,12 @@ public class ConvSigmetResource extends AbstractNatlCntrsResource convSigmetDataMap; + + // A map from an identifier string (like "18C", which is unique + // within a single frame) to a structure for one displayable element + // (polygon, line, point, etc.) for a SIGMET or Outlook location + HashMap convSigmetDataMap; public FrameData(DataTime frameTime, int timeInt) { super( frameTime, timeInt ); @@ -74,7 +81,7 @@ public class ConvSigmetResource extends AbstractNatlCntrsResource latestSigmetIssuanceTimeForRegions = new HashMap(); + Map latestOutlooksIssuanceTimeForRegions = new HashMap(); + + for (ConvSigmetRscDataObj csigRDO : fd.convSigmetDataMap.values()) { + String sequenceID = csigRDO.sequenceID.trim().toUpperCase(); + if (sequenceID != null && !sequenceID.isEmpty()) { + Character region = sequenceID.charAt(sequenceID.length()-1); // the "C" in "18C" + switch (csigRDO.csigType) { + case AREA: + case ISOL: + case LINE: + case CS: // null Convective SIGMET still counts as 'issuance' + DataTime latestSigmetIssuanceForThisRegion = + latestSigmetIssuanceTimeForRegions.get(region); + if (latestSigmetIssuanceForThisRegion == null || + csigRDO.issueTime.greaterThan(latestSigmetIssuanceForThisRegion)) { + latestSigmetIssuanceTimeForRegions.put(region, csigRDO.issueTime); + } + break; + case OUTLOOK: + DataTime latestOutlooksIssuanceForThisRegion = + latestOutlooksIssuanceTimeForRegions.get(region); + if (latestOutlooksIssuanceForThisRegion == null || + csigRDO.issueTime.greaterThan(latestOutlooksIssuanceForThisRegion)) { + latestOutlooksIssuanceTimeForRegions.put(region, csigRDO.issueTime); + } + break; + case UNKNOWN: + break; + default: + } + } + } + + // Now that we've determined the latest issuances for each region -- + // for both outlooks and actual Convective SIGMETs -- we make a second + // pass through the data time matched to this frame. This time, + // we purge anything superseded by a later issuance. + + String[] keys = new String[1]; + keys = fd.convSigmetDataMap.keySet().toArray(keys); + for (String key : keys) { + ConvSigmetRscDataObj csigRDO = fd.convSigmetDataMap.get(key); + String sequenceID = (csigRDO == null) ? null : csigRDO.sequenceID; + if (sequenceID != null && !sequenceID.isEmpty()) { + Character region = sequenceID.charAt(sequenceID.length()-1); + switch (csigRDO.csigType) { + case AREA: + case ISOL: + case LINE: + case CS: + DataTime latestSigmetIssuanceForThisRegion = + latestSigmetIssuanceTimeForRegions.get(region); + if (latestSigmetIssuanceForThisRegion != null && + latestSigmetIssuanceForThisRegion.greaterThan(csigRDO.issueTime)) { + fd.convSigmetDataMap.remove(key); + } + break; + case OUTLOOK: + DataTime latestOutlooksIssuanceForThisRegion = + latestOutlooksIssuanceTimeForRegions.get(region); + if (latestOutlooksIssuanceForThisRegion != null && + latestOutlooksIssuanceForThisRegion.greaterThan(csigRDO.issueTime)) { + fd.convSigmetDataMap.remove(key); + } + break; + case UNKNOWN: + break; + default: + } + } + } + + } + // + return true; + } public void paintFrame(AbstractFrameData frameData, IGraphicsTarget target, PaintProperties paintProps) throws VizException { @@ -249,7 +353,7 @@ public class ConvSigmetResource extends AbstractNatlCntrsResource= 0) && (convSigmetData.speed > 0); for (int hour = 0; hour <= 2; hour++) { - switch (convSigmetData.classType) { + switch (convSigmetData.csigType) { case AREA: case LINE: case ISOL: // these (may) have motion; set hourly parameters @@ -293,7 +397,7 @@ public class ConvSigmetResource extends AbstractNatlCntrsResource * @@ -1144,6 +1145,8 @@ for(int i=0; i queryList = new HashMap(resourceData.getMetadataMap()); @@ -1174,7 +1177,8 @@ for(int i=0; i * * @author bhebbard diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.hrcn/src/gov/noaa/nws/ncep/viz/rsc/hrcn/rsc/HrcnResourceData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.hrcn/src/gov/noaa/nws/ncep/viz/rsc/hrcn/rsc/HrcnResourceData.java index 6415b0c2c9..ce51fedf00 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.hrcn/src/gov/noaa/nws/ncep/viz/rsc/hrcn/rsc/HrcnResourceData.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.hrcn/src/gov/noaa/nws/ncep/viz/rsc/hrcn/rsc/HrcnResourceData.java @@ -33,7 +33,7 @@ import com.raytheon.uf.viz.core.rsc.AbstractVizResource; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 04 Oct 2011 ??? B. Hebbard Initial creation. + * 04 Oct 2011 466 B. Hebbard Initial creation. * * * diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.idft/gov.noaa.nws.ncep.viz.rsc.idft.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.idft/gov.noaa.nws.ncep.viz.rsc.idft.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.intlsig/gov.noaa.nws.ncep.viz.rsc.intlsig.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.intlsig/gov.noaa.nws.ncep.viz.rsc.intlsig.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.lightning/gov.noaa.nws.ncep.viz.rsc.lightning.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.lightning/gov.noaa.nws.ncep.viz.rsc.lightning.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.lightning/src/gov/noaa/nws/ncep/viz/rsc/lightning/rsc/LightningResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.lightning/src/gov/noaa/nws/ncep/viz/rsc/lightning/rsc/LightningResource.java index 3ecb7df0a4..16a97f9e93 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.lightning/src/gov/noaa/nws/ncep/viz/rsc/lightning/rsc/LightningResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.lightning/src/gov/noaa/nws/ncep/viz/rsc/lightning/rsc/LightningResource.java @@ -59,6 +59,7 @@ import com.raytheon.uf.viz.core.rsc.ResourceType; * 11/18/2010 #307 Greg Hull newRscDataObjsList -> newRscDataObjsQueue * 04/22/2011 #439 Greg Hull only query needed times, rm System.out, * show strike count in legend + * 02/16/2012 #555 S. Gurung Added call to setAllFramesAsPopulated() in queryRecords() * * * @@ -277,6 +278,8 @@ public class LightningResource extends AbstractNatlCntrsResource + + + + ${timeMatchMethod} ${timelineGenMethod} ${legend_color} + ${alpha} + ${brightness} + ${contrast} ${colorMapName} ${colorBar} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/plugin.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/plugin.xml index 1e781e431b..a02a72b9fa 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/plugin.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/plugin.xml @@ -47,6 +47,21 @@ attributeName="colorMapName" ncResourceName="RadarMosaic"> + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/EditLocalRadarAttrsDialog.java b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/EditLocalRadarAttrsDialog.java index f385f01912..0448c579c0 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/EditLocalRadarAttrsDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/EditLocalRadarAttrsDialog.java @@ -19,6 +19,7 @@ import gov.noaa.nws.ncep.viz.resources.INatlCntrsResourceData; import gov.noaa.nws.ncep.viz.resources.attributes.AbstractEditResourceAttrsDialog; import gov.noaa.nws.ncep.viz.resources.attributes.ResourceAttrSet.RscAttrValue; import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarEditor; +import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarFromColorMapAttrsEditorComposite; import gov.noaa.nws.ncep.viz.ui.display.ColorBar; import gov.noaa.nws.ncep.viz.ui.display.ColorBarFromColormap; import gov.noaa.nws.ncep.viz.common.ColorMapUtil; @@ -31,7 +32,8 @@ import gov.noaa.nws.ncep.viz.common.ColorMapUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 02/10/11 Greg Hull Initial Creation. - * + * 03/20/12 651 Archana Updated to use the composite + * from ColorBarFromColorMapAttrsEditorComposite * * * @author ghull @@ -42,114 +44,25 @@ public class EditLocalRadarAttrsDialog extends AbstractEditResourceAttrsDialog { public EditLocalRadarAttrsDialog(Shell parentShell, INatlCntrsResourceData r, Boolean apply) { super(parentShell, r, apply); + resourceData = r; } - private RscAttrValue colorMapNameAttr = null; - private RscAttrValue colorBarAttr = null; - - private ColorBarEditor colorBarEditor = null; - private ColorBarFromColormap editedColorBar = null; - private String cmapCategory="Radar"; - + private INatlCntrsResourceData resourceData; + private ColorBarFromColorMapAttrsEditorComposite cBarComposite= null; // @Override public Composite createDialog( Composite topComp ) { - - colorMapNameAttr = editedRscAttrSet.getRscAttr( "colorMapName" ); - colorBarAttr = editedRscAttrSet.getRscAttr( "colorBar" ); - if( colorMapNameAttr == null || colorMapNameAttr.getAttrClass() != String.class ) { - System.out.println("colorMapName is null or not of expected class String?"); - return null; - } - if( colorBarAttr == null || colorBarAttr.getAttrClass() != ColorBarFromColormap.class ) { - System.out.println("colorBar is null or not of expected class ColorBarFromColormap?"); - return null; - } - - // The resource category is the category of the colormaps - cmapCategory = rscData.getResourceName().getRscCategory(); FormLayout layout0 = new FormLayout(); topComp.setLayout(layout0); - // the resource category is the category for the colormaps - final String availColorMaps[] = ColorMapUtil.listColorMaps( cmapCategory ); - - final Combo colorMapNamesCombo = new Combo( topComp, SWT.READ_ONLY | SWT.DROP_DOWN ); - FormData fd = new FormData(); - fd.left = new FormAttachment( 50, -30 ); - fd.top = new FormAttachment( 0, 20 ); - colorMapNamesCombo.setLayoutData( fd ); - - colorMapNamesCombo.setItems( availColorMaps ); - int seldColorMapIndx = -1; - - for( int c=0 ; c * SOFTWARE HISTORY @@ -32,6 +34,7 @@ import gov.noaa.nws.ncep.viz.common.ColorMapUtil; * ------------ ---------- ----------- -------------------------- * 04/14/10 #259 Greg Hull Initial Creation. * 04/27/2010 #245 Greg Hull Added Apply Button + * 03/29/2012 #651 S. Gurung Extend AbstractEditResourceAttrsInteractiveDialog * * * @@ -39,118 +42,29 @@ import gov.noaa.nws.ncep.viz.common.ColorMapUtil; * @version 1 */ -public class EditMosaicAttrsDialog extends AbstractEditResourceAttrsDialog { +public class EditMosaicAttrsDialog extends AbstractEditResourceAttrsInteractiveDialog { public EditMosaicAttrsDialog(Shell parentShell, INatlCntrsResourceData r, Boolean apply) { super(parentShell, r, apply); + resourceData = r; } - private RscAttrValue colorMapNameAttr = null; - private RscAttrValue colorBarAttr = null; - - private ColorBarEditor colorBarEditor = null; - private ColorBarFromColormap editedColorBar = null; - private String cmapCategory="Satellite"; - + private INatlCntrsResourceData resourceData; + private ColorBarFromColorMapAttrsEditorComposite cBarComposite= null; // @Override public Composite createDialog( Composite topComp ) { - - colorMapNameAttr = editedRscAttrSet.getRscAttr( "colorMapName" ); - colorBarAttr = editedRscAttrSet.getRscAttr( "colorBar" ); - if( colorMapNameAttr == null || colorMapNameAttr.getAttrClass() != String.class ) { - System.out.println("colorMapName is null or not of expected class String?"); - return null; - } - if( colorBarAttr == null || colorBarAttr.getAttrClass() != ColorBarFromColormap.class ) { - System.out.println("colorBar is null or not of expected class ColorBarFromColormap?"); - return null; - } - - // The resource category is the category of the colormaps - cmapCategory = rscData.getResourceName().getRscCategory(); FormLayout layout0 = new FormLayout(); topComp.setLayout(layout0); - // the resource category is the category for the colormaps - final String availColorMaps[] = ColorMapUtil.listColorMaps( cmapCategory ); - - final Combo colorMapNamesCombo = new Combo( topComp, SWT.READ_ONLY | SWT.DROP_DOWN ); - FormData fd = new FormData(); - fd.left = new FormAttachment( 50, -30 ); - fd.top = new FormAttachment( 0, 20 ); - colorMapNamesCombo.setLayoutData( fd ); - - colorMapNamesCombo.setItems( availColorMaps ); - int seldColorMapIndx = -1; - - for( int c=0 ; c queryList;//for legend DEG 2011-03- // baseTile.resourceChanged(ChangeType.CAPABILITY, this.getCapability( ColorMapCapability.class)); } + @Override + + public void resourceChanged(ChangeType type, Object object) { + if ( type != null && type == ChangeType.CAPABILITY ){ + if (object instanceof ImagingCapability ){ + ImagingCapability imgCap = getCapability(ImagingCapability.class); + ImagingCapability newImgCap = ( ImagingCapability ) object; + imgCap.setBrightness(newImgCap.getBrightness(), false); + imgCap.setContrast(newImgCap.getContrast(), false); + imgCap.setAlpha(newImgCap.getAlpha(), false); + radarRscData.setAlpha( imgCap.getAlpha() ); + radarRscData.setBrightness( imgCap.getBrightness() ); + radarRscData.setContrast( imgCap.getContrast() ); + issueRefresh(); + + + } + else if (object instanceof ColorMapCapability ){ + + ColorMapCapability colorMapCap = getCapability(ColorMapCapability.class); + ColorMapCapability newColorMapCap = (ColorMapCapability) object; + colorMapCap.setColorMapParameters(newColorMapCap.getColorMapParameters(), false); + ColorMap theColorMap = ( ColorMap ) colorMapCap.getColorMapParameters().getColorMap(); + String colorMapName = colorMapCap.getColorMapParameters().getColorMapName(); + radarRscData.setColorMapName( colorMapName ); + radarRscData.getRscAttrSet().setAttrValue( "colorMapName", colorMapName ); + ColorBarFromColormap cBar = radarRscData.getColorBar(); + cBar.setColorMap( theColorMap ); + radarRscData.getRscAttrSet().setAttrValue( "colorBar", cBar ); + radarRscData.setIsEdited( true ); + issueRefresh(); + + } + + } + + } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarResourceData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarResourceData.java index 509fa7e385..a127b940d0 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarResourceData.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarResourceData.java @@ -83,8 +83,41 @@ public class RadarResourceData extends AbstractNatlCntrsRequestableResourceData @XmlElement private ColorBarFromColormap colorBar; + + @XmlElement + private Float alpha; - private static RadarInfo rdrInfo = null; + @XmlElement + private Float brightness; + + @XmlElement + private Float contrast; + + public Float getAlpha() { + return alpha; + } + + public void setAlpha(Float alpha) { + this.alpha = alpha; + } + + public Float getBrightness() { + return brightness; + } + + public void setBrightness(Float brightness) { + this.brightness = brightness; + } + + public Float getContrast() { + return contrast; + } + + public void setContrast(Float contrast) { + this.contrast = contrast; + } + + private static RadarInfo rdrInfo = null; // The legend w/o the time prefix private String legendStr = null; diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ADBUFF.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ADBUFF.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/AREAFL.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/AREAFL.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/BRIDGE.PRM b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/BRIDGE.PRM old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/CFCMN.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/CFCMN.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/COLTBL.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/COLTBL.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/CONTUR.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/CONTUR.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/CURVE.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/CURVE.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVACT.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVACT.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVCHR.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVCHR.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVREQ.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVREQ.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVSET.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVSET.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVWIN.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DEVWIN.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DGCMN.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DGCMN.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DVWNDW.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/DVWNDW.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/EQUAL.FNC b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/EQUAL.FNC old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ERMISS.FNC b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ERMISS.FNC old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ERROR.PRM b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ERROR.PRM old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/FUNCCODE.PRM b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/FUNCCODE.PRM old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GBUFF.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GBUFF.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GBUFFD.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GBUFFD.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GBUFFT.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GBUFFT.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GEMPRM.PRM b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GEMPRM.PRM old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GMBDTA.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GMBDTA.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GNUmakefile b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GNUmakefile old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GTBUFF.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/GTBUFF.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/IGDPT.FNC b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/IGDPT.FNC old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/IMGDEF.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/IMGDEF.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.AIX b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.AIX old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.HPUX b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.HPUX old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.IRIX b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.IRIX old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.Linux b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.Linux old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.Linux.gfortran b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.Linux.gfortran old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.OSF1 b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.OSF1 old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.PRM b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.PRM old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.SunOS b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.SunOS old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.ULTRIX b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/MCHPRM.ULTRIX old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/Nxm.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/Nxm.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/NxmTxt.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/NxmTxt.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/SATDEF.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/SATDEF.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/XYDEF.CMN b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/XYDEF.CMN old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/afbufr_common.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/afbufr_common.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/afbufr_structures.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/afbufr_structures.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/afcreatexml.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/afcreatexml.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/bfrcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/bfrcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/bridge.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/bridge.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cascmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cascmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cescmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cescmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflags.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflags.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflmdat.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflmdat.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflmnam.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflmnam.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflscandir.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflscandir.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflscnt.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cflscnt.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cgmcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cgmcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/check.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/check.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/color.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/color.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cpgcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cpgcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbdtget.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbdtget.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbdtpath.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbdtpath.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbdttmpl.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ctbdttmpl.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/curlib.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/curlib.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cvgdef.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/cvgdef.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dba2dtget.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dba2dtget.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbcmn.cmn b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbcmn.cmn old mode 100755 new mode 100644 index fa4e351b88..ef9c8ec510 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbcmn.cmn +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbcmn.cmn @@ -5,8 +5,8 @@ C************************************************************************ CHARACTER dbdttm*20, dbstid*6, dbstns*6, + dbdatasrc*20, dbparms*128, dbprmfile*20, + dbtimes(200)*20, dbtime*20, dburi*255, - + dbmodel*20, navtime*20, enstimes(200)*20, - + evtname*20, ensnames*500 + + dbmodel*30, navtime*20, enstimes(200)*20, + + evtname*30, ensnames*500 LOGICAL dbread, firstdb, gridtmdb, isnavtime, + isenstime, isevtname, isensnames INTEGER stnindx, idbstns, stnlat, stnlon, stnelv, diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbdatacallback.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbdatacallback.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbdiagcallback.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbdiagcallback.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbduricallback.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbduricallback.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbensm1.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbensm1.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbfhrscallback.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbfhrscallback.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbflnmcallback.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbflnmcallback.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetcycle.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetcycle.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetduri.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetduri.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetensmbrs.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetensmbrs.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetevtname.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetevtname.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetgarea.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetgarea.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetgnav.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetgnav.c old mode 100755 new mode 100644 index fce450292d..9ff32d47b6 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetgnav.c +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetgnav.c @@ -3,7 +3,7 @@ #include "dbcmn.h" #include -void db_getgnav (char *model, char *eventName, char *gridNav, int *lGridNav, int *iret ) +void db_getgnav (char *model, char *eventName,char *navTime, char *gridNav, int *lGridNav, int *iret ) /************************************************************************ * * * db_getgnav * @@ -32,7 +32,7 @@ void db_getgnav (char *model, char *eventName, char *gridNav, int *lGridNav, int *lGridNav = 0; gridNav[0] = '\0'; diagMessage[0] = '\0'; - sprintf (queryText, "%s|%s",model,eventName); + sprintf (queryText, "%s|%s|%s",model,eventName,navTime); /* * Execute the callback to get the navigation */ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetnavtime.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetnavtime.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetparm.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetparm.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetquerytext.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetquerytext.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetrdata.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetrdata.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetstinfo.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgetstinfo.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgfilenames.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgfilenames.c old mode 100755 new mode 100644 index 4d77ef3200..ef7c49158c --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgfilenames.c +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgfilenames.c @@ -20,7 +20,7 @@ int db_gFileNames ( const char *dir, int isearch, struct dirent ***ret_namelist) int possible_fileNames; int ii, jj, ier, ier1, len; int used, allocated,istmax; - char modelName[20], dbTag[5], ensTag[20], timeTmpl[75]; + char modelName[30], dbTag[5], ensTag[20], timeTmpl[75]; char *fileNames; char **starr; struct dirent *entry=NULL, *entry2=NULL; @@ -66,9 +66,27 @@ int db_gFileNames ( const char *dir, int isearch, struct dirent ***ret_namelist) sprintf ( timeTmpl, "%s", starr[3] ); } else { - for ( jj = 0; jj < max_number_components; jj++ ) free( starr[jj] ); - if( starr ) free( (char **)starr ); - return(0); + if ( istmax > 4 ) { + sprintf ( modelName, "%s", starr[0] ); + sprintf ( dbTag, "%s", starr[1] ); + sprintf ( ensTag, "%s", starr[2] ); + for ( jj = 3; jj < istmax; jj ++ ) { + if ( starr[jj][0] == '[' ) { + sprintf ( timeTmpl, "%s", starr[jj] ); + break; + } + else { + strcat ( ensTag,"_" ); + strcat ( ensTag,starr[jj] ); + } + } + istmax = 4; + } + else { + for ( jj = 0; jj < max_number_components; jj++ ) free( starr[jj] ); + if( starr ) free( (char **)starr ); + return(0); + } } /* diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgtim.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgtim.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgtimgrid.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbgtimgrid.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbinfo.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbinfo.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbinit.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbinit.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbisdbfile.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbisdbfile.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbmsgcave.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbmsgcave.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbnavcallback.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbnavcallback.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbrdtr.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbrdtr.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbrdtrgrid.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbrdtrgrid.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturndata.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturndata.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnduri.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnduri.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnfhrs.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnfhrs.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnflnm.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnflnm.c old mode 100755 new mode 100644 index 79d26796ab..caa1b3da6e --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnflnm.c +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnflnm.c @@ -6,10 +6,11 @@ void db_returnflnm(char *result) { int diagMessageLength=2000, ier; char diagMessage[diagMessageLength]; + char *flnmStr; /*----------------------------------------------------------------------*/ diagMessage[0] = '\0'; - sprintf (diagMessage, "%s %s", "back from Java result=", result); - db_msgcave ("db_returnflnm", "debug", diagMessage, &ier); +// sprintf (diagMessage, "%s %s", "back from Java result=", result); +// db_msgcave ("db_returnflnm", "debug", diagMessage, &ier); if ( flnmStrBack != NULL ) { G_FREE( flnmStrBack, char ); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnnav.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbreturnnav.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbrunquery.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbrunquery.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbscandb.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbscandb.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbseta2dtinfo.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbseta2dtinfo.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetdatasrc.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetdatasrc.f old mode 100755 new mode 100644 index 34e90f7e80..142beb93bb --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetdatasrc.f +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetdatasrc.f @@ -23,7 +23,7 @@ C************************************************************************ INCLUDE 'dbcmn.cmn' C* CHARACTER*(*) afile - CHARACTER carr1(25)*20, carr2(5)*25 + CHARACTER carr1(25)*50, carr2(6)*25,ens*120 CHARACTER message*720, funcnm*20, loglevel*6 C* C------------------------------------------------------------------------ @@ -67,7 +67,7 @@ c ELSE c dbmodel= carr1(num)(:ipos-2) c END IF - CALL ST_CLST ( carr1(num), '_', ' ', 5, carr2, + CALL ST_CLST ( carr1(num), '_', ' ', 6, carr2, + num2, ier ) IF ( num2 .eq. 2 ) THEN C @@ -87,11 +87,34 @@ C dbmodel= carr2(1)(:icarr2) CALL ST_LSTR ( carr2(3), icarr2, ier ) CALL DB_SETENSMBRS ( carr2(3)(:icarr2), ier ) + CALL ST_LSTR ( carr2(4), icarr2, ier ) + CALL DB_SETNAVTIME ( carr2(4)(:icarr2),ier ) message = "DB_SETDATASRC set dbmodel=" // dbmodel + // " set ens member =" // carr2(3)(:icarr2) + + // " set nav time=" // carr2(4)(:icarr2) CALL ST_NULL ( message, message, lenq, ier ) CALL DB_MSGCAVE ( funcnm, loglevel, message, ier ) - ELSE + ELSE IF ( num2 .gt. 4 ) THEN + CALL ST_LSTR ( carr2(1), icarr2, ier ) + dbmodel= carr2(1)(:icarr2) + CALL ST_LSTR ( carr2(3), icarr2, ier ) + ens = carr2(3)(:icarr2) + + DO ii = 4 , num2 - 1 + CALL ST_LSTR ( carr2(ii), icarr2, ier ) + CALL ST_LSTR ( ens,lenq, ier ) + ens = ens(1:lenq)//'_'//carr2(ii)(:icarr2) + ENDDO + CALL DB_SETENSMBRS ( ens, ier ) + CALL ST_LSTR ( carr2(num2), icarr2, ier ) + CALL DB_SETNAVTIME ( carr2(num2)(:icarr2),ier ) + message = "DB_SETDATASRC set dbmodel=" // dbmodel + + // " set ens member =" // ens + + // " set nav time=" // carr2(num2)(:icarr2) + CALL ST_NULL ( message, message, lenq, ier ) + CALL DB_MSGCAVE ( funcnm, loglevel, message, ier ) + + ELSE C C* TODO - improve the error handling C diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetensmbrs.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetensmbrs.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetevtname.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetevtname.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetnavtime.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbsetnavtime.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbwsetevtname.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbwsetevtname.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbwsetnavtime.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dbwsetnavtime.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/de.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/de.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dedriv.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dedriv.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dembr1.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dembr1.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/depend.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/depend.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/desavg.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/desavg.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/descan.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/descan.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcfixa.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcfixa.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcgrid.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcgrid.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcndtm.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcndtm.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcnfil.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcnfil.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcnrdt.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcnrdt.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcntim.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcntim.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcqtms.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcqtms.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcsubg.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcsubg.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcvecr.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgcvecr.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgfall.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgfall.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgintl.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgintl.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgkxky.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgkxky.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgprft.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dgprft.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmchkf.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmchkf.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmcmn.cmn b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmcmn.cmn old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmcsrc.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmcsrc.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmdcsr.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmdcsr.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgetf.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgetf.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgetgnav.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgetgnav.f old mode 100755 new mode 100644 index 3290690559..1019e15c7e --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgetgnav.f +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgetgnav.f @@ -37,7 +37,7 @@ C REAL rheadr (*) CHARACTER navstr*256, gridnav(10)*60, proj*3, - + amodel*21,anevent*20 + + amodel*30,anevent*30,nvtime*20 C------------------------------------------------------------------------ nword = 0 sign = 1. @@ -50,7 +50,10 @@ C------------------------------------------------------------------------ c CALL ST_NULL ( evtname, evtname, lstr, ier ) CALL DB_GETEVTNAME ( anevent, ier ) CALL ST_NULL ( anevent, anevent, lstr, ier ) - CALL DB_GETGNAV (amodel,anevent, navstr, lnavstr, iret ) + CALL DB_GETNAVTIME ( nvtime,ier ) + CALL ST_NULL ( nvtime,nvtime, lstr, ier ) + CALL DB_GETGNAV (amodel,anevent,nvtime, navstr, + + lnavstr,iret) c print *, "after DB_GETGNAV ", navstr, lnavstr IF ( iret .ne. 0 .or. lnavstr .eq. 0 ) THEN iret = -7 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgtim.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmgtim.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmlssf.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmlssf.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmlstn.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmlstn.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmltim.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmltim.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmnext.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmnext.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmopen.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmopen.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmpart.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmpart.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmpsrc.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmpsrc.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrclh.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrclh.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrdtr.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrdtr.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrfhr.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrfhr.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrlbl.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmrlbl.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmsrch.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmsrch.f old mode 100755 new mode 100644 index c491c7e37f..2cfc227073 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmsrch.f +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/dmsrch.f @@ -36,8 +36,8 @@ C INTEGER intdtf (3), level (2) CHARACTER dttim*20, qtype*8,garea*30,stinfo*25, + astnstr(4)*10, gdattm (2)*22, parm*14, - + vcord*5, src*21, datauri*254, amodel*21, - + anevent*20 + + vcord*5, src*21, datauri*254, amodel*30, + + anevent*30 c CHARACTER dbstn*4 CHARACTER message*720, funcnm*8, logdebug*6, logerror*6, + loginfo*6 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/drwids.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/drwids.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/drwtbl.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/drwtbl.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ensdiag.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ensdiag.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ercmn.cmn b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ercmn.cmn old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ercwmsg.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ercwmsg.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ergerrmsg.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ergerrmsg.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ergnumerr.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ergnumerr.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/erinit.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/erinit.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/erlmsg.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/erlmsg.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ermmsg.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ermmsg.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ersmsg.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ersmsg.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/erwmsg.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/erwmsg.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/fortran_wrappers.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/fortran_wrappers.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/g_error.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/g_error.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gb2def.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gb2def.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdaddt.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdaddt.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdcopen.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdcopen.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdinit.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdinit.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdldta.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdldta.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdlist.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdlist.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdofil.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdofil.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdopen.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdopen.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdrdat.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdrdat.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdrdatw.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdrdatw.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdsrtt.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gdsrtt.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/geminc.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/geminc.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/geminc.h.AIX b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/geminc.h.AIX old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gemprm.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gemprm.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ggcmaps.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ggcmaps.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gginit.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gginit.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ggsdev.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/ggsdev.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gpc.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gpc.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grcrnav.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grcrnav.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grcsscl.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grcsscl.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grdcmn.cmn b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grdcmn.cmn old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grib2.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grib2.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grsscl.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/grsscl.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gsdeva.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/gsdeva.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/hints.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/hints.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/imgdef.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/imgdef.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/inbdta.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/inbdta.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/incoutt.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/incoutt.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/incscal.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/incscal.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/initpc.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/initpc.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/lcabnd.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/lcabnd.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/lcgare.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/lcgare.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/libdepends.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/libdepends.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/link.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/link.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/nmpdef.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/nmpdef.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/nmsdef.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/nmsdef.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/no_xm_geminc.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/no_xm_geminc.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pccmn.cmn b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pccmn.cmn old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pcinit.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pcinit.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pgcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pgcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pgprm.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pgprm.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_bfr.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_bfr.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_bridge.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_bridge.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cap.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cap.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cas.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cas.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cgemlib.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cgemlib.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cgr.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cgr.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_clo.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_clo.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cmd.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cmd.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cmm.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_cmm.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_ctb.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_ctb.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_dg.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_dg.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_gemlib.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_gemlib.h old mode 100755 new mode 100644 index c042066065..507f285490 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_gemlib.h +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_gemlib.h @@ -188,7 +188,7 @@ void db_getQueryText ( char *queryType, char *queryText, int *iret ); void db_getduri ( char *queryType, char *source, char *model, char *dattim, char *vcord, char *parm, char *evtname, int *level, int *level2, char *dataURI, int *lDataURI, int *iret ); -void db_getgnav ( char *model, char *eventName, char *gridNav, int *lGridNav, int *iret ); +void db_getgnav ( char *model, char *eventName, char *navTime,char *gridNav, int *lGridNav, int *iret ); void db_gtimgrid ( char *gridTimes, int *lGridTimes, int *iret ); void db_getRData ( char *dbHost, char *fileName, float *rdata, int *nword, int *iret ); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_gpc.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_gpc.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_grc.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_grc.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_na.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_na.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_nfax.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_nfax.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_nmaplib.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_nmaplib.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_nxmlib.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_nxmlib.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_textlib.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_textlib.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_uka.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_uka.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_vf.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_vf.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_vg.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_vg.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_xw.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/proto_xw.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pscmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/pscmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/scnfll.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/scnfll.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/sfcmn.cmn b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/sfcmn.cmn old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/shapefil.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/shapefil.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/shpprm.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/shpprm.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/so_new.csh b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/so_new.csh old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/spfcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/spfcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/stclst.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/stclst.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/stilst.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/stilst.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/subdirs.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/subdirs.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/target.mk b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/target.mk old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/tester.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/tester.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/testso_link b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/testso_link old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/tgcdual.c b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/tgcdual.c old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/tgdual.f b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/tgdual.f old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/uscore.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/uscore.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/uscore.h_mine b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/uscore.h_mine old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/usrtbl.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/usrtbl.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/vgftbl.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/vgftbl.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/vgstruct.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/vgstruct.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/vgtag.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/vgtag.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwgui.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwgui.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwpcmn.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwpcmn.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwprm.h b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/dgdriv_c/xwprm.h old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/gov.noaa.nws.ncep.viz.rsc.ncgrid.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/gov.noaa.nws.ncep.viz.rsc.ncgrid.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/EnsembleFcstGridContours.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/EnsembleFcstGridContours.xml index e98c976a3a..8ef49c10d7 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/EnsembleFcstGridContours.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/EnsembleFcstGridContours.xml @@ -28,6 +28,8 @@ ${GLEVEL} ${GVCORD} ${GDPFUN} + ${SKIP} + ${FILTER} ${SCALE} ${TITLE} ${COLORS} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/ModelFcstGridContours.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/ModelFcstGridContours.xml index a2d682f374..1e54e16ada 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/ModelFcstGridContours.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/localization/ncep/resourceTemplates/ModelFcstGridContours.xml @@ -25,6 +25,8 @@ ${GDFILE} ${GVCORD} ${GDPFUN} + ${SKIP} + ${FILTER} ${SCALE} ${TITLE} ${COLORS} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/plugin.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/plugin.xml index 219ac8b2df..66b2d96015 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/plugin.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/plugin.xml @@ -47,6 +47,20 @@ ncResourceName="ModelFcstGridContours"> + + + + + + + + + + + + -"> + * * @author bsteffen * @version 1.0 */ -public abstract class AbstractGriddedDisplay implements IRenderable { +public abstract class AbstractGriddedDisplay { //implements IRenderable private static final IUFStatusHandler statusHandler = UFStatus.getHandler(AbstractGriddedDisplay.class); @@ -86,7 +88,9 @@ public abstract class AbstractGriddedDisplay implements IRenderable { protected RGB color; - protected double density = 1.0; + protected int skipx; + protected int skipy; + protected double filter; protected double magnification = 1.0; @@ -130,11 +134,100 @@ public abstract class AbstractGriddedDisplay implements IRenderable { * com.raytheon.viz.core.drawables.IRenderable#paint(com.raytheon.viz.core * .IGraphicsTarget, com.raytheon.viz.core.drawables.PaintProperties) */ - @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) + // @Override + public void paint(NcgridResourceData gridRscData, IGraphicsTarget target, PaintProperties paintProps) throws VizException { - boolean globalModel = isGlobalModel(); + boolean globalModel = isGlobalModel(); + + /** + * Get filter attribute + */ + String den = gridRscData.getFilter(); + String noFilter = ""; + if (den != null ){ + try { + if (den.equalsIgnoreCase("YES") || den.equalsIgnoreCase("Y")) { + filter = 1.0; + } + else if (den.equalsIgnoreCase("NO") || den.equalsIgnoreCase("N") || den.equalsIgnoreCase("")) { + filter = 0.0; + noFilter = "NO"; + } + else { + filter = Double.parseDouble(den); + } + + if (filter == 0) + noFilter = "NO"; + if (filter <0.1) + filter = 0.1; + } + catch (NumberFormatException e) { + System.out.println("The filter is not a double number"); + filter = 1.0; + } + } + else { + filter = 1.0; + } + +// /** +// * Get skip attribute +// */ +// +// String[] skip = null; +// int skipx = 0; +// int skipy = 0; +// +// String skipString = gridRscData.getSkip(); //now for positive skip +// if (skipString != null && noFilter.equalsIgnoreCase("NO")) { +// int ind = skipString.indexOf("/"); +// if (ind != -1) { +// skipString = skipString.substring(ind +1); +// +// if (skipString.trim().startsWith("-")) //temp fix for negative value +// skipString = skipString.substring(1); +// +// skip = skipString.split(";"); +// +// if (skip != null && skip.length !=0){ +// try { +// skipx = Integer.parseInt(skip[0]); +// } +// catch (NumberFormatException e) { +// System.out.println("The skip is not an interger"); +// skipx = 0; +// } +// +// if (skip.length ==1 ) { +// skipy = skipx; +// } +// if (skip.length >1 && skip[0] != skip[1]) { +// try { +// skipy = Integer.parseInt(skip[1]); +// } +// catch (NumberFormatException e) { +// System.out.println("The skip is not an interger"); +// skipy = skipx; +// } +// } +// } +// else { +// skipx = 0; +// skipy = 0; +// } +// } +// else { +// skipx = 0; +// skipy = 0; +// } +// } +// else { +// skipx = 0; +// skipy = 0; +// } +// for (int i = 0; i < (gridDims[0] * gridDims[1]); i++) isPlotted[i] = false; @@ -149,8 +242,9 @@ public abstract class AbstractGriddedDisplay implements IRenderable { IExtent viewPixelExtent = paintProps.getView().getExtent(); double ratio = viewPixelExtent.getWidth() / paintProps.getCanvasBounds().width; - double interval = size * .75 * ratio / Math.min(2.0, density); - double halfInterval = interval / 2; + + //double interval = size * .75 * ratio / Math.min(2.0, filter); + double interval = size * .75 * ratio * filter; double adjSize = size * ratio * magnification; @@ -259,8 +353,8 @@ public abstract class AbstractGriddedDisplay implements IRenderable { */ // If the real loc of this grid coordinate is close to the // loc we wanted go with it - if (Math.abs(plotLoc.y - j) < halfInterval - && Math.abs(plotLoc.x - i) < halfInterval) { + if (Math.abs(plotLoc.y - j) < (interval/2) + && Math.abs(plotLoc.x - i) < (interval/2)) { j = plotLoc.y; thisRow.put(j, plotLoc.x); } else { @@ -294,14 +388,13 @@ public abstract class AbstractGriddedDisplay implements IRenderable { paintImage((int)gridCell.x, (int)gridCell.y, pp, adjSize); } } - } - + } } - - } + } //while } catch (Exception e) { throw new VizException("Error occured during paint", e); } + if (calculationQueue.size() > 0) { if (this.calculationJob == null) { this.calculationJob = new CalculationJob(); @@ -357,12 +450,12 @@ public abstract class AbstractGriddedDisplay implements IRenderable { } /** - * @param density - * the density to set + * @param filter + * the filter to set. Changed from density. */ - public boolean setDensity(double density) { - if (this.density != density) { - this.density = density; + public boolean setFilter(double filter) { + if (this.filter != filter) { + this.filter = filter; return true; } return false; diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourAttributes.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourAttributes.java index f9b46123ca..23817333b8 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourAttributes.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourAttributes.java @@ -6,6 +6,10 @@ public class ContourAttributes { private String gvcord; + private String skip; + + private String filter; + private String scale; private String gdpfun; @@ -44,7 +48,22 @@ public class ContourAttributes { this.gvcord = gvcord; } - + public String getSkip() { + return skip; + } + + public void setSkip(String skip) { + this.skip = skip; + } + + public String getFilter() { + return filter; + } + + public void setFilter(String filter) { + this.filter = filter; + } + public String getScale() { return scale; } @@ -137,6 +156,8 @@ public class ContourAttributes { boolean match = false; if ( this.glevel.trim().equalsIgnoreCase(attr.getGlevel())&& this.gvcord.trim().equalsIgnoreCase(attr.getGvcord()) && + this.skip.trim().equalsIgnoreCase(attr.getSkip()) && + this.filter.trim().equalsIgnoreCase(attr.getFilter()) && this.scale.trim().equalsIgnoreCase(attr.getScale()) && this.gdpfun.trim().equalsIgnoreCase(attr.getGdpfun()) && this.type.trim().equalsIgnoreCase(attr.getType())&& diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourCalculationReentrantLock.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourCalculationReentrantLock.java new file mode 100644 index 0000000000..43424337f3 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourCalculationReentrantLock.java @@ -0,0 +1,18 @@ +package gov.noaa.nws.ncep.viz.rsc.ncgrid.contours; + +import java.util.concurrent.locks.*; +/** + * @author xguo + * + */ +public class ContourCalculationReentrantLock { + public static ReentrantLock contourLock = new ReentrantLock (); + + public static void getReentrantLock () { + contourLock.lock(); + } + + public static void releaseReentrantLock () { + contourLock.unlock(); + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourManagerJob.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourManagerJob.java index e66a10a41a..e8d1f4b6bf 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourManagerJob.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourManagerJob.java @@ -19,8 +19,6 @@ ******************************************************************************************/ package gov.noaa.nws.ncep.viz.rsc.ncgrid.contours; -import gov.noaa.nws.ncep.viz.rsc.ncgrid.Activator; - import java.util.HashMap; import java.util.Map; @@ -31,7 +29,6 @@ import org.eclipse.core.runtime.jobs.Job; import org.geotools.coverage.grid.GeneralGridGeometry; import org.opengis.referencing.operation.MathTransform; -import com.raytheon.uf.common.datastorage.records.FloatDataRecord; import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget; @@ -53,6 +50,7 @@ import gov.noaa.nws.ncep.viz.rsc.ncgrid.contours.ContourSupport.ContourGroup; * ------------ ---------- ----------- -------------------------- * Oct 24, 2007 chammack Initial Creation. * Mar 01, 2010 #164 M. Li Applied to NC Perspective + * Feb 15, 2012 X. Guo Cached contour information * * * @@ -73,7 +71,8 @@ public class ContourManagerJob extends Job { double currentDensity, MathTransform worldGridToCRSTransform, GeneralGridGeometry imageGridGeometry, GeneralGridGeometry mapGridGeometry, IGraphicsTarget target, - IMapDescriptor descriptor, ContourAttributes attr, String name, float zoom) { + IMapDescriptor descriptor, ContourAttributes attr, String name, float zoom, + ContourGroup contourGp) { super(); this.record = record; this.level = level; @@ -87,6 +86,7 @@ public class ContourManagerJob extends Job { this.zoom = zoom; this.currentDensity = currentDensity; this.name = name; + this.contourGroup = contourGp; } IDataRecord record; @@ -112,6 +112,8 @@ public class ContourManagerJob extends Job { String name; float zoom; + + ContourGroup contourGroup; } @@ -157,7 +159,8 @@ public class ContourManagerJob extends Job { MathTransform worldGridToCRSTransform, GeneralGridGeometry imageGridGeometry, GeneralGridGeometry mapGridGeometry, IGraphicsTarget target, - IMapDescriptor descriptor, ContourAttributes attr, String name, float zoom) { + IMapDescriptor descriptor, ContourAttributes attr, String name, float zoom, + ContourGroup contourGp) { synchronized (ContourManagerJob.class) { @@ -179,7 +182,7 @@ public class ContourManagerJob extends Job { // later Request req = new Request(record, level, extent, currentDensity, worldGridToCRSTransform, imageGridGeometry, - mapGridGeometry, target, descriptor, attr, name, zoom); + mapGridGeometry, target, descriptor, attr, name, zoom,contourGp); this.requestMap.put(identifier, req); if (this.getState() != Job.RUNNING) { @@ -209,13 +212,19 @@ public class ContourManagerJob extends Job { } Request req = requestMap.get(keyToProcess); - try { -// long t0 = System.currentTimeMillis(); +// try { +/* long t0 = System.currentTimeMillis(); ContourSupport.ContourGroup cg = ContourSupport.createContours(req.record, req.level, req.pixelExtent, req.currentDensity, req.worldGridToCRSTransform, req.imageGridGeometry, - req.mapGridGeometry, req.target, req.descriptor, req.attr, req.name, req.zoom); - + req.mapGridGeometry, req.target, req.descriptor, req.attr, req.name, req.zoom, + req.contourGroup);*/ + ContourSupport cntrSp = new ContourSupport(req.record, + req.level, req.pixelExtent, req.currentDensity, + req.worldGridToCRSTransform, req.imageGridGeometry, + req.mapGridGeometry, req.target, req.descriptor, req.attr, req.name, req.zoom, + req.contourGroup); + ContourSupport.ContourGroup cg = cntrSp.getContours (); // System.out.println("Total time taken: " // + (System.currentTimeMillis() - t0)); @@ -223,12 +232,12 @@ public class ContourManagerJob extends Job { responseMap.put(keyToProcess, cg); requestMap.remove(keyToProcess); } - } catch (VizException e) { - System.err.println("Error creating " + req.attr.getGdpfun().trim().toUpperCase() + " contours: "); +// } catch (VizException e) { +// System.err.println("Error creating " + req.attr.getGdpfun().trim().toUpperCase() + " contours: "); // return new Status(Status.ERROR, Activator.PLUGIN_ID, // "Error creating " + gfunc.toUpperCase() + " contours: ", e); // - } +// } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourRenderable.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourRenderable.java index 6eca322b83..1d5f9525fc 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourRenderable.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourRenderable.java @@ -4,6 +4,8 @@ import gov.noaa.nws.ncep.gempak.parameters.line.LineDataStringParser; import gov.noaa.nws.ncep.viz.common.ui.color.GempakColor; import gov.noaa.nws.ncep.viz.rsc.ncgrid.contours.ContourSupport.ContourGroup; +import java.util.ArrayList; +import java.util.HashMap; import java.util.UUID; import org.eclipse.swt.graphics.RGB; @@ -21,6 +23,7 @@ import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; import com.raytheon.uf.viz.core.map.MapDescriptor; +import com.vividsolutions.jts.geom.Geometry; /** * Generalized contour renderable @@ -37,6 +40,10 @@ import com.raytheon.uf.viz.core.map.MapDescriptor; * Mar 08, 2011 M. Li abstract class -> general class * Apr 05, 2011 M. Li increase threading retries from 10 to 100 * Nov,02, 2011 X. Guo Added HILO relative + * Feb,15, 2012 X. Guo Cached contour information + * Mar,01, 2012 X. Guo Handle five zoom levels + * Mar,13, 2012 X. Guo Added createContours() + * Mar,15, 2012 X. Guo Set synchronized block in ContoutSupport * * * @@ -48,7 +55,7 @@ public class ContourRenderable implements IRenderable { private ContourGroup[] contourGroup; - private final IMapDescriptor descriptor; + private IMapDescriptor descriptor; private LineStyle lineStyle; @@ -65,6 +72,8 @@ public class ContourRenderable implements IRenderable { private static final int NUMBER_CONTOURING_LEVELS = 5; private int actual_contour_level = 1 ; + + private boolean reproj; // public abstract IDataRecord getData(); // @@ -87,6 +96,12 @@ public class ContourRenderable implements IRenderable { private IFont font; private String name; + + private String cint; + + private double defaultZoomLevel; + + private double zoomLevelInterval; /** @@ -111,6 +126,8 @@ public class ContourRenderable implements IRenderable { this.gridGeometry = gridGeometry; this.contourAttributes = contourAttributes; this.name = fullName; + this.defaultZoomLevel = 0.0; + this.zoomLevelInterval = 0.0; } /* @@ -121,147 +138,117 @@ public class ContourRenderable implements IRenderable { * .IGraphicsTarget, com.raytheon.viz.core.drawables.PaintProperties) */ @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - - synchronized (this) { + public void paint (IGraphicsTarget target, PaintProperties paintProps) throws VizException { - LineDataStringParser lineAttr = new LineDataStringParser(contourAttributes.getLine()); - this.color = GempakColor.convertToRGB(lineAttr.getInstanceOfLineBuilder().getLineColorsList().get(0)); - this.lineStyle = lineAttr.getInstanceOfLineBuilder().getLineStyleList().get(0); - this.outlineWidth = lineAttr.getInstanceOfLineBuilder().getLineWidthList().get(0); - - if (contourGroup == null) { - if (contourAttributes.getCint() != null ) { - String[] cintArray = contourAttributes.getCint().trim().split(">"); - actual_contour_level = cintArray.length+1; - } - - if (actual_contour_level > NUMBER_CONTOURING_LEVELS ) - actual_contour_level = NUMBER_CONTOURING_LEVELS; + initContourGroup ( paintProps ); + + double density = 1.0;//paintProps.getDensity(); + double magnification = 1.0; //paintProps.getMagnification(); + + if (density > 4.0f) { + density = 4.0f; + } + + if (contourGroup != null) { + if (this.lastMagnification != magnification || font == null) { + this.lastMagnification = magnification; + if (this.font != null) { + font.dispose(); + } + font = target.getDefaultFont(); + + font = target.initializeFont(font.getFontName(), + (float) (font.getFontSize() / 1.4 * magnification), + null); + } + + int i = contourGroup.length - 1; +// double mapWidth = ((MapDescriptor) this.descriptor) +// .getMapWidth(); +// double widthInMeters = mapWidth * paintProps.getZoomLevel(); + double rangeHi, rangeLo,zoomlvl; + zoomlvl = paintProps + .getView().getExtent().getWidth()/paintProps + .getCanvasBounds().width; + while (i >= 0) { + rangeHi = Double.MAX_VALUE; + rangeLo = 0.0; + if ( contourGroup.length > 1 ) { + if ( i == contourGroup.length - 1) { + rangeLo = zoomLevelInterval /2 + ( i-1)*zoomLevelInterval; + } + else if ( i == 0 ){ + rangeHi = zoomLevelInterval /2; + } + else { + rangeHi = zoomLevelInterval /2 + i*zoomLevelInterval; + rangeLo = zoomLevelInterval /2 + ( i-1)*zoomLevelInterval; + } +// System.out.println ( "==actual_contour_level:"+ actual_contour_level +" zoomLevelInterval:"+zoomLevelInterval + " zoomlvl:" + zoomlvl + " rangeHi:"+ rangeHi + " rangeLo:" + rangeLo); + } +// double curlvl = (METERS_AT_BASE_ZOOMLEVEL) +// * (Math.pow(ZOOM_REACTION_FACTOR, i)); + if ( rangeHi >= zoomlvl && zoomlvl > rangeLo ) { - contourGroup = new ContourGroup[actual_contour_level]; - } - double density = 1.0;//paintProps.getDensity(); - double magnification = 1.0; //paintProps.getMagnification(); + // Run contours if: + // 1. Contours was never ran before -or- + // 2. The area currently viewed is outside of the + // contoured window -or- + // 3. The density has changed + if (contourGroup[i] == null || getMapProject() + || contourGroup[i].lastDensity != density) { - if (density > 4.0f) { - density = 4.0f; - } + MathTransform mathTransformFromGrid = gridGeometry.getGridToCRS(PixelInCell.CELL_CORNER); - if (contourGroup != null) { - if (this.lastMagnification != magnification || font == null) { - this.lastMagnification = magnification; - if (this.font != null) { - font.dispose(); - } - font = target.getDefaultFont(); + // If required data unavailable, quit now + if (mathTransformFromGrid == null + || data == null + || gridGeometry == null) { + return; + } - font = target.initializeFont(font.getFontName(), - (float) (font.getFontSize() / 1.4 * magnification), - null); - } + ContourGroup cg = null; + + float pixelDensity = (float) (paintProps + .getCanvasBounds().width / paintProps + .getView().getExtent().getWidth()); - int i = contourGroup.length - 1; - double mapWidth = ((MapDescriptor) this.descriptor) - .getMapWidth(); - double widthInMeters = mapWidth * paintProps.getZoomLevel(); - - while (i >= 0) { - double curlvl = (METERS_AT_BASE_ZOOMLEVEL) - * (Math.pow(ZOOM_REACTION_FACTOR, i)); + ContourSupport cntrSp = new ContourSupport(data, contourGroup.length-i-1, + paintProps.getView().getExtent(), + density, mathTransformFromGrid, + gridGeometry, + descriptor.getGridGeometry(), target, + descriptor, contourAttributes, name, pixelDensity, + contourGroup[i]); + cntrSp.createContours(); + cg = cntrSp.getContours (); - if (widthInMeters <= curlvl || i == 0) { - boolean contains = (contourGroup[i] == null || contourGroup[i].lastUsedPixelExtent == null) ? false - : (contourGroup[i].lastUsedPixelExtent - .getEnvelope() - .contains(((PixelExtent) paintProps - .getView().getExtent()) - .getEnvelope())); - // Run contours if: - // 1. Contours was never ran before -or- - // 2. The area currently viewed is outside of the - // contoured window -or- - // 3. The density has changed - if (contourGroup[i] == null || !contains - || contourGroup[i].lastDensity != density) { + if (cg != null) { + // Dispose old wireframe shapes + disposeContourGroup (contourGroup[i]); + + contourGroup[i] = new ContourGroup(); + contourGroup[i].zoomLevel = cg.zoomLevel; + contourGroup[i].posValueShape = cg.posValueShape; + contourGroup[i].negValueShape = cg.negValueShape; + contourGroup[i].fillShapes = cg.fillShapes; + contourGroup[i].parent = cg.parent; + contourGroup[i].lastUsedPixelExtent = cg.lastUsedPixelExtent; + contourGroup[i].lastDensity = cg.lastDensity; + contourGroup[i].cvalues = new ArrayList(cg.cvalues); + contourGroup[i].fvalues = new ArrayList(cg.fvalues); + contourGroup[i].data = new HashMap< String, Geometry>(cg.data); + contourGroup[i].grid = cg.grid; + contourGroup[i].posValueShape.compile(); + contourGroup[i].negValueShape.compile(); + contourGroup[i].fillShapes.compile(); + } + else { + target.setNeedsRefresh(true); + } + } - MathTransform mathTransformFromGrid = gridGeometry.getGridToCRS(PixelInCell.CELL_CORNER); - - // If required data unavailable, quit now - if (mathTransformFromGrid == null - || data == null - || gridGeometry == null) { - return; - } - - ContourGroup cg = null; - int retries = 0; - do { - - // calculate the pixel density - float pixelDensity = (float) (paintProps - .getCanvasBounds().width / paintProps - .getView().getExtent().getWidth()); - -// float zoomLevel = paintProps.getZoomLevel(); -// -// System.out.println(" pixelDensity="+pixelDensity+ " zoomLevel="+zoomLevel); - - cg = ContourManagerJob.getInstance().request( - uuid + "::" + this + "::" + i, - data, i, - paintProps.getView().getExtent(), - density, mathTransformFromGrid, - gridGeometry, - descriptor.getGridGeometry(), target, - descriptor, contourAttributes, name, pixelDensity); - - try { - if (cg == null - && paintProps.getLoopProperties() != null - && paintProps.getLoopProperties() - .isLooping()) { - - Thread.sleep(50); - } - } catch (InterruptedException e) { - // ignore - } - retries++; - } while (cg == null - && paintProps.getLoopProperties() != null - && paintProps.getLoopProperties() - .isLooping() && retries < 100); // Allow up to 5 seconds for contouring - - if (cg != null) { - // Dispose old wireframe shapes - if (contourGroup[i] != null - && contourGroup[i].posValueShape != null) { - contourGroup[i].posValueShape.dispose(); - } - - if (contourGroup[i] != null - && contourGroup[i].negValueShape != null) { - contourGroup[i].negValueShape.dispose(); - } - - if (contourGroup[i] != null - && contourGroup[i].fillShapes != null) { - contourGroup[i].fillShapes.dispose(); - } - - contourGroup[i] = cg; - contourGroup[i].posValueShape.compile(); - contourGroup[i].negValueShape.compile(); - contourGroup[i].fillShapes.compile(); - } else { - target.setNeedsRefresh(true); - } - - } - - LineStyle posLineStyle = null; + LineStyle posLineStyle = null; LineStyle negLineStyle = null; if (this.lineStyle == null) { posLineStyle = LineStyle.SOLID; @@ -310,19 +297,203 @@ public class ContourRenderable implements IRenderable { } } } - - target.setNeedsRefresh(true); - } - break; - } + target.setNeedsRefresh(true); + break; + } + i--; + } + } + } + public void paintContour(IGraphicsTarget target, PaintProperties paintProps) + throws VizException { + + synchronized (this) { + + LineDataStringParser lineAttr = new LineDataStringParser(contourAttributes.getLine()); + this.color = GempakColor.convertToRGB(lineAttr.getInstanceOfLineBuilder().getLineColorsList().get(0)); + this.lineStyle = lineAttr.getInstanceOfLineBuilder().getLineStyleList().get(0); + this.outlineWidth = lineAttr.getInstanceOfLineBuilder().getLineWidthList().get(0); + + + if (contourGroup != null) { + LineStyle posLineStyle = null; + LineStyle negLineStyle = null; + if (this.lineStyle == null) { + posLineStyle = LineStyle.SOLID; + negLineStyle = LineStyle.DASHED_LARGE; + } else { + posLineStyle = this.lineStyle; + negLineStyle = this.lineStyle; + } + + int i = contourGroup.length - 1; + + while (i >= 0) { + + if (contourGroup[i] != null + && paintProps.getView().getExtent().intersects( + contourGroup[i].lastUsedPixelExtent)) { + target.drawShadedShape(contourGroup[i].fillShapes , 0.5f); + + target.drawWireframeShape( + contourGroup[i].posValueShape, this.color, + this.outlineWidth, posLineStyle, font); + target.drawWireframeShape( + contourGroup[i].negValueShape, this.color, + this.outlineWidth, negLineStyle, font); + } i--; } } } } + public void createContours (IGraphicsTarget target, PaintProperties paintProps) throws VizException { + + initContourGroup ( paintProps ); + + double density = 1.0;//paintProps.getDensity(); + double magnification = 1.0; //paintProps.getMagnification(); + + if (density > 4.0f) { + density = 4.0f; + } + + if (contourGroup != null) { + if (this.lastMagnification != magnification || font == null) { + this.lastMagnification = magnification; + if (this.font != null) { + font.dispose(); + } + font = target.getDefaultFont(); + + font = target.initializeFont(font.getFontName(), + (float) (font.getFontSize() / 1.4 * magnification), + null); + } + + int i = contourGroup.length - 1; +// double mapWidth = ((MapDescriptor) this.descriptor) +// .getMapWidth(); +// double widthInMeters = mapWidth * paintProps.getZoomLevel(); + double rangeHi, rangeLo,zoomlvl; + zoomlvl = paintProps + .getView().getExtent().getWidth()/paintProps + .getCanvasBounds().width; + while (i >= 0) { + rangeHi = Double.MAX_VALUE; + rangeLo = 0.0; + if ( contourGroup.length > 1 ) { + if ( i == contourGroup.length - 1) { + rangeLo = zoomLevelInterval /2 + ( i-1)*zoomLevelInterval; + } + else if ( i == 0 ){ + rangeHi = zoomLevelInterval /2; + } + else { + rangeHi = zoomLevelInterval /2 + i*zoomLevelInterval; + rangeLo = zoomLevelInterval /2 + ( i-1)*zoomLevelInterval; + } +// System.out.println ( "==actual_contour_level:"+ actual_contour_level +" zoomLevelInterval:"+zoomLevelInterval + " zoomlvl:" + zoomlvl + " rangeHi:"+ rangeHi + " rangeLo:" + rangeLo); + } +// double curlvl = (METERS_AT_BASE_ZOOMLEVEL) +// * (Math.pow(ZOOM_REACTION_FACTOR, i)); + if ( rangeHi >= zoomlvl && zoomlvl > rangeLo ) { + + // Run contours if: + // 1. Contours was never ran before -or- + // 2. The area currently viewed is outside of the + // contoured window -or- + // 3. The density has changed + if (contourGroup[i] == null || getMapProject() + || contourGroup[i].lastDensity != density) { + + MathTransform mathTransformFromGrid = gridGeometry.getGridToCRS(PixelInCell.CELL_CORNER); + + // If required data unavailable, quit now + if (mathTransformFromGrid == null + || data == null + || gridGeometry == null) { + return; + } + + ContourGroup cg = null; + float pixelDensity = (float) (paintProps + .getCanvasBounds().width / paintProps + .getView().getExtent().getWidth()); + ContourSupport cntrSp = new ContourSupport(data, contourGroup.length-i-1, + paintProps.getView().getExtent(), + density, mathTransformFromGrid, + gridGeometry, + descriptor.getGridGeometry(), target, + descriptor, contourAttributes, name, pixelDensity, + contourGroup[i]); + cntrSp.createContours(); + cg = cntrSp.getContours (); + + if (cg != null) { + // Dispose old wireframe shapes + disposeContourGroup (contourGroup[i]); + + contourGroup[i] = new ContourGroup(); + contourGroup[i].zoomLevel = cg.zoomLevel; + contourGroup[i].posValueShape = cg.posValueShape; + contourGroup[i].negValueShape = cg.negValueShape; + contourGroup[i].fillShapes = cg.fillShapes; + contourGroup[i].parent = cg.parent; + contourGroup[i].lastUsedPixelExtent = cg.lastUsedPixelExtent; + contourGroup[i].lastDensity = cg.lastDensity; + contourGroup[i].cvalues = new ArrayList(cg.cvalues); + contourGroup[i].fvalues = new ArrayList(cg.fvalues); + contourGroup[i].data = new HashMap< String, Geometry>(cg.data); + contourGroup[i].grid = cg.grid; + contourGroup[i].posValueShape.compile(); + contourGroup[i].negValueShape.compile(); + contourGroup[i].fillShapes.compile(); + } + } + break; + } + i--; + } + } + } + + private void initContourGroup ( PaintProperties paintProps ) { + LineDataStringParser lineAttr = new LineDataStringParser(contourAttributes.getLine()); + this.color = GempakColor.convertToRGB(lineAttr.getInstanceOfLineBuilder().getLineColorsList().get(0)); + this.lineStyle = lineAttr.getInstanceOfLineBuilder().getLineStyleList().get(0); + this.outlineWidth = lineAttr.getInstanceOfLineBuilder().getLineWidthList().get(0); + + if (contourGroup == null) { + this.defaultZoomLevel = paintProps + .getView().getExtent().getWidth()/paintProps + .getCanvasBounds().width; + if (contourAttributes.getCint() != null ) { + String[] cintArray = contourAttributes.getCint().trim().split(">"); + actual_contour_level = cintArray.length; + this.cint = contourAttributes.getCint(); + } + + if (actual_contour_level > NUMBER_CONTOURING_LEVELS ) + actual_contour_level = NUMBER_CONTOURING_LEVELS; + + contourGroup = new ContourGroup[actual_contour_level]; + if ( actual_contour_level > 1) + this.zoomLevelInterval = this.defaultZoomLevel/(actual_contour_level-1); + } + else { + if ( this.defaultZoomLevel == 0.0 ) { + this.defaultZoomLevel = paintProps + .getView().getExtent().getWidth()/paintProps + .getCanvasBounds().width; + if ( actual_contour_level > 1) + this.zoomLevelInterval = this.defaultZoomLevel/(actual_contour_level-1); + } + } + } /** * Dispose the renderable */ @@ -350,6 +521,48 @@ public class ContourRenderable implements IRenderable { } + public void disposeInternal() { + if (contourGroup != null) { + for (ContourGroup c : contourGroup) { + if (c == null) { + continue; + } + + if (c.posValueShape != null) { + c.posValueShape.dispose(); + } + if (c.negValueShape != null) { + c.negValueShape.dispose(); + } + if (c.fillShapes != null) { + c.fillShapes.dispose(); + } + } + } + } + /** + * Dispose the contour group + */ + private void disposeContourGroup (ContourGroup contourGp ) { + // Dispose old wireframe shapes + if (contourGp != null ){ + if ( contourGp.posValueShape != null) + contourGp.posValueShape.dispose(); + if (contourGp.negValueShape != null) { + contourGp.negValueShape.dispose(); + } + if (contourGp.fillShapes != null) { + contourGp.fillShapes.dispose(); + } + if ( contourGp.cvalues != null ) + contourGp.cvalues.clear(); + if ( contourGp.fvalues != null ) + contourGp.fvalues.clear(); + if ( contourGp.data != null ) + contourGp.data.clear(); + } + } + public ContourAttributes getContourAttributes() { return contourAttributes; } @@ -358,6 +571,47 @@ public class ContourRenderable implements IRenderable { this.contourAttributes = contourAttributes; } + public void updatedContourRenderable () { + + if ( this.cint == null ) { + if (contourAttributes.getCint() != null ) { + String[] cintArray = contourAttributes.getCint().trim().split(">"); + actual_contour_level = cintArray.length; + this.cint = contourAttributes.getCint(); + } + + if (actual_contour_level > NUMBER_CONTOURING_LEVELS ) + actual_contour_level = NUMBER_CONTOURING_LEVELS; + + disposeInternal(); + contourGroup = new ContourGroup[actual_contour_level]; + if ( actual_contour_level > 1) + this.zoomLevelInterval = this.defaultZoomLevel/(actual_contour_level-1); + } + else { + if (contourAttributes.getCint() == null) { + actual_contour_level = 1; + this.cint = null; + disposeInternal(); + contourGroup = new ContourGroup[actual_contour_level]; + } + else { + if ( ! this.cint.equalsIgnoreCase(contourAttributes.getCint())){ + disposeInternal(); + String[] cintArray = contourAttributes.getCint().trim().split(">"); + actual_contour_level = cintArray.length; + this.cint = contourAttributes.getCint(); + if (actual_contour_level > NUMBER_CONTOURING_LEVELS ) + actual_contour_level = NUMBER_CONTOURING_LEVELS; + contourGroup = new ContourGroup[actual_contour_level]; + if ( actual_contour_level > 1) + this.zoomLevelInterval = this.defaultZoomLevel/(actual_contour_level-1); + } + } + } + + } + public IDataRecord getData() { return data; } @@ -381,4 +635,27 @@ public class ContourRenderable implements IRenderable { public void setGridRelativeHiLo (GridRelativeHiLoDisplay gridRelativeHiLoDisplay) { this.gridRelativeHiLoDisplay = gridRelativeHiLoDisplay; } + + public void setMapProject ( boolean proj){ + this.reproj = proj; + } + + private boolean getMapProject () { + return this.reproj; + } + public void setIMapDescriptor (IMapDescriptor descriptor) { + this.descriptor = descriptor; + this.defaultZoomLevel = 0.0; + } + public boolean isMatch ( ContourAttributes attr) { + boolean match = false; + + if ( this.contourAttributes.getGlevel().equalsIgnoreCase(attr.getGlevel())&& + this.contourAttributes.getGvcord().equalsIgnoreCase(attr.getGvcord()) && + this.contourAttributes.getScale().equalsIgnoreCase(attr.getScale()) && + this.contourAttributes.getGdpfun().equalsIgnoreCase(attr.getGdpfun()) ) { + match = true; + } + return match; + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourSupport.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourSupport.java index a37ffc65cd..d4a66af67e 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourSupport.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/ContourSupport.java @@ -34,11 +34,15 @@ import gov.noaa.nws.ncep.viz.tools.contour.FillGenerator; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeMap; +import java.util.concurrent.locks.*; + import org.eclipse.swt.graphics.RGB; import org.geotools.coverage.grid.GeneralGridGeometry; @@ -65,7 +69,6 @@ import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.core.drawables.IShadedShape; import com.raytheon.uf.viz.core.drawables.IWireframeShape; -import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateArrays; @@ -99,6 +102,12 @@ import com.vividsolutions.jts.linearref.LocationIndexedLine; * Aug 18, 2011 M. li fixed reproject problems for streamline * Nov 08, 2011 X. Guo Checked centeral_meridian and * added vertices twice after subtract 360 + * Feb 15, 2012 X. Guo Used cached contour information to re-create + * wired frame + * Mar 01, 2012 X. Guo Handle five zoom levels + * Mar 13, 2012 X. Guo Handle multi-threads + * Mar 15, 2012 X. Guo Refactor + * Mar 27, 2012 X. Guo Used contour lock instead of "synchronized" * * * @@ -109,8 +118,65 @@ public class ContourSupport { private static NcepLogger logger = NcepLoggerManager.getNcepLogger(ContourSupport.class); - private ContourSupport() { - // No constructor + //provided values + private IDataRecord records; + private int level; + private IExtent extent; + private double currentDensity; + private IMapDescriptor descriptor; + private ContourAttributes attr; + private String cint; + private String fint; + private String type; + private String fline; + private String name; + private float zoom; + + //calculated values + private ContourGroup contourGroup = null; + private MathTransform rastPosToWorldGrid = null; + private MathTransform rastPosToLatLon = null; + private MathTransform rastPosLatLonToWorldGrid = null; + private int zoomLevelIndex; + private ContourGridData cntrData = null; + private List cvalues; + private List fvalues; + private Set svalues; + private boolean isWorld0; + private boolean isCntrsCreated; + + /** + * Constructor + * + * @param records + * @param level + * @param extent + * @param currentDensity + * @param worldGridToCRSTransform + * @param imageGridGeometry + * @param mapGridGeometry + * @param target + * @param descriptor + * @param attr + * @param name + * @param zoom + * @param contourGp + * */ + public ContourSupport(IDataRecord records, int level, + IExtent extent, double currentDensity, + MathTransform worldGridToCRSTransform, + GeneralGridGeometry imageGridGeometry, + GeneralGridGeometry mapGridGeometry, IGraphicsTarget target, + IMapDescriptor descriptor, ContourAttributes attr, String name, float zoom, + ContourGroup contourGp) { + + initContourSupport ( records, level, + extent, currentDensity, + worldGridToCRSTransform, + imageGridGeometry, + mapGridGeometry, target, + descriptor, attr, name, zoom, + contourGp); } /** @@ -132,618 +198,177 @@ public class ContourSupport { public double lastDensity; public GridGeometry gridGeometry; + + public List cvalues; + + public List fvalues; + + public HashMap< String, Geometry> data; + + public LinearRing grid; } - /** - * Create contours from provided parameters - * - * @param record - * @param level - * @param extent - * @param currentDensity - * @param worldGridToCRSTransform - * @param imageGridGeometry - * @param mapGridGeometry - * @param target - * @param descriptor - * @param interval - * @return - * @throws VizException - */ - public static ContourGroup createContours(IDataRecord records, int level, + public class ContourGridData { + private float minValue; + private float maxValue; + private float[] data; + private int szX; + private int szY; + + public ContourGridData ( IDataRecord record ) { + maxValue = Float.MIN_VALUE; + minValue = Float.MAX_VALUE; + float[] data1D = null; + long[] sz = record.getSizes(); + + data1D = ((NcFloatDataRecord) record).getXdata(); + + szX = (int)sz[0]; + szY = (int)sz[1]; + data = new float[szX*szY]; + + for (int j = 0; j < szY; j++) { + for (int i = 0; i < szX; i++) { + data[szX * j + i] = data1D[(szX * j)+ i]; + if ( data[szX * j + i] != -999999.f ) { + maxValue = Math.max( maxValue, data[szX * j + i]); + minValue = Math.min( minValue, data[szX * j + i]); + } + } + } + } + + public float getMinValue () { + return minValue; + } + + public float getMaxValue () { + return maxValue; + } + + public float[] getData () { + return data; + } + public int getX () { + return szX; + } + + public int getY () { + return szY; + } + } + + public void initContourSupport(IDataRecord records, int level, IExtent extent, double currentDensity, MathTransform worldGridToCRSTransform, GeneralGridGeometry imageGridGeometry, GeneralGridGeometry mapGridGeometry, IGraphicsTarget target, - IMapDescriptor descriptor, ContourAttributes attr, String name, float zoom) - throws VizException { - - if (records == null || attr == null) return null; + IMapDescriptor descriptor, ContourAttributes attr, String name, float zoom, + ContourGroup contourGp) { + isCntrsCreated = true; + if ( records == null || attr == null ) { + isCntrsCreated = false; + return; + } + if ( ! initMathTransform (imageGridGeometry,mapGridGeometry) ) { + isCntrsCreated = false; + return; + } + this.records = records; + this.level = level; + this.extent = extent; + this.currentDensity = currentDensity; + this.descriptor = descriptor; + this.attr = attr; + this.cint = attr.getCint(); + this.type = attr.getType(); + this.fint = attr.getFint(); + this.fline = attr.getFline(); + this.name = name; + this.zoom = zoom; + this.cntrData = new ContourGridData(records); + this.isWorld0 = isWorld0(descriptor); - String cint = attr.getCint(); - String type = attr.getType(); - String fint = attr.getFint(); - String fline = attr.getFline(); + initContourGroup ( target,contourGp ); + } + /** + * Create contours from provided parameters + * + */ + public void createContours( ) { long t0 = System.currentTimeMillis(); - - ContourGroup contourGroup = new ContourGroup(); - contourGroup.lastDensity = currentDensity; - - contourGroup.posValueShape = target.createWireframeShape(false, - descriptor); - contourGroup.negValueShape = target.createWireframeShape(false, - descriptor); - contourGroup.fillShapes = target.createShadedShape(false, descriptor, true); - - contourGroup.zoomLevel = 1.0 / Math.pow(2.0, level); - + // Copy the pixel extent (deep copy required!) // expand by 50% to cover the subgrid expansion - PixelExtent workingExtent = (PixelExtent) extent.clone(); +/* PixelExtent workingExtent = (PixelExtent) extent.clone(); workingExtent.getEnvelope().expandBy(workingExtent.getWidth() * .5, - workingExtent.getHeight() * .5); - - // Recontour whenever outside by more than 25% - contourGroup.lastUsedPixelExtent = (PixelExtent) extent.clone(); - contourGroup.lastUsedPixelExtent.getEnvelope().expandBy( - contourGroup.lastUsedPixelExtent.getWidth() * .25, - contourGroup.lastUsedPixelExtent.getHeight() * .25); - - // Step 0: Set up necessary math transforms - - MathTransform rastPosToWorldGrid = null; - MathTransform rastPosToLatLon = null; - MathTransform rastPosLatLonToWorldGrid = null; - try { - /* - DefaultMathTransformFactory factory = new DefaultMathTransformFactory(); - MathTransform crsTransform1 = worldGridToCRSTransform; - - if (!imageGridGeometry.getCoordinateReferenceSystem().getName() - .equals(mapGridGeometry.getCoordinateReferenceSystem().getName())) { - crsTransform1 = factory.createConcatenatedTransform( - worldGridToCRSTransform, CRSCache.getInstance().findMathTransform( - imageGridGeometry.getCoordinateReferenceSystem(), - mapGridGeometry.getCoordinateReferenceSystem())); - } - - rastPosToWorldGrid = factory.createConcatenatedTransform( - crsTransform1, mapGridGeometry.getGridToCRS( - PixelInCell.CELL_CORNER).inverse());*/ - DefaultMathTransformFactory factory = new DefaultMathTransformFactory(); - - CoordinateReferenceSystem rastCrs = imageGridGeometry - .getCoordinateReferenceSystem(); - CoordinateReferenceSystem mapCrs = mapGridGeometry - .getCoordinateReferenceSystem(); - - MathTransform rastGridToCrs = imageGridGeometry - .getGridToCRS(PixelInCell.CELL_CORNER); - MathTransform mapCrsToGrid = mapGridGeometry.getGridToCRS( - PixelInCell.CELL_CORNER).inverse(); - - MathTransform rastCrsToLatLon = MapUtil - .getTransformToLatLon(rastCrs); - - MathTransform rastCrsToWorldGrid = MapUtil - .getTransformFromLatLon(mapCrs); - MathTransform crs2crs = CRSCache.getInstance().findMathTransform( - rastCrs, mapCrs); - - rastPosToWorldGrid = factory - .createConcatenatedTransform( - factory.createConcatenatedTransform(rastGridToCrs, - crs2crs), mapCrsToGrid); - - rastPosToLatLon = factory.createConcatenatedTransform( - rastGridToCrs, rastCrsToLatLon); - rastPosLatLonToWorldGrid = factory.createConcatenatedTransform( - rastCrsToWorldGrid,mapCrsToGrid); - } catch (Exception e) { - throw new VizException("Error building Transforms", e); - } - - - // Step 1:First determine the subgrid to contour - - int minX = 0; - int minY = 0; - int maxX = 0; - int maxY = 0; - - // Step 3: Get the actual data - + workingExtent.getHeight() * .5);*/ /* * Contours and/or color fills */ if (records instanceof NcFloatDataRecord && !((NcFloatDataRecord)records).isVector()) { - - float[] data1D = null; - long[] sz = records.getSizes(); - maxX = (int)sz[0] - 1; - maxY = (int)sz[1] - 1; - - data1D = ((NcFloatDataRecord) records).getXdata(); - records = null; - - // Step 4: Determine the subgrid, if any - int szX = (maxX - minX) + 1; - int szY = (maxY - minY) + 1; - int totalSz = szX * szY; - if (totalSz <= 0) { - return contourGroup; - } - - float[] adjusted1D = new float[totalSz]; - - for (int j = 0; j < szY; j++) { - for (int i = 0; i < szX; i++) { - adjusted1D[szX * j + i] = data1D[((int) sz[0] * (j + minY)) - + (i + minX)]; - } - } - data1D = null; - long t1 = System.currentTimeMillis(); - logger.info("Preparing " + name + " grid data took: " + (t1-t0)); + logger.debug("Preparing " + name + " grid data took: " + (t1-t0)); /* * ZoomLevel. */ -// int zoomLevelIndex = (int) Math.log(zoom + 7); // To be adjusted - int zoomLevelIndex = (int)(zoom / 2) + 1; // To be adjusted - if (zoomLevelIndex < 1) zoomLevelIndex = 1; - int maxZoomLevel = 5; - if (cint != null) maxZoomLevel = cint.trim().split(">").length; - if (zoomLevelIndex > maxZoomLevel ) zoomLevelIndex = maxZoomLevel; - if (zoomLevelIndex > 5 ) zoomLevelIndex = 5; - - ContourGenerator cgen = new ContourGenerator( adjusted1D, szX, szY); - adjusted1D = null; + initZoomIndex (); long t1a = System.currentTimeMillis(); - logger.info("new ContourGenerator took: " + (t1a-t1)); + logger.debug("new ContourGenerator took: " + (t1a-t1)); /* * Get contour values from CINT */ - List cvalues = null; - if (type.trim().toUpperCase().contains("C")) { - cvalues =CINT.parseCINT(cint, zoomLevelIndex, cgen.getMinValue(), cgen.getMaxValue()); - } - + cvalues = calcCintValue (); /* * Get color fill values from FINT and FLINE */ - List fvalues = null; - if (type.trim().toUpperCase().contains("F")) { - if ( !(fint.equalsIgnoreCase(cint)) ) { - fvalues = FINT.parseFINT(fint, zoomLevelIndex, cgen.getMinValue(), cgen.getMaxValue()); - } - else if (fint.equalsIgnoreCase(cint) && cvalues != null){ - fvalues = cvalues; - } - - } - + fvalues = calcFintValue (); /* * Combine contour and fill values */ - Set svalues = null; - if (cvalues != null && cvalues.size() > 0) svalues = new HashSet(cvalues); - if (fvalues != null && fvalues.size() > 0) { - if (svalues == null) - svalues = new HashSet(fvalues); - else - svalues.addAll(fvalues); + combineCintAndFillValues (); + + long t2 = System.currentTimeMillis(); + if ( svalues != null && svalues.size() > 0 ) { + genContour (); + } + else { + logger.debug("Re-load contour line values took: " + (t2-t1)); } - List allvalues = new ArrayList(svalues); - Collections.sort(allvalues); - - long t1b = System.currentTimeMillis(); - logger.info("Creating contour values took: " + (t1b-t1a)); - - cgen.setContourValues( allvalues ); -// System.out.println("Contour Values: "+cvalues); - - long t1c = System.currentTimeMillis(); - logger.info("ContourGenerator.setContourValues(allvalues) took: " + (t1c-t1b)); - System.out.println("ContourGenerator init took:" + (t1c-t0)); - - - try { - cgen.generateContours(); - } catch (ContourException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - - - - long t2 = System.currentTimeMillis(); - logger.info("ContourGenerator.generateContours() took: " + (t2-t1c)); - - System.out.println("Contour Computation took: " + (t2-t1c)); - - logger.info("Total generating contour line values took: " + (t2-t1)); - String cf_string = null; - long t3 = t2; - boolean isWorld0 = isWorld0(descriptor); /* * Create contour lines and labels wireframes */ - if (type.trim().toUpperCase().contains("C") && cvalues.size() > 0) { - List labelPoints = new ArrayList(512); - - // note: LineDataStringParser return 0 as default for labelFreq, that is wrong. - // So, I have parse it again here. by ML - int labelFreq = 1; - String[] tempLineStrs = attr.getLine().split("/"); - List labelValues = null; - if (tempLineStrs.length >= 4) { - if (tempLineStrs[3].trim().contains(";")) { - LineDataStringParser lineAttr = new LineDataStringParser(attr.getLine()); - labelValues = lineAttr.getInstanceOfLineBuilder().getLineLabelPresentList(); - } - else { - labelFreq = Math.abs(Integer.parseInt(tempLineStrs[3].trim())); - } - } - - - int n = 0; - long total_labeling_time = 0; - - for ( Double cval : cvalues ) { - float fval = (float) (cval * 1.0f); - boolean toLabel = false; - - // Label frequency - if (labelValues != null) { - for(Integer value : labelValues) { - if (value == Math.rint(fval)) { - toLabel = true; - break; - } - } - } - else { - if (labelFreq == 0) - toLabel = false; - else - toLabel = (n % labelFreq == 0) ? true : false; - } - -// System.out.println("label values = "+ fval + " tolabel = " + toLabel); - - Geometry g = cgen.getContours(fval); - if ( g == null ) continue; -// contourMap.put( cval, g); - double[][] screen1 = null; - for ( int i=0; i < g.getNumGeometries(); i++ ) { - Geometry gn = g.getGeometryN(i); - double[][] screen = toScreen( gn.getCoordinates(), rastPosToWorldGrid, minX, minY ); - - contourGroup.negValueShape.addLineSegment(screen); - if ( isWorld0 ) { - screen1 = toScreenSubtract360( gn.getCoordinates(), rastPosToLatLon,rastPosLatLonToWorldGrid, minX, minY ); - - contourGroup.negValueShape.addLineSegment(screen1); - } - if (toLabel) { - long tl0 = System.currentTimeMillis(); -// prepareLabel(contourGroup, zoom, fval, -// labelPoints, screen); - createContourLabel(extent, contourGroup, fval, screen); - if ( isWorld0 && screen1 != null) { - createContourLabel(extent, contourGroup, fval, screen1); - } - long tl1 = System.currentTimeMillis(); - total_labeling_time += (tl1-tl0); - } - } - - n++; - } - - t3 = System.currentTimeMillis(); - logger.info("Creating label wireframes took: " + total_labeling_time); - logger.info("Creating contour line wireframes took: " + (t3 - t2 - total_labeling_time)); - System.out.println("Creating contour line wireframes took: " + (t3 - t2 - total_labeling_time)); - - cf_string = "Contouring"; - } - - - + createContourLines (); /* * Create color fills */ - if (type.trim().toUpperCase().contains("F") && fvalues.size() > 0) { - - try { - // Prepare colors for color fills - List fillColorsIndex = new ArrayList(); - if (fline == null || fline.trim().length() < 1) { - for(int i = 0; i < fvalues.size()+2; i++) { - if (i <= 30) - fillColorsIndex.add(i + 1); - else - fillColorsIndex.add(30); - } - } else { - FLine flineInfo = new FLine(fline.trim()); - fillColorsIndex = flineInfo.getFillColorList(); - - /* - * Apply last color if not enough input color. - */ - if (fvalues != null && fillColorsIndex.size() < (fvalues.size()+1)) { - for (int i = fillColorsIndex.size(); i < fvalues.size()+2; i++) { - fillColorsIndex.add(i); - } - } - } -// System.out.println("FILL VALUES:"+fvalues); -// System.out.println("FILL COLORS:"+fillColorsIndex); - - LinearRing grid = cgen.getEdges(); - FillGenerator fgen = new FillGenerator(grid); - for ( Double cval : fvalues ) { - float fval = (float) (cval * 1.0f); - Geometry g = cgen.getContours(fval); - if ( g == null ) continue; - fgen.addContours(fval, g); - } - - // Add color fill to contourGroup - for (int n=0; n <= fvalues.size(); n++ ) { - if (fillColorsIndex.get(n) <= 0 || fillColorsIndex.get(n) >= 32) continue; - - RGB color = GempakColor.convertToRGB(fillColorsIndex.get(n)); - Geometry fillPolys = null; - - int index = (n < fvalues.size()) ? n : (n-1); - float fval = (float)(fvalues.get(index) * 1.0f); - - try { - if (n == 0) { - fillPolys = fgen.fillLessThan(fval); - } else if (n == fvalues.size()) { - fillPolys = fgen.fillGreaterThan(fval); - } else { - float fval1 = (float)(fvalues.get(n-1) * 1.0f); - float fval2 = (float)(fvalues.get(n) * 1.0f); - fillPolys = fgen.fillBetween( fval1, fval2 ); - } - for (int j=0; j 1) { - minspc = (float) Math.sqrt(minSpacing); - } - if (minspc < 0.1) { - minspc = 0.1f; - } - if (maxSpacing > 1) { - maxspc = (float) Math.sqrt(maxSpacing); - } - if (maxspc < 0.25) { - maxspc = 0.25f; - } - - /* - * Fix arrow size by M. Li - */ - float arrowSize = (float) (0.4f / Math.sqrt(zoom)); - if (arrowSize > 0.4) arrowSize = 0.4f; - - Controller.strmpak(adjustedUw, adjustedVw, work, szX, szX, szY, - arrowSize, xPoints, yPoints, numPoints, minspc, maxspc, - -1000000f, -999998f); - - long t1 = System.currentTimeMillis(); - System.out.println("Streamline Contouring took: " + (t1 - t0)); - - List vals = new ArrayList(); - - long tAccum = 0; - try { - for (int i = 0; i < numPoints[0] && i < xPoints.length; i++) { - if (xPoints[i] == -99999.0) { - if (vals.size() > 0) { - double[][] valsArr = vals.toArray(new double[vals - .size()][2]); - contourGroup.posValueShape.addLineSegment(valsArr); - vals.clear(); - } - } else { - double[] out = new double[2]; - try { - long tZ0 = System.currentTimeMillis(); - - float f = maxX - xPoints[i]; - if (f > 180) f = f - 360; - rastPosToWorldGrid.transform(new double[] { - f, yPoints[i] + minY }, 0, - out, 0, 1); - -// rastPosToWorldGrid.transform(new double[] { -// maxX - xPoints[i], yPoints[i] + minY }, 0, -// out, 0, 1); - long tZ1 = System.currentTimeMillis(); - tAccum += (tZ1 - tZ0); - } catch (TransformException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - vals.add(out); - } - } - - System.out.println("streamline transformation time: " + tAccum); - - if (vals.size() > 0) { - - double[][] valsArr = vals - .toArray(new double[vals.size()][2]); - contourGroup.posValueShape.addLineSegment(valsArr); - vals.clear(); - } - } catch (Throwable e) { - throw new VizException("Error postprocessing contours", e); - } - - - adjustedUw = null; - adjustedVw = null; - work = null; - xPoints = null; - yPoints = null; - -// Runtime.getRuntime().gc(); - + createStreamLines(); } - - return contourGroup; - } public static GeneralEnvelope calculateSubGrid(IExtent workingExtent, GeneralGridGeometry mapGridGeometry, - GeneralGridGeometry imageGridGeometry) throws VizException { + GeneralGridGeometry imageGridGeometry) { GeneralEnvelope env = null; try { // transform screen extent to map crs @@ -768,7 +393,7 @@ public class ContourSupport { double[] image = new double[] { imageEnv.getMinX(), imageEnv.getMinY(), imageEnv.getMaxX(), imageEnv.getMaxY() }; double[] grid = new double[4]; - imageGridGeometry.getGridToCRS(PixelInCell.CELL_CORNER).inverse() + imageGridGeometry.getGridToCRS(PixelInCell.CELL_CENTER).inverse() .transform(image, 0, grid, 0, 2); env = new GeneralEnvelope(2); @@ -777,7 +402,9 @@ public class ContourSupport { env.setRange(1, Math.min(grid[1], grid[3]), Math.max(grid[1], grid[3])); } catch (Exception e) { - throw new VizException("Error transforming extent", e); +// throw new VizException("Error transforming extent", e); + logger.error("Error transforming extent:" + e); + return null; } // System.out.println("*** Subgrid: " + env); return env; @@ -911,7 +538,8 @@ public class ContourSupport { xform.transform(tmp, 0, out[i], 0, 1); } catch (TransformException e) { // TODO Auto-generated catch block - e.printStackTrace(); + // e.printStackTrace(); + return null; } } @@ -933,14 +561,16 @@ public class ContourSupport { xform.transform(tmp, 0, tmpout, 0, 1); } catch (TransformException e) { // TODO Auto-generated catch block - e.printStackTrace(); + // e.printStackTrace(); + return null; } tmpout[0] -= 360.0; try { xform1.transform(tmpout, 0, out[i], 0, 1); } catch (TransformException e) { // TODO Auto-generated catch block - e.printStackTrace(); + // e.printStackTrace(); + return null; } } @@ -963,7 +593,8 @@ public class ContourSupport { xform.transform(tmp, 0, tmpout, 0, 1); } catch (TransformException e) { // TODO Auto-generated catch block - e.printStackTrace(); +// e.printStackTrace(); + return null; } out[i] = new Coordinate( tmpout[0], tmpout[1] ); } @@ -988,14 +619,16 @@ public class ContourSupport { xform.transform(tmp, 0, tmpout, 0, 1); } catch (TransformException e) { // TODO Auto-generated catch block - e.printStackTrace(); +// e.printStackTrace(); + return null; } tmpout[0] -= 360.0; try { xform1.transform(tmpout, 0, tmpout1, 0, 1); } catch (TransformException e) { // TODO Auto-generated catch block - e.printStackTrace(); +// e.printStackTrace(); + return null; } out[i] = new Coordinate( tmpout1[0], tmpout1[1] ); } @@ -1057,10 +690,10 @@ public class ContourSupport { private static Coordinate findSegments(LineString outerPoly, double y, LineSegment seg) { - GeometryFactory gf = new GeometryFactory(); + //GeometryFactory gf = new GeometryFactory(); //List geoms = new ArrayList(); Coordinate max = new Coordinate(0,0); - Geometry testGeom; + //Geometry testGeom; Coordinate[] coords = outerPoly.getCoordinates(); for ( int i=0; i contourReduce ( List contour1, List contour2){ + List tmp = new ArrayList(); + if ( contour2 != null ) { + for ( Double d2 : contour2 ) { + boolean found = false; + for ( Double d1 : contour1 ) { + if ( Double.compare(d1, d2) == 0 ) { + found = true; + break; + } + } + if ( ! found ) { + tmp.add(d2); + } + } + } + return tmp; + } + + private void initContourGroup (IGraphicsTarget target, + ContourGroup contourGp) { + contourGroup = new ContourGroup(); + contourGroup.lastDensity = currentDensity; + + contourGroup.posValueShape = target.createWireframeShape(false, + descriptor); + contourGroup.negValueShape = target.createWireframeShape(false, + descriptor); + contourGroup.fillShapes = target.createShadedShape(false, descriptor, true); + + contourGroup.zoomLevel = 1.0 / Math.pow(2.0, level); + + contourGroup.cvalues = new ArrayList(); + + contourGroup.fvalues = new ArrayList(); + + contourGroup.data = new HashMap< String, Geometry>(); + + contourGroup.grid = null; + + if ( contourGp != null ) { + if ( contourGp.cvalues != null && contourGp.cvalues.size() > 0 ) { + contourGroup.cvalues.addAll(contourGp.cvalues); + } + if ( contourGp.fvalues != null && contourGp.fvalues.size() > 0 ) { + contourGroup.fvalues.addAll(contourGp.fvalues); + } + if ( contourGp.data != null && contourGp.data.size() > 0 ) { + contourGroup.data.putAll(contourGp.data); + } + if ( contourGp.grid != null ) + contourGroup.grid = contourGp.grid; + } + + contourGroup.lastUsedPixelExtent = (PixelExtent) extent.clone(); + contourGroup.lastUsedPixelExtent.getEnvelope().expandBy( + contourGroup.lastUsedPixelExtent.getWidth() * .25, + contourGroup.lastUsedPixelExtent.getHeight() * .25); + } + + private boolean initMathTransform ( GeneralGridGeometry imageGridGeometry, + GeneralGridGeometry mapGridGeometry) { + try { + DefaultMathTransformFactory factory = new DefaultMathTransformFactory(); + + CoordinateReferenceSystem rastCrs = imageGridGeometry + .getCoordinateReferenceSystem(); + CoordinateReferenceSystem mapCrs = mapGridGeometry + .getCoordinateReferenceSystem(); + + MathTransform rastGridToCrs = imageGridGeometry + .getGridToCRS(PixelInCell.CELL_CENTER); + MathTransform mapCrsToGrid = mapGridGeometry.getGridToCRS( + PixelInCell.CELL_CORNER).inverse(); + + MathTransform rastCrsToLatLon = MapUtil + .getTransformToLatLon(rastCrs); + + MathTransform rastCrsToWorldGrid = MapUtil + .getTransformFromLatLon(mapCrs); + MathTransform crs2crs = CRSCache.getInstance().findMathTransform( + rastCrs, mapCrs); + + rastPosToWorldGrid = factory + .createConcatenatedTransform( + factory.createConcatenatedTransform(rastGridToCrs, + crs2crs), mapCrsToGrid); + + rastPosToLatLon = factory.createConcatenatedTransform( + rastGridToCrs, rastCrsToLatLon); + rastPosLatLonToWorldGrid = factory.createConcatenatedTransform( + rastCrsToWorldGrid,mapCrsToGrid); + } catch (Exception e) { +// throw new VizException("Error building Transforms", e); + logger.error("Error building Transforms:" + e); + return false; + } + return true; + } + + private void initZoomIndex () { + zoomLevelIndex = level+1;//(int)(zoom / 2) + 1; // To be adjusted + if (zoomLevelIndex < 1) zoomLevelIndex = 1; + int maxZoomLevel = 5; + String cint = attr.getCint(); + if (cint != null) maxZoomLevel = cint.trim().split(">").length; + if (zoomLevelIndex > maxZoomLevel ) zoomLevelIndex = maxZoomLevel; + } + + private List calcCintValue () { + List cvalues = null; + if (type.trim().toUpperCase().contains("C")) { + cvalues =CINT.parseCINT(cint, zoomLevelIndex, cntrData.getMinValue(), cntrData.getMaxValue()); + } +// if ( cvalues != null ) { +// System.out.println ("******after CINT.parseCINT("+cint+").cvalues:"+ cvalues.toString()); +// System.out.println ("******cgen.getMinValue():" + cgen.getMinValue() + " cgen.getMaxValue():"+cgen.getMaxValue()); +// } + if ( contourGroup.cvalues.size() == 0 && cvalues != null ) { + contourGroup.cvalues.addAll(cvalues); + } + else if (contourGroup.cvalues.size() > 0 ) { + if ( cvalues != null ) { + List tmp = new ArrayList(cvalues); + cvalues = contourReduce (contourGroup.cvalues, cvalues); + contourGroup.cvalues.clear(); + contourGroup.cvalues.addAll(tmp); + } + else { + contourGroup.cvalues.clear(); + } + } + return cvalues; + } + + private List calcFintValue () { + List fvalues = null; + if (type.trim().toUpperCase().contains("F")) { + if ( !(fint.equalsIgnoreCase(cint)) ) { + fvalues = FINT.parseFINT(fint, zoomLevelIndex, cntrData.minValue, cntrData.getMaxValue()); + } + else if ( contourGroup.cvalues != null ){ + fvalues = contourGroup.cvalues; + } + } + if ( contourGroup.fvalues.size() == 0 && fvalues != null){ + contourGroup.fvalues.addAll(fvalues); + } + else if ( contourGroup.fvalues.size() > 0 ) { + if ( fvalues != null ){ + List tmp = new ArrayList(fvalues); + fvalues = contourReduce (contourGroup.fvalues, fvalues); + contourGroup.fvalues.clear(); + contourGroup.fvalues.addAll(tmp); + } + else { + contourGroup.fvalues.clear(); + } + } + return fvalues; + } + + private void combineCintAndFillValues () { + if (cvalues != null && cvalues.size() > 0) svalues = new HashSet(cvalues); + if (fvalues != null && fvalues.size() > 0) { + if (svalues == null) + svalues = new HashSet(fvalues); + else + svalues.addAll(fvalues); + } + } + + private void createContourLines () { + + long total_labeling_time = 0; + long t2 = System.currentTimeMillis(); + if (type.trim().toUpperCase().contains("C") && contourGroup.cvalues.size() > 0) { + int labelFreq = 1; + String[] tempLineStrs = attr.getLine().split("/"); + List labelValues = null; + if (tempLineStrs.length >= 4) { + if (tempLineStrs[3].trim().contains(";")) { + LineDataStringParser lineAttr = new LineDataStringParser(attr.getLine()); + labelValues = lineAttr.getInstanceOfLineBuilder().getLineLabelPresentList(); + } + else { + labelFreq = Math.abs(Integer.parseInt(tempLineStrs[3].trim())); + } + } + + + int n = 0,minX=0,minY=0; + + for ( Double cval : contourGroup.cvalues ) { + float fval = (float) (cval * 1.0f); + boolean toLabel = false; + + // Label frequency + if (labelValues != null) { + for(Integer value : labelValues) { + if (value == Math.rint(fval)) { + toLabel = true; + break; + } + } + } + else { + if (labelFreq == 0) + toLabel = false; + else + toLabel = (n % labelFreq == 0) ? true : false; + } + + +// Geometry g = cgen.getContours(fval); + Geometry g = contourGroup.data.get(cval.toString()); + if ( g == null ) continue; +// contourMap.put( cval, g); + double[][] screen1 = null; + for ( int i=0; i < g.getNumGeometries(); i++ ) { + Geometry gn = g.getGeometryN(i); + double[][] screen = toScreen( gn.getCoordinates(), rastPosToWorldGrid, minX, minY ); + + if ( screen != null ) + contourGroup.negValueShape.addLineSegment(screen); + if ( isWorld0 ) { + screen1 = toScreenSubtract360( gn.getCoordinates(), rastPosToLatLon,rastPosLatLonToWorldGrid, minX, minY ); + if ( screen1 != null ) + contourGroup.negValueShape.addLineSegment(screen1); + } + if (toLabel) { + long tl0 = System.currentTimeMillis(); +// prepareLabel(contourGroup, zoom, fval, +// labelPoints, screen); + if ( screen != null ) + createContourLabel(extent, contourGroup, fval, screen); + if ( isWorld0 && screen1 != null) { + createContourLabel(extent, contourGroup, fval, screen1); + } + long tl1 = System.currentTimeMillis(); + total_labeling_time += (tl1-tl0); + } + } + + n++; + } + } + long t3 = System.currentTimeMillis(); + logger.debug("===Creating label wireframes for ("+name+") took: " + total_labeling_time); + logger.debug("===Creating contour line wireframes for ("+name+")took: " + (t3 - t2 - total_labeling_time)); +// System.out.println("Creating contour line wireframes took: " + (t3 - t2 - total_labeling_time)); + } + + private void createColorFills () { + + long t3 = System.currentTimeMillis(); + if (type.trim().toUpperCase().contains("F") && contourGroup.fvalues.size() > 0) { + try { + + // Prepare colors for color fills + List fillColorsIndex = new ArrayList(); + if (fline == null || fline.trim().length() < 1) { + for(int i = 0; i < contourGroup.fvalues.size()+2; i++) { + if (i <= 30) + fillColorsIndex.add(i + 1); + else + fillColorsIndex.add(30); + } + } else { + FLine flineInfo = new FLine(fline.trim()); + fillColorsIndex = flineInfo.getFillColorList(); + + /* + * Apply last color if not enough input color. + */ + if (contourGroup.fvalues != null && fillColorsIndex.size() < (contourGroup.fvalues.size()+1)) { + for (int i = fillColorsIndex.size(); i < contourGroup.fvalues.size()+2; i++) { + fillColorsIndex.add(i); + } + } + } + + int minX=0,minY=0; + FillGenerator fgen = new FillGenerator(contourGroup.grid); + for ( Double cval : contourGroup.fvalues ) { + float fval = (float) (cval * 1.0f); + Geometry g = contourGroup.data.get(cval.toString()); + if ( g == null ) continue; + fgen.addContours(fval, g); + } + // Add color fill to contourGroup + for (int n=0; n <= contourGroup.fvalues.size(); n++ ) { + if (fillColorsIndex.get(n) <= 0 || fillColorsIndex.get(n) >= 32) continue; + + RGB color = GempakColor.convertToRGB(fillColorsIndex.get(n)); + Geometry fillPolys = null; + + int index = (n < contourGroup.fvalues.size()) ? n : (n-1); + float fval = (float)(contourGroup.fvalues.get(index) * 1.0f); + + try { + if (n == 0) { + fillPolys = fgen.fillLessThan(fval); + } else if (n == contourGroup.fvalues.size()) { + fillPolys = fgen.fillGreaterThan(fval); + } else { + float fval1 = (float)(contourGroup.fvalues.get(n-1) * 1.0f); + float fval2 = (float)(contourGroup.fvalues.get(n) * 1.0f); + fillPolys = fgen.fillBetween( fval1, fval2 ); + } + for (int j=0; j 1) { + minspc = (float) Math.sqrt(minSpacing); + } + if (minspc < 0.1) { + minspc = 0.1f; + } + if (maxSpacing > 1) { + maxspc = (float) Math.sqrt(maxSpacing); + } + if (maxspc < 0.25) { + maxspc = 0.25f; + } + + /* + * Fix arrow size by M. Li + */ + float arrowSize = (float) (0.4f / Math.sqrt(zoom)); + if (arrowSize > 0.4) arrowSize = 0.4f; + + Controller.strmpak(adjustedUw, adjustedVw, work, szX, szX, szY, + arrowSize, xPoints, yPoints, numPoints, minspc, maxspc, + -1000000f, -999998f); + + long t1 = System.currentTimeMillis(); +// System.out.println("Streamline Contouring took: " + (t1 - t0)); + + List vals = new ArrayList(); + + long tAccum = 0; + try { + for (int i = 0; i < numPoints[0] && i < xPoints.length; i++) { + if (xPoints[i] == -99999.0) { + if (vals.size() > 0) { + double[][] valsArr = vals.toArray(new double[vals + .size()][2]); + contourGroup.posValueShape.addLineSegment(valsArr); + vals.clear(); + } + } else { + double[] out = new double[2]; + try { + long tZ0 = System.currentTimeMillis(); + + float f = maxX - xPoints[i]; + if (f > 180) f = f - 360; + rastPosToWorldGrid.transform(new double[] { + f, yPoints[i] + minY }, 0, + out, 0, 1); + +// rastPosToWorldGrid.transform(new double[] { +// maxX - xPoints[i], yPoints[i] + minY }, 0, +// out, 0, 1); + long tZ1 = System.currentTimeMillis(); + tAccum += (tZ1 - tZ0); + } catch (TransformException e) { + // TODO Auto-generated catch block +// e.printStackTrace(); + } + vals.add(out); + } + } + +// System.out.println("streamline transformation time: " + tAccum); + + if (vals.size() > 0) { + + double[][] valsArr = vals + .toArray(new double[vals.size()][2]); + contourGroup.posValueShape.addLineSegment(valsArr); + vals.clear(); + } + } catch (Throwable e) { +// throw new VizException("Error postprocessing contours", e); + logger.error("Error postprocessing contours:" + e); + isCntrsCreated = false; + return; + } + } + + public void genContour () { + + ContourCalculationReentrantLock.getReentrantLock(); +// synchronized (ContourSupport.class) { + List allvalues = new ArrayList(svalues); + Collections.sort(allvalues); + + long t1a = System.currentTimeMillis(); + ContourGenerator cgen = new ContourGenerator( cntrData.getData(), cntrData.getX(), cntrData.getY()); + long t1b = System.currentTimeMillis(); + logger.debug("Creating contour values took: " + (t1b-t1a)); + cgen.setContourValues( allvalues ); + + long t1c = System.currentTimeMillis(); + logger.debug("ContourGenerator.setContourValues(allvalues) took: " + (t1c-t1b)); +// System.out.println("ContourGenerator init took:" + (t1c-t0)); + + + try { + cgen.generateContours(); + } catch (ContourException e1) { + // TODO Auto-generated catch block +// e1.printStackTrace(); + cgen.dispose(); + isCntrsCreated = false; + ContourCalculationReentrantLock.releaseReentrantLock(); + return; + } + + + + long t2 = System.currentTimeMillis(); + logger.debug("===ContourGenerator.generateContours() for ("+name+") took: " + (t2-t1c)); + +// System.out.println("Contour Computation took: " + (t2-t1c)); + + logger.debug("Total generating contour line values took: " + (t2-t1a)); + if ( cvalues != null ) { + for ( Double cval : cvalues ) { + float fval = (float) (cval * 1.0f); + contourGroup.data.put(cval.toString(), cgen.getContours(fval)); + } + } + if ( fvalues != null ) { + for ( Double cval : fvalues ) { + float fval = (float) (cval * 1.0f); + contourGroup.data.put(cval.toString(), cgen.getContours(fval)); + } + } + + if ( contourGroup.grid == null ) { + contourGroup.grid = cgen.getEdges(); + } + cgen.dispose(); + ContourCalculationReentrantLock.releaseReentrantLock(); +// } + } + + public ContourGroup getContours() { + if ( ! isCntrsCreated ) return null; + return contourGroup; + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridIndicesDisplay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridIndicesDisplay.java index 653cc5a2e0..6c0ef61604 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridIndicesDisplay.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridIndicesDisplay.java @@ -12,6 +12,7 @@ import com.raytheon.uf.common.geospatial.ReferencedObject.Type; 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.VerticalAlignment; import com.raytheon.uf.viz.core.drawables.IRenderable; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; @@ -44,131 +45,140 @@ public class GridIndicesDisplay implements IRenderable { private RGB gridIndiceColor; - public GridIndicesDisplay(RGB color, IMapDescriptor descriptor, ISpatialObject gridLocation) { + public GridIndicesDisplay(RGB color, IMapDescriptor descriptor, + ISpatialObject gridLocation) { this.descriptor = descriptor; this.gridGeometryOfGrid = MapUtil.getGridGeometry(gridLocation); - this.gridDims = new int[] { - gridLocation.getNx(), - gridLocation.getNy()}; + this.gridDims = new int[] { gridLocation.getNx(), gridLocation.getNy() }; this.gridIndiceColor = color; } - - @SuppressWarnings("deprecation") - @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - /* - * Calculate center point - */ - IExtent screenExtentInPixels = paintProps.getView().getExtent(); - double ratio = screenExtentInPixels.getWidth() - / paintProps.getCanvasBounds().width; - int interval0 = (int) (10 * ratio / (Math.min(2.0, 1.0 /*paintProps.getDensity()*/))); -// int interv = (int) ((interval0 + 15) / 15.0); - int interv = (int) Math.log(interval0); - if (interv < 0 ) interv = 0; - if (interv > 4) interv = 4; - - double centerX = 0.5 * (screenExtentInPixels.getMinX() + screenExtentInPixels.getMaxX()); - double centerY = 0.5 * (screenExtentInPixels.getMinY() + screenExtentInPixels.getMaxY()); - int centerI = 0; - int centerJ = 0; - double distance = 100000.0; - for (int i = 0; i < gridDims[0]; i++) { - for (int j = 0; j < gridDims[1]; j++) { - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate(i, j), gridGeometryOfGrid, Type.GRID_CORNER); - - try { - double dx = (centerX - c.asPixel(descriptor.getGridGeometry()).x); - double dy = (centerY - c.asPixel(descriptor.getGridGeometry()).y); - double dist = Math.sqrt(dx * dx + dy * dy); - - if (dist < distance) { - distance = dist; - centerI = i; - centerJ = j; - } - - } catch (TransformException e) { - e.printStackTrace(); - } catch (FactoryException e) { - e.printStackTrace(); - } - } - } - - /* - * Draw grid indices - */ - for (int i = 0; i < gridDims[0]; i += interv +1) { - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate(i, centerJ), gridGeometryOfGrid, - Type.GRID_CORNER); - - try { - double[] d = this.descriptor.worldToPixel(new double[]{ - (double)c.asLatLon().x, (double)c.asLatLon().y - }); - - if (!screenExtentInPixels.contains(d)) { - continue; - } - - String indiceText = String.valueOf(i); - try { - target.drawString(null, indiceText, d[0], d[1], 0.0, - IGraphicsTarget.TextStyle.NORMAL, gridIndiceColor, - HorizontalAlignment.CENTER, null); - } catch (VizException e) { - e.printStackTrace(); - } - - } catch (TransformException e) { - e.printStackTrace(); - } catch (FactoryException e) { - e.printStackTrace(); - } - } - - for (int i = 0; i < gridDims[1]; i += interv + 1) { - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate(centerI, i), gridGeometryOfGrid, - Type.GRID_CORNER); - - try { - if (i == 0 &&c.asLatLon().y == 90) c.asLatLon().y = 89.98; - if (i == gridDims[1] -1 && c.asLatLon().y == -90) c.asLatLon().y = -89.98; -// if (c.asLatLon().x == 360) c.asLatLon().x = 359.98; - - - double[] d = this.descriptor.worldToPixel(new double[]{ - (double)c.asLatLon().x, (double)c.asLatLon().y - }); - - if (d == null) continue; - - if (!screenExtentInPixels.contains(d)) { - continue; - } - - String indiceText = String.valueOf(i); - try { - target.drawString(null, indiceText, d[0], d[1], 0.0, - IGraphicsTarget.TextStyle.NORMAL, gridIndiceColor, - HorizontalAlignment.CENTER, null); - } catch (VizException e) { - e.printStackTrace(); - } - - } catch (TransformException e) { - e.printStackTrace(); - } catch (FactoryException e) { - e.printStackTrace(); - } - } - - } + @SuppressWarnings("deprecation") + @Override + public void paint(IGraphicsTarget target, PaintProperties paintProps) + throws VizException { + /* + * Calculate center point + */ + IExtent screenExtentInPixels = paintProps.getView().getExtent(); + double ratio = screenExtentInPixels.getWidth() + / paintProps.getCanvasBounds().width; + int interval0 = (int) (10 * ratio / (Math.min(2.0, 1.0 /* + * paintProps. + * getDensity() + */))); + // int interv = (int) ((interval0 + 15) / 15.0); + int interv = (int) Math.log(interval0); + if (interv < 0) + interv = 0; + if (interv > 4) + interv = 4; + + double centerX = 0.5 * (screenExtentInPixels.getMinX() + screenExtentInPixels + .getMaxX()); + double centerY = 0.5 * (screenExtentInPixels.getMinY() + screenExtentInPixels + .getMaxY()); + + int centerI = 0; + int centerJ = 0; + double distance = 100000.0; + for (int i = 0; i < gridDims[0]; i++) { + for (int j = 0; j < gridDims[1]; j++) { + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate(i, j), gridGeometryOfGrid, + Type.GRID_CENTER); + + try { + double dx = (centerX - c.asPixel(descriptor + .getGridGeometry()).x); + double dy = (centerY - c.asPixel(descriptor + .getGridGeometry()).y); + double dist = Math.sqrt(dx * dx + dy * dy); + + if (dist < distance) { + distance = dist; + centerI = i; + centerJ = j; + } + + } catch (TransformException e) { + continue; + } catch (FactoryException e) { + e.printStackTrace(); + } + } + } + + /* + * Draw grid indices + */ + for (int i = 0; i < gridDims[0]; i += interv + 1) { + ReferencedCoordinate c = new ReferencedCoordinate(new Coordinate(i, + centerJ), gridGeometryOfGrid, Type.GRID_CENTER); + + try { + double[] d = this.descriptor.worldToPixel(new double[] { + (double) c.asLatLon().x, (double) c.asLatLon().y }); + + if (!screenExtentInPixels.contains(d)) { + continue; + } + + String indiceText = String.valueOf(i); + try { + target.drawString(null, indiceText, d[0], d[1], 0.0, + IGraphicsTarget.TextStyle.NORMAL, gridIndiceColor, + HorizontalAlignment.CENTER, + VerticalAlignment.MIDDLE, null); + } catch (VizException e) { + e.printStackTrace(); + } + + } catch (TransformException e) { + e.printStackTrace(); + } catch (FactoryException e) { + e.printStackTrace(); + } + } + + for (int i = 0; i < gridDims[1]; i += interv + 1) { + ReferencedCoordinate c = new ReferencedCoordinate(new Coordinate( + centerI, i), gridGeometryOfGrid, Type.GRID_CENTER); + + try { + if (i == 0 && c.asLatLon().y == 90) + c.asLatLon().y = 89.98; + if (i == gridDims[1] - 1 && c.asLatLon().y == -90) + c.asLatLon().y = -89.98; + // if (c.asLatLon().x == 360) c.asLatLon().x = 359.98; + + double[] d = this.descriptor.worldToPixel(new double[] { + (double) c.asLatLon().x, (double) c.asLatLon().y }); + + if (d == null) + continue; + + if (!screenExtentInPixels.contains(d)) { + continue; + } + + String indiceText = String.valueOf(i); + try { + target.drawString(null, indiceText, d[0], d[1], 0.0, + IGraphicsTarget.TextStyle.NORMAL, gridIndiceColor, + HorizontalAlignment.CENTER, + VerticalAlignment.MIDDLE, null); + } catch (VizException e) { + e.printStackTrace(); + } + + } catch (TransformException e) { + e.printStackTrace(); + } catch (FactoryException e) { + e.printStackTrace(); + } + } + + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointMarkerDisplay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointMarkerDisplay.java index 5e6770627f..d18497e098 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointMarkerDisplay.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointMarkerDisplay.java @@ -19,61 +19,28 @@ ******************************************************************************************/ package gov.noaa.nws.ncep.viz.rsc.ncgrid.contours; -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.nio.FloatBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Queue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; +import gov.noaa.nws.ncep.gempak.parameters.marker.MARKER; +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 java.awt.Color; +import java.util.ArrayList; -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.graphics.RGB; -import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.coverage.grid.GridGeometry2D; import org.opengis.referencing.FactoryException; -import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.TransformException; import com.raytheon.uf.common.geospatial.ISpatialObject; import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.geospatial.ReferencedCoordinate; import com.raytheon.uf.common.geospatial.ReferencedObject.Type; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelCoverage; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; -import com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode; -import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; -import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; -import com.raytheon.uf.viz.core.data.prep.IODataPreparer; -import com.raytheon.uf.viz.core.drawables.IFont; -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.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.status.StatusConstants; -//import com.raytheon.viz.core.contours.Activator; -//import gov.noaa.nws.ncep.viz.common.ui.NmapUiUtils; -import gov.noaa.nws.ncep.gempak.parameters.marker.MARKER; -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.rsc.ncgrid.Activator; -import gov.noaa.nws.ncep.viz.rsc.ncgrid.contours.ContourSupport.ContourGroup; -import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; - -import com.raytheon.viz.pointdata.PointWindDisplay; -import com.raytheon.viz.pointdata.PointWindDisplay.DisplayType; import com.vividsolutions.jts.geom.Coordinate; /** @@ -97,67 +64,57 @@ public class GridPointMarkerDisplay implements IRenderable { private final IMapDescriptor descriptor; private SymbolLocationSet gridPointMarkerSet; - - - public GridPointMarkerDisplay(String markerAttr, IMapDescriptor descriptor, ISpatialObject gridLocation) { + public GridPointMarkerDisplay(String markerAttr, IMapDescriptor descriptor, + ISpatialObject gridLocation) { this.descriptor = descriptor; - + gridPointMarkerSet = null; - - int nx = gridLocation.getNx(); - int ny = gridLocation.getNy(); - Coordinate[] locations = new Coordinate[nx*ny]; + + int nx = gridLocation.getNx(); + int ny = gridLocation.getNy(); + Coordinate[] locations = new Coordinate[nx * ny]; String markerName = "PLUS_SIGN"; Color markerColor = new Color(255, 255, 255); double markerSize = 1.0; float markerWidth = 1.0f; if (markerAttr != null) { - MARKER marker = new MARKER(markerAttr); - RGB color = marker.getMarkerColor(); - markerColor = new Color(color.red, color.green, color.blue); - markerName = marker.getMarkerName(); - markerSize = marker.getMarkerSize(); - markerWidth = marker.getMarkerWidth(); + MARKER marker = new MARKER(markerAttr); + RGB color = marker.getMarkerColor(); + markerColor = new Color(color.red, color.green, color.blue); + markerName = marker.getMarkerName(); + markerSize = marker.getMarkerSize(); + markerWidth = marker.getMarkerWidth(); } - - Color[] colors = new Color[] {markerColor}; - - int n = 0; - for (int i = 0; i < nx; i++) { - for (int j = 0; j < ny; j++) { - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate(i, j), - MapUtil.getGridGeometry(gridLocation), Type.GRID_CORNER); - try { - if (c != null) { - double lat = c.asLatLon().y; - double lon = c.asLatLon().x; - if (j == 0 && lat == 90) lat -= 0.2; - if (j == ny - 1 && lat == -90) lat += 0.2; - - locations[n++] = new Coordinate(lon, lat); - } - } catch (TransformException e) { - e.printStackTrace(); - } catch (FactoryException e) { - e.printStackTrace(); - } - } - } - - gridPointMarkerSet = new SymbolLocationSet ( - null, - colors, - markerWidth, - markerSize, - false, - locations, - "Markers", - markerName); + Color[] colors = new Color[] { markerColor }; + GridGeometry2D gridGeom = MapUtil.getGridGeometry(gridLocation); + + int n = 0; + for (int i = 0; i < nx; i++) { + for (int j = 0; j < ny; j++) { + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate(i, j), gridGeom, Type.GRID_CENTER); + + try { + if (c != null) { + double lat = c.asLatLon().y; + double lon = c.asLatLon().x; + + locations[n++] = new Coordinate(lon, lat); + } + } catch (TransformException e) { + e.printStackTrace(); + } catch (FactoryException e) { + e.printStackTrace(); + } + } + } + + gridPointMarkerSet = new SymbolLocationSet(null, colors, markerWidth, + markerSize, false, locations, "Markers", markerName); } /* @@ -170,24 +127,25 @@ public class GridPointMarkerDisplay implements IRenderable { @Override public void paint(IGraphicsTarget target, PaintProperties paintProps) throws VizException { - - if (paintProps.isZooming()) { - return; - } - - if (gridPointMarkerSet != null) { - DisplayElementFactory df = new DisplayElementFactory (target, this.descriptor); - ArrayList elements = df.createDisplayElements(gridPointMarkerSet, paintProps); - for (IDisplayable each : elements) - { - if (each == null) continue; - each.draw(target); - each.dispose(); - } - } - + if (paintProps.isZooming()) { + return; + } + + if (gridPointMarkerSet != null) { + DisplayElementFactory df = new DisplayElementFactory(target, + this.descriptor); + ArrayList elements = df.createDisplayElements( + gridPointMarkerSet, paintProps); + for (IDisplayable each : elements) { + if (each == null) + continue; + + each.draw(target); + each.dispose(); + } + } + } - - + } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointValueDisplay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointValueDisplay.java index 18ec0c9a91..9b712dd8fd 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointValueDisplay.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridPointValueDisplay.java @@ -19,55 +19,27 @@ ******************************************************************************************/ package gov.noaa.nws.ncep.viz.rsc.ncgrid.contours; -import java.awt.image.BufferedImage; import java.nio.FloatBuffer; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Queue; -import java.util.concurrent.ConcurrentHashMap; -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 org.eclipse.swt.graphics.RGB; import org.geotools.coverage.grid.GeneralGridGeometry; import org.opengis.referencing.FactoryException; -import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.TransformException; import com.raytheon.uf.common.geospatial.ISpatialObject; import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.geospatial.ReferencedCoordinate; import com.raytheon.uf.common.geospatial.ReferencedObject.Type; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelCoverage; -import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; -import com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode; import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; -import com.raytheon.uf.viz.core.data.prep.IODataPreparer; import com.raytheon.uf.viz.core.drawables.IFont; -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.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.status.StatusConstants; -//import com.raytheon.viz.core.contours.Activator; -//import gov.noaa.nws.ncep.viz.common.ui.NmapUiUtils; -import gov.noaa.nws.ncep.viz.rsc.ncgrid.Activator; -import gov.noaa.nws.ncep.viz.rsc.ncgrid.contours.ContourSupport.ContourGroup; -import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; - -import com.raytheon.viz.pointdata.PointWindDisplay; -import com.raytheon.viz.pointdata.PointWindDisplay.DisplayType; import com.vividsolutions.jts.geom.Coordinate; /** @@ -96,20 +68,18 @@ public class GridPointValueDisplay implements IRenderable { private final int[] gridDims; private RGB color; - + private FloatBuffer displayValues; - + private IFont font; - - public GridPointValueDisplay(FloatBuffer values, RGB color, IMapDescriptor descriptor, ISpatialObject gridLocation) { + public GridPointValueDisplay(FloatBuffer values, RGB color, + IMapDescriptor descriptor, ISpatialObject gridLocation) { this.displayValues = values; this.descriptor = descriptor; this.gridGeometryOfGrid = MapUtil.getGridGeometry(gridLocation); - this.gridDims = new int[] { - gridLocation.getNx(), - gridLocation.getNy() }; + this.gridDims = new int[] { gridLocation.getNx(), gridLocation.getNy() }; this.color = color; } @@ -123,64 +93,68 @@ public class GridPointValueDisplay implements IRenderable { @Override public void paint(IGraphicsTarget target, PaintProperties paintProps) throws VizException { - - if (paintProps.isZooming()) { - return; - } - font = target.initializeFont("Monospace", - 10, new IFont.Style[] { IFont.Style.BOLD }); + if (paintProps.isZooming()) { + return; + } + font = target.initializeFont("Monospace", 10, + new IFont.Style[] { IFont.Style.BOLD }); - IExtent screenExtentInPixels = paintProps.getView().getExtent(); + IExtent screenExtentInPixels = paintProps.getView().getExtent(); - double ratio = screenExtentInPixels.getWidth() - / paintProps.getCanvasBounds().width; - int interval0 = (int) (10 * ratio / (Math.min(2.0, 1.0/*paintProps.getDensity()*/))); -// int interv = (int) ((interval0 + 15) / 15.0); - int interv = (int) Math.log(interval0); - if (interv < 0 ) interv = 0; - if (interv > 5) interv = 5; - interval0 = 1; - - for (int i = 0; i < gridDims[0]; i += interv + 1) { + double ratio = screenExtentInPixels.getWidth() + / paintProps.getCanvasBounds().width; + int interval0 = (int) (10 * ratio / (Math.min(2.0, 1.0/* + * paintProps. + * getDensity() + */))); + // int interv = (int) ((interval0 + 15) / 15.0); + int interv = (int) Math.log(interval0); + if (interv < 0) + interv = 0; + if (interv > 5) + interv = 5; + interval0 = 1; - for ( int j = 0; j < gridDims[1]; j += interv + 1) { + for (int i = 0; i < gridDims[0]; i += interv + 1) { - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate(i, j), - this.gridGeometryOfGrid, Type.GRID_CENTER); + for (int j = 0; j < gridDims[1]; j += interv + 1) { - /* - * check map area - */ - try { - double[] d = this.descriptor.worldToPixel(new double[]{ - (double)c.asLatLon().x, (double)c.asLatLon().y - }); + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate(i, j), this.gridGeometryOfGrid, + Type.GRID_CENTER); - if (!screenExtentInPixels.contains(d)) { - continue; - } + /* + * check map area + */ + try { + double[] d = this.descriptor.worldToPixel(new double[] { + (double) c.asLatLon().x, (double) c.asLatLon().y }); - /* - * Plot grid point values - */ - String text = getValueString(i, j); + if (d == null || !screenExtentInPixels.contains(d)) { + continue; + } - target.drawString(font, text, d[0], d[1], 0.0, TextStyle.NORMAL, - color, HorizontalAlignment.CENTER, VerticalAlignment.MIDDLE, - 0.0); - } catch (TransformException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (FactoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } + /* + * Plot grid point values + */ + String text = getValueString(i, j); + + target.drawString(font, text, d[0], d[1], 0.0, + TextStyle.NORMAL, color, + HorizontalAlignment.CENTER, + VerticalAlignment.MIDDLE, 0.0); + } catch (TransformException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (FactoryException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } } - + private String getValueString(int x, int y) { if (x >= this.gridDims[0] || y >= this.gridDims[1] || x < 0 || y < 0) { return null; @@ -192,12 +166,12 @@ public class GridPointValueDisplay implements IRenderable { if (Float.isNaN(value)) { return null; } - - return String.valueOf((int)value); + + return String.valueOf((int) value); } - + public void dispose() { - + if (font != null) { font.dispose(); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridRelativeHiLoDisplay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridRelativeHiLoDisplay.java index 5293337bb1..0ad2880da4 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridRelativeHiLoDisplay.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GridRelativeHiLoDisplay.java @@ -1,5 +1,13 @@ package gov.noaa.nws.ncep.viz.rsc.ncgrid.contours; +import gov.noaa.nws.ncep.gempak.parameters.hilo.HILOBuilder; +import gov.noaa.nws.ncep.gempak.parameters.intext.TextStringParser; +import gov.noaa.nws.ncep.gempak.parameters.marker.MARKER; +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.common.ui.HILORelativeMinAndMaxLocator; + import java.awt.Color; import java.awt.geom.Rectangle2D; import java.util.ArrayList; @@ -21,13 +29,6 @@ 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.uf.viz.core.map.IMapDescriptor; -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.gempak.parameters.hilo.HILOBuilder; -import gov.noaa.nws.ncep.gempak.parameters.intext.TextStringParser; -import gov.noaa.nws.ncep.gempak.parameters.marker.MARKER; -import gov.noaa.nws.ncep.viz.common.ui.HILORelativeMinAndMaxLocator; import com.vividsolutions.jts.geom.Coordinate; /** @@ -46,527 +47,573 @@ import com.vividsolutions.jts.geom.Coordinate; * @version 1.0 */ public class GridRelativeHiLoDisplay implements IRenderable { - - //new fields - private final IMapDescriptor descriptor; - private final GeneralGridGeometry gridGeometryOfGrid; - - private HILOBuilder hiloBuild; - - private HILORelativeMinAndMaxLocator hiloLocator; - - private TextStringParser textMarkerString; - - private TextStringParser textValueString; - - private SymbolLocationSet gridPointHiSymbolSet = null; - - private SymbolLocationSet gridPointLoSymbolSet = null; - - //Hi/L symbol overtical/horizontal offset parameters - private double symbolHiHight = 0.0; - - private double symbolLoHight = 0.0; - - private int charPix = 4; - - Rectangle2D charSize; - - public GridRelativeHiLoDisplay (HILOBuilder hiloBuild, HILORelativeMinAndMaxLocator hiloLocator, TextStringParser markerStr, - TextStringParser valueStr, IMapDescriptor descriptor, ISpatialObject gridLocation) { - this.descriptor = descriptor; - this.gridGeometryOfGrid = MapUtil.getGridGeometry(gridLocation); - this.hiloBuild = hiloBuild; - this.hiloLocator = hiloLocator; - this.textMarkerString = markerStr; - this.textValueString = valueStr; - initHiLoSymbolSet (); -// display (); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.drawables.IRenderable#paint(com.raytheon.viz.core - * .IGraphicsTarget, com.raytheon.viz.core.drawables.PaintProperties) - */ - @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - - if (paintProps.isZooming()) { - return; - } - - paintHighs ( target, paintProps ); - paintLows (target, paintProps); - } - - /** - * Draw Highs - */ - private void paintHighs (IGraphicsTarget target, PaintProperties paintProps ) throws VizException { - - if ( gridPointHiSymbolSet != null ) { - DisplayElementFactory df = new DisplayElementFactory (target, this.descriptor); - ArrayList elements = df.createDisplayElements(gridPointHiSymbolSet, paintProps); - for (IDisplayable each : elements) - { - each.draw(target); - each.dispose(); - } - } - else if ( hiloBuild.getSymbolHiType() == 1 ) { - drawHiCharacter (target, paintProps ); - } - - if ( hiloBuild.getSymbolHiPlotValue() ) { - plotGridHiValue ( target ); - } - } - - /** - * Draw Lows - */ - private void paintLows (IGraphicsTarget target, PaintProperties paintProps ) throws VizException { - - if ( gridPointLoSymbolSet != null ) { - DisplayElementFactory df = new DisplayElementFactory (target, this.descriptor); - ArrayList elements = df.createDisplayElements(gridPointLoSymbolSet, paintProps); - for (IDisplayable each : elements) - { - each.draw(target); - each.dispose(); - } - } - else if ( hiloBuild.getSymbolLoType() == 1 ) { - drawLoCharacter (target, paintProps ); - } - - if ( hiloBuild.getSymbolLoPlotValue() ) { - plotGridLoValue ( target ); - } - } - - /** - * Draw High character - */ - private void drawHiCharacter ( IGraphicsTarget target, PaintProperties paintProps ) throws VizException { - - float [] tmp1 = hiloLocator.getMaxColPositions(); - if ( hiloBuild.getSymbolHi().length() > 0 && tmp1.length > 0 ) { - String text = hiloBuild.getSymbolHi(); - float [] tmp2 = hiloLocator.getMaxRowPositions(); - - IFont font = target.initializeFont(getFontName(textMarkerString.getTextFont()), - textMarkerString.getTextSize(), new IFont.Style[] { IFont.Style.BOLD }); - charSize = target.getStringBounds(font, "N"); - symbolHiHight = charSize.getHeight()*charPix; - - for ( int i = 0; i < tmp1.length ; i ++ ) { - - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate((int)tmp1[i], (int)tmp2[i] ), - this.gridGeometryOfGrid, Type.GRID_CORNER); - try { - double[] d = this.descriptor.worldToPixel(new double[]{ - (double)c.asLatLon().x, (double)c.asLatLon().y - }); - - target.drawString(font, text, d[0], d[1], 0.0, TextStyle.NORMAL, - hiloBuild.getColorHi(), HorizontalAlignment.CENTER, VerticalAlignment.MIDDLE, - 0.0); - } catch (TransformException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (FactoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - - /** - * Draw Low character - */ - private void drawLoCharacter ( IGraphicsTarget target, PaintProperties paintProps ) throws VizException { - - float [] tmp1 = hiloLocator.getMinColPositions(); - if ( hiloBuild.getSymbolLo().length() > 0 && tmp1.length > 0 ) { - String text = hiloBuild.getSymbolLo(); - float [] tmp2 = hiloLocator.getMinRowPositions(); - - IFont font = target.initializeFont(getFontName(textMarkerString.getTextFont()), - textMarkerString.getTextSize(), new IFont.Style[] { IFont.Style.BOLD }); - charSize = target.getStringBounds(font, "N"); - symbolLoHight = charSize.getHeight()*charPix; - - for ( int i = 0; i < tmp1.length ; i ++ ) { - - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate((int)tmp1[i], (int)tmp2[i] ), - this.gridGeometryOfGrid, Type.GRID_CORNER); - try { - double[] d = this.descriptor.worldToPixel(new double[]{ - (double)c.asLatLon().x, (double)c.asLatLon().y - }); - - target.drawString(font, text, d[0], d[1], 0.0, TextStyle.NORMAL, - hiloBuild.getColorLo(), HorizontalAlignment.CENTER, VerticalAlignment.MIDDLE, - 0.0); - } catch (TransformException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (FactoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - - /** - * Plot High grid values - */ - private void plotGridHiValue ( IGraphicsTarget target ) throws VizException { - float [] tmp1 = hiloLocator.getMaxColPositions(); - - if ( tmp1.length > 0 ) { - float [] tmp2 = hiloLocator.getMaxRowPositions(); - float [] tmp3 = hiloLocator.getMaxValues(); - double offY = symbolHiHight; - IFont font = target.initializeFont(getFontName(textValueString.getTextFont()), - textValueString.getTextSize(), new IFont.Style[] { IFont.Style.BOLD }); - if ( offY > 0.0 ) { - charSize = target.getStringBounds(font, "N"); - offY += charSize.getHeight()*charPix; - } - for ( int i = 0; i < tmp1.length ; i ++ ) { - - String text = convertFloat2String (tmp3[i],hiloBuild.getSymbolHiNumOfDecPls()); - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate((int)tmp1[i], (int)tmp2[i] ), - this.gridGeometryOfGrid, Type.GRID_CORNER); - try { - double[] d = this.descriptor.worldToPixel(new double[]{ - (double)c.asLatLon().x, (double)c.asLatLon().y - }); - - target.drawString(font, text, d[0], d[1]+offY, 0.0, TextStyle.NORMAL, - hiloBuild.getColorHi(), HorizontalAlignment.CENTER, VerticalAlignment.MIDDLE, - 0.0); - } catch (TransformException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (FactoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - - /** - * Plot Low grid values - */ - private void plotGridLoValue ( IGraphicsTarget target ) throws VizException { - float [] tmp1 = hiloLocator.getMinColPositions(); - - if ( tmp1.length > 0 ) { - float [] tmp2 = hiloLocator.getMinRowPositions(); - float [] tmp3 = hiloLocator.getMinValues(); - - double offY = symbolLoHight; - IFont font = target.initializeFont(getFontName(textValueString.getTextFont()), - textValueString.getTextSize(), new IFont.Style[] { IFont.Style.BOLD }); - if ( offY > 0.0 ) { - charSize = target.getStringBounds(font, "N"); - offY += charSize.getHeight()*charPix; - } - for ( int i = 0; i < tmp1.length ; i ++ ) { - - String text = convertFloat2String (tmp3[i],hiloBuild.getSymbolLoNumOfDecPls()); - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate((int)tmp1[i], (int)tmp2[i] ), - this.gridGeometryOfGrid, Type.GRID_CORNER); - try { - double[] d = this.descriptor.worldToPixel(new double[]{ - (double)c.asLatLon().x, (double)c.asLatLon().y - }); - - target.drawString(font, text, d[0], d[1]+offY, 0.0, TextStyle.NORMAL, - hiloBuild.getColorLo(), HorizontalAlignment.CENTER, VerticalAlignment.MIDDLE, - 0.0); - } catch (TransformException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (FactoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - - /** - * Initialize Hi/Lo Symbol set - */ - private void initHiLoSymbolSet () { - - int i; - String tmp; - String symbolName; - MARKER marker; - String catType; - Color markerColor; - float [] tmp2; - float [] tmp1 = hiloLocator.getMaxColPositions(); - /* - * Initialize High markers - */ - if ( (tmp1.length > 0 ) && - ( (hiloBuild.getSymbolHiType() == 2) || (hiloBuild.getSymbolHiType() == 3 ) )) { - if ( hiloBuild.getSymbolHiType() == 2 ) { - //set marker - tmp = "2/" + hiloBuild.getSymbolHiMarkerNumber() + "/" + textMarkerString.getTextWidth(); - marker = new MARKER(tmp); - symbolName = marker.getMarkerName(); - catType = "Markers"; - } - else { - symbolName = getSymbolName (hiloBuild.getSymbolHiMarkerNumber()); - catType = "Symbols"; - } - - markerColor = new Color(hiloBuild.getColorHi().red, hiloBuild.getColorHi().green, hiloBuild.getColorHi().blue); - Color[] colors = new Color[] {markerColor}; - Coordinate[] locations1 = new Coordinate[tmp1.length]; - tmp2 = hiloLocator.getMaxRowPositions(); - for ( i = 0; i < tmp1.length; i ++ ) { - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate((int)tmp1[i], (int)tmp2[i]), - this.gridGeometryOfGrid, Type.GRID_CORNER); + // new fields + private final IMapDescriptor descriptor; - try { - locations1[i] = new Coordinate((double)c.asLatLon().x, (double)c.asLatLon().y); - } catch (TransformException e) { - e.printStackTrace(); - } catch (FactoryException e) { - e.printStackTrace(); - } - } - gridPointHiSymbolSet = new SymbolLocationSet ( - null, - colors, - textMarkerString.getTextWidth(), - textMarkerString.getSymbolMarkerSize(), - false, - locations1, - catType, - symbolName); - symbolHiHight = gridPointHiSymbolSet.getSymbol().getSizeScale()*charPix; - } - - /* - * Initialize Low markers - */ - tmp1 = hiloLocator.getMinColPositions(); - if ( (tmp1.length > 0 ) && - ( (hiloBuild.getSymbolLoType() == 2) || (hiloBuild.getSymbolLoType() == 3) )) { - if ( hiloBuild.getSymbolLoType() == 2 ) { - //set marker - tmp = "2/" + hiloBuild.getSymbolLoMarkerNumber() + "/" + textMarkerString.getTextWidth(); - marker = new MARKER(tmp); - symbolName = marker.getMarkerName(); - catType = "Markers"; - } - else { - symbolName = getSymbolName (hiloBuild.getSymbolLoMarkerNumber()); - catType = "Symbols"; - } - markerColor = new Color(hiloBuild.getColorLo().red, hiloBuild.getColorLo().green, hiloBuild.getColorLo().blue); - Color[] colors1 = new Color[] {markerColor}; - Coordinate[] locations2 = new Coordinate[tmp1.length]; - tmp2 = hiloLocator.getMinRowPositions(); - for ( i = 0; i < tmp1.length; i ++ ) { - ReferencedCoordinate c = new ReferencedCoordinate( - new Coordinate((int)tmp1[i], (int)tmp2[i]), - this.gridGeometryOfGrid, Type.GRID_CORNER); + private final GeneralGridGeometry gridGeometryOfGrid; - try { - locations2[i] = new Coordinate((double)c.asLatLon().x, (double)c.asLatLon().y); - } catch (TransformException e) { - e.printStackTrace(); - } catch (FactoryException e) { - e.printStackTrace(); - } - } - gridPointLoSymbolSet = new SymbolLocationSet ( - null, - colors1, - textMarkerString.getTextWidth(), - textMarkerString.getSymbolMarkerSize(), - false, - locations2, - catType, - symbolName); - symbolLoHight = gridPointLoSymbolSet.getSymbol().getSizeScale()*charPix; - } + private HILOBuilder hiloBuild; - } - - /** - * COnvert float value to string - */ - private String convertFloat2String ( float value, int nPls ) { - - String text=String.format("%f", value); + private HILORelativeMinAndMaxLocator hiloLocator; - int ipre = (int)Math.pow(10,nPls); - float tmp = (float)Math.round(value*ipre)/ipre; - - if ( nPls == 0 ) { - int ii = Math.round(value); - text = Integer.toString(ii); - } - else if ( nPls == 1 ){ - text = String.format("%#.1f", tmp); - } - else if ( nPls == 2 ){ - text = String.format("%#.2f", tmp); - } - else if ( nPls == 3 ){ - text = String.format("%#.3f", tmp); - } - else if ( nPls == 4 ){ - text = String.format("%#.4f", tmp); - } - else if ( nPls == 5 ){ - text = String.format("%#.5f", tmp); - } - else if ( nPls == 6 ){ - text = String.format("%#.6f", tmp); - } - else if ( nPls == 7 ){ - text = String.format("%#.7f", tmp); - } - else if ( nPls == 8 ){ - text = String.format("%#.8f", tmp); - } - else if ( nPls == 9 ){ - text = String.format("%#.9f", tmp); - } - return text.trim(); - } - - /** - * Get symbol name - */ - private String getSymbolName ( int symbolNum ) { - String symbol = "SQUARE"; - String []name = { "SQUARE","FILLED_SQUARE","CIRCLE", "FILLED_CIRCLE","TRIANGLE_SPCL" ,"FILLED_TRIANGLE_SPCL", - "DIAMOND_SPCL","FILLED_DIAMOND_SPCL","STAR_SPCL","FILLED_STAR_SPCL","HIGH_PRESSURE_H","LOW_PRESSURE_L", - "FILLED_HIGH_PRESSURE_H","FILLED_LOW_PRESSURE_L","SINGLE_BRACKET","BOTTOM_HALF_OF_BRACKET", - "TOP_HALF_OF_BRACKET"}; - - if ( (symbolNum > 0 ) && ( symbolNum <= name.length)) { - symbol = name [symbolNum-1]; - } - return symbol; - } - - /** - * Get Font Name - */ - private String getFontName ( int fontNum ) { - String font = "Monospace"; - String [] name = {"Monospace","Serif","Serif"}; - - if ( (fontNum > 0 ) && ( fontNum <= name.length) ) { - font = name[fontNum-1]; - } - return font; - } - - /** - * Display all variables - */ - private void display () { - int i; - System.out.println ( " HIGH -- Color\t\t[" + hiloBuild.getColorHi().red + " " + hiloBuild.getColorHi().green + " " + hiloBuild.getColorHi().blue + "]"); - System.out.println ( " symbol\t\t" + hiloBuild.getSymbolHi() ); - System.out.println ( " Marker Num\t\t" + hiloBuild.getSymbolHiMarkerNumber() ); - System.out.println ( " symbol type\t\t" + hiloBuild.getSymbolHiType() ); - System.out.println ( " value flg\t\t" + ((hiloBuild.getSymbolHiPlotValue())? "T":"F") ); - System.out.println ( " precision\t\t" + hiloBuild.getSymbolHiNumOfDecPls() ); - float [] tmp = hiloLocator.getMaxColPositions(); - if ( tmp.length > 0 ) { - System.out.println ( " Number of maxima found:" + tmp.length ); - System.out.println ( " Column positions of max:"); - for ( i = 0; i < tmp.length; i ++ ) { - System.out.print( tmp[i] + " "); - if ( (i +1 )%20 == 0 ) System.out.print("\n"); - } - System.out.print("\n"); - - tmp = hiloLocator.getMaxRowPositions(); - System.out.println ( " Row positions of max:"); - for ( i = 0; i < tmp.length; i ++ ) { - System.out.print( tmp[i] + " "); - if ( (i +1 )%20 == 0 ) System.out.print("\n"); - } - System.out.print("\n"); - tmp = hiloLocator.getMaxValues(); - System.out.println ( " Values of max:"); - for ( i = 0; i < tmp.length; i ++ ) { - System.out.print( tmp[i] + " "); - if ( (i +1 )%20 == 0 ) System.out.print("\n"); - } - System.out.print("\n"); - System.out.println ( "-------------------------------------------" ); - } - - System.out.println ( " LOW -- Color\t\t[" + hiloBuild.getColorLo().red + " " + hiloBuild.getColorLo().green + " " + hiloBuild.getColorLo().blue + "]"); - System.out.println ( " symbol\t\t" + hiloBuild.getSymbolLo() ); - System.out.println ( " Marker Num\t\t" + hiloBuild.getSymbolLoMarkerNumber() ); - System.out.println ( " symbol type\t\t" + hiloBuild.getSymbolLoType() ); - System.out.println ( " value flg\t\t" + ((hiloBuild.getSymbolLoPlotValue())? "T":"F") ); - System.out.println ( " precision\t\t" + hiloBuild.getSymbolLoNumOfDecPls() ); - tmp = hiloLocator.getMinColPositions(); - if ( tmp.length > 0 ) { - System.out.println ( " Number of minima found:" + tmp.length ); - System.out.println ( " Column positions of min:"); - for ( i = 0; i < tmp.length; i ++ ) { - System.out.print( tmp[i] + " "); - if ( (i +1 )%20 == 0 ) System.out.print("\n"); - } - System.out.print("\n"); - - tmp = hiloLocator.getMinRowPositions(); - - System.out.println ( " Row positions of min:"); - for ( i = 0; i < tmp.length; i ++ ) { - System.out.print( tmp[i] + " "); - if ( (i +1 )%20 == 0 ) System.out.print("\n"); - } - System.out.print("\n"); - tmp = hiloLocator.getMinValues(); - - System.out.println ( " Values of min:"); - for ( i = 0; i < tmp.length; i ++ ) { - System.out.print( tmp[i] + " "); - if ( (i +1 )%20 == 0 ) System.out.print("\n"); - } - System.out.print("\n"); - System.out.println ( "-------------------------------------------" ); - } - System.out.println ( " Text String: size[" + textMarkerString.getTextSize() + ";" +textMarkerString.getSymbolMarkerSize()+ "] font[" + textMarkerString.getTextFont() + "] width[" + - textMarkerString.getTextWidth() + "] HW Flag [" + textMarkerString.getTextHWFlag() + "]"); - System.out.println ( " Value String: size[" + textValueString.getTextSize() + ";" + textValueString.getSymbolMarkerSize()+ "] font[" + textValueString.getTextFont() + "] width[" + - textValueString.getTextWidth() + "] HW Flag [" + textValueString.getTextHWFlag() + "]"); - System.out.println ( "==================================================" ); - } + private TextStringParser textMarkerString; + + private TextStringParser textValueString; + + private SymbolLocationSet gridPointHiSymbolSet = null; + + private SymbolLocationSet gridPointLoSymbolSet = null; + + // Hi/L symbol overtical/horizontal offset parameters + private double symbolHiHight = 0.0; + + private double symbolLoHight = 0.0; + + private int charPix = 4; + + private double vertRatio; + + Rectangle2D charSize; + + public GridRelativeHiLoDisplay(HILOBuilder hiloBuild, + HILORelativeMinAndMaxLocator hiloLocator, + TextStringParser markerStr, TextStringParser valueStr, + IMapDescriptor descriptor, ISpatialObject gridLocation) { + this.descriptor = descriptor; + this.gridGeometryOfGrid = MapUtil.getGridGeometry(gridLocation); + this.hiloBuild = hiloBuild; + this.hiloLocator = hiloLocator; + this.textMarkerString = markerStr; + this.textValueString = valueStr; + initHiLoSymbolSet(); + // display (); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.drawables.IRenderable#paint(com.raytheon.viz.core + * .IGraphicsTarget, com.raytheon.viz.core.drawables.PaintProperties) + */ + @Override + public void paint(IGraphicsTarget target, PaintProperties paintProps) + throws VizException { + + if (paintProps.isZooming()) { + return; + } + vertRatio = paintProps.getView().getExtent().getHeight() + / paintProps.getCanvasBounds().height; + + paintHighs(target, paintProps); + paintLows(target, paintProps); + } + + /** + * Draw Highs + */ + private void paintHighs(IGraphicsTarget target, PaintProperties paintProps) + throws VizException { + + if (gridPointHiSymbolSet != null) { + DisplayElementFactory df = new DisplayElementFactory(target, + this.descriptor); + ArrayList elements = df.createDisplayElements( + gridPointHiSymbolSet, paintProps); + for (IDisplayable each : elements) { + each.draw(target); + each.dispose(); + } + } else if (hiloBuild.getSymbolHiType() == 1) { + drawHiCharacter(target, paintProps); + } + + if (hiloBuild.getSymbolHiPlotValue()) { + plotGridHiValue(target); + } + } + + /** + * Draw Lows + */ + private void paintLows(IGraphicsTarget target, PaintProperties paintProps) + throws VizException { + + if (gridPointLoSymbolSet != null) { + DisplayElementFactory df = new DisplayElementFactory(target, + this.descriptor); + ArrayList elements = df.createDisplayElements( + gridPointLoSymbolSet, paintProps); + for (IDisplayable each : elements) { + each.draw(target); + each.dispose(); + } + } else if (hiloBuild.getSymbolLoType() == 1) { + drawLoCharacter(target, paintProps); + } + + if (hiloBuild.getSymbolLoPlotValue()) { + plotGridLoValue(target); + } + } + + /** + * Draw High character + */ + private void drawHiCharacter(IGraphicsTarget target, + PaintProperties paintProps) throws VizException { + + float[] tmp1 = hiloLocator.getMaxColPositions(); + if (hiloBuild.getSymbolHi().length() > 0 && tmp1.length > 0) { + String text = hiloBuild.getSymbolHi(); + float[] tmp2 = hiloLocator.getMaxRowPositions(); + + IFont font = target.initializeFont( + getFontName(textMarkerString.getTextFont()), + textMarkerString.getTextSize(), + new IFont.Style[] { IFont.Style.BOLD }); + charSize = target.getStringBounds(font, "N"); + symbolHiHight = charSize.getHeight() * charPix; + + for (int i = 0; i < tmp1.length; i++) { + + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate((double) tmp1[i] - 1, + (double) tmp2[i] - 1), this.gridGeometryOfGrid, + Type.GRID_CENTER); + try { + double[] d = this.descriptor.worldToPixel(new double[] { + (double) c.asLatLon().x, (double) c.asLatLon().y }); + + target.drawString(font, text, d[0], d[1], 0.0, + TextStyle.NORMAL, hiloBuild.getColorHi(), + HorizontalAlignment.CENTER, + VerticalAlignment.MIDDLE, 0.0); + } catch (TransformException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (FactoryException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + + /** + * Draw Low character + */ + private void drawLoCharacter(IGraphicsTarget target, + PaintProperties paintProps) throws VizException { + + float[] tmp1 = hiloLocator.getMinColPositions(); + if (hiloBuild.getSymbolLo().length() > 0 && tmp1.length > 0) { + String text = hiloBuild.getSymbolLo(); + float[] tmp2 = hiloLocator.getMinRowPositions(); + + IFont font = target.initializeFont( + getFontName(textMarkerString.getTextFont()), + textMarkerString.getTextSize(), + new IFont.Style[] { IFont.Style.BOLD }); + charSize = target.getStringBounds(font, "N"); + symbolLoHight = charSize.getHeight() * charPix; + + for (int i = 0; i < tmp1.length; i++) { + + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate((double) tmp1[i] - 1, + (double) tmp2[i] - 1), this.gridGeometryOfGrid, + Type.GRID_CENTER); + try { + double[] d = this.descriptor.worldToPixel(new double[] { + (double) c.asLatLon().x, (double) c.asLatLon().y }); + + target.drawString(font, text, d[0], d[1], 0.0, + TextStyle.NORMAL, hiloBuild.getColorLo(), + HorizontalAlignment.CENTER, + VerticalAlignment.MIDDLE, 0.0); + } catch (TransformException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (FactoryException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + + /** + * Plot High grid values + */ + private void plotGridHiValue(IGraphicsTarget target) throws VizException { + float[] tmp1 = hiloLocator.getMaxColPositions(); + + if (tmp1.length > 0) { + float[] tmp2 = hiloLocator.getMaxRowPositions(); + float[] tmp3 = hiloLocator.getMaxValues(); + double offY = symbolHiHight; + IFont font = target.initializeFont( + getFontName(textValueString.getTextFont()), + textValueString.getTextSize(), + new IFont.Style[] { IFont.Style.BOLD }); + if (offY > 0.0) { + charSize = target.getStringBounds(font, "N"); + // offY += charSize.getHeight()*charPix; + offY = charSize.getHeight() * vertRatio; + } + for (int i = 0; i < tmp1.length; i++) { + + String text = convertFloat2String(tmp3[i], + hiloBuild.getSymbolHiNumOfDecPls()); + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate((double) tmp1[i] - 1, + (double) tmp2[i] - 1), this.gridGeometryOfGrid, + Type.GRID_CENTER); + try { + double[] d = this.descriptor.worldToPixel(new double[] { + (double) c.asLatLon().x, (double) c.asLatLon().y }); + + target.drawString(font, text, d[0], d[1] + offY, 0.0, + TextStyle.NORMAL, hiloBuild.getColorHi(), + HorizontalAlignment.CENTER, + VerticalAlignment.MIDDLE, 0.0); + } catch (TransformException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (FactoryException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + + /** + * Plot Low grid values + */ + private void plotGridLoValue(IGraphicsTarget target) throws VizException { + float[] tmp1 = hiloLocator.getMinColPositions(); + + if (tmp1.length > 0) { + float[] tmp2 = hiloLocator.getMinRowPositions(); + float[] tmp3 = hiloLocator.getMinValues(); + + double offY = symbolLoHight; + IFont font = target.initializeFont( + getFontName(textValueString.getTextFont()), + textValueString.getTextSize(), + new IFont.Style[] { IFont.Style.BOLD }); + if (offY > 0.0) { + charSize = target.getStringBounds(font, "N"); + offY = charSize.getHeight() * vertRatio; + } + for (int i = 0; i < tmp1.length; i++) { + + String text = convertFloat2String(tmp3[i], + hiloBuild.getSymbolLoNumOfDecPls()); + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate((double) tmp1[i] - 1, + (double) tmp2[i] - 1), this.gridGeometryOfGrid, + Type.GRID_CENTER); + try { + double[] d = this.descriptor.worldToPixel(new double[] { + (double) c.asLatLon().x, (double) c.asLatLon().y }); + + target.drawString(font, text, d[0], d[1] + offY, 0.0, + TextStyle.NORMAL, hiloBuild.getColorLo(), + HorizontalAlignment.CENTER, + VerticalAlignment.MIDDLE, 0.0); + } catch (TransformException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (FactoryException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + + /** + * Initialize Hi/Lo Symbol set + */ + private void initHiLoSymbolSet() { + + int i; + String tmp; + String symbolName; + MARKER marker; + String catType; + Color markerColor; + float[] tmp2; + float[] tmp1 = hiloLocator.getMaxColPositions(); + /* + * Initialize High markers + */ + if ((tmp1.length > 0) + && ((hiloBuild.getSymbolHiType() == 2) || (hiloBuild + .getSymbolHiType() == 3))) { + if (hiloBuild.getSymbolHiType() == 2) { + // set marker + tmp = "2/" + hiloBuild.getSymbolHiMarkerNumber() + "/" + + textMarkerString.getTextWidth(); + marker = new MARKER(tmp); + symbolName = marker.getMarkerName(); + catType = "Markers"; + } else { + symbolName = getSymbolName(hiloBuild.getSymbolHiMarkerNumber()); + catType = "Symbols"; + } + + markerColor = new Color(hiloBuild.getColorHi().red, + hiloBuild.getColorHi().green, hiloBuild.getColorHi().blue); + Color[] colors = new Color[] { markerColor }; + Coordinate[] locations1 = new Coordinate[tmp1.length]; + tmp2 = hiloLocator.getMaxRowPositions(); + for (i = 0; i < tmp1.length; i++) { + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate((double) tmp1[i] - 1, + (double) tmp2[i] - 1), this.gridGeometryOfGrid, + Type.GRID_CENTER); + + try { + locations1[i] = new Coordinate((double) c.asLatLon().x, + (double) c.asLatLon().y); + } catch (TransformException e) { + e.printStackTrace(); + } catch (FactoryException e) { + e.printStackTrace(); + } + } + gridPointHiSymbolSet = new SymbolLocationSet(null, colors, + textMarkerString.getTextWidth(), + textMarkerString.getSymbolMarkerSize(), false, locations1, + catType, symbolName); + symbolHiHight = gridPointHiSymbolSet.getSymbol().getSizeScale() + * charPix; + } + + /* + * Initialize Low markers + */ + tmp1 = hiloLocator.getMinColPositions(); + if ((tmp1.length > 0) + && ((hiloBuild.getSymbolLoType() == 2) || (hiloBuild + .getSymbolLoType() == 3))) { + if (hiloBuild.getSymbolLoType() == 2) { + // set marker + tmp = "2/" + hiloBuild.getSymbolLoMarkerNumber() + "/" + + textMarkerString.getTextWidth(); + marker = new MARKER(tmp); + symbolName = marker.getMarkerName(); + catType = "Markers"; + } else { + symbolName = getSymbolName(hiloBuild.getSymbolLoMarkerNumber()); + catType = "Symbols"; + } + markerColor = new Color(hiloBuild.getColorLo().red, + hiloBuild.getColorLo().green, hiloBuild.getColorLo().blue); + Color[] colors1 = new Color[] { markerColor }; + Coordinate[] locations2 = new Coordinate[tmp1.length]; + tmp2 = hiloLocator.getMinRowPositions(); + for (i = 0; i < tmp1.length; i++) { + ReferencedCoordinate c = new ReferencedCoordinate( + new Coordinate((double) tmp1[i] - 1, + (double) tmp2[i] - 1), this.gridGeometryOfGrid, + Type.GRID_CENTER); + + try { + locations2[i] = new Coordinate((double) c.asLatLon().x, + (double) c.asLatLon().y); + } catch (TransformException e) { + e.printStackTrace(); + } catch (FactoryException e) { + e.printStackTrace(); + } + } + gridPointLoSymbolSet = new SymbolLocationSet(null, colors1, + textMarkerString.getTextWidth(), + textMarkerString.getSymbolMarkerSize(), false, locations2, + catType, symbolName); + symbolLoHight = gridPointLoSymbolSet.getSymbol().getSizeScale() + * charPix; + } + + } + + /** + * COnvert float value to string + */ + private String convertFloat2String(float value, int nPls) { + + String text = String.format("%f", value); + + int ipre = (int) Math.pow(10, nPls); + float tmp = (float) Math.round(value * ipre) / ipre; + + if (nPls == 0) { + int ii = Math.round(value); + text = Integer.toString(ii); + } else if (nPls == 1) { + text = String.format("%#.1f", tmp); + } else if (nPls == 2) { + text = String.format("%#.2f", tmp); + } else if (nPls == 3) { + text = String.format("%#.3f", tmp); + } else if (nPls == 4) { + text = String.format("%#.4f", tmp); + } else if (nPls == 5) { + text = String.format("%#.5f", tmp); + } else if (nPls == 6) { + text = String.format("%#.6f", tmp); + } else if (nPls == 7) { + text = String.format("%#.7f", tmp); + } else if (nPls == 8) { + text = String.format("%#.8f", tmp); + } else if (nPls == 9) { + text = String.format("%#.9f", tmp); + } + return text.trim(); + } + + /** + * Get symbol name + */ + private String getSymbolName(int symbolNum) { + String symbol = "SQUARE"; + String[] name = { "SQUARE", "FILLED_SQUARE", "CIRCLE", "FILLED_CIRCLE", + "TRIANGLE_SPCL", "FILLED_TRIANGLE_SPCL", "DIAMOND_SPCL", + "FILLED_DIAMOND_SPCL", "STAR_SPCL", "FILLED_STAR_SPCL", + "HIGH_PRESSURE_H", "LOW_PRESSURE_L", "FILLED_HIGH_PRESSURE_H", + "FILLED_LOW_PRESSURE_L", "SINGLE_BRACKET", + "BOTTOM_HALF_OF_BRACKET", "TOP_HALF_OF_BRACKET" }; + + if ((symbolNum > 0) && (symbolNum <= name.length)) { + symbol = name[symbolNum - 1]; + } + return symbol; + } + + /** + * Get Font Name + */ + private String getFontName(int fontNum) { + String font = "Monospace"; + String[] name = { "Monospace", "Serif", "Serif" }; + + if ((fontNum > 0) && (fontNum <= name.length)) { + font = name[fontNum - 1]; + } + return font; + } + + /** + * Display all variables + */ + private void display() { + int i; + System.out.println(" HIGH -- Color\t\t[" + + hiloBuild.getColorHi().red + " " + + hiloBuild.getColorHi().green + " " + + hiloBuild.getColorHi().blue + "]"); + System.out.println(" symbol\t\t" + hiloBuild.getSymbolHi()); + System.out.println(" Marker Num\t\t" + + hiloBuild.getSymbolHiMarkerNumber()); + System.out.println(" symbol type\t\t" + + hiloBuild.getSymbolHiType()); + System.out.println(" value flg\t\t" + + ((hiloBuild.getSymbolHiPlotValue()) ? "T" : "F")); + System.out.println(" precision\t\t" + + hiloBuild.getSymbolHiNumOfDecPls()); + float[] tmp = hiloLocator.getMaxColPositions(); + if (tmp.length > 0) { + System.out.println(" Number of maxima found:" + tmp.length); + System.out.println(" Column positions of max:"); + for (i = 0; i < tmp.length; i++) { + System.out.print(tmp[i] + " "); + if ((i + 1) % 20 == 0) + System.out.print("\n"); + } + System.out.print("\n"); + + tmp = hiloLocator.getMaxRowPositions(); + System.out.println(" Row positions of max:"); + for (i = 0; i < tmp.length; i++) { + System.out.print(tmp[i] + " "); + if ((i + 1) % 20 == 0) + System.out.print("\n"); + } + System.out.print("\n"); + tmp = hiloLocator.getMaxValues(); + System.out.println(" Values of max:"); + for (i = 0; i < tmp.length; i++) { + System.out.print(tmp[i] + " "); + if ((i + 1) % 20 == 0) + System.out.print("\n"); + } + System.out.print("\n"); + System.out.println("-------------------------------------------"); + } + + System.out.println(" LOW -- Color\t\t[" + hiloBuild.getColorLo().red + + " " + hiloBuild.getColorLo().green + " " + + hiloBuild.getColorLo().blue + "]"); + System.out.println(" symbol\t\t" + hiloBuild.getSymbolLo()); + System.out.println(" Marker Num\t\t" + + hiloBuild.getSymbolLoMarkerNumber()); + System.out.println(" symbol type\t\t" + + hiloBuild.getSymbolLoType()); + System.out.println(" value flg\t\t" + + ((hiloBuild.getSymbolLoPlotValue()) ? "T" : "F")); + System.out.println(" precision\t\t" + + hiloBuild.getSymbolLoNumOfDecPls()); + tmp = hiloLocator.getMinColPositions(); + if (tmp.length > 0) { + System.out.println(" Number of minima found:" + tmp.length); + System.out.println(" Column positions of min:"); + for (i = 0; i < tmp.length; i++) { + System.out.print(tmp[i] + " "); + if ((i + 1) % 20 == 0) + System.out.print("\n"); + } + System.out.print("\n"); + + tmp = hiloLocator.getMinRowPositions(); + + System.out.println(" Row positions of min:"); + for (i = 0; i < tmp.length; i++) { + System.out.print(tmp[i] + " "); + if ((i + 1) % 20 == 0) + System.out.print("\n"); + } + System.out.print("\n"); + tmp = hiloLocator.getMinValues(); + + System.out.println(" Values of min:"); + for (i = 0; i < tmp.length; i++) { + System.out.print(tmp[i] + " "); + if ((i + 1) % 20 == 0) + System.out.print("\n"); + } + System.out.print("\n"); + System.out.println("-------------------------------------------"); + } + System.out.println(" Text String: size[" + + textMarkerString.getTextSize() + ";" + + textMarkerString.getSymbolMarkerSize() + "] font[" + + textMarkerString.getTextFont() + "] width[" + + textMarkerString.getTextWidth() + "] HW Flag [" + + textMarkerString.getTextHWFlag() + "]"); + System.out.println(" Value String: size[" + + textValueString.getTextSize() + ";" + + textValueString.getSymbolMarkerSize() + "] font[" + + textValueString.getTextFont() + "] width[" + + textValueString.getTextWidth() + "] HW Flag [" + + textValueString.getTextHWFlag() + "]"); + System.out + .println("=================================================="); + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GriddedVectorDisplay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GriddedVectorDisplay.java index a1d6263ff8..c7032a2b30 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GriddedVectorDisplay.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/contours/GriddedVectorDisplay.java @@ -3,13 +3,11 @@ package gov.noaa.nws.ncep.viz.rsc.ncgrid.contours; import gov.noaa.nws.ncep.edex.common.dataRecords.NcFloatDataRecord; import gov.noaa.nws.ncep.viz.common.ui.color.GempakColor; +import gov.noaa.nws.ncep.viz.rsc.ncgrid.rsc.NcgridResourceData; import java.nio.FloatBuffer; -import org.eclipse.swt.graphics.RGB; import org.geotools.referencing.GeodeticCalculator; -import org.opengis.metadata.spatial.PixelOrientation; -import org.opengis.referencing.datum.PixelInCell; import com.raytheon.uf.common.geospatial.ISpatialObject; import com.raytheon.uf.common.geospatial.MapUtil; @@ -41,7 +39,11 @@ import com.vividsolutions.jts.geom.Coordinate; * Jun 22, 2010 bsteffen Initial creation * Nov 22, 2010 M. Li modified from RTS for NCGRID * Nov 02, 2011 X. Guo Updated - * + * Feb 06, 2012 #538 Q. Zhou Changed density to filter. + * Feb 15, 2012 #539 Q. Zhou Change barb tail direction on south hemisphere + * Mar 01, 2012 X. Guo Added isDirectional and contourAttributes + * to handle vector type changes + * Apr 03, 2012 X. Guo Added createWireFrame * * * @author bsteffen @@ -73,13 +75,20 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { private NcFloatDataRecord data; + private ContourAttributes contourAttributes; + + private Coordinate latLon; + + private boolean isDirectional; + public GriddedVectorDisplay(NcFloatDataRecord rec, DisplayType displayType, boolean directional, IMapDescriptor descriptor, - String windAttr, ISpatialObject gridLocation) { + ISpatialObject gridLocation, ContourAttributes attrs) { super(descriptor, MapUtil.getGridGeometry(gridLocation),gridLocation.getNx(),gridLocation.getNy()); this.data = rec; + this.contourAttributes = attrs; if (directional) { float[] dir = rec.getXdata(); float[] spd = new float[dir.length]; @@ -116,10 +125,12 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { this.gridLocation = gridLocation; this.displayType = displayType; this.gc = new GeodeticCalculator(descriptor.getCRS()); + this.isDirectional = directional; int colorIndex = 31; float sizeFactor = 1; lineWidth = 1; + String windAttr = attrs.getWind(); if (windAttr != null && !windAttr.isEmpty()) { if (windAttr.contains("bk")) windAttr = windAttr.replace("bk", ""); String [] attr = windAttr.trim().split("/"); @@ -135,7 +146,7 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) + public void paint(NcgridResourceData gridRscData, IGraphicsTarget target, PaintProperties paintProps) throws VizException { if (paintProps.isZooming()) { @@ -149,13 +160,27 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { } if (lastShape == null) { lastShape = target.createWireframeShape(false, descriptor); - super.paint(target, paintProps); + super.paint(gridRscData, target, paintProps); lastShape.compile(); } target.drawWireframeShape(lastShape, color, lineWidth, lineStyle); } + public void createWireFrame (NcgridResourceData gridRscData, IGraphicsTarget target, PaintProperties paintProps) { + + if (lastShape == null) { + try { + lastShape = target.createWireframeShape(false, descriptor); + super.paint(gridRscData, target, paintProps); + lastShape.compile(); + } + catch ( VizException e) { + lastShape = null; + } + } + } + protected void paintImage(int x, int y, PaintProperties paintProps, double adjSize) throws VizException { int idx = x + y * this.gridDims[0]; @@ -173,13 +198,13 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { ReferencedCoordinate newrco = new ReferencedCoordinate( new Coordinate(x, y), - this.gridGeometryOfGrid, Type.GRID_CORNER); + this.gridGeometryOfGrid, Type.GRID_CENTER); Coordinate plotLoc = null; try { plotLoc = newrco.asPixel(this.descriptor .getGridGeometry()); - Coordinate latLon = newrco.asLatLon(); + latLon = newrco.asLatLon(); if (latLon.x > 180 || latLon.x < -180 || latLon.y < -90 || latLon.y > 90) return; @@ -289,26 +314,40 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { // PLOT LONE HALF-BARB, IF NECESSARY if (n50 == 0 && n10 == 0) { - ix2 = ix1 - dix * add; - jy2 = jy1 + djy * add; - ix1 = ix2 + dix1 * barb / 2.0; - jy1 = jy2 - djy1 * barb / 2.0; - lastShape.addLineSegment(new double[][] { { ix2, jy2 }, + if (latLon.y >= 0) { + ix2 = ix1 + dix1 * barb / 2.0; //- + jy2 = jy1 - djy1 * barb / 2.0; //+ + } + else { + ix2 = ix1 - dix1 * barb / 2.0; + jy2 = jy1 + djy1 * barb / 2.0; + } + + ix1 = ix1 - dix * add; + jy1 = jy1 + djy * add; + lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 } }); return; } // PLOT FLAGS, IF NECESSARY for (int i = 0; i < n50; i++) { - ix2 = ix1 + dix1 * barb; - jy2 = jy1 - djy1 * barb; + if (latLon.y >= 0) { + ix2 = ix1 + dix1 * barb; //+ + jy2 = jy1 - djy1 * barb; //- + } + else { + ix2 = ix1 - dix1 * barb; + jy2 = jy1 + djy1 * barb; + } lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 } }); - ix1 = ix1 - dix * add * 2; + ix1 = ix1 - dix * add * 2; // 2 space jy1 = jy1 + djy * add * 2; lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 } }); } + if (n50 > 0) { ix1 = ix1 - dix * add / 2.0; jy1 = jy1 + djy * add / 2.0; @@ -316,8 +355,14 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { // PLOT BARB, IF NECESSARY for (int i = 0; i < n10; i++) { - ix2 = ix1 + dix1 * barb; - jy2 = jy1 - djy1 * barb; + if (latLon.y >= 0) { + ix2 = ix1 + dix1 * barb; //+ + jy2 = jy1 - djy1 * barb;//- + } + else { + ix2 = ix1 - dix1 * barb; + jy2 = jy1 + djy1 * barb; + } lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 } }); ix1 = ix1 - dix * add; @@ -326,8 +371,14 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { // PLOT HALF-BARB, IF NECESSARY if (n5 != 0) { - ix2 = ix1 + dix1 * barb / 2.0; - jy2 = jy1 - djy1 * barb / 2.0; + if (latLon.y >= 0) { + ix2 = ix1 + dix1 * barb / 2.0; //+ + jy2 = jy1 - djy1 * barb / 2.0; //- + } + else { + ix2 = ix1 - dix1 * barb / 2.0; + jy2 = jy1 + djy1 * barb / 2.0; + } lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 } }); } @@ -446,11 +497,11 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { } /** - * @param density - * the density to set + * @param filter + * the filter to set. Changed from density. */ - public boolean setDensity(double density) { - if (super.setDensity(density)) { + public boolean setFilter(double filter) { + if (super.setFilter(filter)) { disposeImages(); if (this.target != null) { this.target.setNeedsRefresh(true); @@ -509,4 +560,25 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay { return data; } + public boolean checkAttrsChanged (DisplayType type, boolean dir, String attr) { + boolean isChanged = false; + if ( this.displayType != type || + this.isDirectional != dir || + ! this.contourAttributes.getWind().equalsIgnoreCase(attr)) { + isChanged = true; + } + return isChanged; + } + + public boolean isMatch ( ContourAttributes attr) { + boolean match = false; + if ( this.contourAttributes == null ) return match; + if ( this.contourAttributes.getGlevel().equalsIgnoreCase(attr.getGlevel())&& + this.contourAttributes.getGvcord().equalsIgnoreCase(attr.getGvcord()) && + this.contourAttributes.getScale().equalsIgnoreCase(attr.getScale()) && + this.contourAttributes.getGdpfun().equalsIgnoreCase(attr.getGdpfun()) ) { + match = true; + } + return match; + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/dgdriv/Dgdriv.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/dgdriv/Dgdriv.java index 37152b7039..58f61a581a 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/dgdriv/Dgdriv.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/dgdriv/Dgdriv.java @@ -91,6 +91,9 @@ import gov.noaa.nws.ncep.viz.rsc.ncgrid.rsc.NcgridResourceData; * 11/22/2011 X. Guo Re-contrain datauri request map * 12/12/2011 X. Guo Updated Ensemble requests * 01/12/2011 X. Guo Updated getFilename() + * 02/02/2012 X. Guo Updated query ensemble navigation + * 03/13/2012 X. Guo Clean up + * 03/28/2012 X. Guo Don't need to convert gdfile toUppercase * * * @author tlee @@ -106,11 +109,9 @@ public class Dgdriv { private String gdfileOriginal; private NcgridResourceData gridRscData; - private float resultMin=9999999.0f, resultMax=0.0f; private ISpatialObject spatialObj; private ArrayList dataForecastTimes; private static Connector conn; - private NcDataTree dataTree; private NcInventory inventory; public static final String PLUGIN_NAME_QUERY = "pluginName"; @@ -134,7 +135,7 @@ public class Dgdriv { // private static boolean nativeLogging = true; private static boolean nativeLogging = false; - + public Dgdriv() { /* @@ -154,7 +155,6 @@ public class Dgdriv { scalar = false; arrowVector = false; dataForecastTimes = new ArrayList(); - dataTree = NcInventory.getInstance().getNcDataTree(); inventory = NcInventory.getInstance(); try { conn = Connector.getInstance(); @@ -337,9 +337,9 @@ public class Dgdriv { logger.debug("retrieve data nx=" + nx +" ny=" + ny + " rDataSize=" + rDataSize); gd.gem.db_returndata(flipData(rData, nx, ny),datSize); long t2 = System.currentTimeMillis(); - System.out.println("\tretrieve data took " + (t1-t0)); +// System.out.println("\tretrieve data took " + (t1-t0)); logger.debug("retrieve data took " + (t1-t0)); - System.out.println("\treturn data took " + (t2-t1)); +// System.out.println("\treturn data took " + (t2-t1)); logger.debug("return data took " + (t2-t1)); return true; } else { @@ -363,6 +363,7 @@ public class Dgdriv { @Override public boolean callback(String msg) { String navigationString=null; + logger.debug("request navigation for: " + msg ); long t0 = System.currentTimeMillis(); if (gdfile.startsWith("{") && gdfile.endsWith("}") ) { navigationString = getEnsembleNavigation( msg ); @@ -373,7 +374,7 @@ public class Dgdriv { logger.debug("Retrieved this navigation string " + navigationString); gd.gem.db_returnnav(navigationString); long t1 = System.currentTimeMillis(); - System.out.println("\treturn navigation " + navigationString + " took " + (t1-t0)); +// System.out.println("\treturn navigation " + navigationString + " took " + (t1-t0)); logger.debug("return navigation " + navigationString + " took " + (t1-t0)); return true; } @@ -403,11 +404,12 @@ public class Dgdriv { // } public boolean callback(String msg) { try { +// logger.debug("request datauri for:" + msg ); long t0 = System.currentTimeMillis(); String dataURI = getDataURI(msg); gd.gem.db_returnduri(dataURI); long t1 = System.currentTimeMillis(); - System.out.println("\treturn dataURI " + dataURI + " took " + (t1-t0)); +// System.out.println("\treturn dataURI " + dataURI + " took " + (t1-t0)); logger.debug("return dataURI " + dataURI + " took " + (t1-t0)); return true; } catch (VizException e) { @@ -426,7 +428,7 @@ public class Dgdriv { String cycleFcstHrsString = getCycleFcstHrsString(dataForecastTimes); gd.gem.db_returnfhrs(cycleFcstHrsString); long t1 = System.currentTimeMillis(); - System.out.println("\treturn cycle forecast hours string " + cycleFcstHrsString + " took " + (t1-t0)); +// System.out.println("\treturn cycle forecast hours string " + cycleFcstHrsString + " took " + (t1-t0)); logger.debug("return cycle forecast hours string " + cycleFcstHrsString + " took " + (t1-t0)); return true; } @@ -440,10 +442,10 @@ public class Dgdriv { try { long t0 = System.currentTimeMillis(); String fileNames = executeScript(msg); - System.out.println("Retrieved members:" + fileNames); +// System.out.println("Retrieved members:" + fileNames); gd.gem.db_returnflnm(fileNames); long t1 = System.currentTimeMillis(); - System.out.println("\treturn file names string " + fileNames + " took " + (t1-t0)); +// System.out.println("\treturn file names string " + fileNames + " took " + (t1-t0)); logger.debug("return file names string " + fileNames + " took " + (t1-t0)); return true; } catch (VizException e) { @@ -552,7 +554,7 @@ public class Dgdriv { } long t06 = System.currentTimeMillis(); - System.out.println("dgc_nfil took " + (t06-t05)); +// System.out.println("dgc_nfil took " + (t06-t05)); logger.debug("dgc_nfil took: " + (t06-t05)); /* @@ -672,7 +674,7 @@ public class Dgdriv { } long t012 = System.currentTimeMillis(); - System.out.println("From gdc_nfil to dgc_grid took:" + (t012-t06)); +// System.out.println("From gdc_nfil to dgc_grid took:" + (t012-t06)); logger.debug("From gdc_nfil to dgc_grid took: " + (t012-t06)); /* * Compute the requested grid. @@ -698,7 +700,7 @@ public class Dgdriv { } } long t013 = System.currentTimeMillis(); - System.out.println("dgc_grid took " + (t013-t012)); +// System.out.println("dgc_grid took " + (t013-t012)); logger.debug("dgc_grid took: " + (t013-t012)); /* @@ -718,28 +720,15 @@ public class Dgdriv { fds.setDimension(2); fds.setSizes(new long[] { igx.getValue(), igy.getValue()}); fds.setVector(false); - - resultMin = rmin.getValue(); - resultMax = rmax.getValue(); - + if (!scalar){ // vector - resultMin = 100.0f; - resultMax = 0.0f; if ( arrowVector ) { gd.gem.grc_sscl( iscalv, igx, igy, ix12, iy12, igx, igy, vgrid, rmin, rmax, iret); } fds.setYdata(flopData(vgrid, igx.getValue(), igy.getValue())); fds.setDimension(2); fds.setSizes(new long[] { igx.getValue(), igy.getValue()}); - fds.setVector(true); - - for (int i = 0; i < grid_size; i++) { - if (ugrid[i] == -9999.0 || vgrid[i] == -9999.0) continue; - float speed = (float) Math.hypot(ugrid[i], vgrid[i]); - if (speed > resultMax) resultMax = speed; - if (speed < resultMin) resultMin = speed; - } - + fds.setVector(true); } /* * Free memory for all internal grids @@ -747,7 +736,7 @@ public class Dgdriv { gd.gem.dg_fall_( iret); long t1 = System.currentTimeMillis(); logger.debug("Scaling took: " + (t1-t013)); - System.out.println("Scaling took:" + (t1-t013)); +// System.out.println("Scaling took:" + (t1-t013)); printInfoMessage(t1 - t0); return fds; } @@ -775,12 +764,13 @@ public class Dgdriv { private void prepareGridDTInfo() { String alias = this.gdfile; String path = "A2DB_GRID"; + logger.debug("prepareGridDTInfo-- alias:" + alias + " gdfileOriginal:" + this.gdfileOriginal); String template = this.gdfileOriginal + "_db"; if ( this.gdfileOriginal.contains(":")) { template = this.gdfileOriginal.substring(0, this.gdfileOriginal.indexOf(":")) + "_db"; } IntByReference iret = new IntByReference(0); - System.out.println(); +// System.out.println(); gd.gem.db_seta2dtinfo_ (alias, path, template, iret); } @@ -817,7 +807,7 @@ public class Dgdriv { if ( perturbationNum != null ) { sba.append(":" + perturbationNum ); } - System.out.println(); +// System.out.println(); sba.append("|"); sbt.append(getEnsembleTemplate(ensName,perturbationNum)); sbt.append("|"); @@ -851,7 +841,7 @@ public class Dgdriv { String path = sbp.toString().substring(0, sbp.toString().length()-1); String template = sbt.toString().substring(0, sbt.toString().length()-1); IntByReference iret = new IntByReference(0); - System.out.println(); +// System.out.println(); gd.gem.db_seta2dtinfo_ (alias, path, template, iret); } @@ -875,7 +865,7 @@ public class Dgdriv { pdoList = conn.connect(scriptToRun, null, 60000); String ensTemplate = (String) pdoList[0]; long t1 = System.currentTimeMillis(); - System.out.println("\tgetEnsembleTemplate took: " + (t1-t0)); +// System.out.println("\tgetEnsembleTemplate took: " + (t1-t0)); logger.debug("getEnsembleTemplate took: " + (t1-t0)); return ensTemplate; } catch (VizException e) { @@ -1096,7 +1086,7 @@ public class Dgdriv { toprint.append(" ^" + this.gdattim + " @" + this.glevel + " %" + this.gvcord.toUpperCase()); toprint.append(" from " + this.dataSource + " took: " + t + " ms\n"); // toprint.append("\nMin: " + resultMin + " Max: " + resultMax + "\n"); - System.out.println(toprint.toString()); +// System.out.println(toprint.toString()); logger.debug(toprint.toString()); } @@ -1112,6 +1102,7 @@ public class Dgdriv { IDataStore ds = DataStoreFactory.getDataStore(new File(fileName)); dr = ds.retrieve("", dataURI + "/" + dataset, request); +// dr = ds.retrieve(dataURI ,dataset, request); float[] data = (float[]) dr.getDataObject(); long t002 = System.currentTimeMillis(); logger.debug("Reading " + dataURI + " from hdf5 took: " + (t002-t001)); @@ -1297,7 +1288,7 @@ public class Dgdriv { pdoList = conn.connect(scriptToRun, null, 60000); String navStr = (String) pdoList[0]; long t1 = System.currentTimeMillis(); - System.out.println("\texecuteScript(dataURI) took: " + (t1-t0)); +// System.out.println("\texecuteScript(dataURI) took: " + (t1-t0)); logger.debug("executeScript took: " + (t1-t0)); return navStr; } @@ -1366,7 +1357,7 @@ public class Dgdriv { NcgribRecord rec = (NcgribRecord) pdoList[0]; long t1 = System.currentTimeMillis(); - System.out.println("\tgetDataURI took: " + (t1-t0)); +// System.out.println("\tgetDataURI took: " + (t1-t0)); logger.debug("getDataURI took: " + (t1-t0)); return rec.getDataURI(); } @@ -1427,7 +1418,7 @@ public class Dgdriv { else sba.append (String.valueOf(mbrWt)); sba.append ("%"); } - sba.append(model.toUpperCase()); + sba.append(model); sba.append(":"); sba.append (mb); if ( cycleTime != null ) { @@ -1456,6 +1447,7 @@ public class Dgdriv { private String getEnsembleNavigation ( String msg){ String navStr = null; + logger.debug("getEnsembleNavigation: " + msg + " dataTime:" + dataForecastTimes.get(0).toString()); String []tmpAttrs = msg.split("\\|"); Map queryList = new HashMap(); queryList.put(PLUGIN_NAME_QUERY, new RequestConstraint( "ncgrib", ConstraintType.EQUALS ) ); @@ -1465,10 +1457,17 @@ public class Dgdriv { queryList.put("eventName", new RequestConstraint( tmpAttrs[1], ConstraintType.EQUALS ) ); } + if ( tmpAttrs[2] != null && tmpAttrs[2].length() > 0) { + String navTime = buildRefTime(tmpAttrs[2]); + logger.debug("getEnsembleNavigation: " + navTime ); + queryList.put("dataTime", new RequestConstraint( navTime ) ); + } + else { + queryList.put("dataTime", new RequestConstraint( dataForecastTimes.get(0).toString() ) ); + } LayerProperty prop = new LayerProperty(); prop.setDesiredProduct(ResourceType.PLAN_VIEW); - queryList.put("dataTime", new RequestConstraint( dataForecastTimes.get(0).toString() ) ); try { prop.setEntryQueryParameters(queryList, false); prop.setNumberOfImages(1); @@ -1491,5 +1490,25 @@ public class Dgdriv { } return navStr; } + + private String buildRefTime( String navTime) { + StringBuffer reftime = new StringBuffer(); + String []dt = navTime.split("f"); + reftime.append(dt[0].substring(0, 4)); + reftime.append("-"); + reftime.append (dt[0].substring(4, 6)); + reftime.append("-"); + reftime.append (dt[0].substring(6, 8)); + reftime.append(" "); + reftime.append (dt[0].substring(8,dt[0].length() )); + reftime.append(":00:00.0 ("); + int ft =0; + if ( dt[1] != null && dt[1].length() > 0 ){ + ft = Integer.parseInt(dt[1]); + } + reftime.append(String.valueOf(ft)); + reftime.append(")"); + return reftime.toString(); + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditEnsembleAttributesDialog.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditEnsembleAttributesDialog.java index a1eb198d8c..a5ad131dcd 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditEnsembleAttributesDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditEnsembleAttributesDialog.java @@ -32,7 +32,8 @@ import com.raytheon.uf.viz.core.exception.VizException; * Nov,22 2010 352 X. Guo Add HILO, HLSYM and move all help functions * into NcgridAttributesHelp.java * Dec 13 2011 578 G. Hull added ensembleComponentWeights, and folded the - * EnsembleSelectDialog into this one. + * EnsembleSelectDialog into this one. + * Feb 15 2013 X. Guo Added skip and filter * * @author mli * @version 1 @@ -42,6 +43,8 @@ public class EditEnsembleAttributesDialog extends AbstractEditResourceAttrsDialo private RscAttrValue cintString = null; private RscAttrValue glevel = null; private RscAttrValue gvcord = null; + private RscAttrValue skip = null; + private RscAttrValue filter = null; private RscAttrValue scale = null; private RscAttrValue gdpfun = null; private RscAttrValue type = null; @@ -58,7 +61,8 @@ public class EditEnsembleAttributesDialog extends AbstractEditResourceAttrsDialo private Text glevelText; private Text gvcordText; - + private Text skipText; + private Text filterText; private Text scaleText; private Text gdpfunText; private Text typeText; @@ -91,6 +95,8 @@ public class EditEnsembleAttributesDialog extends AbstractEditResourceAttrsDialo cintString = editedRscAttrSet.getRscAttr("cint"); glevel = editedRscAttrSet.getRscAttr("glevel"); gvcord = editedRscAttrSet.getRscAttr("gvcord"); + skip = editedRscAttrSet.getRscAttr("skip"); + filter = editedRscAttrSet.getRscAttr("filter"); scale = editedRscAttrSet.getRscAttr("scale"); gdpfun = editedRscAttrSet.getRscAttr("gdpfun"); type = editedRscAttrSet.getRscAttr("type"); @@ -165,6 +171,29 @@ public class EditEnsembleAttributesDialog extends AbstractEditResourceAttrsDialo gvcord.setAttrValue((String)gvcordText.getText().trim()); } }); + // SKIP + Label skipLabel = new Label(gridAttrsComp, SWT.NONE); + skipLabel.setText("SKIP:"); + skipText = new Text(gridAttrsComp,SWT.SINGLE | SWT.BORDER ); + skipText.setLayoutData(new GridData(230, SWT.DEFAULT)); + skipText.setText((String)skip.getAttrValue()); + skipText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + skip.setAttrValue((String)skipText.getText().trim()); + } + }); + + // filter + Label filterLabel = new Label(gridAttrsComp, SWT.NONE); + filterLabel.setText("FILTER:"); + filterText = new Text(gridAttrsComp,SWT.SINGLE | SWT.BORDER ); + filterText.setLayoutData(new GridData(230, SWT.DEFAULT)); + filterText.setText((String)filter.getAttrValue()); + filterText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + filter.setAttrValue((String)filterText.getText().trim()); + } + }); // SCALE Label scaleLabel = new Label(gridAttrsComp, SWT.NONE); @@ -378,6 +407,8 @@ public class EditEnsembleAttributesDialog extends AbstractEditResourceAttrsDialo if (on) { glevelText.setToolTipText(NcgridAttributesHelp.GlevelToolTipText()); gvcordText.setToolTipText(NcgridAttributesHelp.GvcordToolTipText()); + skipText.setToolTipText(NcgridAttributesHelp.SkipToolTipText()); + filterText.setToolTipText(NcgridAttributesHelp.FilterToolTipText()); scaleText.setToolTipText(NcgridAttributesHelp.ScaleToolTipText()); gdpfunText.setToolTipText(NcgridAttributesHelp.GdpfunToolTipText()); typeText.setToolTipText(NcgridAttributesHelp.TypeToolTipText()); @@ -400,6 +431,8 @@ public class EditEnsembleAttributesDialog extends AbstractEditResourceAttrsDialo else { glevelText.setToolTipText(null); gvcordText.setToolTipText(null); + skipText.setToolTipText(null); + filterText.setToolTipText(null); scaleText.setToolTipText(null); gdpfunText.setToolTipText(null); typeText.setToolTipText(null); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditGridAttributesDialog.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditGridAttributesDialog.java index 005e992dae..53f02bfc41 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditGridAttributesDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EditGridAttributesDialog.java @@ -31,7 +31,7 @@ import org.eclipse.swt.widgets.Text; * Nove 2010 M. Li Add wind * Nov,22 2010 352 X. Guo Add HILO, HLSYM and move all help functions * into NcgridAttributesHelp.java - * + * Feb 06, 2012 #538 Q. Zhou Added skip and filter areas and implements. * * @author mli * @version 1 @@ -41,6 +41,8 @@ public class EditGridAttributesDialog extends AbstractEditResourceAttrsDialog { private RscAttrValue cintString = null; private RscAttrValue glevel = null; private RscAttrValue gvcord = null; + private RscAttrValue skip = null; + private RscAttrValue filter = null; private RscAttrValue scale = null; private RscAttrValue gdpfun = null; private RscAttrValue type = null; @@ -57,7 +59,8 @@ public class EditGridAttributesDialog extends AbstractEditResourceAttrsDialog { private Text glevelText; private Text gvcordText; - + private Text skipText; + private Text filterText; private Text scaleText; private Text gdpfunText; private Text typeText; @@ -90,6 +93,8 @@ public class EditGridAttributesDialog extends AbstractEditResourceAttrsDialog { cintString = editedRscAttrSet.getRscAttr("cint"); glevel = editedRscAttrSet.getRscAttr("glevel"); gvcord = editedRscAttrSet.getRscAttr("gvcord"); + skip = editedRscAttrSet.getRscAttr("skip"); + filter = editedRscAttrSet.getRscAttr("filter"); scale = editedRscAttrSet.getRscAttr("scale"); gdpfun = editedRscAttrSet.getRscAttr("gdpfun"); type = editedRscAttrSet.getRscAttr("type"); @@ -97,7 +102,7 @@ public class EditGridAttributesDialog extends AbstractEditResourceAttrsDialog { fline = editedRscAttrSet.getRscAttr("fline"); hilo = editedRscAttrSet.getRscAttr("hilo"); hlsym = editedRscAttrSet.getRscAttr("hlsym"); - wind = editedRscAttrSet.getRscAttr("wind"); + wind = editedRscAttrSet.getRscAttr("wind"); title = editedRscAttrSet.getRscAttr("title"); colors = editedRscAttrSet.getRscAttr("colors"); marker = editedRscAttrSet.getRscAttr("marker"); @@ -167,6 +172,30 @@ public class EditGridAttributesDialog extends AbstractEditResourceAttrsDialog { } }); + // SKIP + Label skipLabel = new Label(comp, SWT.NONE); + skipLabel.setText("SKIP:"); + skipText = new Text(comp,SWT.SINGLE | SWT.BORDER ); + skipText.setLayoutData(new GridData(230, SWT.DEFAULT)); + skipText.setText((String)skip.getAttrValue()); + skipText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + skip.setAttrValue((String)skipText.getText().trim()); + } + }); + + // filter + Label filterLabel = new Label(comp, SWT.NONE); + filterLabel.setText("FILTER:"); + filterText = new Text(comp,SWT.SINGLE | SWT.BORDER ); + filterText.setLayoutData(new GridData(230, SWT.DEFAULT)); + filterText.setText((String)filter.getAttrValue()); + filterText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + filter.setAttrValue((String)filterText.getText().trim()); + } + }); + // SCALE Label scaleLabel = new Label(comp, SWT.NONE); scaleLabel.setText("SCALE:"); @@ -369,6 +398,8 @@ public class EditGridAttributesDialog extends AbstractEditResourceAttrsDialog { if (on) { glevelText.setToolTipText(NcgridAttributesHelp.GlevelToolTipText()); gvcordText.setToolTipText(NcgridAttributesHelp.GvcordToolTipText()); + skipText.setToolTipText(NcgridAttributesHelp.SkipToolTipText()); + filterText.setToolTipText(NcgridAttributesHelp.FilterToolTipText()); scaleText.setToolTipText(NcgridAttributesHelp.ScaleToolTipText()); gdpfunText.setToolTipText(NcgridAttributesHelp.GdpfunToolTipText()); typeText.setToolTipText(NcgridAttributesHelp.TypeToolTipText()); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EnsembleComponentData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EnsembleComponentData.java old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EnsembleSelectComposite.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EnsembleSelectComposite.java old mode 100755 new mode 100644 index 784db3a288..24334df09a --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EnsembleSelectComposite.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/EnsembleSelectComposite.java @@ -269,7 +269,7 @@ public class EnsembleSelectComposite extends Composite { HashMap constraintMap = new HashMap(); constraintMap.put( "pluginName", new RequestConstraint( "ncgrib", ConstraintType.EQUALS) ); constraintMap.put( "modelInfo.modelName", - new RequestConstraint( modelName.toUpperCase(), ConstraintType.EQUALS ) ); + new RequestConstraint( modelName, ConstraintType.EQUALS ) ); LayerProperty property = new LayerProperty(); property.setDesiredProduct( ResourceType.PLAN_VIEW ); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcEnsembleResourceData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcEnsembleResourceData.java old mode 100755 new mode 100644 index af681f78b8..056f157878 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcEnsembleResourceData.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcEnsembleResourceData.java @@ -248,6 +248,23 @@ public class NcEnsembleResourceData extends NcgridResourceData { super.setGdpfun(gdpfun); } + public String getSkip() { + return super.getSkip(); + } + + public void setSkip(String skip) { + super.setSkip(skip); + } + + public String getFilter() { + return super.getFilter(); + } + + public void setFilter(String filter) { + super.setFilter(filter); + } + + public String getScale() { return super.getScale(); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridAttributesHelp.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridAttributesHelp.java index 7b8579f4f3..6ae47c1ee4 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridAttributesHelp.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridAttributesHelp.java @@ -8,7 +8,7 @@ package gov.noaa.nws.ncep.viz.rsc.ncgrid.rsc; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov,22 2010 X. Guo Initial creation for both Ensemble/Grid - * + * 12/06/2012 #538 Q. Zhou Added skip and filter areas and implements. * * @author xguo * @version 1 @@ -208,6 +208,64 @@ public class NcgridAttributesHelp { return text; } + public static String SkipToolTipText() { + String text = "SKIP is a variable which determines the contour points or \n" + + "plot points to skip. Input is entered as: \n" + + "skip_contour / skip_plot_x ; skip_plot_y \n" + + + "The defaults for skip_contour and skip_plot are 0. \n" + + + "Skip_contour thins the input grid before computing the \n" + + "contours to be drawn. \n" + + + "Skip_plot_x and _y specify the points at which data is to be \n" + + "displayed. If skip_plot_x is positive and skip_plot_y is not \n" + + "specified, skip_plot_y is set to skip_plot_x. \n" + + + "If skip_plot_x is negative, the x plot locations on alternate \n" + + "rows are indented by half the skip_plot_x value. In this case, \n" + + "the absolute value of skip_plot_x must be odd. If not, the \n" + + "absolute value minus 1 is used. If no value for skip_plot_y \n" + + "is specified, half the skip_plot_x value is used. \n\n" + + + "Examples: \n" + + + "SKIP SKIP_CNTR SKIP_PLOT_X SKIP_PLOT_Y STAGGER \n" + + + "' ' 0 0 0 no \n" + + "2 2 0 0 no \n" + + "-1 0 0 0 no \n" + + "2;3 2 0 0 no \n" + + + "/3 0 3 3 no \n" + + "/2;3 0 2 3 no \n" + + "/;1 0 0 1 no \n" + + + "/-1 0 1 0 yes \n" + + "/-3 0 3 1 yes \n" + + "/-1;1 0 1 1 yes \n\n" + + + "Winds may be thinned by latitude by setting skip_plot_y to\n" + + "a negative value. This feature is most useful when plotting\n" + + "winds on a cylindrical grid on a projection with converging \n" + + "meridians. In this case, ABS(skip_plot_y) determines how often\n" + + "rows are plotted. The variable skip_plot_x is not used.\n"; + return text; + } + + public static String FilterToolTipText() { + String text = "FILTER is a logical variable or real number which controls the\n" + + "filtering of data in order to eliminate plotting of overlapping data.\n\n" + + "If FILTER is YES, the data will be filtered.\n" + + "If FILTER is NO, 0, or blank, all data will be plotted.\n" + + "If FILTER is set to a real number, the default filter will be \n" + + "scaled by that number. FILTER = 1 corresponds to FILTER = YES.\n" + + "0 < FILTER < 1 allows some data overlap. FILTER > 1 causes \n" + + "data to be more widely spaced. \n"; + + return text; + } + public static String ScaleToolTipText() { String text = "SCALE is the scaling factor for the data. \n" + "All data will be multiplied by 10 ** SCALE."; diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResource.java index 2c74c321dd..39302bb8ab 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResource.java @@ -16,6 +16,7 @@ import gov.noaa.nws.ncep.viz.common.ui.color.GempakColor; import gov.noaa.nws.ncep.viz.gempak.util.GempakGrid; import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsResource; import gov.noaa.nws.ncep.viz.resources.INatlCntrsResource; +import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsResource.IRscDataObject; import gov.noaa.nws.ncep.viz.resources.manager.ResourceName; import gov.noaa.nws.ncep.viz.rsc.ncgrid.contours.ContourAttributes; import gov.noaa.nws.ncep.viz.rsc.ncgrid.contours.ContourRenderable; @@ -28,15 +29,23 @@ import gov.noaa.nws.ncep.viz.rsc.ncgrid.dgdriv.Dgdriv; import gov.noaa.nws.ncep.viz.rsc.ncgrid.dgdriv.DgdrivException; import java.io.FileNotFoundException; +import java.io.ObjectInputStream.GetField; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; +import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Locale; +import java.text.SimpleDateFormat; +import java.util.TimeZone; import javax.measure.converter.UnitConverter; - +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.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; @@ -67,6 +76,7 @@ import gov.noaa.nws.ncep.common.dataplugin.ncgrib.ncdatatree.NcLevelNode; import gov.noaa.nws.ncep.viz.gempak.grid.inv.NcInventory; import java.util.Iterator; import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; //end /** * Grid contour Resource @@ -102,7 +112,14 @@ import java.util.Set; * 11/16/2011 X. Guo Corrected Valid/Forecast time in Title * 11/22/2011 X. Guo Used the current frame time to set dgdriv and add dumpNcGribInventory() * 12/12/2011 X. Guo Updated Ensemble requests - * + * 12/06/2012 #538 Q. Zhou Added skip and filter areas and implements. + * 02/15/2012 X. Guo Added schedule job to parallel updating data + * 02/16/2012 #555 S. Gurung Added call to setAllFramesAsPopulated() in queryRecords() + * 03/01/2012 X. Guo Added codes to handle attributes modification + * 03/13/2012 X. Guo Created multi-threads to generate contours + * 03/15/2012 X. Guo Set synchronized block in ContoutSupport + * 04/03/2012 X. Guo Created vector wireframe in contour job + * and changed constraint to query available times * * * @author mli @@ -112,7 +129,9 @@ public class NcgridResource extends AbstractNatlCntrsResource dataTimesForDgdriv = new ArrayList(); - + // private MathTransform trans; // private SymbolLocationSet gridPointMarkerSet = null; @@ -259,6 +282,105 @@ public class NcgridResource extends AbstractNatlCntrsResource queryList = new HashMap( - gridRscData.getMetadataMap()); + else { + + HashMap queryList = new HashMap( + gridRscData.getMetadataMap()); - if (gridRscData.getGdfile().startsWith("{") && gridRscData.getGdfile().endsWith("}")) { - ModelListInfo modelListInfo = new ModelListInfo(gridRscData.getGdfile()); - String modelName = modelListInfo.getModelList().get(0).getModelName(); - String perturbationNum = null; -// String eventName = null; - if ( modelName.contains(":") ) { - String [] gdfileArrs = modelName.split(":"); - modelName = gdfileArrs[0]; - if (gdfileArrs[0].contains("%")){ - modelName = gdfileArrs[0].split("%")[1]; - } -// eventName = gdfileArrs[1].toLowerCase(); - if ( isIntNum (gdfileArrs[1])) { - perturbationNum = String.valueOf(Integer.parseInt(gdfileArrs[1])); - } - } - else { - if ( modelName.contains("%")) { - modelName = modelName.split("%")[1]; - } - } - queryList.put("modelInfo.modelName", + if (gridRscData.getGdfile().startsWith("{") && gridRscData.getGdfile().endsWith("}")) { + ModelListInfo modelListInfo = new ModelListInfo(gridRscData.getGdfile()); + String modelName = modelListInfo.getModelList().get(0).getModelName(); + String perturbationNum = null; +// String eventName = null; + if ( modelName.contains(":") ) { + String [] gdfileArrs = modelName.split(":"); + modelName = gdfileArrs[0]; + if (gdfileArrs[0].contains("%")){ + modelName = gdfileArrs[0].split("%")[1]; + } +// eventName = gdfileArrs[1].toLowerCase(); + if ( isIntNum (gdfileArrs[1])) { + perturbationNum = String.valueOf(Integer.parseInt(gdfileArrs[1])); + } + } + else { + if ( modelName.contains("%")) { + modelName = modelName.split("%")[1]; + } + } + queryList.put("modelInfo.modelName", new RequestConstraint( modelName, ConstraintType.EQUALS ) ); -// if ( eventName != null ){ -// queryList.put("eventName", +// if ( eventName != null ){ +// queryList.put("eventName", // new RequestConstraint( eventName, ConstraintType.EQUALS ) ); -// } - if ( perturbationNum != null ){ - queryList.put("modelInfo.perturbationNumber", +// } + if ( perturbationNum != null ){ + queryList.put("modelInfo.perturbationNumber", new RequestConstraint( perturbationNum, ConstraintType.EQUALS ) ); - } - } - - LayerProperty property = new LayerProperty(); - property.setDesiredProduct( ResourceType.PLAN_VIEW ); - queryList.put("dataTime", new RequestConstraint( gdPrxy.getDataTime().toString() ) ); - - try { - property.setEntryQueryParameters( queryList ); - // just need one since all the spatial objs should be the same for this time. - property.setNumberOfImages(1); + } + } + long t1 = System.currentTimeMillis(); + LayerProperty property = new LayerProperty(); + property.setDesiredProduct( ResourceType.PLAN_VIEW ); + queryList.put("dataTime", new RequestConstraint( gdPrxy.getDataTime().toString() ) ); + + try { + property.setEntryQueryParameters( queryList ); + // just need one since all the spatial objs should be the same for this time. + property.setNumberOfImages(1); - String script = null; - script = ScriptCreator.createScript( property ); + String script = null; + script = ScriptCreator.createScript( property ); - if (script == null) { - gdPrxy = null; - throw new VizException( "error creating script."); - } + if (script == null) { + gdPrxy = null; + logger.debug( "error creating script."); + return false; + } - Object[] pdoList = Connector.getInstance().connect(script, null, 20000); + Object[] pdoList = Connector.getInstance().connect(script, null, 20000); - if( pdoList == null || pdoList.length == 0 ) { - gdPrxy = null; - throw new VizException( "No records found."); - } -// System.out.println("retrieving dataTime : "+((NcgribRecord) pdoList[0]).getDataTime().toString() ); + if( pdoList == null || pdoList.length == 0 ) { + gdPrxy = null; + logger.debug( "No records found."); + return false; + } +// System.out.println("retrieving dataTime : "+((NcgribRecord) pdoList[0]).getDataTime().toString() ); - // update the spatial object in the gdProxy - ISpatialObject cov = ((NcgribRecord) pdoList[0]).getSpatialObject(); - gdPrxy.setSpatialObject( cov ); - } - catch( VizException e) { - System.out.println("Error retrieving ncgrid record for the spatial object: "+e.getMessage() ); - return false; - } - } + // update the spatial object in the gdProxy + long t4 = System.currentTimeMillis(); + logger.debug("/n retrieving dataTime : "+((NcgribRecord) pdoList[0]).getDataTime().toString() + " took:" + (t4-t1)); + ISpatialObject cov = ((NcgribRecord) pdoList[0]).getSpatialObject(); + gdPrxy.setSpatialObject( cov ); + } + catch( VizException e) { + System.out.println("Error retrieving ncgrid record for the spatial object: "+e.getMessage() ); + return false; + } + } - /* - * query data - */ - synchronized (this) { + /* + * query data + */ if (contourRenderable == null ) contourRenderable = new ContourRenderable[contourAttributes.length]; if (vectorDisplay == null) vectorDisplay = new GriddedVectorDisplay[contourAttributes.length]; -// System.out.println("contourAttributes.length==="+contourAttributes.length); +// System.out.println("contourAttributes.length==="+contourAttributes.length); NcFloatDataRecord gridData = null; - for (int i = 0; i < contourAttributes.length; i++) { + for (int i = 0; i < contourAttributes.length; i++) { + + DisplayType displayType = getVectorType(contourAttributes[i].getType()); + String attrType = contourAttributes[i].getType().toUpperCase(); + + if ( attrType.contains("M") && gridPointMarkerDisplay == null) { + gridPointMarkerDisplay = new GridPointMarkerDisplay(contourAttributes[i].getMarker(),descriptor, + gdPrxy.getSpatialObject()); + } + + if (attrType.contains("G") && gridIndicesDisplay == null) { + gridIndicesDisplay = new GridIndicesDisplay(GempakColor.convertToRGB(gridRscData.getGrdlbl()), + descriptor, gdPrxy.getSpatialObject()); + } + /* + * Vector data + */ + if ( displayType == DisplayType.ARROW || displayType == DisplayType.BARB ) { + + boolean isDirectionalArrow = attrType.equals("D"); + + if (vectorDisplay[i] == null) { + NcFloatDataRecord rec = null; + rec = findGriddedDataFromVector ( i ); + + // Avoid duplicate data retrieval + if ( rec == null ) { + rec = getGriddedData ( i ); + } + if ( rec != null ) { + hasData = true; + vectorDisplay[i] = new GriddedVectorDisplay(rec, displayType, isDirectionalArrow, descriptor, + gdPrxy.getSpatialObject(),contourAttributes[i]); + } + } + else { + gridData = vectorDisplay[i].getData(); + if ( gridData != null ) { + hasData = true; + if ( vectorDisplay[i].checkAttrsChanged(displayType, isDirectionalArrow, + contourAttributes[i].getWind())) { + vectorDisplay[i].dispose(); + vectorDisplay[i] = new GriddedVectorDisplay(gridData, displayType, isDirectionalArrow, descriptor, + gdPrxy.getSpatialObject(),contourAttributes[i]); + } + } + } + } + else if (displayType == DisplayType.CONTOUR || displayType == DisplayType.STREAMLINE || + attrType.contains("P")){ + /* + * Scalar data + */ + String contourName = createContourName(gdPrxy, contourAttributes[i]); + + // New creation + if (contourRenderable[i] == null) { +// IDataRecord gridData = null; + // Duplicate data + gridData = findGriddedDataFromContourRenderable ( i ); + + // Avoid duplicate data retrieval + if (gridData == null) { + gridData = getGriddedData ( i ); + } + + if ( gridData != null ) { + hasData = true; + contourRenderable[i] = new ContourRenderable((IDataRecord)gridData, descriptor, + MapUtil.getGridGeometry(gdPrxy.getSpatialObject()), contourAttributes[i], contourName); + } + } + // Attributes or navigation change + else { + // gridData = (NcFloatDataRecord)contourRenderable[i].getData(); + // contourRenderable[i].dispose(); + // contourRenderable[i] = new ContourRenderable((IDataRecord)gridData, descriptor, + // MapUtil.getGridGeometry(gdPrxy.getSpatialObject()), contourAttributes[i], contourName); + contourRenderable[i].setContourAttributes(contourAttributes[i]); + } + + // Grid point value + if (attrType.contains("P") && contourRenderable[i] != null && + contourRenderable[i].getData() instanceof NcFloatDataRecord ) { + if (gridPointValueDisplay == null || + !contourAttributes[i].getGdpfun().equalsIgnoreCase(gfunc) || + !contourAttributes[i].getGlevel().equalsIgnoreCase(glevel) || + !contourAttributes[i].getGvcord().equalsIgnoreCase(gvcord) || + !contourAttributes[i].getSkip().equalsIgnoreCase(skip) || + !contourAttributes[i].getFilter().equalsIgnoreCase(filter) || + !contourAttributes[i].getScale().equalsIgnoreCase(scale)) { + + gridPointValueDisplay = createGridPointValueDisplay((NcFloatDataRecord)contourRenderable[i].getData(), + gdPrxy, contourAttributes[i]); + + gfunc = contourAttributes[i].getGdpfun(); + glevel = contourAttributes[i].getGlevel(); + gvcord = contourAttributes[i].getGvcord(); + skip = contourAttributes[i].getSkip(); + filter = contourAttributes[i].getFilter(); + scale = contourAttributes[i].getScale(); + } + } + + // create HILO symbols + if ( (attrType.contains("F") || attrType.contains("C"))&& (contourRenderable[i] != null) && + (contourRenderable[i].getData() instanceof NcFloatDataRecord)) { + if ( contourRenderable[i].getGridRelativeHiLo() == null ) { + contourRenderable[i].setGridRelativeHiLo(createGridRelativeHiLoDisplay( + (NcFloatDataRecord)contourRenderable[i].getData(), gdPrxy, contourAttributes[i])); + } + } + } + + } // end of for loop + + Collections.sort(NcgridResource.this.dataTimes); + + long t1 = System.currentTimeMillis(); + logger.debug("updateFrameData:(" + ((gdPrxy != null)?gdPrxy.getDataTime().toString():" ")+") took: " + (t1-st)); + logger.debug("updateFrameData: from init resource to complete took: " + (t1-initTime)); + frameLoaded = true; + while (getGraphicsTarget() == null || getPaintProperties() == null ) { + try { + Thread.sleep(5); + } catch (InterruptedException e) { + + } + } + generateContours(gdPrxy.getDataTime().toString() ); +// } + + return true; + } + + public void procAttrsModified () { + + synchronized (this) { + NcFloatDataRecord gridData = null; + if ( contourRenderable == null ) return; + + for (int i = 0; i < contourRenderable.length; i++) { DisplayType displayType = getVectorType(contourAttributes[i].getType()); String attrType = contourAttributes[i].getType().toUpperCase(); @@ -404,13 +713,17 @@ public class NcgridResource extends AbstractNatlCntrsResource 0) { - for (int n = 0; n < i; n++) { - if (contourAttributes[i].isMatch(contourAttributes[n]) && - contourRenderable[n].getData() instanceof NcFloatDataRecord ) { - index = n; - break; - } + if ( gridData != null ) { + if ( vectorDisplay[i].checkAttrsChanged(displayType, isDirectionalArrow, + contourAttributes[i].getWind())) { + vectorDisplay[i].dispose(); + vectorDisplay[i] = new GriddedVectorDisplay(gridData, displayType, isDirectionalArrow, descriptor, + gdPrxy.getSpatialObject(),contourAttributes[i]); } } + } + else { + NcFloatDataRecord rec = null; + rec = findGriddedDataFromVector ( i ); + // Avoid duplicate data retrieval + if ( rec == null ) { + rec = getGriddedData ( i ); + } // Avoid duplicate data retrieval - if (index >= 0) { - gridData = (NcFloatDataRecord)contourRenderable[index].getData(); + if (rec == null) { + rec = getGriddedData ( i ); } - else { - try { - gridData = (NcFloatDataRecord)getDataRecord(gdPrxy, contourAttributes[i]); - } catch (DgdrivException e) { - // TODO Auto-generated catch block - e.printStackTrace(); -// return false; - } + if ( rec != null) { + vectorDisplay[i] = new GriddedVectorDisplay(rec, displayType, isDirectionalArrow, descriptor, + gdPrxy.getSpatialObject(),contourAttributes[i]); } - contourRenderable[i] = new ContourRenderable((IDataRecord)gridData, descriptor, - MapUtil.getGridGeometry(gdPrxy.getSpatialObject()), contourAttributes[i], contourName); - } - // Attributes or navigation change - else { - gridData = (NcFloatDataRecord)contourRenderable[i].getData(); - contourRenderable[i].dispose(); - contourRenderable[i] = new ContourRenderable((IDataRecord)gridData, descriptor, - MapUtil.getGridGeometry(gdPrxy.getSpatialObject()), contourAttributes[i], contourName); + } + } + else if (displayType != DisplayType.ARROW && displayType != DisplayType.BARB) { + if ( vectorDisplay != null && vectorDisplay[i] != null) { + vectorDisplay[i].dispose(); + vectorDisplay[i] = null; } + } + if (displayType == DisplayType.CONTOUR || displayType == DisplayType.STREAMLINE || + attrType.contains("P")){ - + if (contourRenderable[i] != null) { + contourRenderable[i].setContourAttributes(contourAttributes[i]); + contourRenderable[i].updatedContourRenderable(); + } + else { + String contourName = createContourName(gdPrxy, contourAttributes[i]); + gridData = findGriddedDataFromContourRenderable ( i ); + + // Avoid duplicate data retrieval + if (gridData == null) { + gridData = getGriddedData ( i ); + } + + if ( gridData != null ) { + contourRenderable[i] = new ContourRenderable((IDataRecord)gridData, descriptor, + MapUtil.getGridGeometry(gdPrxy.getSpatialObject()), contourAttributes[i], contourName); + } + } + // Grid point value if (attrType.contains("P") && contourRenderable[i] != null && contourRenderable[i].getData() instanceof NcFloatDataRecord ) { - if (gridPointValueDisplay == null || needsUpdate || + if (gridPointValueDisplay == null || !contourAttributes[i].getGdpfun().equalsIgnoreCase(gfunc) || !contourAttributes[i].getGlevel().equalsIgnoreCase(glevel) || !contourAttributes[i].getGvcord().equalsIgnoreCase(gvcord) || + !contourAttributes[i].getSkip().equalsIgnoreCase(skip) || + !contourAttributes[i].getFilter().equalsIgnoreCase(filter) || !contourAttributes[i].getScale().equalsIgnoreCase(scale)) { gridPointValueDisplay = createGridPointValueDisplay((NcFloatDataRecord)contourRenderable[i].getData(), @@ -501,41 +805,134 @@ public class NcgridResource extends AbstractNatlCntrsResource 0) { + for (int n = 0; n < i; n++) { + if ( contourRenderable[n] != null ) { + if (contourRenderable[n].isMatch(contourAttributes[i]) && + contourRenderable[n].getData() instanceof NcFloatDataRecord ) { + rec = (NcFloatDataRecord)contourRenderable[n].getData(); + break; + } + } + } + } + return rec; + } + private NcFloatDataRecord findGriddedDataFromVector ( int i ) { + NcFloatDataRecord rec = null; + + if (i > 0) { + for (int n = 0; n < i; n++) { + if ( vectorDisplay[n] != null ) { + if (vectorDisplay[n].isMatch(contourAttributes[i]) && + vectorDisplay[n].getData() instanceof NcFloatDataRecord ) { + rec = (NcFloatDataRecord)vectorDisplay[n].getData(); + break; + } + } + } + } + return rec; + } + private NcFloatDataRecord getGriddedData ( int i ){ + NcFloatDataRecord gridData = null; + try { + long t1 =0 ; + if ( enableSystemOut ) + t1 = System.currentTimeMillis(); + gridData = (NcFloatDataRecord)getDataRecord(gdPrxy, contourAttributes[i]); + if ( enableSystemOut ) { + long t2 = System.currentTimeMillis(); + logger.debug("getGriddedData contour/streamline/vector grid data(" +gdPrxy.getDataTime().toString()+") took:" + (t2-t1)); + } + } catch (DgdrivException e) { + // TODO Auto-generated catch block +// e.printStackTrace(); + return null; + } + return gridData; + } } @@ -594,8 +1042,9 @@ public class NcgridResource extends AbstractNatlCntrsResource frameTimes = getFrameTimes(); + Collections.sort(frameTimes); + + if( frameTimes != null && frameTimes.size() > 0){ + + int frameIntrvl = (int)resourceData.getFrameSpan()/60; + int lframe = frameTimes.size()-1; + int fMs = (int)(((frameTimes.get(0).getRefTime().getTime())/1000 - cycMs)/3600 - frameIntrvl); + if ( fMs < 0 ) fMs = 0; + int lMs = (int)(((frameTimes.get(lframe).getRefTime().getTime())/1000 -cycMs)/3600 + frameIntrvl); + // adjust the start and end times to include the frameIntervals. If this isn't dominant, + // we need to query everything that may match the first/last frames. + String frameStartTimeStr = cycTimeStr + " (" + fMs + ")"; + String frameEndTimeStr = cycTimeStr + " (" + lMs + ")"; + String timeStr = frameStartTimeStr + "--" + frameEndTimeStr; + queryList.put("dataTime", new RequestConstraint (timeStr, ConstraintType.BETWEEN)); + } + property.setEntryQueryParameters( queryList ); availableTimes = property.getEntryTimes(); } catch( VizException e) { - throw e; + return; } } - + ArrayList dataTimes = new ArrayList(); // loop thru all the times for the grib records for this model and @@ -679,13 +1150,26 @@ public class NcgridResource extends AbstractNatlCntrsResource dataTimes) { @@ -720,7 +1204,7 @@ public class NcgridResource extends AbstractNatlCntrsResource dataTimes = new ArrayList(); dataTimes.add(gdPrxy.getDataTime()); - Dgdriv aDgdriv = new Dgdriv(); -// aDgdriv.setCycleForecastTimes(dataTimesForDgdriv); - aDgdriv.setResourceData(gridRscData); - aDgdriv.setCycleForecastTimes(dataTimes); - aDgdriv.setSpatialObject(gdPrxy.getSpatialObject()); - aDgdriv.setGdattim( gdPrxy.getDataTime().toString()); - aDgdriv.setGarea("dset"); - aDgdriv.setGdfile(inputGdfile); - aDgdriv.setGdpfun(cattr.getGdpfun()); - aDgdriv.setGlevel(cattr.getGlevel()); - aDgdriv.setGvcord(cattr.getGvcord()); - aDgdriv.setScale(cattr.getScale()); - aDgdriv.setDataSource(gridRscData.getPluginName()); + synchronized ( Dgdriv.class) { + Dgdriv aDgdriv = new Dgdriv(); +// aDgdriv.setCycleForecastTimes(dataTimesForDgdriv); + aDgdriv.setResourceData(gridRscData); + aDgdriv.setCycleForecastTimes(dataTimes); + aDgdriv.setSpatialObject(gdPrxy.getSpatialObject()); + aDgdriv.setGdattim( gdPrxy.getDataTime().toString()); + aDgdriv.setGarea("dset"); + aDgdriv.setGdfile(inputGdfile); + aDgdriv.setGdpfun(cattr.getGdpfun()); + aDgdriv.setGlevel(cattr.getGlevel()); + aDgdriv.setGvcord(cattr.getGvcord()); + aDgdriv.setScale(cattr.getScale()); + aDgdriv.setDataSource(gridRscData.getPluginName()); - DisplayType displayType = getVectorType(cattr.getType()); - if (displayType == DisplayType.ARROW || displayType == DisplayType.BARB || displayType == DisplayType.STREAMLINE) { - /* - * Specify vector data retrieval from GEMPAK GD - */ - aDgdriv.setScalar(false); - if ( displayType == DisplayType.ARROW ) { - aDgdriv.setArrowVector(true); - } else { - aDgdriv.setArrowVector(false); - } + DisplayType displayType = getVectorType(cattr.getType()); + if (displayType == DisplayType.ARROW || displayType == DisplayType.BARB || displayType == DisplayType.STREAMLINE) { + /* + * Specify vector data retrieval from GEMPAK GD + */ + aDgdriv.setScalar(false); + if ( displayType == DisplayType.ARROW ) { + aDgdriv.setArrowVector(true); + } else { + aDgdriv.setArrowVector(false); + } - } - else { - /* - * Specify scalar data retrieval from GEMPAK GD - */ - aDgdriv.setScalar(true); - aDgdriv.setArrowVector(false); - } - - try { - return aDgdriv.execute(); - } catch (DgdrivException e) { - throw new DgdrivException("GEMPAK GD error stack:\n" + e.getMessage(), e); + } + else { + /* + * Specify scalar data retrieval from GEMPAK GD + */ + aDgdriv.setScalar(true); + aDgdriv.setArrowVector(false); + } + try { + return aDgdriv.execute(); + } catch (DgdrivException e) { +// throw new DgdrivException("GEMPAK GD error stack:\n" + e.getMessage(), e); + logger.debug("GEMPAK GD error stack:\n" + e.getMessage()); + return null; + } +// finally { +// aDgdriv = null; +// } } -// finally { -// aDgdriv = null; -// } - } + } + + protected IGraphicsTarget getGraphicsTarget (){ + return this.lastTarget; + } + protected PaintProperties getPaintProperties () { + return this.lastPaintProps; + } @Override public void resourceAttrsModified() { // Repaint the data - needsUpdate = true; + if ( ncgribAttrsModified != null ) { + ncgribAttrsModified.cancel(); + } + ncgribAttrsModified = new NcgridAttrModifiedJob("Ncgrid Attrs Modifying..."); + ncgribAttrsModified.procAttrs(); } @@ -1024,6 +1564,8 @@ public class NcgridResource extends AbstractNatlCntrsResource 0 ) { + for ( int i = 0 ; i < cintArray.length ; i ++ ) { + String []tmp = cintArray[i].trim().split(">"); + if (tmp.length > 5) { + cintArray[i] = tmp[0]+">"+tmp[1]+">"+tmp[2]+">"+tmp[3]+">"+tmp[4]; + } + } + } for (int i = 0; i < gfuncArray.length; i++) { if (gfuncArray[i].contains("//")) { String[] tmpstr = gfuncArray[i].trim().split("//", 2); - gfuncArray[i] = tmpstr[0]; + gfuncArray[i] = tmpstr[0].trim(); String referencedAlias = tmpstr[1]; String referencedFunc = tmpstr[0]; /* @@ -1068,64 +1619,71 @@ public class NcgridResource extends AbstractNatlCntrsResource i) ? i : (glevelArray.length - 1); - contourAttributes[i].setGlevel(glevelArray[idx]); + contourAttributes[i].setGlevel(glevelArray[idx].trim()); idx = (gvcordArray.length > i) ? i : gvcordArray.length - 1; - contourAttributes[i].setGvcord(gvcordArray[idx]); + contourAttributes[i].setGvcord(gvcordArray[idx].trim()); //if (i > scaleArray.length - 1) { // contourAttributes[i].setScale("0"); //} else { // contourAttributes[i].setScale(scaleArray[i]); //} + idx = (skipArray.length > i) ? i : skipArray.length - 1; + contourAttributes[i].setSkip(skipArray[idx].trim()); + + idx = (filterArray.length > i) ? i : filterArray.length - 1; + contourAttributes[i].setFilter(filterArray[idx].trim()); idx = (scaleArray.length > i) ? i : scaleArray.length - 1; - contourAttributes[i].setScale(scaleArray[idx]); + contourAttributes[i].setScale(scaleArray[idx].trim()); idx = (typeArray.length > i) ? i : typeArray.length - 1; - contourAttributes[i].setType(typeArray[idx]); + contourAttributes[i].setType(typeArray[idx].trim()); idx = (cintArray.length > i) ? i : cintArray.length - 1; - contourAttributes[i].setCint(cintArray[idx]); + contourAttributes[i].setCint(cintArray[idx].trim()); idx = (lineArray.length > i) ? i : lineArray.length - 1; - contourAttributes[i].setLine(lineArray[idx]); + contourAttributes[i].setLine(lineArray[idx].trim()); idx = (fintArray.length > i) ? i : fintArray.length - 1; - contourAttributes[i].setFint(fintArray[idx]); + contourAttributes[i].setFint(fintArray[idx].trim()); idx = (flineArray.length > i) ? i : flineArray.length - 1; - contourAttributes[i].setFline(flineArray[idx]); + contourAttributes[i].setFline(flineArray[idx].trim()); idx = (hiloArray.length > i) ? i : hiloArray.length - 1; - contourAttributes[i].setHilo(hiloArray[idx]); + contourAttributes[i].setHilo(hiloArray[idx].trim()); idx = (hlsymArray.length > i) ? i : hlsymArray.length - 1; - contourAttributes[i].setHlsym(hlsymArray[idx]); + contourAttributes[i].setHlsym(hlsymArray[idx].trim()); idx = (windArray.length > i) ? i : windArray.length - 1; - contourAttributes[i].setWind(windArray[idx]); + contourAttributes[i].setWind(windArray[idx].trim()); idx = (markerArray.length > i) ? i : markerArray.length - 1; - contourAttributes[i].setMarker(markerArray[idx]); + contourAttributes[i].setMarker(markerArray[idx].trim()); } } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResourceData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResourceData.java index 59b542cd71..96129318d9 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResourceData.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncgrid/src/gov/noaa/nws/ncep/viz/rsc/ncgrid/rsc/NcgridResourceData.java @@ -37,7 +37,8 @@ import com.raytheon.uf.viz.core.rsc.LoadProperties; * add constructor * 09/19/2011 mgamazaychikov Made changes associated with removal of DatatypeTable class * 12/22/2011 G Hull Updated getGdFile() - * + * 12/06/2012 #538 Q. Zhou Added skip and filter areas and implements. + * 03/28/2012 X. Guo Don't need to convert gdfile toUppercase * * * @author mli @@ -66,6 +67,11 @@ public class NcgridResourceData extends AbstractNatlCntrsRequestableResourceData @XmlElement protected String gdpfun; + @XmlElement + protected String skip; + + @XmlElement + protected String filter; @XmlElement protected String scale="0"; @@ -185,6 +191,24 @@ public class NcgridResourceData extends AbstractNatlCntrsRequestableResourceData return false; } + if (this.skip != null && other.skip == null) { + return false; + } else if (this.skip == null && other.skip != null) { + return false; + } else if (this.skip != null + && this.skip.equals(other.skip) == false) { + return false; + } + + if (this.filter != null && other.filter == null) { + return false; + } else if (this.filter == null && other.filter != null) { + return false; + } else if (this.filter != null + && this.filter.equals(other.filter) == false) { + return false; + } + if (this.scale != null && other.scale == null) { return false; } else if (this.scale == null && other.scale != null) { @@ -287,7 +311,7 @@ public class NcgridResourceData extends AbstractNatlCntrsRequestableResourceData } public void setGdfile(String gdfile) { - this.gdfile = gdfile.toUpperCase(); + this.gdfile = gdfile; } public String getGvcord() { @@ -315,6 +339,22 @@ public class NcgridResourceData extends AbstractNatlCntrsRequestableResourceData this.gdpfun = gdpfun; } + public String getSkip() { + return skip; + } + + public void setSkip(String skip) { + this.skip = skip; + } + + public String getFilter() { + return filter; + } + + public void setFilter(String filter) { + this.filter = filter; + } + public String getScale() { return scale; } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/config.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/config.xml index 596bcfd723..7ee3e17380 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/config.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/config.xml @@ -1,20 +1,20 @@ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/gov.noaa.nws.ncep.viz.rsc.ncradar.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/gov.noaa.nws.ncep.viz.rsc.ncradar.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/localization/ncep/resourceTemplates/LocalRadar.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/localization/ncep/resourceTemplates/LocalRadar.xml index fe5e3b41bf..5cb766c723 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/localization/ncep/resourceTemplates/LocalRadar.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/localization/ncep/resourceTemplates/LocalRadar.xml @@ -19,6 +19,9 @@ ${timelineGenMethod} ${legend_color} ${colorMapName} + ${alpha} + ${brightness} + ${contrast} ${colorBar} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/plugin.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/plugin.xml index cf01197566..4d9402744e 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/plugin.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/plugin.xml @@ -48,6 +48,21 @@ attributeName="colorMapName" ncResourceName="LocalRadar"> + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/EditLocalRadarAttrsDialog.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/EditLocalRadarAttrsDialog.java index e4fd9cfd12..db82a43268 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/EditLocalRadarAttrsDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/EditLocalRadarAttrsDialog.java @@ -15,9 +15,11 @@ import com.raytheon.uf.common.colormap.ColorMap; import com.raytheon.uf.viz.core.exception.VizException; import gov.noaa.nws.ncep.viz.resources.INatlCntrsResourceData; +import gov.noaa.nws.ncep.viz.resources.attributes.AbstractEditResourceAttrsInteractiveDialog; import gov.noaa.nws.ncep.viz.resources.attributes.AbstractEditResourceAttrsDialog; import gov.noaa.nws.ncep.viz.resources.attributes.ResourceAttrSet.RscAttrValue; import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarEditor; +import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarFromColorMapAttrsEditorComposite; import gov.noaa.nws.ncep.viz.ui.display.ColorBarFromColormap; import gov.noaa.nws.ncep.viz.common.ColorMapUtil; @@ -29,6 +31,7 @@ import gov.noaa.nws.ncep.viz.common.ColorMapUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 12/08/2011 #541 S. Gurung Initial Creation. + * 03/29/2012 #651 S. Gurung Extend AbstractEditResourceAttrsInteractiveDialog * * * @@ -36,118 +39,29 @@ import gov.noaa.nws.ncep.viz.common.ColorMapUtil; * @version 1 */ -public class EditLocalRadarAttrsDialog extends AbstractEditResourceAttrsDialog { +public class EditLocalRadarAttrsDialog extends AbstractEditResourceAttrsInteractiveDialog { public EditLocalRadarAttrsDialog(Shell parentShell, INatlCntrsResourceData r, Boolean apply) { super(parentShell, r, apply); + resourceData = r; } - private RscAttrValue colorMapNameAttr = null; - private RscAttrValue colorBarAttr = null; - - private ColorBarEditor colorBarEditor = null; - private ColorBarFromColormap editedColorBar = null; - private String cmapCategory="Radar"; - + private INatlCntrsResourceData resourceData; + private ColorBarFromColorMapAttrsEditorComposite cBarComposite= null; // @Override public Composite createDialog( Composite topComp ) { - - colorMapNameAttr = editedRscAttrSet.getRscAttr( "colorMapName" ); - colorBarAttr = editedRscAttrSet.getRscAttr( "colorBar" ); - if( colorMapNameAttr == null || colorMapNameAttr.getAttrClass() != String.class ) { - System.out.println("colorMapName is null or not of expected class String?"); - return null; - } - if( colorBarAttr == null || colorBarAttr.getAttrClass() != ColorBarFromColormap.class ) { - System.out.println("colorBar is null or not of expected class ColorBarFromColormap?"); - return null; - } - - // The resource category is the category of the colormaps - cmapCategory = rscData.getResourceName().getRscCategory(); FormLayout layout0 = new FormLayout(); topComp.setLayout(layout0); - // the resource category is the category for the colormaps - final String availColorMaps[] = ColorMapUtil.listColorMaps( cmapCategory ); - - final Combo colorMapNamesCombo = new Combo( topComp, SWT.READ_ONLY | SWT.DROP_DOWN ); - FormData fd = new FormData(); - fd.left = new FormAttachment( 50, -30 ); - fd.top = new FormAttachment( 0, 20 ); - colorMapNamesCombo.setLayoutData( fd ); - - colorMapNamesCombo.setItems( availColorMaps ); - int seldColorMapIndx = -1; - - for( int c=0 ; c * @@ -135,6 +135,8 @@ public abstract class RadarImageResource extends protected int numLevels; protected String viewType; + + protected boolean refreshImage = false; /** * @param resourceData @@ -146,6 +148,7 @@ public abstract class RadarImageResource extends throws VizException { super(resourceData, loadProperties, interrogator); rangeCircle = new HashMap(); + refreshImage = false; } protected class FrameData extends AbstractFrameData { @@ -261,8 +264,7 @@ public abstract class RadarImageResource extends ((ColorBarFromColormap)colorBar).setColorMap( colorMap ); - ColorMapParameters colorMapParameters = new ColorMapParameters(); - + colorMapParameters = new ColorMapParameters(); colorMapParameters.setColorMap( colorMap ); if (colorMapParameters.getDisplayUnit() == null) { @@ -274,8 +276,8 @@ public abstract class RadarImageResource extends colorMapParameters.setDataMax(255); colorMapParameters.setDataMin(0); rtr.params = colorMapParameters; - this.getCapability(ColorMapCapability.class).setColorMapParameters( - colorMapParameters); + getCapability(ColorMapCapability.class).setColorMapParameters( + colorMapParameters); } @@ -332,14 +334,14 @@ public abstract class RadarImageResource extends protected void createTile(IGraphicsTarget target, VizRadarRecord populatedRecord) throws StorageException, IOException, ClassNotFoundException, VizException { - ColorMapParameters params = getColorMapParameters(target, - populatedRecord); - + + ColorMapParameters params = getColorMapParameters(target, populatedRecord); + PixelCoverage coverage = buildCoverage(target, populatedRecord); if (coverage.getMesh() == null) { coverage.setMesh(buildMesh(target, populatedRecord)); } - + IImage image = createImage(target, params, populatedRecord, new Rectangle(0, 0, populatedRecord.getNumBins(), populatedRecord.getNumRadials())); @@ -362,15 +364,23 @@ public abstract class RadarImageResource extends RadarRecord record) throws VizException { ColorMapParameters params = getCapability(ColorMapCapability.class) .getColorMapParameters(); + String colorMapName = ""; IColorMap colorMap = null; + float cMapMax = 255; + float cMapMin = 0; if (params != null && params.getDataUnit() != null) { return params; } else if (params != null) { colorMapName = params.getColorMapName(); colorMap = params.getColorMap(); + //if colorMap range has changed, get updated max and min + if (refreshImage) { + cMapMax = params.getColorMapMax(); + cMapMin = params.getColorMapMin(); + } } - + // Setup the ColorMap settings int prodCode = record.getProductCode(); Unit dataUnit = DataUtilities.getDataUnit(record); @@ -406,9 +416,10 @@ public abstract class RadarImageResource extends params.setDataMapping(dataMapping); params.setColorBarIntervals(null); } + getCapability(ColorMapCapability.class).setColorMapParameters(params); - if (colorMap != null) { + if (colorMap != null) { params.setColorMap(colorMap); params.setColorMapName(colorMapName); } @@ -420,16 +431,16 @@ public abstract class RadarImageResource extends if (colorMapName == null) { colorMapName = "Radar/OSF/16 Level Reflectivity"; } - + params.setColorMap(target.buildColorMap(colorMapName)); } - params.setColorMapMax(255); - params.setColorMapMin(0); + params.setColorMapMax(cMapMax); + params.setColorMapMin(cMapMin); params.setDataMax(255); params.setDataMin(0); - + return params; } @@ -510,6 +521,11 @@ public abstract class RadarImageResource extends record.getTrueElevationAngle()); try { DrawableImage image = images.get(displayedDate); + if (refreshImage) { + redoImage(displayedDate); + image = null; + images.clear(); + } if (image == null || image.getCoverage() == null) { if (record.getStoredDataAsync() == null) { issueRefresh(); @@ -517,15 +533,22 @@ public abstract class RadarImageResource extends } createTile(target, record); image = images.get(displayedDate); - } + } if (image != null) { - ImagingCapability cap = getCapability(ImagingCapability.class); - image.getImage().setBrightness(cap.getBrightness()); - image.getImage().setContrast(cap.getContrast()); - image.getImage() - .setInterpolated(cap.isInterpolationState()); - target.drawRasters(paintProps, image); + + ImagingCapability imgCap = new ImagingCapability(); //getCapability(ImagingCapability.class);// + imgCap.setBrightness(((RadarResourceData)resourceData).getBrightness()); + imgCap.setContrast(((RadarResourceData)resourceData).getContrast()); + imgCap.setAlpha(((RadarResourceData)resourceData).getAlpha()); + //((RadarResourceData)resourceData).fireChangeListeners(ChangeType.CAPABILITY, imgCap); + + image.getImage().setBrightness(((RadarResourceData)resourceData).getBrightness()); + image.getImage().setContrast(((RadarResourceData)resourceData).getContrast()); + image.getImage().setInterpolated(imgCap.isInterpolationState()); + + paintProps.setAlpha(((RadarResourceData)resourceData).getAlpha()); + target.drawRasters(paintProps, image); } if (image == null || image.getCoverage() == null @@ -540,6 +563,8 @@ public abstract class RadarImageResource extends throw new VizException(msg, e); } } + + refreshImage = false; } /** @@ -739,14 +764,14 @@ public abstract class RadarImageResource extends if (image != null) { image.dispose(); } - } - + } // the colorBar and/or the colormap may have changed so update the // colorBarPainter and the colorMapParametersCapability which holds // the instance of the colorMap that Raytheon's code needs @Override public void resourceAttrsModified() { + // update the colorbarPainter with a possibly new colorbar ColorBarFromColormap colorBar = ((RadarResourceData)resourceData).getColorBar(); @@ -756,8 +781,9 @@ public abstract class RadarImageResource extends cmapParams.setColorMap( colorBar.getColorMap()); cmapParams.setColorMapName( ((RadarResourceData)resourceData).getColorMapName() ); - getCapability(ColorMapCapability.class).setColorMapParameters( cmapParams ); - + getCapability(ColorMapCapability.class).setColorMapParameters( cmapParams ); + refreshImage = true; + // TODO : how to migrate this to to11dr11? Or do we still need to do this? // baseTile.resourceChanged(ChangeType.CAPABILITY, this.getCapability( ColorMapCapability.class)); } @@ -779,6 +805,51 @@ public abstract class RadarImageResource extends } }); }*/ + + @Override + public void resourceChanged(ChangeType type, Object object) { + + if ( type != null && type == ChangeType.CAPABILITY ){ + if (object instanceof ImagingCapability ){ + ImagingCapability imgCap = getCapability(ImagingCapability.class); + ImagingCapability newImgCap = ( ImagingCapability ) object; + imgCap.setBrightness(newImgCap.getBrightness(), false); + imgCap.setContrast(newImgCap.getContrast(), false); + imgCap.setAlpha(newImgCap.getAlpha(), false); + ((RadarResourceData)resourceData).setAlpha( imgCap.getAlpha() ); + ((RadarResourceData)resourceData).setBrightness( imgCap.getBrightness() ); + ((RadarResourceData)resourceData).setContrast( imgCap.getContrast() ); + issueRefresh(); + + + } + else if (object instanceof ColorMapCapability ){ + + ColorMapCapability colorMapCap = getCapability(ColorMapCapability.class); + ColorMapCapability newColorMapCap = (ColorMapCapability) object; + ColorMapParameters newColorMapParms = newColorMapCap.getColorMapParameters(); + + if (newColorMapParms != null) { + colorMapCap.setColorMapParameters(newColorMapParms, false); + ColorMap theColorMap = ( ColorMap ) colorMapCap.getColorMapParameters().getColorMap(); + String colorMapName = colorMapCap.getColorMapParameters().getColorMapName(); + ((RadarResourceData)resourceData).setColorMapName( colorMapName ); + ((RadarResourceData)resourceData).getRscAttrSet().setAttrValue( "colorMapName", colorMapName ); + ColorBarFromColormap cBar = ((RadarResourceData)resourceData).getColorBar(); + cBar.setColorMap( theColorMap ); + ((RadarResourceData)resourceData).getRscAttrSet().setAttrValue( "colorBar", cBar ); + ((RadarResourceData)resourceData).setIsEdited( true ); + + refreshImage = true; + issueRefresh(); + } + + } + + } + + } + protected static class RadarImageDataRetrievalAdapter implements IColorMapDataRetrievalCallback { diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarResourceData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarResourceData.java index 9b76720ff8..0cf1db391c 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarResourceData.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarResourceData.java @@ -81,7 +81,40 @@ public class RadarResourceData extends AbstractNatlCntrsRequestableResourceData @XmlElement private ColorBarFromColormap colorBar; - public RadarResourceData() { + @XmlElement + private Float alpha; + + @XmlElement + private Float brightness; + + @XmlElement + private Float contrast; + + public Float getAlpha() { + return alpha; + } + + public void setAlpha(Float alpha) { + this.alpha = alpha; + } + + public Float getBrightness() { + return brightness; + } + + public void setBrightness(Float brightness) { + this.brightness = brightness; + } + + public Float getContrast() { + return contrast; + } + + public void setContrast(Float contrast) { + this.contrast = contrast; + } + + public RadarResourceData() { nameGenerator = new RadarNameGenerator(); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarGraphicsResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarGraphicsResource.java index a76fda970a..1022d4628c 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarGraphicsResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarGraphicsResource.java @@ -16,6 +16,7 @@ import java.util.Set; import org.eclipse.swt.graphics.RGB; import org.opengis.referencing.crs.CoordinateReferenceSystem; +import com.raytheon.uf.common.colormap.ColorMap; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.radar.RadarDataKey; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; @@ -35,8 +36,10 @@ 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.ResourceType; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; import com.raytheon.uf.viz.core.rsc.capabilities.IMiddleClickCapableResource; +import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability; import com.raytheon.viz.radar.IRadarConfigListener; import com.raytheon.viz.radar.interrogators.IRadarInterrogator; @@ -49,6 +52,7 @@ import gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.AbstractRadarResource; import gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.RadarImageResource; import gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.RadarResourceData; import gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.RadarTileSet; +import gov.noaa.nws.ncep.viz.ui.display.ColorBarFromColormap; import com.raytheon.viz.radar.ui.RadarDisplayManager; import com.vividsolutions.jts.geom.Coordinate; @@ -65,6 +69,7 @@ import com.vividsolutions.jts.geom.Envelope; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 12/16/2011 #541 S. Gurung Initial Creation + * 03/30/2012 #651 S. Gurung Fixed NullPointerException bug in resourceChanged * * * @@ -193,6 +198,7 @@ public class RadarGraphicsResource extends AbstractRadarResource */ @Override public void resourceChanged(ChangeType type, Object object) { + RadarResourceData radarRscData = ( RadarResourceData ) this.resourceData; //super.resourceChanged(type, object); if (type == ChangeType.CAPABILITY) { if (object instanceof MagnificationCapability) { @@ -203,6 +209,37 @@ public class RadarGraphicsResource extends AbstractRadarResource display.setMagnification(mag); } } + + else if (object instanceof ImagingCapability ){ + ImagingCapability imgCap = getCapability(ImagingCapability.class); + ImagingCapability newImgCap = ( ImagingCapability ) object; + imgCap.setBrightness(newImgCap.getBrightness(), false); + imgCap.setContrast(newImgCap.getContrast(), false); + imgCap.setAlpha(newImgCap.getAlpha(), false); + radarRscData.setAlpha( imgCap.getAlpha() ); + radarRscData.setBrightness( imgCap.getBrightness() ); + radarRscData.setContrast( imgCap.getContrast() ); + + + } + else if (object instanceof ColorMapCapability ){ + + ColorMapCapability colorMapCap = getCapability(ColorMapCapability.class); + ColorMapCapability newColorMapCap = (ColorMapCapability) object; + if (newColorMapCap.getColorMapParameters() != null) { + colorMapCap.setColorMapParameters(newColorMapCap.getColorMapParameters(), false); + ColorMap theColorMap = ( ColorMap ) colorMapCap.getColorMapParameters().getColorMap(); + String colorMapName = colorMapCap.getColorMapParameters().getColorMapName(); + radarRscData.setColorMapName( colorMapName ); + radarRscData.getRscAttrSet().setAttrValue( "colorMapName", colorMapName ); + ColorBarFromColormap cBar = radarRscData.getColorBar(); + cBar.setColorMap( theColorMap ); + radarRscData.getRscAttrSet().setAttrValue( "colorBar", cBar ); + radarRscData.setIsEdited( true ); + } + } + + issueRefresh(); } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarMLResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarMLResource.java index 6744ba2de1..76d2d398fd 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarMLResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/graphic/RadarMLResource.java @@ -22,6 +22,7 @@ import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.crs.ProjectedCRS; import org.opengis.referencing.operation.TransformException; +import com.raytheon.uf.common.colormap.ColorMap; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; import com.raytheon.uf.common.dataplugin.radar.level3.LinkedContourVectorPacket; @@ -55,7 +56,9 @@ import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.ResourceType; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability; import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; import com.raytheon.viz.radar.interrogators.IRadarInterrogator; @@ -64,6 +67,7 @@ import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsResource.IRscDataObject; import gov.noaa.nws.ncep.viz.rsc.ncradar.VizRadarRecord; import gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.RadarResourceData; import gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.RadarTileSet; +import gov.noaa.nws.ncep.viz.ui.display.ColorBarFromColormap; import com.vividsolutions.jts.geom.Coordinate; @@ -78,6 +82,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 12/16/2011 #541 S. Gurung Initial creation + * 03/30/2012 #651 S. Gurung Fixed NullPointerException bug in resourceChanged * * * @@ -359,6 +364,40 @@ public class RadarMLResource extends RadarGraphicsResource { if (type == ChangeType.DATA_UPDATE) { refresh = true; } + else if ( type == ChangeType.CAPABILITY ){ + RadarResourceData radarRscData = ( RadarResourceData ) this.resourceData; + if (object instanceof ImagingCapability ){ + ImagingCapability imgCap = getCapability(ImagingCapability.class); + ImagingCapability newImgCap = ( ImagingCapability ) object; + imgCap.setBrightness(newImgCap.getBrightness(), false); + imgCap.setContrast(newImgCap.getContrast(), false); + imgCap.setAlpha(newImgCap.getAlpha(), false); + radarRscData.setAlpha( imgCap.getAlpha() ); + radarRscData.setBrightness( imgCap.getBrightness() ); + radarRscData.setContrast( imgCap.getContrast() ); + + } + else if (object instanceof ColorMapCapability ){ + + ColorMapCapability colorMapCap = getCapability(ColorMapCapability.class); + ColorMapCapability newColorMapCap = (ColorMapCapability) object; + if (newColorMapCap.getColorMapParameters() != null) { + colorMapCap.setColorMapParameters(newColorMapCap.getColorMapParameters(), false); + ColorMap theColorMap = ( ColorMap ) colorMapCap.getColorMapParameters().getColorMap(); + String colorMapName = colorMapCap.getColorMapParameters().getColorMapName(); + radarRscData.setColorMapName( colorMapName ); + radarRscData.getRscAttrSet().setAttrValue( "colorMapName", colorMapName ); + ColorBarFromColormap cBar = radarRscData.getColorBar(); + cBar.setColorMap( theColorMap ); + radarRscData.getRscAttrSet().setAttrValue( "colorBar", cBar ); + radarRscData.setIsEdited( true ); + } + + } + + issueRefresh(); + + } super.resourceChanged(type, object); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRadialResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRadialResource.java index 9d73a93bf7..12bb36c21b 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRadialResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRadialResource.java @@ -56,6 +56,7 @@ import com.vividsolutions.jts.geom.Coordinate; * ------------ ---------- ----------- -------------------------- * 12/09/2011 #541 S. Gurung Initial creation * 12/16/2011 S. Gurung Removed resourceAttrsModified() + * 03/30/2012 #651 S. Gurung Removed method resourceChanged * * * @@ -262,12 +263,7 @@ public class RadarRadialResource extends RadarImageResource { // TODO Auto-generated method stub return new FrameData(frameTime, frameInterval );//return null; } - - - @Override - public void resourceChanged(ChangeType type, Object object) { - } - + } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java index f9d0f9fb83..e7e9ec69fd 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java @@ -55,6 +55,7 @@ import gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.RadarResourceData; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 12/13/2011 #541 S. Gurung Initial creation + * 03/30/2012 #651 S. Gurung Removed method resourceChanged * * * @@ -246,12 +247,7 @@ public class RadarRasterResource extends RadarImageResource { // TODO Auto-generated method stub return new FrameData(frameTime, frameInterval );//return null; } - - @Override - public void resourceChanged(ChangeType type, Object object) { - // TODO Auto-generated method stub - - } + } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncscat/gov.noaa.nws.ncep.viz.rsc.ncscat.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.ncscat/gov.noaa.nws.ncep.viz.rsc.ncscat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.nonconvsigmet/gov.noaa.nws.ncep.viz.rsc.nonconvsigmet.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.nonconvsigmet/gov.noaa.nws.ncep.viz.rsc.nonconvsigmet.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.pgen/gov.noaa.nws.ncep.viz.rsc.pgen.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.pgen/gov.noaa.nws.ncep.viz.rsc.pgen.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/gov.noaa.nws.ncep.viz.rsc.plotdata.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/gov.noaa.nws.ncep.viz.rsc.plotdata.ecl new file mode 100644 index 0000000000..e69de29bb2 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 0c76d11076..aaa9ed34fe 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 @@ -24,13 +24,10 @@ 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.StationLatitude; import gov.noaa.nws.ncep.edex.common.metparameters.StationLongitude; -import gov.noaa.nws.ncep.edex.common.metparameters.WindDirection; -import gov.noaa.nws.ncep.edex.common.metparameters.WindSpeed; import gov.noaa.nws.ncep.viz.localization.NcPathManager; import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; 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; @@ -93,8 +90,8 @@ import com.raytheon.uf.viz.core.map.IMapDescriptor; * want to use. Specify symbolFont explicitly instead of setting from class. * 07/29/2011 #450 ghull NcPathManager; pass PlotParameterDefns instead of the PlotParameterDefnsMngr * 11/11/2011 ghull fix for wind barbs - * - * + * 01/19/2012 #539 qzhou Fixed southern hemisphere wind barbs + * 02/27/2012 #694 qzhou Fixed center symbol positions not overlap * * * @author BRock97 @@ -147,6 +144,8 @@ public class PlotModelFactory2 { return plotModel; } + double[] stationLoc = {0,0}; + public class PlotElement { private DisplayMode displayMode = DisplayMode.NULL; @@ -513,7 +512,7 @@ public class PlotModelFactory2 { +";font-family:"+fontFamily+";"; } else if( prmDefn.getPlotMode().equals("table" ) ){ - style = style + "stroke: "+color + style = style + "fill: none; "+"stroke: "+color +";stroke-width:"+pme.getSymbolSize()+"px" +";font-size:"+pme.getSymbolSize()+"em" +";font-family:"+fontFamily+";"; @@ -704,7 +703,7 @@ public class PlotModelFactory2 { public synchronized BufferedImage getStationPlot( HashMap metParams ) { - double[] stationLoc = {0,0}; + //double[] stationLoc = {0,0}; if( !metParams.containsKey( StationLatitude.class.getSimpleName() ) || !metParams.containsKey( StationLongitude.class.getSimpleName() ) ) { @@ -927,8 +926,13 @@ public class PlotModelFactory2 { } else if( cWindSpeed >= cWindSpeedThresh ) { int iWindSpeed = this.windNormalizer(cWindSpeed); - element.winds.barbElement.setAttribute("transform", "rotate(" - + dWindDir + ",0,0)"); + if (stationLoc[1] < 0) + + element.winds.barbElement.setAttribute("transform", "rotate(" + + (dWindDir) + ",0,0) matrix(-1, 0, 0, 1, 0, 0)"); + else + element.winds.barbElement.setAttribute("transform", "rotate(" + dWindDir + ",0,0)"); + element.winds.barbNode.setNodeValue( Integer.toString(iWindSpeed) ); } @@ -964,9 +968,14 @@ public class PlotModelFactory2 { if (element.winds.arrowElement != null) { if (dDir != -9999.0 && cMag != -9999.0) { - element.winds.arrowElement.setAttribute("transform", "rotate(" - + dDir + ",0,0)"); - element.winds.arrowNode.setNodeValue("arrow"); + if (stationLoc[1] < 0) + element.winds.barbElement.setAttribute("transform", "rotate(" + + (dDir) + ",0,0) matrix(-1, 0, 0, 1, 0, 0)"); + else + element.winds.barbElement.setAttribute("transform", "rotate(" + dDir + ",0,0)"); + + element.winds.arrowNode.setNodeValue("arrow"); + } else { element.winds.arrowElement.removeAttribute("transform"); element.winds.arrowNode.setNodeValue(" "); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelGenerator2.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelGenerator2.java index db65376b78..5c04d552f8 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelGenerator2.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelGenerator2.java @@ -122,7 +122,7 @@ import com.vividsolutions.jts.geom.Coordinate; * 11/01/2011 #482 ghull move S2N to PlotParameterDefn * 11/01/2011 #482 ghull move array lookup to setMetParamFromPDV * 11/15/2011 bhebbard ensure metParm units valid after query return - * + * 02/21/2012 Chin Chen Modified plotUpperAirData() for performance improvement * * * @author brockwoo @@ -676,9 +676,12 @@ public class PlotModelGenerator2 extends Job { long beginTime = 0; long endTime = Long.MAX_VALUE; - ArrayList latLonCoords = new ArrayList( stationQueue.size() ); + Date refTime=null; + //ArrayList latLonCoords = new ArrayList( stationQueue.size() ); Map plotMap = new HashMap(); - + + List stnIdLst = new ArrayList( stationQueue.size() ); + List rangeTimeLst = new ArrayList( stationQueue.size() ); // get the start and end time for the query. And get a list of // coordinates for the query. for( PlotInfo stnInfo : stationQueue ) { @@ -687,15 +690,23 @@ public class PlotModelGenerator2 extends Job { formatLatLonKey(stnInfo.latitude, stnInfo.longitude ), stnInfo ); stationQuery.add( stnInfo ); + refTime = stnInfo.dataTime.getRefTime(); long stnTime = stnInfo.dataTime.getValidTime().getTimeInMillis(); beginTime = ( beginTime < stnTime ? stnTime : beginTime ); endTime = ( endTime > stnTime ? stnTime : endTime ); - DataTime fcstTime = null; // for forecast model plotResources - // Can query by lat/lon or stnNum or stnId. - // String[] stnIds = new String[stationQuery.size()]; - // - latLonCoords.add( new Coordinate( stnInfo.longitude, stnInfo.latitude ) ); + + // + //latLonCoords.add( new Coordinate( stnInfo.longitude, stnInfo.latitude ) ); + //System.out.println("PlotModelGenerator2.plotUpperAirData(): lat = "+stnInfo.latitude+ " lon="+ + // stnInfo.longitude); + //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); + //System.out.println("PlotModelGenerator2.plotUpperAirData(): add rangeTime="+stnInfo.dataTime.getValidTime().getTime().toString()); + } } // TODO if this is an UpperAir FcstPlotResource then we will need to @@ -707,7 +718,10 @@ public class PlotModelGenerator2 extends Job { System.out.println("Error creating NcSoundingQuery2: "+e1.getMessage() ); return Status.CANCEL_STATUS; } - sndingQuery.setLatLonConstraints( latLonCoords ); + //chin sndingQuery.setLatLonConstraints( latLonCoords ); + sndingQuery.setStationIdConstraints(stnIdLst); + sndingQuery.setRangeTimeList(rangeTimeLst); + sndingQuery.setRefTimeConstraint(refTime); sndingQuery.setTimeRangeConstraint( new TimeRange( beginTime, endTime ) ); @@ -720,7 +734,10 @@ public class PlotModelGenerator2 extends Job { sndingQuery.setModelName( constraintMap.get("reportType" ).getConstraintValue() ); } - NcSoundingCube sndingCube = sndingQuery.query(); + //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 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 e6b40fd4ee..d36b9ccf28 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 @@ -6,6 +6,8 @@ import gov.noaa.nws.ncep.viz.resources.attributes.ResourceAttrSet.RscAttrValue; import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModel; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; @@ -39,7 +41,7 @@ import org.eclipse.swt.widgets.Text; * 10/13/2011 qzhou Fixed default level * 11/01/2011 #482 Greg Hull edit the plotDensity * 12/07/2011 B. Hebbard Added "Plot All" option - * + * 02/16/2012 #639 Q. Zhou Changed density text listener. Changed density duration to 30. Adjusted field size. * * * @author mli @@ -101,7 +103,7 @@ public class EditPlotDataAttrsDialog extends AbstractEditResourceAttrsDialog { FormData fd = new FormData(); fd.left = new FormAttachment( 0, 10 ); fd.top = new FormAttachment( 0, 10 ); - fd.right = new FormAttachment( 70, 0 ); + fd.right = new FormAttachment( 79, 0 ); densityGrp.setLayoutData( fd ); densityGrp.setLayout( new FormLayout() ); @@ -115,9 +117,9 @@ public class EditPlotDataAttrsDialog extends AbstractEditResourceAttrsDialog { //fd.width = 120; densitySldr.setLayoutData( fd ); - int initSldrVal = Math.min( ((Integer)plotDensityAttr.getAttrValue()).intValue(), 20 ); - densitySldr.setValues( initSldrVal, 1, 21, 1, 1, 2 ); - densitySldr.setToolTipText(""); + int initSldrVal = Math.min( ((Integer)plotDensityAttr.getAttrValue()).intValue(), 30 ); + densitySldr.setValues( initSldrVal, 1, 31, 1, 1, 2 ); + densitySldr.setToolTipText("Density of plot stations"); final Label sparseLbl = new Label( densityGrp, SWT.NONE ); sparseLbl.setText("Sparse"); @@ -138,9 +140,39 @@ public class EditPlotDataAttrsDialog extends AbstractEditResourceAttrsDialog { fd = new FormData( ); fd.left = new FormAttachment( densitySldr, 10, SWT.RIGHT ); fd.bottom = new FormAttachment( densitySldr, 0, SWT.BOTTOM ); - //fd.right = new FormAttachment( 100, -10 ); + fd.top = new FormAttachment( densitySldr, 0, SWT.TOP ); + fd.right = new FormAttachment( densityTxt, 30, SWT.LEFT ); + densityTxt.setToolTipText("Plot density"); densityTxt.setLayoutData( fd ); + densityTxt.addKeyListener(new KeyAdapter() { + public void keyReleased(KeyEvent e) { + + int ival; + try { + ival = Integer.parseInt( densityTxt.getText() ); + } + catch( NumberFormatException exc ) { + ival = 10; //((Integer)plotDensityAttr.getAttrValue()).intValue(); + } + + if( ival < densitySldr.getMinimum() ) { + ival = densitySldr.getMinimum(); + densityTxt.setText( Integer.toString( ival ) ); + } + else if( ival >= densitySldr.getMaximum() ) { // was > see below + //ival = densitySldr.getMaximum(); + ival = densitySldr.getMaximum() - 1; //TODO that is, 20, due to slider quirk + densityTxt.setText( Integer.toString( ival ) ); + } + + densitySldr.setSelection( ival ); + + plotDensityAttr.setAttrValue( new Integer( ival ) ); + } + + }); + final Button plotAllBtn = new Button ( densityGrp, SWT.CHECK ); plotAllBtn.setText("Plot All"); plotAllBtn.setToolTipText("Plot every station unconditionally"); @@ -157,32 +189,32 @@ public class EditPlotDataAttrsDialog extends AbstractEditResourceAttrsDialog { } }); - densityTxt.addSelectionListener( new SelectionAdapter() { - public void widgetDefaultSelected(SelectionEvent e) { - int ival; - try { - ival = Integer.parseInt( densityTxt.getText() ); - } - catch( NumberFormatException exc ) { - ival = ((Integer)plotDensityAttr.getAttrValue()).intValue(); - densityTxt.setText( Integer.toString( ival ) ); - } - - if( ival < densitySldr.getMinimum() ) { - ival = densitySldr.getMinimum(); - densityTxt.setText( Integer.toString( ival ) ); - } - else if( ival >= densitySldr.getMaximum() ) { // was > see below - //ival = densitySldr.getMaximum(); - ival = densitySldr.getMaximum() - 1; //TODO that is, 20, due to slider quirk - densityTxt.setText( Integer.toString( ival ) ); - } - - densitySldr.setSelection( ival ); - - plotDensityAttr.setAttrValue( new Integer( ival ) ); - } - }); +// densityTxt.addSelectionListener( new SelectionAdapter() { +// public void widgetDefaultSelected(SelectionEvent e) { +// int ival; +// try { +// ival = Integer.parseInt( densityTxt.getText() ); +// } +// catch( NumberFormatException exc ) { +// ival = ((Integer)plotDensityAttr.getAttrValue()).intValue(); +// densityTxt.setText( Integer.toString( ival ) ); +// } +// +// if( ival < densitySldr.getMinimum() ) { +// ival = densitySldr.getMinimum(); +// densityTxt.setText( Integer.toString( ival ) ); +// } +// else if( ival >= densitySldr.getMaximum() ) { // was > see below +// //ival = densitySldr.getMaximum(); +// ival = densitySldr.getMaximum() - 1; //TODO that is, 20, due to slider quirk +// densityTxt.setText( Integer.toString( ival ) ); +// } +// +// densitySldr.setSelection( ival ); +// +// plotDensityAttr.setAttrValue( new Integer( ival ) ); +// } +// }); plotAllBtn.addSelectionListener( new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { @@ -207,7 +239,7 @@ public class EditPlotDataAttrsDialog extends AbstractEditResourceAttrsDialog { }); // Big initial (incoming) density value means "plot all" - if ( ((Integer)plotDensityAttr.getAttrValue()).intValue() > 20 ) { + if ( ((Integer)plotDensityAttr.getAttrValue()).intValue() > 30 ) { plotAllBtn.setSelection(true); densitySldr.setEnabled(false); densityTxt.setEnabled(false); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/FcstPlotResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/FcstPlotResource.java index c2266f4cf7..8b8effe4c5 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/FcstPlotResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/FcstPlotResource.java @@ -28,6 +28,7 @@ import com.raytheon.viz.pointdata.PlotInfo; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 10/04/2010 #307 ghull Created + * 02/16/2012 #555 sgurung Changed frameData.setPopulated() to frameData.setPopulated(true) in populateFrame(). * * * @@ -97,7 +98,7 @@ public class FcstPlotResource extends PlotResource2 { dataTimes.add( availTime ); } } - } + } } // Override the PlotResource2 version which will query the db based on the start @@ -155,9 +156,9 @@ public class FcstPlotResource extends PlotResource2 { } } - frameData.calculateProgDisc(); - - frameData.setPopulated(); + frameData.calculateProgDisc(); + + frameData.setPopulated(true); } // @Override diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResource2.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResource2.java index d0a409c12c..9f78793ccb 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResource2.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResource2.java @@ -98,7 +98,8 @@ import com.vividsolutions.jts.geom.Coordinate; * 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) * * * @author brockwoo @@ -278,7 +279,7 @@ public class PlotResource2 extends AbstractNatlCntrsResource * * @author ghull @@ -78,20 +79,5 @@ public class TafPlotResource extends PlotResource2 { //processNewRscDataList(); } - - @Override - protected void populateFrame( FrameData frameData ) throws VizException { - if (!frameData.isStationMapEmpty() && frameData.getProgDiscDone()==false) { - // frameData already populated but progressive disclosure hasn't been run - frameData.calculateProgDisc(); - frameData.setProgDiscDone(true); - } else { - if (!frameData.isPopulated()) { - // when area is changed - frameData.populateFrame(); - frameData.setProgDiscDone(false); - } - } - } - + } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/META-INF/MANIFEST.MF index 558cf6469e..32fb48e6f4 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/META-INF/MANIFEST.MF +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/META-INF/MANIFEST.MF @@ -36,4 +36,5 @@ Export-Package: gov.noaa.nws.ncep.viz.rsc.satellite, gov.noaa.nws.ncep.viz.rsc.satellite.rsc, gov.noaa.nws.ncep.viz.rsc.satellite.units Import-Package: + com.raytheon.viz.core.gl, gov.noaa.nws.ncep.viz.ui.display diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/gov.noaa.nws.ncep.viz.rsc.satellite.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/gov.noaa.nws.ncep.viz.rsc.satellite.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/localization/ncep/resourceTemplates/McidasSatellite.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/localization/ncep/resourceTemplates/McidasSatellite.xml index 1566d92a1e..8cc3e884df 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/localization/ncep/resourceTemplates/McidasSatellite.xml +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/localization/ncep/resourceTemplates/McidasSatellite.xml @@ -28,7 +28,10 @@ ${dfltNumFrames} ${dfltTimeRange} ${timeMatchMethod} - ${timelineGenMethod} + ${timelineGenMethod} + ${alpha} + ${brightness} + ${contrast} + + + + + + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/AbstractSatelliteResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/AbstractSatelliteResource.java index 14bfa3588b..f62030ff92 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/AbstractSatelliteResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/AbstractSatelliteResource.java @@ -7,6 +7,7 @@ import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsResource; import gov.noaa.nws.ncep.viz.resources.INatlCntrsResource; import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarResource; import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarResourceData; +import gov.noaa.nws.ncep.viz.resources.manager.ResourceName; import gov.noaa.nws.ncep.viz.rsc.satellite.units.NcSatelliteUnits; import gov.noaa.nws.ncep.viz.ui.display.ColorBarFromColormap; @@ -21,6 +22,7 @@ import javax.measure.unit.SI; import javax.measure.unit.Unit; import javax.measure.unit.UnitFormat; +import org.eclipse.jface.action.IContributionItem; import org.geotools.coverage.grid.GeneralGridGeometry; import org.geotools.coverage.grid.GridGeometry2D; import org.opengis.referencing.crs.CoordinateReferenceSystem; @@ -44,14 +46,20 @@ import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.MapDescriptor; import com.raytheon.uf.viz.core.rsc.GenericResourceData; +import com.raytheon.uf.viz.core.rsc.IResourceDataChanged; import com.raytheon.uf.viz.core.rsc.LoadProperties; +import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType; +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.level.Level; import com.raytheon.uf.viz.core.style.level.SingleLevel; import com.raytheon.uf.viz.derivparam.library.DerivedParameterRequest; +import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.rsc.hdf5.AbstractTileSet; import com.raytheon.viz.core.rsc.hdf5.FileBasedTileSet; import com.raytheon.viz.satellite.SatelliteConstants; +import com.raytheon.viz.ui.cmenu.IContextMenuContributor; import com.vividsolutions.jts.geom.Coordinate; @@ -74,7 +82,13 @@ import com.vividsolutions.jts.geom.Coordinate; * 04/15/2010 #259 ghull Added ColorBar * 05/24/2010 #281 ghull Incorporate changes to Raytheon's SatResource. * 05/25/2010 #281 ghull created from SatResource and McidasResource - * 03/10/2011 #393 archana added the method getTileSet() to the resource + * 03/10/2011 #393 archana added the method getTileSet() to the resource + * 03/12/2012 #651 archana added method resourceChanged(). Updated paintFrame() to relect the + * current brightness/contrast/alpha values in the loaded satellite image + * 04/10/2012 bhebbard In getSatIRTemperature(...), do IGLTarget.makeContextCurrent() + * to avoid GLException: "No OpenGL context current on this thread" + * on following interrogate(); workaround pending RTS regression fix. + * * * * @author chammack @@ -82,7 +96,8 @@ import com.vividsolutions.jts.geom.Coordinate; */ public abstract class AbstractSatelliteResource extends AbstractNatlCntrsResource implements - INatlCntrsResource { + INatlCntrsResource, IResourceDataChanged + { protected SatelliteResourceData satRscData; @@ -252,6 +267,7 @@ public abstract class AbstractSatelliteResource extends AbstractNatlCntrsResourc public AbstractSatelliteResource(SatelliteResourceData data, LoadProperties props) { super(data, props); satRscData = data; + satRscData.addChangeListener(this); // this.tileSet = new HashMap(); // this.dataTimes = new ArrayList(); @@ -475,14 +491,21 @@ public abstract class AbstractSatelliteResource extends AbstractNatlCntrsResourc FileBasedTileSet tileSet = currFrame.tileSet; if( tileSet != null ) { + ImagingCapability imgCap = new ImagingCapability(); + imgCap.setBrightness(satRscData.getBrightness()); + imgCap.setContrast(satRscData.getContrast()); + imgCap.setAlpha(satRscData.getAlpha()); + paintProps.setAlpha(satRscData.getAlpha()); +// satRscData.fireChangeListeners(ChangeType.CAPABILITY, imgCap); +// System.out.println("alpha = " + imgCap.getAlpha()); ColorMapParameters params = getCapability(ColorMapCapability.class) .getColorMapParameters(); if (params.getColorMap() == null) { String colorMapName = params.getColorMapName(); if (colorMapName == null) colorMapName = "Sat/VIS/ZA (Vis Default)"; - - params.setColorMap(target.buildColorMap(colorMapName)); +// params.setColorMap(target.buildColorMap(colorMapName)); + params.setColorMap(ColorMapUtil.loadColorMap(ResourceName.SatelliteRscCategory, colorMapName)); } tileSet.paint( target, paintProps ); @@ -608,6 +631,12 @@ public abstract class AbstractSatelliteResource extends AbstractNatlCntrsResourc return null; } try { + // Workaround for RTS changes ~OB12.4 that would cause + // GLException: "No OpenGL context current on this thread" + // on following interrogate(...); pending RTS solution. + if (grphTarget instanceof IGLTarget) { + ((IGLTarget)grphTarget).makeContextCurrent(); + } return currFrame.tileSet.interrogate(latlon, false); } catch (VizException e) { return null; @@ -680,11 +709,42 @@ public abstract class AbstractSatelliteResource extends AbstractNatlCntrsResourc // // return legendStr; // } -// -// @Override -// public void addContextMenuItems(IMenuManager menuManager) { -// if (descriptor != null && getName().contains("IR")) { -// CloudHeightRightClickAction.addInstance(menuManager, descriptor); -// } -// } + + + @Override + public void resourceChanged(ChangeType type, Object object) { + if ( type != null && type == ChangeType.CAPABILITY ){ + if (object instanceof ImagingCapability ){ + ImagingCapability imgCap = getCapability(ImagingCapability.class); + ImagingCapability newImgCap = ( ImagingCapability ) object; + imgCap.setBrightness(newImgCap.getBrightness(), false); + imgCap.setContrast(newImgCap.getContrast(), false); + imgCap.setAlpha(newImgCap.getAlpha(), false); + satRscData.setAlpha( imgCap.getAlpha() ); + satRscData.setBrightness( imgCap.getBrightness() ); + satRscData.setContrast( imgCap.getContrast() ); + issueRefresh(); + + + } + else if (object instanceof ColorMapCapability ){ + + ColorMapCapability colorMapCap = getCapability(ColorMapCapability.class); + ColorMapCapability newColorMapCap = (ColorMapCapability) object; + colorMapCap.setColorMapParameters(newColorMapCap.getColorMapParameters(), false); + ColorMap theColorMap = ( ColorMap ) colorMapCap.getColorMapParameters().getColorMap(); + String colorMapName = colorMapCap.getColorMapParameters().getColorMapName(); + satRscData.setColorMapName( colorMapName ); + satRscData.getRscAttrSet().setAttrValue( "colorMapName", colorMapName ); + ColorBarFromColormap cBar = satRscData.getColorBar(); + cBar.setColorMap( theColorMap ); + satRscData.getRscAttrSet().setAttrValue( "colorBar", cBar ); + satRscData.setIsEdited( true ); + issueRefresh(); + + } + + } + + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/EditSatelliteAttrsDialog.java b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/EditSatelliteAttrsDialog.java index 6fe430ec94..5bd3fd8e8a 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/EditSatelliteAttrsDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/EditSatelliteAttrsDialog.java @@ -18,8 +18,10 @@ import com.raytheon.uf.common.colormap.ColorMap; import com.raytheon.uf.viz.core.exception.VizException; import gov.noaa.nws.ncep.viz.resources.INatlCntrsResourceData; +import gov.noaa.nws.ncep.viz.resources.attributes.AbstractEditResourceAttrsInteractiveDialog; import gov.noaa.nws.ncep.viz.resources.attributes.AbstractEditResourceAttrsDialog; import gov.noaa.nws.ncep.viz.resources.attributes.ResourceAttrSet.RscAttrValue; +import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarFromColorMapAttrsEditorComposite; import gov.noaa.nws.ncep.viz.resources.colorBar.ColorBarEditor; import gov.noaa.nws.ncep.viz.ui.display.ColorBarFromColormap; import gov.noaa.nws.ncep.viz.common.ColorMapUtil; @@ -32,7 +34,8 @@ import gov.noaa.nws.ncep.viz.common.ColorMapUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 03/24/10 #259 Greg Hull Initial Creation. - * 04/27/2010 #245 Greg Hull Added Apply Button + * 04/27/2010 #245 Greg Hull Added Apply Button * + * 03/29/2012 #651 S. Gurung Extend AbstractEditResourceAttrsInteractiveDialog * * * @@ -40,118 +43,30 @@ import gov.noaa.nws.ncep.viz.common.ColorMapUtil; * @version 1 */ -public class EditSatelliteAttrsDialog extends AbstractEditResourceAttrsDialog { +public class EditSatelliteAttrsDialog extends AbstractEditResourceAttrsInteractiveDialog { public EditSatelliteAttrsDialog(Shell parentShell, INatlCntrsResourceData r, Boolean apply) { + super(parentShell, r, apply); + resourceData = r; // TODO Auto-generated constructor stub } - private RscAttrValue colorMapNameAttr = null; - private RscAttrValue colorBarAttr = null; - - private ColorBarFromColormap editedColorBar = null; - private ColorBarEditor colorBarEditor = null; - - private String cmapCategory="Satellite"; + private INatlCntrsResourceData resourceData; + private ColorBarFromColorMapAttrsEditorComposite cBarComposite= null; // @Override public Composite createDialog( Composite topComp ) { - - colorMapNameAttr = editedRscAttrSet.getRscAttr( "colorMapName" ); - colorBarAttr = editedRscAttrSet.getRscAttr( "colorBar" ); - if( colorMapNameAttr == null || colorMapNameAttr.getAttrClass() != String.class ) { - System.out.println("colorMapName is null or not of expected class String?"); - return null; - } - if( colorBarAttr == null || colorBarAttr.getAttrClass() != ColorBarFromColormap.class ) { - System.out.println("colorBar is null or not of expected class ColorBarFromColormap?"); - return null; - } - - // The resource category is the category of the colormaps - cmapCategory = rscData.getResourceName().getRscCategory(); FormLayout layout0 = new FormLayout(); topComp.setLayout(layout0); - // the resource category is the category for the colormaps - final String availColorMaps[] = ColorMapUtil.listColorMaps( cmapCategory ); - - final Combo colorMapNamesCombo = new Combo( topComp, SWT.READ_ONLY | SWT.DROP_DOWN ); - FormData fd = new FormData(); - fd.left = new FormAttachment( 50, -30 ); - fd.top = new FormAttachment( 0, 20 ); - colorMapNamesCombo.setLayoutData( fd ); - - colorMapNamesCombo.setItems( availColorMaps ); - int seldColorMapIndx = -1; - - for( int c=0 ; c displayUnit; + private AbstractVizResource satRsc = null; + public SatelliteResourceData() { super(); @@ -97,10 +110,12 @@ public class SatelliteResourceData extends AbstractNatlCntrsRequestableResourceD // records[i] = (SatelliteRecord) objects[i]; // } if( satelliteType == SatelliteType.GINI ) { - return new GiniSatResource(this, loadProperties); + satRsc = new GiniSatResource(this, loadProperties); + return satRsc; } else if( satelliteType == SatelliteType.MCIDAS ) { - return new McidasSatResource(this, loadProperties); + satRsc = new McidasSatResource(this, loadProperties); + return satRsc; } else { System.out.println("Unrecognized satellite type: "+satelliteType.toString() ); @@ -109,6 +124,11 @@ public class SatelliteResourceData extends AbstractNatlCntrsRequestableResourceD } + public AbstractVizResource getResource() { + return satRsc; + } + + public Unit getDisplayUnit() { if( displayUnit == null ) { setDisplayUnitStr( displayUnitStr ); @@ -151,7 +171,37 @@ public class SatelliteResourceData extends AbstractNatlCntrsRequestableResourceD this.colorBar = cBar; } - @Override + public Float getAlpha() { + return alpha; + } + + + public void setAlpha(Float alpha) { + this.alpha = alpha; + } + + + public Float getBrightness() { + return brightness; + } + + + public void setBrightness(Float brightness) { + this.brightness = brightness; + } + + + public Float getContrast() { + return contrast; + } + + + public void setContrast(Float contrast) { + this.contrast = contrast; + } + + + @Override public boolean equals(Object obj) { if (!super.equals(obj)) { return false; @@ -183,7 +233,30 @@ public class SatelliteResourceData extends AbstractNatlCntrsRequestableResourceD if( this.satelliteType != other.satelliteType ) { return false; } - + + if ( (this.alpha != null && other.alpha == null) + || (this.alpha == null && other.alpha != null) + || (this.alpha != null && this.alpha.equals(other.alpha) == false)){ + return false; + + } + + if ( (this.brightness != null && other.brightness == null) + || (this.brightness == null && other.brightness != null) + || (this.brightness != null && this.brightness.equals(other.brightness) == false)){ + return false; + + } + + if ( (this.contrast != null && other.contrast == null) + || (this.contrast == null && other.contrast != null) + || (this.contrast != null && this.contrast.equals(other.contrast) == false)){ + return false; + + } + + return true; } + } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.stormtrack/gov.noaa.nws.ncep.viz.rsc.stormtrack.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.stormtrack/gov.noaa.nws.ncep.viz.rsc.stormtrack.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.svrl/gov.noaa.nws.ncep.viz.rsc.svrl.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.svrl/gov.noaa.nws.ncep.viz.rsc.svrl.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.svrl/src/gov/noaa/nws/ncep/viz/rsc/svrl/rsc/SvrlResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.svrl/src/gov/noaa/nws/ncep/viz/rsc/svrl/rsc/SvrlResource.java index 67805129ca..215f0fe49f 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.svrl/src/gov/noaa/nws/ncep/viz/rsc/svrl/rsc/SvrlResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.svrl/src/gov/noaa/nws/ncep/viz/rsc/svrl/rsc/SvrlResource.java @@ -11,7 +11,8 @@ package gov.noaa.nws.ncep.viz.rsc.svrl.rsc; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 27 May 2010 Uma Josyula Initial creation. - * 01/10/11 Uma Josyula Made changes to preprocess update and event date + * 01/10/11 Uma Josyula Made changes to preprocess update and event date + * 02/16/2012 555 S. Gurung Added call to setAllFramesAsPopulated() in queryRecords(). * * * @author ujosyula @@ -626,7 +627,9 @@ drawCountyOutline2(svrlData,target,color,symbolWidth,lineStyle,paintProps);//T45 @Override public void queryRecords() throws VizException { - + // this method is almost similar to its super class's queryRecords(), may need to be modified later + // to use the super class's version for the common part + HashMap queryList = new HashMap( resourceData.getMetadataMap()); @@ -652,6 +655,7 @@ drawCountyOutline2(svrlData,target,color,symbolWidth,lineStyle,paintProps);//T45 } scqr.populateMap(); + setAllFramesAsPopulated(); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.warn/gov.noaa.nws.ncep.viz.rsc.warn.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.warn/gov.noaa.nws.ncep.viz.rsc.warn.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.warn/src/gov/noaa/nws/ncep/viz/rsc/warn/rsc/WarnResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.warn/src/gov/noaa/nws/ncep/viz/rsc/warn/rsc/WarnResource.java index 97a89c592d..2cca4eac65 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.warn/src/gov/noaa/nws/ncep/viz/rsc/warn/rsc/WarnResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.warn/src/gov/noaa/nws/ncep/viz/rsc/warn/rsc/WarnResource.java @@ -86,7 +86,8 @@ import com.vividsolutions.jts.io.WKBReader; * 10/01/10 #307 Greg Hull implement processRecords and change to * process WarnData as the IRscDataObj * 07/28/11 #450 Greg Hull NcPathManager - * 08/31/11 #456 Gang Zhang AWW fix + * 08/31/11 #456 Gang Zhang AWW fix + * 02/16/2012 #555 S. Gurung Added call to setAllFramesAsPopulated() in queryRecords(). * * * @@ -405,7 +406,9 @@ public class WarnResource extends AbstractNatlCntrsResource< WarnResourceData, I */ @Override public void queryRecords() throws VizException { - + // this method is almost similar to its super class's queryRecords(), may need to be modified later + // to use the super class's version for the common part + HashMap queryList = new HashMap( resourceData.getMetadataMap()); @@ -432,6 +435,7 @@ public class WarnResource extends AbstractNatlCntrsResource< WarnResourceData, I } } countyResult.populateMap(); + setAllFramesAsPopulated(); } /** diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wavesat/gov.noaa.nws.ncep.viz.rsc.wavesat.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.wavesat/gov.noaa.nws.ncep.viz.rsc.wavesat.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wavesat/src/gov/noaa/nws/ncep/viz/rsc/wavesat/rsc/WaveSatResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.wavesat/src/gov/noaa/nws/ncep/viz/rsc/wavesat/rsc/WaveSatResource.java index 3c5b893ada..31b39d3fc2 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.wavesat/src/gov/noaa/nws/ncep/viz/rsc/wavesat/rsc/WaveSatResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.wavesat/src/gov/noaa/nws/ncep/viz/rsc/wavesat/rsc/WaveSatResource.java @@ -70,7 +70,8 @@ import org.eclipse.swt.graphics.Rectangle; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 09/21/2011 #248 Greg Hull Initial creation. + * 09/21/2011 #248 Greg Hull Initial creation. + * 02/16/2012 #555 S. Gurung Added call to setPopulated(true) in queryData(). * * * @@ -235,6 +236,8 @@ public class WaveSatResource extends AbstractNatlCntrsResource * @@ -982,6 +983,8 @@ gu.add((MultiPolygon)countyGeo.clone()); gw.add(countyGeo); @Override public void queryRecords() throws VizException { + // this method is almost similar to its super class's queryRecords(), may need to be modified later + // to use the super class's version for the common part HashMap queryList = new HashMap(resourceData.getMetadataMap()); @@ -1010,7 +1013,8 @@ gu.add((MultiPolygon)countyGeo.clone()); gw.add(countyGeo); } } - queryResult.populateMap(); + queryResult.populateMap(); + setAllFramesAsPopulated(); } public void setMarineZonesFips(Set awwFipsSet , WcnRscDataObj wrdo){ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wcp/gov.noaa.nws.ncep.viz.rsc.wcp.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.wcp/gov.noaa.nws.ncep.viz.rsc.wcp.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wou/gov.noaa.nws.ncep.viz.rsc.wou.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.wou/gov.noaa.nws.ncep.viz.rsc.wou.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/gov.noaa.nws.ncep.viz.rsc.wstm.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/gov.noaa.nws.ncep.viz.rsc.wstm.ecl new file mode 100644 index 0000000000..e69de29bb2 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 91ce3d248b..8a5420c34f 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 @@ -81,7 +81,8 @@ import com.vividsolutions.jts.io.ParseException; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 05-Nov- 2010 247 Archana Initial creation. + * 05-Nov- 2010 247 Archana Initial creation. + * 16 Feb 2012 555 S. Gurung Added call to setAllFramesAsPopulated() in queryRecords(). * * * @@ -1173,7 +1174,9 @@ wqr.buildQueryPart(aSetOfAwwFips); wstmRscDataObject.aListOfFipsInfoObjects=crea @Override public void queryRecords() throws VizException { - + // this method is almost similar to its super class's queryRecords(), may need to be modified later + // to use the super class's version for the common part + HashMap queryList = new HashMap( resourceData.getMetadataMap()); @@ -1196,7 +1199,8 @@ wqr.buildQueryPart(aSetOfAwwFips); wstmRscDataObject.aListOfFipsInfoObjects=crea } } -wqr.populateFipsMap(); + wqr.populateFipsMap(); + setAllFramesAsPopulated(); } private List createListOfFipsInfoObjects2 ( Set aSetOfAwwFips ) { diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wtch/gov.noaa.nws.ncep.viz.rsc.wtch.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.wtch/gov.noaa.nws.ncep.viz.rsc.wtch.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/AODTLIB/libaodtv64.so.save b/ncep/gov.noaa.nws.ncep.viz.tools/AODTLIB/libaodtv64.so.save old mode 100755 new mode 100644 diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/AODTLIB/so_new.csh b/ncep/gov.noaa.nws.ncep.viz.tools/AODTLIB/so_new.csh old mode 100755 new mode 100644 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 1f2e8ed80b..25bcfa406d 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 @@ -36,7 +36,6 @@ Export-Package: gov.noaa.nws.ncep.viz.tools, gov.noaa.nws.ncep.viz.tools.frame, gov.noaa.nws.ncep.viz.tools.imageProperties, gov.noaa.nws.ncep.viz.tools.loopManagement, - gov.noaa.nws.ncep.viz.tools.pgenFileName, gov.noaa.nws.ncep.viz.tools.predefinedArea Eclipse-RegisterBuddy: org.apache.log4j Bundle-ClassPath: . diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/gov.noaa.nws.ncep.viz.tools.ecl b/ncep/gov.noaa.nws.ncep.viz.tools/gov.noaa.nws.ncep.viz.tools.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorType.tbl b/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorType.tbl deleted file mode 100644 index 53b4fb49ba..0000000000 --- a/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorType.tbl +++ /dev/null @@ -1,17 +0,0 @@ -! CURSORTYPE.TBL -! -! This table contains the N_AWIPS cursor type information. -! -! Each cursor type defined in N_AWIPS gets its shape from a .png -! file in build/static/common/cave/ncep/cursor/images/. -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -!CURSOR_NAME IMAGE_FILENAME -! -SMALL_ARROW SMALL_ARROW.png -LARGE_ARROW LARGE_ARROW.png -SMALL_CROSS SMALL_CROSS.png -LARGE_CROSS LARGE_CROSS.png -SMALL_X SMALL_X.png -LARGE_X LARGE_X.png \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorref_tbl.xml b/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorref_tbl.xml deleted file mode 100644 index db2b972c40..0000000000 --- a/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorref_tbl.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - 0 - CURS_DEFAULT - SMALL_ARROW - red - - - - 1 - CURS_POINT_SELECT - SMALL_CROSS - white - - - - 2 - CURS_BUSY - SMALL_X - white - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorref_tbl.xsd b/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorref_tbl.xsd deleted file mode 100644 index 02c7c43bf0..0000000000 --- a/ncep/gov.noaa.nws.ncep.viz.tools/res/cursorref_tbl.xsd +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColorBarViewer.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColorBarViewer.java index d4844e779f..26b182513f 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColorBarViewer.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColorBarViewer.java @@ -13,15 +13,18 @@ public class ColorBarViewer extends ColorBar { public ColorBarViewer(Composite parent, IColorBarAction callback, String[] sliderText, ColorMapParameters cmapParam) { - super(parent, callback, cmapParam, true); + super(parent, callback, cmapParam, false); } // TODO: Not Migrated... public void setNewColorMap( String[] sliderText, ArrayList newColors ) { -// setSliderText( sliderText ); -// setStartingColors( newColors ); - + //setSliderText( sliderText ); + setStartingColors( newColors ); revertColorBar(); } + + protected void setStartingColors(ArrayList newColors) { + startingColors = new ArrayList(newColors); + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColormapEditDialog.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColormapEditDialog.java index 6a2325a78b..62e2869e26 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColormapEditDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/colorMapEditor/ColormapEditDialog.java @@ -1,6 +1,7 @@ package gov.noaa.nws.ncep.viz.tools.colorMapEditor; import gov.noaa.nws.ncep.viz.common.ColorMapUtil; +import gov.noaa.nws.ncep.viz.common.LockedColorMaps; import gov.noaa.nws.ncep.viz.ui.display.NmapUiUtils; import java.io.File; @@ -48,6 +49,8 @@ import com.raytheon.viz.ui.editor.AbstractEditor; * Jul 24, 2007 njensen Hooked into backend. * Apr 10, 2010 #259 ghull Copied and modified from Raytheon * July 18 2011 #450 ghull use NcPathManager + * Feb 10 2012 #686 sgurung Added fix for java.lang.IndexOutOfBoundsException while updating colormaps + * March 15 2012 #621 sgurung Check for locked colormaps * * * @@ -147,6 +150,8 @@ public class ColormapEditDialog extends Dialog implements IColorBarAction, private Combo selCmapCombo; + private LockedColorMaps lockedCmaps; + /** * Constructor. * @@ -196,7 +201,10 @@ public class ColormapEditDialog extends Dialog implements IColorBarAction, private void setup() { // Set the shell layout to a Grid layout. shell.setLayout(new GridLayout(1, false)); - + + // Read lockedColorMaps.tbl to get the list of locked color maps + lockedCmaps = ColorMapUtil.readLockedColorMapFile(); + availColorMaps = new ArrayList(); availColorMapCats = ColorMapUtil.getColorMapCategories(); @@ -220,18 +228,18 @@ public class ColormapEditDialog extends Dialog implements IColorBarAction, createSliderData(); // Initialize the components. - initComponents(); - + initComponents(); + // Pack the components. shell.pack(); } private boolean initColorMap( ) { try { - colorMap = (ColorMap) ColorMapUtil.loadColorMap( seldCmapCat, seldCmapName ); + colorMap = (ColorMap) ColorMapUtil.loadColorMap( seldCmapCat, seldCmapName, lockedCmaps != null && lockedCmaps.isLocked(seldCmapName)); cmapParams.setColorMap(colorMap); cmapParams.setColorMapMin(0); - cmapParams.setColorMapMax(colorMap.getSize()); + cmapParams.setColorMapMax(colorMap.getSize()-1); return true; } catch (VizException e) { System.out.println("Error Loading colorMap "+seldCmapCat+File.separator+seldCmapName); @@ -491,7 +499,20 @@ public class ColormapEditDialog extends Dialog implements IColorBarAction, // int sepIndx = seldCmapName.indexOf(File.separator); // String cmapCat = seldCmapName.substring(0,seldCmapName.indexOf(File.separator)); // String cmapName = seldCmapName.substring( seldCmapName.indexOf(File.separator)); - if( ColorMapUtil.colorMapExists( seldCmapCat, seldCmapName ) ) { + if (lockedCmaps != null && lockedCmaps.isLocked(seldCmapName)) { + MessageDialog confirmDlg = new MessageDialog( + NmapUiUtils.getCaveShell(), + "Save Colormap", null, + "Colormap " +seldCmapCat+File.separator +seldCmapName + + " already exists and is locked.\n\n" + + "You cannot overwrite it.", + MessageDialog.INFORMATION, new String[]{"OK"}, 0); + confirmDlg.open(); + colorBar.undoColorBar(); + updateColorMap(); + return; + } + else if( ColorMapUtil.colorMapExists( seldCmapCat, seldCmapName ) ) { MessageDialog confirmDlg = new MessageDialog( NmapUiUtils.getCaveShell(), "Save Colormap", null, @@ -724,13 +745,13 @@ public class ColormapEditDialog extends Dialog implements IColorBarAction, * Updates the color map currently displayed */ private void updateColorMap() { - if (colorMap == null) { + //if (colorMap == null) { colorMap = ColorUtil.buildColorMap(colorBar.getCurrentColors(), null); - } else { + /* } else { colorMap = ColorUtil.updateColorMap(colorBar.getCurrentColors(), colorMap); - } + }*/ cmapParams.setColorMap(colorMap); cmapParams.setColorMapName(null); ((AbstractEditor) EditorUtil.getActiveEditor()).refresh(); @@ -792,4 +813,5 @@ public class ColormapEditDialog extends Dialog implements IColorBarAction, msgDlg.open(); } } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/customProjection/CreateCustomProjectionDialog.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/customProjection/CreateCustomProjectionDialog.java index eda674196b..07bbc56a37 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/customProjection/CreateCustomProjectionDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/customProjection/CreateCustomProjectionDialog.java @@ -6,7 +6,7 @@ import gov.noaa.nws.ncep.gempak.parameters.marshaller.garea.GraphicsAreaCoordina import gov.noaa.nws.ncep.viz.common.ui.DisplayViewLowerLeftAndUpperRightLongLatValues; import gov.noaa.nws.ncep.viz.localization.NcPathManager; import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; -import gov.noaa.nws.ncep.viz.ui.display.NCMapDescriptor; +//import gov.noaa.nws.ncep.viz.ui.display.NCMapDescriptor; import java.text.DecimalFormat; import java.text.NumberFormat; @@ -72,6 +72,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Nov 22, 2011 B. Hebbard Comment out validateParameters() call from * handleProjectionSelection(), to prevent pre- * mature complaints about null Double values + * 03/2012 J. Wu Remove dependency on NCMapDescriptor * * * @@ -1751,15 +1752,15 @@ public class CreateCustomProjectionDialog extends CaveJFACEDialog { CoordinateReferenceSystem crs = MapUtil.constructProjection(name, parameters); - GeneralGridGeometry newMapGeom = NCMapDescriptor.createGridGeometry(crs, ll, ur); + GeneralGridGeometry newMapGeom = MapDescriptor.createGridGeometry(crs, ll, ur); AbstractEditor editor = (AbstractEditor) EditorUtil.getActiveEditor(); for (IDisplayPane pane : editor.getDisplayPanes()) { // reset the display to fully zoomed extent - NCMapDescriptor oldDescriptor = (NCMapDescriptor) pane - .getRenderableDisplay().getDescriptor(); + MapDescriptor oldDescriptor = (MapDescriptor) pane + .getRenderableDisplay().getDescriptor(); oldDescriptor.setGridGeometry(newMapGeom); // reset the display to fully zoomed extent diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/newEditors/NewDisplayAction.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/newEditors/NewDisplayAction.java index ff0c452fcf..2c6d96ada1 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/newEditors/NewDisplayAction.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/newEditors/NewDisplayAction.java @@ -26,7 +26,8 @@ import com.raytheon.uf.viz.core.VizApp; * ------------ ---------- ----------- -------------------------- * 04/20/11 Greg Hull change name to plot model editor. Don't refresh mapEditor * 08/12/11 #450 Greg Hull use the RBD name instead of the filename. - * + * 02/15/2012 #627 Archana Updated the call to addRbd() to accept + * a NCMapEditor object as one of the arguments * * * @author ghull @@ -81,11 +82,11 @@ public class NewDisplayAction extends AbstractHandler { } NCMapEditor editor = NmapUiUtils.createNatlCntrsEditor( newDisplayName ); - rbd.setNcEditor( editor ); + // rbd.setNcEditor( editor ); ResourceBndlLoader rbdLoader = new ResourceBndlLoader( "Loading RBD: "+rbd.getRbdName() ); - rbdLoader.addRBD( rbd ); + rbdLoader.addRBD( rbd, editor ); VizApp.runAsync( rbdLoader ); } catch ( Exception ve ) { diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.display/gov.noaa.nws.ncep.viz.ui.display.ecl b/ncep/gov.noaa.nws.ncep.viz.ui.display/gov.noaa.nws.ncep.viz.ui.display.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/AbstractNCLegendInputHandler.java b/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/AbstractNCLegendInputHandler.java new file mode 100644 index 0000000000..10fc5259dc --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/AbstractNCLegendInputHandler.java @@ -0,0 +1,40 @@ +package gov.noaa.nws.ncep.viz.ui.display; + +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.viz.ui.input.InputAdapter; +import com.raytheon.viz.ui.input.preferences.MousePreferenceManager; + +/** + * Abstract legend input handler for NC. Has a mouse preference manager, and a + * NCLegendResource. Extends InputAdapter. + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 02/03/2012              S. Gurung     Initial creation
    + * 
    + * 
    + * + * @author sgurung + * @version 1.0 + */ + +public class AbstractNCLegendInputHandler extends InputAdapter { + + protected static final IUFStatusHandler statusHandler = UFStatus + .getHandler(AbstractNCLegendInputHandler.class); + + protected MousePreferenceManager prefManager = MousePreferenceManager + .getInstance(); + + protected NCLegendResource resource; + + protected AbstractNCLegendInputHandler(NCLegendResource resource) { + this.resource = resource; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/NCLegendHandler.java b/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/NCLegendHandler.java new file mode 100644 index 0000000000..4aed2d973f --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/NCLegendHandler.java @@ -0,0 +1,254 @@ +/** + * 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.ui.display; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Event; + +import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.viz.core.IDisplayPane; +import com.raytheon.uf.viz.core.IDisplayPaneContainer; +import com.raytheon.uf.viz.core.IExtent; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.VizApp; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; +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.ResourceList; +import com.raytheon.uf.viz.core.rsc.IInputHandler.InputPriority; +import com.raytheon.uf.viz.core.rsc.capabilities.BlendableCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.BlendedCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.EditableCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.IMiddleClickCapableResource; +import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; +import com.raytheon.viz.ui.cmenu.ChooseColorAction; +import com.raytheon.viz.ui.cmenu.ColorEditDialogAction; +import com.raytheon.viz.ui.input.EditableManager; + +/** + * This handler is responsible for picking up mouse clicks and key press events on resources in + * the legend + * + *
    + * 
    + * SOFTWARE HISTORY
    + * 
    + * Date         Ticket#    Engineer    Description
    + * ------------ ---------- ----------- --------------------------
    + * 02/03/2012              S. Gurung     Initial creation
    + * 
    + * 
    + * + * @author sgurung + * @version 1.0 + */ + +public class NCLegendHandler extends AbstractNCLegendInputHandler { + + /** + * @param resource + */ + protected NCLegendHandler(NCLegendResource resource) { + super(resource); + } + + private ResourcePair mouseDownRsc = null; + + private int currentRscIndex = 0; + + private boolean isShiftDown = false; + + @Override + public boolean handleMouseDown(int x, int y, int mouseButton) { + + if (mouseButton ==1) { + //IDisplayPaneContainer editor = getResourceContainer(); + //if (prefManager.handleClick(HIDE_RESOURCE_PREF, mouseButton)) { + NCMapEditor editor = NmapUiUtils.getActiveNatlCntrsEditor(); //AbstractEditor + if( editor != null && editor instanceof NCMapEditor ) { + IDisplayPane activePane = editor.getActiveDisplayPane(); + IRenderableDisplay display = editor.getActiveDisplayPane() + .getRenderableDisplay(); + mouseDownRsc = resource.checkLabelSpace(display.getDescriptor(), + activePane.getTarget(), x, y); + } + } + return false; + } + + @Override + public boolean handleMouseUp(int x, int y, int mouseButton) { + if (mouseButton ==1) { + NCMapEditor editor = NmapUiUtils.getActiveNatlCntrsEditor(); //AbstractEditor + + if( editor != null && editor instanceof NCMapEditor ) { + IDisplayPane activePane = editor.getActiveDisplayPane(); + IRenderableDisplay display = editor.getActiveDisplayPane() + .getRenderableDisplay(); + ResourcePair rsc = resource.checkLabelSpace(display.getDescriptor(), + activePane.getTarget(), x, y); + + if (rsc != null && rsc == mouseDownRsc) { + mouseDownRsc = null; + toggleVisibility(rsc); + editor.refresh(); + + return true; + } + } + } + return false; + + } + + @Override + public boolean handleDoubleClick(int x, int y, int mouseButton) { + return false; + } + @Override + public boolean handleMouseDownMove(int x, int y, int mouseButton) { + return (mouseDownRsc != null); + } + public boolean handleMouseHover(int x, int y) { + return false; + } + public boolean handleMouseMove(int x, int y) { + return false; + } + public boolean handleMouseWheel(Event event, int x, int y) { + return false; + } + public boolean handleMouseExit(Event event) { + return false; + } + public boolean handleMouseEnter(Event event) { + return false; + } + + @Override + public boolean handleKeyUp(int keyCode) { + + if ( keyCode == SWT.SHIFT ) { + isShiftDown = false; + } + + NCMapEditor editor = NmapUiUtils.getActiveNatlCntrsEditor(); //AbstractEditor + + if ( (keyCode==SWT.ARROW_UP) || (keyCode==SWT.ARROW_DOWN) ) { + + if ( isShiftDown ) { + /* + * Make all resources visible + */ + ResourceList rl = editor.getActiveDisplayPane().getDescriptor().getResourceList(); + for (int i=0; i < rl.size(); i++ ) { + rl.get(i).getProperties().setVisible(true); + } + + } + else { + ResourceList rl = editor.getActiveDisplayPane().getDescriptor().getResourceList(); + + int incr = 1; + if (keyCode==SWT.ARROW_DOWN) incr = -1; + + /* + * look for next non map/system layer resource + */ + int search = currentRscIndex; + do { + search += incr; + if ( search < 0 ) search = rl.size() - 1; + if ( search >= rl.size() ) search = 0; + if ( ! rl.get(search).getProperties().isMapLayer() ) { + currentRscIndex = search; + break; + } + } while ( search != currentRscIndex ); + + /* + * turn off all non map/system layer resources + */ + for (int i=0; i < rl.size(); i++ ) { + if ( rl.get(i).getProperties().isMapLayer() || rl.get(i).getProperties().isSystemResource()) + rl.get(i).getProperties().setVisible(true); + else + rl.get(i).getProperties().setVisible(false); + } + + // re-enable selected resource. + rl.get(currentRscIndex).getProperties().setVisible(true); + + } + editor.refresh(); + + } + isShiftDown = false; + return false; + } + + @Override + public boolean handleKeyDown(int keyCode) { + + if ( keyCode == SWT.SHIFT ) { + isShiftDown = true; + return false; + } + return false; + } + + private void toggleVisibility(ResourcePair rp) { + AbstractVizResource rsc = rp.getResource(); + if (rsc != null) { + if (rsc.hasCapability(BlendedCapability.class)) { + ResourcePair parentRsc = rsc.getCapability( + BlendedCapability.class).getBlendableResource(); + ResourceList children = parentRsc.getResource() + .getCapability(BlendableCapability.class) + .getResourceList(); + if (parentRsc.getProperties().isVisible() == false) { + parentRsc.getProperties().setVisible(true); + for (ResourcePair child : children) { + child.getProperties().setVisible(true); + } + } else { + // topmost resource is visible, toggle us and other rsc + if (rp.getProperties().isVisible() == false) { + rp.getProperties().setVisible(true); + parentRsc + .getResource() + .getCapability(BlendableCapability.class) + .setAlphaStep(BlendableCapability.BLEND_MAX / 2); + } else { + parentRsc.getResource() + .getCapability(BlendableCapability.class) + .toggle(rp); + } + } + return; + } + } + rp.getProperties().setVisible(!rp.getProperties().isVisible()); + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/NCLegendResource.java b/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/NCLegendResource.java index 70b06cc47f..f483007d40 100644 --- a/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/NCLegendResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.ui.display/src/gov/noaa/nws/ncep/viz/ui/display/NCLegendResource.java @@ -23,14 +23,13 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuManager; import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.widgets.Event; -import com.raytheon.uf.viz.core.IDisplayPane; import com.raytheon.uf.viz.core.IDisplayPaneContainer; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.drawables.IDescriptor; -import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.legend.ILegendDecorator; @@ -39,9 +38,13 @@ import com.raytheon.uf.viz.core.rsc.GenericResourceData; import com.raytheon.uf.viz.core.rsc.IInputHandler; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.ResourceList; -import com.raytheon.uf.viz.core.rsc.capabilities.BlendableCapability; -import com.raytheon.uf.viz.core.rsc.capabilities.BlendedCapability; +import com.raytheon.uf.viz.core.rsc.IInputHandler.InputPriority; import com.raytheon.uf.viz.core.rsc.legend.AbstractLegendResource; +import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; +import com.raytheon.viz.ui.cmenu.EnableDisableAction; +import com.raytheon.viz.ui.cmenu.MoveDownAction; +import com.raytheon.viz.ui.cmenu.MoveUpAction; +import com.raytheon.viz.ui.cmenu.RemoveResourceAction; /** * Legend decorator for Natl Cntrs @@ -53,34 +56,20 @@ import com.raytheon.uf.viz.core.rsc.legend.AbstractLegendResource; * 04/01/2010 #259 Greg Hull Initial Creation * 07/13/2001 #446 Q. Zhou Added implements IInputHandler * Added mouse handlers, initInternal, toggleVisibility. See D2DLegendResource + * 02/06/2011 S. Gurung Separated/moved input handler code to class NCLegendHandler + * 02/29/2011 651 Archana Added the overridden method fillContextMenu() * * * @author ghull * @version 1.0 */ -/** - * TODO Add Description - * - *
    - * 
    - * SOFTWARE HISTORY
    - * 
    - * Date         Ticket#    Engineer    Description
    - * ------------ ---------- ----------- --------------------------
    - * Dec 17, 2010            mschenke     Initial creation
    - * 
    - * 
    - * - * @author mschenke - * @version 1.0 - */ public class NCLegendResource extends - AbstractLegendResource implements IInputHandler, ILegendDecorator { + AbstractLegendResource implements ILegendDecorator { - ResourcePair mouseDownRsc = null; - - /** + private IInputHandler legendHandler = new NCLegendHandler(this); + + /** * @param resourceData * @param loadProperties */ @@ -184,8 +173,8 @@ public class NCLegendResource extends IDisplayPaneContainer rc = getResourceContainer(); if (rc == null) return; - - rc.registerMouseHandler(this); + + rc.registerMouseHandler(legendHandler,InputPriority.SYSTEM_RESOURCE); } @Override @@ -196,113 +185,68 @@ public class NCLegendResource extends if (rc == null) return; - rc.unregisterMouseHandler(this); + rc.unregisterMouseHandler(legendHandler); } - - @Override - public boolean handleMouseDown(int x, int y, int mouseButton) { - - if (mouseButton ==1) { - //IDisplayPaneContainer editor = getResourceContainer(); - //if (prefManager.handleClick(HIDE_RESOURCE_PREF, mouseButton)) { - NCMapEditor editor = NmapUiUtils.getActiveNatlCntrsEditor(); //AbstractEditor - if( editor != null && editor instanceof NCMapEditor ) { - IDisplayPane activePane = editor.getActiveDisplayPane(); - IRenderableDisplay display = editor.getActiveDisplayPane() - .getRenderableDisplay(); - mouseDownRsc = checkLabelSpace(display.getDescriptor(), - activePane.getTarget(), x, y); - } - } - return false; - } - @Override - public boolean handleMouseUp(int x, int y, int mouseButton) { - if (mouseButton ==1) { - NCMapEditor editor = NmapUiUtils.getActiveNatlCntrsEditor(); //AbstractEditor + @Override + protected ResourcePair checkLabelSpace(IDescriptor descriptor, + IGraphicsTarget target, double x, double y) { + // NOTE: Overridden so legend handlers can call + return super.checkLabelSpace(descriptor, target, x, y); + } + + @Override + protected void fillContextMenu(IMenuManager menuManager, + ResourcePair selectedResource) { + + MoveUpAction upAction = new MoveUpAction(); + MoveDownAction downAction = new MoveDownAction(); + EnableDisableAction enableDisableAction = new EnableDisableAction(); + RemoveResourceAction rrAction = new RemoveResourceAction(); + NCMapEditor container = NmapUiUtils.getActiveNatlCntrsEditor(); + + upAction.setContainer(container); + upAction.setSelectedRsc(selectedResource); + downAction.setContainer(container); + downAction.setSelectedRsc(selectedResource); + enableDisableAction.setContainer(container); + enableDisableAction.setSelectedRsc(selectedResource); + rrAction.setContainer(container); + rrAction.setSelectedRsc(selectedResource); + + AbstractVizResource thisResource = selectedResource.getResource(); + //Cyclic dependancy work-around.. + Object editRscAttrsAction = null; + Method[] arrayOfMethods = thisResource.getClass().getMethods(); + for ( Method m : arrayOfMethods ){ + if ( m.getName().compareTo("resourceAttrsModified") == 0){ + try { + editRscAttrsAction = Class.forName("gov.noaa.nws.ncep.viz.resources.attributes.EditResourceAttrsAction").newInstance(); + ( ( AbstractRightClickAction ) editRscAttrsAction ).setContainer(container); + ( ( AbstractRightClickAction ) editRscAttrsAction ).setSelectedRsc(selectedResource); + break; + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } - if( editor != null && editor instanceof NCMapEditor ) { - IDisplayPane activePane = editor.getActiveDisplayPane(); - IRenderableDisplay display = editor.getActiveDisplayPane() - .getRenderableDisplay(); - ResourcePair rsc = checkLabelSpace(display.getDescriptor(), - activePane.getTarget(), x, y); - - if (rsc != null && rsc == mouseDownRsc) { - mouseDownRsc = null; - toggleVisibility(rsc); - editor.refresh(); - - return true; - } - } } - return false; - } + + if ( editRscAttrsAction != null ) + menuManager.add( ( IAction )editRscAttrsAction); - @Override - public boolean handleDoubleClick(int x, int y, int mouseButton) { - return false; - } - @Override - public boolean handleMouseDownMove(int x, int y, int mouseButton) { - return (mouseDownRsc != null); - } - public boolean handleMouseHover(int x, int y) { - return false; - } - public boolean handleMouseMove(int x, int y) { - return false; - } - public boolean handleMouseWheel(Event event, int x, int y) { - return false; - } - public boolean handleMouseExit(Event event) { - return false; - } - public boolean handleMouseEnter(Event event) { - return false; - } - public boolean handleKeyDown(int keyCode) { - return false; - } - public boolean handleKeyUp(int keyCode) { - return false; - } - - private void toggleVisibility(ResourcePair rp) { - AbstractVizResource rsc = rp.getResource(); - if (rsc != null) { - if (rsc.hasCapability(BlendedCapability.class)) { - ResourcePair parentRsc = rsc.getCapability( - BlendedCapability.class).getBlendableResource(); - ResourceList children = parentRsc.getResource() - .getCapability(BlendableCapability.class) - .getResourceList(); - if (parentRsc.getProperties().isVisible() == false) { - parentRsc.getProperties().setVisible(true); - for (ResourcePair child : children) { - child.getProperties().setVisible(true); - } - } else { - // topmost resource is visible, toggle us and other rsc - if (rp.getProperties().isVisible() == false) { - rp.getProperties().setVisible(true); - parentRsc - .getResource() - .getCapability(BlendableCapability.class) - .setAlphaStep(BlendableCapability.BLEND_MAX / 2); - } else { - parentRsc.getResource() - .getCapability(BlendableCapability.class) - .toggle(rp); - } - } - return; - } - } - rp.getProperties().setVisible(!rp.getProperties().isVisible()); - } + menuManager.add(upAction); + menuManager.add(downAction); + menuManager.add(enableDisableAction); + menuManager.add(rrAction); + + } + } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.locator/gov.noaa.nws.ncep.viz.ui.locator.ecl b/ncep/gov.noaa.nws.ncep.viz.ui.locator/gov.noaa.nws.ncep.viz.ui.locator.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.locator/res/locator_tbl.xml b/ncep/gov.noaa.nws.ncep.viz.ui.locator/res/locator_tbl.xml deleted file mode 100644 index 10da9c1923..0000000000 --- a/ncep/gov.noaa.nws.ncep.viz.ui.locator/res/locator_tbl.xml +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - - - LATLON - - degrees - false - - - - - - ADJCSTL - bounds.adjcstlbnds - - NAME - ID - - name - true - - - - - AIRMETCSTL - bounds.airmetcstlbnds - - NAME - ID - - name - true - - - - - AKPSA - bounds.akpsabnds - - NAME - NAT_CODE - - name - true - - - - - COUNTIES - bounds.countybnds - - NAME - FIPS - - name - true - - - - - - CWA_NAME - bounds.cwabnds - - WFO - WFO - - name - false - - - - - - ELEVATION_FT - bounds.elev_nam1000 - - NAME - NAME - - name - false - - - - - FIREWXAOR - bounds.firewxaor - - NAME - STATE_ZONE - - name - true - - - - - FIRE - bounds.firebnds - - WFO - FIPS - - name - true - - - - - G2T_ATL - bounds.g2t_atl_bnd - - NAME - NAME - - name - false - - - - - G2T_NWC - bounds.g2t_nwc - - AREA - NAME - - name - true - - - - - G2T_PAC - bounds.g2t_pac_bnd - - NAME - NAME - - name - false - - - - - G2T_TPC - bounds.g2t_tpc_bnd - - AREA - NAME - - name - true - - - - - GREATLAKES - bounds.greatlakesbnds - - AREA - ID - - name - true - - - - - LAKES - bounds.lakesbnds - - AREA - ID - - name - true - - - - - LOCOWO - bounds.locowobnds - - NAME - ID - - name - true - - - - - MWO - bounds.mwobnds - - AREA - AREA - - name - false - - - - - MZB - bounds.mzbbnds - - AREA - FIPS - - name - true - - - - - MZCNTY - bounds.mzcntybnds - - AREA - WFO - - name - true - - - - - NPSA - bounds.npsabnds - - AREA - NAT_CODE - - name - true - - - - - PFZ - bounds.pfzbnds - - AREA - FIPS - - name - true - - - - - RFC_REGIONS - bounds.rfcbnds - - RFC_NAME - RFC - - name - true - - - - - SSA - bounds.ssa_bnds - - AREA - AREA - - name - false - - - - - STATE - bounds.statebnds - - AREA - FIPS - - name - true - - - - - TPC - bounds.tpcbounds - - AREA - ID - - name - true - - - - - TZB - bounds.tzbnds - - AREA - TIMEZONE - - name - true - - - - - TZB - bounds.tzbnds - - AREA - STATE - - name - true - - - - - UA - bounds.ua_bnd - - AREA - AREA - - name - false - - - - - US_AK - bounds.us_ak - - AREA - ID - - name - true - - - - - VAACAR - bounds.vaacarbnds - - AREA - AREA - - name - false - - - - - - CITIES - stns.cities - - NAME - STATION_NUMBER - true - ST - - 5 - SM - 16 point - name - false - - - - - SFSTATION - - name - false - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.locator/res/locator_tbl.xsd b/ncep/gov.noaa.nws.ncep.viz.ui.locator/res/locator_tbl.xsd deleted file mode 100644 index f99650b8bf..0000000000 --- a/ncep/gov.noaa.nws.ncep.viz.ui.locator/res/locator_tbl.xsd +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/gov.noaa.nws.ncep.viz.ui.perspectives.ecl b/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/gov.noaa.nws.ncep.viz.ui.perspectives.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/plugin.xml b/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/plugin.xml index ff9530e4ae..b9cb89b1c8 100644 --- a/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/plugin.xml +++ b/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/plugin.xml @@ -156,13 +156,14 @@ - - - + --> + * * @author @@ -170,11 +173,11 @@ public class NCPerspectiveManager extends AbstractCAVEPerspectiveManager { for( RbdBundle rbd: rbdsToLoad ) { NCMapEditor editor = NmapUiUtils.createNatlCntrsEditor( rbd.getRbdName() ); - rbd.setNcEditor( editor ); + // rbd.setNcEditor( editor ); ResourceBndlLoader rbdLoader = new ResourceBndlLoader( "Loading RBD: "+rbd.getRbdName() ); - rbdLoader.addRBD( rbd ); + rbdLoader.addRBD( rbd, editor ); VizApp.runAsync( rbdLoader ); } @@ -374,7 +377,7 @@ public class NCPerspectiveManager extends AbstractCAVEPerspectiveManager { @Override public boolean handleKeyDown(int keyCode) { - if ( keyCode == SWT.SHIFT ) { + /*if ( keyCode == SWT.SHIFT ) { isShiftDown = true; return false; } @@ -382,9 +385,8 @@ public class NCPerspectiveManager extends AbstractCAVEPerspectiveManager { if ( (keyCode==SWT.ARROW_UP) || (keyCode==SWT.ARROW_DOWN) ) { if ( isShiftDown ) { - /* - * Make all resources visible - */ + // Make all resources visible + ResourceList rl = editor.getActiveDisplayPane().getDescriptor().getResourceList(); for (int i=0; i < rl.size(); i++ ) { rl.get(i).getProperties().setVisible(true); @@ -398,9 +400,8 @@ public class NCPerspectiveManager extends AbstractCAVEPerspectiveManager { int incr = 1; if (keyCode==SWT.ARROW_DOWN) incr = -1; - /* - * look for next non map layer resource - */ + // look for next non map layer resource + int search = currentRscIndex; do { search += incr; @@ -412,9 +413,8 @@ public class NCPerspectiveManager extends AbstractCAVEPerspectiveManager { } } while ( search != currentRscIndex ); - /* - * turn off all non map layer resources - */ + // turn off all non map layer resources + for (int i=0; i < rl.size(); i++ ) { if ( rl.get(i).getProperties().isMapLayer() ) rl.get(i).getProperties().setVisible(true); @@ -428,16 +428,15 @@ public class NCPerspectiveManager extends AbstractCAVEPerspectiveManager { } editor.refresh(); - } - + } */ return false; } @Override public boolean handleKeyUp(int keyCode) { - if ( keyCode == SWT.SHIFT ) { + /*if ( keyCode == SWT.SHIFT ) { isShiftDown = false; - } + }*/ return false; } diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/OverlayMenu.java b/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/OverlayMenu.java index 661080dd06..9eaf4992ed 100644 --- a/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/OverlayMenu.java +++ b/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/OverlayMenu.java @@ -1,37 +1,23 @@ package gov.noaa.nws.ncep.viz.ui.perspectives.menus; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - import gov.noaa.nws.ncep.viz.common.ui.NmapCommon; import gov.noaa.nws.ncep.viz.resources.manager.ResourceDefnsMngr; -import gov.noaa.nws.ncep.viz.resources.manager.ResourceFactory; import gov.noaa.nws.ncep.viz.resources.manager.ResourceName; -import gov.noaa.nws.ncep.viz.resources.manager.ResourceFactory.ResourceSelection; -import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; -import gov.noaa.nws.ncep.viz.ui.display.NmapUiUtils; -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.action.ContributionItem; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.actions.CompoundContributionItem; +import org.eclipse.ui.menus.CommandContributionItem; +import org.eclipse.ui.menus.CommandContributionItemParameter; -import com.raytheon.uf.viz.core.IDisplayPane; -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.AbstractResourceData; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.ResourceList; -import com.raytheon.uf.viz.core.rsc.ResourceProperties; -import com.raytheon.viz.ui.UiPlugin; /** * Create the Menu Items for the Overlays menu @@ -42,6 +28,11 @@ import com.raytheon.viz.ui.UiPlugin; * ------------ ---------- ----------- -------------------------- * 4/15/11 G. Hull created. * 12/06/11 B. Hebbard sort menu entries alphabetically + * 03/29/12 B. Hebbard refactor courtesy of Matt Nash (RTS) + * to extend CompoundContributionItem + * (instead of ContributionItem); fixes + * menu items disappearing (after first + * menu use) in OB12.4 * * * @@ -49,106 +40,49 @@ import com.raytheon.viz.ui.UiPlugin; * @version 1 */ -public class OverlayMenu extends ContributionItem { - - @Override - public void fill(Menu menu, int index) { +public class OverlayMenu extends CompoundContributionItem { - try { - List overlayRscTypes = ResourceDefnsMngr.getInstance().getResourceTypesForCategory( - ResourceName.OverlayRscCategory, "", false ); - Collections.sort(overlayRscTypes, new Comparator() { // alphabetize menu... - public int compare (String s1, String s2) { // ...case insensitive - return s1.compareToIgnoreCase(s2); - } - }); - - int ovlyIndx=0; - for( String overlayRsc : overlayRscTypes ) { - if( overlayRsc.equals( NmapCommon.getBaseOverlay() ) ) { - continue; - } - - MenuItem ovrlyMenuItem = new MenuItem( menu, SWT.PUSH, ovlyIndx++ ); - ovrlyMenuItem.setText( overlayRsc ); - ovrlyMenuItem.setData( overlayRsc ); + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.actions.CompoundContributionItem#getContributionItems() + */ + @Override + protected IContributionItem[] getContributionItems() { + List items = new ArrayList(); + try { + List overlayRscTypes = ResourceDefnsMngr.getInstance() + .getResourceTypesForCategory( + ResourceName.OverlayRscCategory, "", false); + Collections.sort(overlayRscTypes, new Comparator() { // alphabetize + // menu... + public int compare(String s1, String s2) { // ...case + // insensitive + return s1.compareToIgnoreCase(s2); + } + }); - ovrlyMenuItem.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - loadOverlay( ((MenuItem)e.widget).getText() ); - } - }); - } - } catch (VizException e) { - return; - } - } - - private void loadOverlay( final String overlayName ) { - final NCMapEditor editor = NmapUiUtils.getActiveNatlCntrsEditor(); - if( editor == null ) - return; - - System.out.println("Loading overlay from menu "+ overlayName ); - - Job j = new Job("Loading Map Overlays...") { - @SuppressWarnings("unchecked") - @Override - protected IStatus run(IProgressMonitor monitor) { - long t0 = System.currentTimeMillis(); - - if (overlayName == null) { - return new Status(IStatus.ERROR, UiPlugin.PLUGIN_ID, - "overlayName was null"); + for (String overlayRsc : overlayRscTypes) { + if (overlayRsc.equals(NmapCommon.getBaseOverlay())) { + continue; } - try { - IDisplayPane displayPane = editor.getActiveDisplayPane(); - IDescriptor existingMD = displayPane.getDescriptor(); - - // get the name of the default attr set and create the overlay resource - //String qualRscName = NmapCommon.OverlaysRscDir + bundleName; - ResourceName fullRscName = new ResourceName( - ResourceName.OverlayRscCategory, overlayName, null ); - - ResourceSelection rbt = ResourceFactory.createResource( fullRscName ); - ResourcePair rscPair = rbt.getResourcePair(); - ResourceProperties props = rscPair.getProperties(); - AbstractVizResource ovrlyRsc = rscPair.getResource(); - - IDisplayPane[] seldPanes = ((NCMapEditor)editor).getSelectedPanes(); - - if( seldPanes.length == 0 ) { - System.out.println("There are no Selected Panes to load to?"); - } - - // this assumes a map bundle has only a single display - for (IDisplayPane pane : seldPanes ) { - existingMD = pane.getRenderableDisplay().getDescriptor(); - - if(ovrlyRsc == null) { - AbstractResourceData resourceData = rscPair.getResourceData(); - if(resourceData != null) - ovrlyRsc = resourceData.construct( - rscPair.getLoadProperties(), existingMD); - } - ResourceList resourceList = existingMD.getResourceList(); - resourceList.add(ovrlyRsc, props); - ovrlyRsc.setDescriptor(existingMD); - ovrlyRsc.init( pane.getTarget() ); - } - - editor.refresh(); - } catch (VizException e) { - return new Status(IStatus.ERROR, UiPlugin.PLUGIN_ID, - "Error loading bundle", e); - } - long t2 = System.currentTimeMillis(); - System.out.println("Total bundle retrieval: " + (t2 - t0)); - return Status.OK_STATUS; + Map params = new HashMap(); + params.put("overlayName", overlayRsc); + CommandContributionItemParameter param = new CommandContributionItemParameter( + PlatformUI.getWorkbench(), null, + "gov.noaa.nws.ncep.viz.ui.actions.loadOverlay", params, + null, null, null, overlayRsc, null, null, + CommandContributionItem.STYLE_PUSH, null, true); + CommandContributionItem ovrlyMenuItem = new CommandContributionItem( + param); + items.add(ovrlyMenuItem); } - }; - - j.schedule(); - } + return items.toArray(new IContributionItem[0]); + } catch (VizException e) { + return new IContributionItem[0]; + } + } } + diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/PredefinedAreaMenu.java b/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/PredefinedAreaMenu.java index 56d672735e..d95a025486 100644 --- a/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/PredefinedAreaMenu.java +++ b/ncep/gov.noaa.nws.ncep.viz.ui.perspectives/src/gov/noaa/nws/ncep/viz/ui/perspectives/menus/PredefinedAreaMenu.java @@ -1,14 +1,17 @@ package gov.noaa.nws.ncep.viz.ui.perspectives.menus; import gov.noaa.nws.ncep.viz.resources.manager.PredefinedAreasMngr; -import gov.noaa.nws.ncep.viz.tools.predefinedArea.PredefinedAreaAction; -import org.eclipse.jface.action.ContributionItem; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.actions.CompoundContributionItem; +import org.eclipse.ui.menus.CommandContributionItem; +import org.eclipse.ui.menus.CommandContributionItemParameter; /** * Create the Menu Items for the Predefined Area menu @@ -19,32 +22,45 @@ import org.eclipse.swt.widgets.MenuItem; * ------------ ---------- ----------- -------------------------- * 4/15/11 G. Hull created. * 07/28/11 450 G. Hull Use PredefinedAreasMngr + * 03/29/12 B. Hebbard refactor courtesy of Matt Nash (RTS) + * to extend CompoundContributionItem + * (instead of ContributionItem); fixes + * menu items disappearing (after first + * menu use) in OB12.4 * * * * @author ghull * @version 1 */ -public class PredefinedAreaMenu extends ContributionItem { - - @Override - public void fill(Menu menu, int index ) { - - String predefinedAreas[] = PredefinedAreasMngr.getAvailPredefinedAreas(); +public class PredefinedAreaMenu extends CompoundContributionItem { + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.actions.CompoundContributionItem#getContributionItems() + */ + @Override + protected IContributionItem[] getContributionItems() { + String predefinedAreas[] = PredefinedAreasMngr + .getAvailPredefinedAreas(); - int indx=0; - for( String areaName : predefinedAreas ) { - MenuItem areaMenuItem = new MenuItem( menu, SWT.PUSH, indx++ ); - areaMenuItem.setText( areaName ); -// areaMenuItem.setData( areaName ); + List items = new ArrayList(); + for (String areaName : predefinedAreas) { + Map parms = new HashMap(); + parms.put("areaName", areaName); + CommandContributionItem item = new CommandContributionItem( + new CommandContributionItemParameter( + PlatformUI.getWorkbench(), + null, + "gov.noaa.nws.ncep.viz.ui.actions.loadPredefinedArea", + parms, null, null, null, areaName, null, null, + CommandContributionItem.STYLE_PUSH, null, true)); - areaMenuItem.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - PredefinedAreaAction.setGeographicArea( ((MenuItem)e.widget).getText() ); - } - }); - } - } + items.add(item); + } + return items.toArray(new IContributionItem[0]); + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.seek/gov.noaa.nws.ncep.viz.ui.seek.ecl b/ncep/gov.noaa.nws.ncep.viz.ui.seek/gov.noaa.nws.ncep.viz.ui.seek.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsAction.java b/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsAction.java index 5d5be77c9b..8641fcb225 100644 --- a/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsAction.java +++ b/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsAction.java @@ -31,6 +31,7 @@ import com.vividsolutions.jts.geom.Coordinate; * to the seekResourceData object * Updated the execute() method to toggle * the display of the seek layer. + * Jan 2012 TTR 326 J. Zeng handled NUllPointerException * * * @@ -61,7 +62,9 @@ public class SeekResultsAction extends AbstractNCModalMapTool { if ( mouseHandler == null ) { mouseHandler = createSeekMouseHandler(); } - mapEditor.registerMouseHandler( this.mouseHandler ); + if (mapEditor != null) { + mapEditor.registerMouseHandler( this.mouseHandler ); + } initializeTheSeekLayer(); @@ -88,7 +91,6 @@ public class SeekResultsAction extends AbstractNCModalMapTool { mapEditor.unregisterMouseHandler( this.mouseHandler ); mouseHandler = null; } - removeSeekLayer(); } @@ -113,24 +115,23 @@ public class SeekResultsAction extends AbstractNCModalMapTool { if (button != 1) { return false; } - - Coordinate ll = mapEditor.translateClick(x, y); - if ( ll == null ) return false; + if (mapEditor != null ) { + Coordinate ll = mapEditor.translateClick(x, y); + if ( ll == null ) return false; - if (id != null && id.isDlgOpen()/*.isOpen()*/ && ll != null) {//archana - changed isOpen() to isDlgOpen() - id.setPosition(ll); - firstMouseX = x; - firstMouseY = y; - endpts = id.getEndPoints(); - if (endpts[0] != null || endpts[1] != null) { - //seekDrawingLayer.drawClickPtLine(endpts[0], endpts[1]); - (( SeekResourceData) seekDrawingLayer.getResourceData()).setFirstPt(endpts[0]); - (( SeekResourceData) seekDrawingLayer.getResourceData()).setLastPt(endpts[1]); - } + if (id != null && id.isDlgOpen()/*.isOpen()*/ && ll != null) {//archana - changed isOpen() to isDlgOpen() + id.setPosition(ll); + firstMouseX = x; + firstMouseY = y; + endpts = id.getEndPoints(); + if (endpts[0] != null || endpts[1] != null) { + //seekDrawingLayer.drawClickPtLine(endpts[0], endpts[1]); + (( SeekResourceData) seekDrawingLayer.getResourceData()).setFirstPt(endpts[0]); + (( SeekResourceData) seekDrawingLayer.getResourceData()).setLastPt(endpts[1]); + } + } + mapEditor.refresh(); } - - mapEditor.refresh(); - return true; } @@ -145,36 +146,36 @@ public class SeekResultsAction extends AbstractNCModalMapTool { if (button != 1) { return false; } - - Coordinate c1 = mapEditor.translateClick(firstMouseX, firstMouseY); - Coordinate c2 = mapEditor.translateClick(x, y); - if (id != null && id.isDlgOpen() && c1 != null && c2 != null) { - // seekDrawingLayer.drawLine(c1, c2); - (( SeekResourceData) seekDrawingLayer.getResourceData()).setPoint1(c1); - (( SeekResourceData) seekDrawingLayer.getResourceData()).setPoint2(c2); - // Calculate distance and direction - GeodeticCalculator gc = new GeodeticCalculator( + if (mapEditor != null){ + Coordinate c1 = mapEditor.translateClick(firstMouseX, firstMouseY); + Coordinate c2 = mapEditor.translateClick(x, y); + if (id != null && id.isDlgOpen() && c1 != null && c2 != null) { + // seekDrawingLayer.drawLine(c1, c2); + (( SeekResourceData) seekDrawingLayer.getResourceData()).setPoint1(c1); + (( SeekResourceData) seekDrawingLayer.getResourceData()).setPoint2(c2); + // Calculate distance and direction + GeodeticCalculator gc = new GeodeticCalculator( DefaultEllipsoid.WGS84); - gc.setStartingGeographicPoint(c2.x, c2.y); - gc.setDestinationGeographicPoint(c1.x, c1.y); + gc.setStartingGeographicPoint(c2.x, c2.y); + gc.setDestinationGeographicPoint(c1.x, c1.y); - double azimuth = gc.getAzimuth(); - if (azimuth < 0) azimuth += 360.0; - double distanceInMeter = gc.getOrthodromicDistance(); + double azimuth = gc.getAzimuth(); + if (azimuth < 0) azimuth += 360.0; + double distanceInMeter = gc.getOrthodromicDistance(); - Coordinate c = mapEditor.translateClick(firstMouseX - 15, firstMouseY - 15); - String str = id.getFormatDistance(distanceInMeter, azimuth); + Coordinate c = mapEditor.translateClick(firstMouseX - 15, firstMouseY - 15); + String str = id.getFormatDistance(distanceInMeter, azimuth); -// seekDrawingLayer.clearStrings(); -// if (str != null) seekDrawingLayer.drawString(c, str); - ((SeekResourceData)seekDrawingLayer.getResourceData()).clearStrings(); - if (str != null) { - (( SeekResourceData) seekDrawingLayer.getResourceData()).drawString(c, str); - } - mapEditor.refresh(); - return true; +// seekDrawingLayer.clearStrings(); +// if (str != null) seekDrawingLayer.drawString(c, str); + ((SeekResourceData)seekDrawingLayer.getResourceData()).clearStrings(); + if (str != null) { + (( SeekResourceData) seekDrawingLayer.getResourceData()).drawString(c, str); + } + mapEditor.refresh(); + return true; + } } - return false; } @@ -189,16 +190,18 @@ public class SeekResultsAction extends AbstractNCModalMapTool { if (button != 1) { return false; } - Coordinate ll = mapEditor.translateClick(x, y); - if ( ll == null ) return false; + if (mapEditor != null){ + Coordinate ll = mapEditor.translateClick(x, y); + if ( ll == null ) return false; +// seekDrawingLayer.clearStrings(); + (( SeekResourceData) seekDrawingLayer.getResourceData()).clearStrings(); +// seekDrawingLayer.clearLine(); + (( SeekResourceData) seekDrawingLayer.getResourceData()).clearLine(); + mapEditor.refresh(); + return true; + } + return false; -// seekDrawingLayer.clearStrings(); - (( SeekResourceData) seekDrawingLayer.getResourceData()).clearStrings(); -// seekDrawingLayer.clearLine(); - (( SeekResourceData) seekDrawingLayer.getResourceData()).clearLine(); - mapEditor.refresh(); - return true; - } } @@ -219,11 +222,10 @@ public class SeekResultsAction extends AbstractNCModalMapTool { // } protected void initializeTheSeekLayer(){ - - try { - - if ( seekResourceData == null ){ - seekResourceData = new SeekResourceData(); + if (mapEditor != null){ + try { + if ( seekResourceData == null ){ + seekResourceData = new SeekResourceData(); } if ( seekDrawingLayer == null ){ @@ -234,11 +236,13 @@ public class SeekResultsAction extends AbstractNCModalMapTool { addedSeekLayerToResourceList = mapEditor.getDescriptor().getResourceList().add( seekDrawingLayer); } - } catch (VizException e) { - e.printStackTrace(); + } catch (VizException e) { + e.printStackTrace(); + } catch (NullPointerException e){ + e.printStackTrace(); + } + mapEditor.refresh(); } - mapEditor.refresh(); - } protected /*private*/ void removeSeekLayer() { @@ -246,14 +250,16 @@ public class SeekResultsAction extends AbstractNCModalMapTool { if(seekDrawingLayer != null){ /*save off the resource data for the next time the handler is activated*/ - // seekResourceData = ( SeekResourceData) seekDrawingLayer.getResourceData(); - mapEditor.getDescriptor().getResourceList().removeRsc(seekDrawingLayer); - addedSeekLayerToResourceList = false; + // seekResourceData = ( SeekResourceData) seekDrawingLayer.getResourceData(); + if (mapEditor != null ){ + mapEditor.getDescriptor().getResourceList().removeRsc(seekDrawingLayer); + addedSeekLayerToResourceList = false; // seekDrawingLayer.disposeInternal(); /*Added by archana*/ - seekDrawingLayer = null; + seekDrawingLayer = null; + mapEditor.refresh(); + } } // - mapEditor.refresh(); } protected SeekMouseHandler createSeekMouseHandler(){ diff --git a/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsDialog.java b/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsDialog.java index ae3690709f..4130ea193c 100644 --- a/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.ui.seek/src/gov/noaa/nws/ncep/viz/ui/seek/SeekResultsDialog.java @@ -1,22 +1,15 @@ package gov.noaa.nws.ncep.viz.ui.seek; import gov.noaa.nws.ncep.viz.common.LocatorUtil; -import gov.noaa.nws.ncep.viz.localization.NcPathManager; -import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; import gov.noaa.nws.ncep.viz.tools.cursor.NCCursors; import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; -//import gov.noaa.nws.ncep.viz.ui.locator.resource.LocatorTableReader; -//import gov.noaa.nws.ncep.viz.ui.locator.util.LocatorUtil; -//import gov.noaa.nws.ncep.viz.ui.locator.resource.PointDataResource; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; -import java.io.IOException; import java.io.Writer; import java.text.DecimalFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; import java.util.TimeZone; @@ -49,7 +42,6 @@ import org.eclipse.swt.widgets.Text; import org.geotools.referencing.GeodeticCalculator; import org.geotools.referencing.datum.DefaultEllipsoid; -import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.rsc.ResourceList; @@ -79,6 +71,7 @@ import com.vividsolutions.jts.geom.Coordinate; * button to match legacy. * March 2011 351 Archana Changed the path to save the CPF file - it is now under the user's home directory. * Jan 2012 #561 G. Hull make independent of Locator project. + * 02/22/2012 #644 Q.Zhou Added unit NM. Fixed point1 text(double units). * * * @author mli @@ -384,7 +377,7 @@ public class SeekResultsDialog extends Dialog { distCombo.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT)); int size = DISTANCEUNIT_OPTIONS.length; - for(int i = 1; i < size; i++) { + for(int i = 0; i < size; i++) { distCombo.add( DISTANCEUNIT_OPTIONS[i] ); } distCombo.addSelectionListener(new SelectionAdapter() { @@ -781,7 +774,8 @@ public class SeekResultsDialog extends Dialog { title.setEnabled(true); title2.setEnabled(true); - if (locName != null) title.setText(locName); + if (locName != null) + title.setText(locName); try{ closePoints = SeekInfo.getClosestPoints(coord, locName);//.getPtsData(coord, locName); @@ -872,7 +866,7 @@ public class SeekResultsDialog extends Dialog { dt = closePoints[i]; String distStr = LocatorUtil.distanceDisplay(dt.getDistanceInMeter(), 1, distCombo.getText()); - distStr = distStr + distCombo.getText().toLowerCase(); + //distStr = distStr + distCombo.getText().toLowerCase(); String dirStr = "-"; if (dt.getDistanceInMeter() > 0) { @@ -953,8 +947,8 @@ public class SeekResultsDialog extends Dialog { public String getFormatDistance(double dist, double dir) { // format distance - String distStr = LocatorUtil.distanceDisplay(dist, 1, distCombo.getText()) - + distCombo.getText().toLowerCase(); + String distStr = LocatorUtil.distanceDisplay(dist, 1, distCombo.getText()); + //+ distCombo.getText().toLowerCase(); // format direction String dirStr = "-"; diff --git a/pythonPackages/pythonPackages.ecl b/pythonPackages/pythonPackages.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rpms/awips2.ade/tar.baseline/javadoc/conf/overview.html b/rpms/awips2.ade/tar.baseline/javadoc/conf/overview.html index de63b935c2..a78fd5fbe7 100755 --- a/rpms/awips2.ade/tar.baseline/javadoc/conf/overview.html +++ b/rpms/awips2.ade/tar.baseline/javadoc/conf/overview.html @@ -1,5 +1,5 @@ - + This document contains the API Specification for the AWIPS II System. Documentation -includes both CAVE and EDEX as well as contributed code. +includes both CAVE and EDEX as well as contributed code. diff --git a/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf b/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf index 579d03d0d3..5749541485 100644 --- a/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf +++ b/rpms/awips2.core/Installer.database-server-configuration/configuration/postgresql.conf @@ -1,471 +1,471 @@ -# ----------------------------- -# PostgreSQL configuration file -# ----------------------------- -# -# This file consists of lines of the form: -# -# name = value -# -# (The '=' is optional.) White space may be used. Comments are introduced -# with '#' anywhere on a line. The complete list of option names and -# allowed values can be found in the PostgreSQL documentation. The -# commented-out settings shown in this file represent the default values. -# -# Please note that re-commenting a setting is NOT sufficient to revert it -# to the default value, unless you restart the server. -# -# Any option can also be given as a command line switch to the server, -# e.g., 'postgres -c log_connections=on'. Some options can be changed at -# run-time with the 'SET' SQL command. -# -# This file is read on server startup and when the server receives a -# SIGHUP. If you edit the file on a running system, you have to SIGHUP the -# server for the changes to take effect, or use "pg_ctl reload". Some -# settings, which are marked below, require a server shutdown and restart -# to take effect. -# -# Memory units: kB = kilobytes MB = megabytes GB = gigabytes -# Time units: ms = milliseconds s = seconds min = minutes h = hours d = days - - -#--------------------------------------------------------------------------- -# FILE LOCATIONS -#--------------------------------------------------------------------------- - -# The default values of these variables are driven from the -D command line -# switch or PGDATA environment variable, represented here as ConfigDir. - -#data_directory = 'ConfigDir' # use data in another directory - # (change requires restart) -#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file - # (change requires restart) -#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file - # (change requires restart) - -# If external_pid_file is not explicitly set, no extra PID file is written. -#external_pid_file = '(none)' # write an extra PID file - # (change requires restart) - - -#--------------------------------------------------------------------------- -# CONNECTIONS AND AUTHENTICATION -#--------------------------------------------------------------------------- - -# - Connection Settings - - -listen_addresses = '*' # what IP address(es) to listen on; - # comma-separated list of addresses; - # defaults to 'localhost', '*' = all - # (change requires restart) -#port = 5432 # (change requires restart) -max_connections = 300 # (change requires restart) -# Note: increasing max_connections costs ~400 bytes of shared memory per -# connection slot, plus lock space (see max_locks_per_transaction). You -# might also need to raise shared_buffers to support more connections. -#superuser_reserved_connections = 3 # (change requires restart) -#unix_socket_directory = '' # (change requires restart) -#unix_socket_group = '' # (change requires restart) -#unix_socket_permissions = 0777 # octal - # (change requires restart) -#bonjour_name = '' # defaults to the computer name - # (change requires restart) - -# - Security & Authentication - - -#authentication_timeout = 1min # 1s-600s -#ssl = off # (change requires restart) -#password_encryption = on -#db_user_namespace = off - -# Kerberos -#krb_server_keyfile = '' # (change requires restart) -#krb_srvname = 'postgres' # (change requires restart) -#krb_server_hostname = '' # empty string matches any keytab entry - # (change requires restart) -#krb_caseins_users = off # (change requires restart) - -# - TCP Keepalives - -# see 'man 7 tcp' for details - -#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; - # 0 selects the system default -#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; - # 0 selects the system default -#tcp_keepalives_count = 0 # TCP_KEEPCNT; - # 0 selects the system default - - -#--------------------------------------------------------------------------- -# RESOURCE USAGE (except WAL) -#--------------------------------------------------------------------------- - -# - Memory - - -shared_buffers = 2048MB # min 128kB or max_connections*16kB - # (change requires restart) -temp_buffers = 16MB # min 800kB -#max_prepared_transactions = 5 # can be 0 or more - # (change requires restart) -# Note: increasing max_prepared_transactions costs ~600 bytes of shared memory -# per transaction slot, plus lock space (see max_locks_per_transaction). -work_mem = 64MB # min 64kB -maintenance_work_mem = 32MB # min 1MB -#max_stack_depth = 2MB # min 100kB - -# - Free Space Map - - -max_fsm_pages = 153600 # min max_fsm_relations*16, 6 bytes each - # (change requires restart) -#max_fsm_relations = 1000 # min 100, ~70 bytes each - # (change requires restart) - -# - Kernel Resource Usage - - -#max_files_per_process = 1000 # min 25 - # (change requires restart) -#shared_preload_libraries = '' # (change requires restart) - -# - Cost-Based Vacuum Delay - - -#vacuum_cost_delay = 0 # 0-1000 milliseconds -#vacuum_cost_page_hit = 1 # 0-10000 credits -#vacuum_cost_page_miss = 10 # 0-10000 credits -#vacuum_cost_page_dirty = 20 # 0-10000 credits -#vacuum_cost_limit = 200 # 0-10000 credits - -# - Background writer - - -#bgwriter_delay = 200ms # 10-10000ms between rounds -#bgwriter_lru_percent = 1.0 # 0-100% of LRU buffers scanned/round -#bgwriter_lru_maxpages = 5 # 0-1000 buffers max written/round -#bgwriter_all_percent = 0.333 # 0-100% of all buffers scanned/round -#bgwriter_all_maxpages = 5 # 0-1000 buffers max written/round - - -#--------------------------------------------------------------------------- -# WRITE AHEAD LOG -#--------------------------------------------------------------------------- - -# - Settings - - -fsync = off # turns forced synchronization on or off -#wal_sync_method = fsync # the default is the first option - # supported by the operating system: - # open_datasync - # fdatasync - # fsync - # fsync_writethrough - # open_sync -#full_page_writes = on # recover from partial page writes -#wal_buffers = 64kB # min 32kB - # (change requires restart) -commit_delay = 50000 # range 0-100000, in microseconds -commit_siblings = 5 # range 1-1000 - -# - Checkpoints - - -checkpoint_segments = 10 # in logfile segments, min 1, 16MB each -#checkpoint_timeout = 5min # range 30s-1h -#checkpoint_warning = 30s # 0 is off - -# - Archiving - - -#archive_command = '' # command to use to archive a logfile segment -#archive_timeout = 0 # force a logfile segment switch after this - # many seconds; 0 is off - - -#--------------------------------------------------------------------------- -# QUERY TUNING -#--------------------------------------------------------------------------- - -# - Planner Method Configuration - - -#enable_bitmapscan = on -#enable_hashagg = on -#enable_hashjoin = on -#enable_indexscan = on -#enable_mergejoin = on -#enable_nestloop = on -#enable_seqscan = on -#enable_sort = on -#enable_tidscan = on - -# - Planner Cost Constants - - -#seq_page_cost = 1.0 # measured on an arbitrary scale -#random_page_cost = 4.0 # same scale as above -#cpu_tuple_cost = 0.01 # same scale as above -#cpu_index_tuple_cost = 0.005 # same scale as above -#cpu_operator_cost = 0.0025 # same scale as above -effective_cache_size = 2048MB - -# - Genetic Query Optimizer - - -#geqo = on -#geqo_threshold = 12 -#geqo_effort = 5 # range 1-10 -#geqo_pool_size = 0 # selects default based on effort -#geqo_generations = 0 # selects default based on effort -#geqo_selection_bias = 2.0 # range 1.5-2.0 - -# - Other Planner Options - - -#default_statistics_target = 10 # range 1-1000 -#constraint_exclusion = off -#from_collapse_limit = 8 -#join_collapse_limit = 8 # 1 disables collapsing of explicit - # JOINs - - -#--------------------------------------------------------------------------- -# ERROR REPORTING AND LOGGING -#--------------------------------------------------------------------------- - -# - Where to Log - - -#log_destination = 'stderr' # Valid values are combinations of - # stderr, syslog and eventlog, - # depending on platform. - -# This is used when logging to stderr: -logging_collector = on # Enable capturing of stderr into log - # files - # (change requires restart) - -# These are only used if redirect_stderr is on: -log_directory = 'pg_log' # Directory where log files are written - # Can be absolute or relative to PGDATA -#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file name pattern. - # Can include strftime() escapes -log_truncate_on_rotation = on # If on, any existing log file of the same - # name as the new log file will be - # truncated rather than appended to. But - # such truncation only occurs on - # time-driven rotation, not on restarts - # or size-driven rotation. Default is - # off, meaning append to existing files - # in all cases. -log_rotation_age = 1d # Automatic rotation of logfiles will - # happen after that time. 0 to - # disable. -log_rotation_size = 0 # Automatic rotation of logfiles will - # happen after that much log - # output. 0 to disable. - -# These are relevant when logging to syslog: -#syslog_facility = 'LOCAL0' -#syslog_ident = 'postgres' - - -# - When to Log - - -#client_min_messages = notice # Values, in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # log - # notice - # warning - # error - -#log_min_messages = notice # Values, in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic - -#log_error_verbosity = default # terse, default, or verbose messages - -log_min_error_statement = log # Values in order of increasing severity: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic (effectively off) - -#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements - # and their durations. - -#silent_mode = off # DO NOT USE without syslog or - # redirect_stderr - # (change requires restart) - -# - What to Log - - -#debug_print_parse = off -#debug_print_rewritten = off -#debug_print_plan = off -#debug_pretty_print = off -#log_connections = off -#log_disconnections = off -#log_duration = off -log_line_prefix='%t %x %d : %h : ' - # Special values: - # %u = user name - # %d = database name - # %r = remote host and port - # %h = remote host - # %p = PID - # %t = timestamp (no milliseconds) - # %m = timestamp with milliseconds - # %i = command tag - # %c = session id - # %l = session line number - # %s = session start timestamp - # %x = transaction id - # %q = stop here in non-session - # processes - # %% = '%' - # e.g. '<%u%%%d> ' -#log_statement = 'none' # none, ddl, mod, all -#log_hostname = off - - -#--------------------------------------------------------------------------- -# RUNTIME STATISTICS -#--------------------------------------------------------------------------- - -# - Query/Index Statistics Collector - - -#stats_command_string = on -#update_process_title = on - -#stats_block_level = off -track_counts = on -#stats_reset_on_server_start = off # (change requires restart) - - -# - Statistics Monitoring - - -#log_parser_stats = off -#log_planner_stats = off -#log_executor_stats = off -#log_statement_stats = off - - -#--------------------------------------------------------------------------- -# AUTOVACUUM PARAMETERS -#--------------------------------------------------------------------------- - -autovacuum = on # enable autovacuum subprocess? - # 'on' requires stats_start_collector - # and stats_row_level to also be on -#autovacuum_naptime = 1min # time between autovacuum runs -#autovacuum_vacuum_threshold = 500 # min # of tuple updates before - # vacuum -#autovacuum_analyze_threshold = 250 # min # of tuple updates before - # analyze -#autovacuum_vacuum_scale_factor = 0.2 # fraction of rel size before - # vacuum -#autovacuum_analyze_scale_factor = 0.1 # fraction of rel size before - # analyze -#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum - # (change requires restart) -#autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for - # autovacuum, -1 means use - # vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for - # autovacuum, -1 means use - # vacuum_cost_limit - - -#--------------------------------------------------------------------------- -# CLIENT CONNECTION DEFAULTS -#--------------------------------------------------------------------------- - -# - Statement Behavior - - -#search_path = '"$user",public' # schema names -#default_tablespace = '' # a tablespace name, '' uses - # the default -#check_function_bodies = on -#default_transaction_isolation = 'read committed' -#default_transaction_read_only = off -#statement_timeout = 0 # 0 is disabled -#vacuum_freeze_min_age = 100000000 - -# - Locale and Formatting - - -datestyle = 'iso, mdy' -timezone = GMT # actually, defaults to TZ - # environment setting -#timezone_abbreviations = 'Default' # select the set of available timezone - # abbreviations. Currently, there are - # Default - # Australia - # India - # However you can also create your own - # file in share/timezonesets/. -#extra_float_digits = 0 # min -15, max 2 -#client_encoding = 'en_US.UTF-8' # actually, defaults to database - # encoding - -# These settings are initialized by initdb -- they might be changed -lc_messages = 'en_US.UTF-8' # locale for system error message - # strings -lc_monetary = 'en_US.UTF-8' # locale for monetary formatting -lc_numeric = 'en_US.UTF-8' # locale for number formatting -lc_time = 'en_US.UTF-8' # locale for time formatting - -# - Other Defaults - - -#explain_pretty_print = on -#dynamic_library_path = '$libdir' -#local_preload_libraries = '' - - -#--------------------------------------------------------------------------- -# LOCK MANAGEMENT -#--------------------------------------------------------------------------- - -#deadlock_timeout = 1s -#max_locks_per_transaction = 64 # min 10 - # (change requires restart) -# Note: each lock table slot uses ~270 bytes of shared memory, and there are -# max_locks_per_transaction * (max_connections + max_prepared_transactions) -# lock table slots. - - -#--------------------------------------------------------------------------- -# VERSION/PLATFORM COMPATIBILITY -#--------------------------------------------------------------------------- - -# - Previous Postgres Versions - - -#add_missing_from = off -#array_nulls = on -#backslash_quote = safe_encoding # on, off, or safe_encoding -#default_with_oids = off -#escape_string_warning = on -#standard_conforming_strings = off -#regex_flavor = advanced # advanced, extended, or basic -#sql_inheritance = on - -# - Other Platforms & Clients - - -#transform_null_equals = off - - -#--------------------------------------------------------------------------- -# CUSTOMIZED OPTIONS -#--------------------------------------------------------------------------- - -#custom_variable_classes = '' # list of custom variable class names +# ----------------------------- +# PostgreSQL configuration file +# ----------------------------- +# +# This file consists of lines of the form: +# +# name = value +# +# (The '=' is optional.) White space may be used. Comments are introduced +# with '#' anywhere on a line. The complete list of option names and +# allowed values can be found in the PostgreSQL documentation. The +# commented-out settings shown in this file represent the default values. +# +# Please note that re-commenting a setting is NOT sufficient to revert it +# to the default value, unless you restart the server. +# +# Any option can also be given as a command line switch to the server, +# e.g., 'postgres -c log_connections=on'. Some options can be changed at +# run-time with the 'SET' SQL command. +# +# This file is read on server startup and when the server receives a +# SIGHUP. If you edit the file on a running system, you have to SIGHUP the +# server for the changes to take effect, or use "pg_ctl reload". Some +# settings, which are marked below, require a server shutdown and restart +# to take effect. +# +# Memory units: kB = kilobytes MB = megabytes GB = gigabytes +# Time units: ms = milliseconds s = seconds min = minutes h = hours d = days + + +#--------------------------------------------------------------------------- +# FILE LOCATIONS +#--------------------------------------------------------------------------- + +# The default values of these variables are driven from the -D command line +# switch or PGDATA environment variable, represented here as ConfigDir. + +#data_directory = 'ConfigDir' # use data in another directory + # (change requires restart) +#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file + # (change requires restart) +#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file + # (change requires restart) + +# If external_pid_file is not explicitly set, no extra PID file is written. +#external_pid_file = '(none)' # write an extra PID file + # (change requires restart) + + +#--------------------------------------------------------------------------- +# CONNECTIONS AND AUTHENTICATION +#--------------------------------------------------------------------------- + +# - Connection Settings - + +listen_addresses = '*' # what IP address(es) to listen on; + # comma-separated list of addresses; + # defaults to 'localhost', '*' = all + # (change requires restart) +#port = 5432 # (change requires restart) +max_connections = 300 # (change requires restart) +# Note: increasing max_connections costs ~400 bytes of shared memory per +# connection slot, plus lock space (see max_locks_per_transaction). You +# might also need to raise shared_buffers to support more connections. +#superuser_reserved_connections = 3 # (change requires restart) +#unix_socket_directory = '' # (change requires restart) +#unix_socket_group = '' # (change requires restart) +#unix_socket_permissions = 0777 # octal + # (change requires restart) +#bonjour_name = '' # defaults to the computer name + # (change requires restart) + +# - Security & Authentication - + +#authentication_timeout = 1min # 1s-600s +#ssl = off # (change requires restart) +#password_encryption = on +#db_user_namespace = off + +# Kerberos +#krb_server_keyfile = '' # (change requires restart) +#krb_srvname = 'postgres' # (change requires restart) +#krb_server_hostname = '' # empty string matches any keytab entry + # (change requires restart) +#krb_caseins_users = off # (change requires restart) + +# - TCP Keepalives - +# see 'man 7 tcp' for details + +#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; + # 0 selects the system default +#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; + # 0 selects the system default +#tcp_keepalives_count = 0 # TCP_KEEPCNT; + # 0 selects the system default + + +#--------------------------------------------------------------------------- +# RESOURCE USAGE (except WAL) +#--------------------------------------------------------------------------- + +# - Memory - + +shared_buffers = 2048MB # min 128kB or max_connections*16kB + # (change requires restart) +temp_buffers = 16MB # min 800kB +#max_prepared_transactions = 5 # can be 0 or more + # (change requires restart) +# Note: increasing max_prepared_transactions costs ~600 bytes of shared memory +# per transaction slot, plus lock space (see max_locks_per_transaction). +work_mem = 64MB # min 64kB +maintenance_work_mem = 32MB # min 1MB +#max_stack_depth = 2MB # min 100kB + +# - Free Space Map - + +max_fsm_pages = 3500000 # min max_fsm_relations*16, 6 bytes each + # (change requires restart) +max_fsm_relations = 1500 # min 100, ~70 bytes each + # (change requires restart) + +# - Kernel Resource Usage - + +#max_files_per_process = 1000 # min 25 + # (change requires restart) +#shared_preload_libraries = '' # (change requires restart) + +# - Cost-Based Vacuum Delay - + +#vacuum_cost_delay = 0 # 0-1000 milliseconds +#vacuum_cost_page_hit = 1 # 0-10000 credits +#vacuum_cost_page_miss = 10 # 0-10000 credits +#vacuum_cost_page_dirty = 20 # 0-10000 credits +#vacuum_cost_limit = 200 # 0-10000 credits + +# - Background writer - + +#bgwriter_delay = 200ms # 10-10000ms between rounds +#bgwriter_lru_percent = 1.0 # 0-100% of LRU buffers scanned/round +#bgwriter_lru_maxpages = 5 # 0-1000 buffers max written/round +#bgwriter_all_percent = 0.333 # 0-100% of all buffers scanned/round +#bgwriter_all_maxpages = 5 # 0-1000 buffers max written/round + + +#--------------------------------------------------------------------------- +# WRITE AHEAD LOG +#--------------------------------------------------------------------------- + +# - Settings - + +fsync = off # turns forced synchronization on or off +#wal_sync_method = fsync # the default is the first option + # supported by the operating system: + # open_datasync + # fdatasync + # fsync + # fsync_writethrough + # open_sync +#full_page_writes = on # recover from partial page writes +#wal_buffers = 64kB # min 32kB + # (change requires restart) +commit_delay = 50000 # range 0-100000, in microseconds +commit_siblings = 5 # range 1-1000 + +# - Checkpoints - + +checkpoint_segments = 10 # in logfile segments, min 1, 16MB each +#checkpoint_timeout = 5min # range 30s-1h +#checkpoint_warning = 30s # 0 is off + +# - Archiving - + +#archive_command = '' # command to use to archive a logfile segment +#archive_timeout = 0 # force a logfile segment switch after this + # many seconds; 0 is off + + +#--------------------------------------------------------------------------- +# QUERY TUNING +#--------------------------------------------------------------------------- + +# - Planner Method Configuration - + +#enable_bitmapscan = on +#enable_hashagg = on +#enable_hashjoin = on +#enable_indexscan = on +#enable_mergejoin = on +#enable_nestloop = on +#enable_seqscan = on +#enable_sort = on +#enable_tidscan = on + +# - Planner Cost Constants - + +#seq_page_cost = 1.0 # measured on an arbitrary scale +#random_page_cost = 4.0 # same scale as above +#cpu_tuple_cost = 0.01 # same scale as above +#cpu_index_tuple_cost = 0.005 # same scale as above +#cpu_operator_cost = 0.0025 # same scale as above +effective_cache_size = 2048MB + +# - Genetic Query Optimizer - + +#geqo = on +#geqo_threshold = 12 +#geqo_effort = 5 # range 1-10 +#geqo_pool_size = 0 # selects default based on effort +#geqo_generations = 0 # selects default based on effort +#geqo_selection_bias = 2.0 # range 1.5-2.0 + +# - Other Planner Options - + +#default_statistics_target = 10 # range 1-1000 +#constraint_exclusion = off +#from_collapse_limit = 8 +#join_collapse_limit = 8 # 1 disables collapsing of explicit + # JOINs + + +#--------------------------------------------------------------------------- +# ERROR REPORTING AND LOGGING +#--------------------------------------------------------------------------- + +# - Where to Log - + +#log_destination = 'stderr' # Valid values are combinations of + # stderr, syslog and eventlog, + # depending on platform. + +# This is used when logging to stderr: +logging_collector = on # Enable capturing of stderr into log + # files + # (change requires restart) + +# These are only used if redirect_stderr is on: +log_directory = 'pg_log' # Directory where log files are written + # Can be absolute or relative to PGDATA +#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file name pattern. + # Can include strftime() escapes +log_truncate_on_rotation = on # If on, any existing log file of the same + # name as the new log file will be + # truncated rather than appended to. But + # such truncation only occurs on + # time-driven rotation, not on restarts + # or size-driven rotation. Default is + # off, meaning append to existing files + # in all cases. +log_rotation_age = 1d # Automatic rotation of logfiles will + # happen after that time. 0 to + # disable. +log_rotation_size = 0 # Automatic rotation of logfiles will + # happen after that much log + # output. 0 to disable. + +# These are relevant when logging to syslog: +#syslog_facility = 'LOCAL0' +#syslog_ident = 'postgres' + + +# - When to Log - + +#client_min_messages = notice # Values, in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # log + # notice + # warning + # error + +#log_min_messages = notice # Values, in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic + +#log_error_verbosity = default # terse, default, or verbose messages + +log_min_error_statement = log # Values in order of increasing severity: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic (effectively off) + +#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements + # and their durations. + +#silent_mode = off # DO NOT USE without syslog or + # redirect_stderr + # (change requires restart) + +# - What to Log - + +#debug_print_parse = off +#debug_print_rewritten = off +#debug_print_plan = off +#debug_pretty_print = off +#log_connections = off +#log_disconnections = off +#log_duration = off +log_line_prefix='%t %x %d : %h : ' + # Special values: + # %u = user name + # %d = database name + # %r = remote host and port + # %h = remote host + # %p = PID + # %t = timestamp (no milliseconds) + # %m = timestamp with milliseconds + # %i = command tag + # %c = session id + # %l = session line number + # %s = session start timestamp + # %x = transaction id + # %q = stop here in non-session + # processes + # %% = '%' + # e.g. '<%u%%%d> ' +#log_statement = 'none' # none, ddl, mod, all +#log_hostname = off + + +#--------------------------------------------------------------------------- +# RUNTIME STATISTICS +#--------------------------------------------------------------------------- + +# - Query/Index Statistics Collector - + +#stats_command_string = on +#update_process_title = on + +#stats_block_level = off +track_counts = on +#stats_reset_on_server_start = off # (change requires restart) + + +# - Statistics Monitoring - + +#log_parser_stats = off +#log_planner_stats = off +#log_executor_stats = off +#log_statement_stats = off + + +#--------------------------------------------------------------------------- +# AUTOVACUUM PARAMETERS +#--------------------------------------------------------------------------- + +autovacuum = on # enable autovacuum subprocess? + # 'on' requires stats_start_collector + # and stats_row_level to also be on +#autovacuum_naptime = 1min # time between autovacuum runs +#autovacuum_vacuum_threshold = 500 # min # of tuple updates before + # vacuum +#autovacuum_analyze_threshold = 250 # min # of tuple updates before + # analyze +#autovacuum_vacuum_scale_factor = 0.2 # fraction of rel size before + # vacuum +#autovacuum_analyze_scale_factor = 0.1 # fraction of rel size before + # analyze +#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum + # (change requires restart) +#autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for + # autovacuum, -1 means use + # vacuum_cost_delay +#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for + # autovacuum, -1 means use + # vacuum_cost_limit + + +#--------------------------------------------------------------------------- +# CLIENT CONNECTION DEFAULTS +#--------------------------------------------------------------------------- + +# - Statement Behavior - + +#search_path = '"$user",public' # schema names +#default_tablespace = '' # a tablespace name, '' uses + # the default +#check_function_bodies = on +#default_transaction_isolation = 'read committed' +#default_transaction_read_only = off +#statement_timeout = 0 # 0 is disabled +#vacuum_freeze_min_age = 100000000 + +# - Locale and Formatting - + +datestyle = 'iso, mdy' +timezone = GMT # actually, defaults to TZ + # environment setting +#timezone_abbreviations = 'Default' # select the set of available timezone + # abbreviations. Currently, there are + # Default + # Australia + # India + # However you can also create your own + # file in share/timezonesets/. +#extra_float_digits = 0 # min -15, max 2 +#client_encoding = 'en_US.UTF-8' # actually, defaults to database + # encoding + +# These settings are initialized by initdb -- they might be changed +lc_messages = 'en_US.UTF-8' # locale for system error message + # strings +lc_monetary = 'en_US.UTF-8' # locale for monetary formatting +lc_numeric = 'en_US.UTF-8' # locale for number formatting +lc_time = 'en_US.UTF-8' # locale for time formatting + +# - Other Defaults - + +#explain_pretty_print = on +#dynamic_library_path = '$libdir' +#local_preload_libraries = '' + + +#--------------------------------------------------------------------------- +# LOCK MANAGEMENT +#--------------------------------------------------------------------------- + +#deadlock_timeout = 1s +#max_locks_per_transaction = 64 # min 10 + # (change requires restart) +# Note: each lock table slot uses ~270 bytes of shared memory, and there are +# max_locks_per_transaction * (max_connections + max_prepared_transactions) +# lock table slots. + + +#--------------------------------------------------------------------------- +# VERSION/PLATFORM COMPATIBILITY +#--------------------------------------------------------------------------- + +# - Previous Postgres Versions - + +#add_missing_from = off +#array_nulls = on +#backslash_quote = safe_encoding # on, off, or safe_encoding +#default_with_oids = off +#escape_string_warning = on +#standard_conforming_strings = off +#regex_flavor = advanced # advanced, extended, or basic +#sql_inheritance = on + +# - Other Platforms & Clients - + +#transform_null_equals = off + + +#--------------------------------------------------------------------------- +# CUSTOMIZED OPTIONS +#--------------------------------------------------------------------------- + +#custom_variable_classes = '' # list of custom variable class names diff --git a/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf b/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf index 42b6429cdc..c32335a4eb 100644 --- a/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf +++ b/rpms/awips2.core/Installer.database-standalone-configuration/configuration/postgresql.conf @@ -1,471 +1,471 @@ -# ----------------------------- -# PostgreSQL configuration file -# ----------------------------- -# -# This file consists of lines of the form: -# -# name = value -# -# (The '=' is optional.) White space may be used. Comments are introduced -# with '#' anywhere on a line. The complete list of option names and -# allowed values can be found in the PostgreSQL documentation. The -# commented-out settings shown in this file represent the default values. -# -# Please note that re-commenting a setting is NOT sufficient to revert it -# to the default value, unless you restart the server. -# -# Any option can also be given as a command line switch to the server, -# e.g., 'postgres -c log_connections=on'. Some options can be changed at -# run-time with the 'SET' SQL command. -# -# This file is read on server startup and when the server receives a -# SIGHUP. If you edit the file on a running system, you have to SIGHUP the -# server for the changes to take effect, or use "pg_ctl reload". Some -# settings, which are marked below, require a server shutdown and restart -# to take effect. -# -# Memory units: kB = kilobytes MB = megabytes GB = gigabytes -# Time units: ms = milliseconds s = seconds min = minutes h = hours d = days - - -#--------------------------------------------------------------------------- -# FILE LOCATIONS -#--------------------------------------------------------------------------- - -# The default values of these variables are driven from the -D command line -# switch or PGDATA environment variable, represented here as ConfigDir. - -#data_directory = 'ConfigDir' # use data in another directory - # (change requires restart) -#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file - # (change requires restart) -#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file - # (change requires restart) - -# If external_pid_file is not explicitly set, no extra PID file is written. -#external_pid_file = '(none)' # write an extra PID file - # (change requires restart) - - -#--------------------------------------------------------------------------- -# CONNECTIONS AND AUTHENTICATION -#--------------------------------------------------------------------------- - -# - Connection Settings - - -listen_addresses = '*' # what IP address(es) to listen on; - # comma-separated list of addresses; - # defaults to 'localhost', '*' = all - # (change requires restart) -#port = 5432 # (change requires restart) -max_connections = 300 # (change requires restart) -# Note: increasing max_connections costs ~400 bytes of shared memory per -# connection slot, plus lock space (see max_locks_per_transaction). You -# might also need to raise shared_buffers to support more connections. -#superuser_reserved_connections = 3 # (change requires restart) -#unix_socket_directory = '' # (change requires restart) -#unix_socket_group = '' # (change requires restart) -#unix_socket_permissions = 0777 # octal - # (change requires restart) -#bonjour_name = '' # defaults to the computer name - # (change requires restart) - -# - Security & Authentication - - -#authentication_timeout = 1min # 1s-600s -#ssl = off # (change requires restart) -#password_encryption = on -#db_user_namespace = off - -# Kerberos -#krb_server_keyfile = '' # (change requires restart) -#krb_srvname = 'postgres' # (change requires restart) -#krb_server_hostname = '' # empty string matches any keytab entry - # (change requires restart) -#krb_caseins_users = off # (change requires restart) - -# - TCP Keepalives - -# see 'man 7 tcp' for details - -#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; - # 0 selects the system default -#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; - # 0 selects the system default -#tcp_keepalives_count = 0 # TCP_KEEPCNT; - # 0 selects the system default - - -#--------------------------------------------------------------------------- -# RESOURCE USAGE (except WAL) -#--------------------------------------------------------------------------- - -# - Memory - - -shared_buffers = 128MB # min 128kB or max_connections*16kB - # (change requires restart) -temp_buffers = 16MB # min 800kB -#max_prepared_transactions = 5 # can be 0 or more - # (change requires restart) -# Note: increasing max_prepared_transactions costs ~600 bytes of shared memory -# per transaction slot, plus lock space (see max_locks_per_transaction). -work_mem = 8MB # min 64kB -maintenance_work_mem = 32MB # min 1MB -#max_stack_depth = 2MB # min 100kB - -# - Free Space Map - - -max_fsm_pages = 153600 # min max_fsm_relations*16, 6 bytes each - # (change requires restart) -#max_fsm_relations = 1000 # min 100, ~70 bytes each - # (change requires restart) - -# - Kernel Resource Usage - - -#max_files_per_process = 1000 # min 25 - # (change requires restart) -#shared_preload_libraries = '' # (change requires restart) - -# - Cost-Based Vacuum Delay - - -#vacuum_cost_delay = 0 # 0-1000 milliseconds -#vacuum_cost_page_hit = 1 # 0-10000 credits -#vacuum_cost_page_miss = 10 # 0-10000 credits -#vacuum_cost_page_dirty = 20 # 0-10000 credits -#vacuum_cost_limit = 200 # 0-10000 credits - -# - Background writer - - -#bgwriter_delay = 200ms # 10-10000ms between rounds -#bgwriter_lru_percent = 1.0 # 0-100% of LRU buffers scanned/round -#bgwriter_lru_maxpages = 5 # 0-1000 buffers max written/round -#bgwriter_all_percent = 0.333 # 0-100% of all buffers scanned/round -#bgwriter_all_maxpages = 5 # 0-1000 buffers max written/round - - -#--------------------------------------------------------------------------- -# WRITE AHEAD LOG -#--------------------------------------------------------------------------- - -# - Settings - - -fsync = off # turns forced synchronization on or off -#wal_sync_method = fsync # the default is the first option - # supported by the operating system: - # open_datasync - # fdatasync - # fsync - # fsync_writethrough - # open_sync -#full_page_writes = on # recover from partial page writes -#wal_buffers = 64kB # min 32kB - # (change requires restart) -commit_delay = 50000 # range 0-100000, in microseconds -commit_siblings = 5 # range 1-1000 - -# - Checkpoints - - -checkpoint_segments = 10 # in logfile segments, min 1, 16MB each -#checkpoint_timeout = 5min # range 30s-1h -#checkpoint_warning = 30s # 0 is off - -# - Archiving - - -#archive_command = '' # command to use to archive a logfile segment -#archive_timeout = 0 # force a logfile segment switch after this - # many seconds; 0 is off - - -#--------------------------------------------------------------------------- -# QUERY TUNING -#--------------------------------------------------------------------------- - -# - Planner Method Configuration - - -#enable_bitmapscan = on -#enable_hashagg = on -#enable_hashjoin = on -#enable_indexscan = on -#enable_mergejoin = on -#enable_nestloop = on -#enable_seqscan = on -#enable_sort = on -#enable_tidscan = on - -# - Planner Cost Constants - - -#seq_page_cost = 1.0 # measured on an arbitrary scale -#random_page_cost = 4.0 # same scale as above -#cpu_tuple_cost = 0.01 # same scale as above -#cpu_index_tuple_cost = 0.005 # same scale as above -#cpu_operator_cost = 0.0025 # same scale as above -effective_cache_size = 512MB - -# - Genetic Query Optimizer - - -#geqo = on -#geqo_threshold = 12 -#geqo_effort = 5 # range 1-10 -#geqo_pool_size = 0 # selects default based on effort -#geqo_generations = 0 # selects default based on effort -#geqo_selection_bias = 2.0 # range 1.5-2.0 - -# - Other Planner Options - - -#default_statistics_target = 10 # range 1-1000 -#constraint_exclusion = off -#from_collapse_limit = 8 -#join_collapse_limit = 8 # 1 disables collapsing of explicit - # JOINs - - -#--------------------------------------------------------------------------- -# ERROR REPORTING AND LOGGING -#--------------------------------------------------------------------------- - -# - Where to Log - - -#log_destination = 'stderr' # Valid values are combinations of - # stderr, syslog and eventlog, - # depending on platform. - -# This is used when logging to stderr: -logging_collector = on # Enable capturing of stderr into log - # files - # (change requires restart) - -# These are only used if redirect_stderr is on: -log_directory = 'pg_log' # Directory where log files are written - # Can be absolute or relative to PGDATA -#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file name pattern. - # Can include strftime() escapes -log_truncate_on_rotation = on # If on, any existing log file of the same - # name as the new log file will be - # truncated rather than appended to. But - # such truncation only occurs on - # time-driven rotation, not on restarts - # or size-driven rotation. Default is - # off, meaning append to existing files - # in all cases. -log_rotation_age = 1d # Automatic rotation of logfiles will - # happen after that time. 0 to - # disable. -log_rotation_size = 0 # Automatic rotation of logfiles will - # happen after that much log - # output. 0 to disable. - -# These are relevant when logging to syslog: -#syslog_facility = 'LOCAL0' -#syslog_ident = 'postgres' - - -# - When to Log - - -#client_min_messages = notice # Values, in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # log - # notice - # warning - # error - -#log_min_messages = notice # Values, in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic - -#log_error_verbosity = default # terse, default, or verbose messages - -log_min_error_statement = log # Values in order of increasing severity: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic (effectively off) - -#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements - # and their durations. - -#silent_mode = off # DO NOT USE without syslog or - # redirect_stderr - # (change requires restart) - -# - What to Log - - -#debug_print_parse = off -#debug_print_rewritten = off -#debug_print_plan = off -#debug_pretty_print = off -#log_connections = off -#log_disconnections = off -#log_duration = off -log_line_prefix='%t %x %d : %h : ' - # Special values: - # %u = user name - # %d = database name - # %r = remote host and port - # %h = remote host - # %p = PID - # %t = timestamp (no milliseconds) - # %m = timestamp with milliseconds - # %i = command tag - # %c = session id - # %l = session line number - # %s = session start timestamp - # %x = transaction id - # %q = stop here in non-session - # processes - # %% = '%' - # e.g. '<%u%%%d> ' -#log_statement = 'none' # none, ddl, mod, all -#log_hostname = off - - -#--------------------------------------------------------------------------- -# RUNTIME STATISTICS -#--------------------------------------------------------------------------- - -# - Query/Index Statistics Collector - - -#stats_command_string = on -#update_process_title = on - -#stats_block_level = off -track_counts = on -#stats_reset_on_server_start = off # (change requires restart) - - -# - Statistics Monitoring - - -#log_parser_stats = off -#log_planner_stats = off -#log_executor_stats = off -#log_statement_stats = off - - -#--------------------------------------------------------------------------- -# AUTOVACUUM PARAMETERS -#--------------------------------------------------------------------------- - -autovacuum = on # enable autovacuum subprocess? - # 'on' requires stats_start_collector - # and stats_row_level to also be on -#autovacuum_naptime = 1min # time between autovacuum runs -#autovacuum_vacuum_threshold = 500 # min # of tuple updates before - # vacuum -#autovacuum_analyze_threshold = 250 # min # of tuple updates before - # analyze -#autovacuum_vacuum_scale_factor = 0.2 # fraction of rel size before - # vacuum -#autovacuum_analyze_scale_factor = 0.1 # fraction of rel size before - # analyze -#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum - # (change requires restart) -#autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for - # autovacuum, -1 means use - # vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for - # autovacuum, -1 means use - # vacuum_cost_limit - - -#--------------------------------------------------------------------------- -# CLIENT CONNECTION DEFAULTS -#--------------------------------------------------------------------------- - -# - Statement Behavior - - -#search_path = '"$user",public' # schema names -#default_tablespace = '' # a tablespace name, '' uses - # the default -#check_function_bodies = on -#default_transaction_isolation = 'read committed' -#default_transaction_read_only = off -#statement_timeout = 0 # 0 is disabled -#vacuum_freeze_min_age = 100000000 - -# - Locale and Formatting - - -datestyle = 'iso, mdy' -timezone = GMT # actually, defaults to TZ - # environment setting -#timezone_abbreviations = 'Default' # select the set of available timezone - # abbreviations. Currently, there are - # Default - # Australia - # India - # However you can also create your own - # file in share/timezonesets/. -#extra_float_digits = 0 # min -15, max 2 -#client_encoding = 'en_US.UTF-8' # actually, defaults to database - # encoding - -# These settings are initialized by initdb -- they might be changed -lc_messages = 'en_US.UTF-8' # locale for system error message - # strings -lc_monetary = 'en_US.UTF-8' # locale for monetary formatting -lc_numeric = 'en_US.UTF-8' # locale for number formatting -lc_time = 'en_US.UTF-8' # locale for time formatting - -# - Other Defaults - - -#explain_pretty_print = on -#dynamic_library_path = '$libdir' -#local_preload_libraries = '' - - -#--------------------------------------------------------------------------- -# LOCK MANAGEMENT -#--------------------------------------------------------------------------- - -#deadlock_timeout = 1s -#max_locks_per_transaction = 64 # min 10 - # (change requires restart) -# Note: each lock table slot uses ~270 bytes of shared memory, and there are -# max_locks_per_transaction * (max_connections + max_prepared_transactions) -# lock table slots. - - -#--------------------------------------------------------------------------- -# VERSION/PLATFORM COMPATIBILITY -#--------------------------------------------------------------------------- - -# - Previous Postgres Versions - - -#add_missing_from = off -#array_nulls = on -#backslash_quote = safe_encoding # on, off, or safe_encoding -#default_with_oids = off -#escape_string_warning = on -#standard_conforming_strings = off -#regex_flavor = advanced # advanced, extended, or basic -#sql_inheritance = on - -# - Other Platforms & Clients - - -#transform_null_equals = off - - -#--------------------------------------------------------------------------- -# CUSTOMIZED OPTIONS -#--------------------------------------------------------------------------- - -#custom_variable_classes = '' # list of custom variable class names +# ----------------------------- +# PostgreSQL configuration file +# ----------------------------- +# +# This file consists of lines of the form: +# +# name = value +# +# (The '=' is optional.) White space may be used. Comments are introduced +# with '#' anywhere on a line. The complete list of option names and +# allowed values can be found in the PostgreSQL documentation. The +# commented-out settings shown in this file represent the default values. +# +# Please note that re-commenting a setting is NOT sufficient to revert it +# to the default value, unless you restart the server. +# +# Any option can also be given as a command line switch to the server, +# e.g., 'postgres -c log_connections=on'. Some options can be changed at +# run-time with the 'SET' SQL command. +# +# This file is read on server startup and when the server receives a +# SIGHUP. If you edit the file on a running system, you have to SIGHUP the +# server for the changes to take effect, or use "pg_ctl reload". Some +# settings, which are marked below, require a server shutdown and restart +# to take effect. +# +# Memory units: kB = kilobytes MB = megabytes GB = gigabytes +# Time units: ms = milliseconds s = seconds min = minutes h = hours d = days + + +#--------------------------------------------------------------------------- +# FILE LOCATIONS +#--------------------------------------------------------------------------- + +# The default values of these variables are driven from the -D command line +# switch or PGDATA environment variable, represented here as ConfigDir. + +#data_directory = 'ConfigDir' # use data in another directory + # (change requires restart) +#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file + # (change requires restart) +#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file + # (change requires restart) + +# If external_pid_file is not explicitly set, no extra PID file is written. +#external_pid_file = '(none)' # write an extra PID file + # (change requires restart) + + +#--------------------------------------------------------------------------- +# CONNECTIONS AND AUTHENTICATION +#--------------------------------------------------------------------------- + +# - Connection Settings - + +listen_addresses = '*' # what IP address(es) to listen on; + # comma-separated list of addresses; + # defaults to 'localhost', '*' = all + # (change requires restart) +#port = 5432 # (change requires restart) +max_connections = 300 # (change requires restart) +# Note: increasing max_connections costs ~400 bytes of shared memory per +# connection slot, plus lock space (see max_locks_per_transaction). You +# might also need to raise shared_buffers to support more connections. +#superuser_reserved_connections = 3 # (change requires restart) +#unix_socket_directory = '' # (change requires restart) +#unix_socket_group = '' # (change requires restart) +#unix_socket_permissions = 0777 # octal + # (change requires restart) +#bonjour_name = '' # defaults to the computer name + # (change requires restart) + +# - Security & Authentication - + +#authentication_timeout = 1min # 1s-600s +#ssl = off # (change requires restart) +#password_encryption = on +#db_user_namespace = off + +# Kerberos +#krb_server_keyfile = '' # (change requires restart) +#krb_srvname = 'postgres' # (change requires restart) +#krb_server_hostname = '' # empty string matches any keytab entry + # (change requires restart) +#krb_caseins_users = off # (change requires restart) + +# - TCP Keepalives - +# see 'man 7 tcp' for details + +#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; + # 0 selects the system default +#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; + # 0 selects the system default +#tcp_keepalives_count = 0 # TCP_KEEPCNT; + # 0 selects the system default + + +#--------------------------------------------------------------------------- +# RESOURCE USAGE (except WAL) +#--------------------------------------------------------------------------- + +# - Memory - + +shared_buffers = 128MB # min 128kB or max_connections*16kB + # (change requires restart) +temp_buffers = 16MB # min 800kB +#max_prepared_transactions = 5 # can be 0 or more + # (change requires restart) +# Note: increasing max_prepared_transactions costs ~600 bytes of shared memory +# per transaction slot, plus lock space (see max_locks_per_transaction). +work_mem = 8MB # min 64kB +maintenance_work_mem = 32MB # min 1MB +#max_stack_depth = 2MB # min 100kB + +# - Free Space Map - + +max_fsm_pages = 3500000 # min max_fsm_relations*16, 6 bytes each + # (change requires restart) +max_fsm_relations = 1500 # min 100, ~70 bytes each + # (change requires restart) + +# - Kernel Resource Usage - + +#max_files_per_process = 1000 # min 25 + # (change requires restart) +#shared_preload_libraries = '' # (change requires restart) + +# - Cost-Based Vacuum Delay - + +#vacuum_cost_delay = 0 # 0-1000 milliseconds +#vacuum_cost_page_hit = 1 # 0-10000 credits +#vacuum_cost_page_miss = 10 # 0-10000 credits +#vacuum_cost_page_dirty = 20 # 0-10000 credits +#vacuum_cost_limit = 200 # 0-10000 credits + +# - Background writer - + +#bgwriter_delay = 200ms # 10-10000ms between rounds +#bgwriter_lru_percent = 1.0 # 0-100% of LRU buffers scanned/round +#bgwriter_lru_maxpages = 5 # 0-1000 buffers max written/round +#bgwriter_all_percent = 0.333 # 0-100% of all buffers scanned/round +#bgwriter_all_maxpages = 5 # 0-1000 buffers max written/round + + +#--------------------------------------------------------------------------- +# WRITE AHEAD LOG +#--------------------------------------------------------------------------- + +# - Settings - + +fsync = off # turns forced synchronization on or off +#wal_sync_method = fsync # the default is the first option + # supported by the operating system: + # open_datasync + # fdatasync + # fsync + # fsync_writethrough + # open_sync +#full_page_writes = on # recover from partial page writes +#wal_buffers = 64kB # min 32kB + # (change requires restart) +commit_delay = 50000 # range 0-100000, in microseconds +commit_siblings = 5 # range 1-1000 + +# - Checkpoints - + +checkpoint_segments = 10 # in logfile segments, min 1, 16MB each +#checkpoint_timeout = 5min # range 30s-1h +#checkpoint_warning = 30s # 0 is off + +# - Archiving - + +#archive_command = '' # command to use to archive a logfile segment +#archive_timeout = 0 # force a logfile segment switch after this + # many seconds; 0 is off + + +#--------------------------------------------------------------------------- +# QUERY TUNING +#--------------------------------------------------------------------------- + +# - Planner Method Configuration - + +#enable_bitmapscan = on +#enable_hashagg = on +#enable_hashjoin = on +#enable_indexscan = on +#enable_mergejoin = on +#enable_nestloop = on +#enable_seqscan = on +#enable_sort = on +#enable_tidscan = on + +# - Planner Cost Constants - + +#seq_page_cost = 1.0 # measured on an arbitrary scale +#random_page_cost = 4.0 # same scale as above +#cpu_tuple_cost = 0.01 # same scale as above +#cpu_index_tuple_cost = 0.005 # same scale as above +#cpu_operator_cost = 0.0025 # same scale as above +effective_cache_size = 512MB + +# - Genetic Query Optimizer - + +#geqo = on +#geqo_threshold = 12 +#geqo_effort = 5 # range 1-10 +#geqo_pool_size = 0 # selects default based on effort +#geqo_generations = 0 # selects default based on effort +#geqo_selection_bias = 2.0 # range 1.5-2.0 + +# - Other Planner Options - + +#default_statistics_target = 10 # range 1-1000 +#constraint_exclusion = off +#from_collapse_limit = 8 +#join_collapse_limit = 8 # 1 disables collapsing of explicit + # JOINs + + +#--------------------------------------------------------------------------- +# ERROR REPORTING AND LOGGING +#--------------------------------------------------------------------------- + +# - Where to Log - + +#log_destination = 'stderr' # Valid values are combinations of + # stderr, syslog and eventlog, + # depending on platform. + +# This is used when logging to stderr: +logging_collector = on # Enable capturing of stderr into log + # files + # (change requires restart) + +# These are only used if redirect_stderr is on: +log_directory = 'pg_log' # Directory where log files are written + # Can be absolute or relative to PGDATA +#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Log file name pattern. + # Can include strftime() escapes +log_truncate_on_rotation = on # If on, any existing log file of the same + # name as the new log file will be + # truncated rather than appended to. But + # such truncation only occurs on + # time-driven rotation, not on restarts + # or size-driven rotation. Default is + # off, meaning append to existing files + # in all cases. +log_rotation_age = 1d # Automatic rotation of logfiles will + # happen after that time. 0 to + # disable. +log_rotation_size = 0 # Automatic rotation of logfiles will + # happen after that much log + # output. 0 to disable. + +# These are relevant when logging to syslog: +#syslog_facility = 'LOCAL0' +#syslog_ident = 'postgres' + + +# - When to Log - + +#client_min_messages = notice # Values, in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # log + # notice + # warning + # error + +#log_min_messages = notice # Values, in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic + +#log_error_verbosity = default # terse, default, or verbose messages + +log_min_error_statement = log # Values in order of increasing severity: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic (effectively off) + +#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements + # and their durations. + +#silent_mode = off # DO NOT USE without syslog or + # redirect_stderr + # (change requires restart) + +# - What to Log - + +#debug_print_parse = off +#debug_print_rewritten = off +#debug_print_plan = off +#debug_pretty_print = off +#log_connections = off +#log_disconnections = off +#log_duration = off +log_line_prefix='%t %x %d : %h : ' + # Special values: + # %u = user name + # %d = database name + # %r = remote host and port + # %h = remote host + # %p = PID + # %t = timestamp (no milliseconds) + # %m = timestamp with milliseconds + # %i = command tag + # %c = session id + # %l = session line number + # %s = session start timestamp + # %x = transaction id + # %q = stop here in non-session + # processes + # %% = '%' + # e.g. '<%u%%%d> ' +#log_statement = 'none' # none, ddl, mod, all +#log_hostname = off + + +#--------------------------------------------------------------------------- +# RUNTIME STATISTICS +#--------------------------------------------------------------------------- + +# - Query/Index Statistics Collector - + +#stats_command_string = on +#update_process_title = on + +#stats_block_level = off +track_counts = on +#stats_reset_on_server_start = off # (change requires restart) + + +# - Statistics Monitoring - + +#log_parser_stats = off +#log_planner_stats = off +#log_executor_stats = off +#log_statement_stats = off + + +#--------------------------------------------------------------------------- +# AUTOVACUUM PARAMETERS +#--------------------------------------------------------------------------- + +autovacuum = on # enable autovacuum subprocess? + # 'on' requires stats_start_collector + # and stats_row_level to also be on +#autovacuum_naptime = 1min # time between autovacuum runs +#autovacuum_vacuum_threshold = 500 # min # of tuple updates before + # vacuum +#autovacuum_analyze_threshold = 250 # min # of tuple updates before + # analyze +#autovacuum_vacuum_scale_factor = 0.2 # fraction of rel size before + # vacuum +#autovacuum_analyze_scale_factor = 0.1 # fraction of rel size before + # analyze +#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum + # (change requires restart) +#autovacuum_vacuum_cost_delay = -1 # default vacuum cost delay for + # autovacuum, -1 means use + # vacuum_cost_delay +#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for + # autovacuum, -1 means use + # vacuum_cost_limit + + +#--------------------------------------------------------------------------- +# CLIENT CONNECTION DEFAULTS +#--------------------------------------------------------------------------- + +# - Statement Behavior - + +#search_path = '"$user",public' # schema names +#default_tablespace = '' # a tablespace name, '' uses + # the default +#check_function_bodies = on +#default_transaction_isolation = 'read committed' +#default_transaction_read_only = off +#statement_timeout = 0 # 0 is disabled +#vacuum_freeze_min_age = 100000000 + +# - Locale and Formatting - + +datestyle = 'iso, mdy' +timezone = GMT # actually, defaults to TZ + # environment setting +#timezone_abbreviations = 'Default' # select the set of available timezone + # abbreviations. Currently, there are + # Default + # Australia + # India + # However you can also create your own + # file in share/timezonesets/. +#extra_float_digits = 0 # min -15, max 2 +#client_encoding = 'en_US.UTF-8' # actually, defaults to database + # encoding + +# These settings are initialized by initdb -- they might be changed +lc_messages = 'en_US.UTF-8' # locale for system error message + # strings +lc_monetary = 'en_US.UTF-8' # locale for monetary formatting +lc_numeric = 'en_US.UTF-8' # locale for number formatting +lc_time = 'en_US.UTF-8' # locale for time formatting + +# - Other Defaults - + +#explain_pretty_print = on +#dynamic_library_path = '$libdir' +#local_preload_libraries = '' + + +#--------------------------------------------------------------------------- +# LOCK MANAGEMENT +#--------------------------------------------------------------------------- + +#deadlock_timeout = 1s +#max_locks_per_transaction = 64 # min 10 + # (change requires restart) +# Note: each lock table slot uses ~270 bytes of shared memory, and there are +# max_locks_per_transaction * (max_connections + max_prepared_transactions) +# lock table slots. + + +#--------------------------------------------------------------------------- +# VERSION/PLATFORM COMPATIBILITY +#--------------------------------------------------------------------------- + +# - Previous Postgres Versions - + +#add_missing_from = off +#array_nulls = on +#backslash_quote = safe_encoding # on, off, or safe_encoding +#default_with_oids = off +#escape_string_warning = on +#standard_conforming_strings = off +#regex_flavor = advanced # advanced, extended, or basic +#sql_inheritance = on + +# - Other Platforms & Clients - + +#transform_null_equals = off + + +#--------------------------------------------------------------------------- +# CUSTOMIZED OPTIONS +#--------------------------------------------------------------------------- + +#custom_variable_classes = '' # list of custom variable class names diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcc.so b/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcc.so old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcc.so.4 b/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcc.so.4 old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcs.so b/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcs.so old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcs.so.4 b/rpms/awips2.core/Installer.ldm/patch/lib/libcoroipcs.so.4 old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidclient.so b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidclient.so old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidclient.so.4 b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidclient.so.4 old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidcommon.so b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidcommon.so old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidcommon.so.4 b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidcommon.so.4 old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidmessaging.so b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidmessaging.so old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidmessaging.so.3 b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidmessaging.so.3 old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidtypes.so b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidtypes.so old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.ldm/patch/lib/libqpidtypes.so.1 b/rpms/awips2.core/Installer.ldm/patch/lib/libqpidtypes.so.1 old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.postgresql/pre-reqs/lib/libz.so b/rpms/awips2.core/Installer.postgresql/pre-reqs/lib/libz.so old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/Installer.postgresql/pre-reqs/lib/libz.so.1 b/rpms/awips2.core/Installer.postgresql/pre-reqs/lib/libz.so.1 old mode 100644 new mode 100755 diff --git a/rpms/awips2.core/deploy.builder/build.sh b/rpms/awips2.core/deploy.builder/build.sh old mode 100755 new mode 100644 diff --git a/rpms/awips2.edex/awips2.edex.ecl b/rpms/awips2.edex/awips2.edex.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rpms/awips2.qpid/SOURCES/queueCreator.sh b/rpms/awips2.qpid/SOURCES/queueCreator.sh old mode 100755 new mode 100644 index 704bdffe19..c8ccf29261 --- a/rpms/awips2.qpid/SOURCES/queueCreator.sh +++ b/rpms/awips2.qpid/SOURCES/queueCreator.sh @@ -37,11 +37,19 @@ do done #define 24 Meg persistence queues for ingest -QUEUES=('vaa' 'textlightning' 'tcs' 'tcg' 'taf' 'svrwx' 'sfcobs' 'redbook' 'recco' 'q2' 'profiler' 'poessounding' 'pirep' 'lsr' 'loctables' 'ldadprofiler' 'ldadmesonet' 'ldadhydro' 'goessounding' 'dhr' 'cwa' 'ccfp' 'bufrua' 'bufrssmi' 'bufrsigwx' 'bufrquikscat' 'bufrncwf' 'bufrmthdw' 'bufrmos' 'bufrhdw' 'bufrascat' 'binlightning' 'airmet' 'airep' 'acars' 'Warning' 'ShefStaged' 'Satellite') +QUEUES=('vaa' 'textlightning' 'tcs' 'tcg' 'taf' 'svrwx' 'sfcobs' 'redbook' 'recco' 'q2' 'profiler' 'poessounding' 'pirep' 'lsr' 'loctables' 'ldadprofiler' 'ldadmesonet' 'ldadhydro' 'goessounding' 'cwa' 'ccfp' 'bufrua' 'bufrssmi' 'bufrsigwx' 'bufrquikscat' 'bufrncwf' 'bufrmthdw' 'bufrmos' 'bufrhdw' 'bufrascat' 'binlightning' 'airmet' 'airep' 'acars' 'Warning' 'ShefStaged' 'Satellite') for queue in ${QUEUES[*]}; do echo "Creating queue Ingest.$queue" qpid-config --broker-addr localhost:$port add queue Ingest.$queue --durable --file-count 16 --file-size 24 done +#define 24 Meg persistence queues for HPE ingest +QUEUES=('Ingest.dhr' 'dhrProcess') +for queue in ${QUEUES[*]}; +do + echo "Creating queue $queue" + qpid-config add queue $queue --durable --file-count 16 --file-size 24 +done + diff --git a/rpms/legal/FOSS_licenses/CherryPy/CheryPyLICENSE.txt b/rpms/legal/FOSS_licenses/CherryPy/CheryPyLICENSE.txt index 196dd58083..3a71a5d4df 100755 --- a/rpms/legal/FOSS_licenses/CherryPy/CheryPyLICENSE.txt +++ b/rpms/legal/FOSS_licenses/CherryPy/CheryPyLICENSE.txt @@ -1,25 +1,25 @@ -Copyright (c) 2004-2009, CherryPy Team (team@cherrypy.org) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the CherryPy Team nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2004-2009, CherryPy Team (team@cherrypy.org) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the CherryPy Team nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/rpms/legal/FOSS_licenses/apache/Apache1.1.txt b/rpms/legal/FOSS_licenses/apache/Apache1.1.txt index 26190d1261..42f5843f18 100755 --- a/rpms/legal/FOSS_licenses/apache/Apache1.1.txt +++ b/rpms/legal/FOSS_licenses/apache/Apache1.1.txt @@ -1,28 +1,28 @@ -Apache Software License -Version 1.1 - -Copyright (c) 2000 The Apache Software Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: - -"This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." - -Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - -4. The names "Apache" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - -5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - --------------------------------------------------------------------------------- - -This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache Software Foundation, please see . +Apache Software License +Version 1.1 + +Copyright (c) 2000 The Apache Software Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: + +"This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." + +Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. + +4. The names "Apache" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. + +5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +-------------------------------------------------------------------------------- + +This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache Software Foundation, please see . diff --git a/rpms/legal/FOSS_licenses/apache/LICENSE-2.0.txt b/rpms/legal/FOSS_licenses/apache/LICENSE-2.0.txt index 29f81d812f..261eeb9e9f 100644 --- a/rpms/legal/FOSS_licenses/apache/LICENSE-2.0.txt +++ b/rpms/legal/FOSS_licenses/apache/LICENSE-2.0.txt @@ -1,201 +1,201 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/rpms/legal/FOSS_licenses/jai_image_io/LICENSE-jai_imageio.txt b/rpms/legal/FOSS_licenses/jai_image_io/LICENSE-jai_imageio.txt index 3763c3088c..76531c808c 100755 --- a/rpms/legal/FOSS_licenses/jai_image_io/LICENSE-jai_imageio.txt +++ b/rpms/legal/FOSS_licenses/jai_image_io/LICENSE-jai_imageio.txt @@ -1,135 +1,135 @@ -Sun Microsystems, Inc. ("Sun") ENTITLEMENT for SOFTWARE - -Licensee/Company: Entity receiving Software. - -Effective Date: Date of delivery of the Software to You. - -Software: Java Advanced Imaging Image I/O Tools 1.1. - -License Term: Perpetual (subject to termination under the SLA). - -Licensed Unit: Software Copy. - -Licensed unit Count: Unlimited. - -Permitted Uses: - -1. You may reproduce and use the Software for Your own Individual, Commercial and Research and Instructional Use only for the purposes of designing, developing, testing, and running Your applets and applications ("Programs"). - -2. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the Software's documentation, You may reproduce and distribute portions of Software identified as a redistributable in the documentation (each a "Redistributable"), provided that You comply with the following (note that You may be entitled to reproduce and distribute other portions of the Software not defined in the documentation as a Redistributable under certain other licenses as described in the THIRDPARTYLICENSEREADME, if applicable): - -(a) You distribute Redistributable complete and unmodified and only bundled as part of Your Programs, - -(b) Your Programs add significant and primary functionality to the Redistributable, - -(c) You distribute Redistributable for the sole purpose of running Your Programs, - -(d) You do not distribute additional software intended to replace any -component(s) of the Redistributable, - -(e) You do not remove or alter any proprietary legends or notices contained in or on the Redistributable. - -(f) You only distribute the Redistributable subject to a license agreement that protects Sun's interests consistent with the terms contained in this -Agreement, and - -(g) You agree to defend and indemnify Sun and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of any and all Programs and/or Redistributable. - -3. Java Technology Restrictions. You may not create, modify, or change the behavior of, or authorize Your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "sun" or similar convention as specified by Sun in any naming convention designation. - - -Sun Microsystems, Inc. ("Sun") -SOFTWARE LICENSE AGREEMENT - -READ THE TERMS OF THIS AGREEMENT ("AGREEMENT") CAREFULLY BEFORE OPENING SOFTWARE MEDIA PACKAGE. BY OPENING SOFTWARE MEDIA PACKAGE, YOU AGREE TO THE TERMS OF THIS AGREEMENT. IF YOU ARE ACCESSING SOFTWARE ELECTRONICALLY, INDICATE YOUR ACCEPTANCE OF THESE TERMS BY SELECTING THE "ACCEPT" BUTTON AT THE END OF THIS AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS, PROMPTLY RETURN THE UNUSED SOFTWARE TO YOUR PLACE OF PURCHASE FOR A REFUND OR, IF SOFTWARE IS ACCESSED ELECTRONICALLY, SELECT THE "DECLINE" (OR "EXIT") BUTTON AT THE END OF THIS AGREEMENT. IF YOU HAVE SEPARATELY AGREED TO LICENSE TERMS ("MASTER TERMS") FOR YOUR LICENSE TO THIS SOFTWARE, THEN SECTIONS 1-6 OF THIS AGREEMENT ("SUPPLEMENTAL LICENSE TERMS") SHALL SUPPLEMENT AND SUPERSEDE THE MASTER TERMS IN RELATION TO THIS SOFTWARE. - -1. Definitions. - -(a) "Entitlement" means the collective set of applicable documents authorized by Sun evidencing your obligation to pay associated fees (if any) for the license, associated Services, and the authorized scope of use of Software under this Agreement. - -(b) "Licensed Unit" means the unit of measure by which your use of Software and/or Service is licensed, as described in your Entitlement. - -(c) "Permitted Use" means the licensed Software use(s) authorized in this Agreement as specified in your Entitlement. The Permitted Use for any bundled Sun software not specified in your Entitlement will be evaluation use as provided in Section 3. - -(d) "Service" means the service(s) that Sun or its delegate will provide, if any, as selected in your Entitlement and as further described in the applicable service listings at www.sun.com/service/servicelist. - -(e) "Software" means the Sun software described in your Entitlement. Also, certain software may be included for evaluation use under Section 3. - -(f) "You" and "Your" means the individual or legal entity specified in the Entitlement, or for evaluation purposes, the entity performing the evaluation. - -2. License Grant and Entitlement. - -Subject to the terms of your Entitlement, Sun grants you a nonexclusive, nontransferable limited license to use Software for its Permitted Use for the license term. Your Entitlement will specify (a) Software licensed, (b) the Permitted Use, (c) the license term, and (d) the Licensed Units. - -Additionally, if your Entitlement includes Services, then it will also specify the (e) Service and (f) service term. - -If your rights to Software or Services are limited in duration and the date such rights begin is other than the purchase date, your Entitlement will provide that beginning date(s). - -The Entitlement may be delivered to you in various ways depending on the manner in which you obtain Software and Services, for example, the Entitlement may be provided in your receipt, invoice or your contract with Sun or authorized Sun reseller. It may also be in electronic format if you download Software. - -3. Permitted Use. - -As selected in your Entitlement, one or more of the following Permitted Uses will apply to your use of Software. Unless you have an Entitlement that expressly permits it, you may not use Software for any of the other Permitted Uses. If you don't have an Entitlement, or if your Entitlement doesn't cover additional software delivered to you, then such software is for your Evaluation Use. - -(a) Evaluation Use. You may evaluate Software internally for a period of 90 days from your first use. - -(b) Research and Instructional Use. You may use Software internally to design, develop and test, and also to provide instruction on such uses. - -(c) Individual Use. You may use Software internally for personal, individual use. - -(d) Commercial Use. You may use Software internally for your own commercial purposes. - -(e) Service Provider Use. You may make Software functionality accessible (but not by providing Software itself or through outsourcing services) to your end users in an extranet deployment, but not to your affiliated companies or to government agencies. - -4. Licensed Units. - -Your Permitted Use is limited to the number of Licensed Units stated in your Entitlement. If you require additional Licensed Units, you will need additional Entitlement(s). - -5. Restrictions. - -(a) The copies of Software provided to you under this Agreement are licensed, not sold, to you by Sun. Sun reserves all rights not expressly granted. (b) You may make a single archival copy of Software, but otherwise may not copy, modify, or distribute Software. However if the Sun documentation accompanying Software lists specific portions of Software, such as header files, class libraries, reference source code, and/or redistributable files, that may be handled differently, you may do so only as provided in the Sun documentation. (c) You may not rent, lease, lend or encumber Software. (d) Unless enforcement is prohibited by applicable law, you may not decompile, or reverse engineer Software. (e) The terms and conditions of this Agreement will apply to any Software updates, provided to you at Sun's discretion, that replace and/or supplement the original Software, unless such update contains a separate license. (f) You may not publish or provide the results of any benchmark or comparison tests run on Software to any third party without the prior written consent of Sun. (g) Software is confidential and copyrighted. (h) Unless otherwise specified, if Software is delivered with embedded or bundled software that enables functionality of Software, you may not use such software on a stand-alone basis or use any portion of such software to interoperate with any program(s) other than Software. (i) Software may contain programs that perform automated collection of system data and/or automated software updating services. System data collected through such programs may be used by Sun, its subcontractors, and its service delivery partners for the purpose of providing you with remote system services and/or improving Sun's software and systems. (j) Software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility and Sun and its licensors disclaim any express or implied warranty of fitness for such uses. (k) No right, title or interest in or to any trademark, service mark, logo or trade name of Sun or its licensors is granted under this Agreement. - -6. Term and Termination. - -The license and service term are set forth in your Entitlement(s). Your rights under this Agreement will terminate immediately without notice from Sun if you materially breach it or take any action in derogation of Sun's and/or its licensors' rights to Software. Sun may terminate this Agreement should any Software become, or in Sun's reasonable opinion likely to become, the subject of a claim of intellectual property infringement or trade secret misappropriation. Upon termination, you will cease use of, and destroy, Software and confirm compliance in writing to Sun. Sections 1, 5, 6, 7, and 9-15 will survive termination of the Agreement. - -7. Java Compatibility and Open Source. - -Software may contain Java technology. You may not create additional classes to, or modifications of, the Java technology, except under compatibility requirements available under a separate agreement available at www.java.net. - -Sun supports and benefits from the global community of open source developers, and thanks the community for its important contributions and open standards-based technology, which Sun has adopted into many of its products. - -Please note that portions of Software may be provided with notices and open source licenses from such communities and third parties that govern the use of those portions, and any licenses granted hereunder do not alter any rights and obligations you may have under such open source licenses, however, the disclaimer of warranty and limitation of liability provisions in this Agreement will apply to all Software in this distribution. - -8. Limited Warranty. - -Sun warrants to you that for a period of 90 days from the date of purchase, as evidenced by a copy of the receipt, the media on which Software is furnished (if any) will be free of defects in materials and workmanship under normal use. Except for the foregoing, Software is provided "AS IS". Your exclusive remedy and Sun's entire liability under this limited warranty will be at Sun's option to replace Software media or refund the fee paid for Software. Some states do not allow limitations on certain implied warranties, so the above may not apply to you. This limited warranty gives you specific legal rights. You may have others, which vary from state to state. - -9. Disclaimer of Warranty. - -UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID. - -10. Limitation of Liability. - -TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event will Sun's liability to you, whether in contract, tort (including negligence), or otherwise, exceed the amount paid by you for Software under this Agreement. The foregoing limitations will apply even if the above stated warranty fails of its essential purpose. Some states do not allow the exclusion of incidental or consequential damages, so some of the terms above may not be applicable to you. - -11. Export Regulations. - -All Software, documents, technical data, and any other materials delivered under this Agreement are subject to U.S. export control laws and may be subject to export or import regulations in other countries. You agree to comply strictly with these laws and regulations and acknowledge that you have the responsibility to obtain any licenses to export, re-export, or import as may be required after delivery to you. - -12. U.S. Government Restricted Rights. - -If Software is being acquired by or on behalf of the U.S. Government or by a U.S. Government prime contractor or subcontractor (at any tier), then the Government's rights in Software and accompanying documentation will be only as set forth in this Agreement; this is in accordance with 48 CFR 227.7201 through 227.7202-4 (for Department of Defense (DOD) acquisitions) and with 48 CFR 2.101 and 12.212 (for non-DOD acquisitions). - -13. Governing Law. - -Any action related to this Agreement will be governed by California law and controlling U.S. federal law. No choice of law rules of any jurisdiction will apply. - -14. Severability. - -If any provision of this Agreement is held to be unenforceable, this Agreement will remain in effect with the provision omitted, unless omission would frustrate the intent of the parties, in which case this Agreement will immediately terminate. - -15. Integration. - -This Agreement, including any terms contained in your Entitlement, is the entire agreement between you and Sun relating to its subject matter. It supersedes all prior or contemporaneous oral or written communications, proposals, representations and warranties and prevails over any conflicting or additional terms of any quote, order, acknowledgment, or other communication between the parties relating to its subject matter during the term of this Agreement. No modification of this Agreement will be binding, unless in writing and signed by an authorized representative of each party. - -Please contact Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054 if you have questions. +Sun Microsystems, Inc. ("Sun") ENTITLEMENT for SOFTWARE + +Licensee/Company: Entity receiving Software. + +Effective Date: Date of delivery of the Software to You. + +Software: Java Advanced Imaging Image I/O Tools 1.1. + +License Term: Perpetual (subject to termination under the SLA). + +Licensed Unit: Software Copy. + +Licensed unit Count: Unlimited. + +Permitted Uses: + +1. You may reproduce and use the Software for Your own Individual, Commercial and Research and Instructional Use only for the purposes of designing, developing, testing, and running Your applets and applications ("Programs"). + +2. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the Software's documentation, You may reproduce and distribute portions of Software identified as a redistributable in the documentation (each a "Redistributable"), provided that You comply with the following (note that You may be entitled to reproduce and distribute other portions of the Software not defined in the documentation as a Redistributable under certain other licenses as described in the THIRDPARTYLICENSEREADME, if applicable): + +(a) You distribute Redistributable complete and unmodified and only bundled as part of Your Programs, + +(b) Your Programs add significant and primary functionality to the Redistributable, + +(c) You distribute Redistributable for the sole purpose of running Your Programs, + +(d) You do not distribute additional software intended to replace any +component(s) of the Redistributable, + +(e) You do not remove or alter any proprietary legends or notices contained in or on the Redistributable. + +(f) You only distribute the Redistributable subject to a license agreement that protects Sun's interests consistent with the terms contained in this +Agreement, and + +(g) You agree to defend and indemnify Sun and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of any and all Programs and/or Redistributable. + +3. Java Technology Restrictions. You may not create, modify, or change the behavior of, or authorize Your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "sun" or similar convention as specified by Sun in any naming convention designation. + + +Sun Microsystems, Inc. ("Sun") +SOFTWARE LICENSE AGREEMENT + +READ THE TERMS OF THIS AGREEMENT ("AGREEMENT") CAREFULLY BEFORE OPENING SOFTWARE MEDIA PACKAGE. BY OPENING SOFTWARE MEDIA PACKAGE, YOU AGREE TO THE TERMS OF THIS AGREEMENT. IF YOU ARE ACCESSING SOFTWARE ELECTRONICALLY, INDICATE YOUR ACCEPTANCE OF THESE TERMS BY SELECTING THE "ACCEPT" BUTTON AT THE END OF THIS AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS, PROMPTLY RETURN THE UNUSED SOFTWARE TO YOUR PLACE OF PURCHASE FOR A REFUND OR, IF SOFTWARE IS ACCESSED ELECTRONICALLY, SELECT THE "DECLINE" (OR "EXIT") BUTTON AT THE END OF THIS AGREEMENT. IF YOU HAVE SEPARATELY AGREED TO LICENSE TERMS ("MASTER TERMS") FOR YOUR LICENSE TO THIS SOFTWARE, THEN SECTIONS 1-6 OF THIS AGREEMENT ("SUPPLEMENTAL LICENSE TERMS") SHALL SUPPLEMENT AND SUPERSEDE THE MASTER TERMS IN RELATION TO THIS SOFTWARE. + +1. Definitions. + +(a) "Entitlement" means the collective set of applicable documents authorized by Sun evidencing your obligation to pay associated fees (if any) for the license, associated Services, and the authorized scope of use of Software under this Agreement. + +(b) "Licensed Unit" means the unit of measure by which your use of Software and/or Service is licensed, as described in your Entitlement. + +(c) "Permitted Use" means the licensed Software use(s) authorized in this Agreement as specified in your Entitlement. The Permitted Use for any bundled Sun software not specified in your Entitlement will be evaluation use as provided in Section 3. + +(d) "Service" means the service(s) that Sun or its delegate will provide, if any, as selected in your Entitlement and as further described in the applicable service listings at www.sun.com/service/servicelist. + +(e) "Software" means the Sun software described in your Entitlement. Also, certain software may be included for evaluation use under Section 3. + +(f) "You" and "Your" means the individual or legal entity specified in the Entitlement, or for evaluation purposes, the entity performing the evaluation. + +2. License Grant and Entitlement. + +Subject to the terms of your Entitlement, Sun grants you a nonexclusive, nontransferable limited license to use Software for its Permitted Use for the license term. Your Entitlement will specify (a) Software licensed, (b) the Permitted Use, (c) the license term, and (d) the Licensed Units. + +Additionally, if your Entitlement includes Services, then it will also specify the (e) Service and (f) service term. + +If your rights to Software or Services are limited in duration and the date such rights begin is other than the purchase date, your Entitlement will provide that beginning date(s). + +The Entitlement may be delivered to you in various ways depending on the manner in which you obtain Software and Services, for example, the Entitlement may be provided in your receipt, invoice or your contract with Sun or authorized Sun reseller. It may also be in electronic format if you download Software. + +3. Permitted Use. + +As selected in your Entitlement, one or more of the following Permitted Uses will apply to your use of Software. Unless you have an Entitlement that expressly permits it, you may not use Software for any of the other Permitted Uses. If you don't have an Entitlement, or if your Entitlement doesn't cover additional software delivered to you, then such software is for your Evaluation Use. + +(a) Evaluation Use. You may evaluate Software internally for a period of 90 days from your first use. + +(b) Research and Instructional Use. You may use Software internally to design, develop and test, and also to provide instruction on such uses. + +(c) Individual Use. You may use Software internally for personal, individual use. + +(d) Commercial Use. You may use Software internally for your own commercial purposes. + +(e) Service Provider Use. You may make Software functionality accessible (but not by providing Software itself or through outsourcing services) to your end users in an extranet deployment, but not to your affiliated companies or to government agencies. + +4. Licensed Units. + +Your Permitted Use is limited to the number of Licensed Units stated in your Entitlement. If you require additional Licensed Units, you will need additional Entitlement(s). + +5. Restrictions. + +(a) The copies of Software provided to you under this Agreement are licensed, not sold, to you by Sun. Sun reserves all rights not expressly granted. (b) You may make a single archival copy of Software, but otherwise may not copy, modify, or distribute Software. However if the Sun documentation accompanying Software lists specific portions of Software, such as header files, class libraries, reference source code, and/or redistributable files, that may be handled differently, you may do so only as provided in the Sun documentation. (c) You may not rent, lease, lend or encumber Software. (d) Unless enforcement is prohibited by applicable law, you may not decompile, or reverse engineer Software. (e) The terms and conditions of this Agreement will apply to any Software updates, provided to you at Sun's discretion, that replace and/or supplement the original Software, unless such update contains a separate license. (f) You may not publish or provide the results of any benchmark or comparison tests run on Software to any third party without the prior written consent of Sun. (g) Software is confidential and copyrighted. (h) Unless otherwise specified, if Software is delivered with embedded or bundled software that enables functionality of Software, you may not use such software on a stand-alone basis or use any portion of such software to interoperate with any program(s) other than Software. (i) Software may contain programs that perform automated collection of system data and/or automated software updating services. System data collected through such programs may be used by Sun, its subcontractors, and its service delivery partners for the purpose of providing you with remote system services and/or improving Sun's software and systems. (j) Software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility and Sun and its licensors disclaim any express or implied warranty of fitness for such uses. (k) No right, title or interest in or to any trademark, service mark, logo or trade name of Sun or its licensors is granted under this Agreement. + +6. Term and Termination. + +The license and service term are set forth in your Entitlement(s). Your rights under this Agreement will terminate immediately without notice from Sun if you materially breach it or take any action in derogation of Sun's and/or its licensors' rights to Software. Sun may terminate this Agreement should any Software become, or in Sun's reasonable opinion likely to become, the subject of a claim of intellectual property infringement or trade secret misappropriation. Upon termination, you will cease use of, and destroy, Software and confirm compliance in writing to Sun. Sections 1, 5, 6, 7, and 9-15 will survive termination of the Agreement. + +7. Java Compatibility and Open Source. + +Software may contain Java technology. You may not create additional classes to, or modifications of, the Java technology, except under compatibility requirements available under a separate agreement available at www.java.net. + +Sun supports and benefits from the global community of open source developers, and thanks the community for its important contributions and open standards-based technology, which Sun has adopted into many of its products. + +Please note that portions of Software may be provided with notices and open source licenses from such communities and third parties that govern the use of those portions, and any licenses granted hereunder do not alter any rights and obligations you may have under such open source licenses, however, the disclaimer of warranty and limitation of liability provisions in this Agreement will apply to all Software in this distribution. + +8. Limited Warranty. + +Sun warrants to you that for a period of 90 days from the date of purchase, as evidenced by a copy of the receipt, the media on which Software is furnished (if any) will be free of defects in materials and workmanship under normal use. Except for the foregoing, Software is provided "AS IS". Your exclusive remedy and Sun's entire liability under this limited warranty will be at Sun's option to replace Software media or refund the fee paid for Software. Some states do not allow limitations on certain implied warranties, so the above may not apply to you. This limited warranty gives you specific legal rights. You may have others, which vary from state to state. + +9. Disclaimer of Warranty. + +UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID. + +10. Limitation of Liability. + +TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event will Sun's liability to you, whether in contract, tort (including negligence), or otherwise, exceed the amount paid by you for Software under this Agreement. The foregoing limitations will apply even if the above stated warranty fails of its essential purpose. Some states do not allow the exclusion of incidental or consequential damages, so some of the terms above may not be applicable to you. + +11. Export Regulations. + +All Software, documents, technical data, and any other materials delivered under this Agreement are subject to U.S. export control laws and may be subject to export or import regulations in other countries. You agree to comply strictly with these laws and regulations and acknowledge that you have the responsibility to obtain any licenses to export, re-export, or import as may be required after delivery to you. + +12. U.S. Government Restricted Rights. + +If Software is being acquired by or on behalf of the U.S. Government or by a U.S. Government prime contractor or subcontractor (at any tier), then the Government's rights in Software and accompanying documentation will be only as set forth in this Agreement; this is in accordance with 48 CFR 227.7201 through 227.7202-4 (for Department of Defense (DOD) acquisitions) and with 48 CFR 2.101 and 12.212 (for non-DOD acquisitions). + +13. Governing Law. + +Any action related to this Agreement will be governed by California law and controlling U.S. federal law. No choice of law rules of any jurisdiction will apply. + +14. Severability. + +If any provision of this Agreement is held to be unenforceable, this Agreement will remain in effect with the provision omitted, unless omission would frustrate the intent of the parties, in which case this Agreement will immediately terminate. + +15. Integration. + +This Agreement, including any terms contained in your Entitlement, is the entire agreement between you and Sun relating to its subject matter. It supersedes all prior or contemporaneous oral or written communications, proposals, representations and warranties and prevails over any conflicting or additional terms of any quote, order, acknowledgment, or other communication between the parties relating to its subject matter during the term of this Agreement. No modification of this Agreement will be binding, unless in writing and signed by an authorized representative of each party. + +Please contact Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054 if you have questions. diff --git a/rpms/legal/FOSS_licenses/java/COPYRIGHT.txt b/rpms/legal/FOSS_licenses/java/COPYRIGHT.txt index a93ebcd6fe..dfeefa0a01 100755 --- a/rpms/legal/FOSS_licenses/java/COPYRIGHT.txt +++ b/rpms/legal/FOSS_licenses/java/COPYRIGHT.txt @@ -1,81 +1,81 @@ -Copyright \251 2008 Sun Microsystems, Inc., 4150 Network Circle, Santa -Clara, California 95054, U.S.A. All rights reserved. - -Sun Microsystems, Inc. has intellectual property rights relating to -technology embodied in the product that is described in this document. -In particular, and without limitation, these intellectual property -rights may include one or more of the U.S. patents listed at -http://www.sun.com/patents and one or more additional patents or -pending patent applications in the U.S. and in other countries. - -THIS PRODUCT CONTAINS CONFIDENTIAL INFORMATION AND TRADE SECRETS OF SUN -MICROSYSTEMS, INC. USE, DISCLOSURE OR REPRODUCTION IS PROHIBITED -WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SUN MICROSYSTEMS, INC. - -U.S. Government Rights - Commercial software. Government users are -subject to the Sun Microsystems, Inc. standard license agreement and -applicable provisions of the FAR and its supplements. - -Use is subject to license terms. - -This distribution may include materials developed by third parties. - -Sun, Sun Microsystems, the Sun logo, Java, Jini and Java SE are -trademarks or registered trademarks of Sun Microsystems, Inc. in the -U.S. and other countries. - -Products covered by and information contained in this service manual -are controlled by U.S. Export Control laws and may be subject to the -export or import laws in other countries. Nuclear, missile, chemical -biological weapons or nuclear maritime end uses or end users, whether -direct or indirect, are strictly prohibited. Export or reexport to -countries subject to U.S. embargo or to entities identified on U.S. -export exclusion lists, including, but not limited to, the denied -persons and specially designated nationals lists is strictly -prohibited. - - -Copyright © 2008 Sun Microsystems, Inc., 4150 Network Circle, Santa -Clara, California 95054, Etats-Unis. Tous droits réservés. - -Sun Microsystems, Inc. détient les droits de propriété intellectuelle -relatifs à la technologie incorporée dans le produit qui est décrit dans -ce document. En particulier, et ce sans limitation, ces droits de -propriété intellectuelle peuvent inclure un ou plus des brevets américains -listés à l'adresse http://www.sun.com/patents et un ou les brevets -supplémentaires ou les applications de brevet en attente aux Etats - -Unis et dans les autres pays. - -CE PRODUIT CONTIENT DES INFORMATIONS CONFIDENTIELLES ET DES SECRETS -COMMERCIAUX DE SUN MICROSYSTEMS, INC. SON UTILISATION, SA DIVULGATION -ET SA REPRODUCTION SONT INTERDITES SANS L AUTORISATION EXPRESSE, ECRITE -ET PREALABLE DE SUN MICROSYSTEMS, INC. - -Droits du gouvernement des États-Unis - logiciel commercial. Les -droits des utilisateur du gouvernement des États-Unis sont -soumis aux termes de la licence standard Sun Microsystems et -aux conditions appliquées de la FAR et de ces compléments. - -L'utilisation est soumise aux termes de la Licence. - -Cette distribution peut inclure des élements développés par des tiers. - -Sun, Sun Microsystems, le logo Sun, Java, Jini et Java SE sont des -marques de fabrique ou des marques déposées de Sun Microsystems, Inc. aux -Etats-Unis et dans d'autres pays. - -Les produits qui font l'objet de ce manuel d'entretien et les -informations qu'il contient sont regis par la legislation americaine en -matiere de controle des exportations et peuvent etre soumis au droit -d'autres pays dans le domaine des exportations et importations. Les -utilisations finales, ou utilisateurs finaux, pour des armes -nucleaires, des missiles, des armes biologiques et chimiques ou du -nucleaire maritime, directement ou indirectement, sont strictement -interdites. Les exportations ou reexportations vers des pays sous -embargo des Etats-Unis, ou vers des entites figurant sur les listes -d'exclusion d'exportation americaines, y compris, mais de maniere non -exclusive, la liste de personnes qui font objet d'un ordre de ne pas -participer, d'une facon directe ou indirecte, aux exportations des -produits ou des services qui sont regi par la legislation americaine en -matiere de controle des exportations et la liste de ressortissants -specifiquement designes, sont rigoureusement interdites. +Copyright \251 2008 Sun Microsystems, Inc., 4150 Network Circle, Santa +Clara, California 95054, U.S.A. All rights reserved. + +Sun Microsystems, Inc. has intellectual property rights relating to +technology embodied in the product that is described in this document. +In particular, and without limitation, these intellectual property +rights may include one or more of the U.S. patents listed at +http://www.sun.com/patents and one or more additional patents or +pending patent applications in the U.S. and in other countries. + +THIS PRODUCT CONTAINS CONFIDENTIAL INFORMATION AND TRADE SECRETS OF SUN +MICROSYSTEMS, INC. USE, DISCLOSURE OR REPRODUCTION IS PROHIBITED +WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SUN MICROSYSTEMS, INC. + +U.S. Government Rights - Commercial software. Government users are +subject to the Sun Microsystems, Inc. standard license agreement and +applicable provisions of the FAR and its supplements. + +Use is subject to license terms. + +This distribution may include materials developed by third parties. + +Sun, Sun Microsystems, the Sun logo, Java, Jini and Java SE are +trademarks or registered trademarks of Sun Microsystems, Inc. in the +U.S. and other countries. + +Products covered by and information contained in this service manual +are controlled by U.S. Export Control laws and may be subject to the +export or import laws in other countries. Nuclear, missile, chemical +biological weapons or nuclear maritime end uses or end users, whether +direct or indirect, are strictly prohibited. Export or reexport to +countries subject to U.S. embargo or to entities identified on U.S. +export exclusion lists, including, but not limited to, the denied +persons and specially designated nationals lists is strictly +prohibited. + + +Copyright © 2008 Sun Microsystems, Inc., 4150 Network Circle, Santa +Clara, California 95054, Etats-Unis. Tous droits réservés. + +Sun Microsystems, Inc. détient les droits de propriété intellectuelle +relatifs à la technologie incorporée dans le produit qui est décrit dans +ce document. En particulier, et ce sans limitation, ces droits de +propriété intellectuelle peuvent inclure un ou plus des brevets américains +listés à l'adresse http://www.sun.com/patents et un ou les brevets +supplémentaires ou les applications de brevet en attente aux Etats - +Unis et dans les autres pays. + +CE PRODUIT CONTIENT DES INFORMATIONS CONFIDENTIELLES ET DES SECRETS +COMMERCIAUX DE SUN MICROSYSTEMS, INC. SON UTILISATION, SA DIVULGATION +ET SA REPRODUCTION SONT INTERDITES SANS L AUTORISATION EXPRESSE, ECRITE +ET PREALABLE DE SUN MICROSYSTEMS, INC. + +Droits du gouvernement des États-Unis - logiciel commercial. Les +droits des utilisateur du gouvernement des États-Unis sont +soumis aux termes de la licence standard Sun Microsystems et +aux conditions appliquées de la FAR et de ces compléments. + +L'utilisation est soumise aux termes de la Licence. + +Cette distribution peut inclure des élements développés par des tiers. + +Sun, Sun Microsystems, le logo Sun, Java, Jini et Java SE sont des +marques de fabrique ou des marques déposées de Sun Microsystems, Inc. aux +Etats-Unis et dans d'autres pays. + +Les produits qui font l'objet de ce manuel d'entretien et les +informations qu'il contient sont regis par la legislation americaine en +matiere de controle des exportations et peuvent etre soumis au droit +d'autres pays dans le domaine des exportations et importations. Les +utilisations finales, ou utilisateurs finaux, pour des armes +nucleaires, des missiles, des armes biologiques et chimiques ou du +nucleaire maritime, directement ou indirectement, sont strictement +interdites. Les exportations ou reexportations vers des pays sous +embargo des Etats-Unis, ou vers des entites figurant sur les listes +d'exclusion d'exportation americaines, y compris, mais de maniere non +exclusive, la liste de personnes qui font objet d'un ordre de ne pas +participer, d'une facon directe ou indirecte, aux exportations des +produits ou des services qui sont regi par la legislation americaine en +matiere de controle des exportations et la liste de ressortissants +specifiquement designes, sont rigoureusement interdites. diff --git a/rpms/legal/FOSS_licenses/java/LICENSE.txt b/rpms/legal/FOSS_licenses/java/LICENSE.txt index c78b042fc5..e51e07f5cd 100755 --- a/rpms/legal/FOSS_licenses/java/LICENSE.txt +++ b/rpms/legal/FOSS_licenses/java/LICENSE.txt @@ -1,342 +1,342 @@ -Sun Microsystems, Inc. Binary Code License Agreement - -for the JAVA SE DEVELOPMENT KIT (JDK), VERSION 6 - -SUN MICROSYSTEMS, INC. ("SUN") IS WILLING TO LICENSE THE -SOFTWARE IDENTIFIED BELOW TO YOU ONLY UPON THE CONDITION -THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY -CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS -(COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT -CAREFULLY. BY DOWNLOADING OR INSTALLING THIS SOFTWARE, YOU -ACCEPT THE TERMS OF THE AGREEMENT. INDICATE ACCEPTANCE BY -SELECTING THE "ACCEPT" BUTTON AT THE BOTTOM OF THE -AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY ALL THE -TERMS, SELECT THE "DECLINE" BUTTON AT THE BOTTOM OF THE -AGREEMENT AND THE DOWNLOAD OR INSTALL PROCESS WILL NOT -CONTINUE. - -1. DEFINITIONS. "Software" means the identified above in -binary form, any other machine readable materials -(including, but not limited to, libraries, source files, -header files, and data files), any updates or error -corrections provided by Sun, and any user manuals, -programming guides and other documentation provided to you -by Sun under this Agreement. "General Purpose Desktop -Computers and Servers" means computers, including desktop, -laptop and tablet computers, or servers, used for general -computing functions under end user control (such as but not -specifically limited to email, general purpose Internet -browsing, and office suite productivity tools). -The use of Software in systems and solutions that provide -dedicated functionality (other than as mentioned above) or -designed for use in embedded or function-specific software -applications, for example but not limited to: Software -embedded in or bundled with industrial control systems, -wireless mobile telephones, wireless handheld devices, -kiosks, TV/STB, Blu-ray Disc devices, telematics and -network control switching equipment, printers and storage -management systems, and other related systems are excluded -from this definition and not licensed under this -Agreement. "Programs" means Java technology applets and -applications intended to run on the Java Platform Standard -Edition (Java SE) platform on Java-enabled General Purpose -Desktop Computers and Servers. - -2. LICENSE TO USE. Subject to the terms and conditions of -this Agreement, including, but not limited to the Java -Technology Restrictions of the Supplemental License Terms, -Sun grants you a non-exclusive, non-transferable, limited -license without license fees to reproduce and use -internally Software complete and unmodified for the sole -purpose of running Programs. Additional licenses for -developers and/or publishers are granted in the -Supplemental License Terms. - -3. RESTRICTIONS. Software is confidential and copyrighted. -Title to Software and all associated intellectual property -rights is retained by Sun and/or its licensors. Unless -enforcement is prohibited by applicable law, you may not -modify, decompile, or reverse engineer Software. You -acknowledge that Licensed Software is not designed or -intended for use in the design, construction, operation or -maintenance of any nuclear facility. Sun Microsystems, Inc. -disclaims any express or implied warranty of fitness for -such uses. No right, title or interest in or to any -trademark, service mark, logo or trade name of Sun or its -licensors is granted under this Agreement. Additional -restrictions for developers and/or publishers licenses are -set forth in the Supplemental License Terms. - -4. LIMITED WARRANTY. Sun warrants to you that for a period -of ninety (90) days from the date of purchase, as evidenced -by a copy of the receipt, the media on which Software is -furnished (if any) will be free of defects in materials and -workmanship under normal use. Except for the foregoing, -Software is provided "AS IS". Your exclusive remedy and -Sun's entire liability under this limited warranty will be -at Sun's option to replace Software media or refund the fee -paid for Software. Any implied warranties on the Software -are limited to 90 days. Some states do not allow -limitations on duration of an implied warranty, so the -above may not apply to you. This limited warranty gives you -specific legal rights. You may have others, which vary from -state to state. - -5. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS -AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, -REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED -WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE -EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY -INVALID. - -6. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY -LAW, IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR -ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, -CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER -CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT -OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, -EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. In no event will Sun's liability to you, whether -in contract, tort (including negligence), or otherwise, -exceed the amount paid by you for Software under this -Agreement. The foregoing limitations will apply even if the -above stated warranty fails of its essential purpose. Some -states do not allow the exclusion of incidental or -consequential damages, so some of the terms above may not -be applicable to you. - -7. TERMINATION. This Agreement is effective until -terminated. You may terminate this Agreement at any time by -destroying all copies of Software. This Agreement will -terminate immediately without notice from Sun if you fail -to comply with any provision of this Agreement. Either -party may terminate this Agreement immediately should any -Software become, or in either party's opinion be likely to -become, the subject of a claim of infringement of any -intellectual property right. Upon Termination, you must -destroy all copies of Software. - -8. EXPORT REGULATIONS. All Software and technical data -delivered under this Agreement are subject to US export -control laws and may be subject to export or import -regulations in other countries. You agree to comply -strictly with all such laws and regulations and acknowledge -that you have the responsibility to obtain such licenses to -export, re-export, or import as may be required after -delivery to you. - -9. TRADEMARKS AND LOGOS. You acknowledge and agree as -between you and Sun that Sun owns the SUN, SOLARIS, JAVA, -JINI, FORTE, and iPLANET trademarks and all SUN, SOLARIS, -JAVA, JINI, FORTE, and iPLANET-related trademarks, service -marks, logos and other brand designations ("Sun Marks"), -and you agree to comply with the Sun Trademark and Logo -Usage Requirements currently located at -http://www.sun.com/policies/trademarks. Any use you make of -the Sun Marks inures to Sun's benefit. - -10. U.S. GOVERNMENT RESTRICTED RIGHTS. If Software is being -acquired by or on behalf of the U.S. Government or by a -U.S. Government prime contractor or subcontractor (at any -tier), then the Government's rights in Software and -accompanying documentation will be only as set forth in -this Agreement; this is in accordance with 48 CFR 227.7201 -through 227.7202-4 (for Department of Defense (DOD) -acquisitions) and with 48 CFR 2.101 and 12.212 (for non-DOD -acquisitions). - -11. GOVERNING LAW. Any action related to this Agreement -will be governed by California law and controlling U.S. -federal law. No choice of law rules of any jurisdiction -will apply. - -12. SEVERABILITY. If any provision of this Agreement is -held to be unenforceable, this Agreement will remain in -effect with the provision omitted, unless omission would -frustrate the intent of the parties, in which case this -Agreement will immediately terminate. - -13. INTEGRATION. This Agreement is the entire agreement -between you and Sun relating to its subject matter. It -supersedes all prior or contemporaneous oral or written -communications, proposals, representations and warranties -and prevails over any conflicting or additional terms of -any quote, order, acknowledgment, or other communication -between the parties relating to its subject matter during -the term of this Agreement. No modification of this -Agreement will be binding, unless in writing and signed by -an authorized representative of each party. - -SUPPLEMENTAL LICENSE TERMS - -These Supplemental License Terms add to or modify the terms -of the Binary Code License Agreement. Capitalized terms not -defined in these Supplemental Terms shall have the same -meanings ascribed to them in the Binary Code License -Agreement . These Supplemental Terms shall supersede any -inconsistent or conflicting terms in the Binary Code -License Agreement, or in any license contained within the -Software. - -A. Software Internal Use and Development License Grant. -Subject to the terms and conditions of this Agreement and -restrictions and exceptions set forth in the Software -"README" file incorporated herein by reference, including, -but not limited to the Java Technology Restrictions of -these Supplemental Terms, Sun grants you a non-exclusive, -non-transferable, limited license without fees to reproduce -internally and use internally the Software complete and -unmodified for the purpose of designing, developing, and -testing your Programs. - -B. License to Distribute Software. Subject to the terms and -conditions of this Agreement and restrictions and -exceptions set forth in the Software README file, -including, but not limited to the Java Technology -Restrictions of these Supplemental Terms, Sun grants you a -non-exclusive, non-transferable, limited license without -fees to reproduce and distribute the Software, provided -that (i) you distribute the Software complete and -unmodified and only bundled as part of, and for the sole -purpose of running, your Programs, (ii) the Programs add -significant and primary functionality to the Software, -(iii) you do not distribute additional software intended to -replace any component(s) of the Software, (iv) you do not -remove or alter any proprietary legends or notices -contained in the Software, (v) you only distribute the -Software subject to a license agreement that protects Sun's -interests consistent with the terms contained in this -Agreement, and (vi) you agree to defend and indemnify Sun -and its licensors from and against any damages, costs, -liabilities, settlement amounts and/or expenses (including -attorneys' fees) incurred in connection with any claim, -lawsuit or action by any third party that arises or results -from the use or distribution of any and all Programs and/or -Software. - -C. License to Distribute Redistributables. Subject to the -terms and conditions of this Agreement and restrictions and -exceptions set forth in the Software README file, including -but not limited to the Java Technology Restrictions of -these Supplemental Terms, Sun grants you a non-exclusive, -non-transferable, limited license without fees to reproduce -and distribute those files specifically identified as -redistributable in the Software "README" file -("Redistributables") provided that: (i) you distribute the -Redistributables complete and unmodified, and only bundled -as part of Programs, (ii) the Programs add significant and -primary functionality to the Redistributables, (iii) you do -not distribute additional software intended to supersede -any component(s) of the Redistributables (unless otherwise -specified in the applicable README file), (iv) you do not -remove or alter any proprietary legends or notices -contained in or on the Redistributables, (v) you only -distribute the Redistributables pursuant to a license -agreement that protects Sun's interests consistent with the -terms contained in the Agreement, (vi) you agree to defend -and indemnify Sun and its licensors from and against any -damages, costs, liabilities, settlement amounts and/or -expenses (including attorneys' fees) incurred in connection -with any claim, lawsuit or action by any third party that -arises or results from the use or distribution of any and -all Programs and/or Software. - -D. Java Technology Restrictions. You may not create, -modify, or change the behavior of, or authorize your -licensees to create, modify, or change the behavior of, -classes, interfaces, or subpackages that are in any way -identified as "java", "javax", "sun" or similar convention -as specified by Sun in any naming convention designation. - -E. Distribution by Publishers. This section pertains to -your distribution of the Software with your printed book or -magazine (as those terms are commonly used in the industry) -relating to Java technology ("Publication"). Subject to and -conditioned upon your compliance with the restrictions and -obligations contained in the Agreement, in addition to the -license granted in Paragraph 1 above, Sun hereby grants to -you a non-exclusive, nontransferable limited right to -reproduce complete and unmodified copies of the Software on -electronic media (the "Media") for the sole purpose of -inclusion and distribution with your Publication(s), -subject to the following terms: (i) You may not distribute -the Software on a stand-alone basis; it must be distributed -with your Publication(s); (ii) You are responsible for -downloading the Software from the applicable Sun web site; -(iii) You must refer to the Software as JavaTM SE -Development Kit 6; (iv) The Software must be reproduced in -its entirety and without any modification whatsoever -(including, without limitation, the Binary Code License and -Supplemental License Terms accompanying the Software and -proprietary rights notices contained in the Software); -(v) The Media label shall include the following -information: Copyright 2006, Sun Microsystems, Inc. All -rights reserved. Use is subject to license terms. Sun, Sun -Microsystems, the Sun logo, Solaris, Java, the Java Coffee -Cup logo, J2SE, and all trademarks and logos based on Java -are trademarks or registered trademarks of Sun -Microsystems, Inc. in the U.S. and other countries. This -information must be placed on the Media label in such a -manner as to only apply to the Sun Software; (vi) You must -clearly identify the Software as Sun's product on the Media -holder or Media label, and you may not state or imply that -Sun is responsible for any third-party software contained -on the Media; (vii) You may not include any third party -software on the Media which is intended to be a replacement -or substitute for the Software; (viii) You shall indemnify -Sun for all damages arising from your failure to comply -with the requirements of this Agreement. In addition, you -shall defend, at your expense, any and all claims brought -against Sun by third parties, and shall pay all damages -awarded by a court of competent jurisdiction, or such -settlement amount negotiated by you, arising out of or in -connection with your use, reproduction or distribution of -the Software and/or the Publication. Your obligation to -provide indemnification under this section shall arise -provided that Sun: (a) provides you prompt notice of the -claim; (b) gives you sole control of the defense and -settlement of the claim; (c) provides you, at your expense, -with all available information, assistance and authority to -defend; and (d) has not compromised or settled such claim -without your prior written consent; and (ix) You shall -provide Sun with a written notice for each Publication; -such notice shall include the following information: (1) -title of Publication, (2) author(s), (3) date of -Publication, and (4) ISBN or ISSN numbers. Such notice -shall be sent to Sun Microsystems, Inc., 4150 Network -Circle, M/S USCA12-110, Santa Clara, California 95054, -U.S.A , Attention: Contracts Administration. - -F. Source Code. Software may contain source code that, -unless expressly licensed for other purposes, is provided -solely for reference purposes pursuant to the terms of this -Agreement. Source code may not be redistributed unless -expressly provided for in this Agreement. - -G. Third Party Code. Additional copyright notices and -license terms applicable to portions of the Software are -set forth in the THIRDPARTYLICENSEREADME.txt file. In -addition to any terms and conditions of any third party -opensource/freeware license identified in the -THIRDPARTYLICENSEREADME.txt file, the disclaimer of -warranty and limitation of liability provisions in -paragraphs 5 and 6 of the Binary Code License Agreement -shall apply to all Software in this distribution. - -H. Termination for Infringement. Either party may terminate -this Agreement immediately should any Software become, or -in either party's opinion be likely to become, the subject -of a claim of infringement of any intellectual property -right. - -I. Installation and Auto-Update. The Software's -installation and auto-update processes transmit a limited -amount of data to Sun (or its service provider) about those -specific processes to help Sun understand and optimize -them. Sun does not associate the data with personally -identifiable information. You can find more information -about the data Sun collects at http://java.com/data/. - -For inquiries please contact: Sun Microsystems, Inc., 4150 -Network Circle, Santa Clara, California 95054, U.S.A. +Sun Microsystems, Inc. Binary Code License Agreement + +for the JAVA SE DEVELOPMENT KIT (JDK), VERSION 6 + +SUN MICROSYSTEMS, INC. ("SUN") IS WILLING TO LICENSE THE +SOFTWARE IDENTIFIED BELOW TO YOU ONLY UPON THE CONDITION +THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY +CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS +(COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT +CAREFULLY. BY DOWNLOADING OR INSTALLING THIS SOFTWARE, YOU +ACCEPT THE TERMS OF THE AGREEMENT. INDICATE ACCEPTANCE BY +SELECTING THE "ACCEPT" BUTTON AT THE BOTTOM OF THE +AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY ALL THE +TERMS, SELECT THE "DECLINE" BUTTON AT THE BOTTOM OF THE +AGREEMENT AND THE DOWNLOAD OR INSTALL PROCESS WILL NOT +CONTINUE. + +1. DEFINITIONS. "Software" means the identified above in +binary form, any other machine readable materials +(including, but not limited to, libraries, source files, +header files, and data files), any updates or error +corrections provided by Sun, and any user manuals, +programming guides and other documentation provided to you +by Sun under this Agreement. "General Purpose Desktop +Computers and Servers" means computers, including desktop, +laptop and tablet computers, or servers, used for general +computing functions under end user control (such as but not +specifically limited to email, general purpose Internet +browsing, and office suite productivity tools). +The use of Software in systems and solutions that provide +dedicated functionality (other than as mentioned above) or +designed for use in embedded or function-specific software +applications, for example but not limited to: Software +embedded in or bundled with industrial control systems, +wireless mobile telephones, wireless handheld devices, +kiosks, TV/STB, Blu-ray Disc devices, telematics and +network control switching equipment, printers and storage +management systems, and other related systems are excluded +from this definition and not licensed under this +Agreement. "Programs" means Java technology applets and +applications intended to run on the Java Platform Standard +Edition (Java SE) platform on Java-enabled General Purpose +Desktop Computers and Servers. + +2. LICENSE TO USE. Subject to the terms and conditions of +this Agreement, including, but not limited to the Java +Technology Restrictions of the Supplemental License Terms, +Sun grants you a non-exclusive, non-transferable, limited +license without license fees to reproduce and use +internally Software complete and unmodified for the sole +purpose of running Programs. Additional licenses for +developers and/or publishers are granted in the +Supplemental License Terms. + +3. RESTRICTIONS. Software is confidential and copyrighted. +Title to Software and all associated intellectual property +rights is retained by Sun and/or its licensors. Unless +enforcement is prohibited by applicable law, you may not +modify, decompile, or reverse engineer Software. You +acknowledge that Licensed Software is not designed or +intended for use in the design, construction, operation or +maintenance of any nuclear facility. Sun Microsystems, Inc. +disclaims any express or implied warranty of fitness for +such uses. No right, title or interest in or to any +trademark, service mark, logo or trade name of Sun or its +licensors is granted under this Agreement. Additional +restrictions for developers and/or publishers licenses are +set forth in the Supplemental License Terms. + +4. LIMITED WARRANTY. Sun warrants to you that for a period +of ninety (90) days from the date of purchase, as evidenced +by a copy of the receipt, the media on which Software is +furnished (if any) will be free of defects in materials and +workmanship under normal use. Except for the foregoing, +Software is provided "AS IS". Your exclusive remedy and +Sun's entire liability under this limited warranty will be +at Sun's option to replace Software media or refund the fee +paid for Software. Any implied warranties on the Software +are limited to 90 days. Some states do not allow +limitations on duration of an implied warranty, so the +above may not apply to you. This limited warranty gives you +specific legal rights. You may have others, which vary from +state to state. + +5. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS +AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, +REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED +WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE +EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY +INVALID. + +6. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY +LAW, IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR +ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, +CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER +CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT +OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, +EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. In no event will Sun's liability to you, whether +in contract, tort (including negligence), or otherwise, +exceed the amount paid by you for Software under this +Agreement. The foregoing limitations will apply even if the +above stated warranty fails of its essential purpose. Some +states do not allow the exclusion of incidental or +consequential damages, so some of the terms above may not +be applicable to you. + +7. TERMINATION. This Agreement is effective until +terminated. You may terminate this Agreement at any time by +destroying all copies of Software. This Agreement will +terminate immediately without notice from Sun if you fail +to comply with any provision of this Agreement. Either +party may terminate this Agreement immediately should any +Software become, or in either party's opinion be likely to +become, the subject of a claim of infringement of any +intellectual property right. Upon Termination, you must +destroy all copies of Software. + +8. EXPORT REGULATIONS. All Software and technical data +delivered under this Agreement are subject to US export +control laws and may be subject to export or import +regulations in other countries. You agree to comply +strictly with all such laws and regulations and acknowledge +that you have the responsibility to obtain such licenses to +export, re-export, or import as may be required after +delivery to you. + +9. TRADEMARKS AND LOGOS. You acknowledge and agree as +between you and Sun that Sun owns the SUN, SOLARIS, JAVA, +JINI, FORTE, and iPLANET trademarks and all SUN, SOLARIS, +JAVA, JINI, FORTE, and iPLANET-related trademarks, service +marks, logos and other brand designations ("Sun Marks"), +and you agree to comply with the Sun Trademark and Logo +Usage Requirements currently located at +http://www.sun.com/policies/trademarks. Any use you make of +the Sun Marks inures to Sun's benefit. + +10. U.S. GOVERNMENT RESTRICTED RIGHTS. If Software is being +acquired by or on behalf of the U.S. Government or by a +U.S. Government prime contractor or subcontractor (at any +tier), then the Government's rights in Software and +accompanying documentation will be only as set forth in +this Agreement; this is in accordance with 48 CFR 227.7201 +through 227.7202-4 (for Department of Defense (DOD) +acquisitions) and with 48 CFR 2.101 and 12.212 (for non-DOD +acquisitions). + +11. GOVERNING LAW. Any action related to this Agreement +will be governed by California law and controlling U.S. +federal law. No choice of law rules of any jurisdiction +will apply. + +12. SEVERABILITY. If any provision of this Agreement is +held to be unenforceable, this Agreement will remain in +effect with the provision omitted, unless omission would +frustrate the intent of the parties, in which case this +Agreement will immediately terminate. + +13. INTEGRATION. This Agreement is the entire agreement +between you and Sun relating to its subject matter. It +supersedes all prior or contemporaneous oral or written +communications, proposals, representations and warranties +and prevails over any conflicting or additional terms of +any quote, order, acknowledgment, or other communication +between the parties relating to its subject matter during +the term of this Agreement. No modification of this +Agreement will be binding, unless in writing and signed by +an authorized representative of each party. + +SUPPLEMENTAL LICENSE TERMS + +These Supplemental License Terms add to or modify the terms +of the Binary Code License Agreement. Capitalized terms not +defined in these Supplemental Terms shall have the same +meanings ascribed to them in the Binary Code License +Agreement . These Supplemental Terms shall supersede any +inconsistent or conflicting terms in the Binary Code +License Agreement, or in any license contained within the +Software. + +A. Software Internal Use and Development License Grant. +Subject to the terms and conditions of this Agreement and +restrictions and exceptions set forth in the Software +"README" file incorporated herein by reference, including, +but not limited to the Java Technology Restrictions of +these Supplemental Terms, Sun grants you a non-exclusive, +non-transferable, limited license without fees to reproduce +internally and use internally the Software complete and +unmodified for the purpose of designing, developing, and +testing your Programs. + +B. License to Distribute Software. Subject to the terms and +conditions of this Agreement and restrictions and +exceptions set forth in the Software README file, +including, but not limited to the Java Technology +Restrictions of these Supplemental Terms, Sun grants you a +non-exclusive, non-transferable, limited license without +fees to reproduce and distribute the Software, provided +that (i) you distribute the Software complete and +unmodified and only bundled as part of, and for the sole +purpose of running, your Programs, (ii) the Programs add +significant and primary functionality to the Software, +(iii) you do not distribute additional software intended to +replace any component(s) of the Software, (iv) you do not +remove or alter any proprietary legends or notices +contained in the Software, (v) you only distribute the +Software subject to a license agreement that protects Sun's +interests consistent with the terms contained in this +Agreement, and (vi) you agree to defend and indemnify Sun +and its licensors from and against any damages, costs, +liabilities, settlement amounts and/or expenses (including +attorneys' fees) incurred in connection with any claim, +lawsuit or action by any third party that arises or results +from the use or distribution of any and all Programs and/or +Software. + +C. License to Distribute Redistributables. Subject to the +terms and conditions of this Agreement and restrictions and +exceptions set forth in the Software README file, including +but not limited to the Java Technology Restrictions of +these Supplemental Terms, Sun grants you a non-exclusive, +non-transferable, limited license without fees to reproduce +and distribute those files specifically identified as +redistributable in the Software "README" file +("Redistributables") provided that: (i) you distribute the +Redistributables complete and unmodified, and only bundled +as part of Programs, (ii) the Programs add significant and +primary functionality to the Redistributables, (iii) you do +not distribute additional software intended to supersede +any component(s) of the Redistributables (unless otherwise +specified in the applicable README file), (iv) you do not +remove or alter any proprietary legends or notices +contained in or on the Redistributables, (v) you only +distribute the Redistributables pursuant to a license +agreement that protects Sun's interests consistent with the +terms contained in the Agreement, (vi) you agree to defend +and indemnify Sun and its licensors from and against any +damages, costs, liabilities, settlement amounts and/or +expenses (including attorneys' fees) incurred in connection +with any claim, lawsuit or action by any third party that +arises or results from the use or distribution of any and +all Programs and/or Software. + +D. Java Technology Restrictions. You may not create, +modify, or change the behavior of, or authorize your +licensees to create, modify, or change the behavior of, +classes, interfaces, or subpackages that are in any way +identified as "java", "javax", "sun" or similar convention +as specified by Sun in any naming convention designation. + +E. Distribution by Publishers. This section pertains to +your distribution of the Software with your printed book or +magazine (as those terms are commonly used in the industry) +relating to Java technology ("Publication"). Subject to and +conditioned upon your compliance with the restrictions and +obligations contained in the Agreement, in addition to the +license granted in Paragraph 1 above, Sun hereby grants to +you a non-exclusive, nontransferable limited right to +reproduce complete and unmodified copies of the Software on +electronic media (the "Media") for the sole purpose of +inclusion and distribution with your Publication(s), +subject to the following terms: (i) You may not distribute +the Software on a stand-alone basis; it must be distributed +with your Publication(s); (ii) You are responsible for +downloading the Software from the applicable Sun web site; +(iii) You must refer to the Software as JavaTM SE +Development Kit 6; (iv) The Software must be reproduced in +its entirety and without any modification whatsoever +(including, without limitation, the Binary Code License and +Supplemental License Terms accompanying the Software and +proprietary rights notices contained in the Software); +(v) The Media label shall include the following +information: Copyright 2006, Sun Microsystems, Inc. All +rights reserved. Use is subject to license terms. Sun, Sun +Microsystems, the Sun logo, Solaris, Java, the Java Coffee +Cup logo, J2SE, and all trademarks and logos based on Java +are trademarks or registered trademarks of Sun +Microsystems, Inc. in the U.S. and other countries. This +information must be placed on the Media label in such a +manner as to only apply to the Sun Software; (vi) You must +clearly identify the Software as Sun's product on the Media +holder or Media label, and you may not state or imply that +Sun is responsible for any third-party software contained +on the Media; (vii) You may not include any third party +software on the Media which is intended to be a replacement +or substitute for the Software; (viii) You shall indemnify +Sun for all damages arising from your failure to comply +with the requirements of this Agreement. In addition, you +shall defend, at your expense, any and all claims brought +against Sun by third parties, and shall pay all damages +awarded by a court of competent jurisdiction, or such +settlement amount negotiated by you, arising out of or in +connection with your use, reproduction or distribution of +the Software and/or the Publication. Your obligation to +provide indemnification under this section shall arise +provided that Sun: (a) provides you prompt notice of the +claim; (b) gives you sole control of the defense and +settlement of the claim; (c) provides you, at your expense, +with all available information, assistance and authority to +defend; and (d) has not compromised or settled such claim +without your prior written consent; and (ix) You shall +provide Sun with a written notice for each Publication; +such notice shall include the following information: (1) +title of Publication, (2) author(s), (3) date of +Publication, and (4) ISBN or ISSN numbers. Such notice +shall be sent to Sun Microsystems, Inc., 4150 Network +Circle, M/S USCA12-110, Santa Clara, California 95054, +U.S.A , Attention: Contracts Administration. + +F. Source Code. Software may contain source code that, +unless expressly licensed for other purposes, is provided +solely for reference purposes pursuant to the terms of this +Agreement. Source code may not be redistributed unless +expressly provided for in this Agreement. + +G. Third Party Code. Additional copyright notices and +license terms applicable to portions of the Software are +set forth in the THIRDPARTYLICENSEREADME.txt file. In +addition to any terms and conditions of any third party +opensource/freeware license identified in the +THIRDPARTYLICENSEREADME.txt file, the disclaimer of +warranty and limitation of liability provisions in +paragraphs 5 and 6 of the Binary Code License Agreement +shall apply to all Software in this distribution. + +H. Termination for Infringement. Either party may terminate +this Agreement immediately should any Software become, or +in either party's opinion be likely to become, the subject +of a claim of infringement of any intellectual property +right. + +I. Installation and Auto-Update. The Software's +installation and auto-update processes transmit a limited +amount of data to Sun (or its service provider) about those +specific processes to help Sun understand and optimize +them. Sun does not associate the data with personally +identifiable information. You can find more information +about the data Sun collects at http://java.com/data/. + +For inquiries please contact: Sun Microsystems, Inc., 4150 +Network Circle, Santa Clara, California 95054, U.S.A. diff --git a/rpms/legal/FOSS_licenses/java/README.html b/rpms/legal/FOSS_licenses/java/README.html index 91239b6f00..e6d19d4dbe 100755 --- a/rpms/legal/FOSS_licenses/java/README.html +++ b/rpms/legal/FOSS_licenses/java/README.html @@ -1,719 +1,719 @@ - - - - - - - - README -- Java Platform, Standard Edition Development Kit - - - -

    README

    - -

    JavaTM Platform, - Standard Edition 6
    - Development Kit

    - -

    JDKTM 6

    - -

    Contents

    - - - -

    Introduction

    - -
    - Thank you for downloading this release of the JavaTM Platform, Standard Edition Development Kit - (JDKTM). The JDK is a development - environment for building applications, applets, and components using the - Java programming language. -
    - -
    - The JDK includes tools useful for developing and testing programs written - in the Java programming language and running on the JavaTM platform. -
    - -

    System Requirements & - Installation

    - -
    - System requirements, installation instructions and troubleshooting tips - are located on the Java Software web site at: -
    - -
    - JDK 6 - Installation Instructions -
    - -

    JDKTM - Documentation

    - -
    - The on-line JavaTM Platform, Standard Edition (Java SE) - Documentation contains API specifications, feature descriptions, - developer guides, reference pages for JDKTM tools and utilities, demos, and links to related - information. This documentation is also available in a download bundle - which you can install on your machine. To obtain the documentation bundle, - see the download - page. For API documentation, refer to the The - JavaTM Platform, Standard Edition API - Specification This provides brief descriptions of the API with an - emphasis on specifications, not on code examples. -
    - -

    Release Notes

    - -
    - See the Java SE 6 Release - Notes on the Java Software web site for additional information - pertaining to this release. Please check the on-line release notes - occasionally for the latest information as they will be updated as needed. -
    - -

    Compatibility

    - -
    - See Compatibility - with Previous Releases on the Java Software web site for the list of - known compatibility issues. Every effort has been made to support programs - written for previous versions of the JavaTM platform. Although some incompatible changes were - necessary, most software should migrate to the current version with no - reprogramming. Any failure to do so is considered a bug, except for a - small number of cases where compatibility was deliberately broken, as - described on our compatibility web page. Some compatibility-breaking - changes were required to close potential security holes or to fix - implementation or design bugs. -
    - -

    Bug Reports and Feedback

    - -
    - The Bug Database - web site lets you search for and examine existing bug reports, submit your - own bug reports, and tell us which bug fixes matter most to you. To - directly submit a bug or request a feature, fill out this form: -
    - -
    - http://bugs.sun.com/services/bugreport/index.jsp -
    - -
    - You can send feedback to the Java SE documentation - team. You can also send comments directly to Java Software engineering - team email addresses. -
    - -
    - Note - Please do not seek technical support through the Bug - Database or our development teams. For support options, see Support and Services on the - Java Software web site. -
    - -

    Contents of the JDKTM

    - -
    - This section contains a general summary of the files and directories in - the JDKTM. For details on the files and - directories, see the JDK - File Structure section of the Java SE documentation for your platform. -
    - -
    -
    -
    -
    Development Tools
    - -
    (In the bin/ subdirectory) Tools and utilities that - will help you develop, execute, debug, and document programs written - in the JavaTM programming language. - For further information, see the tool - documentation.
    -
    - -
    Runtime Environment
    - -
    (In the jre/ subdirectory) An implementation of the - Java Runtime Environment (JRETM) for - use by the JDK. The JRE includes a JavaTM Virtual Machine (JVMTM), class libraries, and other files that support - the execution of programs written in the JavaTM programming language.
    -
    - -
    Additional Libraries
    - -
    (In the lib/ subdirectory) Additional class libraries - and support files required by the development tools.
    -
    - -
    Demo Applets and Applications
    - -
    (In the demo/ subdirectory) Examples, with source - code, of programming for the JavaTM - platform. These include examples that use Swing and other - JavaTM Foundation Classes, and the - JavaTM Platform Debugger - Architecture.
    -
    - -
    Sample Code
    - -
    (In the sample subdirectory) Samples, with source - code, of programming for certain Java API's.
    -
    - -
    C header Files
    - -
    (In the include/ subdirectory) Header files that - support native-code programming using the Java Native - Interface, the JVMTM - Tool Interface, and other functionality of the - JavaTM platform.
    -
    - -
    Source Code
    - -
    (In src.zip) JavaTM - programming language source files for all classes that make up the - Java core API (that is, sources files for the java.*, javax.* and - some org.* packages, but not for com.sun.* packages). This source code - is provided for informational purposes only, to help developers learn - and use the JavaTM programming - language. These files do not include platform-specific implementation - code and cannot be used to rebuild the class libraries. To extract - these file, use any common zip utility. Or, you may use the Jar - utility in the JDK's bin/ directory:
    -
    - jar xvf src.zip
    -
    -
    -
    - -

    The Java Runtime Environment - (JRETM)

    - -
    - The JavaTM Runtime Environment - (JRETM) is available as a separately - downloadable product. See the download web site. -
    - -
    - The JRE allows you to run applications written in the JavaTM programming language. Like the JDKTM, it contains the JavaTM Virtual Machine (JVMTM), classes comprising the JavaTM platform API, and supporting files. Unlike the JDK, - it does not contain development tools such as compilers and debuggers. -
    - -
    - You can freely redistribute the JRE with your application, according to - the terms of the JRE license. Once you have developed your application - using the JDK, you can ship it with the JRE so your end-users will have a - JavaTM platform on which to run your - software. -
    - -

    Redistribution

    - -
    -
    -
    - NOTE - The license for this software does not allow the redistribution - of beta and other pre-release versions. -
    -
    -
    - -
    - Subject to the terms and conditions of the Software License Agreement and - the obligations, restrictions, and exceptions set forth below, You may - reproduce and distribute the Software (and also portions of Software - identified below as Redistributable), provided that: -
    - -
    -
      -
    1. you distribute the Software complete and unmodified and only bundled - as part of Your applets and applications ("Programs"),
    2. - -
    3. your Programs add significant and primary functionality to the - Software,
    4. - -
    5. your Programs are only intended to run on Java-enabled general - purpose desktop computers and servers,
    6. - -
    7. you distribute Software for the sole purpose of running your - Programs,
    8. - -
    9. you do not distribute additional software intended to replace any - component(s) of the Software,
    10. - -
    11. you do not remove or alter any proprietary legends or notices - contained in or on the Software,
    12. - -
    13. you only distribute the Software subject to a license agreement that - protects Sun's interests consistent with the terms contained in this - Agreement, and
    14. - -
    15. you agree to defend and indemnify Sun and its licensors from and - against any damages, costs, liabilities, settlement amounts and/or - expenses (including attorneys' fees) incurred in connection with any - claim, lawsuit or action by any third party that arises or results from - the use or distribution of any and all Programs and/or Software.
    16. -
    -
    - -
    - The term "vendors" used here refers to licensees, developers, and - independent software vendors (ISVs) who license and distribute the - JavaTM Development Kit - (JDKTM) with their programs. -
    - -
    - Vendors must follow the terms of the Java Development Kit Binary Code - License agreement. -
    - -

    Required vs. Optional Files

    - -
    - The files that make up the JavaTM - Development Kit (JDKTM) are divided into - two categories: required and optional. Optional files may be excluded from - redistributions of the JDK at the vendor's discretion. -
    - -
    - The following section contains a list of the files and directories that - may optionally be omitted from redistributions of the JDK. All files not - in these lists of optional files must be included in redistributions of - the JDK. -
    - -

    Optional Files and Directories

    - -
    - The following files may be optionally excluded from redistributions. These - files are located in the jdk1.6.0_<version> directory, where - <version> is the update version number. SolarisTM and Linux filenames and separators are shown. Windows - executables have the ".exe" suffix. Corresponding files with - _g in the name can also be excluded. The corresponding man - pages should be excluded for any excluded executables (with paths listed - below beginning with bin/, for the SolarisTM Operating System and Linux). -
    - -
    -
    -
    -
    jre/lib/charsets.jar
    - -
    Character conversion classes
    - -
    jre/lib/ext/
    - -
    sunjce_provider.jar - the SunJCE provider for Java - Cryptography APIs
    - localedata.jar - contains many of the resources needed - for non US English locales
    - ldapsec.jar - contains security features supported by the - LDAP service provider
    - dnsns.jar - for the InetAddress wrapper of JNDI DNS - provider
    - -
    bin/rmid and jre/bin/rmid
    - -
    Java RMI Activation System Daemon
    - -
    bin/rmiregistry and - jre/bin/rmiregistry
    - -
    Java Remote Object Registry
    - -
    bin/tnameserv and jre/bin/tnameserv
    - -
    Java IDL Name Server
    - -
    bin/keytool and jre/bin/keytool
    - -
    Key and Certificate Management Tool
    - -
    bin/kinit and jre/bin/kinit
    - -
    Used to obtain and cache Kerberos ticket-granting tickets
    - -
    bin/klist and jre/bin/klist
    - -
    Kerberos display entries in credentials cache and keytab
    - -
    bin/ktab and jre/bin/ktab
    - -
    Kerberos key table manager
    - -
    bin/policytool and - jre/bin/policytool
    - -
    Policy File Creation and Management Tool
    - -
    bin/orbd and jre/bin/orbd
    - -
    Object Request Broker Daemon
    - -
    bin/servertool and - jre/bin/servertool
    - -
    Java IDL Server Tool
    - -
    bin/javaws, jre/bin/javaws, - jre/lib/javaws/ and jre/lib/javaws.jar
    - -
    Java Web Start
    - -
    db/
    - -
    - Java DB, Sun Microsystems's distribution of the Apache Derby - database technology. Default installation locations are: - -
      -
    • Solaris: /opt/SUNWjavadb
    • - -
    • Linux: /opt/sun/javadb
    • - -
    • Windows: C:\Program Files\Sun\JavaDB
    • -
    For information on Java DB and Derby, including user and API - documentation, the capabilities of Java DB and further resources, - see the index.html file in the above directories. -
    - -
    demo/
    - -
    Demo Applets and Applications
    - -
    sample/
    - -
    Sample Code
    - -
    src.zip
    - -
    Archive of source files
    -
    -
    -
    - -

    Redistributable JDKTM Files

    - -
    - The limited set of files and directories from the JDK listed below may be - included in vendor redistributions of the JavaTM Runtime Environment (JRETM). They cannot be redistributed separately, and must - accompany an identically versioned JRE distribution. All paths are - relative to the top-level directory of the JDK. The corresponding man - pages should be included for any included executables (with paths listed - below beginning with bin/, for the SolarisTM Operating System and Linux). -
    - -
    -
    -
    -
    jre/lib/cmm/PYCC.pf
    - -
    Color profile. This file is required only if one wishes to convert - between the PYCC color space and another color space.
    - -
    All .ttf font files in the - jre/lib/fonts/ directory.
    - -
    Note that the LucidaSansRegular.ttf font is already contained in - the JRE, so there is no need to bring that file over from the - JDK.
    - -
    jre/lib/audio/soundbank.gm
    - -
    This MIDI soundbank is present in the JDK, but it has been removed - from the JRE in order to reduce the size of the JRE download bundle. - However, a soundbank file is necessary for MIDI playback, and - therefore the JDK's soundbank.gm file may be included in - redistributions of the JRE at the vendor's discretion. Several - versions of enhanced MIDI soundbanks are available from the Java Sound - web site: http://java.sun.com/products/java-media/sound/. - These alternative soundbanks may be included in redistributions of the - JRE.
    - -
    The javac bytecode compiler, consisting of the following - files:
    - -
    bin/javac [SolarisTM Operating System and Linux]
    - bin/sparcv9/javac [SolarisTM Operating System (SPARC(R) Platform Edition)]
    - bin/amd64/javac [SolarisTM Operating System (AMD)]
    - bin/javac.exe [Microsoft Windows]
    - lib/tools.jar [All platforms]
    - -
    The Annotation Processing Tool, consisting of the following - files:
    - -
    lib/tools.jar [All platforms]
    - bin/apt [SolarisTM - Operating System and Linux]
    - bin/sparcv9/apt [SolarisTM Operating System (SPARC(R) Platform Edition)]
    - bin/amd64/apt [SolarisTM Operating System (AMD)]
    - bin/apt.exe [Microsoft Windows]
    - -
    lib/jconsole.jar
    - -
    The Jconsole application. NOTE: The Jconsole application requires - the dynamic attach mechanism.
    - -
    The dynamic attach mechanism consisting of the following - files:
    - -
    lib/tools.jar [All platforms]
    - jre/lib/sparc/libattach.so [SolarisTM Operating System (SPARC(R) Platform Edition) and - Linux]
    - jre/lib/sparcv9/libattach.so [SolarisTM Operating System (SPARC(R) Platform Edition) and - Linux]
    - jre/lib/i386/libattach.so [SolarisTM Operating System (x86) and Linux]
    - jre/lib/amd64/libattach.so [SolarisTM Operating System (AMD) and Linux]
    - jre\bin\attach.dll [Microsoft Windows]
    - -
    The Java Platform Debugger Architecture implementation consisting - of the files shown in the dynamic attach section above, and the - following files:
    - -
    lib/tools.jar [All platforms]
    - lib/sa-jdi.jar [All platforms]
    - jre/lib/sparc/libsaproc.so [SolarisTM Operating System (SPARC(R) Platform Edition) and - Linux]
    - jre/lib/sparcv9/libsaproc.so [SolarisTM Operating System (SPARC(R) Platform Edition) and - Linux]
    - jre/lib/i386/libsaproc.so [SolarisTM Operating System (x86) and Linux]
    - jre/lib/amd64/libsaproc.so [SolarisTM Operating System (AMD) and Linux]
    - -
    jre\bin\server\
    - -
    On Microsoft Windows platforms, the JDK includes both the Java - HotSpotTM Server VM and Java - HotSpotTM Client VM. However, the - JRE for Microsoft Windows platforms includes only the Java - HotSpotTM Client VM. Those wishing - to use the Java HotSpotTM Server VM - with the JRE may copy the JDK's jre\bin\server folder to - a bin\server directory in the JRE. Software vendors may - redistribute the Java HotSpotTM - Server VM with their redistributions of the JRE.
    -
    -
    -
    - -

    Unlimited Strength Java Cryptography Extension

    - -
    - Due to import control restrictions for some countries, the Java - Cryptography Extension (JCE) policy files shipped with the JDK and the JRE - allow strong but limited cryptography to be used. These files are located - at
    -
    - <java-home>/lib/security/local_policy.jar
    - <java-home>/lib/security/US_export_policy.jar
    -
    - where <java-home> is the jre directory of - the JDK or the top-level directory of the JRE. -
    - -
    - An unlimited strength version of these files indicating no restrictions on - cryptographic strengths is available on the JDK web site for those living - in eligible countries. Those living in eligible countries may download the - unlimited strength version and replace the strong cryptography jar files - with the unlimited strength files. -
    - -

    The cacerts Certificates File

    - -
    - Root CA certificates may be added to or removed from the Java SE - certificate file located at -
    - -
    - <java-home>/lib/security/cacerts -
    - -
    - For more information, see - The cacerts Certificates File section in the keytool documentation. -
    - -

    Java Endorsed Standards Override - Mechanism

    - -
    - From time to time it is necessary to update the Java platform in order to - incorporate newer versions of standards that are created outside of the - Java Community ProcessSM (JCPSM http://www.jcp.org/) (Endorsed - Standards), or in order to update the version of a technology included - in the platform to correspond to a later standalone version of that - technology (Standalone Technologies). -
    - -
    - The Endorsed Standards Override Mechanism provides a means whereby - later versions of classes and interfaces that implement Endorsed Standards - or Standalone Technologies may be incorporated into the Java Platform. -
    - -
    - For more information on the Endorsed Standards Override Mechanism, - including the list of platform packages that it may be used to override, - see -
    - -
    - http://java.sun.com/javase/6/docs/technotes/guides/standards/ -
    - -

    Java DB

    - -
    - This distribution bundles Java DB, Sun Microsystems' distribution of the - Apache Derby pure Java database technology. Default installation locations - are: - -
      -
    • Solaris: /opt/SUNWjavadb
    • - -
    • Linux: /opt/sun/javadb
    • - -
    • Windows: C:\Program Files\Sun\JavaDB
    • -
    - -

    For information on Java DB and Derby, including user and API - documentation, the capabilities of Java DB and further resources, see the - index.html file in the above directories.

    -
    - -

    Web Pages

    - -
    - For additional information, refer to these Sun Microsystems pages on the - World Wide Web: -
    - -
    -
    -
    -
    http://java.sun.com/
    - -
    The Java Software web site, with the latest information on Java - technology, product information, news, and features.
    - -
    http://java.sun.com/docs
    - -
    JavaTM platform Documentation - provides access to white papers, the Java Tutorial and other - documents.
    - -
    http://developer.java.sun.com
    - -
    Developer Services web site (Free registration required). - Additional technical information, news, and features; user forums; - support information, and much more.
    - -
    http://java.sun.com/products/
    - -
    Java Technology Products & API
    -
    -
    -
    -
    - -

    The JavaTM Development - Kit (JDKTM) is a product of Sun - MicrosystemsTM, Inc.
    -
    - Copyright © 2008 Sun Microsystems, Inc.
    - 4150 Network Circle, Santa Clara, California 95054, U.S.A.
    - All rights reserved.

    - - - - + + + + + + + + README -- Java Platform, Standard Edition Development Kit + + + +

    README

    + +

    JavaTM Platform, + Standard Edition 6
    + Development Kit

    + +

    JDKTM 6

    + +

    Contents

    + + + +

    Introduction

    + +
    + Thank you for downloading this release of the JavaTM Platform, Standard Edition Development Kit + (JDKTM). The JDK is a development + environment for building applications, applets, and components using the + Java programming language. +
    + +
    + The JDK includes tools useful for developing and testing programs written + in the Java programming language and running on the JavaTM platform. +
    + +

    System Requirements & + Installation

    + +
    + System requirements, installation instructions and troubleshooting tips + are located on the Java Software web site at: +
    + +
    + JDK 6 + Installation Instructions +
    + +

    JDKTM + Documentation

    + +
    + The on-line JavaTM Platform, Standard Edition (Java SE) + Documentation contains API specifications, feature descriptions, + developer guides, reference pages for JDKTM tools and utilities, demos, and links to related + information. This documentation is also available in a download bundle + which you can install on your machine. To obtain the documentation bundle, + see the download + page. For API documentation, refer to the The + JavaTM Platform, Standard Edition API + Specification This provides brief descriptions of the API with an + emphasis on specifications, not on code examples. +
    + +

    Release Notes

    + +
    + See the Java SE 6 Release + Notes on the Java Software web site for additional information + pertaining to this release. Please check the on-line release notes + occasionally for the latest information as they will be updated as needed. +
    + +

    Compatibility

    + +
    + See Compatibility + with Previous Releases on the Java Software web site for the list of + known compatibility issues. Every effort has been made to support programs + written for previous versions of the JavaTM platform. Although some incompatible changes were + necessary, most software should migrate to the current version with no + reprogramming. Any failure to do so is considered a bug, except for a + small number of cases where compatibility was deliberately broken, as + described on our compatibility web page. Some compatibility-breaking + changes were required to close potential security holes or to fix + implementation or design bugs. +
    + +

    Bug Reports and Feedback

    + +
    + The Bug Database + web site lets you search for and examine existing bug reports, submit your + own bug reports, and tell us which bug fixes matter most to you. To + directly submit a bug or request a feature, fill out this form: +
    + +
    + http://bugs.sun.com/services/bugreport/index.jsp +
    + +
    + You can send feedback to the Java SE documentation + team. You can also send comments directly to Java Software engineering + team email addresses. +
    + +
    + Note - Please do not seek technical support through the Bug + Database or our development teams. For support options, see Support and Services on the + Java Software web site. +
    + +

    Contents of the JDKTM

    + +
    + This section contains a general summary of the files and directories in + the JDKTM. For details on the files and + directories, see the JDK + File Structure section of the Java SE documentation for your platform. +
    + +
    +
    +
    +
    Development Tools
    + +
    (In the bin/ subdirectory) Tools and utilities that + will help you develop, execute, debug, and document programs written + in the JavaTM programming language. + For further information, see the tool + documentation.
    +
    + +
    Runtime Environment
    + +
    (In the jre/ subdirectory) An implementation of the + Java Runtime Environment (JRETM) for + use by the JDK. The JRE includes a JavaTM Virtual Machine (JVMTM), class libraries, and other files that support + the execution of programs written in the JavaTM programming language.
    +
    + +
    Additional Libraries
    + +
    (In the lib/ subdirectory) Additional class libraries + and support files required by the development tools.
    +
    + +
    Demo Applets and Applications
    + +
    (In the demo/ subdirectory) Examples, with source + code, of programming for the JavaTM + platform. These include examples that use Swing and other + JavaTM Foundation Classes, and the + JavaTM Platform Debugger + Architecture.
    +
    + +
    Sample Code
    + +
    (In the sample subdirectory) Samples, with source + code, of programming for certain Java API's.
    +
    + +
    C header Files
    + +
    (In the include/ subdirectory) Header files that + support native-code programming using the Java Native + Interface, the JVMTM + Tool Interface, and other functionality of the + JavaTM platform.
    +
    + +
    Source Code
    + +
    (In src.zip) JavaTM + programming language source files for all classes that make up the + Java core API (that is, sources files for the java.*, javax.* and + some org.* packages, but not for com.sun.* packages). This source code + is provided for informational purposes only, to help developers learn + and use the JavaTM programming + language. These files do not include platform-specific implementation + code and cannot be used to rebuild the class libraries. To extract + these file, use any common zip utility. Or, you may use the Jar + utility in the JDK's bin/ directory:
    +
    + jar xvf src.zip
    +
    +
    +
    + +

    The Java Runtime Environment + (JRETM)

    + +
    + The JavaTM Runtime Environment + (JRETM) is available as a separately + downloadable product. See the download web site. +
    + +
    + The JRE allows you to run applications written in the JavaTM programming language. Like the JDKTM, it contains the JavaTM Virtual Machine (JVMTM), classes comprising the JavaTM platform API, and supporting files. Unlike the JDK, + it does not contain development tools such as compilers and debuggers. +
    + +
    + You can freely redistribute the JRE with your application, according to + the terms of the JRE license. Once you have developed your application + using the JDK, you can ship it with the JRE so your end-users will have a + JavaTM platform on which to run your + software. +
    + +

    Redistribution

    + +
    +
    +
    + NOTE - The license for this software does not allow the redistribution + of beta and other pre-release versions. +
    +
    +
    + +
    + Subject to the terms and conditions of the Software License Agreement and + the obligations, restrictions, and exceptions set forth below, You may + reproduce and distribute the Software (and also portions of Software + identified below as Redistributable), provided that: +
    + +
    +
      +
    1. you distribute the Software complete and unmodified and only bundled + as part of Your applets and applications ("Programs"),
    2. + +
    3. your Programs add significant and primary functionality to the + Software,
    4. + +
    5. your Programs are only intended to run on Java-enabled general + purpose desktop computers and servers,
    6. + +
    7. you distribute Software for the sole purpose of running your + Programs,
    8. + +
    9. you do not distribute additional software intended to replace any + component(s) of the Software,
    10. + +
    11. you do not remove or alter any proprietary legends or notices + contained in or on the Software,
    12. + +
    13. you only distribute the Software subject to a license agreement that + protects Sun's interests consistent with the terms contained in this + Agreement, and
    14. + +
    15. you agree to defend and indemnify Sun and its licensors from and + against any damages, costs, liabilities, settlement amounts and/or + expenses (including attorneys' fees) incurred in connection with any + claim, lawsuit or action by any third party that arises or results from + the use or distribution of any and all Programs and/or Software.
    16. +
    +
    + +
    + The term "vendors" used here refers to licensees, developers, and + independent software vendors (ISVs) who license and distribute the + JavaTM Development Kit + (JDKTM) with their programs. +
    + +
    + Vendors must follow the terms of the Java Development Kit Binary Code + License agreement. +
    + +

    Required vs. Optional Files

    + +
    + The files that make up the JavaTM + Development Kit (JDKTM) are divided into + two categories: required and optional. Optional files may be excluded from + redistributions of the JDK at the vendor's discretion. +
    + +
    + The following section contains a list of the files and directories that + may optionally be omitted from redistributions of the JDK. All files not + in these lists of optional files must be included in redistributions of + the JDK. +
    + +

    Optional Files and Directories

    + +
    + The following files may be optionally excluded from redistributions. These + files are located in the jdk1.6.0_<version> directory, where + <version> is the update version number. SolarisTM and Linux filenames and separators are shown. Windows + executables have the ".exe" suffix. Corresponding files with + _g in the name can also be excluded. The corresponding man + pages should be excluded for any excluded executables (with paths listed + below beginning with bin/, for the SolarisTM Operating System and Linux). +
    + +
    +
    +
    +
    jre/lib/charsets.jar
    + +
    Character conversion classes
    + +
    jre/lib/ext/
    + +
    sunjce_provider.jar - the SunJCE provider for Java + Cryptography APIs
    + localedata.jar - contains many of the resources needed + for non US English locales
    + ldapsec.jar - contains security features supported by the + LDAP service provider
    + dnsns.jar - for the InetAddress wrapper of JNDI DNS + provider
    + +
    bin/rmid and jre/bin/rmid
    + +
    Java RMI Activation System Daemon
    + +
    bin/rmiregistry and + jre/bin/rmiregistry
    + +
    Java Remote Object Registry
    + +
    bin/tnameserv and jre/bin/tnameserv
    + +
    Java IDL Name Server
    + +
    bin/keytool and jre/bin/keytool
    + +
    Key and Certificate Management Tool
    + +
    bin/kinit and jre/bin/kinit
    + +
    Used to obtain and cache Kerberos ticket-granting tickets
    + +
    bin/klist and jre/bin/klist
    + +
    Kerberos display entries in credentials cache and keytab
    + +
    bin/ktab and jre/bin/ktab
    + +
    Kerberos key table manager
    + +
    bin/policytool and + jre/bin/policytool
    + +
    Policy File Creation and Management Tool
    + +
    bin/orbd and jre/bin/orbd
    + +
    Object Request Broker Daemon
    + +
    bin/servertool and + jre/bin/servertool
    + +
    Java IDL Server Tool
    + +
    bin/javaws, jre/bin/javaws, + jre/lib/javaws/ and jre/lib/javaws.jar
    + +
    Java Web Start
    + +
    db/
    + +
    + Java DB, Sun Microsystems's distribution of the Apache Derby + database technology. Default installation locations are: + +
      +
    • Solaris: /opt/SUNWjavadb
    • + +
    • Linux: /opt/sun/javadb
    • + +
    • Windows: C:\Program Files\Sun\JavaDB
    • +
    For information on Java DB and Derby, including user and API + documentation, the capabilities of Java DB and further resources, + see the index.html file in the above directories. +
    + +
    demo/
    + +
    Demo Applets and Applications
    + +
    sample/
    + +
    Sample Code
    + +
    src.zip
    + +
    Archive of source files
    +
    +
    +
    + +

    Redistributable JDKTM Files

    + +
    + The limited set of files and directories from the JDK listed below may be + included in vendor redistributions of the JavaTM Runtime Environment (JRETM). They cannot be redistributed separately, and must + accompany an identically versioned JRE distribution. All paths are + relative to the top-level directory of the JDK. The corresponding man + pages should be included for any included executables (with paths listed + below beginning with bin/, for the SolarisTM Operating System and Linux). +
    + +
    +
    +
    +
    jre/lib/cmm/PYCC.pf
    + +
    Color profile. This file is required only if one wishes to convert + between the PYCC color space and another color space.
    + +
    All .ttf font files in the + jre/lib/fonts/ directory.
    + +
    Note that the LucidaSansRegular.ttf font is already contained in + the JRE, so there is no need to bring that file over from the + JDK.
    + +
    jre/lib/audio/soundbank.gm
    + +
    This MIDI soundbank is present in the JDK, but it has been removed + from the JRE in order to reduce the size of the JRE download bundle. + However, a soundbank file is necessary for MIDI playback, and + therefore the JDK's soundbank.gm file may be included in + redistributions of the JRE at the vendor's discretion. Several + versions of enhanced MIDI soundbanks are available from the Java Sound + web site: http://java.sun.com/products/java-media/sound/. + These alternative soundbanks may be included in redistributions of the + JRE.
    + +
    The javac bytecode compiler, consisting of the following + files:
    + +
    bin/javac [SolarisTM Operating System and Linux]
    + bin/sparcv9/javac [SolarisTM Operating System (SPARC(R) Platform Edition)]
    + bin/amd64/javac [SolarisTM Operating System (AMD)]
    + bin/javac.exe [Microsoft Windows]
    + lib/tools.jar [All platforms]
    + +
    The Annotation Processing Tool, consisting of the following + files:
    + +
    lib/tools.jar [All platforms]
    + bin/apt [SolarisTM + Operating System and Linux]
    + bin/sparcv9/apt [SolarisTM Operating System (SPARC(R) Platform Edition)]
    + bin/amd64/apt [SolarisTM Operating System (AMD)]
    + bin/apt.exe [Microsoft Windows]
    + +
    lib/jconsole.jar
    + +
    The Jconsole application. NOTE: The Jconsole application requires + the dynamic attach mechanism.
    + +
    The dynamic attach mechanism consisting of the following + files:
    + +
    lib/tools.jar [All platforms]
    + jre/lib/sparc/libattach.so [SolarisTM Operating System (SPARC(R) Platform Edition) and + Linux]
    + jre/lib/sparcv9/libattach.so [SolarisTM Operating System (SPARC(R) Platform Edition) and + Linux]
    + jre/lib/i386/libattach.so [SolarisTM Operating System (x86) and Linux]
    + jre/lib/amd64/libattach.so [SolarisTM Operating System (AMD) and Linux]
    + jre\bin\attach.dll [Microsoft Windows]
    + +
    The Java Platform Debugger Architecture implementation consisting + of the files shown in the dynamic attach section above, and the + following files:
    + +
    lib/tools.jar [All platforms]
    + lib/sa-jdi.jar [All platforms]
    + jre/lib/sparc/libsaproc.so [SolarisTM Operating System (SPARC(R) Platform Edition) and + Linux]
    + jre/lib/sparcv9/libsaproc.so [SolarisTM Operating System (SPARC(R) Platform Edition) and + Linux]
    + jre/lib/i386/libsaproc.so [SolarisTM Operating System (x86) and Linux]
    + jre/lib/amd64/libsaproc.so [SolarisTM Operating System (AMD) and Linux]
    + +
    jre\bin\server\
    + +
    On Microsoft Windows platforms, the JDK includes both the Java + HotSpotTM Server VM and Java + HotSpotTM Client VM. However, the + JRE for Microsoft Windows platforms includes only the Java + HotSpotTM Client VM. Those wishing + to use the Java HotSpotTM Server VM + with the JRE may copy the JDK's jre\bin\server folder to + a bin\server directory in the JRE. Software vendors may + redistribute the Java HotSpotTM + Server VM with their redistributions of the JRE.
    +
    +
    +
    + +

    Unlimited Strength Java Cryptography Extension

    + +
    + Due to import control restrictions for some countries, the Java + Cryptography Extension (JCE) policy files shipped with the JDK and the JRE + allow strong but limited cryptography to be used. These files are located + at
    +
    + <java-home>/lib/security/local_policy.jar
    + <java-home>/lib/security/US_export_policy.jar
    +
    + where <java-home> is the jre directory of + the JDK or the top-level directory of the JRE. +
    + +
    + An unlimited strength version of these files indicating no restrictions on + cryptographic strengths is available on the JDK web site for those living + in eligible countries. Those living in eligible countries may download the + unlimited strength version and replace the strong cryptography jar files + with the unlimited strength files. +
    + +

    The cacerts Certificates File

    + +
    + Root CA certificates may be added to or removed from the Java SE + certificate file located at +
    + +
    + <java-home>/lib/security/cacerts +
    + +
    + For more information, see + The cacerts Certificates File section in the keytool documentation. +
    + +

    Java Endorsed Standards Override + Mechanism

    + +
    + From time to time it is necessary to update the Java platform in order to + incorporate newer versions of standards that are created outside of the + Java Community ProcessSM (JCPSM http://www.jcp.org/) (Endorsed + Standards), or in order to update the version of a technology included + in the platform to correspond to a later standalone version of that + technology (Standalone Technologies). +
    + +
    + The Endorsed Standards Override Mechanism provides a means whereby + later versions of classes and interfaces that implement Endorsed Standards + or Standalone Technologies may be incorporated into the Java Platform. +
    + +
    + For more information on the Endorsed Standards Override Mechanism, + including the list of platform packages that it may be used to override, + see +
    + +
    + http://java.sun.com/javase/6/docs/technotes/guides/standards/ +
    + +

    Java DB

    + +
    + This distribution bundles Java DB, Sun Microsystems' distribution of the + Apache Derby pure Java database technology. Default installation locations + are: + +
      +
    • Solaris: /opt/SUNWjavadb
    • + +
    • Linux: /opt/sun/javadb
    • + +
    • Windows: C:\Program Files\Sun\JavaDB
    • +
    + +

    For information on Java DB and Derby, including user and API + documentation, the capabilities of Java DB and further resources, see the + index.html file in the above directories.

    +
    + +

    Web Pages

    + +
    + For additional information, refer to these Sun Microsystems pages on the + World Wide Web: +
    + +
    +
    +
    +
    http://java.sun.com/
    + +
    The Java Software web site, with the latest information on Java + technology, product information, news, and features.
    + +
    http://java.sun.com/docs
    + +
    JavaTM platform Documentation + provides access to white papers, the Java Tutorial and other + documents.
    + +
    http://developer.java.sun.com
    + +
    Developer Services web site (Free registration required). + Additional technical information, news, and features; user forums; + support information, and much more.
    + +
    http://java.sun.com/products/
    + +
    Java Technology Products & API
    +
    +
    +
    +
    + +

    The JavaTM Development + Kit (JDKTM) is a product of Sun + MicrosystemsTM, Inc.
    +
    + Copyright © 2008 Sun Microsystems, Inc.
    + 4150 Network Circle, Santa Clara, California 95054, U.S.A.
    + All rights reserved.

    + + + + diff --git a/rpms/legal/FOSS_licenses/java/THIRDPARTYLICENSEREADME.txt b/rpms/legal/FOSS_licenses/java/THIRDPARTYLICENSEREADME.txt index c5837c2f51..2fc19dc819 100755 --- a/rpms/legal/FOSS_licenses/java/THIRDPARTYLICENSEREADME.txt +++ b/rpms/legal/FOSS_licenses/java/THIRDPARTYLICENSEREADME.txt @@ -1,2289 +1,2289 @@ -DO NOT TRANSLATE OR LOCALIZE. - -%% The following software may be included in this product: CS CodeViewer v1.0; Use of any of this software is governed by the terms of the license below: -Copyright 1999 by CoolServlets.com. - -Any errors or suggested improvements to this class can be reported as instructed on CoolServlets.com. We hope you enjoy this program... your comments will encourage further development! -This software is distributed under the terms of the BSD License. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. -Neither name of CoolServlets.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING INANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." - -%% The following software may be included in this product: Crimson v1.1.1 ; Use of any of this software is governed by the terms of the license below: -/* -* The Apache Software License, Version 1.1 -* -* -* Copyright (c) 1999-2000 The Apache Software Foundation. All rights * reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* -* 3. The end-user documentation included with the redistribution, -* if any, must include the following acknowledgment: -* "This product includes software developed by the -* Apache Software Foundation (http://www.apache.org/)." -* Alternately, this acknowledgment may appear in the software itself, -* if and wherever such third-party acknowledgments normally appear. -* -* 4. The names "Crimson" and "Apache Software Foundation" must -* not be used to endorse or promote products derived from this -* software without prior written permission. For written -* permission, please contact apache@apache.org. -* -* 5. Products derived from this software may not be called "Apache", -* nor may "Apache" appear in their name, without prior written -* permission of the Apache Software Foundation. -* -* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -* SUCH DAMAGE. -* ====================================================================* -* This software consists of voluntary contributions made by many -* individuals on behalf of the Apache Software Foundation and was -* originally based on software copyright (c) 1999, International -* Business Machines, Inc., http://www.ibm.com. For more -* information on the Apache Software Foundation, please see -* . -*/ - - -%% The following software may be included in this product: Xalan J2; Use of any of this software is governed by the terms of the license below: - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - - - - -%% The following software may be included in this product: NSIS 1.0j; Use of any of this software is governed by the terms of the license below: -Copyright (C) 1999-2000 Nullsoft, Inc. -This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. Justin Frankel justin@nullsoft.com" - -%% Some Portions licensed from IBM are available at: -http://www.ibm.com/software/globalization/icu/ - -%% Portions Copyright Eastman Kodak Company 1992 - -%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the U.S. and other countries. - -%% Portions licensed from Taligent, Inc. - -%% The following software may be included in this product:IAIK PKCS Wrapper; Use of any of this software is governed by the terms of the license below: - -Copyright (c) 2002 Graz University of Technology. All rights reserved. -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: - - "This product includes software developed by IAIK of Graz University of Technology." - - Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - -4. The names "Graz University of Technology" and "IAIK of Graz University of Technology" must not be used to endorse or promote products derived from this software without prior written permission. - -5. Products derived from this software may not be called "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior written permission of Graz University of Technology. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -%% The following software may be included in this product: Document Object Model (DOM) v. Level 3; Use of any of this software is governed by the terms of the license below: -W3Cýý SOFTWARE NOTICE AND LICENSE - -http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - -This work (and included software, documentation such as READMEs, or other related items) is being -provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you -(the licensee) agree that you have read, understood, and will comply with the following terms and conditions. - -Permission to copy, modify, and distribute this software and its documentation, with or without modification, for -any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies -of the software and documentation or portions thereof, including modifications: - 1.The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. - 2.Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the - W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body - of any redistributed or derivative code. - 3.Notice of any changes or modifications to the files, including the date changes were made. (We - recommend you provide URIs to the location from which the code is derived.) -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKENO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, -WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THEUSE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. -The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the -software without specific, written prior permission. Title to copyright in this software and any associated -documentation will at all times remain with copyright holders. - -____________________________________ - -This formulation of W3C's notice and license became active on December 31 2002. This version removes the -copyright ownership notice such that this license can be used with materials other than those owned by the -W3C, reflects that ERCIM is now a host of the W3C, includes references to this specific dated version of the -license, and removes the ambiguous grant of "use". Otherwise, this version is the same as the previous -version and is written so as to preserve the Free Software Foundation's assessment of GPL compatibility and -OSI's certification under the Open Source Definition. Please see our Copyright FAQ for common questions -about using materials from our site, including specific terms and conditions for packages like libwww, Amaya, -and Jigsaw. Other questions about this notice can be directed to -site-policy@w3.org. - -%% The following software may be included in this product: Xalan, Xerces; Use of any of this software is governed by the terms of the license below: /* - * The Apache Software License, Version 1.1 - * - * - * Copyright (c) 1999-2003 The Apache Software Foundation. All rights * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * - * 4. The names "Xerces" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation and was - * originally based on software copyright (c) 1999, International - * Business Machines, Inc., http://www.ibm.com. For more - * information on the Apache Software Foundation, please see - * - -%% The following software may be included in this product: W3C XML Conformance Test Suites v. 20020606; Use of any of this software is governed by the terms of the license below: -W3Cýý SOFTWARE NOTICE AND LICENSE -Copyright ýý 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/ -This W3C work (including software, documents, or other related items) is beingprovided by the copyright holders under the following license. By obtaining,using and/or copying this work, you (the licensee) agree that you have read,understood, and will comply with the following terms and conditions: - -Permission to use, copy, modify, and distribute this software and its -documentation, with or without modification, for any purpose and without fee orroyalty is hereby granted, provided that you include the following on ALL copiesof the software and documentation or portions thereof, including modifications,that you make: - - 1. The full text of this NOTICE in a location viewable to users of theredistributed or derivative work. - 2. Any pre-existing intellectual property disclaimers, notices, or terms andconditions. If none exist, a short notice of the following form (hypertext ispreferred, text is permitted) should be used within the body of any -redistributed or derivative code: "Copyright ýý [$date-of-software] World WideWeb Consortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" - 3. Notice of any changes or modifications to the W3C files, including thedate changes were made. (We recommend you provide URIs to the location fromwhich the code is derived.) - -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKENO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITEDTO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THATTHE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTYPATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. -The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to the software without specific, written prior permission.Title to copyright in this software and any associated documentation will at alltimes remain with copyright holders. - -____________________________________ - -This formulation of W3C's notice and license became active on August 14 1998 soas to improve compatibility with GPL. This version ensures that W3C softwarelicensing terms are no more restrictive than GPL and consequently W3C softwaremay be distributed in GPL packages. See the older formulation for the policyprior to this date. Please see our Copyright FAQ for common questions aboutusing materials from our site, including specific terms and conditions forpackages like libwww, Amaya, and Jigsaw. Other questions about this notice canbe directed to site-policy@w3.org. - -%% The following software may be included in this product: W3C XML Schema Test Collection v. 1.16.2; Use of any of this software is governed by the terms of the license below: W3Cýýýý DOCUMENT NOTICE AND LICENSE -Copyright ýýýý 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. -http://www.w3.org/Consortium/Legal/ - -Public documents on the W3C site are provided by the copyright holders under thefollowing license. The software or Document Type Definitions (DTDs) associatedwith W3C specifications are governed by the Software Notice. By using and/orcopying this document, or the W3C document from which this statement is linked,you (the licensee) agree that you have read, understood, and will comply withthe following terms and conditions: - -Permission to use, copy, and distribute the contents of this document, or theW3C document from which this statement is linked, in any medium for any purposeand without fee or royalty is hereby granted, provided that you include thefollowing on ALL copies of the document, or portions thereof, that you use: - 1. A link or URL to the original W3C document. - 2. The pre-existing copyright notice of the original author, or if it doesn'texist, a notice of the form: "Copyright ýýýý [$date-of-document] World Wide WebConsortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but atextual representation is permitted.) - 3. If it exists, the STATUS of the W3C document. - -When space permits, inclusion of the full text of this NOTICE should beprovided. We request that authorship attribution be provided in any software,documents, or other items or products that you create pursuant to the -implementation of the contents of this document, or any portion thereof. -No right to create modifications or derivatives of W3C documents is grantedpursuant to this license. However, if additional requirements (documented in theCopyright FAQ) are satisfied, the right to create modifications or derivativesis sometimes granted by the W3C to individuals complying with those requirements. -THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONSOR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE;THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THEIMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCEOR IMPLEMENTATION OF THE CONTENTS THEREOF. - -The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to this document or its contents without specific, writtenprior permission. Title to copyright in this document will at all times remainwith copyright holders. - ----------------------------------------------------------------------------- -This formulation of W3C's notice and license became active on April 05 1999 soas to account for the treatment of DTDs, schema's and bindings. See the olderformulation for the policy prior to this date. Please see our Copyright FAQ forcommon questions about using materials from our site, including specific termsand conditions for packages like libwww, Amaya, and Jigsaw. Other questionsabout this notice can be directed to site-policy@w3.org. -webmaster -(last updated by reagle on 1999/04/99.) - - - -%% The following software may be included in this product: Mesa 3-D graphics library v. 5; Use of any of this software is governed by the terms of the license below: core Mesa code include/GL/gl.h Brian Paul Mesa - -GLX driver include/GL/glx.h Brian Paul Mesa - -Ext registry include/GL/glext.h SGI SGI Free B - include/GL/glxext.h - -Mesa license: - -The Mesa distribution consists of several components. Different copyrights andlicenses apply to different components. For example, GLUT is copyrighted by MarkKilgard, some demo programs are copyrighted by SGI, some of the Mesa devicedrivers are copyrighted by their authors. See below for a list of Mesa'scomponents and the copyright/license for each. - -The core Mesa library is licensed according to the terms of the XFree86copyright (an MIT-style license). This allows integration with the XFree86/DRIproject. Unless otherwise stated, the Mesa source code and documentation islicensed as follows: - -Copyright (C) 1999-2003 Brian Paul All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining acopy of this software and associated documentation files (the "Software"),to deal in the Software without restriction, including without limitationthe rights to use, copy, modify, merge, publish, distribute, sublicense,and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be includedin all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALLBRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER INAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -SGI FREE SOFTWARE LICENSE B (Version 1.1 [02/22/2000]) -1. Definitions. -1.1 "Additional Notice Provisions" means such additional provisions as appear in the Notice in Original Code under the heading "Additional Notice Provisions."1.2 "Covered Code" means the Original Code or Modifications, or any combination thereof.1.3 "Hardware" means any physical device that accepts input, processes input, stores the results of processing, and/or provides output.1.4 "Larger Work" means a work that combines Covered Code or portions thereof with code not governed by the terms of this License.1.5 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.1.6 "License" means this document. -1.7 "Licensed Patents" means patent claims Licensable by SGI that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof.1.8 "Modifications" means any addition to or deletion from the substance or structure of the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to the contents of a file containing Original Code and/or addition to or deletion from the contents of a file containing previous Modifications.B. Any new file that contains any part of the Original Code or previous Modifications.1.9 "Notice" means any notice in Original Code or Covered Code, as required by and in compliance with this License.1.10 "Original Code" means source code of computer software code that is described in the source code Notice required by Exhibit A as Original Code, and updates and error corrections specifically thereto.1.11 "Recipient" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 8. For legal entities, "Recipient" includes any entity that controls, is controlled by, or is under common control with Recipient. For purposes of this definition, "control" of an entity means (a) the power, direct or indirect, to direct or manage such entity, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity.1.12 "Recipient Patents" means patent claims Licensable by a Recipient that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof. 1.13 "SGI" means Silicon Graphics, Inc. -1.14 "SGI Patents" means patent claims Licensable by SGI other than the Licensed Patents.2. License Grant and Restrictions. -2.1 SGI License Grant. Subject to the terms of this License and any third party intellectual property claims, for the duration of intellectual property protections inherent in the Original Code, SGI hereby grants Recipient a worldwide, royalty-free, non-exclusive license, to do the following: (i) under copyrights Licensable by SGI, to reproduce, distribute, create derivative works from, and, to the extent applicable, display and perform the Original Code and/or any Modifications provided by SGI alone and/or as part of a Larger Work; and (ii) under any Licensable Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI. Recipient accepts the terms and conditions of this License by undertaking any of the aforementioned actions. The patent license shall apply to the Covered Code if, at the time any related Modification is added, such addition of the Modification causes such combination to be covered by the Licensed Patents. The patent license in Section 2.1(ii) shall not apply to any other combinations that include the Modification. No patent license is provided under SGI Patents for infringements of SGI Patents by Modifications not provided by SGI or combinations of Original Code and Modifications not provided by SGI. 2.2 Recipient License Grant. Subject to the terms of this License and any third party intellectual property claims, Recipient hereby grants SGI and any other Recipients a worldwide, royalty-free, non-exclusive license, under any Recipient Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI.2.3 No License For Hardware Implementations. The licenses granted in Section 2.1 and 2.2 are not applicable to implementation in Hardware of the algorithms embodied in the Original Code or any Modifications provided by SGI .3. Redistributions. -3.1 Retention of Notice/Copy of License. The Notice set forth in Exhibit A, below, must be conspicuously retained or included in any and all redistributions of Covered Code. For distributions of the Covered Code in source code form, the Notice must appear in every file that can include a text comments field; in executable form, the Notice and a copy of this License must appear in related documentation or collateral where the Recipient's rights relating to Covered Code are described. Any Additional Notice Provisions which actually appears in the Original Code must also be retained or included in any and all redistributions of Covered Code.3.2 Alternative License. Provided that Recipient is in compliance with the terms of this License, Recipient may, so long as without derogation of any of SGI's rights in and to the Original Code, distribute the source code and/or executable version(s) of Covered Code under (1) this License; (2) a license identical to this License but for only such changes as are necessary in order to clarify Recipient's role as licensor of Modifications; and/or (3) a license of Recipient's choosing, containing terms different from this License, provided that the license terms include this Section 3 and Sections 4, 6, 7, 10, 12, and 13, which terms may not be modified or superseded by any other terms of such license. If Recipient elects to use any license other than this License, Recipient must make it absolutely clear that any of its terms which differ from this License are offered by Recipient alone, and not by SGI. It is emphasized that this License is a limited license, and, regardless of the license form employed by Recipient in accordance with this Section 3.2, Recipient may relicense only such rights, in Original Code and Modifications by SGI, as it has actually been granted by SGI in this License.3.3 Indemnity. Recipient hereby agrees to indemnify SGI for any liability incurred by SGI as a result of any such alternative license terms Recipient offers.4. Termination. This License and the rights granted hereunder will terminate automatically if Recipient breaches any term herein and fails to cure such breach within 30 days thereof. Any sublicense to the Covered Code that is properly granted shall survive any termination of this License, absent termination by the terms of such sublicense. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive.5. No Trademark Or Other Rights. This License does not grant any rights to: (i) any software apart from the Covered Code, nor shall any other rights or licenses not expressly granted hereunder arise by implication, estoppel or otherwise with respect to the Covered Code; (ii) any trade name, trademark or service mark whatsoever, including without limitation any related right for purposes of endorsement or promotion of products derived from the Covered Code, without prior written permission of SGI; or (iii) any title to or ownership of the Original Code, which shall at all times remains with SGI. All rights in the Original Code not expressly granted under this License are reserved. 6. Compliance with Laws; Non-Infringement. There are various worldwide laws, regulations, and executive orders applicable to dispositions of Covered Code, including without limitation export, re-export, and import control laws, regulations, and executive orders, of the U.S. government and other countries, and Recipient is reminded it is obliged to obey such laws, regulations, and executive orders. Recipient may not distribute Covered Code that (i) in any way infringes (directly or contributorily) any intellectual property rights of any kind of any other person or entity or (ii) breaches any representation or warranty, express, implied or statutory, to which, under any applicable law, it might be deemed to have been subject.7. Claims of Infringement. If Recipient learns of any third party claim that any disposition of Covered Code and/or functionality wholly or partially infringes the third party's intellectual property rights, Recipient will promptly notify SGI of such claim.8. Versions of the License. SGI may publish revised and/or new versions of the License from time to time, each with a distinguishing version number. Once Covered Code has been published under a particular version of the License, Recipient may, for the duration of the license, continue to use it under the terms of that version, or choose to use such Covered Code under the terms of any subsequent version published by SGI. Subject to the provisions of Sections 3 and 4 of this License, only SGI may modify the terms applicable to Covered Code created under this License.9. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED "AS IS." ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. SGI ASSUMES NO RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY IS AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT SUBJECT TO THIS DISCLAIMER.10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES NOR LEGAL THEORY, WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT.11. Indemnity. Recipient shall be solely responsible for damages arising, directly or indirectly, out of its utilization of rights under this License. Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from and against any loss, liability, damages, costs or expenses (including the payment of reasonable attorneys fees) arising out of Recipient's use, modification, reproduction and distribution of the Covered Code or out of any representation or warranty made by Recipient.12. U.S. Government End Users. The Covered Code is a "commercial item" consisting of "commercial computer software" as such terms are defined in title 48 of the Code of Federal Regulations and all U.S. Government End Users acquire only the rights set forth in this License and are subject to the terms of this License.13. Miscellaneous. This License represents the complete agreement concerning the its subject matter. If any provision of this License is held to be unenforceable, such provision shall be reformed so as to achieve as nearly as possible the same legal and economic effect as the original provision and the remainder of this License will remain in effect. This License shall be governed by and construed in accordance with the laws of the United States and the State of California as applied to agreements entered into and to be performed entirely within California between California residents. Any litigation relating to this License shall be subject to the exclusive jurisdiction of the Federal Courts of the Northern District of California (or, absent subject matter jurisdiction in such courts, the courts of the State of California), with venue lying exclusively in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation that provides that the language of a contract shall be construed against the drafter shall not apply to this License. -Exhibit A -License Applicability. Except to the extent portions of this file are made subject to an alternative license as permitted in the SGI Free Software License B, Version 1.1 (the "License"), the contents of this file are subject only to the provisions of the License. You may not use this file except in compliance with the License. You may obtain a copy of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: http://oss.sgi.com/projects/FreeB -Note that, as provided in the License, the Software is distributed on an "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.Original Code. The Original Code is: [name of software, version number, and release date], developed by Silicon Graphics, Inc. The Original Code is Copyright (c) [dates of first publication, as appearing in the Notice in the Original Code] Silicon Graphics, Inc. Copyright in any portions created by third parties is as indicated elsewhere herein. All Rights Reserved.Additional Notice Provisions: [such additional provisions, if any, as appear in the Notice in the Original Code under the heading "Additional Notice Provisions"] -%% The following software may be included in this product: Byte Code Engineering Library (BCEL) v. 5; Use of any of this software is governed by the terms of the license below: - Apache Software License - - /* -==================================================================== * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. Allrights - * reserved. - * - * Redistribution and use in source and binary forms, withor without - * modification, are permitted provided that the followingconditions - * are met: - * - * 1. Redistributions of source code must retain the abovecopyright - * notice, this list of conditions and the followingdisclaimer. - * - * 2. Redistributions in binary form must reproduce theabove copyright - * notice, this list of conditions and the followingdisclaimer in - * the documentation and/or other materials providedwith the - * distribution. - * - * 3. The end-user documentation included with theredistribution, - * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation -(http://www.apache.org/)." - * Alternately, this acknowledgment may appear in thesoftware itself, - * if and wherever such third-party acknowledgmentsnormally appear. - * - * 4. The names "Apache" and "Apache Software Foundation"and - * "Apache BCEL" must not be used to endorse or promoteproducts - * derived from this software without prior writtenpermission. For - * written permission, please contact apache@apache.org. * - * 5. Products derived from this software may not be called"Apache", - * "Apache BCEL", nor may "Apache" appear in their name,without - * prior written permission of the Apache SoftwareFoundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED ORIMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSEARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWAREFOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVERCAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING INANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF - * SUCH DAMAGE. - * -==================================================================== * - * This software consists of voluntary contributions madeby many - * individuals on behalf of the Apache Software -Foundation. For more - - - * information on the Apache Software Foundation, pleasesee - * . - */ - - - -%% The following software may be included in this product: Regexp, Regular Expression Package v. 1.2; Use of any of this software is governed by the terms of the license below: The Apache Software License, Version 1.1 -Copyright (c) 2001 The Apache Software Foundation. All rights -reserved. -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in -the documentation and/or other materials provided with the -distribution. - -3. The end-user documentation included with the redistribution, -if any, must include the following acknowledgment: -"This product includes software developed by the -Apache Software Foundation (http://www.apache.org/)." -Alternately, this acknowledgment may appear in the software itself, -if and wherever such third-party acknowledgments normally appear. - -4. The names "Apache" and "Apache Software Foundation" and -"Apache Turbine" must not be used to endorse or promote products -derived from this software without prior written permission. For -written permission, please contact apache@apache.org. - -5. Products derived from this software may not be called "Apache", -"Apache Turbine", nor may "Apache" appear in their name, without -prior written permission of the Apache Software Foundation. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - -==================================================================== -This software consists of voluntary contributions made by many -individuals on behalf of the Apache Software Foundation. For more -information on the Apache Software Foundation, please see - -http://www.apache.org. - -%% The following software may be included in this product: CUP Parser Generator for Java v. 0.10k; Use of any of this software is governed by the terms of the license below: CUP Parser Generator Copyright Notice, License, and Disclaimer - -Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, provided thatthe above copyright notice appear in all copies and that both the copyrightnotice and this permission notice and warranty disclaimer appear in -supporting documentation, and that the names of the authors or their employersnot be used in advertising or publicity pertaining to distribution of -the software without specific, written prior permission. - -The authors and their employers disclaim all warranties with regard to thissoftware, including all implied warranties of merchantability and -fitness. In no event shall the authors or their employers be liable for anyspecial, indirect or consequential damages or any damages whatsoever -resulting from loss of use, data or profits, whether in an action of contract,negligence or other tortious action, arising out of or in connection withthe use or performance of this software. - -%% The following software may be included in this product: JLex: A Lexical Analyzer Generator for Java v. 1.2.5; Use of any of this software is governed by the terms of the license below: JLEX COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. - -Copyright 1996-2003 by Elliot Joel Berk and C. Scott Ananian - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose -and without fee is hereby granted, provided that the above copyright noticeappear in all copies -and that both the copyright notice and this permission notice and warrantydisclaimer appear in -supporting documentation, and that the name of the authors or their employersnot be used in -advertising or publicity pertaining to distribution of the software withoutspecific, written prior -permission. - -The authors and their employers disclaim all warranties with regard to thissoftware, including all -implied warranties of merchantability and fitness. In no event shall the authorsor their employers -be liable for any special, indirect or consequential damages or any damageswhatsoever resulting -from loss of use, data or profits, whether in an action of contract, negligenceor other tortious -action, arising out of or in connection with the use or performance of thissoftware. - -Java is a trademark of Sun Microsystems, Inc. References to the Java programminglanguage in -relation to JLex are not meant to imply that Sun endorses this -product. - -%% The following software may be included in this product: SAX v. 2.0.1; Use of any of this software is governed by the terms of the license below: Copyright Status - - SAX is free! - - In fact, it's not possible to own a license to SAX, since it's been placed in the public - domain. - - No Warranty - - Because SAX is released to the public domain, there is no warranty for the design or for - the software implementation, to the extent permitted by applicable law. Except when - otherwise stated in writing the copyright holders and/or other parties provide SAX "as is" - without warranty of any kind, either expressed or implied, including, but not limited to, the - implied warranties of merchantability and fitness for a particular purpose. The entire risk as - to the quality and performance of SAX is with you. Should SAX prove defective, you - assume the cost of all necessary servicing, repair or correction. - - In no event unless required by applicable law or agreed to in writing will any copyright - holder, or any other party who may modify and/or redistribute SAX, be liable to you for - damages, including any general, special, incidental or consequential damages arising out of - the use or inability to use SAX (including but not limited to loss of data or data being - rendered inaccurate or losses sustained by you or third parties or a failure of the SAX to - operate with any other programs), even if such holder or other party has been advised of - the possibility of such damages. - - Copyright Disclaimers - - This page includes statements to that effect by David Megginson, who would have been - able to claim copyright for the original work. - SAX 1.0 - - Version 1.0 of the Simple API for XML (SAX), created collectively by the membership of - the XML-DEV mailing list, is hereby released into the public domain. - - No one owns SAX: you may use it freely in both commercial and non-commercial - applications, bundle it with your software distribution, include it on a CD-ROM, list the - source code in a book, mirror the documentation at your own web site, or use it in any - other way you see fit. - - David Megginson, sax@megginson.com - 1998-05-11 - - SAX 2.0 - - I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and release - all of the SAX 2.0 source code, compiled code, and documentation contained in this - distribution into the Public Domain. SAX comes with NO WARRANTY or guarantee of - fitness for any purpose. - - David Megginson, david@megginson.com - 2000-05-05 - -%% The following software may be included in this product: Cryptix; Use of any of this software is governed by the terms of the license below: -Cryptix General License - -Copyright © 1995-2003 The Cryptix Foundation Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions aremet: - - 1.Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. 2.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS ORIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FORA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BELIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOTLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESSINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OFTHE POSSIBILITY OF SUCH DAMAGE. - -%% The following software may be included in this product: W3C XML Schema Test Collection; Use of any of this software is governed by the terms of the license below: -W3C® DOCUMENT NOTICE AND LICENSE -Copyright © 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. -http://www.w3.org/Consortium/Legal/ - -Public documents on the W3C site are provided by the copyright holders under thefollowing license. The software or Document Type Definitions (DTDs) associatedwith W3C specifications are governed by the Software Notice. By using and/orcopying this document, or the W3C document from which this statement is linked,you (the licensee) agree that you have read, understood, and will comply withthe following terms and conditions: - -Permission to use, copy, and distribute the contents of this document, or theW3C document from which this statement is linked, in any medium for any purposeand without fee or royalty is hereby granted, provided that you include thefollowing on ALL copies of the document, or portions thereof, that you use: - 1. A link or URL to the original W3C document. - 2. The pre-existing copyright notice of the original author, or if it doesn'texist, a notice of the form: "Copyright © [$date-of-document] World Wide WebConsortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but atextual representation is permitted.) - 3. If it exists, the STATUS of the W3C document. - -When space permits, inclusion of the full text of this NOTICE should beprovided. We request that authorship attribution be provided in any software,documents, or other items or products that you create pursuant to the -implementation of the contents of this document, or any portion thereof. -No right to create modifications or derivatives of W3C documents is grantedpursuant to this license. However, if additional requirements (documented in theCopyright FAQ) are satisfied, the right to create modifications or derivativesis sometimes granted by the W3C to individuals complying with those requirements. -THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONSOR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE;THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THEIMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCEOR IMPLEMENTATION OF THE CONTENTS THEREOF. - -The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to this document or its contents without specific, writtenprior permission. Title to copyright in this document will at all times remainwith copyright holders. - ----------------------------------------------------------------------------- -This formulation of W3C's notice and license became active on April 05 1999 soas to account for the treatment of DTDs, schema's and bindings. See the olderformulation for the policy prior to this date. Please see our Copyright FAQ forcommon questions about using materials from our site, including specific termsand conditions for packages like libwww, Amaya, and Jigsaw. Other questionsabout this notice can be directed to site-policy@w3.org. -webmaster -(last updated by reagle on 1999/04/99.) - -%% The following software may be included in this product: Stax API; Use of any of this software is governed by the terms of the license below: -Streaming API for XML (JSR-173) Specification -Reference Implementation -License Agreement - -READ THE TERMS OF THIS (THE "AGREEMENT") CAREFULLY BEFORE VIEWING OR USING THESOFTWARE LICENS -ED HEREUNDER. BY VIEWING OR USING THE SOFTWARE, YOU AGREE TO THE TERMS OF THISAGREEMENT. IF -YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, INDICATE YOUR ACCEPTANCE OF THESETERMS BY SELE -CTING THE "ACCEPT" BUTTON AT THE END OF THIS AGREEMENT. IF YOU DO NOT AGREE TOALL THESE TERMS -, PROMPTLY RETURN THE UNUSED SOFTWARE TO ORIGINAL CONTRIBUTOR, DEFINED HEREIN. -1.0 DEFINITIONS. - -1.1. "BEA" means BEA Systems, Inc., the licensor of the Original Code. -1.2. "Contributor" means BEA and each entity that creates or contributes to thecreation of Mo -difications. - -1.3. "Covered Code" means the Original Code or Modifications or the combinationof the Origina -l Code and Modifications, in each case including portions thereof and -corresponding documentat -ion released with the source code. - -1.4. "Executable" means Covered Code in any form other than Source Code. -1.5. "FCS" means first commercial shipment of a product. - -1.6. "Modifications" means any addition to or deletion from the substance orstructure of eith -er the Original Code or any previous Modifications. When Covered Code isreleased as a series -of files, a Modification is: - -(a) Any addition to or deletion from the contents of a file containing OriginalCode or previ -ous Modifications. - -(b) Any new file that contains any part of the Original Code or previousModifications. - -1.7. "Original Code" means Source Code of computer software code ReferenceImplementation. - -1.8. "Patent Claims" means any patent claim(s), now owned or hereafter acquired,including wit -hout limitation, method, process, and apparatus claims, in any patent for whichthe grantor ha -s the right to grant a license. - -1.9. "Reference Implementation" means the prototype or "proof of concept"implementaÂtion of -the Specification developed and made available for license by or on behalf of BEA. -1.10. "Source Code" means the preferred form of the Covered Code for makingmodifications to i -t, including all modules it contains, plus any associated documentation,interface definition -files, scripts used to control compilation and installation of an Executable, orsource code d -ifferential comparisons against either the Original Code or another well known,available Cove -red Code of the Contributor's choice. - -1.11. "Specification" means the written specification for the Streaming API forXML , Java te -chnology developed pursuant to the Java Community Process. -1.12. "Technology Compatibility Kit" or "TCK" means the documentation, testingtools and test -suites associated with the Specification as may be revised by BEA from time totime, that is p -rovided so that an implementer of the SpecifiÂcation may determine if itsimplementation is co -mpliant with the Specification. - -1.13. "You" (or "Your") means an individual or a legal entity exercising rightsunder, and com -plying with all of the terms of, this Agreement or a future version of thisAgreement issued u -nder Section 6.1. For legal entities, "You" includes any entity which controls,is controlled -by, or is under common control with You. For purposes of this definition,"control" means (a) -the power, direct or indirect, to cause the direction or management of suchentity, whether by - contract or otherwise, or (b) ownership of more than fifty percent (50%) of theoutstanding s -hares or beneficial ownership of such entity. - -2.0 SOURCE CODE LICENSE. - -2.1. Copyright Grant. Subject to the terms of this Agreement, each Contributorhereby grants -You a non-exclusive, worldwide, royalty-free copyright license to reproduce,prepare derivativ -e works of, publicly display, publicly perform, distribute and sublicense theCovered Code of -such Contributor, if any, and such derivative works, in Source Code andExecutable form. - -2.2. Patent Grant. Subject to the terms of this Agreement, each Contributorhereby grants Yo -u a non-exclusive, worldwide, royalty-free patent license under the PatentClaims to make, use -, sell, offer to sell, import and otherwise transfer the Covered Code preparedand provided by - such Contributor, if any, in Source Code and Executable form. This patentlicense shall apply - to the Covered Code if, at the time a Modification is added by the Contributor,such addition - of the Modification causes such combination to be covered by the Patent Claims.The patent li -cense shall not apply to any other combinations which include the Modification. -2.3. Conditions to Grants. You understand that although each Contributorgrants the licenses - to the Covered Code prepared by it, no assurances are provided by anyContributor that the Co -vered Code does not infringe the patent or other intellectual property rights ofany other ent -ity. Each Contributor disclaims any liability to You for claims brought by anyother entity ba -sed on infringement of intellectual property rights or otherwise. As a conditionto exercising - the rights and licenses granted hereunder, You hereby assume sole -responsibility to secure an -y other intellectual property rights needed, if any. For example, if a thirdparty patent lice -nse is required to allow You to distribute Covered Code, it is Your -responsibility to acquire -that license before distributing such code. - -2.4. Contributors' Representation. Each Contributor represents that to itsknowledge it has -sufficient copyright rights in the Covered Code it provides , if any, to grantthe copyright l -icense set forth in this Agreement. - -3.0 DISTRIBUION RESTRICTIONS. - -3.1. Application of Agreement. - -The Modifications which You create or to which You contribute are governed bythe terms of thi -s Agreement, including without limitation Section 2.0. The Source Code versionof Covered Code - may be distributed only under the terms of this Agreement or a future versionof this Agreeme -nt released under Section 6.1, and You must include a copy of this Agreementwith every copy o -f the Source Code You distribute. You may not offer or impose any terms on anySource Code ver -sion that alters or restricts the applicable version of this Agreement or therecipients' righ -ts hereunder. However, You may include an additional document offering theadditional rights d -escribed in Section 3.3. - -3.2. Description of Modifications. - -You must cause all Covered Code to which You contribute to contain a filedocumenting the chan -ges You made to create that Covered Code and the date of any change. You mustinclude a promin -ent statement that the Modification is derived, directly or indirectly, fromOriginal Code pro -vided by BEA and including the name of BEA in (a) the Source Code, and (b) inany notice in an - Executable version or related documentation in which You describe the origin orownership of -the Covered Code. - -%% The following software may be included in this product: X Window System; Use of any of this software is governed by the terms of the license below: -Copyright The Open Group - -Permission to use, copy, modify, distribute, and sell this software and itsdocumentation for any purpose is hereby granted without fee, provided that theabove copyright notice appear in all copies and that both that copyright noticeand this permission notice appear in supporting documentation. - -The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUPBE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OFCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THESOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be usedin advertising or otherwise to promote the sale, use or other dealings in thisSoftware without prior written authorization from The Open Group. - -Portions also covered by other licenses as noted in the above URL. - -%% The following software may be included in this product: dom4j v. 1.6; Use of any of this software is governed by the terms of the license below: -Redistribution and use of this software and associated documentation -("Software"), with or without modification, are permitted provided that thefollowing conditions are met: - - 1. Redistributions of source code must retain copyright statements andnotices. Redistributions must also contain a copy of this document. - 2. Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentation and/orother materials provided with the distribution. - 3. The name "DOM4J" must not be used to endorse or promote products derivedfrom this Software without prior written permission of MetaStuff, Ltd. Forwritten permission, please contact dom4j-info@metastuff.com. - 4. Products derived from this Software may not be called "DOM4J" nor may"DOM4J" appear in their names without prior written permission of MetaStuff,Ltd. DOM4J is a registered trademark of MetaStuff, Ltd. - 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org -THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND ANYEXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FORANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ONANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. - -%% The following software may be included in this product: Retroweaver; Use of any of this software is governed by the terms of the license below: -Copyright (c) February 2004, Toby Reyelts -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -Neither the name of Toby Reyelts nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -%% The following software may be included in this product: stripper; Use of any of this software is governed by the terms of the license below: -Stripper : debug information stripper - Copyright (c) 2003 Kohsuke Kawaguchi - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -%% The following software may be included in this product: libpng official PNG reference library; Use of any of this software is governed by the terms of the license below: -This copy of the libpng notices is provided for your convenience. In case ofany discrepancy between this copy and the notices in the file png.h that isincluded in the libpng distribution, the latter shall prevail. - -COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: - -If you modify libpng you may insert additional notices immediately followingthis sentence. - -libpng version 1.2.6, December 3, 2004, is -Copyright (c) 2004 Glenn Randers-Pehrson, and is -distributed according to the same disclaimer and license as libpng-1.2.5with the following individual added to the list of Contributing Authors - Cosmin Truta - -libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, areCopyright (c) 2000-2002 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.0.6with the following individuals added to the list of Contributing Authors - Simon-Pierre Cadieux - Eric S. Raymond - Gilles Vollant - -and with the following additions to the disclaimer: - - There is no warranty against interference with your enjoyment of the library or against infringement. There is no warranty that our - efforts or the library will fulfill any of your particular purposes or needs. This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user. - -libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, areCopyright (c) 1998, 1999 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-0.96,with the following individuals added to the list of Contributing Authors: - Tom Lane - Glenn Randers-Pehrson - Willem van Schaik - -libpng versions 0.89, June 1996, through 0.96, May 1997, are -Copyright (c) 1996, 1997 Andreas Dilger -Distributed according to the same disclaimer and license as libpng-0.88,with the following individuals added to the list of Contributing Authors: - John Bowler - Kevin Bracey - Sam Bushell - Magnus Holmgren - Greg Roelofs - Tom Tanner - -libpng versions 0.5, May 1995, through 0.88, January 1996, are -Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. - -For the purposes of this copyright and license, "Contributing Authors"is defined as the following set of individuals: - - Andreas Dilger - Dave Martindale - Guy Eric Schalnat - Paul Schmidt - Tim Wegner - -The PNG Reference Library is supplied "AS IS". The Contributing Authorsand Group 42, Inc. disclaim all warranties, expressed or implied, -including, without limitation, the warranties of merchantability and offitness for any purpose. The Contributing Authors and Group 42, Inc. -assume no liability for direct, indirect, incidental, special, exemplary,or consequential damages, which may result from the use of the PNG -Reference Library, even if advised of the possibility of such damage. - -Permission is hereby granted to use, copy, modify, and distribute thissource code, or portions hereof, for any purpose, without fee, subjectto the following restrictions: - -1. The origin of this source code must not be misrepresented. - -2. Altered versions must be plainly marked as such and must not - be misrepresented as being the original source. - -3. This Copyright notice may not be removed or altered from any - source or altered source distribution. - -The Contributing Authors and Group 42, Inc. specifically permit, withoutfee, and encourage the use of this source code as a component to -supporting the PNG file format in commercial products. If you use thissource code in a product, acknowledgment is not required but would be -appreciated. - - -A "png_get_copyright" function is available, for convenient use in "about"boxes and the like: - - printf("%s",png_get_copyright(NULL)); - -Also, the PNG logo (in PNG format, of course) is supplied in the -files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). - -Libpng is OSI Certified Open Source Software. OSI Certified Open Source is acertification mark of the Open Source Initiative. - -Glenn Randers-Pehrson -glennrp at users.sourceforge.net -December 3, 2004 - -%% The following software may be included in this product: Libungif - An uncompressed GIF library; Use of any of this software is governed by the terms of the license below: -The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond - -Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE. - - -%% The following software may be included in this product: Ant; Use of any of this software is governed by the terms of the license below: -License -The Apache Software License Version 2.0 - -The Apache Software License Version 2.0 applies to all releases of Ant startingwith ant 1.6.1 - -/* - * Apache License - * Version 2.0, January 2004 - * http://www.apache.org/licenses/ - * - * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - * - * 1. Definitions. - * - * "License" shall mean the terms and conditions for use, reproduction, * and distribution as defined by Sections 1 through 9 of this document. * - * "Licensor" shall mean the copyright owner or entity authorized by * the copyright owner that is granting the License. - * - * "Legal Entity" shall mean the union of the acting entity and all * other entities that control, are controlled by, or are under common * control with that entity. For the purposes of this definition, * "control" means (i) the power, direct or indirect, to cause the * direction or management of such entity, whether by contract or * otherwise, or (ii) ownership of fifty percent (50%) or more of the * outstanding shares, or (iii) beneficial ownership of such entity. * - * "You" (or "Your") shall mean an individual or Legal Entity - * exercising permissions granted by this License. - * - * "Source" form shall mean the preferred form for making modifications, * including but not limited to software source code, documentation * source, and configuration files. - * - * "Object" form shall mean any form resulting from mechanical - * transformation or translation of a Source form, including but - * not limited to compiled object code, generated documentation, - * and conversions to other media types. - * - * "Work" shall mean the work of authorship, whether in Source or * Object form, made available under the License, as indicated by a * copyright notice that is included in or attached to the work - * (an example is provided in the Appendix below). - * - * "Derivative Works" shall mean any work, whether in Source or Object * form, that is based on (or derived from) the Work and for which the * editorial revisions, annotations, elaborations, or other modifications * represent, as a whole, an original work of authorship. For the purposes * of this License, Derivative Works shall not include works that remain * separable from, or merely link (or bind by name) to the interfaces of, * the Work and Derivative Works thereof. - * - * "Contribution" shall mean any work of authorship, including - * the original version of the Work and any modifications or additions * to that Work or Derivative Works thereof, that is intentionally * submitted to Licensor for inclusion in the Work by the copyright owner * or by an individual or Legal Entity authorized to submit on behalf of * the copyright owner. For the purposes of this definition, "submitted" * means any form of electronic, verbal, or written communication sent * to the Licensor or its representatives, including but not limited to * communication on electronic mailing lists, source code control systems, * and issue tracking systems that are managed by, or on behalf of, the * Licensor for the purpose of discussing and improving the Work, but * excluding communication that is conspicuously marked or otherwise * designated in writing by the copyright owner as "Not a Contribution." * - * "Contributor" shall mean Licensor and any individual or Legal Entity * on behalf of whom a Contribution has been received by Licensor and * subsequently incorporated within the Work. - * - * 2. Grant of Copyright License. Subject to the terms and conditions of * this License, each Contributor hereby grants to You a perpetual, * worldwide, non-exclusive, no-charge, royalty-free, irrevocable * copyright license to reproduce, prepare Derivative Works of, - * publicly display, publicly perform, sublicense, and distribute the * Work and such Derivative Works in Source or Object form. - * - * 3. Grant of Patent License. Subject to the terms and conditions of * this License, each Contributor hereby grants to You a perpetual, * worldwide, non-exclusive, no-charge, royalty-free, irrevocable * (except as stated in this section) patent license to make, have made, * use, offer to sell, sell, import, and otherwise transfer the Work, * where such license applies only to those patent claims licensable * by such Contributor that are necessarily infringed by their - * Contribution(s) alone or by combination of their Contribution(s) * with the Work to which such Contribution(s) was submitted. If You * institute patent litigation against any entity (including a - * cross-claim or counterclaim in a lawsuit) alleging that the Work * or a Contribution incorporated within the Work constitutes direct * or contributory patent infringement, then any patent licenses - * granted to You under this License for that Work shall terminate * as of the date such litigation is filed. - * - * 4. Redistribution. You may reproduce and distribute copies of the * Work or Derivative Works thereof in any medium, with or without * modifications, and in Source or Object form, provided that You * meet the following conditions: - * - * (a) You must give any other recipients of the Work or - * Derivative Works a copy of this License; and - * - * (b) You must cause any modified files to carry prominent notices * stating that You changed the files; and - * - * (c) You must retain, in the Source form of any Derivative Works * that You distribute, all copyright, patent, trademark, and * attribution notices from the Source form of the Work, - * excluding those notices that do not pertain to any part of * the Derivative Works; and - * - * (d) If the Work includes a "NOTICE" text file as part of its - * distribution, then any Derivative Works that You distribute must * include a readable copy of the attribution notices contained * within such NOTICE file, excluding those notices that do not * pertain to any part of the Derivative Works, in at least one * of the following places: within a NOTICE text file distributed * as part of the Derivative Works; within the Source form or * documentation, if provided along with the Derivative Works; or, * within a display generated by the Derivative Works, if and * wherever such third-party notices normally appear. The contents * of the NOTICE file are for informational purposes only and * do not modify the License. You may add Your own attribution * notices within Derivative Works that You distribute, alongside * or as an addendum to the NOTICE text from the Work, provided * that such additional attribution notices cannot be construed * as modifying the License. - * - * You may add Your own copyright statement to Your modifications and * may provide additional or different license terms and conditions * for use, reproduction, or distribution of Your modifications, or * for any such Derivative Works as a whole, provided Your use, - * reproduction, and distribution of the Work otherwise complies with * the conditions stated in this License. - * - * 5. Submission of Contributions. Unless You explicitly state otherwise, * any Contribution intentionally submitted for inclusion in the Work * by You to the Licensor shall be under the terms and conditions of * this License, without any additional terms or conditions. - * Notwithstanding the above, nothing herein shall supersede or modify * the terms of any separate license agreement you may have executed * with Licensor regarding such Contributions. - * - * 6. Trademarks. This License does not grant permission to use the trade * names, trademarks, service marks, or product names of the Licensor, * except as required for reasonable and customary use in describing the * origin of the Work and reproducing the content of the NOTICE file. * - * 7. Disclaimer of Warranty. Unless required by applicable law or - * agreed to in writing, Licensor provides the Work (and each - * Contributor provides its Contributions) on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied, including, without limitation, any warranties or conditions * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - * PARTICULAR PURPOSE. You are solely responsible for determining the * appropriateness of using or redistributing the Work and assume any * risks associated with Your exercise of permissions under this License. * - * 8. Limitation of Liability. In no event and under no legal theory, * whether in tort (including negligence), contract, or otherwise, * unless required by applicable law (such as deliberate and grossly * negligent acts) or agreed to in writing, shall any Contributor be * liable to You for damages, including any direct, indirect, special, * incidental, or consequential damages of any character arising as a * result of this License or out of the use or inability to use the * Work (including but not limited to damages for loss of goodwill, * work stoppage, computer failure or malfunction, or any and all * other commercial damages or losses), even if such Contributor - * has been advised of the possibility of such damages. - * - * 9. Accepting Warranty or Additional Liability. While redistributing * the Work or Derivative Works thereof, You may choose to offer, * and charge a fee for, acceptance of support, warranty, indemnity, * or other liability obligations and/or rights consistent with this * License. However, in accepting such obligations, You may act only * on Your own behalf and on Your sole responsibility, not on behalf * of any other Contributor, and only if You agree to indemnify, - * defend, and hold each Contributor harmless for any liability - * incurred by, or claims asserted against, such Contributor by reason * of your accepting any such warranty or additional liability. - * - * END OF TERMS AND CONDITIONS - * - * APPENDIX: How to apply the Apache License to your work. - * - * To apply the Apache License to your work, attach the following * boilerplate notice, with the fields enclosed by brackets "[]" - * replaced with your own identifying information. (Don't include * the brackets!) The text should be enclosed in the appropriate * comment syntax for the file format. We also recommend that a - * file or class name and description of purpose be included on the * same "printed page" as the copyright notice for easier - * identification within third-party archives. - * - * Copyright [yyyy] Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ - - -You can download the original license file here. - -The License is accompanied by a NOTICE - - ========================================================================= == NOTICE file corresponding to the section 4 d of == == the Apache License, Version 2.0, == == in this case for the Apache Ant distribution. == ========================================================================= - This product includes software developed by - The Apache Software Foundation (http://www.apache.org/). - - This product includes also software developed by : - - the W3C consortium (http://www.w3c.org) , - - the SAX project (http://www.saxproject.org) - - Please read the different LICENSE files present in the root directory of this distribution. - - The names "Ant" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact - apache@apache.org. - -The Apache Software License, Version 1.1 - -The Apache Software License, Version 1.1, applies to all versions of up to ant1.6.0 included. - -/* - * ============================================================================ * The Apache Software License, Version 1.1 - * ============================================================================ * - * Copyright (C) 2000-2003 The Apache Software Foundation. All - * rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by the Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Ant" and "Apache Software Foundation" must not be used to * endorse or promote products derived from this software without prior * written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", nor may * "Apache" appear in their name, without prior written permission of the * Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals * on behalf of the Apache Software Foundation. For more information on the * Apache Software Foundation, please see . - * - */ - - -%% The following software may be included in this product: XML Resolver library; Use of any of this software is governed by the terms of the license below: - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - - -%% The following software may be included in this product: ICU4J; Use of any of this software is governed by the terms of the license below: -ICU License - ICU 1.8.1 and later COPYRIGHT AND PERMISSION NOTICE Cop -yright (c) -1995-2003 International Business Machines Corporation and others All rightsreserved. Permission is hereby granted, free of charge, to any person obtaininga copy of this software and associated documentation files (the "Software"), todeal in the Software without restriction, including without limitation therights to use, copy, modify, merge, publish, distribute, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,provided that the above copyright notice(s) and this permission notice appear inall copies of the Software and that both the above copyright notice(s) and thispermission notice appear in supporting documentation. THE SOFTWARE IS PROVIDED"AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOTLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSEAND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHTHOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANYSPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTINGFROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCEOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE ORPERFORMANCE OF THIS SOFTWARE. Except as contained in this notice, the name of acopyright holder shall not be used in advertising or otherwise to promote thesale, use or other dealings in this Software without prior written authorizationof the copyright holder. - - -%% The following software may be included in this product: NekoHTML; Use of any of this software is governed by the terms of the license below: -The CyberNeko Software License, Version 1.0 - - -(C) Copyright 2002,2003, Andy Clark. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -3. The end-user documentation included with the redistribution, - if any, must include the following acknowledgment: - "This product includes software developed by Andy Clark." - Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - -4. The names "CyberNeko" and "NekoHTML" must not be used to endorse - or promote products derived from this software without prior - written permission. For written permission, please contact - andy@cyberneko.net. - -5. Products derived from this software may not be called "CyberNeko", - nor may "CyberNeko" appear in their name, without prior written - permission of the author. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -==================================================================== -This license is based on the Apache Software License, version 1.1 - - -%% The following software may be included in this product: Jing; Use of any of this software is governed by the terms of the license below: -Jing Copying Conditions - -Copyright (c) 2001-2003 Thai Open Source Software Center Ltd -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice,this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentation and/orother materials provided with the distribution. - * Neither the name of the Thai Open Source Software Center Ltd nor the namesof its contributors may be used to endorse or promote products derived from thissoftware without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ANDANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ONANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -%% The following software may be included in this product: RelaxNGCC; Use of any of this software is governed by the terms of the license below: -Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: - - "This product includes software developed by Daisuke Okajima - and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)." - -Alternately, this acknowledgment may appear in the software itself, -if and wherever such third-party acknowledgments normally appear. - -4. The names of the copyright holders must not be used to endorse or -promote products derived from this software without prior written -permission. For written permission, please contact the copyright -holders. - -5. Products derived from this software may not be called "RELAXNGCC", -nor may "RELAXNGCC" appear in their name, without prior written -permission of the copyright holders. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -%% The following software may be included in this product: RELAX NG Object Model/Parser; Use of any of this software is governed by the terms of the license below: -The MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy ofthis software and associated documentation files (the "Software"), to deal inthe Software without restriction, including without limitation the rights touse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,subject to the following conditions: - -The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS ORCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHERIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -%% The following software may be included in this product: XFree86-VidMode Extension; Use of any of this software is governed by the terms of the license below: -Version 1.1 of -XFree86ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýý ProjectLicence. - - Copyright (C) 1994-2004 The -XFree86ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýProject, Inc. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to deal inthe Software without restriction, including without limitation the rights touse, copy, modify, merge, publish, distribute, sublicence, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,subject to the following conditions: - - 1. Redistributions of source code must retain the above copyright notice,this list of conditions, and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution, and in thesame place and form as other copyright, license and disclaimer information. 3. The end-user documentation included with the redistribution, if any,must include the following acknowledgment: "This product includes softwaredeveloped by The XFree86 Project, Inc (http://www.xfree86.org/) and itscontributors", in the same place and form as other third-party acknowledgments.Alternately, this acknowledgment may appear in the software itself, in the sameform and location as other such third-party acknowledgments. - 4. Except as contained in this notice, the name of The XFree86 Project,Inc shall not be used in advertising or otherwise to promote the sale, use orother dealings in this Software without prior written authorization from TheXFree86 Project, Inc. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ANDFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE XFREE86PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ORBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER INCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISINGIN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITYOF SUCH DAMAGE. - - -%% The following software may be included in this product: RelaxNGCC; Use of any of this software is governed by the terms of the license below: -This is version 2003-May-08 of the Info-ZIP copyright and license. -The definitive version of this document should be available at -ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely. - - -Copyright (c) 1990-2003 Info-ZIP. All rights reserved. - -For the purposes of this copyright and license, "Info-ZIP" is defined asthe following set of individuals: - - Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, Jean-loup Gailly, Hunter Goatley, Ian Gorman, Chris Herborth, Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, Kai Uwe Rommel, Steve Salisbury, Dave Smith, Christian Spieler, Antoine Verheijen, - Paul von Behren, Rich Wales, Mike White - -This software is provided "as is," without warranty of any kind, expressor implied. In no event shall Info-ZIP or its contributors be held liablefor any direct, indirect, incidental, special or consequential damagesarising out of the use of or inability to use this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute itfreely, subject to the following restrictions: - - 1. Redistributions of source code must retain the above copyright notice, definition, disclaimer, and this list of conditions. - - 2. Redistributions in binary form (compiled executables) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution. The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a - self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled. - - 3. Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, and dynamic, shared, or static library versions--must be plainly marked as such and must not be misrepresented as being the original source. Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP. Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or of the Info-ZIP URL(s). - 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases. - - -%% The following software may be included in this product: XML Security; Use of any of this software is governed by the terms of the license below: - The Apache Software License, - Version 1.1 - - - PDF - - - Copyright (C) 2002 The Apache SoftwareFoundation. - All rights reserved. Redistribution anduse in - source and binary forms, with or withoutmodifica- - tion, are permitted provided that thefollowing - conditions are met: 1. Redistributions ofsource - code must retain the above copyrightnotice, this - list of conditions and the followingdisclaimer. - 2. Redistributions in binary form mustreproduce - the above copyright notice, this list of conditions and the following disclaimerin the - documentation and/or other materialsprovided with - the distribution. 3. The end-userdocumentation - included with the redistribution, if any,must - include the following acknowledgment:"This - product includes software developed bythe Apache - Software Foundation -(http://www.apache.org/)." - Alternately, this acknowledgment mayappear in the - software itself, if and wherever suchthird-party - acknowledgments normally appear. 4. Thenames - "Apache Forrest" and "Apache SoftwareFoundation" - must not be used to endorse or promoteproducts - derived from this software without priorwritten - permission. For written permission,please contact - apache@apache.org. 5. Products derivedfrom this - software may not be called "Apache", normay - "Apache" appear in their name, withoutprior - written permission of the Apache Software Foundation. THIS SOFTWARE IS PROVIDED``AS IS'' - AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THEIMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESSFOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NOEVENT - SHALL THE APACHE SOFTWARE FOUNDATION ORITS - CONTRIBUTORS BE LIABLE FOR ANY DIRECT,INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, ORCONSEQUENTIAL - DAMAGES (INCLU- DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ORSERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANYTHEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, - OR TORT (INCLUDING NEGLIGENCE OROTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF - SUCH DAMAGE. This software consists ofvoluntary - contributions made by many individuals onbehalf - of the Apache Software Foundation. Formore - information on the Apache SoftwareFoundation, - please see . - -%% The following software may be included in this product: Regexp, Regular Expression Package v. 1.2; Use of any of this software is governed by the terms of the license below: The Apache Software License, Version 1.1 -Copyright (c) 2001 The Apache Software Foundation. All rights -reserved. -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in -the documentation and/or other materials provided with the -distribution. - -3. The end-user documentation included with the redistribution, -if any, must include the following acknowledgment: -"This product includes software developed by the -Apache Software Foundation (http://www.apache.org/)." -Alternately, this acknowledgment may appear in the software itself, -if and wherever such third-party acknowledgments normally appear. - -4. The names "Apache" and "Apache Software Foundation" and -"Apache Turbine" must not be used to endorse or promote products -derived from this software without prior written permission. For -written permission, please contact apache@apache.org. - -5. Products derived from this software may not be called "Apache", -"Apache Turbine", nor may "Apache" appear in their name, without -prior written permission of the Apache Software Foundation. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - -==================================================================== -This software consists of voluntary contributions made by many -individuals on behalf of the Apache Software Foundation. For more -information on the Apache Software Foundation, please see - -http://www.apache.org. - - -%% The following software may be included in this product: Visual Studio. Use of any of this software is governed by the terms of the license below: - -END-USER LICENSE AGREEMENT FOR MICROSOFT SOFTWARE -IMPORTANT-READ CAREFULLY: This End-User License Agreement ("EULA") is a legal -agreement between you (either an individual or a single entity) and Microsoft Corporation ("Microsoft) for the Microsoft software that accompanies this EULA, which includes computer software and may include associated media, printed materials, "online" or electronic documentation, and Internet-based services ("Software"). An amendment or addendum to this EULA may accompany the Software. YOU AGREE TO BE BOUND BY THE TERMS OF THIS EULA BY INSTALLING, COPYING, OR OTHERWISE USING THE SOFTWARE. IF YOU DO NOT AGREE, DO NOT INSTALL, COPY, OR USE THE SOFTWARE; YOU MAY RETURN IT TO YOUR PLACE OF PURCHASE (IF APPLICABLE) FOR A FULL REFUND. - -MICROSOFT SOFTWARE LICENSE - -1. GRANTS OF LICENSE. Microsoft grants you the rights described in this EULA -provided that you comply with all terms and conditions of this EULA. NOTE: Microsoft is not -licensing to you any rights with respect to Crystal Reports for Microsoft Visual Studio .NET; -your use of Crystal Reports for Microsoft Visual Studio .NET is subject to your acceptance of -the terms and conditions of the enclosed (hard copy) end user license agreement from Crystal -Decisions for that product. -1.1 General License Grant. Microsoft grants to you as an individual, a personal, -nonexclusive license to use the Software, and to make and use copies of the Software for the -purposes of designing, developing, testing, and demonstrating your software product(s), -provided that you are the only individual using the Software. -If you are an entity, Microsoft grants to you a personal, nonexclusive license to -use the Software, and to make and use copies of the Software, provided that for each individual -using the Software within your organization, you have acquired a separate and valid license for -each such individual. - -1.2 Documentation. You may make and use an unlimited number of copies of any -documentation, provided that such copies shall be used only for personal purposes and are not -to be republished or distributed (either in hard copy or electronic form) beyond your premises. -1.3 Storage/Network Use. You may also store or install a copy of the Software on a -storage device, such as a network server, used only to install or run the Software on computers -used by licensed end users in accordance with Section 1.1. A single license for the Software may -not be shared or used concurrently by multiple end users. -1.4 Visual Studio—Effect of EULA. As a suite of development tools and other -Microsoft software programs (each such tool or software program, a "Component"), -Components that you receive as part of the Software may include a separate end-user license -agreement (each, a "Component EULA"). Except as provided in Section 4 ("Prerelease Code"), in -the event of inconsistencies between this EULA and any Component EULA, the terms of this -EULA shall control. The Software may also contain third-party software programs. Any such -software is provided for your use as a convenience and your use is subject to the terms and -conditions of any license agreement contained in that software. -2. ADDITIONAL LICENSE RIGHTS -- REDISTRIBUTABLE CODE. In addition to the -rights granted in Section 1, certain portions of the Software, as described in this Section 2, are -provided to you with additional license rights. These additional license rights are conditioned -Everett VSPro 1 -Final 11.04.02 - - - -upon your compliance with the distribution requirements and license limitations described in -Section 3. - -2.1 Sample Code. Microsoft grants you a limited, nonexclusive, royalty-free license -to: (a) use and modify the source code version of those portions of the Software identified as -"Samples" in REDIST.TXT or elsewhere in the Software ("Sample Code") for the sole purposes -of designing, developing, and testing your software product(s), and (b) reproduce and -distribute the Sample Code, along with any modifications thereof, in object and/or source code -form. For applicable redistribution requirements for Sample Code, see Section 3.1 below. -2.2 Redistributable Code—General. Microsoft grants you a limited, nonexclusive, -royalty-free license to reproduce and distribute the object code form of any portion of the -Software listed in REDIST.TXT ("Redistributable Code"). For general redistribution -requirements for Redistributable Code, see Section 3.1 below. -2.3 Redistributable Code—Microsoft Merge Modules ("MSM"). Microsoft grants -you a limited, nonexclusive, royalty-free license to reproduce and distribute the content of MSM -file(s) listed in REDIST.TXT in the manner described in the Software documentation only so -long as you redistribute such content in its entirety and do not modify such content in any way. -For all other applicable redistribution requirements for MSM files, see Section 3.1 below. -2.4 Redistributable Code—Microsoft Foundation Classes (MFC), Active Template -Libraries (ATL), and C runtimes (CRTs). In addition to the rights granted in Section 1, -Microsoft grants you a license to use and modify the source code version of those portions of -the Software that are identified as MFC, ATL, or CRTs (collectively, the "VC Redistributables"), -for the sole purposes of designing, developing, and testing your software product(s). Provided -you comply with Section 3.1 and you rename any files created by you that are included in the -Licensee Software (defined below), Microsoft grants you a limited, nonexclusive, royalty-free -license to reproduce and distribute the object code version of the VC Redistributables, including -any modifications you make. For purposes of this section, "modifications" shall mean -enhancements to the functionality of the VC Redistributables. For all other applicable -redistribution requirements for VC Redistributables, see Section 3.1 below. -3. DISTRIBUTION REQUIREMENTS AND OTHER LICENSE RIGHTS AND -LIMITATIONS. If you choose to exercise your rights under Section 2, any redistribution by -you is subject to your compliance with Section 3.1; some of the Redistributable Code has -additional limited use rights described in Section 3.2. -3.1 General Distribution Requirements. -(a) If you choose to redistribute Sample Code, or Redistributable Code -(collectively, the "Redistributables") as described in Section 2, you agree: (i) except as otherwise -noted in Section 2.1 (Sample Code), to distribute the Redistributables only in object code form -and in conjunction with and as a part of a software application product developed by you that -adds significant and primary functionality to the Redistributables ("Licensee Software"); -(ii) that the Redistributables only operate in conjunction with Microsoft Windows platforms; -(iii) that if the Licensee Software is distributed beyond Licensee's premises or externally from -Licensee's organization, to distribute the Licensee Software containing the Redistributables -pursuant to an end user license agreement (which may be "break-the-seal", "click-wrap" or -signed), with terms no less protective than those contained in this EULA; (iv) not to use -Microsoft's name, logo, or trademarks to market the Licensee Software; (v) to display your own -valid copyright notice which shall be sufficient to protect Microsoft's copyright in the Software; -Everett VSPro 2 -Final 11.04.02 - - - -(vi) not to remove or obscure any copyright, trademark or patent notices that appear on the -Software as delivered to you; (vii) to indemnify, hold harmless, and defend Microsoft from and -against any claims or lawsuits, including attorney's fees, that arise or result from the use or -distribution of the Licensee Software; (viii) to otherwise comply with the terms of this EULA; -and (ix) agree that Microsoft reserves all rights not expressly granted. -You also agree not to permit further distribution of the Redistributables by your -end users except you may permit further redistribution of the Redistributables by your -distributors to your end-user customers if your distributors only distribute the Redistributables -in conjunction with, and as part of, the Licensee Software, you comply with all other terms of -this EULA, and your distributors comply with all restrictions of this EULA that are applicable -to you. - -(b) If you use the Redistributables, then in addition to your compliance with -the applicable distribution requirements described for the Redistributables, the following also -applies. Your license rights to the Redistributables are conditioned upon your not (i) creating -derivative works of the Redistributables in any manner that would cause the Redistributables in -whole or in part to become subject to any of the terms of an Excluded License; or (ii) -distributing the Redistributables (or derivative works thereof) in any manner that would cause -the Redistributables to become subject to any of the terms of an Excluded License. An -"Excluded License" is any license that requires as a condition of use, modification and/or -distribution of software subject to the Excluded License, that such software or other software -combined and/or distributed with such software be (x) disclosed or distributed in source code -form; (y) licensed for the purpose of making derivative works; or (z) redistributable at no -charge. -3.2 Additional Distribution Requirements for Certain Redistributable Code. -If you choose to redistribute the files discussed in this Section, then in addition to the terms of -Section 3.1, you must ALSO comply with the following. -(a) Microsoft SQL Server Desktop Engine ("MSDE"). If you redistribute -MSDE you agree to comply with the following additional requirements: (a) Licensee -Software shall not substantially duplicate the capabilities of Microsoft Access or, in the -reasonable opinion of Microsoft, compete with same; and (b) unless Licensee Software -requires your customers to license Microsoft Access in order to operate, you shall not -reproduce or use MSDE for commercial distribution in conjunction with a general -purpose word processing, spreadsheet or database management software product, or an -integrated work or product suite whose components include a general purpose word -processing, spreadsheet, or database management software product except for the -exclusive use of importing data to the various formats supported by Microsoft Access. -A product that includes limited word processing, spreadsheet or database components -along with other components which provide significant and primary value, such as an -accounting product with limited spreadsheet capability, is not considered to be a -"general purpose" product. -(b) Microsoft Data Access Components. If you redistribute the Microsoft -Data Access Component file identified as MDAC_TYP.EXE, you also agree to -redistribute such file in object code only in conjunction with and as a part of a Licensee -Software developed by you with a Microsoft development tool product that adds -significant and primary functionality to MDAC_TYP.EXE. -Everett VSPro 3 -Final 11.04.02 - - - -3.3 Separation of Components. The Software is licensed as a single product. Its -component parts may not be separated for use by more than one user. -3.4 Benchmark Testing. The Software may contain the Microsoft .NET Framework. -You may not disclose the results of any benchmark test of the .NET Framework component of -the Software to any third party without Microsoft's prior written approval. -4. PRERELEASE CODE. Portions of the Software may be identified as prerelease code -("Prerelease Code"). Such Prerelease Code is not at the level of performance and compatibility -of the final, generally available product offering. The Prerelease Code may not operate correctly -and may be substantially modified prior to first commercial shipment. Microsoft is not -obligated to make this or any later version of the Prerelease Code commercially available. The -grant of license to use Prerelease Code expires upon availability of a commercial release of the -Prerelease Code from Microsoft. NOTE: In the event that Prerelease Code contains a separate -end-user license agreement, the terms and conditions of such end-user license agreement shall -govern your use of the corresponding Prerelease Code. -5. RESERVATION OF RIGHTS AND OWNERSHIP. Microsoft reserves all rights not -expressly granted to you in this EULA. The Software is protected by copyright and other -intellectual property laws and treaties. Microsoft or its suppliers own the title, copyright, and -other intellectual property rights in the Software. The Software is licensed, not sold. -6. LIMITATIONS ON REVERSE ENGINEERING, DECOMPILATION, AND -DISASSEMBLY. You may not reverse engineer, decompile, or disassemble the Software, -except and only to the extent that such activity is expressly permitted by applicable law -notwithstanding this limitation. -7. NO RENTAL/COMMERCIAL HOSTING. You may not rent, lease, lend or provide -commercial hosting services with the Software. -8. CONSENT TO USE OF DATA. You agree that Microsoft and its affiliates may collect -and use technical information gathered as part of the product support services provided to you, -if any, related to the Software. Microsoft may use this information solely to improve our -products or to provide customized services or technologies to you and will not disclose this -information in a form that personally identifies you. -9. LINKS TO THIRD PARTY SITES. You may link to third party sites through the use of -the Software. The third party sites are not under the control of Microsoft, and Microsoft is not -responsible for the contents of any third party sites, any links contained in third party sites, or -any changes or updates to third party sites. Microsoft is not responsible for webcasting or any -other form of transmission received from any third party sites. Microsoft is providing these -links to third party sites to you only as a convenience, and the inclusion of any link does not -imply an endorsement by Microsoft of the third party site. -10. ADDITIONAL SOFTWARE/SERVICES. This EULA applies to updates, supplements, -add-on components, or Internet-based services components, of the Software that Microsoft may -provide to you or make available to you after the date you obtain your initial copy of the -Software, unless we provide other terms along with the update, supplement, add-on -component, or Internet-based services component. Microsoft reserves the right to discontinue -any Internet-based services provided to you or made available to you through the use of the -Software. -11. UPGRADES/DOWNGRADES -Everett VSPro 4 -Final 11.04.02 - - - -11.1 Upgrades. To use a version of the Software identified as an upgrade, you must -first be licensed for the software identified by Microsoft as eligible for the upgrade. After -upgrading, you may no longer use the software that formed the basis for your upgrade -eligibility. -11.2 Downgrades. Instead of installing and using the Software, you may install and -use copies of an earlier version of the Software, provided that you completely remove such -earlier version and install the current version of the Software within a reasonable time. Your -use of such earlier version shall be governed by this EULA, and your rights to use such earlier -version shall terminate when you install the Software. -11.3 Special Terms for Version 2003 Upgrade Editions of the Software. If the -Software accompanying this EULA is the version 2003 edition of the Software and you have -acquired it as an upgrade from the corresponding "2002" edition of the Microsoft software -product with the same product name as the Software (the "Qualifying Software"), then -Section 11.1 does not apply to you. Instead, you may continue to use the Qualifying Software -AND the version 2003 upgrade for so long as you continue to comply with the terms of this -EULA and the EULA governing your use of the Qualifying Software. Qualifying Software does -not include non-Microsoft software products. -12. NOT FOR RESALE SOFTWARE. Software identified as "Not For Resale" or "NFR," -may not be sold or otherwise transfered for value, or used for any purpose other than -demonstration, test or evaluation. -13. ACADEMIC EDITION SOFTWARE. To use Software identified as "Academic -Edition" or "AE," you must be a "Qualified Educational User." For qualification-related -questions, please contact the Microsoft Sales Information Center/One Microsoft -Way/Redmond, WA 98052-6399 or the Microsoft subsidiary serving your country. -14. EXPORT RESTRICTIONS. You acknowledge that the Software is subject to U.S. export -jurisdiction. You agree to comply with all applicable international and national laws that apply -to the Software, including the U.S. Export Administration Regulations, as well as end-user, end- -use, and destination restrictions issued by U.S. and other governments. For additional -information see . -15. SOFTWARE TRANSFER. The initial user of the Software may make a one-time -permanent transfer of this EULA and Software to another end user, provided the initial user -retains no copies of the Software. This transfer must include all of the Software (including all -component parts, the media and printed materials, any upgrades (including any Qualifying -Software as defined in Section 11.3), this EULA, and, if applicable, the Certificate of -Authenticity). The transfer may not be an indirect transfer, such as a consignment. Prior to the -transfer, the end user receiving the Software must agree to all the EULA terms. -16. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this -EULA if you fail to comply with the terms and conditions of this EULA. In such event, you -must destroy all copies of the Software and all of its component parts. -Everett VSPro 5 -Final 11.04.02 - - - -17. LIMITED WARRANTY FOR SOFTWARE ACQUIRED IN THE US AND CANADA. -Except for the "Redistributables," which are provided AS IS without warranty of any kind, -Microsoft warrants that the Software will perform substantially in accordance with the -accompanying materials for a period of ninety (90) days from the date of receipt. - -If an implied warranty or condition is created by your state/jurisdiction and federal or -state/provincial law prohibits disclaimer of it, you also have an implied warranty or condition, -BUT ONLY AS TO DEFECTS DISCOVERED DURING THE PERIOD OF THIS LIMITED -WARRANTY (NINETY DAYS). AS TO ANY DEFECTS DISCOVERED AFTER THE -NINETY-DAY PERIOD, THERE IS NO WARRANTY OR CONDITION OF ANY KIND. - -Some states/jurisdictions do not allow limitations on how long an implied warranty or - - -condition lasts, so the above limitation may not apply to you. -Any supplements or updates to the Software, including without limitation, any (if any) service -packs or hot fixes provided to you after the expiration of the ninety day Limited Warranty -period are not covered by any warranty or condition, express, implied or statutory. - - -LIMITATION ON REMEDIES; NO CONSEQUENTIAL OR OTHER DAMAGES. Your -exclusive remedy for any breach of this Limited Warranty is as set forth below. Except for any -refund elected by Microsoft, YOU ARE NOT ENTITLED TO ANY DAMAGES, -INCLUDING BUT NOT LIMITED TO CONSEQUENTIAL DAMAGES, if the Software does -not meet Microsoft's Limited Warranty, and, to the maximum extent allowed by applicable  -law, even if any remedy fails of its essential purpose. The terms of Section 19 ("Exclusion of -Incidental, Consequential and Certain Other Damages") are also incorporated into this Limited -Warranty. Some states/jurisdictions do not allow the exclusion or limitation of incidental or -consequential damages, so the above limitation or exclusion may not apply to you. This -Limited Warranty gives you specific legal rights. You may have other rights which vary from -state/jurisdiction to state/jurisdiction. YOUR EXCLUSIVE REMEDY. Microsoft's and its -suppliers' entire liability and your exclusive remedy for any breach of this Limited Warranty or -for any other breach of this EULA or for any other liability relating to the Software shall be, at -Microsoft's option from time to time exercised subject to applicable law, (a) return of the -amount paid (if any) for the Software, or (b) repair or replacement of the Software, that does not -meet this Limited Warranty and that is returned to Microsoft with a copy of your receipt. You -will receive the remedy elected by Microsoft without charge, except that you are responsible for -any expenses you may incur (e.g. cost of shipping the Software to Microsoft). This Limited -Warranty is void if failure of the Software has resulted from accident, abuse, misapplication, -  -abnormal use or a virus. Any replacement Software will be warranted for the remainder of the -original warranty period or thirty (30) days, whichever is longer, and Microsoft will use -commercially reasonable efforts to provide your remedy within a commercially reasonable time -of your compliance with Microsoft's warranty remedy procedures. Outside the United States or -Canada, neither these remedies nor any product support services offered by Microsoft are -available without proof of purchase from an authorized international source. To exercise your -remedy, contact: Microsoft, Attn. Microsoft Sales Information Center/One Microsoft -Way/Redmond, WA 98052-6399, or the Microsoft subsidiary serving your country. -    - - -18. DISCLAIMER OF WARRANTIES. The Limited Warranty that appears above is the -only express warranty made to you and is provided in lieu of any other express warranties or -similar obligations (if any) created by any advertising, documentation, packaging, or other -communications. EXCEPT FOR THE LIMITED WARRANTY AND TO THE MAXIMUM -Everett VSPro 6 -Final 11.04.02 - - - -EXTENT PERMITTED BY APPLICABLE LAW, MICROSOFT AND ITS SUPPLIERS -PROVIDE THE SOFTWARE AND SUPPORT SERVICES (IF ANY) AS IS AND WITH ALL -FAULTS, AND HEREBY DISCLAIM ALL OTHER WARRANTIES AND CONDITIONS, -WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, -ANY (IF ANY) IMPLIED WARRANTIES, DUTIES OR CONDITIONS OF -MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF RELIABILITY -OR AVAILABILITY, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF -RESULTS, OF WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF -NEGLIGENCE, ALL WITH REGARD TO THE SOFTWARE, AND THE PROVISION OF OR -FAILURE TO PROVIDE SUPPORT OR OTHER SERVICES, INFORMATION, SOFTWARE, -AND RELATED CONTENT THROUGH THE SOFTWARE OR OTHERWISE ARISING -OUT OF THE USE OF THE SOFTWARE. ALSO, THERE IS NO WARRANTY OR -CONDITION OF TITLE, QUIET ENJOYMENT, QUIET POSSESSION, -CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT WITH REGARD TO -THE SOFTWARE. - -19. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER -DAMAGES. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL MICROSOFT OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, -INCIDENTAL, PUNITIVE, INDIRECT, OR CONSEQUENTIAL DAMAGES -WHATSOEVER (INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF -PROFITS OR CONFIDENTIAL OR OTHER INFORMATION, FOR BUSINESS -INTERRUPTION, FOR PERSONAL INJURY, FOR LOSS OF PRIVACY, FOR FAILURE TO -MEET ANY DUTY INCLUDING OF GOOD FAITH OR OF REASONABLE CARE, FOR -NEGLIGENCE, AND FOR ANY OTHER PECUNIARY OR OTHER LOSS WHATSOEVER) -ARISING OUT OF OR IN ANY WAY RELATED TO THE USE OF OR INABILITY TO USE -THE SOFTWARE, THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT OR -OTHER SERVICES, INFORMATION, SOFTWARE, AND RELATED CONTENT -THROUGH THE SOFTWARE OR OTHERWISE ARISING OUT OF THE USE OF THE -SOFTWARE, OR OTHERWISE UNDER OR IN CONNECTION WITH ANY PROVISION -OF THIS EULA, EVEN IN THE EVENT OF THE FAULT, TORT (INCLUDING -NEGLIGENCE), MISREPRESENTATION, STRICT LIABILITY, BREACH OF CONTRACT -OR BREACH OF WARRANTY OF MICROSOFT OR ANY SUPPLIER, AND EVEN IF -MICROSOFT OR ANY SUPPLIER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. -20. LIMITATION OF LIABILITY AND REMEDIES. NOTWITHSTANDING ANY -DAMAGES THAT YOU MIGHT INCUR FOR ANY REASON WHATSOEVER -(INCLUDING, WITHOUT LIMITATION, ALL DAMAGES REFERENCED HEREIN AND -ALL DIRECT OR GENERAL DAMAGES IN CONTRACT OR ANYTHING ELSE), THE -ENTIRE LIABILITY OF MICROSOFT AND ANY OF ITS SUPPLIERS UNDER ANY -PROVISION OF THIS EULA AND YOUR EXCLUSIVE REMEDY HEREUNDER (EXCEPT -FOR ANY REMEDY OF REPAIR OR REPLACEMENT ELECTED BY MICROSOFT WITH -RESPECT TO ANY BREACH OF THE LIMITED WARRANTY) SHALL BE LIMITED TO -THE GREATER OF THE ACTUAL DAMAGES YOU INCUR IN REASONABLE RELIANCE -ON THE SOFTWARE UP TO THE AMOUNT ACTUALLY PAID BY YOU FOR THE -SOFTWARE OR US$5.00. THE FOREGOING LIMITATIONS, EXCLUSIONS AND -DISCLAIMERS (INCLUDING SECTIONS 17, 18, AND 19) SHALL APPLY TO THE -MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, EVEN IF ANY REMEDY FAILS -ITS ESSENTIAL PURPOSE. -Everett VSPro 7 -Final 11.04.02 - - - -21. U.S. GOVERNMENT LICENSE RIGHTS. All Software provided to the U.S. -Government pursuant to solicitations issued on or after December 1, 1995 is provided with the -commercial license rights and restrictions described elsewhere herein. All Software provided to -the U.S. Government pursuant to solicitations issued prior to December 1, 1995 is provided with -"Restricted Rights" as provided for in FAR, 48 CFR 52.227-14 (JUNE 1987) or DFAR, 48 CFR -252.227-7013 (OCT 1988), as applicable. -22. APPLICABLE LAW. If you acquired this Software in the United States, this EULA is -governed by the laws of the State of Washington. If you acquired this Software in Canada, -unless expressly prohibited by local law, this EULA is governed by the laws in force in the -Province of Ontario, Canada; and, in respect of any dispute which may arise hereunder, you -consent to the jurisdiction of the federal and provincial courts sitting in Toronto, Ontario. If you -acquired this Software in the European Union, Iceland, Norway, or Switzerland, then local law -applies. If you acquired this Software in any other country, then local law may apply. -23. ENTIRE AGREEMENT; SEVERABILITY. This EULA (including any addendum or -amendment to this EULA which is included with the Software) are the entire agreement -between you and Microsoft relating to the Software and the support services (if any) and they -supersede all prior or contemporaneous oral or written communications, proposals and -representations with respect to the Software or any other subject matter covered by this EULA. -To the extent the terms of any Microsoft policies or programs for support services conflict with -the terms of this EULA, the terms of this EULA shall control. If any provision of this EULA is -held to be void, invalid, unenforceable or illegal, the other provisions shall continue in full force -and effect. -Si vous avez acquis votre produit Microsoft au CANADA, la garantie limitée suivante -s'applique : - -GARANTIE LIMITÉE - -Sauf pur celles du "Redistributables," qui sont fournies "comme telles," Microsoft garantit que -le Logiciel fonctionnera conformément aux documents inclus pendant une période de 90 jours -suivant la date de réception. - -Si une garantie ou condition implicite est créée par votre État ou votre territoire et qu'une loifédérale ou provinciale ou d'un État en interdit le déni, vous jouissez également d'une -garantie ou condition implicite, MAIS UNIQUEMENT POUR LES DÉFAUTS DÉCOUVERTS -DURANT LA PÉRIODE DE LA PRÉSENTE GARANTIE LIMITÉE (QUATRE-VINGT-DIX -JOURS). IL N'Y A AUCUNE GARANTIE OU CONDITION DE QUELQUE NATURE QUECE SOIT QUANT AUX DÉFAUTS DÉCOUVERTS APRÈS CETTE PÉRIODE DE QUATRE- -VINGT-DIX JOURS. Certains États ou territoires ne permettent pas de limiter la durée d'une -garantie ou condition implicite de sorte que la limitation ci-dessus peut ne pas s'appliquer à -vous. - -Tous les suppléments ou toutes les mises à jour relatifs au Logiciel, notamment, les ensembles -de services ou les réparations à chaud (le cas échéant) qui vous sont fournis après l'expiration -de la période de quatre-vingt-dix jours de la garantie limitée ne sont pas couverts par quelque -garantie ou condition que ce soit, expresse, implicite ou en vertu de la loi. - -LIMITATION DES RECOURS; ABSENCE DE DOMMAGES INDIRECTS OU AUTRES. - -Votre recours exclusif pour toute violation de la présente garantie limitée est décrit ci-après. - -Sauf pour tout remboursement au choix de Microsoft, si le Logiciel ne respecte pas la - -Everett VSPro 8 -Final 11.04.02 - - - -garantie limitée de Microsoft et, dans la mesure maximale permise par les lois applicables, -même si tout recours n'atteint pas son but essentiel, VOUS N'AVEZ DROIT À AUCUNS -DOMMAGES, NOTAMMENT DES DOMMAGES INDIRECTS. Les termes de la -clause «Exclusion des dommages accessoires, indirects et de certains autres dommages » sontégalement intégrées à la présente garantie limitée. Certains États ou territoires ne permettent -pas l'exclusion ou la limitation des dommages indirects ou accessoires de sorte que la limitation -ou l'exclusion ci-dessus peut ne pas s'appliquer à vous. La présente garantie limitée vous donne -des droits légaux spécifiques. Vous pouvez avoir d'autres droits qui peuvent varier d'unterritoire ou d'un État à un autre. VOTRE RECOURS EXCLUSIF. La seule responsabilité -obligation de Microsoft et de ses fournisseurs et votre recours exclusif pour toute violation de -la présente garantie limitée ou pour toute autre violation du présent contrat ou pour toute autre -responsabilité relative au Logiciel seront, selon le choix de Microsoft exercé de temps à autre -sous réserve de toute loi applicable, a) le remboursement du prix payé, le cas échéant, pour le -Logiciel ou b) la réparation ou le remplacement du Logiciel qui ne respecte pas la présente -garantie limitée et qui est retourné à Microsoft avec une copie de votre reçu. Vous recevrez la -compensation choisie par Microsoft, sans frais, sauf que vous êtes responsable des dépenses que -vous pourriez engager (p. ex., les frais d'envoi du Logiciel à Microsoft). La présente garantie -limitée est nulle si la défectuosité du Logiciel est causée par un accident, un usage abusif, une -mauvaise application, un usage anormal ou un virus. Tout Logiciel de remplacement sera -garanti pour le reste de la période initiale de la garantie ou pendant trente (30) jours, selon la -plus longue entre ces deux périodes. À l'extérieur des États-Unis ou du Canada, ces recours ou -l'un quelconque des services de soutien technique offerts par Microsoft ne sont pas disponibles -sans preuve d'achat d'une source internationale autorisée. Pour exercer votre recours, vous -devez communiquer avec Microsoft et vous adresser au Microsoft Sales Information -Center/One Microsoft Way/Redmond, WA 98052-6399, ou à la filiale de Microsoft de votre -pays. - -DÉNI DE GARANTIES. La garantie limitée qui apparaît ci-dessus constitue la seule garantie -expresse qui vous est donnée et remplace toutes autres garanties expresses (s'il en est) crées par -une publicité, un document, un emballage ou une autre communication. SAUF EN CE QUI A -TRAIT À LA GARANTIE LIMITÉE ET DANS LA MESURE MAXIMALE PERMISE PAR -LES LOIS APPLICABLES, LE LOGICIEL ET LES SERVICES DE SOUTIEN TECHNIQUE -(LE CAS ÉCHÉANT) SONT FOURNIS TELS QUELS ET AVEC TOUS LES DÉFAUTS PAR -MICROSOFT ET SES FOURNISSEURS, LESQUELS PAR LES PRÉSENTES DÉNIENT -TOUTES AUTRES GARANTIES ET CONDITIONS EXPRESSES, IMPLICITES OU EN -VERTU DE LA LOI, NOTAMMENT, MAIS SANS LIMITATION, (LE CAS ÉCHÉANT) LESGARANTIES, DEVOIRS OU CONDITIONS IMPLICITES DE QUALITÉ MARCHANDE, -D'ADAPTATION À UNE FIN PARTICULIÈRE, DE FIABILITÉ OU DE DISPONIBILITÉ, -D'EXACTITUDE OU D'EXHAUSTIVITÉ DES RÉPONSES, DES RÉSULTATS, DES -EFFORTS DÉPLOYÉS SELON LES RÈGLES DE L'ART, D'ABSENCE DE VIRUS ET -D'ABSENCE DE NÉGLIGENCE, LE TOUT À L'ÉGARD DU LOGICIEL ET DE LA -PRESTATION OU DE L'OMISSION DE LA PRESTATION DES SERVICES DE SOUTIEN -TECHNIQUE OU À L'ÉGARD DE LA FOURNITURE OU DE L'OMISSION DE LA -FOURNITURE DE TOUS AUTRES SERVICES, RENSEIGNEMENTS, LOGICIELS, ET -CONTENU QUI S'Y RAPPORTE GRÂCE AU LOGICIEL OU PROVENANT AUTREMENT -DE L'UTILISATION DU LOGICIEL . PAR AILLEURS, IL N'Y A AUCUNE GARANTIE OU -CONDITION QUANT AU TITRE DE PROPRIÉTÉ, À LA JOUISSANCE OU LA -POSSESSION PAISIBLE, À LA CONCORDANCE À UNE DESCRIPTION NI QUANT À -UNE ABSENCE DE CONTREFAÇON CONCERNANT LE LOGICIEL. - -EXCLUSION DES DOMMAGES ACCESSOIRES, INDIRECTS ET DE CERTAINS AUTRES -DOMMAGES. DANS LA MESURE MAXIMALE PERMISE PAR LES LOIS APPLICABLES, -EN AUCUN CAS MICROSOFT OU SES FOURNISSEURS NE SERONT RESPONSABLES -DES DOMMAGES SPÉCIAUX, CONSÉCUTIFS, ACCESSOIRES OU INDIRECTS DE - -Everett VSPro 9 -Final 11.04.02 - - - -QUELQUE NATURE QUE CE SOIT (NOTAMMENT, LES DOMMAGES À L'ÉGARD DUMANQUE À GAGNER OU DE LA DIVULGATION DE RENSEIGNEMENTS -CONFIDENTIELS OU AUTRES, DE LA PERTE D'EXPLOITATION, DE BLESSURES -CORPORELLES, DE LA VIOLATION DE LA VIE PRIVÉE, DE L'OMISSION DE REMPLIR -TOUT DEVOIR, Y COMPRIS D'AGIR DE BONNE FOI OU D'EXERCER UN SOIN -RAISONNABLE, DE LA NÉGLIGENCE ET DE TOUTE AUTRE PERTE PÉCUNIAIRE OU -AUTRE PERTE DE QUELQUE NATURE QUE CE SOIT) SE RAPPORTANT DE QUELQUEMANIÈRE QUE CE SOIT À L'UTILISATION DU LOGICIEL OU À L'INCAPACITÉ DE -S'EN SERVIR, À LA PRESTATION OU À L'OMISSION DE LA PRESTATION DE -SERVICES DE SOUTIEN TECHNIQUE OU À LA FOURNITURE OU À L'OMISSION DE -LA FOURNITURE DE TOUS AUTRES SERVICES, RENSEIGNEMENTS, LOGICIELS, ET -CONTENU QUI S'Y RAPPORTE GRÂCE AU LOGICIEL OU PROVENANT AUTREMENT -DE L'UTILISATION DU LOGICIEL OU AUTREMENT AUX TERMES DE TOUTE -DISPOSITION DE LA PRÉSENTE CONVENTION OU RELATIVEMENT À UNE TELLE -DISPOSITION, MÊME EN CAS DE FAUTE, DE DÉLIT CIVIL (Y COMPRIS LANÉGLIGENCE), DE RESPONSABILITÉ STRICTE, DE VIOLATION DE CONTRAT OU DEVIOLATION DE GARANTIE DE MICROSOFT OU DE TOUT FOURNISSEUR ET MÊME -SI MICROSOFT OU TOUT FOURNISSEUR A ÉTÉ AVISÉ DE LA POSSIBILITÉ DE TELS -DOMMAGES. - -LIMITATION DE RESPONSABILITÉ ET RECOURS. MALGRÉ LES DOMMAGES QUE -VOUS PUISSIEZ SUBIR POUR QUELQUE MOTIF QUE CE SOIT (NOTAMMENT, MAISSANS LIMITATION, TOUS LES DOMMAGES SUSMENTIONNÉS ET TOUS LES -DOMMAGES DIRECTS OU GÉNÉRAUX OU AUTRES), LA SEULE RESPONSABILITÉ DE -MICROSOFT ET DE L'UN OU L'AUTRE DE SES FOURNISSEURS AUX TERMES DE -TOUTE DISPOSITION DE LA PRÉSENTE CONVENTION ET VOTRE RECOURS -EXCLUSIF À L'ÉGARD DE TOUT CE QUI PRÉCÈDE (SAUF EN CE QUI CONCERNETOUT RECOURS DE RÉPARATION OU DE REMPLACEMENT CHOISI PAR -MICROSOFT À L'ÉGARD DE TOUT MANQUEMENT À LA GARANTIE LIMITÉE) SELIMITE AU PLUS ÉLEVÉ ENTRE LES MONTANTS SUIVANTS : LE MONTANT QUE -VOUS AVEZ RÉELLEMENT PAYÉ POUR LE LOGICIEL OU 5,00 $US. LES LIMITES, -EXCLUSIONS ET DÉNIS QUI PRÉCÈDENT (Y COMPRIS LES CLAUSES CI-DESSUS), -S'APPLIQUENT DANS LA MESURE MAXIMALE PERMISE PAR LES LOIS -APPLICABLES, MÊME SI TOUT RECOURS N'ATTEINT PAS SON BUT ESSENTIEL. - -À moins que cela ne soit prohibé par le droit local applicable, la présente Convention est régie -par les lois de la province d'Ontario, Canada. Vous consentez à la compétence des tribunaux -fédéraux et provinciaux siégeant à Toronto, dans la province d'Ontario. - -Au cas où vous auriez des questions concernant cette licence ou que vous désiriez vous mettre -en rapport avec Microsoft pour quelque raison que ce soit, veuillez utiliser l'information -contenue dans le Logiciel pour contacter la filiale de Microsoft desservant votre pays, ou visitez -Microsoft sur le World Wide Web à http://www.microsoft.com. - -The following MICROSOFT GUARANTEE applies to you if you acquired this Software in -any other country: - -Statutory rights not affected -The following guarantee is not restricted to any territory and does -not affect any statutory rights that you may have from your reseller or from Microsoft if you -acquired the Software directly from Microsoft. If you acquired the Software or any support -services in Australia, New Zealand or Malaysia, please see the "Consumer rights" section -below. - -Everett VSPro 10 -Final 11.04.02 - - - -The guarantee -The Software is designed and offered as a general-purpose software, not for any -user's particular purpose. You accept that no Software is error free and you are strongly -advised to back-up your files regularly. Provided that you have a valid license, Microsoft -guarantees that a) for a period of 90 days from the date of receipt of your license to use the -Software or the shortest period permitted by applicable law it will perform substantially in -accordance with the written materials that accompany the Software; and b) any support services -provided by Microsoft shall be substantially as described in applicable written materials -provided to you by Microsoft and Microsoft support engineers will use reasonable efforts, care -and skill to solve any problem issues. In the event that the Software fails to comply with this -guarantee, Microsoft will either (a) repair or replace the Software or (b) return the price you -paid. This guarantee is void if failure of the Software results from accident, abuse or -misapplication. Any replacement Software will be guaranteed for the remainder of the original -guarantee period or 30 days, whichever period is longer. You agree that the above guarantee is -your sole guarantee in relation to the Software and any support services. - -Exclusion of All Other Terms -To the maximum extent permitted by applicable law and subject to -the guarantee above, Microsoft disclaims all warranties, conditions and other terms, either -express or implied (whether by statute, common law, collaterally or otherwise) including but -not limited to implied warranties of satisfactory quality and fitness for particular purpose with -respect to the Software and the written materials that accompany the Software. Any implied -warranties that cannot be excluded are limited to 90 days or to the shortest period permitted by -applicable law, whichever is greater. - -Limitation of Liability -To the maximum extent permitted by applicable law and except as -provided in the Microsoft Guarantee, Microsoft and its suppliers shall not be liable for any -damages whatsoever (including without limitation, damages for loss of business profits, -business interruption, loss of business information or other pecuniary loss) arising out of the -use or inability to use the Software, even if Microsoft has been advised of the possibility of such -damages. In any case Microsoft's entire liability under any provision of this Agreement shall be -limited to the amount actually paid by you for the Software. These limitations do not apply to -any liabilities that cannot be excluded or limited by applicable laws. - -Consumer rights -Consumers in Australia, New Zealand or Malaysia may have the benefit of -certain rights and remedies by reason of the Trade Practices Act and similar state and territory -laws in Australia, the Consumer Guarantees Act in New Zealand and the Consumer Protection -Act in Malaysia in respect of which liability cannot lawfully be modified or excluded. If you -acquired the Software in New Zealand for the purposes of a business, you confirm that the -Consumer Guarantees Act does not apply. If you acquired the Software in Australia and if -Microsoft breaches a condition or warranty implied under any law which cannot lawfully be -modified or excluded by this agreement then, to the extent permitted by law, Microsoft's -liability is limited, at Microsoft's option, to: (i) in the case of the Software: a) repairing or -replacing the Software; or b) the cost of such repair or replacement; and (ii) in the case of -support services: a) re-supply of the services; or b) the cost of having the services supplied -again. - -Everett VSPro 11 -Final 11.04.02 - - - -Should you have any questions concerning this EULA, or if you desire to contact Microsoft for -any reason, please use the address information enclosed in this Software to contact the -Microsoft subsidiary serving your country or visit Microsoft on the World Wide Web at -http://www.microsoft.com. - -Everett VSPro 12 -Final 11.04.02 - -%% The following software may be included in this product: zlib; Use of any of this software is governed by the terms of the license below: - -zlib.h -- interface of the 'zlib' general purpose compression library - version 1.1.3, July 9th, 1998 - - Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format - - -%% The following software may be included in this product: Mozilla Rhino. Use of any of this software is governed by the terms of the license below: - - * The contents of this file are subject to the Netscape Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is Rhino code, released - * May 6, 1999. - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1997-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * - * Kemal Bayram - * Patrick Beard - * Norris Boyd - * Igor Bukanov, igor@mir2.org - * Brendan Eich - * Ethan Hugg - * Roger Lawrence - * Terry Lucas - * Mike McCabe - * Milen Nankov - * Attila Szegedi, szegedia@freemail.hu - * Ian D. Stewart - * Andi Vajda - * Andrew Wason - */ - -%% The following software may be included in this product: Apache Derby. Use of any of this software is governed by the terms of the license below: - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - +DO NOT TRANSLATE OR LOCALIZE. + +%% The following software may be included in this product: CS CodeViewer v1.0; Use of any of this software is governed by the terms of the license below: +Copyright 1999 by CoolServlets.com. + +Any errors or suggested improvements to this class can be reported as instructed on CoolServlets.com. We hope you enjoy this program... your comments will encourage further development! +This software is distributed under the terms of the BSD License. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. +Neither name of CoolServlets.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING INANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + +%% The following software may be included in this product: Crimson v1.1.1 ; Use of any of this software is governed by the terms of the license below: +/* +* The Apache Software License, Version 1.1 +* +* +* Copyright (c) 1999-2000 The Apache Software Foundation. All rights * reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* +* 3. The end-user documentation included with the redistribution, +* if any, must include the following acknowledgment: +* "This product includes software developed by the +* Apache Software Foundation (http://www.apache.org/)." +* Alternately, this acknowledgment may appear in the software itself, +* if and wherever such third-party acknowledgments normally appear. +* +* 4. The names "Crimson" and "Apache Software Foundation" must +* not be used to endorse or promote products derived from this +* software without prior written permission. For written +* permission, please contact apache@apache.org. +* +* 5. Products derived from this software may not be called "Apache", +* nor may "Apache" appear in their name, without prior written +* permission of the Apache Software Foundation. +* +* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR +* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +* SUCH DAMAGE. +* ====================================================================* +* This software consists of voluntary contributions made by many +* individuals on behalf of the Apache Software Foundation and was +* originally based on software copyright (c) 1999, International +* Business Machines, Inc., http://www.ibm.com. For more +* information on the Apache Software Foundation, please see +* . +*/ + + +%% The following software may be included in this product: Xalan J2; Use of any of this software is governed by the terms of the license below: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + + + +%% The following software may be included in this product: NSIS 1.0j; Use of any of this software is governed by the terms of the license below: +Copyright (C) 1999-2000 Nullsoft, Inc. +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. Justin Frankel justin@nullsoft.com" + +%% Some Portions licensed from IBM are available at: +http://www.ibm.com/software/globalization/icu/ + +%% Portions Copyright Eastman Kodak Company 1992 + +%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the U.S. and other countries. + +%% Portions licensed from Taligent, Inc. + +%% The following software may be included in this product:IAIK PKCS Wrapper; Use of any of this software is governed by the terms of the license below: + +Copyright (c) 2002 Graz University of Technology. All rights reserved. +Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: + + "This product includes software developed by IAIK of Graz University of Technology." + + Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. + +4. The names "Graz University of Technology" and "IAIK of Graz University of Technology" must not be used to endorse or promote products derived from this software without prior written permission. + +5. Products derived from this software may not be called "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior written permission of Graz University of Technology. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +%% The following software may be included in this product: Document Object Model (DOM) v. Level 3; Use of any of this software is governed by the terms of the license below: +W3Cýý SOFTWARE NOTICE AND LICENSE + +http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + +This work (and included software, documentation such as READMEs, or other related items) is being +provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you +(the licensee) agree that you have read, understood, and will comply with the following terms and conditions. + +Permission to copy, modify, and distribute this software and its documentation, with or without modification, for +any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies +of the software and documentation or portions thereof, including modifications: + 1.The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. + 2.Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the + W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body + of any redistributed or derivative code. + 3.Notice of any changes or modifications to the files, including the date changes were made. (We + recommend you provide URIs to the location from which the code is derived.) +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKENO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, +WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THEUSE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the +software without specific, written prior permission. Title to copyright in this software and any associated +documentation will at all times remain with copyright holders. + +____________________________________ + +This formulation of W3C's notice and license became active on December 31 2002. This version removes the +copyright ownership notice such that this license can be used with materials other than those owned by the +W3C, reflects that ERCIM is now a host of the W3C, includes references to this specific dated version of the +license, and removes the ambiguous grant of "use". Otherwise, this version is the same as the previous +version and is written so as to preserve the Free Software Foundation's assessment of GPL compatibility and +OSI's certification under the Open Source Definition. Please see our Copyright FAQ for common questions +about using materials from our site, including specific terms and conditions for packages like libwww, Amaya, +and Jigsaw. Other questions about this notice can be directed to +site-policy@w3.org. + +%% The following software may be included in this product: Xalan, Xerces; Use of any of this software is governed by the terms of the license below: /* + * The Apache Software License, Version 1.1 + * + * + * Copyright (c) 1999-2003 The Apache Software Foundation. All rights * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. * + * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * + * 4. The names "Xerces" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation and was + * originally based on software copyright (c) 1999, International + * Business Machines, Inc., http://www.ibm.com. For more + * information on the Apache Software Foundation, please see + * + +%% The following software may be included in this product: W3C XML Conformance Test Suites v. 20020606; Use of any of this software is governed by the terms of the license below: +W3Cýý SOFTWARE NOTICE AND LICENSE +Copyright ýý 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/ +This W3C work (including software, documents, or other related items) is beingprovided by the copyright holders under the following license. By obtaining,using and/or copying this work, you (the licensee) agree that you have read,understood, and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its +documentation, with or without modification, for any purpose and without fee orroyalty is hereby granted, provided that you include the following on ALL copiesof the software and documentation or portions thereof, including modifications,that you make: + + 1. The full text of this NOTICE in a location viewable to users of theredistributed or derivative work. + 2. Any pre-existing intellectual property disclaimers, notices, or terms andconditions. If none exist, a short notice of the following form (hypertext ispreferred, text is permitted) should be used within the body of any +redistributed or derivative code: "Copyright ýý [$date-of-software] World WideWeb Consortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" + 3. Notice of any changes or modifications to the W3C files, including thedate changes were made. (We recommend you provide URIs to the location fromwhich the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKENO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITEDTO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THATTHE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTYPATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. +The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to the software without specific, written prior permission.Title to copyright in this software and any associated documentation will at alltimes remain with copyright holders. + +____________________________________ + +This formulation of W3C's notice and license became active on August 14 1998 soas to improve compatibility with GPL. This version ensures that W3C softwarelicensing terms are no more restrictive than GPL and consequently W3C softwaremay be distributed in GPL packages. See the older formulation for the policyprior to this date. Please see our Copyright FAQ for common questions aboutusing materials from our site, including specific terms and conditions forpackages like libwww, Amaya, and Jigsaw. Other questions about this notice canbe directed to site-policy@w3.org. + +%% The following software may be included in this product: W3C XML Schema Test Collection v. 1.16.2; Use of any of this software is governed by the terms of the license below: W3Cýýýý DOCUMENT NOTICE AND LICENSE +Copyright ýýýý 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/ + +Public documents on the W3C site are provided by the copyright holders under thefollowing license. The software or Document Type Definitions (DTDs) associatedwith W3C specifications are governed by the Software Notice. By using and/orcopying this document, or the W3C document from which this statement is linked,you (the licensee) agree that you have read, understood, and will comply withthe following terms and conditions: + +Permission to use, copy, and distribute the contents of this document, or theW3C document from which this statement is linked, in any medium for any purposeand without fee or royalty is hereby granted, provided that you include thefollowing on ALL copies of the document, or portions thereof, that you use: + 1. A link or URL to the original W3C document. + 2. The pre-existing copyright notice of the original author, or if it doesn'texist, a notice of the form: "Copyright ýýýý [$date-of-document] World Wide WebConsortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but atextual representation is permitted.) + 3. If it exists, the STATUS of the W3C document. + +When space permits, inclusion of the full text of this NOTICE should beprovided. We request that authorship attribution be provided in any software,documents, or other items or products that you create pursuant to the +implementation of the contents of this document, or any portion thereof. +No right to create modifications or derivatives of W3C documents is grantedpursuant to this license. However, if additional requirements (documented in theCopyright FAQ) are satisfied, the right to create modifications or derivativesis sometimes granted by the W3C to individuals complying with those requirements. +THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONSOR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE;THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THEIMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCEOR IMPLEMENTATION OF THE CONTENTS THEREOF. + +The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to this document or its contents without specific, writtenprior permission. Title to copyright in this document will at all times remainwith copyright holders. + +---------------------------------------------------------------------------- +This formulation of W3C's notice and license became active on April 05 1999 soas to account for the treatment of DTDs, schema's and bindings. See the olderformulation for the policy prior to this date. Please see our Copyright FAQ forcommon questions about using materials from our site, including specific termsand conditions for packages like libwww, Amaya, and Jigsaw. Other questionsabout this notice can be directed to site-policy@w3.org. +webmaster +(last updated by reagle on 1999/04/99.) + + + +%% The following software may be included in this product: Mesa 3-D graphics library v. 5; Use of any of this software is governed by the terms of the license below: core Mesa code include/GL/gl.h Brian Paul Mesa + +GLX driver include/GL/glx.h Brian Paul Mesa + +Ext registry include/GL/glext.h SGI SGI Free B + include/GL/glxext.h + +Mesa license: + +The Mesa distribution consists of several components. Different copyrights andlicenses apply to different components. For example, GLUT is copyrighted by MarkKilgard, some demo programs are copyrighted by SGI, some of the Mesa devicedrivers are copyrighted by their authors. See below for a list of Mesa'scomponents and the copyright/license for each. + +The core Mesa library is licensed according to the terms of the XFree86copyright (an MIT-style license). This allows integration with the XFree86/DRIproject. Unless otherwise stated, the Mesa source code and documentation islicensed as follows: + +Copyright (C) 1999-2003 Brian Paul All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining acopy of this software and associated documentation files (the "Software"),to deal in the Software without restriction, including without limitationthe rights to use, copy, modify, merge, publish, distribute, sublicense,and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be includedin all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALLBRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER INAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +SGI FREE SOFTWARE LICENSE B (Version 1.1 [02/22/2000]) +1. Definitions. +1.1 "Additional Notice Provisions" means such additional provisions as appear in the Notice in Original Code under the heading "Additional Notice Provisions."1.2 "Covered Code" means the Original Code or Modifications, or any combination thereof.1.3 "Hardware" means any physical device that accepts input, processes input, stores the results of processing, and/or provides output.1.4 "Larger Work" means a work that combines Covered Code or portions thereof with code not governed by the terms of this License.1.5 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.1.6 "License" means this document. +1.7 "Licensed Patents" means patent claims Licensable by SGI that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof.1.8 "Modifications" means any addition to or deletion from the substance or structure of the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to the contents of a file containing Original Code and/or addition to or deletion from the contents of a file containing previous Modifications.B. Any new file that contains any part of the Original Code or previous Modifications.1.9 "Notice" means any notice in Original Code or Covered Code, as required by and in compliance with this License.1.10 "Original Code" means source code of computer software code that is described in the source code Notice required by Exhibit A as Original Code, and updates and error corrections specifically thereto.1.11 "Recipient" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 8. For legal entities, "Recipient" includes any entity that controls, is controlled by, or is under common control with Recipient. For purposes of this definition, "control" of an entity means (a) the power, direct or indirect, to direct or manage such entity, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity.1.12 "Recipient Patents" means patent claims Licensable by a Recipient that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof. 1.13 "SGI" means Silicon Graphics, Inc. +1.14 "SGI Patents" means patent claims Licensable by SGI other than the Licensed Patents.2. License Grant and Restrictions. +2.1 SGI License Grant. Subject to the terms of this License and any third party intellectual property claims, for the duration of intellectual property protections inherent in the Original Code, SGI hereby grants Recipient a worldwide, royalty-free, non-exclusive license, to do the following: (i) under copyrights Licensable by SGI, to reproduce, distribute, create derivative works from, and, to the extent applicable, display and perform the Original Code and/or any Modifications provided by SGI alone and/or as part of a Larger Work; and (ii) under any Licensable Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI. Recipient accepts the terms and conditions of this License by undertaking any of the aforementioned actions. The patent license shall apply to the Covered Code if, at the time any related Modification is added, such addition of the Modification causes such combination to be covered by the Licensed Patents. The patent license in Section 2.1(ii) shall not apply to any other combinations that include the Modification. No patent license is provided under SGI Patents for infringements of SGI Patents by Modifications not provided by SGI or combinations of Original Code and Modifications not provided by SGI. 2.2 Recipient License Grant. Subject to the terms of this License and any third party intellectual property claims, Recipient hereby grants SGI and any other Recipients a worldwide, royalty-free, non-exclusive license, under any Recipient Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI.2.3 No License For Hardware Implementations. The licenses granted in Section 2.1 and 2.2 are not applicable to implementation in Hardware of the algorithms embodied in the Original Code or any Modifications provided by SGI .3. Redistributions. +3.1 Retention of Notice/Copy of License. The Notice set forth in Exhibit A, below, must be conspicuously retained or included in any and all redistributions of Covered Code. For distributions of the Covered Code in source code form, the Notice must appear in every file that can include a text comments field; in executable form, the Notice and a copy of this License must appear in related documentation or collateral where the Recipient's rights relating to Covered Code are described. Any Additional Notice Provisions which actually appears in the Original Code must also be retained or included in any and all redistributions of Covered Code.3.2 Alternative License. Provided that Recipient is in compliance with the terms of this License, Recipient may, so long as without derogation of any of SGI's rights in and to the Original Code, distribute the source code and/or executable version(s) of Covered Code under (1) this License; (2) a license identical to this License but for only such changes as are necessary in order to clarify Recipient's role as licensor of Modifications; and/or (3) a license of Recipient's choosing, containing terms different from this License, provided that the license terms include this Section 3 and Sections 4, 6, 7, 10, 12, and 13, which terms may not be modified or superseded by any other terms of such license. If Recipient elects to use any license other than this License, Recipient must make it absolutely clear that any of its terms which differ from this License are offered by Recipient alone, and not by SGI. It is emphasized that this License is a limited license, and, regardless of the license form employed by Recipient in accordance with this Section 3.2, Recipient may relicense only such rights, in Original Code and Modifications by SGI, as it has actually been granted by SGI in this License.3.3 Indemnity. Recipient hereby agrees to indemnify SGI for any liability incurred by SGI as a result of any such alternative license terms Recipient offers.4. Termination. This License and the rights granted hereunder will terminate automatically if Recipient breaches any term herein and fails to cure such breach within 30 days thereof. Any sublicense to the Covered Code that is properly granted shall survive any termination of this License, absent termination by the terms of such sublicense. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive.5. No Trademark Or Other Rights. This License does not grant any rights to: (i) any software apart from the Covered Code, nor shall any other rights or licenses not expressly granted hereunder arise by implication, estoppel or otherwise with respect to the Covered Code; (ii) any trade name, trademark or service mark whatsoever, including without limitation any related right for purposes of endorsement or promotion of products derived from the Covered Code, without prior written permission of SGI; or (iii) any title to or ownership of the Original Code, which shall at all times remains with SGI. All rights in the Original Code not expressly granted under this License are reserved. 6. Compliance with Laws; Non-Infringement. There are various worldwide laws, regulations, and executive orders applicable to dispositions of Covered Code, including without limitation export, re-export, and import control laws, regulations, and executive orders, of the U.S. government and other countries, and Recipient is reminded it is obliged to obey such laws, regulations, and executive orders. Recipient may not distribute Covered Code that (i) in any way infringes (directly or contributorily) any intellectual property rights of any kind of any other person or entity or (ii) breaches any representation or warranty, express, implied or statutory, to which, under any applicable law, it might be deemed to have been subject.7. Claims of Infringement. If Recipient learns of any third party claim that any disposition of Covered Code and/or functionality wholly or partially infringes the third party's intellectual property rights, Recipient will promptly notify SGI of such claim.8. Versions of the License. SGI may publish revised and/or new versions of the License from time to time, each with a distinguishing version number. Once Covered Code has been published under a particular version of the License, Recipient may, for the duration of the license, continue to use it under the terms of that version, or choose to use such Covered Code under the terms of any subsequent version published by SGI. Subject to the provisions of Sections 3 and 4 of this License, only SGI may modify the terms applicable to Covered Code created under this License.9. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED "AS IS." ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. SGI ASSUMES NO RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY IS AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT SUBJECT TO THIS DISCLAIMER.10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES NOR LEGAL THEORY, WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT.11. Indemnity. Recipient shall be solely responsible for damages arising, directly or indirectly, out of its utilization of rights under this License. Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from and against any loss, liability, damages, costs or expenses (including the payment of reasonable attorneys fees) arising out of Recipient's use, modification, reproduction and distribution of the Covered Code or out of any representation or warranty made by Recipient.12. U.S. Government End Users. The Covered Code is a "commercial item" consisting of "commercial computer software" as such terms are defined in title 48 of the Code of Federal Regulations and all U.S. Government End Users acquire only the rights set forth in this License and are subject to the terms of this License.13. Miscellaneous. This License represents the complete agreement concerning the its subject matter. If any provision of this License is held to be unenforceable, such provision shall be reformed so as to achieve as nearly as possible the same legal and economic effect as the original provision and the remainder of this License will remain in effect. This License shall be governed by and construed in accordance with the laws of the United States and the State of California as applied to agreements entered into and to be performed entirely within California between California residents. Any litigation relating to this License shall be subject to the exclusive jurisdiction of the Federal Courts of the Northern District of California (or, absent subject matter jurisdiction in such courts, the courts of the State of California), with venue lying exclusively in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation that provides that the language of a contract shall be construed against the drafter shall not apply to this License. +Exhibit A +License Applicability. Except to the extent portions of this file are made subject to an alternative license as permitted in the SGI Free Software License B, Version 1.1 (the "License"), the contents of this file are subject only to the provisions of the License. You may not use this file except in compliance with the License. You may obtain a copy of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: http://oss.sgi.com/projects/FreeB +Note that, as provided in the License, the Software is distributed on an "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.Original Code. The Original Code is: [name of software, version number, and release date], developed by Silicon Graphics, Inc. The Original Code is Copyright (c) [dates of first publication, as appearing in the Notice in the Original Code] Silicon Graphics, Inc. Copyright in any portions created by third parties is as indicated elsewhere herein. All Rights Reserved.Additional Notice Provisions: [such additional provisions, if any, as appear in the Notice in the Original Code under the heading "Additional Notice Provisions"] +%% The following software may be included in this product: Byte Code Engineering Library (BCEL) v. 5; Use of any of this software is governed by the terms of the license below: + Apache Software License + + /* +==================================================================== * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. Allrights + * reserved. + * + * Redistribution and use in source and binary forms, withor without + * modification, are permitted provided that the followingconditions + * are met: + * + * 1. Redistributions of source code must retain the abovecopyright + * notice, this list of conditions and the followingdisclaimer. + * + * 2. Redistributions in binary form must reproduce theabove copyright + * notice, this list of conditions and the followingdisclaimer in + * the documentation and/or other materials providedwith the + * distribution. + * + * 3. The end-user documentation included with theredistribution, + * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation +(http://www.apache.org/)." + * Alternately, this acknowledgment may appear in thesoftware itself, + * if and wherever such third-party acknowledgmentsnormally appear. + * + * 4. The names "Apache" and "Apache Software Foundation"and + * "Apache BCEL" must not be used to endorse or promoteproducts + * derived from this software without prior writtenpermission. For + * written permission, please contact apache@apache.org. * + * 5. Products derived from this software may not be called"Apache", + * "Apache BCEL", nor may "Apache" appear in their name,without + * prior written permission of the Apache SoftwareFoundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED ORIMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSEARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWAREFOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVERCAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING INANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF + * SUCH DAMAGE. + * +==================================================================== * + * This software consists of voluntary contributions madeby many + * individuals on behalf of the Apache Software +Foundation. For more + + + * information on the Apache Software Foundation, pleasesee + * . + */ + + + +%% The following software may be included in this product: Regexp, Regular Expression Package v. 1.2; Use of any of this software is governed by the terms of the license below: The Apache Software License, Version 1.1 +Copyright (c) 2001 The Apache Software Foundation. All rights +reserved. +Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the +distribution. + +3. The end-user documentation included with the redistribution, +if any, must include the following acknowledgment: +"This product includes software developed by the +Apache Software Foundation (http://www.apache.org/)." +Alternately, this acknowledgment may appear in the software itself, +if and wherever such third-party acknowledgments normally appear. + +4. The names "Apache" and "Apache Software Foundation" and +"Apache Turbine" must not be used to endorse or promote products +derived from this software without prior written permission. For +written permission, please contact apache@apache.org. + +5. Products derived from this software may not be called "Apache", +"Apache Turbine", nor may "Apache" appear in their name, without +prior written permission of the Apache Software Foundation. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +==================================================================== +This software consists of voluntary contributions made by many +individuals on behalf of the Apache Software Foundation. For more +information on the Apache Software Foundation, please see + +http://www.apache.org. + +%% The following software may be included in this product: CUP Parser Generator for Java v. 0.10k; Use of any of this software is governed by the terms of the license below: CUP Parser Generator Copyright Notice, License, and Disclaimer + +Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, provided thatthe above copyright notice appear in all copies and that both the copyrightnotice and this permission notice and warranty disclaimer appear in +supporting documentation, and that the names of the authors or their employersnot be used in advertising or publicity pertaining to distribution of +the software without specific, written prior permission. + +The authors and their employers disclaim all warranties with regard to thissoftware, including all implied warranties of merchantability and +fitness. In no event shall the authors or their employers be liable for anyspecial, indirect or consequential damages or any damages whatsoever +resulting from loss of use, data or profits, whether in an action of contract,negligence or other tortious action, arising out of or in connection withthe use or performance of this software. + +%% The following software may be included in this product: JLex: A Lexical Analyzer Generator for Java v. 1.2.5; Use of any of this software is governed by the terms of the license below: JLEX COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. + +Copyright 1996-2003 by Elliot Joel Berk and C. Scott Ananian + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose +and without fee is hereby granted, provided that the above copyright noticeappear in all copies +and that both the copyright notice and this permission notice and warrantydisclaimer appear in +supporting documentation, and that the name of the authors or their employersnot be used in +advertising or publicity pertaining to distribution of the software withoutspecific, written prior +permission. + +The authors and their employers disclaim all warranties with regard to thissoftware, including all +implied warranties of merchantability and fitness. In no event shall the authorsor their employers +be liable for any special, indirect or consequential damages or any damageswhatsoever resulting +from loss of use, data or profits, whether in an action of contract, negligenceor other tortious +action, arising out of or in connection with the use or performance of thissoftware. + +Java is a trademark of Sun Microsystems, Inc. References to the Java programminglanguage in +relation to JLex are not meant to imply that Sun endorses this +product. + +%% The following software may be included in this product: SAX v. 2.0.1; Use of any of this software is governed by the terms of the license below: Copyright Status + + SAX is free! + + In fact, it's not possible to own a license to SAX, since it's been placed in the public + domain. + + No Warranty + + Because SAX is released to the public domain, there is no warranty for the design or for + the software implementation, to the extent permitted by applicable law. Except when + otherwise stated in writing the copyright holders and/or other parties provide SAX "as is" + without warranty of any kind, either expressed or implied, including, but not limited to, the + implied warranties of merchantability and fitness for a particular purpose. The entire risk as + to the quality and performance of SAX is with you. Should SAX prove defective, you + assume the cost of all necessary servicing, repair or correction. + + In no event unless required by applicable law or agreed to in writing will any copyright + holder, or any other party who may modify and/or redistribute SAX, be liable to you for + damages, including any general, special, incidental or consequential damages arising out of + the use or inability to use SAX (including but not limited to loss of data or data being + rendered inaccurate or losses sustained by you or third parties or a failure of the SAX to + operate with any other programs), even if such holder or other party has been advised of + the possibility of such damages. + + Copyright Disclaimers + + This page includes statements to that effect by David Megginson, who would have been + able to claim copyright for the original work. + SAX 1.0 + + Version 1.0 of the Simple API for XML (SAX), created collectively by the membership of + the XML-DEV mailing list, is hereby released into the public domain. + + No one owns SAX: you may use it freely in both commercial and non-commercial + applications, bundle it with your software distribution, include it on a CD-ROM, list the + source code in a book, mirror the documentation at your own web site, or use it in any + other way you see fit. + + David Megginson, sax@megginson.com + 1998-05-11 + + SAX 2.0 + + I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and release + all of the SAX 2.0 source code, compiled code, and documentation contained in this + distribution into the Public Domain. SAX comes with NO WARRANTY or guarantee of + fitness for any purpose. + + David Megginson, david@megginson.com + 2000-05-05 + +%% The following software may be included in this product: Cryptix; Use of any of this software is governed by the terms of the license below: +Cryptix General License + +Copyright © 1995-2003 The Cryptix Foundation Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions aremet: + + 1.Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. 2.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS ORIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FORA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BELIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOTLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESSINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OFTHE POSSIBILITY OF SUCH DAMAGE. + +%% The following software may be included in this product: W3C XML Schema Test Collection; Use of any of this software is governed by the terms of the license below: +W3C® DOCUMENT NOTICE AND LICENSE +Copyright © 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/ + +Public documents on the W3C site are provided by the copyright holders under thefollowing license. The software or Document Type Definitions (DTDs) associatedwith W3C specifications are governed by the Software Notice. By using and/orcopying this document, or the W3C document from which this statement is linked,you (the licensee) agree that you have read, understood, and will comply withthe following terms and conditions: + +Permission to use, copy, and distribute the contents of this document, or theW3C document from which this statement is linked, in any medium for any purposeand without fee or royalty is hereby granted, provided that you include thefollowing on ALL copies of the document, or portions thereof, that you use: + 1. A link or URL to the original W3C document. + 2. The pre-existing copyright notice of the original author, or if it doesn'texist, a notice of the form: "Copyright © [$date-of-document] World Wide WebConsortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but atextual representation is permitted.) + 3. If it exists, the STATUS of the W3C document. + +When space permits, inclusion of the full text of this NOTICE should beprovided. We request that authorship attribution be provided in any software,documents, or other items or products that you create pursuant to the +implementation of the contents of this document, or any portion thereof. +No right to create modifications or derivatives of W3C documents is grantedpursuant to this license. However, if additional requirements (documented in theCopyright FAQ) are satisfied, the right to create modifications or derivativesis sometimes granted by the W3C to individuals complying with those requirements. +THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONSOR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE;THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THEIMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCEOR IMPLEMENTATION OF THE CONTENTS THEREOF. + +The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to this document or its contents without specific, writtenprior permission. Title to copyright in this document will at all times remainwith copyright holders. + +---------------------------------------------------------------------------- +This formulation of W3C's notice and license became active on April 05 1999 soas to account for the treatment of DTDs, schema's and bindings. See the olderformulation for the policy prior to this date. Please see our Copyright FAQ forcommon questions about using materials from our site, including specific termsand conditions for packages like libwww, Amaya, and Jigsaw. Other questionsabout this notice can be directed to site-policy@w3.org. +webmaster +(last updated by reagle on 1999/04/99.) + +%% The following software may be included in this product: Stax API; Use of any of this software is governed by the terms of the license below: +Streaming API for XML (JSR-173) Specification +Reference Implementation +License Agreement + +READ THE TERMS OF THIS (THE "AGREEMENT") CAREFULLY BEFORE VIEWING OR USING THESOFTWARE LICENS +ED HEREUNDER. BY VIEWING OR USING THE SOFTWARE, YOU AGREE TO THE TERMS OF THISAGREEMENT. IF +YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, INDICATE YOUR ACCEPTANCE OF THESETERMS BY SELE +CTING THE "ACCEPT" BUTTON AT THE END OF THIS AGREEMENT. IF YOU DO NOT AGREE TOALL THESE TERMS +, PROMPTLY RETURN THE UNUSED SOFTWARE TO ORIGINAL CONTRIBUTOR, DEFINED HEREIN. +1.0 DEFINITIONS. + +1.1. "BEA" means BEA Systems, Inc., the licensor of the Original Code. +1.2. "Contributor" means BEA and each entity that creates or contributes to thecreation of Mo +difications. + +1.3. "Covered Code" means the Original Code or Modifications or the combinationof the Origina +l Code and Modifications, in each case including portions thereof and +corresponding documentat +ion released with the source code. + +1.4. "Executable" means Covered Code in any form other than Source Code. +1.5. "FCS" means first commercial shipment of a product. + +1.6. "Modifications" means any addition to or deletion from the substance orstructure of eith +er the Original Code or any previous Modifications. When Covered Code isreleased as a series +of files, a Modification is: + +(a) Any addition to or deletion from the contents of a file containing OriginalCode or previ +ous Modifications. + +(b) Any new file that contains any part of the Original Code or previousModifications. + +1.7. "Original Code" means Source Code of computer software code ReferenceImplementation. + +1.8. "Patent Claims" means any patent claim(s), now owned or hereafter acquired,including wit +hout limitation, method, process, and apparatus claims, in any patent for whichthe grantor ha +s the right to grant a license. + +1.9. "Reference Implementation" means the prototype or "proof of concept"implementaÂtion of +the Specification developed and made available for license by or on behalf of BEA. +1.10. "Source Code" means the preferred form of the Covered Code for makingmodifications to i +t, including all modules it contains, plus any associated documentation,interface definition +files, scripts used to control compilation and installation of an Executable, orsource code d +ifferential comparisons against either the Original Code or another well known,available Cove +red Code of the Contributor's choice. + +1.11. "Specification" means the written specification for the Streaming API forXML , Java te +chnology developed pursuant to the Java Community Process. +1.12. "Technology Compatibility Kit" or "TCK" means the documentation, testingtools and test +suites associated with the Specification as may be revised by BEA from time totime, that is p +rovided so that an implementer of the SpecifiÂcation may determine if itsimplementation is co +mpliant with the Specification. + +1.13. "You" (or "Your") means an individual or a legal entity exercising rightsunder, and com +plying with all of the terms of, this Agreement or a future version of thisAgreement issued u +nder Section 6.1. For legal entities, "You" includes any entity which controls,is controlled +by, or is under common control with You. For purposes of this definition,"control" means (a) +the power, direct or indirect, to cause the direction or management of suchentity, whether by + contract or otherwise, or (b) ownership of more than fifty percent (50%) of theoutstanding s +hares or beneficial ownership of such entity. + +2.0 SOURCE CODE LICENSE. + +2.1. Copyright Grant. Subject to the terms of this Agreement, each Contributorhereby grants +You a non-exclusive, worldwide, royalty-free copyright license to reproduce,prepare derivativ +e works of, publicly display, publicly perform, distribute and sublicense theCovered Code of +such Contributor, if any, and such derivative works, in Source Code andExecutable form. + +2.2. Patent Grant. Subject to the terms of this Agreement, each Contributorhereby grants Yo +u a non-exclusive, worldwide, royalty-free patent license under the PatentClaims to make, use +, sell, offer to sell, import and otherwise transfer the Covered Code preparedand provided by + such Contributor, if any, in Source Code and Executable form. This patentlicense shall apply + to the Covered Code if, at the time a Modification is added by the Contributor,such addition + of the Modification causes such combination to be covered by the Patent Claims.The patent li +cense shall not apply to any other combinations which include the Modification. +2.3. Conditions to Grants. You understand that although each Contributorgrants the licenses + to the Covered Code prepared by it, no assurances are provided by anyContributor that the Co +vered Code does not infringe the patent or other intellectual property rights ofany other ent +ity. Each Contributor disclaims any liability to You for claims brought by anyother entity ba +sed on infringement of intellectual property rights or otherwise. As a conditionto exercising + the rights and licenses granted hereunder, You hereby assume sole +responsibility to secure an +y other intellectual property rights needed, if any. For example, if a thirdparty patent lice +nse is required to allow You to distribute Covered Code, it is Your +responsibility to acquire +that license before distributing such code. + +2.4. Contributors' Representation. Each Contributor represents that to itsknowledge it has +sufficient copyright rights in the Covered Code it provides , if any, to grantthe copyright l +icense set forth in this Agreement. + +3.0 DISTRIBUION RESTRICTIONS. + +3.1. Application of Agreement. + +The Modifications which You create or to which You contribute are governed bythe terms of thi +s Agreement, including without limitation Section 2.0. The Source Code versionof Covered Code + may be distributed only under the terms of this Agreement or a future versionof this Agreeme +nt released under Section 6.1, and You must include a copy of this Agreementwith every copy o +f the Source Code You distribute. You may not offer or impose any terms on anySource Code ver +sion that alters or restricts the applicable version of this Agreement or therecipients' righ +ts hereunder. However, You may include an additional document offering theadditional rights d +escribed in Section 3.3. + +3.2. Description of Modifications. + +You must cause all Covered Code to which You contribute to contain a filedocumenting the chan +ges You made to create that Covered Code and the date of any change. You mustinclude a promin +ent statement that the Modification is derived, directly or indirectly, fromOriginal Code pro +vided by BEA and including the name of BEA in (a) the Source Code, and (b) inany notice in an + Executable version or related documentation in which You describe the origin orownership of +the Covered Code. + +%% The following software may be included in this product: X Window System; Use of any of this software is governed by the terms of the license below: +Copyright The Open Group + +Permission to use, copy, modify, distribute, and sell this software and itsdocumentation for any purpose is hereby granted without fee, provided that theabove copyright notice appear in all copies and that both that copyright noticeand this permission notice appear in supporting documentation. + +The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUPBE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OFCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THESOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be usedin advertising or otherwise to promote the sale, use or other dealings in thisSoftware without prior written authorization from The Open Group. + +Portions also covered by other licenses as noted in the above URL. + +%% The following software may be included in this product: dom4j v. 1.6; Use of any of this software is governed by the terms of the license below: +Redistribution and use of this software and associated documentation +("Software"), with or without modification, are permitted provided that thefollowing conditions are met: + + 1. Redistributions of source code must retain copyright statements andnotices. Redistributions must also contain a copy of this document. + 2. Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentation and/orother materials provided with the distribution. + 3. The name "DOM4J" must not be used to endorse or promote products derivedfrom this Software without prior written permission of MetaStuff, Ltd. Forwritten permission, please contact dom4j-info@metastuff.com. + 4. Products derived from this Software may not be called "DOM4J" nor may"DOM4J" appear in their names without prior written permission of MetaStuff,Ltd. DOM4J is a registered trademark of MetaStuff, Ltd. + 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org +THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND ANYEXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FORANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ONANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. + +%% The following software may be included in this product: Retroweaver; Use of any of this software is governed by the terms of the license below: +Copyright (c) February 2004, Toby Reyelts +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Neither the name of Toby Reyelts nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +%% The following software may be included in this product: stripper; Use of any of this software is governed by the terms of the license below: +Stripper : debug information stripper + Copyright (c) 2003 Kohsuke Kawaguchi + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +%% The following software may be included in this product: libpng official PNG reference library; Use of any of this software is governed by the terms of the license below: +This copy of the libpng notices is provided for your convenience. In case ofany discrepancy between this copy and the notices in the file png.h that isincluded in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately followingthis sentence. + +libpng version 1.2.6, December 3, 2004, is +Copyright (c) 2004 Glenn Randers-Pehrson, and is +distributed according to the same disclaimer and license as libpng-1.2.5with the following individual added to the list of Contributing Authors + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, areCopyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6with the following individuals added to the list of Contributing Authors + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes or needs. This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, areCopyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96,with the following individuals added to the list of Contributing Authors: + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88,with the following individuals added to the list of Contributing Authors: + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors"is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authorsand Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and offitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary,or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute thissource code, or portions hereof, for any purpose, without fee, subjectto the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, withoutfee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use thissource code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about"boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is acertification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +December 3, 2004 + +%% The following software may be included in this product: Libungif - An uncompressed GIF library; Use of any of this software is governed by the terms of the license below: +The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond + +Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE. + + +%% The following software may be included in this product: Ant; Use of any of this software is governed by the terms of the license below: +License +The Apache Software License Version 2.0 + +The Apache Software License Version 2.0 applies to all releases of Ant startingwith ant 1.6.1 + +/* + * Apache License + * Version 2.0, January 2004 + * http://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, * and distribution as defined by Sections 1 through 9 of this document. * + * "Licensor" shall mean the copyright owner or entity authorized by * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all * other entities that control, are controlled by, or are under common * control with that entity. For the purposes of this definition, * "control" means (i) the power, direct or indirect, to cause the * direction or management of such entity, whether by contract or * otherwise, or (ii) ownership of fifty percent (50%) or more of the * outstanding shares, or (iii) beneficial ownership of such entity. * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, * including but not limited to software source code, documentation * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or * Object form, made available under the License, as indicated by a * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object * form, that is based on (or derived from) the Work and for which the * editorial revisions, annotations, elaborations, or other modifications * represent, as a whole, an original work of authorship. For the purposes * of this License, Derivative Works shall not include works that remain * separable from, or merely link (or bind by name) to the interfaces of, * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions * to that Work or Derivative Works thereof, that is intentionally * submitted to Licensor for inclusion in the Work by the copyright owner * or by an individual or Legal Entity authorized to submit on behalf of * the copyright owner. For the purposes of this definition, "submitted" * means any form of electronic, verbal, or written communication sent * to the Licensor or its representatives, including but not limited to * communication on electronic mailing lists, source code control systems, * and issue tracking systems that are managed by, or on behalf of, the * Licensor for the purpose of discussing and improving the Work, but * excluding communication that is conspicuously marked or otherwise * designated in writing by the copyright owner as "Not a Contribution." * + * "Contributor" shall mean Licensor and any individual or Legal Entity * on behalf of whom a Contribution has been received by Licensor and * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of * this License, each Contributor hereby grants to You a perpetual, * worldwide, non-exclusive, no-charge, royalty-free, irrevocable * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of * this License, each Contributor hereby grants to You a perpetual, * worldwide, non-exclusive, no-charge, royalty-free, irrevocable * (except as stated in this section) patent license to make, have made, * use, offer to sell, sell, import, and otherwise transfer the Work, * where such license applies only to those patent claims licensable * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) * with the Work to which such Contribution(s) was submitted. If You * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work * or a Contribution incorporated within the Work constitutes direct * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the * Work or Derivative Works thereof in any medium, with or without * modifications, and in Source or Object form, provided that You * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works * that You distribute, all copyright, patent, trademark, and * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must * include a readable copy of the attribution notices contained * within such NOTICE file, excluding those notices that do not * pertain to any part of the Derivative Works, in at least one * of the following places: within a NOTICE text file distributed * as part of the Derivative Works; within the Source form or * documentation, if provided along with the Derivative Works; or, * within a display generated by the Derivative Works, if and * wherever such third-party notices normally appear. The contents * of the NOTICE file are for informational purposes only and * do not modify the License. You may add Your own attribution * notices within Derivative Works that You distribute, alongside * or as an addendum to the NOTICE text from the Work, provided * that such additional attribution notices cannot be construed * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and * may provide additional or different license terms and conditions * for use, reproduction, or distribution of Your modifications, or * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, * any Contribution intentionally submitted for inclusion in the Work * by You to the Licensor shall be under the terms and conditions of * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify * the terms of any separate license agreement you may have executed * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade * names, trademarks, service marks, or product names of the Licensor, * except as required for reasonable and customary use in describing the * origin of the Work and reproducing the content of the NOTICE file. * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied, including, without limitation, any warranties or conditions * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the * appropriateness of using or redistributing the Work and assume any * risks associated with Your exercise of permissions under this License. * + * 8. Limitation of Liability. In no event and under no legal theory, * whether in tort (including negligence), contract, or otherwise, * unless required by applicable law (such as deliberate and grossly * negligent acts) or agreed to in writing, shall any Contributor be * liable to You for damages, including any direct, indirect, special, * incidental, or consequential damages of any character arising as a * result of this License or out of the use or inability to use the * Work (including but not limited to damages for loss of goodwill, * work stoppage, computer failure or malfunction, or any and all * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing * the Work or Derivative Works thereof, You may choose to offer, * and charge a fee for, acceptance of support, warranty, indemnity, * or other liability obligations and/or rights consistent with this * License. However, in accepting such obligations, You may act only * on Your own behalf and on Your sole responsibility, not on behalf * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * APPENDIX: How to apply the Apache License to your work. + * + * To apply the Apache License to your work, attach the following * boilerplate notice, with the fields enclosed by brackets "[]" + * replaced with your own identifying information. (Don't include * the brackets!) The text should be enclosed in the appropriate * comment syntax for the file format. We also recommend that a + * file or class name and description of purpose be included on the * same "printed page" as the copyright notice for easier + * identification within third-party archives. + * + * Copyright [yyyy] Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + */ + + +You can download the original license file here. + +The License is accompanied by a NOTICE + + ========================================================================= == NOTICE file corresponding to the section 4 d of == == the Apache License, Version 2.0, == == in this case for the Apache Ant distribution. == ========================================================================= + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + This product includes also software developed by : + - the W3C consortium (http://www.w3c.org) , + - the SAX project (http://www.saxproject.org) + + Please read the different LICENSE files present in the root directory of this distribution. + + The names "Ant" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact + apache@apache.org. + +The Apache Software License, Version 1.1 + +The Apache Software License, Version 1.1, applies to all versions of up to ant1.6.0 included. + +/* + * ============================================================================ * The Apache Software License, Version 1.1 + * ============================================================================ * + * Copyright (C) 2000-2003 The Apache Software Foundation. All + * rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: * + * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. + * + * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by the Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Ant" and "Apache Software Foundation" must not be used to * endorse or promote products derived from this software without prior * written permission. For written permission, please contact + * apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", nor may * "Apache" appear in their name, without prior written permission of the * Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software consists of voluntary contributions made by many individuals * on behalf of the Apache Software Foundation. For more information on the * Apache Software Foundation, please see . + * + */ + + +%% The following software may be included in this product: XML Resolver library; Use of any of this software is governed by the terms of the license below: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + +%% The following software may be included in this product: ICU4J; Use of any of this software is governed by the terms of the license below: +ICU License - ICU 1.8.1 and later COPYRIGHT AND PERMISSION NOTICE Cop +yright (c) +1995-2003 International Business Machines Corporation and others All rightsreserved. Permission is hereby granted, free of charge, to any person obtaininga copy of this software and associated documentation files (the "Software"), todeal in the Software without restriction, including without limitation therights to use, copy, modify, merge, publish, distribute, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,provided that the above copyright notice(s) and this permission notice appear inall copies of the Software and that both the above copyright notice(s) and thispermission notice appear in supporting documentation. THE SOFTWARE IS PROVIDED"AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOTLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSEAND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHTHOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANYSPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTINGFROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCEOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE ORPERFORMANCE OF THIS SOFTWARE. Except as contained in this notice, the name of acopyright holder shall not be used in advertising or otherwise to promote thesale, use or other dealings in this Software without prior written authorizationof the copyright holder. + + +%% The following software may be included in this product: NekoHTML; Use of any of this software is governed by the terms of the license below: +The CyberNeko Software License, Version 1.0 + + +(C) Copyright 2002,2003, Andy Clark. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. The end-user documentation included with the redistribution, + if any, must include the following acknowledgment: + "This product includes software developed by Andy Clark." + Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. + +4. The names "CyberNeko" and "NekoHTML" must not be used to endorse + or promote products derived from this software without prior + written permission. For written permission, please contact + andy@cyberneko.net. + +5. Products derived from this software may not be called "CyberNeko", + nor may "CyberNeko" appear in their name, without prior written + permission of the author. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +==================================================================== +This license is based on the Apache Software License, version 1.1 + + +%% The following software may be included in this product: Jing; Use of any of this software is governed by the terms of the license below: +Jing Copying Conditions + +Copyright (c) 2001-2003 Thai Open Source Software Center Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice,this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentation and/orother materials provided with the distribution. + * Neither the name of the Thai Open Source Software Center Ltd nor the namesof its contributors may be used to endorse or promote products derived from thissoftware without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ANDANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ONANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +%% The following software may be included in this product: RelaxNGCC; Use of any of this software is governed by the terms of the license below: +Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. The end-user documentation included with the redistribution, if +any, must include the following acknowledgment: + + "This product includes software developed by Daisuke Okajima + and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)." + +Alternately, this acknowledgment may appear in the software itself, +if and wherever such third-party acknowledgments normally appear. + +4. The names of the copyright holders must not be used to endorse or +promote products derived from this software without prior written +permission. For written permission, please contact the copyright +holders. + +5. Products derived from this software may not be called "RELAXNGCC", +nor may "RELAXNGCC" appear in their name, without prior written +permission of the copyright holders. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +%% The following software may be included in this product: RELAX NG Object Model/Parser; Use of any of this software is governed by the terms of the license below: +The MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy ofthis software and associated documentation files (the "Software"), to deal inthe Software without restriction, including without limitation the rights touse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,subject to the following conditions: + +The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS ORCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHERIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +%% The following software may be included in this product: XFree86-VidMode Extension; Use of any of this software is governed by the terms of the license below: +Version 1.1 of +XFree86ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýý ProjectLicence. + + Copyright (C) 1994-2004 The +XFree86ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýProject, Inc. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to deal inthe Software without restriction, including without limitation the rights touse, copy, modify, merge, publish, distribute, sublicence, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,subject to the following conditions: + + 1. Redistributions of source code must retain the above copyright notice,this list of conditions, and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution, and in thesame place and form as other copyright, license and disclaimer information. 3. The end-user documentation included with the redistribution, if any,must include the following acknowledgment: "This product includes softwaredeveloped by The XFree86 Project, Inc (http://www.xfree86.org/) and itscontributors", in the same place and form as other third-party acknowledgments.Alternately, this acknowledgment may appear in the software itself, in the sameform and location as other such third-party acknowledgments. + 4. Except as contained in this notice, the name of The XFree86 Project,Inc shall not be used in advertising or otherwise to promote the sale, use orother dealings in this Software without prior written authorization from TheXFree86 Project, Inc. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ANDFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE XFREE86PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ORBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER INCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISINGIN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITYOF SUCH DAMAGE. + + +%% The following software may be included in this product: RelaxNGCC; Use of any of this software is governed by the terms of the license below: +This is version 2003-May-08 of the Info-ZIP copyright and license. +The definitive version of this document should be available at +ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely. + + +Copyright (c) 1990-2003 Info-ZIP. All rights reserved. + +For the purposes of this copyright and license, "Info-ZIP" is defined asthe following set of individuals: + + Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, Jean-loup Gailly, Hunter Goatley, Ian Gorman, Chris Herborth, Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, Kai Uwe Rommel, Steve Salisbury, Dave Smith, Christian Spieler, Antoine Verheijen, + Paul von Behren, Rich Wales, Mike White + +This software is provided "as is," without warranty of any kind, expressor implied. In no event shall Info-ZIP or its contributors be held liablefor any direct, indirect, incidental, special or consequential damagesarising out of the use of or inability to use this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute itfreely, subject to the following restrictions: + + 1. Redistributions of source code must retain the above copyright notice, definition, disclaimer, and this list of conditions. + + 2. Redistributions in binary form (compiled executables) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution. The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a + self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled. + + 3. Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, and dynamic, shared, or static library versions--must be plainly marked as such and must not be misrepresented as being the original source. Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP. Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or of the Info-ZIP URL(s). + 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases. + + +%% The following software may be included in this product: XML Security; Use of any of this software is governed by the terms of the license below: + The Apache Software License, + Version 1.1 + + + PDF + + + Copyright (C) 2002 The Apache SoftwareFoundation. + All rights reserved. Redistribution anduse in + source and binary forms, with or withoutmodifica- + tion, are permitted provided that thefollowing + conditions are met: 1. Redistributions ofsource + code must retain the above copyrightnotice, this + list of conditions and the followingdisclaimer. + 2. Redistributions in binary form mustreproduce + the above copyright notice, this list of conditions and the following disclaimerin the + documentation and/or other materialsprovided with + the distribution. 3. The end-userdocumentation + included with the redistribution, if any,must + include the following acknowledgment:"This + product includes software developed bythe Apache + Software Foundation +(http://www.apache.org/)." + Alternately, this acknowledgment mayappear in the + software itself, if and wherever suchthird-party + acknowledgments normally appear. 4. Thenames + "Apache Forrest" and "Apache SoftwareFoundation" + must not be used to endorse or promoteproducts + derived from this software without priorwritten + permission. For written permission,please contact + apache@apache.org. 5. Products derivedfrom this + software may not be called "Apache", normay + "Apache" appear in their name, withoutprior + written permission of the Apache Software Foundation. THIS SOFTWARE IS PROVIDED``AS IS'' + AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THEIMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESSFOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NOEVENT + SHALL THE APACHE SOFTWARE FOUNDATION ORITS + CONTRIBUTORS BE LIABLE FOR ANY DIRECT,INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, ORCONSEQUENTIAL + DAMAGES (INCLU- DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ORSERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANYTHEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, + OR TORT (INCLUDING NEGLIGENCE OROTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF + SUCH DAMAGE. This software consists ofvoluntary + contributions made by many individuals onbehalf + of the Apache Software Foundation. Formore + information on the Apache SoftwareFoundation, + please see . + +%% The following software may be included in this product: Regexp, Regular Expression Package v. 1.2; Use of any of this software is governed by the terms of the license below: The Apache Software License, Version 1.1 +Copyright (c) 2001 The Apache Software Foundation. All rights +reserved. +Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the +distribution. + +3. The end-user documentation included with the redistribution, +if any, must include the following acknowledgment: +"This product includes software developed by the +Apache Software Foundation (http://www.apache.org/)." +Alternately, this acknowledgment may appear in the software itself, +if and wherever such third-party acknowledgments normally appear. + +4. The names "Apache" and "Apache Software Foundation" and +"Apache Turbine" must not be used to endorse or promote products +derived from this software without prior written permission. For +written permission, please contact apache@apache.org. + +5. Products derived from this software may not be called "Apache", +"Apache Turbine", nor may "Apache" appear in their name, without +prior written permission of the Apache Software Foundation. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +==================================================================== +This software consists of voluntary contributions made by many +individuals on behalf of the Apache Software Foundation. For more +information on the Apache Software Foundation, please see + +http://www.apache.org. + + +%% The following software may be included in this product: Visual Studio. Use of any of this software is governed by the terms of the license below: + +END-USER LICENSE AGREEMENT FOR MICROSOFT SOFTWARE +IMPORTANT-READ CAREFULLY: This End-User License Agreement ("EULA") is a legal +agreement between you (either an individual or a single entity) and Microsoft Corporation ("Microsoft) for the Microsoft software that accompanies this EULA, which includes computer software and may include associated media, printed materials, "online" or electronic documentation, and Internet-based services ("Software"). An amendment or addendum to this EULA may accompany the Software. YOU AGREE TO BE BOUND BY THE TERMS OF THIS EULA BY INSTALLING, COPYING, OR OTHERWISE USING THE SOFTWARE. IF YOU DO NOT AGREE, DO NOT INSTALL, COPY, OR USE THE SOFTWARE; YOU MAY RETURN IT TO YOUR PLACE OF PURCHASE (IF APPLICABLE) FOR A FULL REFUND. + +MICROSOFT SOFTWARE LICENSE + +1. GRANTS OF LICENSE. Microsoft grants you the rights described in this EULA +provided that you comply with all terms and conditions of this EULA. NOTE: Microsoft is not +licensing to you any rights with respect to Crystal Reports for Microsoft Visual Studio .NET; +your use of Crystal Reports for Microsoft Visual Studio .NET is subject to your acceptance of +the terms and conditions of the enclosed (hard copy) end user license agreement from Crystal +Decisions for that product. +1.1 General License Grant. Microsoft grants to you as an individual, a personal, +nonexclusive license to use the Software, and to make and use copies of the Software for the +purposes of designing, developing, testing, and demonstrating your software product(s), +provided that you are the only individual using the Software. +If you are an entity, Microsoft grants to you a personal, nonexclusive license to +use the Software, and to make and use copies of the Software, provided that for each individual +using the Software within your organization, you have acquired a separate and valid license for +each such individual. + +1.2 Documentation. You may make and use an unlimited number of copies of any +documentation, provided that such copies shall be used only for personal purposes and are not +to be republished or distributed (either in hard copy or electronic form) beyond your premises. +1.3 Storage/Network Use. You may also store or install a copy of the Software on a +storage device, such as a network server, used only to install or run the Software on computers +used by licensed end users in accordance with Section 1.1. A single license for the Software may +not be shared or used concurrently by multiple end users. +1.4 Visual Studio—Effect of EULA. As a suite of development tools and other +Microsoft software programs (each such tool or software program, a "Component"), +Components that you receive as part of the Software may include a separate end-user license +agreement (each, a "Component EULA"). Except as provided in Section 4 ("Prerelease Code"), in +the event of inconsistencies between this EULA and any Component EULA, the terms of this +EULA shall control. The Software may also contain third-party software programs. Any such +software is provided for your use as a convenience and your use is subject to the terms and +conditions of any license agreement contained in that software. +2. ADDITIONAL LICENSE RIGHTS -- REDISTRIBUTABLE CODE. In addition to the +rights granted in Section 1, certain portions of the Software, as described in this Section 2, are +provided to you with additional license rights. These additional license rights are conditioned +Everett VSPro 1 +Final 11.04.02 + + + +upon your compliance with the distribution requirements and license limitations described in +Section 3. + +2.1 Sample Code. Microsoft grants you a limited, nonexclusive, royalty-free license +to: (a) use and modify the source code version of those portions of the Software identified as +"Samples" in REDIST.TXT or elsewhere in the Software ("Sample Code") for the sole purposes +of designing, developing, and testing your software product(s), and (b) reproduce and +distribute the Sample Code, along with any modifications thereof, in object and/or source code +form. For applicable redistribution requirements for Sample Code, see Section 3.1 below. +2.2 Redistributable Code—General. Microsoft grants you a limited, nonexclusive, +royalty-free license to reproduce and distribute the object code form of any portion of the +Software listed in REDIST.TXT ("Redistributable Code"). For general redistribution +requirements for Redistributable Code, see Section 3.1 below. +2.3 Redistributable Code—Microsoft Merge Modules ("MSM"). Microsoft grants +you a limited, nonexclusive, royalty-free license to reproduce and distribute the content of MSM +file(s) listed in REDIST.TXT in the manner described in the Software documentation only so +long as you redistribute such content in its entirety and do not modify such content in any way. +For all other applicable redistribution requirements for MSM files, see Section 3.1 below. +2.4 Redistributable Code—Microsoft Foundation Classes (MFC), Active Template +Libraries (ATL), and C runtimes (CRTs). In addition to the rights granted in Section 1, +Microsoft grants you a license to use and modify the source code version of those portions of +the Software that are identified as MFC, ATL, or CRTs (collectively, the "VC Redistributables"), +for the sole purposes of designing, developing, and testing your software product(s). Provided +you comply with Section 3.1 and you rename any files created by you that are included in the +Licensee Software (defined below), Microsoft grants you a limited, nonexclusive, royalty-free +license to reproduce and distribute the object code version of the VC Redistributables, including +any modifications you make. For purposes of this section, "modifications" shall mean +enhancements to the functionality of the VC Redistributables. For all other applicable +redistribution requirements for VC Redistributables, see Section 3.1 below. +3. DISTRIBUTION REQUIREMENTS AND OTHER LICENSE RIGHTS AND +LIMITATIONS. If you choose to exercise your rights under Section 2, any redistribution by +you is subject to your compliance with Section 3.1; some of the Redistributable Code has +additional limited use rights described in Section 3.2. +3.1 General Distribution Requirements. +(a) If you choose to redistribute Sample Code, or Redistributable Code +(collectively, the "Redistributables") as described in Section 2, you agree: (i) except as otherwise +noted in Section 2.1 (Sample Code), to distribute the Redistributables only in object code form +and in conjunction with and as a part of a software application product developed by you that +adds significant and primary functionality to the Redistributables ("Licensee Software"); +(ii) that the Redistributables only operate in conjunction with Microsoft Windows platforms; +(iii) that if the Licensee Software is distributed beyond Licensee's premises or externally from +Licensee's organization, to distribute the Licensee Software containing the Redistributables +pursuant to an end user license agreement (which may be "break-the-seal", "click-wrap" or +signed), with terms no less protective than those contained in this EULA; (iv) not to use +Microsoft's name, logo, or trademarks to market the Licensee Software; (v) to display your own +valid copyright notice which shall be sufficient to protect Microsoft's copyright in the Software; +Everett VSPro 2 +Final 11.04.02 + + + +(vi) not to remove or obscure any copyright, trademark or patent notices that appear on the +Software as delivered to you; (vii) to indemnify, hold harmless, and defend Microsoft from and +against any claims or lawsuits, including attorney's fees, that arise or result from the use or +distribution of the Licensee Software; (viii) to otherwise comply with the terms of this EULA; +and (ix) agree that Microsoft reserves all rights not expressly granted. +You also agree not to permit further distribution of the Redistributables by your +end users except you may permit further redistribution of the Redistributables by your +distributors to your end-user customers if your distributors only distribute the Redistributables +in conjunction with, and as part of, the Licensee Software, you comply with all other terms of +this EULA, and your distributors comply with all restrictions of this EULA that are applicable +to you. + +(b) If you use the Redistributables, then in addition to your compliance with +the applicable distribution requirements described for the Redistributables, the following also +applies. Your license rights to the Redistributables are conditioned upon your not (i) creating +derivative works of the Redistributables in any manner that would cause the Redistributables in +whole or in part to become subject to any of the terms of an Excluded License; or (ii) +distributing the Redistributables (or derivative works thereof) in any manner that would cause +the Redistributables to become subject to any of the terms of an Excluded License. An +"Excluded License" is any license that requires as a condition of use, modification and/or +distribution of software subject to the Excluded License, that such software or other software +combined and/or distributed with such software be (x) disclosed or distributed in source code +form; (y) licensed for the purpose of making derivative works; or (z) redistributable at no +charge. +3.2 Additional Distribution Requirements for Certain Redistributable Code. +If you choose to redistribute the files discussed in this Section, then in addition to the terms of +Section 3.1, you must ALSO comply with the following. +(a) Microsoft SQL Server Desktop Engine ("MSDE"). If you redistribute +MSDE you agree to comply with the following additional requirements: (a) Licensee +Software shall not substantially duplicate the capabilities of Microsoft Access or, in the +reasonable opinion of Microsoft, compete with same; and (b) unless Licensee Software +requires your customers to license Microsoft Access in order to operate, you shall not +reproduce or use MSDE for commercial distribution in conjunction with a general +purpose word processing, spreadsheet or database management software product, or an +integrated work or product suite whose components include a general purpose word +processing, spreadsheet, or database management software product except for the +exclusive use of importing data to the various formats supported by Microsoft Access. +A product that includes limited word processing, spreadsheet or database components +along with other components which provide significant and primary value, such as an +accounting product with limited spreadsheet capability, is not considered to be a +"general purpose" product. +(b) Microsoft Data Access Components. If you redistribute the Microsoft +Data Access Component file identified as MDAC_TYP.EXE, you also agree to +redistribute such file in object code only in conjunction with and as a part of a Licensee +Software developed by you with a Microsoft development tool product that adds +significant and primary functionality to MDAC_TYP.EXE. +Everett VSPro 3 +Final 11.04.02 + + + +3.3 Separation of Components. The Software is licensed as a single product. Its +component parts may not be separated for use by more than one user. +3.4 Benchmark Testing. The Software may contain the Microsoft .NET Framework. +You may not disclose the results of any benchmark test of the .NET Framework component of +the Software to any third party without Microsoft's prior written approval. +4. PRERELEASE CODE. Portions of the Software may be identified as prerelease code +("Prerelease Code"). Such Prerelease Code is not at the level of performance and compatibility +of the final, generally available product offering. The Prerelease Code may not operate correctly +and may be substantially modified prior to first commercial shipment. Microsoft is not +obligated to make this or any later version of the Prerelease Code commercially available. The +grant of license to use Prerelease Code expires upon availability of a commercial release of the +Prerelease Code from Microsoft. NOTE: In the event that Prerelease Code contains a separate +end-user license agreement, the terms and conditions of such end-user license agreement shall +govern your use of the corresponding Prerelease Code. +5. RESERVATION OF RIGHTS AND OWNERSHIP. Microsoft reserves all rights not +expressly granted to you in this EULA. The Software is protected by copyright and other +intellectual property laws and treaties. Microsoft or its suppliers own the title, copyright, and +other intellectual property rights in the Software. The Software is licensed, not sold. +6. LIMITATIONS ON REVERSE ENGINEERING, DECOMPILATION, AND +DISASSEMBLY. You may not reverse engineer, decompile, or disassemble the Software, +except and only to the extent that such activity is expressly permitted by applicable law +notwithstanding this limitation. +7. NO RENTAL/COMMERCIAL HOSTING. You may not rent, lease, lend or provide +commercial hosting services with the Software. +8. CONSENT TO USE OF DATA. You agree that Microsoft and its affiliates may collect +and use technical information gathered as part of the product support services provided to you, +if any, related to the Software. Microsoft may use this information solely to improve our +products or to provide customized services or technologies to you and will not disclose this +information in a form that personally identifies you. +9. LINKS TO THIRD PARTY SITES. You may link to third party sites through the use of +the Software. The third party sites are not under the control of Microsoft, and Microsoft is not +responsible for the contents of any third party sites, any links contained in third party sites, or +any changes or updates to third party sites. Microsoft is not responsible for webcasting or any +other form of transmission received from any third party sites. Microsoft is providing these +links to third party sites to you only as a convenience, and the inclusion of any link does not +imply an endorsement by Microsoft of the third party site. +10. ADDITIONAL SOFTWARE/SERVICES. This EULA applies to updates, supplements, +add-on components, or Internet-based services components, of the Software that Microsoft may +provide to you or make available to you after the date you obtain your initial copy of the +Software, unless we provide other terms along with the update, supplement, add-on +component, or Internet-based services component. Microsoft reserves the right to discontinue +any Internet-based services provided to you or made available to you through the use of the +Software. +11. UPGRADES/DOWNGRADES +Everett VSPro 4 +Final 11.04.02 + + + +11.1 Upgrades. To use a version of the Software identified as an upgrade, you must +first be licensed for the software identified by Microsoft as eligible for the upgrade. After +upgrading, you may no longer use the software that formed the basis for your upgrade +eligibility. +11.2 Downgrades. Instead of installing and using the Software, you may install and +use copies of an earlier version of the Software, provided that you completely remove such +earlier version and install the current version of the Software within a reasonable time. Your +use of such earlier version shall be governed by this EULA, and your rights to use such earlier +version shall terminate when you install the Software. +11.3 Special Terms for Version 2003 Upgrade Editions of the Software. If the +Software accompanying this EULA is the version 2003 edition of the Software and you have +acquired it as an upgrade from the corresponding "2002" edition of the Microsoft software +product with the same product name as the Software (the "Qualifying Software"), then +Section 11.1 does not apply to you. Instead, you may continue to use the Qualifying Software +AND the version 2003 upgrade for so long as you continue to comply with the terms of this +EULA and the EULA governing your use of the Qualifying Software. Qualifying Software does +not include non-Microsoft software products. +12. NOT FOR RESALE SOFTWARE. Software identified as "Not For Resale" or "NFR," +may not be sold or otherwise transfered for value, or used for any purpose other than +demonstration, test or evaluation. +13. ACADEMIC EDITION SOFTWARE. To use Software identified as "Academic +Edition" or "AE," you must be a "Qualified Educational User." For qualification-related +questions, please contact the Microsoft Sales Information Center/One Microsoft +Way/Redmond, WA 98052-6399 or the Microsoft subsidiary serving your country. +14. EXPORT RESTRICTIONS. You acknowledge that the Software is subject to U.S. export +jurisdiction. You agree to comply with all applicable international and national laws that apply +to the Software, including the U.S. Export Administration Regulations, as well as end-user, end- +use, and destination restrictions issued by U.S. and other governments. For additional +information see . +15. SOFTWARE TRANSFER. The initial user of the Software may make a one-time +permanent transfer of this EULA and Software to another end user, provided the initial user +retains no copies of the Software. This transfer must include all of the Software (including all +component parts, the media and printed materials, any upgrades (including any Qualifying +Software as defined in Section 11.3), this EULA, and, if applicable, the Certificate of +Authenticity). The transfer may not be an indirect transfer, such as a consignment. Prior to the +transfer, the end user receiving the Software must agree to all the EULA terms. +16. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this +EULA if you fail to comply with the terms and conditions of this EULA. In such event, you +must destroy all copies of the Software and all of its component parts. +Everett VSPro 5 +Final 11.04.02 + + + +17. LIMITED WARRANTY FOR SOFTWARE ACQUIRED IN THE US AND CANADA. +Except for the "Redistributables," which are provided AS IS without warranty of any kind, +Microsoft warrants that the Software will perform substantially in accordance with the +accompanying materials for a period of ninety (90) days from the date of receipt. + +If an implied warranty or condition is created by your state/jurisdiction and federal or +state/provincial law prohibits disclaimer of it, you also have an implied warranty or condition, +BUT ONLY AS TO DEFECTS DISCOVERED DURING THE PERIOD OF THIS LIMITED +WARRANTY (NINETY DAYS). AS TO ANY DEFECTS DISCOVERED AFTER THE +NINETY-DAY PERIOD, THERE IS NO WARRANTY OR CONDITION OF ANY KIND. + +Some states/jurisdictions do not allow limitations on how long an implied warranty or + + +condition lasts, so the above limitation may not apply to you. +Any supplements or updates to the Software, including without limitation, any (if any) service +packs or hot fixes provided to you after the expiration of the ninety day Limited Warranty +period are not covered by any warranty or condition, express, implied or statutory. + + +LIMITATION ON REMEDIES; NO CONSEQUENTIAL OR OTHER DAMAGES. Your +exclusive remedy for any breach of this Limited Warranty is as set forth below. Except for any +refund elected by Microsoft, YOU ARE NOT ENTITLED TO ANY DAMAGES, +INCLUDING BUT NOT LIMITED TO CONSEQUENTIAL DAMAGES, if the Software does +not meet Microsoft's Limited Warranty, and, to the maximum extent allowed by applicable  +law, even if any remedy fails of its essential purpose. The terms of Section 19 ("Exclusion of +Incidental, Consequential and Certain Other Damages") are also incorporated into this Limited +Warranty. Some states/jurisdictions do not allow the exclusion or limitation of incidental or +consequential damages, so the above limitation or exclusion may not apply to you. This +Limited Warranty gives you specific legal rights. You may have other rights which vary from +state/jurisdiction to state/jurisdiction. YOUR EXCLUSIVE REMEDY. Microsoft's and its +suppliers' entire liability and your exclusive remedy for any breach of this Limited Warranty or +for any other breach of this EULA or for any other liability relating to the Software shall be, at +Microsoft's option from time to time exercised subject to applicable law, (a) return of the +amount paid (if any) for the Software, or (b) repair or replacement of the Software, that does not +meet this Limited Warranty and that is returned to Microsoft with a copy of your receipt. You +will receive the remedy elected by Microsoft without charge, except that you are responsible for +any expenses you may incur (e.g. cost of shipping the Software to Microsoft). This Limited +Warranty is void if failure of the Software has resulted from accident, abuse, misapplication, +  +abnormal use or a virus. Any replacement Software will be warranted for the remainder of the +original warranty period or thirty (30) days, whichever is longer, and Microsoft will use +commercially reasonable efforts to provide your remedy within a commercially reasonable time +of your compliance with Microsoft's warranty remedy procedures. Outside the United States or +Canada, neither these remedies nor any product support services offered by Microsoft are +available without proof of purchase from an authorized international source. To exercise your +remedy, contact: Microsoft, Attn. Microsoft Sales Information Center/One Microsoft +Way/Redmond, WA 98052-6399, or the Microsoft subsidiary serving your country. +    + + +18. DISCLAIMER OF WARRANTIES. The Limited Warranty that appears above is the +only express warranty made to you and is provided in lieu of any other express warranties or +similar obligations (if any) created by any advertising, documentation, packaging, or other +communications. EXCEPT FOR THE LIMITED WARRANTY AND TO THE MAXIMUM +Everett VSPro 6 +Final 11.04.02 + + + +EXTENT PERMITTED BY APPLICABLE LAW, MICROSOFT AND ITS SUPPLIERS +PROVIDE THE SOFTWARE AND SUPPORT SERVICES (IF ANY) AS IS AND WITH ALL +FAULTS, AND HEREBY DISCLAIM ALL OTHER WARRANTIES AND CONDITIONS, +WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, +ANY (IF ANY) IMPLIED WARRANTIES, DUTIES OR CONDITIONS OF +MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF RELIABILITY +OR AVAILABILITY, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF +RESULTS, OF WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF +NEGLIGENCE, ALL WITH REGARD TO THE SOFTWARE, AND THE PROVISION OF OR +FAILURE TO PROVIDE SUPPORT OR OTHER SERVICES, INFORMATION, SOFTWARE, +AND RELATED CONTENT THROUGH THE SOFTWARE OR OTHERWISE ARISING +OUT OF THE USE OF THE SOFTWARE. ALSO, THERE IS NO WARRANTY OR +CONDITION OF TITLE, QUIET ENJOYMENT, QUIET POSSESSION, +CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT WITH REGARD TO +THE SOFTWARE. + +19. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER +DAMAGES. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO +EVENT SHALL MICROSOFT OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, +INCIDENTAL, PUNITIVE, INDIRECT, OR CONSEQUENTIAL DAMAGES +WHATSOEVER (INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF +PROFITS OR CONFIDENTIAL OR OTHER INFORMATION, FOR BUSINESS +INTERRUPTION, FOR PERSONAL INJURY, FOR LOSS OF PRIVACY, FOR FAILURE TO +MEET ANY DUTY INCLUDING OF GOOD FAITH OR OF REASONABLE CARE, FOR +NEGLIGENCE, AND FOR ANY OTHER PECUNIARY OR OTHER LOSS WHATSOEVER) +ARISING OUT OF OR IN ANY WAY RELATED TO THE USE OF OR INABILITY TO USE +THE SOFTWARE, THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT OR +OTHER SERVICES, INFORMATION, SOFTWARE, AND RELATED CONTENT +THROUGH THE SOFTWARE OR OTHERWISE ARISING OUT OF THE USE OF THE +SOFTWARE, OR OTHERWISE UNDER OR IN CONNECTION WITH ANY PROVISION +OF THIS EULA, EVEN IN THE EVENT OF THE FAULT, TORT (INCLUDING +NEGLIGENCE), MISREPRESENTATION, STRICT LIABILITY, BREACH OF CONTRACT +OR BREACH OF WARRANTY OF MICROSOFT OR ANY SUPPLIER, AND EVEN IF +MICROSOFT OR ANY SUPPLIER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. +20. LIMITATION OF LIABILITY AND REMEDIES. NOTWITHSTANDING ANY +DAMAGES THAT YOU MIGHT INCUR FOR ANY REASON WHATSOEVER +(INCLUDING, WITHOUT LIMITATION, ALL DAMAGES REFERENCED HEREIN AND +ALL DIRECT OR GENERAL DAMAGES IN CONTRACT OR ANYTHING ELSE), THE +ENTIRE LIABILITY OF MICROSOFT AND ANY OF ITS SUPPLIERS UNDER ANY +PROVISION OF THIS EULA AND YOUR EXCLUSIVE REMEDY HEREUNDER (EXCEPT +FOR ANY REMEDY OF REPAIR OR REPLACEMENT ELECTED BY MICROSOFT WITH +RESPECT TO ANY BREACH OF THE LIMITED WARRANTY) SHALL BE LIMITED TO +THE GREATER OF THE ACTUAL DAMAGES YOU INCUR IN REASONABLE RELIANCE +ON THE SOFTWARE UP TO THE AMOUNT ACTUALLY PAID BY YOU FOR THE +SOFTWARE OR US$5.00. THE FOREGOING LIMITATIONS, EXCLUSIONS AND +DISCLAIMERS (INCLUDING SECTIONS 17, 18, AND 19) SHALL APPLY TO THE +MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, EVEN IF ANY REMEDY FAILS +ITS ESSENTIAL PURPOSE. +Everett VSPro 7 +Final 11.04.02 + + + +21. U.S. GOVERNMENT LICENSE RIGHTS. All Software provided to the U.S. +Government pursuant to solicitations issued on or after December 1, 1995 is provided with the +commercial license rights and restrictions described elsewhere herein. All Software provided to +the U.S. Government pursuant to solicitations issued prior to December 1, 1995 is provided with +"Restricted Rights" as provided for in FAR, 48 CFR 52.227-14 (JUNE 1987) or DFAR, 48 CFR +252.227-7013 (OCT 1988), as applicable. +22. APPLICABLE LAW. If you acquired this Software in the United States, this EULA is +governed by the laws of the State of Washington. If you acquired this Software in Canada, +unless expressly prohibited by local law, this EULA is governed by the laws in force in the +Province of Ontario, Canada; and, in respect of any dispute which may arise hereunder, you +consent to the jurisdiction of the federal and provincial courts sitting in Toronto, Ontario. If you +acquired this Software in the European Union, Iceland, Norway, or Switzerland, then local law +applies. If you acquired this Software in any other country, then local law may apply. +23. ENTIRE AGREEMENT; SEVERABILITY. This EULA (including any addendum or +amendment to this EULA which is included with the Software) are the entire agreement +between you and Microsoft relating to the Software and the support services (if any) and they +supersede all prior or contemporaneous oral or written communications, proposals and +representations with respect to the Software or any other subject matter covered by this EULA. +To the extent the terms of any Microsoft policies or programs for support services conflict with +the terms of this EULA, the terms of this EULA shall control. If any provision of this EULA is +held to be void, invalid, unenforceable or illegal, the other provisions shall continue in full force +and effect. +Si vous avez acquis votre produit Microsoft au CANADA, la garantie limitée suivante +s'applique : + +GARANTIE LIMITÉE + +Sauf pur celles du "Redistributables," qui sont fournies "comme telles," Microsoft garantit que +le Logiciel fonctionnera conformément aux documents inclus pendant une période de 90 jours +suivant la date de réception. + +Si une garantie ou condition implicite est créée par votre État ou votre territoire et qu'une loifédérale ou provinciale ou d'un État en interdit le déni, vous jouissez également d'une +garantie ou condition implicite, MAIS UNIQUEMENT POUR LES DÉFAUTS DÉCOUVERTS +DURANT LA PÉRIODE DE LA PRÉSENTE GARANTIE LIMITÉE (QUATRE-VINGT-DIX +JOURS). IL N'Y A AUCUNE GARANTIE OU CONDITION DE QUELQUE NATURE QUECE SOIT QUANT AUX DÉFAUTS DÉCOUVERTS APRÈS CETTE PÉRIODE DE QUATRE- +VINGT-DIX JOURS. Certains États ou territoires ne permettent pas de limiter la durée d'une +garantie ou condition implicite de sorte que la limitation ci-dessus peut ne pas s'appliquer à +vous. + +Tous les suppléments ou toutes les mises à jour relatifs au Logiciel, notamment, les ensembles +de services ou les réparations à chaud (le cas échéant) qui vous sont fournis après l'expiration +de la période de quatre-vingt-dix jours de la garantie limitée ne sont pas couverts par quelque +garantie ou condition que ce soit, expresse, implicite ou en vertu de la loi. + +LIMITATION DES RECOURS; ABSENCE DE DOMMAGES INDIRECTS OU AUTRES. + +Votre recours exclusif pour toute violation de la présente garantie limitée est décrit ci-après. + +Sauf pour tout remboursement au choix de Microsoft, si le Logiciel ne respecte pas la + +Everett VSPro 8 +Final 11.04.02 + + + +garantie limitée de Microsoft et, dans la mesure maximale permise par les lois applicables, +même si tout recours n'atteint pas son but essentiel, VOUS N'AVEZ DROIT À AUCUNS +DOMMAGES, NOTAMMENT DES DOMMAGES INDIRECTS. Les termes de la +clause «Exclusion des dommages accessoires, indirects et de certains autres dommages » sontégalement intégrées à la présente garantie limitée. Certains États ou territoires ne permettent +pas l'exclusion ou la limitation des dommages indirects ou accessoires de sorte que la limitation +ou l'exclusion ci-dessus peut ne pas s'appliquer à vous. La présente garantie limitée vous donne +des droits légaux spécifiques. Vous pouvez avoir d'autres droits qui peuvent varier d'unterritoire ou d'un État à un autre. VOTRE RECOURS EXCLUSIF. La seule responsabilité +obligation de Microsoft et de ses fournisseurs et votre recours exclusif pour toute violation de +la présente garantie limitée ou pour toute autre violation du présent contrat ou pour toute autre +responsabilité relative au Logiciel seront, selon le choix de Microsoft exercé de temps à autre +sous réserve de toute loi applicable, a) le remboursement du prix payé, le cas échéant, pour le +Logiciel ou b) la réparation ou le remplacement du Logiciel qui ne respecte pas la présente +garantie limitée et qui est retourné à Microsoft avec une copie de votre reçu. Vous recevrez la +compensation choisie par Microsoft, sans frais, sauf que vous êtes responsable des dépenses que +vous pourriez engager (p. ex., les frais d'envoi du Logiciel à Microsoft). La présente garantie +limitée est nulle si la défectuosité du Logiciel est causée par un accident, un usage abusif, une +mauvaise application, un usage anormal ou un virus. Tout Logiciel de remplacement sera +garanti pour le reste de la période initiale de la garantie ou pendant trente (30) jours, selon la +plus longue entre ces deux périodes. À l'extérieur des États-Unis ou du Canada, ces recours ou +l'un quelconque des services de soutien technique offerts par Microsoft ne sont pas disponibles +sans preuve d'achat d'une source internationale autorisée. Pour exercer votre recours, vous +devez communiquer avec Microsoft et vous adresser au Microsoft Sales Information +Center/One Microsoft Way/Redmond, WA 98052-6399, ou à la filiale de Microsoft de votre +pays. + +DÉNI DE GARANTIES. La garantie limitée qui apparaît ci-dessus constitue la seule garantie +expresse qui vous est donnée et remplace toutes autres garanties expresses (s'il en est) crées par +une publicité, un document, un emballage ou une autre communication. SAUF EN CE QUI A +TRAIT À LA GARANTIE LIMITÉE ET DANS LA MESURE MAXIMALE PERMISE PAR +LES LOIS APPLICABLES, LE LOGICIEL ET LES SERVICES DE SOUTIEN TECHNIQUE +(LE CAS ÉCHÉANT) SONT FOURNIS TELS QUELS ET AVEC TOUS LES DÉFAUTS PAR +MICROSOFT ET SES FOURNISSEURS, LESQUELS PAR LES PRÉSENTES DÉNIENT +TOUTES AUTRES GARANTIES ET CONDITIONS EXPRESSES, IMPLICITES OU EN +VERTU DE LA LOI, NOTAMMENT, MAIS SANS LIMITATION, (LE CAS ÉCHÉANT) LESGARANTIES, DEVOIRS OU CONDITIONS IMPLICITES DE QUALITÉ MARCHANDE, +D'ADAPTATION À UNE FIN PARTICULIÈRE, DE FIABILITÉ OU DE DISPONIBILITÉ, +D'EXACTITUDE OU D'EXHAUSTIVITÉ DES RÉPONSES, DES RÉSULTATS, DES +EFFORTS DÉPLOYÉS SELON LES RÈGLES DE L'ART, D'ABSENCE DE VIRUS ET +D'ABSENCE DE NÉGLIGENCE, LE TOUT À L'ÉGARD DU LOGICIEL ET DE LA +PRESTATION OU DE L'OMISSION DE LA PRESTATION DES SERVICES DE SOUTIEN +TECHNIQUE OU À L'ÉGARD DE LA FOURNITURE OU DE L'OMISSION DE LA +FOURNITURE DE TOUS AUTRES SERVICES, RENSEIGNEMENTS, LOGICIELS, ET +CONTENU QUI S'Y RAPPORTE GRÂCE AU LOGICIEL OU PROVENANT AUTREMENT +DE L'UTILISATION DU LOGICIEL . PAR AILLEURS, IL N'Y A AUCUNE GARANTIE OU +CONDITION QUANT AU TITRE DE PROPRIÉTÉ, À LA JOUISSANCE OU LA +POSSESSION PAISIBLE, À LA CONCORDANCE À UNE DESCRIPTION NI QUANT À +UNE ABSENCE DE CONTREFAÇON CONCERNANT LE LOGICIEL. + +EXCLUSION DES DOMMAGES ACCESSOIRES, INDIRECTS ET DE CERTAINS AUTRES +DOMMAGES. DANS LA MESURE MAXIMALE PERMISE PAR LES LOIS APPLICABLES, +EN AUCUN CAS MICROSOFT OU SES FOURNISSEURS NE SERONT RESPONSABLES +DES DOMMAGES SPÉCIAUX, CONSÉCUTIFS, ACCESSOIRES OU INDIRECTS DE + +Everett VSPro 9 +Final 11.04.02 + + + +QUELQUE NATURE QUE CE SOIT (NOTAMMENT, LES DOMMAGES À L'ÉGARD DUMANQUE À GAGNER OU DE LA DIVULGATION DE RENSEIGNEMENTS +CONFIDENTIELS OU AUTRES, DE LA PERTE D'EXPLOITATION, DE BLESSURES +CORPORELLES, DE LA VIOLATION DE LA VIE PRIVÉE, DE L'OMISSION DE REMPLIR +TOUT DEVOIR, Y COMPRIS D'AGIR DE BONNE FOI OU D'EXERCER UN SOIN +RAISONNABLE, DE LA NÉGLIGENCE ET DE TOUTE AUTRE PERTE PÉCUNIAIRE OU +AUTRE PERTE DE QUELQUE NATURE QUE CE SOIT) SE RAPPORTANT DE QUELQUEMANIÈRE QUE CE SOIT À L'UTILISATION DU LOGICIEL OU À L'INCAPACITÉ DE +S'EN SERVIR, À LA PRESTATION OU À L'OMISSION DE LA PRESTATION DE +SERVICES DE SOUTIEN TECHNIQUE OU À LA FOURNITURE OU À L'OMISSION DE +LA FOURNITURE DE TOUS AUTRES SERVICES, RENSEIGNEMENTS, LOGICIELS, ET +CONTENU QUI S'Y RAPPORTE GRÂCE AU LOGICIEL OU PROVENANT AUTREMENT +DE L'UTILISATION DU LOGICIEL OU AUTREMENT AUX TERMES DE TOUTE +DISPOSITION DE LA PRÉSENTE CONVENTION OU RELATIVEMENT À UNE TELLE +DISPOSITION, MÊME EN CAS DE FAUTE, DE DÉLIT CIVIL (Y COMPRIS LANÉGLIGENCE), DE RESPONSABILITÉ STRICTE, DE VIOLATION DE CONTRAT OU DEVIOLATION DE GARANTIE DE MICROSOFT OU DE TOUT FOURNISSEUR ET MÊME +SI MICROSOFT OU TOUT FOURNISSEUR A ÉTÉ AVISÉ DE LA POSSIBILITÉ DE TELS +DOMMAGES. + +LIMITATION DE RESPONSABILITÉ ET RECOURS. MALGRÉ LES DOMMAGES QUE +VOUS PUISSIEZ SUBIR POUR QUELQUE MOTIF QUE CE SOIT (NOTAMMENT, MAISSANS LIMITATION, TOUS LES DOMMAGES SUSMENTIONNÉS ET TOUS LES +DOMMAGES DIRECTS OU GÉNÉRAUX OU AUTRES), LA SEULE RESPONSABILITÉ DE +MICROSOFT ET DE L'UN OU L'AUTRE DE SES FOURNISSEURS AUX TERMES DE +TOUTE DISPOSITION DE LA PRÉSENTE CONVENTION ET VOTRE RECOURS +EXCLUSIF À L'ÉGARD DE TOUT CE QUI PRÉCÈDE (SAUF EN CE QUI CONCERNETOUT RECOURS DE RÉPARATION OU DE REMPLACEMENT CHOISI PAR +MICROSOFT À L'ÉGARD DE TOUT MANQUEMENT À LA GARANTIE LIMITÉE) SELIMITE AU PLUS ÉLEVÉ ENTRE LES MONTANTS SUIVANTS : LE MONTANT QUE +VOUS AVEZ RÉELLEMENT PAYÉ POUR LE LOGICIEL OU 5,00 $US. LES LIMITES, +EXCLUSIONS ET DÉNIS QUI PRÉCÈDENT (Y COMPRIS LES CLAUSES CI-DESSUS), +S'APPLIQUENT DANS LA MESURE MAXIMALE PERMISE PAR LES LOIS +APPLICABLES, MÊME SI TOUT RECOURS N'ATTEINT PAS SON BUT ESSENTIEL. + +À moins que cela ne soit prohibé par le droit local applicable, la présente Convention est régie +par les lois de la province d'Ontario, Canada. Vous consentez à la compétence des tribunaux +fédéraux et provinciaux siégeant à Toronto, dans la province d'Ontario. + +Au cas où vous auriez des questions concernant cette licence ou que vous désiriez vous mettre +en rapport avec Microsoft pour quelque raison que ce soit, veuillez utiliser l'information +contenue dans le Logiciel pour contacter la filiale de Microsoft desservant votre pays, ou visitez +Microsoft sur le World Wide Web à http://www.microsoft.com. + +The following MICROSOFT GUARANTEE applies to you if you acquired this Software in +any other country: + +Statutory rights not affected -The following guarantee is not restricted to any territory and does +not affect any statutory rights that you may have from your reseller or from Microsoft if you +acquired the Software directly from Microsoft. If you acquired the Software or any support +services in Australia, New Zealand or Malaysia, please see the "Consumer rights" section +below. + +Everett VSPro 10 +Final 11.04.02 + + + +The guarantee -The Software is designed and offered as a general-purpose software, not for any +user's particular purpose. You accept that no Software is error free and you are strongly +advised to back-up your files regularly. Provided that you have a valid license, Microsoft +guarantees that a) for a period of 90 days from the date of receipt of your license to use the +Software or the shortest period permitted by applicable law it will perform substantially in +accordance with the written materials that accompany the Software; and b) any support services +provided by Microsoft shall be substantially as described in applicable written materials +provided to you by Microsoft and Microsoft support engineers will use reasonable efforts, care +and skill to solve any problem issues. In the event that the Software fails to comply with this +guarantee, Microsoft will either (a) repair or replace the Software or (b) return the price you +paid. This guarantee is void if failure of the Software results from accident, abuse or +misapplication. Any replacement Software will be guaranteed for the remainder of the original +guarantee period or 30 days, whichever period is longer. You agree that the above guarantee is +your sole guarantee in relation to the Software and any support services. + +Exclusion of All Other Terms -To the maximum extent permitted by applicable law and subject to +the guarantee above, Microsoft disclaims all warranties, conditions and other terms, either +express or implied (whether by statute, common law, collaterally or otherwise) including but +not limited to implied warranties of satisfactory quality and fitness for particular purpose with +respect to the Software and the written materials that accompany the Software. Any implied +warranties that cannot be excluded are limited to 90 days or to the shortest period permitted by +applicable law, whichever is greater. + +Limitation of Liability -To the maximum extent permitted by applicable law and except as +provided in the Microsoft Guarantee, Microsoft and its suppliers shall not be liable for any +damages whatsoever (including without limitation, damages for loss of business profits, +business interruption, loss of business information or other pecuniary loss) arising out of the +use or inability to use the Software, even if Microsoft has been advised of the possibility of such +damages. In any case Microsoft's entire liability under any provision of this Agreement shall be +limited to the amount actually paid by you for the Software. These limitations do not apply to +any liabilities that cannot be excluded or limited by applicable laws. + +Consumer rights -Consumers in Australia, New Zealand or Malaysia may have the benefit of +certain rights and remedies by reason of the Trade Practices Act and similar state and territory +laws in Australia, the Consumer Guarantees Act in New Zealand and the Consumer Protection +Act in Malaysia in respect of which liability cannot lawfully be modified or excluded. If you +acquired the Software in New Zealand for the purposes of a business, you confirm that the +Consumer Guarantees Act does not apply. If you acquired the Software in Australia and if +Microsoft breaches a condition or warranty implied under any law which cannot lawfully be +modified or excluded by this agreement then, to the extent permitted by law, Microsoft's +liability is limited, at Microsoft's option, to: (i) in the case of the Software: a) repairing or +replacing the Software; or b) the cost of such repair or replacement; and (ii) in the case of +support services: a) re-supply of the services; or b) the cost of having the services supplied +again. + +Everett VSPro 11 +Final 11.04.02 + + + +Should you have any questions concerning this EULA, or if you desire to contact Microsoft for +any reason, please use the address information enclosed in this Software to contact the +Microsoft subsidiary serving your country or visit Microsoft on the World Wide Web at +http://www.microsoft.com. + +Everett VSPro 12 +Final 11.04.02 + +%% The following software may be included in this product: zlib; Use of any of this software is governed by the terms of the license below: + +zlib.h -- interface of the 'zlib' general purpose compression library + version 1.1.3, July 9th, 1998 + + Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format + + +%% The following software may be included in this product: Mozilla Rhino. Use of any of this software is governed by the terms of the license below: + + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Rhino code, released + * May 6, 1999. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1997-2000 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + * + * Kemal Bayram + * Patrick Beard + * Norris Boyd + * Igor Bukanov, igor@mir2.org + * Brendan Eich + * Ethan Hugg + * Roger Lawrence + * Terry Lucas + * Mike McCabe + * Milen Nankov + * Attila Szegedi, szegedia@freemail.hu + * Ian D. Stewart + * Andi Vajda + * Andrew Wason + */ + +%% The following software may be included in this product: Apache Derby. Use of any of this software is governed by the terms of the license below: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + diff --git a/rpms/legal/FOSS_licenses/jepp/zlib-libpng License.txt b/rpms/legal/FOSS_licenses/jepp/zlib-libpng License.txt index 9dccab73c3..0c627be53f 100644 --- a/rpms/legal/FOSS_licenses/jepp/zlib-libpng License.txt +++ b/rpms/legal/FOSS_licenses/jepp/zlib-libpng License.txt @@ -1,27 +1,27 @@ -Open Source Initiative OSI - The zlib/libpng License:Licensing -Submitted by nelson on Tue, 2006-10-31 04:56. :: -The zlib/libpng License - -Copyright (c) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not -claim that you wrote the original software. If you use this software -in a product, an acknowledgment in the product documentation would be -appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. - - - +Open Source Initiative OSI - The zlib/libpng License:Licensing +Submitted by nelson on Tue, 2006-10-31 04:56. :: +The zlib/libpng License + +Copyright (c) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. + + + diff --git a/rpms/legal/FOSS_licenses/jogl/bsd_license.txt b/rpms/legal/FOSS_licenses/jogl/bsd_license.txt index 29100c0407..f50d0adc4a 100644 --- a/rpms/legal/FOSS_licenses/jogl/bsd_license.txt +++ b/rpms/legal/FOSS_licenses/jogl/bsd_license.txt @@ -1,15 +1,15 @@ -License -PostgreSQL is released under the BSD license. -PostgreSQL Database Management System -(formerly known as Postgres, then as Postgres95) - -Portions Copyright (c) 1996-2005, The PostgreSQL Global Development Group - -Portions Copyright (c) 1994, The Regents of the University of California - -Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. - -IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - +License +PostgreSQL is released under the BSD license. +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2005, The PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + diff --git a/rpms/legal/FOSS_licenses/jscience/license.txt b/rpms/legal/FOSS_licenses/jscience/license.txt index 722d3c6689..af0d44fb2a 100644 --- a/rpms/legal/FOSS_licenses/jscience/license.txt +++ b/rpms/legal/FOSS_licenses/jscience/license.txt @@ -1,26 +1,26 @@ -* JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. -* Copyright (c) 2005 - 2007 JScience (http://jscience.org/) -* All rights reserved. -* -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. +* Copyright (c) 2005 - 2007 JScience (http://jscience.org/) +* All rights reserved. +* +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/rpms/legal/FOSS_licenses/jts_topology_suit/lgpl.txt b/rpms/legal/FOSS_licenses/jts_topology_suit/lgpl.txt index 5faba9d48c..5ab7695ab8 100644 --- a/rpms/legal/FOSS_licenses/jts_topology_suit/lgpl.txt +++ b/rpms/legal/FOSS_licenses/jts_topology_suit/lgpl.txt @@ -1,504 +1,504 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/rpms/legal/FOSS_licenses/postgresql/bsd_license.txt b/rpms/legal/FOSS_licenses/postgresql/bsd_license.txt index 29100c0407..f50d0adc4a 100644 --- a/rpms/legal/FOSS_licenses/postgresql/bsd_license.txt +++ b/rpms/legal/FOSS_licenses/postgresql/bsd_license.txt @@ -1,15 +1,15 @@ -License -PostgreSQL is released under the BSD license. -PostgreSQL Database Management System -(formerly known as Postgres, then as Postgres95) - -Portions Copyright (c) 1996-2005, The PostgreSQL Global Development Group - -Portions Copyright (c) 1994, The Regents of the University of California - -Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. - -IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - +License +PostgreSQL is released under the BSD license. +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2005, The PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + diff --git a/rpms/legal/FOSS_licenses/rhino/Mozilla Public License version 1_0.txt b/rpms/legal/FOSS_licenses/rhino/Mozilla Public License version 1_0.txt index cdb4757e38..23c1a6edaf 100644 --- a/rpms/legal/FOSS_licenses/rhino/Mozilla Public License version 1_0.txt +++ b/rpms/legal/FOSS_licenses/rhino/Mozilla Public License version 1_0.txt @@ -1,278 +1,278 @@ -Mozilla Public License version 1.0MOZILLA PUBLIC LICENSE -Version 1.0 - - - -1. Definitions. - 1.1. ``Contributor'' means each entity that creates or contributes to the - creation of Modifications. - 1.2. ``Contributor Version'' means the combination of the Original Code, prior - Modifications used by a Contributor, and the Modifications made by that - particular Contributor. - 1.3. ``Covered Code'' means the Original Code or Modifications or the - combination of the Original Code and Modifications, in each case including - portions thereof. - 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally - accepted in the software development community for the electronic transfer of - data. - 1.5. ``Executable'' means Covered Code in any form other than Source Code. - 1.6. ``Initial Developer'' means the individual or entity identified as the - Initial Developer in the Source Code notice required by Exhibit A. - 1.7. ``Larger Work'' means a work which combines Covered Code or portions - thereof with code not governed by the terms of this License. - 1.8. ``License'' means this document. - 1.9. ``Modifications'' means any addition to or deletion from the substance or - structure of either the Original Code or any previous Modifications. When - Covered Code is released as a series of files, a Modification is: - A. Any addition to or deletion from the contents of a file containing - Original Code or previous Modifications. - B. Any new file that contains any part of the Original Code or previous - Modifications. - 1.10. ``Original Code'' means Source Code of computer software code which is - described in the Source Code notice required by Exhibit A as Original Code, - and which, at the time of its release under this License is not already - Covered Code governed by this License. - 1.11. ``Source Code'' means the preferred form of the Covered Code for making - modifications to it, including all modules it contains, plus any associated - interface definition files, scripts used to control compilation and - installation of an Executable, or a list of source code differential - comparisons against either the Original Code or another well known, available - Covered Code of the Contributor's choice. The Source Code can be in a - compressed or archival form, provided the appropriate decompression or - de-archiving software is widely available for no charge. - 1.12. ``You'' means an individual or a legal entity exercising rights under, - and complying with all of the terms of, this License or a future version of - this License issued under Section 6.1. For legal entities, ``You'' includes - any entity which controls, is controlled by, or is under common control with - You. For purposes of this definition, ``control'' means (a) the power, direct - or indirect, to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of fifty percent (50%) or more of the - outstanding shares or beneficial ownership of such entity. -2. Source Code License. - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property claims: - (a) to use, reproduce, modify, display, perform, sublicense and distribute - the Original Code (or portions thereof) with or without Modifications, or as - part of a Larger Work; and - (b) under patents now or hereafter owned or controlled by Initial Developer, - to make, have made, use and sell (``Utilize'') the Original Code (or - portions thereof), but solely to the extent that any such patent is - reasonably necessary to enable You to Utilize the Original Code (or portions - thereof) and not to any greater extent that may be necessary to Utilize - further Modifications or combinations. - 2.2. Contributor Grant. - Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive - license, subject to third party intellectual property claims: - (a) to use, reproduce, modify, display, perform, sublicense and distribute - the Modifications created by such Contributor (or portions thereof) either - on an unmodified basis, with other Modifications, as Covered Code or as part - of a Larger Work; and - (b) under patents now or hereafter owned or controlled by Contributor, to - Utilize the Contributor Version (or portions thereof), but solely to the - extent that any such patent is reasonably necessary to enable You to Utilize - the Contributor Version (or portions thereof), and not to any greater extent - that may be necessary to Utilize further Modifications or combinations. -3. Distribution Obligations. - 3.1. Application of License. - The Modifications which You create or to which You contribute are governed by - the terms of this License, including without limitation Section 2.2. The - Source Code version of Covered Code may be distributed only under the terms of - this License or a future version of this License released under Section 6.1, - and You must include a copy of this License with every copy of the Source Code - You distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this License or the - recipients' rights hereunder. However, You may include an additional document - offering the additional rights described in Section 3.5. - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be made - available in Source Code form under the terms of this License either on the - same media as an Executable version or via an accepted Electronic Distribution - Mechanism to anyone to whom you made an Executable version available; and if - made available via Electronic Distribution Mechanism, must remain available - for at least twelve (12) months after the date it initially became available, - or at least six (6) months after a subsequent version of that particular - Modification has been made available to such recipients. You are responsible - for ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - 3.3. Description of Modifications. - You must cause all Covered Code to which you contribute to contain a file - documenting the changes You made to create that Covered Code and the date of - any change. You must include a prominent statement that the Modification is - derived, directly or indirectly, from Original Code provided by the Initial - Developer and including the name of the Initial Developer in (a) the Source - Code, and (b) in any notice in an Executable version or related documentation - in which You describe the origin or ownership of the Covered Code. - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If You have knowledge that a party claims an intellectual property right in - particular functionality or code (or its utilization under this License), - you must include a text file with the source code distribution titled - ``LEGAL'' which describes the claim and the party making the claim in - sufficient detail that a recipient will know whom to contact. If you obtain - such knowledge after You make Your Modification available as described in - Section 3.2, You shall promptly modify the LEGAL file in all copies You make - available thereafter and shall take other steps (such as notifying - appropriate mailing lists or newsgroups) reasonably calculated to inform - those who received the Covered Code that new knowledge has been obtained. - (b) Contributor APIs. - If Your Modification is an application programming interface and You own or - control patents which are reasonably necessary to implement that API, you - must also include this information in the LEGAL file. - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source Code, - and this License in any documentation for the Source Code, where You describe - recipients' rights relating to Covered Code. If You created one or more - Modification(s), You may add your name as a Contributor to the notice - described in Exhibit A. If it is not possible to put such notice in a - particular Source Code file due to its structure, then you must include such - notice in a location (such as a relevant directory file) where a user would be - likely to look for such a notice. You may choose to offer, and to charge a fee - for, warranty, support, indemnity or liability obligations to one or more - recipients of Covered Code. However, You may do so only on Your own behalf, - and not on behalf of the Initial Developer or any Contributor. You must make - it absolutely clear than any such warranty, support, indemnity or liability - obligation is offered by You alone, and You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, support, - indemnity or liability terms You offer. - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the requirements of - Section 3.1-3.5 have been met for that Covered Code, and if You include a - notice stating that the Source Code version of the Covered Code is available - under the terms of this License, including a description of how and where You - have fulfilled the obligations of Section 3.2. The notice must be - conspicuously included in any notice in an Executable version, related - documentation or collateral in which You describe recipients' rights relating - to the Covered Code. You may distribute the Executable version of Covered Code - under a license of Your choice, which may contain terms different from this - License, provided that You are in compliance with the terms of this License - and that the license for the Executable version does not attempt to limit or - alter the recipient's rights in the Source Code version from the rights set - forth in this License. If You distribute the Executable version under a - different license You must make it absolutely clear that any terms which - differ from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the Initial - Developer or such Contributor as a result of any such terms You offer. - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code not - governed by the terms of this License and distribute the Larger Work as a - single product. In such a case, You must make sure the requirements of this - License are fulfilled for the Covered Code. -4. Inability to Comply Due to Statute or Regulation. - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Code due to statute or regulation - then You must: (a) comply with the terms of this License to the maximum extent - possible; and (b) describe the limitations and the code they affect. Such - description must be included in the LEGAL file described in Section 3.4 and - must be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. -5. Application of this License. - This License applies to code to which the Initial Developer has attached the - notice in Exhibit A, and to related Covered Code. -6. Versions of the License. - 6.1. New Versions. - Netscape Communications Corporation (``Netscape'') may publish revised and/or - new versions of the License from time to time. Each version will be given a - distinguishing version number. - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that version. - You may also choose to use such Covered Code under the terms of any subsequent - version of the License published by Netscape. No one other than Netscape has - the right to modify the terms applicable to Covered Code created under this - License. - 6.3. Derivative Works. - If you create or use a modified version of this License (which you may only do - in order to apply it to code which is not already Covered Code governed by - this License), you must (a) rename Your license so that the phrases - ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any - confusingly similar phrase do not appear anywhere in your license and (b) - otherwise make it clear that your version of the license contains terms which - differ from the Mozilla Public License and Netscape Public License. (Filling - in the name of the Initial Developer, Original Code or Contributor in the - notice described in Exhibit A shall not of themselves be deemed to be - modifications of this License.) -7. DISCLAIMER OF WARRANTY. - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT - LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, - FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE - QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED - CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY - OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR - CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS - LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS - DISCLAIMER. -8. TERMINATION. - This License and the rights granted hereunder will terminate automatically if - You fail to comply with terms herein and fail to cure such breach within 30 - days of becoming aware of the breach. All sublicenses to the Covered Code - which are properly granted shall survive any termination of this License. - Provisions which, by their nature, must remain in effect beyond the - termination of this License shall survive. -9. LIMITATION OF LIABILITY. - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING - NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER - CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF - SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, - INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT - LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR - MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH - PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS - LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL - INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR - LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND - LIMITATION MAY NOT APPLY TO YOU. -10. U.S. GOVERNMENT END USERS. - The Covered Code is a ``commercial item,'' as that term is defined in 48 - C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and - ``commercial computer software documentation,'' as such terms are used in 48 - C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. - 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users - acquire Covered Code with only those rights set forth herein. -11. MISCELLANEOUS. - This License represents the complete agreement concerning subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. This License shall be governed by California law provisions - (except to the extent applicable law, if any, provides otherwise), excluding - its conflict-of-law provisions. With respect to disputes in which at least one - party is a citizen of, or an entity chartered or registered to do business in, - the United States of America: (a) unless otherwise agreed in writing, all - disputes relating to this License (excepting any dispute relating to - intellectual property rights) shall be subject to final and binding - arbitration, with the losing party paying all costs of arbitration; (b) any - arbitration relating to this Agreement shall be held in Santa Clara County, - California, under the auspices of JAMS/EndDispute; and (c) any litigation - relating to this Agreement shall be subject to the jurisdiction of the Federal - Courts of the Northern District of California, with venue lying in Santa Clara - County, California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys fees and expenses. - The application of the United Nations Convention on Contracts for the - International Sale of Goods is expressly excluded. Any law or regulation which - provides that the language of a contract shall be construed against the - drafter shall not apply to this License. -12. RESPONSIBILITY FOR CLAIMS. - Except in cases where another Contributor has failed to comply with Section - 3.4, You are responsible for damages arising, directly or indirectly, out of - Your utilization of rights under this License, based on the number of copies - of Covered Code you made available, the revenues you received from utilizing - such rights, and other relevant factors. You agree to work with affected - parties to distribute responsibility on an equitable basis. -EXHIBIT A. - ``The contents of this file are subject to the Mozilla Public License Version - 1.0 (the "License"); you may not use this file except in compliance with the - License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for - the specific language governing rights and limitations under the License. - The Original Code is ______________________________________. - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. +Mozilla Public License version 1.0MOZILLA PUBLIC LICENSE +Version 1.0 + + + +1. Definitions. + 1.1. ``Contributor'' means each entity that creates or contributes to the + creation of Modifications. + 1.2. ``Contributor Version'' means the combination of the Original Code, prior + Modifications used by a Contributor, and the Modifications made by that + particular Contributor. + 1.3. ``Covered Code'' means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case including + portions thereof. + 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally + accepted in the software development community for the electronic transfer of + data. + 1.5. ``Executable'' means Covered Code in any form other than Source Code. + 1.6. ``Initial Developer'' means the individual or entity identified as the + Initial Developer in the Source Code notice required by Exhibit A. + 1.7. ``Larger Work'' means a work which combines Covered Code or portions + thereof with code not governed by the terms of this License. + 1.8. ``License'' means this document. + 1.9. ``Modifications'' means any addition to or deletion from the substance or + structure of either the Original Code or any previous Modifications. When + Covered Code is released as a series of files, a Modification is: + A. Any addition to or deletion from the contents of a file containing + Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous + Modifications. + 1.10. ``Original Code'' means Source Code of computer software code which is + described in the Source Code notice required by Exhibit A as Original Code, + and which, at the time of its release under this License is not already + Covered Code governed by this License. + 1.11. ``Source Code'' means the preferred form of the Covered Code for making + modifications to it, including all modules it contains, plus any associated + interface definition files, scripts used to control compilation and + installation of an Executable, or a list of source code differential + comparisons against either the Original Code or another well known, available + Covered Code of the Contributor's choice. The Source Code can be in a + compressed or archival form, provided the appropriate decompression or + de-archiving software is widely available for no charge. + 1.12. ``You'' means an individual or a legal entity exercising rights under, + and complying with all of the terms of, this License or a future version of + this License issued under Section 6.1. For legal entities, ``You'' includes + any entity which controls, is controlled by, or is under common control with + You. For purposes of this definition, ``control'' means (a) the power, direct + or indirect, to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of fifty percent (50%) or more of the + outstanding shares or beneficial ownership of such entity. +2. Source Code License. + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property claims: + (a) to use, reproduce, modify, display, perform, sublicense and distribute + the Original Code (or portions thereof) with or without Modifications, or as + part of a Larger Work; and + (b) under patents now or hereafter owned or controlled by Initial Developer, + to make, have made, use and sell (``Utilize'') the Original Code (or + portions thereof), but solely to the extent that any such patent is + reasonably necessary to enable You to Utilize the Original Code (or portions + thereof) and not to any greater extent that may be necessary to Utilize + further Modifications or combinations. + 2.2. Contributor Grant. + Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive + license, subject to third party intellectual property claims: + (a) to use, reproduce, modify, display, perform, sublicense and distribute + the Modifications created by such Contributor (or portions thereof) either + on an unmodified basis, with other Modifications, as Covered Code or as part + of a Larger Work; and + (b) under patents now or hereafter owned or controlled by Contributor, to + Utilize the Contributor Version (or portions thereof), but solely to the + extent that any such patent is reasonably necessary to enable You to Utilize + the Contributor Version (or portions thereof), and not to any greater extent + that may be necessary to Utilize further Modifications or combinations. +3. Distribution Obligations. + 3.1. Application of License. + The Modifications which You create or to which You contribute are governed by + the terms of this License, including without limitation Section 2.2. The + Source Code version of Covered Code may be distributed only under the terms of + this License or a future version of this License released under Section 6.1, + and You must include a copy of this License with every copy of the Source Code + You distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this License or the + recipients' rights hereunder. However, You may include an additional document + offering the additional rights described in Section 3.5. + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be made + available in Source Code form under the terms of this License either on the + same media as an Executable version or via an accepted Electronic Distribution + Mechanism to anyone to whom you made an Executable version available; and if + made available via Electronic Distribution Mechanism, must remain available + for at least twelve (12) months after the date it initially became available, + or at least six (6) months after a subsequent version of that particular + Modification has been made available to such recipients. You are responsible + for ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + 3.3. Description of Modifications. + You must cause all Covered Code to which you contribute to contain a file + documenting the changes You made to create that Covered Code and the date of + any change. You must include a prominent statement that the Modification is + derived, directly or indirectly, from Original Code provided by the Initial + Developer and including the name of the Initial Developer in (a) the Source + Code, and (b) in any notice in an Executable version or related documentation + in which You describe the origin or ownership of the Covered Code. + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If You have knowledge that a party claims an intellectual property right in + particular functionality or code (or its utilization under this License), + you must include a text file with the source code distribution titled + ``LEGAL'' which describes the claim and the party making the claim in + sufficient detail that a recipient will know whom to contact. If you obtain + such knowledge after You make Your Modification available as described in + Section 3.2, You shall promptly modify the LEGAL file in all copies You make + available thereafter and shall take other steps (such as notifying + appropriate mailing lists or newsgroups) reasonably calculated to inform + those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Your Modification is an application programming interface and You own or + control patents which are reasonably necessary to implement that API, you + must also include this information in the LEGAL file. + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source Code, + and this License in any documentation for the Source Code, where You describe + recipients' rights relating to Covered Code. If You created one or more + Modification(s), You may add your name as a Contributor to the notice + described in Exhibit A. If it is not possible to put such notice in a + particular Source Code file due to its structure, then you must include such + notice in a location (such as a relevant directory file) where a user would be + likely to look for such a notice. You may choose to offer, and to charge a fee + for, warranty, support, indemnity or liability obligations to one or more + recipients of Covered Code. However, You may do so only on Your own behalf, + and not on behalf of the Initial Developer or any Contributor. You must make + it absolutely clear than any such warranty, support, indemnity or liability + obligation is offered by You alone, and You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, support, + indemnity or liability terms You offer. + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the requirements of + Section 3.1-3.5 have been met for that Covered Code, and if You include a + notice stating that the Source Code version of the Covered Code is available + under the terms of this License, including a description of how and where You + have fulfilled the obligations of Section 3.2. The notice must be + conspicuously included in any notice in an Executable version, related + documentation or collateral in which You describe recipients' rights relating + to the Covered Code. You may distribute the Executable version of Covered Code + under a license of Your choice, which may contain terms different from this + License, provided that You are in compliance with the terms of this License + and that the license for the Executable version does not attempt to limit or + alter the recipient's rights in the Source Code version from the rights set + forth in this License. If You distribute the Executable version under a + different license You must make it absolutely clear that any terms which + differ from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the Initial + Developer or such Contributor as a result of any such terms You offer. + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code not + governed by the terms of this License and distribute the Larger Work as a + single product. In such a case, You must make sure the requirements of this + License are fulfilled for the Covered Code. +4. Inability to Comply Due to Statute or Regulation. + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Code due to statute or regulation + then You must: (a) comply with the terms of this License to the maximum extent + possible; and (b) describe the limitations and the code they affect. Such + description must be included in the LEGAL file described in Section 3.4 and + must be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. +5. Application of this License. + This License applies to code to which the Initial Developer has attached the + notice in Exhibit A, and to related Covered Code. +6. Versions of the License. + 6.1. New Versions. + Netscape Communications Corporation (``Netscape'') may publish revised and/or + new versions of the License from time to time. Each version will be given a + distinguishing version number. + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that version. + You may also choose to use such Covered Code under the terms of any subsequent + version of the License published by Netscape. No one other than Netscape has + the right to modify the terms applicable to Covered Code created under this + License. + 6.3. Derivative Works. + If you create or use a modified version of this License (which you may only do + in order to apply it to code which is not already Covered Code governed by + this License), you must (a) rename Your license so that the phrases + ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any + confusingly similar phrase do not appear anywhere in your license and (b) + otherwise make it clear that your version of the license contains terms which + differ from the Mozilla Public License and Netscape Public License. (Filling + in the name of the Initial Developer, Original Code or Contributor in the + notice described in Exhibit A shall not of themselves be deemed to be + modifications of this License.) +7. DISCLAIMER OF WARRANTY. + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT + LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, + FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE + QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED + CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY + OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR + CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS + LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS + DISCLAIMER. +8. TERMINATION. + This License and the rights granted hereunder will terminate automatically if + You fail to comply with terms herein and fail to cure such breach within 30 + days of becoming aware of the breach. All sublicenses to the Covered Code + which are properly granted shall survive any termination of this License. + Provisions which, by their nature, must remain in effect beyond the + termination of this License shall survive. +9. LIMITATION OF LIABILITY. + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING + NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER + CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF + SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR + MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH + PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS + LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL + INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR + LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND + LIMITATION MAY NOT APPLY TO YOU. +10. U.S. GOVERNMENT END USERS. + The Covered Code is a ``commercial item,'' as that term is defined in 48 + C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and + ``commercial computer software documentation,'' as such terms are used in 48 + C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. + 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users + acquire Covered Code with only those rights set forth herein. +11. MISCELLANEOUS. + This License represents the complete agreement concerning subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. This License shall be governed by California law provisions + (except to the extent applicable law, if any, provides otherwise), excluding + its conflict-of-law provisions. With respect to disputes in which at least one + party is a citizen of, or an entity chartered or registered to do business in, + the United States of America: (a) unless otherwise agreed in writing, all + disputes relating to this License (excepting any dispute relating to + intellectual property rights) shall be subject to final and binding + arbitration, with the losing party paying all costs of arbitration; (b) any + arbitration relating to this Agreement shall be held in Santa Clara County, + California, under the auspices of JAMS/EndDispute; and (c) any litigation + relating to this Agreement shall be subject to the jurisdiction of the Federal + Courts of the Northern District of California, with venue lying in Santa Clara + County, California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys fees and expenses. + The application of the United Nations Convention on Contracts for the + International Sale of Goods is expressly excluded. Any law or regulation which + provides that the language of a contract shall be construed against the + drafter shall not apply to this License. +12. RESPONSIBILITY FOR CLAIMS. + Except in cases where another Contributor has failed to comply with Section + 3.4, You are responsible for damages arising, directly or indirectly, out of + Your utilization of rights under this License, based on the number of copies + of Covered Code you made available, the revenues you received from utilizing + such rights, and other relevant factors. You agree to work with affected + parties to distribute responsibility on an equitable basis. +EXHIBIT A. + ``The contents of this file are subject to the Mozilla Public License Version + 1.0 (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + the specific language governing rights and limitations under the License. + The Original Code is ______________________________________. + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. Contributor(s): ______________________________________.'' \ No newline at end of file diff --git a/rpms/legal/license.txt b/rpms/legal/license.txt index 7d3bed9f2f..808a81dcd1 100644 --- a/rpms/legal/license.txt +++ b/rpms/legal/license.txt @@ -1,17 +1,17 @@ -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. +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. diff --git a/rpms/python.site-packages/deploy.builder/build.sh b/rpms/python.site-packages/deploy.builder/build.sh old mode 100755 new mode 100644 diff --git a/rpms/rpms.ecl b/rpms/rpms.ecl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/devAutoDeploy/HudsonScripts/HudsonAWIPSBuild.sh b/tools/devAutoDeploy/HudsonScripts/HudsonAWIPSBuild.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/HudsonScripts/HudsonNightlyBuild.sh b/tools/devAutoDeploy/HudsonScripts/HudsonNightlyBuild.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/dump-ihfs.sh b/tools/devAutoDeploy/dump-ihfs.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/dump-ihfs.sh b/tools/devAutoDeploy/new/dump-ihfs.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/dump-subscription.sh b/tools/devAutoDeploy/new/dump-subscription.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/new-archive-installers.sh b/tools/devAutoDeploy/new/new-archive-installers.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/new-auto-install-dev-db-set-purge-time.sh b/tools/devAutoDeploy/new/new-auto-install-dev-db-set-purge-time.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/new-auto-install-dev-db-start.sh b/tools/devAutoDeploy/new/new-auto-install-dev-db-start.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/new-auto-install-dev-db-stop.sh b/tools/devAutoDeploy/new/new-auto-install-dev-db-stop.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/new-auto-install-dev-start.sh b/tools/devAutoDeploy/new/new-auto-install-dev-start.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/new-auto-install-dev-stop.sh b/tools/devAutoDeploy/new/new-auto-install-dev-stop.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/new-copy-installer-files.sh b/tools/devAutoDeploy/new/new-copy-installer-files.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/restore-ihfs.sh b/tools/devAutoDeploy/new/restore-ihfs.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/restore-subscription.sh b/tools/devAutoDeploy/new/restore-subscription.sh old mode 100755 new mode 100644 diff --git a/tools/devAutoDeploy/new/set-int-retention-time.sh b/tools/devAutoDeploy/new/set-int-retention-time.sh old mode 100755 new mode 100644