Classes | Public Slots | Signals | Public Member Functions | Protected Member Functions | Private Slots | Private Member Functions | Private Attributes | List of all members
PlotWidget Class Reference

#include <plotwidget.h>

Inheritance diagram for PlotWidget:
Inheritance graph
[legend]

Classes

struct  DragInfo
 

Public Slots

void activateGrid (bool activate)
 
void activateLegend (bool activate)
 
void configureTracker (CurveTracker::Parameter val)
 
void detachAllCurves ()
 
void enableTracker (bool enable)
 
void on_changeDateTimeScale (bool enable)
 
void on_changeTimeOffset (double offset)
 
void on_panned (int dx, int dy)
 
void on_zoomOutHorizontal_triggered (bool emit_signal=true)
 
void on_zoomOutVertical_triggered (bool emit_signal=true)
 
void removeCurve (const std::string &name)
 
void replot () override
 
void setTrackerPosition (double abs_time)
 
void updateCurves ()
 
void zoomOut (bool emit_signal)
 
- Public Slots inherited from QwtPlot
void autoRefresh ()
 Replots the plot if autoReplot() is true. More...
 
virtual void replot ()
 Redraw the plot. More...
 

Signals

void curveListChanged ()
 
void curvesDropped ()
 
void legendSizeChanged (int new_size)
 
void rectChanged (PlotWidget *self, QRectF rect)
 
void swapWidgetsRequested (PlotWidget *source, PlotWidget *destination)
 
void trackerMoved (QPointF pos)
 
void undoableChange ()
 
- Signals inherited from QwtPlot
void itemAttached (QwtPlotItem *plotItem, bool on)
 
void legendDataChanged (const QVariant &itemInfo, const QList< QwtLegendData > &data)
 

Public Member Functions

QRectF canvasBoundingRect () const
 
void changeAxisX (QString curve_name)
 
void changeBackgroundColor (QColor color)
 
const std::map< std::string, QwtPlotCurve * > & curveList () const
 
PlotData::RangeTime getMaximumRangeX () const
 
PlotData::RangeValue getMaximumRangeY (PlotData::RangeTime range_X) const
 
bool isEmpty () const
 
bool isLegendVisible () const
 
bool isXYPlot () const
 
bool isZoomEnabled () const
 
const PlotLegendlegend () const
 
 PlotWidget (PlotDataMapRef &datamap, QWidget *parent=nullptr)
 
void reloadPlotData ()
 
virtual void resizeEvent (QResizeEvent *ev) override
 
void setConstantRatioXY (bool active)
 
void setLegendAlignment (Qt::Alignment alignment)
 
void setLegendSize (int size)
 
void setZoomEnabled (bool enabled)
 
void setZoomRectangle (QRectF rect, bool emit_signal)
 
virtual void updateLayout () override
 Adjust plot content to its current size. More...
 
bool xmlLoadState (QDomElement &element)
 
QDomElement xmlSaveState (QDomDocument &doc) const
 
virtual ~PlotWidget () override
 
- Public Member Functions inherited from QwtPlot
void applyProperties (const QString &)
 
bool autoReplot () const
 
bool axisAutoScale (int axisId) const
 
bool axisEnabled (int axisId) const
 
QFont axisFont (int axisId) const
 
QwtInterval axisInterval (int axisId) const
 Return the current interval of the specified axis. More...
 
int axisMaxMajor (int axisId) const
 
int axisMaxMinor (int axisId) const
 
const QwtScaleDivaxisScaleDiv (int axisId) const
 Return the scale division of a specified axis. More...
 
const QwtScaleDrawaxisScaleDraw (int axisId) const
 Return the scale draw of a specified axis. More...
 
QwtScaleDrawaxisScaleDraw (int axisId)
 Return the scale draw of a specified axis. More...
 
QwtScaleEngineaxisScaleEngine (int axisId)
 
const QwtScaleEngineaxisScaleEngine (int axisId) const
 
double axisStepSize (int axisId) const
 Return the step size parameter that has been set in setAxisScale. More...
 
QwtText axisTitle (int axisId) const
 
const QwtScaleWidgetaxisWidget (int axisId) const
 
QwtScaleWidgetaxisWidget (int axisId)
 
QWidget * canvas ()
 
const QWidget * canvas () const
 
QBrush canvasBackground () const
 
