Skip to content

Conversation

@PDavid
Copy link
Contributor

@PDavid PDavid commented Apr 1, 2025

ℹ️ Sorry, this PR is quite large. Maybe it is better to check the changes commit-by-commit.

This is the first step of the Jamon to JSP migration is the Master Status page.

Moved the Jamon code back to JSP. Changed the Jamon syntax back to JSP.
To transfer data between JSP pages I used request attributes.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with <jsp:include), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:

  • Software Attributes
  • Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: MasterStatusUtil. Also added unit tests for the static methods in MasterStatusUtil.

Changed the Master Status page back to /master.jsp again. Now made sure that /master-status redirects to /master.jsp.

What do you think about this?

I'll create a new Jira for the rest of the Jamon files.

Comment on lines 28 to 35
public static final String FRAGS = "frags";
public static final String SERVER_NAMES = "serverNames";
public static final String SERVER_NAME = "serverName";
public static final String RS_GROUP_INFOS = "rsGroupInfos";
public static final String COLLECT_SERVERS = "collectServers";
public static final String FILTER = "filter";
public static final String FORMAT = "format";
public static final String PARENT = "parent";
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we could just have these constants in MasterStatusUtil and then we don't need a separate class for this. What do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me.

@Apache-HBase

This comment has been minimized.

@PDavid PDavid force-pushed the HBASE-29223-jamon-jsp branch from c5216a6 to e09403a Compare April 1, 2025 13:44
@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@PDavid PDavid marked this pull request as ready for review April 2, 2025 11:51
@Apache-HBase

This comment has been minimized.

@PDavid
Copy link
Contributor Author

PDavid commented Apr 2, 2025

I tested this locally in standalone mode after building with maven (mvn clean install -DskipTests && bin/start-hbase.sh). I created some tables, adding data with the ltt tool (bin/hbase ltt -num_keys 10000 -write 100:100 -num_tables 10 -multiput)

image

I will still have to test these special cases as these have special UI parts:

  • Dead region servers
  • Replication - peers
  • Backup master
  • RS groups

I will also test with Pseudo-Distributed mode.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache9 Apache9 requested a review from Copilot April 9, 2025 14:50
@Apache9
Copy link
Contributor

Apache9 commented Apr 9, 2025

Let me see if the copilot can give some feedbacks since this is a very big change...

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot reviewed 39 out of 45 changed files in this pull request and generated 3 comments.

Files not reviewed (6)
  • hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon: Language not supported
  • hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon: Language not supported
  • hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmpl.jamon: Language not supported
  • hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/RegionVisualizerTmpl.jamon: Language not supported
  • hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon: Language not supported
  • hbase-server/src/main/resources/hbase-webapps/master/index.html: Language not supported

Comment on lines 96 to 97
rsGroupName = server2GroupMap.get(serverName.getAddress()).getName();
}
Copy link

Copilot AI Apr 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line assumes that server2GroupMap.get(serverName.getAddress()) is non-null. Add a null check before calling getName() to avoid a possible NullPointerException.

Suggested change
rsGroupName = server2GroupMap.get(serverName.getAddress()).getName();
}
RSGroupInfo groupInfo = server2GroupMap.get(serverName.getAddress());
if (groupInfo != null) {
rsGroupName = groupInfo.getName();
} else {
rsGroupName = "default";
}
}

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be honest I'm not sure if this is a good suggestion.
What do you all think?

@PDavid PDavid force-pushed the HBASE-29223-jamon-jsp branch from 396d471 to 2464b4f Compare May 25, 2025 12:09
@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

Comment on lines +103 to +127
String hostname = master.getServerName().getHostname();
assertTrue(page.contains("<h1>Master <small>" + hostname + "</small></h1>"));
assertTrue(page.contains("<h2><a name=\"regionservers\">Region Servers</a></h2>"));
assertRegionServerLinks(master, page);

assertTrue(page.contains("<h2>Backup Masters</h2>"));
assertTrue(page.contains("<h2><a name=\"tables\">Tables</a></h2>"));
assertTableLinks(master, page);

