OcularDialog.cpp   OcularDialog.cpp 
skipping to change at line 28 skipping to change at line 28
*/ */
#include "Oculars.hpp" #include "Oculars.hpp"
#include "OcularDialog.hpp" #include "OcularDialog.hpp"
#include "ui_ocularDialog.h" #include "ui_ocularDialog.h"
#include "StelApp.hpp" #include "StelApp.hpp"
#include "StelGui.hpp" #include "StelGui.hpp"
#include "StelFileMgr.hpp" #include "StelFileMgr.hpp"
#include "StelModuleMgr.hpp" #include "StelModuleMgr.hpp"
#include "StelMainGraphicsView.hpp" #include "StelMainView.hpp"
#include "StelTranslator.hpp" #include "StelTranslator.hpp"
#include "StelActionMgr.hpp"
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include <QAction>
#include <QDataWidgetMapper> #include <QDataWidgetMapper>
#include <QDebug> #include <QDebug>
#include <QFrame> #include <QFrame>
#include <QModelIndex> #include <QModelIndex>
#include <QSettings> #include <QSettings>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <limits> #include <limits>
OcularDialog::OcularDialog(Oculars* pluginPtr, QList<CCD *>* ccds, QList<Oc OcularDialog::OcularDialog(Oculars* pluginPtr,
ular *>* oculars, QList<Telescope *>* telescopes, QList<Lens *> *lense) : QList<CCD *>* ccds,
plugin(pluginPtr) QList<Ocular *>* oculars,
QList<Telescope *>* telescopes,
QList<Lens *> *lense)
: plugin(pluginPtr)
, ccdMapper(NULL)
, ocularMapper(NULL)
, telescopeMapper(NULL)
, lensMapper(NULL)
{ {
ui = new Ui_ocularDialogForm; ui = new Ui_ocularDialogForm;
this->ccds = ccds; this->ccds = ccds;
ccdTableModel = new PropertyBasedTableModel(this); ccdTableModel = new PropertyBasedTableModel(this);
CCD* ccdModel = CCD::ccdModel(); CCD* ccdModel = CCD::ccdModel();
ccdTableModel->init(reinterpret_cast<QList<QObject *>* >(ccds), ccdTableModel->init(reinterpret_cast<QList<QObject *>* >(ccds),
ccdModel, ccdModel,
ccdModel->propertyMap()); ccdModel->propertyMap());
this->oculars = oculars; this->oculars = oculars;
ocularTableModel = new PropertyBasedTableModel(this); ocularTableModel = new PropertyBasedTableModel(this);
skipping to change at line 71 skipping to change at line 79
telescopeModel, telescopeModel,
telescopeModel->propertyMap()); telescopeModel->propertyMap());
this->lense = lense; this->lense = lense;
lensTableModel = new PropertyBasedTableModel(this); lensTableModel = new PropertyBasedTableModel(this);
Lens* lensModel = Lens::lensModel(); Lens* lensModel = Lens::lensModel();
lensTableModel->init(reinterpret_cast<QList<QObject *>* >(lense), lensTableModel->init(reinterpret_cast<QList<QObject *>* >(lense),
lensModel, lensModel,
lensModel->propertyMap()); lensModel->propertyMap());
validatorPositiveInt = new QIntValidator(0, std::numeric_limits<int>
::max(), this);
validatorPositiveDouble = new QDoubleValidator(.0, std::numeric_limi
ts<double>::max(), 24, this);
validatorOcularAFOV = new QDoubleValidator(1.0, 120.0, 3, this);
validatorOcularEFL = new QDoubleValidator(1.0, 60.0, 3, this);
validatorTelescopeDiameter = new QDoubleValidator(1.0, 1000.0, 1, th
is);
validatorTelescopeFL = new QDoubleValidator(1.0, 10000.0, 1, this);
validatorLensMultipler = new QDoubleValidator(1.0, 6.0, 4, this);
QRegExp nameExp("^\\S.*"); QRegExp nameExp("^\\S.*");
validatorName = new QRegExpValidator(nameExp, this); validatorName = new QRegExpValidator(nameExp, this);
} }
OcularDialog::~OcularDialog() OcularDialog::~OcularDialog()
{ {
ocularTableModel->disconnect(); ocularTableModel->disconnect();
telescopeTableModel->disconnect(); telescopeTableModel->disconnect();
ccdTableModel->disconnect(); ccdTableModel->disconnect();
lensTableModel->disconnect(); lensTableModel->disconnect();
skipping to change at line 131 skipping to change at line 132
/* ********************************************************************* */ /* ********************************************************************* */
#if 0 #if 0
#pragma mark - #pragma mark -
#pragma mark Slot Methods #pragma mark Slot Methods
#endif #endif
/* ********************************************************************* */ /* ********************************************************************* */
void OcularDialog::closeWindow() void OcularDialog::closeWindow()
{ {
setVisible(false); setVisible(false);
StelMainGraphicsView::getInstance().scene()->setActiveWindow(0); StelMainView::getInstance().scene()->setActiveWindow(0);
} }
void OcularDialog::deleteSelectedCCD() void OcularDialog::deleteSelectedCCD()
{ {
ccdTableModel->removeRows(ui->ccdListView->currentIndex().row(), 1); ccdTableModel->removeRows(ui->ccdListView->currentIndex().row(), 1);
ui->ccdListView->setCurrentIndex(ccdTableModel->index(0, 1)); ui->ccdListView->setCurrentIndex(ccdTableModel->index(0, 1));
plugin->updateLists(); plugin->updateLists();
} }
void OcularDialog::deleteSelectedOcular() void OcularDialog::deleteSelectedOcular()
skipping to change at line 287 skipping to change at line 288
/* ********************************************************************* */ /* ********************************************************************* */
#if 0 #if 0
#pragma mark - #pragma mark -
#pragma mark Private Slot Methods #pragma mark Private Slot Methods
#endif #endif
/* ********************************************************************* */ /* ********************************************************************* */
void OcularDialog::keyBindingTogglePluginChanged(const QString& newString) void OcularDialog::keyBindingTogglePluginChanged(const QString& newString)
{ {
Oculars::appSettings()->setValue("bindings/toggle_oculars", newStrin g); Oculars::appSettings()->setValue("bindings/toggle_oculars", newStrin g);
StelGui* gui = dynamic_cast<StelGui*>(StelApp::getInstance().getGui( StelActionMgr* actionMgr = StelApp::getInstance().getStelActionManag
)); er();
Q_ASSERT(gui); StelAction* action = actionMgr->findAction("actionShow_Ocular");
QAction* action = gui->getGuiAction("actionShow_Ocular");
if (action != NULL) { if (action != NULL) {
action->setShortcut(QKeySequence(newString.trimmed())); action->setShortcut(newString.trimmed());
} }
} }
void OcularDialog::keyBindingPopupNavigatorConfigChanged(const QString& new String) void OcularDialog::keyBindingPopupNavigatorConfigChanged(const QString& new String)
{ {
Oculars::appSettings()->setValue("bindings/popup_navigator", newStri ng); Oculars::appSettings()->setValue("bindings/popup_navigator", newStri ng);
StelGui* gui = dynamic_cast<StelGui*>(StelApp::getInstance().getGui( StelActionMgr* actionMgr = StelApp::getInstance().getStelActionManag
)); er();
Q_ASSERT(gui); StelAction* action = actionMgr->findAction("actionShow_Ocular_Menu")
QAction* action = gui->getGuiAction("actionShow_Ocular_Menu"); ;
if (action != NULL) { if (action != NULL) {
action->setShortcut(QKeySequence(newString.trimmed())); action->setShortcut(newString.trimmed());
} }
} }
void OcularDialog::requireSelectionStateChanged(int state) void OcularDialog::requireSelectionStateChanged(int state)
{ {
bool requireSelection = (state == Qt::Checked); bool requireSelection = (state == Qt::Checked);
bool requireSelectionToZoom = Oculars::appSettings()->value("require _selection_to_zoom", 1.0).toBool(); bool requireSelectionToZoom = Oculars::appSettings()->value("require _selection_to_zoom", 1.0).toBool();
if (requireSelection != requireSelectionToZoom) if (requireSelection != requireSelectionToZoom)
{ {
Oculars::appSettings()->setValue("require_selection_to_zoom" , requireSelection); Oculars::appSettings()->setValue("require_selection_to_zoom" , requireSelection);
skipping to change at line 353 skipping to change at line 352
ui->telescopeListView->setModel(telescopeTableModel); ui->telescopeListView->setModel(telescopeTableModel);
ui->lensListView->setModel(lensTableModel); ui->lensListView->setModel(lensTableModel);
//Now the rest of the actions. //Now the rest of the actions.
connect(ui->closeStelWindow, SIGNAL(clicked()), this, SLOT(close())) ; connect(ui->closeStelWindow, SIGNAL(clicked()), this, SLOT(close())) ;
connect(ui->scaleImageCircleCheckBox, SIGNAL(stateChanged(int)), thi s, SLOT(scaleImageCircleStateChanged(int))); connect(ui->scaleImageCircleCheckBox, SIGNAL(stateChanged(int)), thi s, SLOT(scaleImageCircleStateChanged(int)));
connect(ui->requireSelectionCheckBox, SIGNAL(stateChanged(int)), thi s, SLOT(requireSelectionStateChanged(int))); connect(ui->requireSelectionCheckBox, SIGNAL(stateChanged(int)), thi s, SLOT(requireSelectionStateChanged(int)));
connect(ui->limitStellarMagnitudeCheckBox, SIGNAL(clicked(bool)), pl ugin, SLOT(setFlagLimitMagnitude(bool))); connect(ui->limitStellarMagnitudeCheckBox, SIGNAL(clicked(bool)), pl ugin, SLOT(setFlagLimitMagnitude(bool)));
connect(ui->checkBoxControlPanel, SIGNAL(clicked(bool)), plugin, SLO T(enableGuiPanel(bool))); connect(ui->checkBoxControlPanel, SIGNAL(clicked(bool)), plugin, SLO T(enableGuiPanel(bool)));
connect(ui->checkBoxDecimalDegrees, SIGNAL(clicked(bool)), plugin, S LOT(setFlagDecimalDegrees(bool))); connect(ui->checkBoxDecimalDegrees, SIGNAL(clicked(bool)), plugin, S LOT(setFlagDecimalDegrees(bool)));
connect(ui->checkBoxInitialFOV, SIGNAL(clicked(bool)), plugin, SLOT( setFlagInitFovUsage(bool)));
// The add & delete buttons // The add & delete buttons
connect(ui->addCCD, SIGNAL(clicked()), this, SLOT(insertNewCCD())); connect(ui->addCCD, SIGNAL(clicked()), this, SLOT(insertNewCCD()));
connect(ui->deleteCCD, SIGNAL(clicked()), this, SLOT(deleteSelectedC CD())); connect(ui->deleteCCD, SIGNAL(clicked()), this, SLOT(deleteSelectedC CD()));
connect(ui->addOcular, SIGNAL(clicked()), this, SLOT(insertNewOcular ())); connect(ui->addOcular, SIGNAL(clicked()), this, SLOT(insertNewOcular ()));
connect(ui->deleteOcular, SIGNAL(clicked()), this, SLOT(deleteSelect edOcular())); connect(ui->deleteOcular, SIGNAL(clicked()), this, SLOT(deleteSelect edOcular()));
connect(ui->addLens, SIGNAL(clicked()), this, SLOT(insertNewLens())) ; connect(ui->addLens, SIGNAL(clicked()), this, SLOT(insertNewLens())) ;
connect(ui->deleteLens, SIGNAL(clicked()), this, SLOT(deleteSelected Lens())); connect(ui->deleteLens, SIGNAL(clicked()), this, SLOT(deleteSelected Lens()));
connect(ui->addTelescope, SIGNAL(clicked()), this, SLOT(insertNewTel escope())); connect(ui->addTelescope, SIGNAL(clicked()), this, SLOT(insertNewTel escope()));
connect(ui->deleteTelescope, SIGNAL(clicked()), this, SLOT(deleteSel ectedTelescope())); connect(ui->deleteTelescope, SIGNAL(clicked()), this, SLOT(deleteSel ectedTelescope()));
// Validators // Validators
ui->ccdName->setValidator(validatorName); ui->ccdName->setValidator(validatorName);
ui->ccdResX->setValidator(validatorPositiveInt);
ui->ccdResY->setValidator(validatorPositiveInt);
ui->ccdChipX->setValidator(validatorPositiveDouble);
ui->ccdChipY->setValidator(validatorPositiveDouble);
ui->ccdPixelX->setValidator(validatorPositiveDouble);
ui->ccdPixelY->setValidator(validatorPositiveDouble);
ui->ocularAFov->setValidator(validatorOcularAFOV);
ui->ocularFL->setValidator(validatorOcularEFL);
ui->ocularFieldStop->setValidator(validatorOcularEFL);
ui->telescopeFL->setValidator(validatorTelescopeFL);
ui->telescopeDiameter->setValidator(validatorTelescopeDiameter);
ui->ocularName->setValidator(validatorName); ui->ocularName->setValidator(validatorName);
ui->telescopeName->setValidator(validatorName); ui->telescopeName->setValidator(validatorName);
ui->lensName->setValidator(validatorName); ui->lensName->setValidator(validatorName);
ui->lensMultipler->setValidator(validatorLensMultipler);
// The key bindings // The key bindings
QString bindingString = Oculars::appSettings()->value("bindings/togg le_oculars", "Ctrl+O").toString(); QString bindingString = Oculars::appSettings()->value("bindings/togg le_oculars", "Ctrl+O").toString();
ui->togglePluginLineEdit->setText(bindingString); ui->togglePluginLineEdit->setText(bindingString);
bindingString = Oculars::appSettings()->value("bindings/popup_naviga tor", "Alt+O").toString(); bindingString = Oculars::appSettings()->value("bindings/popup_naviga tor", "Alt+O").toString();
ui->togglePopupNavigatorWindowLineEdit->setText(bindingString); ui->togglePopupNavigatorWindowLineEdit->setText(bindingString);
connect(ui->togglePluginLineEdit, SIGNAL(textEdited(const QString&)) , connect(ui->togglePluginLineEdit, SIGNAL(textEdited(const QString&)) ,
this, SLOT(keyBindingTogglePluginCha nged(const QString&))); this, SLOT(keyBindingTogglePluginCha nged(const QString&)));
connect(ui->togglePopupNavigatorWindowLineEdit, SIGNAL(textEdited(co nst QString&)), connect(ui->togglePopupNavigatorWindowLineEdit, SIGNAL(textEdited(co nst QString&)),
this, SLOT(keyBindingPopupNavigatorC onfigChanged(const QString&))); this, SLOT(keyBindingPopupNavigatorC onfigChanged(const QString&)));
skipping to change at line 471 skipping to change at line 459
telescopeMapper->addMapping(ui->telescopeDiameter, 1); telescopeMapper->addMapping(ui->telescopeDiameter, 1);
telescopeMapper->addMapping(ui->telescopeFL, 2); telescopeMapper->addMapping(ui->telescopeFL, 2);
telescopeMapper->addMapping(ui->telescopeHFlip, 3, "checked"); telescopeMapper->addMapping(ui->telescopeHFlip, 3, "checked");
telescopeMapper->addMapping(ui->telescopeVFlip, 4, "checked"); telescopeMapper->addMapping(ui->telescopeVFlip, 4, "checked");
ocularMapper->toFirst(); ocularMapper->toFirst();
connect(ui->telescopeListView->selectionModel() , SIGNAL(currentRowC hanged(QModelIndex, QModelIndex)), connect(ui->telescopeListView->selectionModel() , SIGNAL(currentRowC hanged(QModelIndex, QModelIndex)),
telescopeMapper, SLOT(setCurrentMode lIndex(QModelIndex))); telescopeMapper, SLOT(setCurrentMode lIndex(QModelIndex)));
ui->telescopeListView->setCurrentIndex(telescopeTableModel->index(0, 1)); ui->telescopeListView->setCurrentIndex(telescopeTableModel->index(0, 1));
// set the initial state // set the initial state
if (Oculars::appSettings()->value("require_selection_to_zoom", 1.0). QSettings *settings = Oculars::appSettings();
toBool()) { if (settings->value("require_selection_to_zoom", 1.0).toBool()) {
ui->requireSelectionCheckBox->setCheckState(Qt::Checked); ui->requireSelectionCheckBox->setCheckState(Qt::Checked);
} }
if (Oculars::appSettings()->value("use_max_exit_circle", 0.0).toBool ()) { if (settings->value("use_max_exit_circle", 0.0).toBool()) {
ui->scaleImageCircleCheckBox->setCheckState(Qt::Checked); ui->scaleImageCircleCheckBox->setCheckState(Qt::Checked);
} }
if (Oculars::appSettings()->value("limit_stellar_magnitude", true).t oBool()) { if (settings->value("limit_stellar_magnitude", true).toBool()) {
ui->limitStellarMagnitudeCheckBox->setCheckState(Qt::Checked ); ui->limitStellarMagnitudeCheckBox->setCheckState(Qt::Checked );
} }
if (Oculars::appSettings()->value("enable_control_panel", false).toB ool()) if (settings->value("enable_control_panel", false).toBool())
{ {
ui->checkBoxControlPanel->setChecked(true); ui->checkBoxControlPanel->setChecked(true);
} }
if (Oculars::appSettings()->value("use_decimal_degrees", false).toBo ol()) if (settings->value("use_decimal_degrees", false).toBool())
{ {
ui->checkBoxDecimalDegrees->setChecked(true); ui->checkBoxDecimalDegrees->setChecked(true);
} }
if (settings->value("use_initial_fov", false).toBool())
{
ui->checkBoxInitialFOV->setChecked(true);
}
//Initialize the style //Initialize the style
updateStyle(); updateStyle();
} }
void OcularDialog::initAboutText() void OcularDialog::initAboutText()
{ {
//BM: Most of the text for now is the original contents of the About widget. //BM: Most of the text for now is the original contents of the About widget.
QString html = "<html><head><title></title></head><body>"; QString html = "<html><head><title></title></head><body>";
html += "<h2>" + q_("Oculars Plug-in") + "</h2><table width=\"90%\"> "; html += "<h2>" + q_("Oculars Plug-in") + "</h2><table width=\"90%\"> ";
html += "<tr width=\"30%\"><td><strong>" + q_("Version") + ":</stron g></td><td>" + OCULARS_PLUGIN_VERSION + "</td></tr>"; html += "<tr width=\"30%\"><td><strong>" + q_("Version") + ":</stron g></td><td>" + OCULARS_PLUGIN_VERSION + "</td></tr>";
html += "<tr><td><strong>" + q_("Authors") + ":</strong></td><td>Tim html += "<tr><td><strong>" + q_("Author") + ":</strong></td><td>Timo
othy Reaves &lt;treaves@silverfieldstech.com&gt;<br />Bogdan Marinov<br />P thy Reaves &lt;treaves@silverfieldstech.com&gt;</td></tr>";
awel Stolowski (" + q_("Barlow lens feature") + ")</td></tr>"; html += "<tr><td><strong>" + q_("Contributors") + ":</strong></td><t
d>Bogdan Marinov<br />Pawel Stolowski (" + q_("Barlow lens feature") + ")<b
r />Alexander Wolf</td></tr>";
html += "</table>"; html += "</table>";
//Overview //Overview
html += "<h2>" + q_("Overview") + "</h2>"; html += "<h2>" + q_("Overview") + "</h2>";
html += "<p>" + q_("This plugin is intended to simulate what you wou ld see through an eyepiece. This configuration dialog can be used to add, modify, or delete eyepieces and telescopes, as well as CCD Sensors. Your f irst time running the app will populate some samples to get your started.") + "</p>"; html += "<p>" + q_("This plugin is intended to simulate what you wou ld see through an eyepiece. This configuration dialog can be used to add, modify, or delete eyepieces and telescopes, as well as CCD Sensors. Your f irst time running the app will populate some samples to get your started.") + "</p>";
html += "<p>" + q_("You can choose to scale the image you see on the screen. This is intended to show you a better comparison of what one eyep iece/telescope combination will be like as compared to another. The same e yepiece in two different telescopes of differing focal length will produce two different exit circles, changing the view someone. The trade-off of th is is that, with the image scaled, a good deal of the screen can be wasted. Therefore I recommend that you leave it off, unless you feel you have a n eed of it.") + "</p>"; html += "<p>" + q_("You can choose to scale the image you see on the screen. This is intended to show you a better comparison of what one eyep iece/telescope combination will be like as compared to another. The same e yepiece in two different telescopes of differing focal length will produce two different exit circles, changing the view someone. The trade-off of th is is that, with the image scaled, a good deal of the screen can be wasted. Therefore I recommend that you leave it off, unless you feel you have a n eed of it.") + "</p>";
html += "<p>" + q_("You can toggle a crosshair in the view. Ideally , I wanted this to be aligned to North. I've been unable to do so. So cur rently it aligns to the top of the screen.") + "</p>"; html += "<p>" + q_("You can toggle a crosshair in the view. Ideally , I wanted this to be aligned to North. I've been unable to do so. So cur rently it aligns to the top of the screen.") + "</p>";
html += "<p>" + QString(q_("You can toggle a Telrad finder; this can only be done when you have not turned on the Ocular view. This feature dr aws three concentric circles of 0.5%1, 2.0%1, and 4.0%1, helping you see wh at you would expect to see with the naked eye through the Telrad (or simila r) finder.")).arg(QChar(0x00B0)) + "</p>"; html += "<p>" + QString(q_("You can toggle a Telrad finder; this can only be done when you have not turned on the Ocular view. This feature dr aws three concentric circles of 0.5%1, 2.0%1, and 4.0%1, helping you see wh at you would expect to see with the naked eye through the Telrad (or simila r) finder.")).arg(QChar(0x00B0)) + "</p>";
html += "<p>" + q_("If you find any issues, please let me know. Enj oy!") + "</p>"; html += "<p>" + q_("If you find any issues, please let me know. Enj oy!") + "</p>";
//Keys //Keys
html += "<h2>" + q_("Hot Keys") + "</h2>"; html += "<h2>" + q_("Hot Keys") + "</h2>";
html += "<p>" + q_("The plug-in's key bindings can be edited in the General Tab.") + "</p>"; html += "<p>" + q_("The plug-in's key bindings can be edited in the General Tab.") + "</p>";
StelGui* gui = dynamic_cast<StelGui*>(StelApp::getInstance().getGui( )); StelGui* gui = dynamic_cast<StelGui*>(StelApp::getInstance().getGui( ));
Q_ASSERT(gui); Q_ASSERT(gui);
QAction* actionOcular = gui->getGuiAction("actionShow_Ocular"); StelActionMgr* actionMgr = StelApp::getInstance().getStelActionManag
er();
Q_ASSERT(actionMgr);
StelAction* actionOcular = actionMgr->findAction("actionShow_Ocular"
);
Q_ASSERT(actionOcular); Q_ASSERT(actionOcular);
QAction* actionMenu = gui->getGuiAction("actionShow_Ocular_Menu"); StelAction* actionMenu = actionMgr->findAction("actionShow_Ocular_Me nu");
Q_ASSERT(actionMenu); Q_ASSERT(actionMenu);
QKeySequence ocularShortcut = actionOcular->shortcut(); QKeySequence ocularShortcut = actionOcular->getShortcut();
QString ocularString = ocularShortcut.toString(QKeySequence::NativeT ext); QString ocularString = ocularShortcut.toString(QKeySequence::NativeT ext);
ocularString = Qt::escape(ocularString); ocularString = ocularString.toHtmlEscaped();
if (ocularString.isEmpty()) if (ocularString.isEmpty())
ocularString = q_("[no key defined]"); ocularString = q_("[no key defined]");
QKeySequence menuShortcut = actionMenu->shortcut(); QKeySequence menuShortcut = actionMenu->getShortcut();
QString menuString = menuShortcut.toString(QKeySequence::NativeText) ; QString menuString = menuShortcut.toString(QKeySequence::NativeText) ;
menuString = Qt::escape(menuString); menuString = menuString.toHtmlEscaped();
if (menuString.isEmpty()) if (menuString.isEmpty())
menuString = q_("[no key defined]"); menuString = q_("[no key defined]");
html += "<ul>"; html += "<ul>";
html += "<li>"; html += "<li>";
html += QString("<strong>%1:</strong> %2").arg(ocularString).arg(q_( "Switches on/off the ocular overlay.")); html += QString("<strong>%1:</strong> %2").arg(ocularString).arg(q_( "Switches on/off the ocular overlay."));
html += "</li>"; html += "</li>";
html += "<li>"; html += "<li>";
html += QString("<strong>%1:</strong> %2").arg(menuString).arg(q_("O pens the pop-up navigation menu.")); html += QString("<strong>%1:</strong> %2").arg(menuString).arg(q_("O pens the pop-up navigation menu."));
 End of changes. 26 change blocks. 
53 lines changed or deleted 48 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/