virtual QwtScaleMap canvasMap (int axisId) const
 
virtual void drawCanvas (QPainter *)
 
virtual void drawItems (QPainter *, const QRectF &, const QwtScaleMap maps[axisCnt]) const
 
void enableAxis (int axisId, bool tf=true)
 Enable or disable a specified axis. More...
 
virtual bool event (QEvent *)
 Adds handling of layout requests. More...
 
QwtText footer () const
 
QwtTextLabelfooterLabel ()
 
const QwtTextLabelfooterLabel () const
 
virtual void getCanvasMarginsHint (const QwtScaleMap maps[], const QRectF &canvasRect, double &left, double &top, double &right, double &bottom) const
 Calculate the canvas margins. More...
 
QString grabProperties () const
 
virtual QwtPlotIteminfoToItem (const QVariant &) const
 Identify the plot item according to an item info object, that has bee generated from itemToInfo(). More...
 
void insertLegend (QwtAbstractLegend *, LegendPosition=QwtPlot::RightLegend, double ratio=-1.0)
 Insert a legend. More...
 
double invTransform (int axisId, int pos) const
 
virtual QVariant itemToInfo (QwtPlotItem *) const
 Build an information, that can be used to identify a plot item on the legend. More...
 
QwtAbstractLegendlegend ()
 
const QwtAbstractLegendlegend () const
 
virtual QSize minimumSizeHint () const
 Return a minimum size hint. More...
 
QwtPlotLayoutplotLayout ()
 
const QwtPlotLayoutplotLayout () const
 
 QwtPlot (QWidget *=NULL)
 Constructor. More...
 
 QwtPlot (const QwtText &title, QWidget *=NULL)
 Constructor. More...
 
void setAutoReplot (bool=true)
 Set or reset the autoReplot option. More...
 
void setAxisAutoScale (int axisId, bool on=true)
 Enable autoscaling for a specified axis. More...
 
void setAxisFont (int axisId, const QFont &f)
 Change the font of an axis. More...
 
void setAxisLabelAlignment (int axisId, Qt::Alignment)
 
void setAxisLabelRotation (int axisId, double rotation)
 
void setAxisMaxMajor (int axisId, int maxMajor)
 
void setAxisMaxMinor (int axisId, int maxMinor)
 
void setAxisScale (int axisId, double min, double max, double step=0)
 Disable autoscaling and specify a fixed scale for a selected axis. More...
 
void setAxisScaleDiv (int axisId, const QwtScaleDiv &)
 Disable autoscaling and specify a fixed scale for a selected axis. More...
 
void setAxisScaleDraw (int axisId, QwtScaleDraw *)
 Set a scale draw. More...
 
void setAxisScaleEngine (int axisId, QwtScaleEngine *)
 
void setAxisTitle (int axisId, const QString &)
 Change the title of a specified axis. More...
 
void setAxisTitle (int axisId, const QwtText &)
 Change the title of a specified axis. More...
 
void setCanvas (QWidget *)
 Set the drawing canvas of the plot widget. More...
 
void setCanvasBackground (const QBrush &)
 Change the background of the plotting area. More...
 
void setFooter (const QString &)
 
void setFooter (const QwtText &t)
 
void setPlotLayout (QwtPlotLayout *)
 Assign a new plot layout. More...
 
void setTitle (const QString &)
 
void setTitle (const QwtText &t)
 
virtual QSize sizeHint () const
 
QwtText title () const
 
QwtTextLabeltitleLabel ()
 
const QwtTextLabeltitleLabel () const
 
double transform (int axisId, double value) const
 Transform a value into a coordinate in the plotting region. More...
 
void updateAxes ()
 Rebuild the axes scales. More...
 
void updateCanvasMargins ()
 Update the canvas margins. More...
 
void updateLegend ()
 
void updateLegend (const QwtPlotItem *)
 
virtual ~QwtPlot ()
 Destructor. More...
 
- Public Member Functions inherited from QwtPlotDict
bool autoDelete () const
 
void detachItems (int rtti=QwtPlotItem::Rtti_PlotItem, bool autoDelete=true)
 
const QwtPlotItemListitemList () const
 A QwtPlotItemList of all attached plot items. More...
 
QwtPlotItemList itemList (int rtti) const
 
 QwtPlotDict ()
 