assertTrue(page.contains("<h2><a name=\"region_visualizer\"></a>Region Visualizer</h2>"));
assertTrue(page.contains("<h2><a name=\"peers\">Peers</a></h2>"));
assertTrue(page.contains("<h2><a name=\"tasks\">Tasks</a></h2>"));
assertTrue(page.contains("<h2><a name=\"attributes\">Software Attributes</a></h2>"));

assertTrue(page.contains(VersionInfo.getVersion()));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For now I only added these assertions on the HTML content of the Master Status page. But we can add more sophisticated asserts in the future.

@PDavid PDavid requested a review from Apache9 May 26, 2025 05:13
@PDavid PDavid self-assigned this Aug 15, 2025
@PDavid PDavid force-pushed the HBASE-29223-jamon-jsp branch from ad03910 to 2931323 Compare August 15, 2025 18:06
@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@Apache-HBase

This comment has been minimized.

@stoty stoty requested a review from ndimiduk October 7, 2025 05:26
@PDavid PDavid merged commit be40011 into apache:master Oct 8, 2025
1 check passed
@PDavid PDavid deleted the HBASE-29223-jamon-jsp branch October 8, 2025 11:16
PDavid added a commit that referenced this pull request Oct 16, 2025
This is the 2/3 step of the Jamon to JSP migration: the Region Server Status page.

Did the migration the same way as for the Master Status page: #6875

Migrated the Jamon code to JSP as close as possible. Extracted the duplicated `formatZKString` method to new java class: ZKStringFormatter and added unit tests.

Changed the Region Server Status page back to `/regionserver.jsp`. Made sure that `/rs-status` redirects to `/regionserver.jsp`.

Extracted the BlockCache inline CSS styles to `hbase.css` file. Also extracted the large BlockCache Hit Ratio periods paging JavaScript code to separate .js file.

Introduced a `src/main/resources/hbase-webapps/common` directory where we can place common JSP files which are used by both Master and RegionServer JSP pages. This required to adjust the JSP compiler Maven Antrun plugin a bit.

Extracted the inline tablesorter initialization JavaScript code to separate file.

Signed-off-by: Duo Zhang <[email protected]>
PDavid added a commit to PDavid/hbase that referenced this pull request Nov 18, 2025
The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)
PDavid added a commit that referenced this pull request Nov 24, 2025
The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.


(cherry picked from commit be40011)

Signed-off-by: Istvan Toth <[email protected]>
PDavid added a commit that referenced this pull request Nov 24, 2025
The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)
PDavid added a commit to PDavid/hbase that referenced this pull request Nov 24, 2025
The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)
PDavid added a commit that referenced this pull request Nov 26, 2025
* HBASE-29223 Migrate Master Status Jamon page back to JSP (#6875)

The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)

* HBASE-29223 spotless fix

* [ADDENDUM] HBASE-29223 Fix TestMasterStatusUtil (#7416)

TestMasterStatusUtil.testGetFragmentationInfoTurnedOn failed in master nightly build

Signed-off-by: Nihal Jain <[email protected]>
Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 8ef271f)
PDavid added a commit that referenced this pull request Nov 26, 2025
* HBASE-29223 Migrate Master Status Jamon page back to JSP (#6875)

The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)

* [ADDENDUM] HBASE-29223 Fix TestMasterStatusUtil (#7416)

TestMasterStatusUtil.testGetFragmentationInfoTurnedOn failed in master nightly build

Signed-off-by: Nihal Jain <[email protected]>
Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 8ef271f)
PDavid added a commit that referenced this pull request Dec 1, 2025
This is the 2/3 step of the Jamon to JSP migration: the Region Server Status page.

Did the migration the same way as for the Master Status page: #6875

Migrated the Jamon code to JSP as close as possible. Extracted the duplicated `formatZKString` method to new java class: ZKStringFormatter and added unit tests.

Changed the Region Server Status page back to `/regionserver.jsp`. Made sure that `/rs-status` redirects to `/regionserver.jsp`.