void setAutoDelete (bool)
 
virtual ~QwtPlotDict ()
 

Protected Member Functions

bool canvasEventFilter (QEvent *event)
 
void dragEnterEvent (QDragEnterEvent *event) override
 
void dragLeaveEvent (QDragLeaveEvent *event) override
 
void dropEvent (QDropEvent *event) override
 
bool eventFilter (QObject *obj, QEvent *event) override
 Event filter. More...
 
- Protected Member Functions inherited from QwtPlotDict
void insertItem (QwtPlotItem *)
 
void removeItem (QwtPlotItem *)
 

Private Slots

void canvasContextMenuTriggered (const QPoint &pos)
 
void launchRemoveCurveDialog ()
 
void on_changeColor (QString curve_name, QColor new_color)
 
void on_changeColorsDialog_triggered ()
 
void on_changeToBuiltinTransforms (QString new_transform)
 
void on_convertToXY_triggered (bool checked)
 
void on_customTransformsDialog ()
 
void on_editAxisLimits_triggered ()
 
void on_externallyResized (const QRectF &new_rect)
 
void on_savePlotToFile ()
 
void on_showPoints_triggered ()
 

Private Member Functions

bool addCurve (const std::string &name)
 
void buildActions ()
 
void buildLegend ()
 
DataSeriesBasecreateSeriesData (const QString &ID, const PlotData *data)
 
void rescaleEqualAxisScaling ()
 
void setDefaultRangeX ()
 
void transformCustomCurves ()
 
void updateAvailableTransformers ()
 
void updateMaximumZoomArea ()
 

Private Attributes

QAction * _action_1stDerivativeTransform
 
QAction * _action_2ndDerivativeTransform
 
QAction * _action_changeColorsDialog
 
QAction * _action_custom_transform
 
QAction * _action_editLimits
 
QAction * _action_noTransform
 
QAction * _action_phaseXY
 
QAction * _action_removeAllCurves
 
QAction * _action_removeCurve
 
QAction * _action_saveToFile
 
QAction * _action_showPoints
 
QAction * _action_zoomOutHorizontally
 
QAction * _action_zoomOutMaximum
 
QAction * _action_zoomOutVertically
 
AxisLimitsDialog_axis_limits_dialog
 
const PlotData_axisX = nullptr
 
std::map< std::string, QwtPlotCurve * > _curve_list
 
QwtPlotCurve::CurveStyle _curve_style
 
std::map< std::string, QString > _curves_transform
 
PlotData::RangeValue _custom_Y_limits
 
QString _default_transform
 
DragInfo _dragging
 
QwtPlotGrid_grid
 
bool _keep_aspect_ratio
 
PlotLegend_legend
 
PlotMagnifier_magnifier
 
PlotDataMapRef_mapped_data
 
QRectF _max_zoom_rect
 
QwtPlotPanner_panner1
 
QwtPlotPanner_panner2
 
std::map< std::string, QwtPlotMarker * > _point_marker
 
SnippetsMap _snippets
 
double _time_offset
 
CurveTracker_tracker
 
TransformSelector_transform_select_dialog
 
bool _use_date_time_scale
 
bool _zoom_enabled
 
PlotZoomer_zoomer
 

Additional Inherited Members

- Public Types inherited from QwtPlot
enum  Axis {
  yLeft, yRight, xBottom, xTop,
  axisCnt
}
 Axis index. More...
 
enum  LegendPosition { LeftLegend, RightLegend, BottomLegend, TopLegend }
 
- Static Protected Member Functions inherited from QwtPlot
static bool axisValid (int axisId)
 
- Properties inherited from QwtPlot
bool autoReplot
 
QBrush canvasBackground
 

Detailed Description

Definition at line 28 of file plotwidget.h.

Constructor & Destructor Documentation

PlotWidget::PlotWidget ( PlotDataMapRef datamap,
QWidget *  parent = nullptr 
)

Definition at line 64 of file plotwidget.cpp.

PlotWidget::~PlotWidget ( )
overridevirtual

Definition at line 361 of file plotwidget.cpp.

Member Function Documentation

void PlotWidget::activateGrid ( bool  activate)
slot

Definition at line 1018 of file plotwidget.cpp.

void PlotWidget::activateLegend ( bool  activate)
slot

Definition at line 1013 of file plotwidget.cpp.

bool PlotWidget::addCurve ( const std::string &  name)
private

Definition at line 366 of file plotwidget.cpp.

void PlotWidget::buildActions ( )
private

Definition at line 164 of file plotwidget.cpp.

void PlotWidget::buildLegend ( )
private

Definition at line 330 of file plotwidget.cpp.

QRectF PlotWidget::canvasBoundingRect ( ) const

Definition at line 821 of file plotwidget.cpp.

void PlotWidget::canvasContextMenuTriggered ( const QPoint &  pos)
privateslot

Definition at line 286 of file plotwidget.cpp.

bool PlotWidget::canvasEventFilter ( QEvent *  event)
protected

Definition at line 1622 of file plotwidget.cpp.

void PlotWidget::changeAxisX ( QString  curve_name)

Definition at line 1528 of file plotwidget.cpp.

void PlotWidget::changeBackgroundColor ( QColor  color)

Definition at line 1861 of file plotwidget.cpp.

void PlotWidget::configureTracker ( CurveTracker::Parameter  val)
slot

Definition at line 1027 of file plotwidget.cpp.

DataSeriesBase * PlotWidget::createSeriesData ( const QString &  ID,
const PlotData data 
)
private

Definition at line 1804 of file plotwidget.cpp.

const std::map< std::string, QwtPlotCurve * > & PlotWidget::curveList ( ) const

Definition at line 478 of file plotwidget.cpp.

void PlotWidget::curveListChanged ( )
signal
void PlotWidget::curvesDropped ( )
signal
void PlotWidget::detachAllCurves ( )
slot

Definition at line 593 of file plotwidget.cpp.

void PlotWidget::dragEnterEvent ( QDragEnterEvent *  event)
overrideprotected

Definition at line 483 of file plotwidget.cpp.

void PlotWidget::dragLeaveEvent ( QDragLeaveEvent *  event)
overrideprotected

Definition at line 528 of file plotwidget.cpp.

void PlotWidget::dropEvent ( QDropEvent *  event)
overrideprotected

Definition at line 543 of file plotwidget.cpp.

void PlotWidget::enableTracker ( bool  enable)
slot

Definition at line 1032 of file plotwidget.cpp.

bool PlotWidget::eventFilter ( QObject *  object,
QEvent *  event 
)
overrideprotectedvirtual

Event filter.

The plot handles the following events for the canvas:

  • QEvent::Resize The canvas margins might depend on its size
  • QEvent::ContentsRectChange The layout needs to be recalculated
Parameters
objectObject to be filtered
eventEvent
Returns
See QFrame::eventFilter()
See also
updateCanvasMargins(), updateLayout()

Reimplemented from QwtPlot.

Definition at line 1590 of file plotwidget.cpp.

PlotData::RangeTime PlotWidget::getMaximumRangeX ( ) const

Definition at line 1094 of file plotwidget.cpp.

PlotData::RangeValue PlotWidget::getMaximumRangeY ( PlotData::RangeTime  range_X) const

Definition at line 1126 of file plotwidget.cpp.

bool PlotWidget::isEmpty ( ) const

Definition at line 473 of file plotwidget.cpp.

bool PlotWidget::isLegendVisible ( ) const

Definition at line 1878 of file plotwidget.cpp.

bool PlotWidget::isXYPlot ( ) const

Definition at line 1368 of file plotwidget.cpp.

bool PlotWidget::isZoomEnabled ( ) const

Definition at line 1897 of file plotwidget.cpp.

void PlotWidget::launchRemoveCurveDialog ( )
privateslot

Definition at line 1203 of file plotwidget.cpp.

const PlotLegend* PlotWidget::legend ( ) const
inline

Definition at line 60 of file plotwidget.h.

void PlotWidget::legendSizeChanged ( int  new_size)
signal
void PlotWidget::on_changeColor ( QString  curve_name,
QColor  new_color 
)
privateslot

Definition at line 1246 of file plotwidget.cpp.

void PlotWidget::on_changeColorsDialog_triggered ( )
privateslot

Definition at line 1222 of file plotwidget.cpp.

void PlotWidget::on_changeDateTimeScale ( bool  enable)
slot

Definition at line 1078 of file plotwidget.cpp.

void PlotWidget::on_changeTimeOffset ( double  offset)
slot

Definition at line 1056 of file plotwidget.cpp.

void PlotWidget::on_changeToBuiltinTransforms ( QString  new_transform)
privateslot

Definition at line 1336 of file plotwidget.cpp.

void PlotWidget::on_convertToXY_triggered ( bool  checked)
privateslot

Definition at line 1374 of file plotwidget.cpp.

void PlotWidget::on_customTransformsDialog ( )
privateslot

Definition at line 1489 of file plotwidget.cpp.

void PlotWidget::on_editAxisLimits_triggered ( )
privateslot

Definition at line 1569 of file plotwidget.cpp.

void PlotWidget::on_externallyResized ( const QRectF &  new_rect)
privateslot

Definition at line 1284 of file plotwidget.cpp.

void PlotWidget::on_panned ( int  dx,
int  dy 
)
slot

Definition at line 614 of file plotwidget.cpp.

void PlotWidget::on_savePlotToFile ( )
privateslot

Definition at line 1541 of file plotwidget.cpp.

void PlotWidget::on_showPoints_triggered ( )
privateslot

Definition at line 1260 of file plotwidget.cpp.

void PlotWidget::on_zoomOutHorizontal_triggered ( bool  emit_signal = true)
slot

Definition at line 1314 of file plotwidget.cpp.

void PlotWidget::on_zoomOutVertical_triggered ( bool  emit_signal = true)
slot

Definition at line 1325 of file plotwidget.cpp.

void PlotWidget::rectChanged ( PlotWidget self,
QRectF  rect 
)
signal
void PlotWidget::reloadPlotData ( )

Definition at line 980 of file plotwidget.cpp.

void PlotWidget::removeCurve ( const std::string &  name)
slot

Definition at line 426 of file plotwidget.cpp.

void PlotWidget::replot ( )
overrideslot

Definition at line 1904 of file plotwidget.cpp.

void PlotWidget::rescaleEqualAxisScaling ( )
private

Definition at line 874 of file plotwidget.cpp.

void PlotWidget::resizeEvent ( QResizeEvent *  e)
overridevirtual

Resize and update internal layout

Parameters
eResize event

Reimplemented from QwtPlot.

Definition at line 919 of file plotwidget.cpp.

void PlotWidget::setConstantRatioXY ( bool  active)

Definition at line 936 of file plotwidget.cpp.

void PlotWidget::setDefaultRangeX ( )
private

Definition at line 1784 of file plotwidget.cpp.

void PlotWidget::setLegendAlignment ( Qt::Alignment  alignment)

Definition at line 1883 of file plotwidget.cpp.

void PlotWidget::setLegendSize ( int  size)

Definition at line 1870 of file plotwidget.cpp.

void PlotWidget::setTrackerPosition ( double  abs_time)
slot

Definition at line 1037 of file plotwidget.cpp.

void PlotWidget::setZoomEnabled ( bool  enabled)

Definition at line 1888 of file plotwidget.cpp.

void PlotWidget::setZoomRectangle ( QRectF  rect,
bool  emit_signal 
)

Definition at line 949 of file plotwidget.cpp.

void PlotWidget::swapWidgetsRequested ( PlotWidget source,
PlotWidget destination 
)
signal
void PlotWidget::trackerMoved ( QPointF  pos)
signal
void PlotWidget::transformCustomCurves ( )
private

Definition at line 1440 of file plotwidget.cpp.

void PlotWidget::undoableChange ( )
signal
void PlotWidget::updateAvailableTransformers ( )
private

Definition at line 1429 of file plotwidget.cpp.

void PlotWidget::updateCurves ( )
slot

Definition at line 1193 of file plotwidget.cpp.

void PlotWidget::updateLayout ( )
overridevirtual

Adjust plot content to its current size.

See also
resizeEvent()

Reimplemented from QwtPlot.

Definition at line 930 of file plotwidget.cpp.

void PlotWidget::updateMaximumZoomArea ( )
private

Definition at line 831 of file plotwidget.cpp.

bool PlotWidget::xmlLoadState ( QDomElement &  element)

Definition at line 674 of file plotwidget.cpp.

QDomElement PlotWidget::xmlSaveState ( QDomDocument &  doc) const

Definition at line 619 of file plotwidget.cpp.

void PlotWidget::zoomOut ( bool  emit_signal)
slot

Definition at line 1302 of file plotwidget.cpp.

Member Data Documentation

QAction* PlotWidget::_action_1stDerivativeTransform
private

Definition at line 167 of file plotwidget.h.

QAction* PlotWidget::_action_2ndDerivativeTransform
private

Definition at line 168 of file plotwidget.h.

QAction* PlotWidget::_action_changeColorsDialog
private

Definition at line 161 of file plotwidget.h.

QAction* PlotWidget::_action_custom_transform
private

Definition at line 170 of file plotwidget.h.

QAction* PlotWidget::_action_editLimits
private

Definition at line 172 of file plotwidget.h.

QAction* PlotWidget::_action_noTransform
private

Definition at line 166 of file plotwidget.h.

QAction* PlotWidget::_action_phaseXY
private

Definition at line 169 of file plotwidget.h.

QAction* PlotWidget::_action_removeAllCurves
private

Definition at line 160 of file plotwidget.h.

QAction* PlotWidget::_action_removeCurve
private

Definition at line 159 of file plotwidget.h.

QAction* PlotWidget::_action_saveToFile
private

Definition at line 171 of file plotwidget.h.

QAction* PlotWidget::_action_showPoints
private

Definition at line 162 of file plotwidget.h.

QAction* PlotWidget::_action_zoomOutHorizontally
private

Definition at line 164 of file plotwidget.h.

QAction* PlotWidget::_action_zoomOutMaximum
private

Definition at line 163 of file plotwidget.h.

QAction* PlotWidget::_action_zoomOutVertically
private

Definition at line 165 of file plotwidget.h.

AxisLimitsDialog* PlotWidget::_axis_limits_dialog
private

Definition at line 217 of file plotwidget.h.

const PlotData* PlotWidget::_axisX = nullptr
private

Definition at line 213 of file plotwidget.h.

std::map<std::string, QwtPlotCurve* > PlotWidget::_curve_list
private

Definition at line 156 of file plotwidget.h.

QwtPlotCurve::CurveStyle PlotWidget::_curve_style
private

Definition at line 205 of file plotwidget.h.

std::map<std::string, QString> PlotWidget::_curves_transform
private

Definition at line 187 of file plotwidget.h.

PlotData::RangeValue PlotWidget::_custom_Y_limits
private

Definition at line 215 of file plotwidget.h.

QString PlotWidget::_default_transform
private

Definition at line 186 of file plotwidget.h.

DragInfo PlotWidget::_dragging
private

Definition at line 195 of file plotwidget.h.

QwtPlotGrid* PlotWidget::_grid
private

Definition at line 181 of file plotwidget.h.

bool PlotWidget::_keep_aspect_ratio
private

Definition at line 225 of file plotwidget.h.

PlotLegend* PlotWidget::_legend
private

Definition at line 180 of file plotwidget.h.

PlotMagnifier* PlotWidget::_magnifier
private

Definition at line 175 of file plotwidget.h.

PlotDataMapRef& PlotWidget::_mapped_data
private

Definition at line 185 of file plotwidget.h.

QRectF PlotWidget::_max_zoom_rect
private

Definition at line 227 of file plotwidget.h.

QwtPlotPanner* PlotWidget::_panner1
private

Definition at line 176 of file plotwidget.h.

QwtPlotPanner* PlotWidget::_panner2
private

Definition at line 177 of file plotwidget.h.

std::map<std::string, QwtPlotMarker*> PlotWidget::_point_marker
private

Definition at line 157 of file plotwidget.h.

SnippetsMap PlotWidget::_snippets
private

Definition at line 221 of file plotwidget.h.

double PlotWidget::_time_offset
private

Definition at line 211 of file plotwidget.h.

CurveTracker* PlotWidget::_tracker
private

Definition at line 179 of file plotwidget.h.

TransformSelector* PlotWidget::_transform_select_dialog
private

Definition at line 219 of file plotwidget.h.

bool PlotWidget::_use_date_time_scale
private

Definition at line 183 of file plotwidget.h.

bool PlotWidget::_zoom_enabled
private

Definition at line 223 of file plotwidget.h.

PlotZoomer* PlotWidget::_zoomer
private

Definition at line 174 of file plotwidget.h.


The documentation for this class was generated from the following files:


plotjuggler
Author(s): Davide Faconti
autogenerated on Sat Jul 6 2019 03:44:18