Extracted the BlockCache inline CSS styles to `hbase.css` file. Also extracted the large BlockCache Hit Ratio periods paging JavaScript code to separate .js file.

Introduced a `src/main/resources/hbase-webapps/common` directory where we can place common JSP files which are used by both Master and RegionServer JSP pages. This required to adjust the JSP compiler Maven Antrun plugin a bit.

Extracted the inline tablesorter initialization JavaScript code to separate file.

Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 7892207)
PDavid added a commit to PDavid/hbase that referenced this pull request Dec 1, 2025
apache#7478)

* HBASE-29223 Migrate Master Status Jamon page back to JSP (apache#6875)

The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)

* HBASE-29223 spotless fix

* [ADDENDUM] HBASE-29223 Fix TestMasterStatusUtil (apache#7416)

TestMasterStatusUtil.testGetFragmentationInfoTurnedOn failed in master nightly build

Signed-off-by: Nihal Jain <[email protected]>
Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 8ef271f)
(cherry picked from commit d481a46)
PDavid added a commit that referenced this pull request Dec 2, 2025
* HBASE-29531 Migrate RegionServer Status Jamon page back to JSP (#7371)

This is the 2/3 step of the Jamon to JSP migration: the Region Server Status page.

Did the migration the same way as for the Master Status page: #6875

Migrated the Jamon code to JSP as close as possible. Extracted the duplicated `formatZKString` method to new java class: ZKStringFormatter and added unit tests.

Changed the Region Server Status page back to `/regionserver.jsp`. Made sure that `/rs-status` redirects to `/regionserver.jsp`.

Extracted the BlockCache inline CSS styles to `hbase.css` file. Also extracted the large BlockCache Hit Ratio periods paging JavaScript code to separate .js file.

Introduced a `src/main/resources/hbase-webapps/common` directory where we can place common JSP files which are used by both Master and RegionServer JSP pages. This required to adjust the JSP compiler Maven Antrun plugin a bit.

Extracted the inline tablesorter initialization JavaScript code to separate file.

Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 7892207)

* [ADDENDUM] HBASE-29223 Fix TestMasterStatusUtil (#7416)

TestMasterStatusUtil.testGetFragmentationInfoTurnedOn failed in master nightly build

Signed-off-by: Nihal Jain <[email protected]>
Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 8ef271f)
PDavid added a commit that referenced this pull request Dec 3, 2025
This is the 2/3 step of the Jamon to JSP migration: the Region Server Status page.

Did the migration the same way as for the Master Status page: #6875

Migrated the Jamon code to JSP as close as possible. Extracted the duplicated `formatZKString` method to new java class: ZKStringFormatter and added unit tests.

Changed the Region Server Status page back to `/regionserver.jsp`. Made sure that `/rs-status` redirects to `/regionserver.jsp`.

Extracted the BlockCache inline CSS styles to `hbase.css` file. Also extracted the large BlockCache Hit Ratio periods paging JavaScript code to separate .js file.

Introduced a `src/main/resources/hbase-webapps/common` directory where we can place common JSP files which are used by both Master and RegionServer JSP pages. This required to adjust the JSP compiler Maven Antrun plugin a bit.

Extracted the inline tablesorter initialization JavaScript code to separate file.

Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 7892207)
PDavid added a commit to PDavid/hbase that referenced this pull request Dec 3, 2025
…e#7371)

This is the 2/3 step of the Jamon to JSP migration: the Region Server Status page.

Did the migration the same way as for the Master Status page: apache#6875

Migrated the Jamon code to JSP as close as possible. Extracted the duplicated `formatZKString` method to new java class: ZKStringFormatter and added unit tests.

Changed the Region Server Status page back to `/regionserver.jsp`. Made sure that `/rs-status` redirects to `/regionserver.jsp`.

Extracted the BlockCache inline CSS styles to `hbase.css` file. Also extracted the large BlockCache Hit Ratio periods paging JavaScript code to separate .js file.

Introduced a `src/main/resources/hbase-webapps/common` directory where we can place common JSP files which are used by both Master and RegionServer JSP pages. This required to adjust the JSP compiler Maven Antrun plugin a bit.

Extracted the inline tablesorter initialization JavaScript code to separate file.

Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 7892207)
PDavid added a commit that referenced this pull request Dec 8, 2025
#7505)

This is the 2/3 step of the Jamon to JSP migration: the Region Server Status page.

Did the migration the same way as for the Master Status page: #6875

Migrated the Jamon code to JSP as close as possible. Extracted the duplicated `formatZKString` method to new java class: ZKStringFormatter and added unit tests.

Changed the Region Server Status page back to `/regionserver.jsp`. Made sure that `/rs-status` redirects to `/regionserver.jsp`.

Extracted the BlockCache inline CSS styles to `hbase.css` file. Also extracted the large BlockCache Hit Ratio periods paging JavaScript code to separate .js file.

Introduced a `src/main/resources/hbase-webapps/common` directory where we can place common JSP files which are used by both Master and RegionServer JSP pages. This required to adjust the JSP compiler Maven Antrun plugin a bit.

Extracted the inline tablesorter initialization JavaScript code to separate file.

(cherry picked from commit 7892207)

Signed-off-by: Duo Zhang <[email protected]>
PDavid added a commit to PDavid/hbase that referenced this pull request Dec 10, 2025
apache#7478)

* HBASE-29223 Migrate Master Status Jamon page back to JSP (apache#6875)

The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)

* HBASE-29223 spotless fix

* [ADDENDUM] HBASE-29223 Fix TestMasterStatusUtil (apache#7416)

TestMasterStatusUtil.testGetFragmentationInfoTurnedOn failed in master nightly build

Signed-off-by: Nihal Jain <[email protected]>
Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 8ef271f)
(cherry picked from commit d481a46)
PDavid added a commit that referenced this pull request Dec 16, 2025
The JSP code is equivalent to the Jamon code, just changed the syntax back to JSP.
Request attributes are used to transfer data between JSP pages.
Tried to preserve the code as much as possible but did some changes:

Sub-templates were usually extracted to separate JSP file (and included with `<jsp:include`), in some case it was extracted as Java method.

Extracted some sections from master page to separate JSP pages:
- Software Attributes
- Warnings

Extracted the long JavaScript from the master page which executes on page load to separate JS file.

Extracted some frequently used static methods to a new util class: `MasterStatusUtil`. Also added unit tests for the static methods in `MasterStatusUtil`.

Changed the Master Status page back to `/master.jsp` again. Now made sure that `/master-status` redirects to `/master.jsp`.

Signed-off-by: Istvan Toth <[email protected]>
(cherry picked from commit be40011)

* [ADDENDUM] HBASE-29223 Fix TestMasterStatusUtil (#7416)

TestMasterStatusUtil.testGetFragmentationInfoTurnedOn failed in master nightly build

Signed-off-by: Nihal Jain <[email protected]>
Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 8ef271f)
(cherry picked from commit d481a46)
PDavid added a commit that referenced this pull request Jan 6, 2026
* HBASE-29531 Migrate RegionServer Status Jamon page back to JSP (#7371)

This is the 2/3 step of the Jamon to JSP migration: the Region Server Status page.

Did the migration the same way as for the Master Status page: #6875

Migrated the Jamon code to JSP as close as possible. Extracted the duplicated `formatZKString` method to new java class: ZKStringFormatter and added unit tests.

Changed the Region Server Status page back to `/regionserver.jsp`. Made sure that `/rs-status` redirects to `/regionserver.jsp`.

Introduced a `src/main/resources/hbase-webapps/common` directory where we can place common JSP files which are used by both Master and RegionServer JSP pages. This required to adjust the JSP compiler Maven Antrun plugin a bit.

Extracted the inline tablesorter initialization JavaScript code to separate file.

Signed-off-by: Duo Zhang <[email protected]>
(cherry picked from commit 7892207)

* HBASE-29531 Fix missing charset in RS Status page

Made sure that the Content-Type HTTP header includes the UTF-8 charset when the RegionServer status web UI page is returned so that it is consistent with Master Status web UI page.

---------

Signed-off-by: Duo Zhang <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants