Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a hypersistence-utils-hibernate-63 module for Hibernate 6.3 #657

Closed
devendraPatidar1 opened this issue Sep 22, 2023 · 21 comments
Closed
Milestone

Comments

@devendraPatidar1
Copy link

devendraPatidar1 commented Sep 22, 2023

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

io.hypersistence.utils.hibernate.type.basic.PostgreSQLEnumType.setParameterValues(PostgreSQLEnumType.java:56)

The following method did not exist:

org.hibernate.metamodel.model.convert.spi.EnumValueConverter org.hibernate.type.EnumType.getEnumValueConverter()

@vladmihalcea
Copy link
Owner

Hibernate 6.3 is not supported yet. Feel free to implement it and send me a Pull Request when you are done.

@oliveryasuna
Copy link

@vladmihalcea Are you no longer contributing to the project?

@milgner
Copy link

milgner commented Sep 26, 2023

Just FYI for anyone stumbling over this: Hibernate 6.3 has native support for PostgreSQL enums. Just use

@JdbcType(PostgreSQLEnumJdbcType::class)
val myEnum: MyEnum

(or the respective Java equivalent)

I still use hypersistence-utils for PostgreSQL interval types - it's great! - but for enums it is not required anymore.

@vladmihalcea
Copy link
Owner

@oliveryasuna Over the next few years, I will be very busy and won't have too much spare time to work on this project.

However, if you provide a Pull Request with the fix, I will find some time to review and integrate it. Looking forward to your contributions.

@benstpierre
Copy link

We could really use a hibernate 6.3 compatible version. I don't think I have the skills with hibernate's internals to make it happen. Hopefully some kind soul with the skills does!

@milgner
Copy link

milgner commented Sep 27, 2023

The question is: what would need to be done?

Apart from removing enum support from hypersistence-utils (as it's not required anymore thanks to built-in support), is there anything that requires actual changes for Hibernate 6.3?
If it's only removal of that thing, it's much less important as this is a trivial and mostly cosmetic / clean-up kind of change.

As mentioned, I'm only using hypersistence Interval types and these work just fine with Hibernate 6.3.

@vladmihalcea
Copy link
Owner

Here's what's needed to be done:

  1. Create a new 63 module by copying the 62 one
  2. Set the Hibernate version to 6.3
  3. Run the tests and fix everything so that all tests pass

That's it.

@oliveryasuna
Copy link

oliveryasuna commented Sep 28, 2023

@benstpierre @milgner @vladmihalcea A discussion should be had on whether enum support should be removed from hypersistence-utils or updated to support Hibernate 6.3.

In no particular order...

Argument 1: Update hypersistence-utils to support Hibernate 6.3's enum

  1. Backwards compatibility: Maintaining hypersistence-utils and making it compatible with Hibernate 6.3 can help us preserve backwards compatibility. Existing projects that rely on hypersistence-utils for enum support can upgrade to Hibernate 6.3 and hypersistence-utils-hibernate-63 without refactoring their existing implementations or experiencing disruptions. We can also deprecate support.
  2. Uniformity: Updating hypersistence-utils would offer uniformity to projects that span multiple Hibernate versions, where native enum support might not be available. Developers working on projects that have not upgraded to Hibernate 6.3 would still have a consistent approach to handled enums (and when they upgrade to Hibernate 6.3).
  3. Customization & control: Not sure, but if hypersistence-utils offers customization, or additional features or behaviors related to enums that are not present in Hibernate's native support, maintaining support can preserve these features for projects that rely on them.

Argument 2: Drop enum support in favor of Hibernate's native support

  1. Reduced maintenance overhead: Relying on HIbernate's native support can reduce the maintenance overhead associated with keeping hypersistence-utils up-to-date with the latest Hibernate versions, allowing developers to focus more on feature development.
  2. Performance & optimization: A benchmark should be performed. Native support for enums might be more optimized and performant, as it is built into Hibernate itself. It could offer better integration and leverage internal optimizations, benefiting applications in terms of performance and resource usage.
  3. Standardization: Adopting Hibernate's native support for enums could standardize the way developers handle enums, making it easier to share knowledge, find solutions, and get community support. By dropping enum support in favor of Hibernate's native support, we would push towards this goal.

I would love to hear from @thjanssen.

@vladmihalcea How do you expect branching/tagging to work?

@vladmihalcea
Copy link
Owner

The PostgreSQL Enum Type in Hypersistence Utils does not do anything special.

If the Hibernate 6 provides support for it, then the current Type should be deprecated in the 60 snd 62 modules and removed in the new 63 module. Most likely that a new module will be needed.

@adiinfo-77
Copy link

Hi

i just discovered this wonderful project today and used it for getting the native Query generated by PSQL.
Something like:
String nativeSql = SQLExtractor.from(query);

i can confirm that Hibernate 6.3 does not work: i also get an exception "contains compatible versions ..." and had to revert to 6.2.9.

So it is definitely not only about PostgreSQL Enum's.

Andrej

@milgner
Copy link

milgner commented Sep 30, 2023

i can confirm that Hibernate 6.3 does not work: i also get an exception "contains compatible versions ..." and had to revert to 6.2.9.

Could you add the full error message and stacktrace here? That would certainly help to get a full picture of what needs to be done.

@vladmihalcea vladmihalcea changed the title hypersistence-utils-hibernate-62 is not compatible with hibernate 6.3.x Add a hypersistence-utils-hibernate-63 for Hibernate 6.3 Oct 1, 2023
@vladmihalcea vladmihalcea changed the title Add a hypersistence-utils-hibernate-63 for Hibernate 6.3 Add a hypersistence-utils-hibernate-63 module for Hibernate 6.3 Oct 1, 2023
vladmihalcea added a commit that referenced this issue Oct 1, 2023
@vladmihalcea
Copy link
Owner

vladmihalcea commented Oct 1, 2023

@milgner From the previous Hibernate 6 modules, there are surely tons of things that have to be done.

You can use this branch as a starting point, and if you run mvn clean test-compile, here's a list of issues that have to be fixed first:

[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\PostgreSQLEnumType.java:[10,55] error: cannot find symbol
[ERROR]   symbol:   class NamedEnumValueConverter
[ERROR]   location: package org.hibernate.type.descriptor.converter.internal
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\MutableDynamicParameterizedType.java:[14,7] error: MutableDynamicParameterizedType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR]   where T is a type-variable:
[ERROR]     T extends Object declared in class MutableDynamicParameterizedType
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\ZoneIdType.java:[17,7] error: ZoneIdType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\YearMonthEpochType.java:[17,7] error: YearMonthEpochType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\MonthDayIntegerType.java:[16,7] error: MonthDayIntegerType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\YearMonthIntegerType.java:[18,7] error: YearMonthIntegerType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\Iso8601MonthType.java:[18,7] error: Iso8601MonthType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\MonthDayDateType.java:[19,7] error: MonthDayDateType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\YearMonthTimestampType.java:[17,7] error: YearMonthTimestampType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\YearMonthDateType.java:[18,7] error: YearMonthDateType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\PostgreSQLEnumType.java:[52,16] error: cannot find symbol
[ERROR]   symbol:   class NamedEnumValueConverter
[ERROR]   location: class PostgreSQLEnumType
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\basic\YearType.java:[19,7] error: YearType is not abstract and does not override abstract method getSqmType() in SqmExpressible
[ERROR] hypersistence-utils\hypersistence-utils-hibernate-63\src\main\java\io\hypersistence\utils\hibernate\type\money\CurrencyUnitType.java:[15,7] error: CurrencyUnitType is not abstract and does not override abstract method getSqmType() in SqmExpressible

However, this is just to compile the main classes. When this part is fixed, there are tests that might be failing, too, and those will have to be fixed as well.

@adiinfo-77
Copy link

adiinfo-77 commented Oct 2, 2023

@milgner

here is the stacktrace i get when using Hibernate 6.3.1:

Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface org.hibernate.query.spi.QueryEngine, but class was expected
	at io.hypersistence.utils.hibernate.query.SQLExtractor.from(SQLExtractor.java:46)
	at hibernatetest.hibernatejpa1.HibernateJPA1.main(HibernateJPA1.java:95)
Command execution failed.
org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
    at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:404)
    at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:166)
    at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:1000)
    at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:947)
    at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:471)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
    at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
    at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
    at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:206)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:568)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)

@mlinhard
Copy link

mlinhard commented Nov 23, 2023

As a workaround for mapping Postgres types, what I was used to do with com.vladmihalcea:hibernate-types-55

@TypeDefs({
        @TypeDef(name = "my_postgres_enum_type_name", typeClass = PostgreSQLEnumType.class)
})
public class MyEntity  {

    @Enumerated(EnumType.STRING)
    @Type(type = "my_postgres_enum_type_name")
    MyJavaEnumName field;

What worked for me on Spring Boot 3.1.4, Hibernate 6.3.1 is

    @Enumerated(EnumType.STRING)
    @Column(columnDefinition = "my_postgres_enum_type_name")
    @JdbcTypeCode(SqlTypes.NAMED_ENUM)
    MyJavaEnumName field;

@dreis2211
Copy link
Contributor

dreis2211 commented Nov 23, 2023

More an FYI: Since Spring-Boot 3.2 Hibernate 6.3 is included. Which makes this library not compatible anymore with newer Spring-Boot versions starting with 3.2 that was released today...

@vladmihalcea
Copy link
Owner

@dreis2211 It will be compatible when this issue is fixed. Looking forward to the Pull Request that fixes it.

@dreis2211
Copy link
Contributor

Based on the comment here, it might make sense to directly go to Hibernate 6.4: https://hibernate.atlassian.net/browse/HHH-17454?focusedCommentId=113382

@adrianAzoitei
Copy link

@dreis2211 It will be compatible when this issue is fixed. Looking forward to the Pull Request that fixes it.

@vladmihalcea should we then use Spring 6.1.x in the new hypersistence-utils-hibernate-63 project?

@vladmihalcea
Copy link
Owner

@adrianAzoitei Currently, there's only a branch where nothing was done, so feel free to do anything that's needed to make it work with Hibernate 6.3 and 6.4.

@tmvlpl
Copy link
Contributor

tmvlpl commented Dec 17, 2023

All in all the necessary code changes to make it compile and test successfully with Hibernate 6.3 were small. As I don't use most of the libraries features I have no proper real world test case for the changes. So please try out the changes and report any issues.

@vladmihalcea
Copy link
Owner

Fixed.

benkard added a commit to benkard/mulkcms2 that referenced this issue Dec 29, 2023
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [flow-bin](https://github.com/flowtype/flow-bin) ([changelog](https://github.com/facebook/flow/blob/master/Changelog.md)) | devDependencies | minor | [`^0.224.0` -> `^0.225.0`](https://renovatebot.com/diffs/npm/flow-bin/0.224.0/0.225.1) |
| [org.liquibase.ext:liquibase-hibernate5](https://github.com/liquibase/liquibase-hibernate/wiki) ([source](https://github.com/liquibase/liquibase-hibernate)) | build | patch | `4.25.0` -> `4.25.1` |
| [org.liquibase:liquibase-maven-plugin](http://www.liquibase.org/liquibase-maven-plugin) ([source](https://github.com/liquibase/liquibase)) | build | patch | `4.25.0` -> `4.25.1` |
| [org.jsoup:jsoup](https://jsoup.org/) ([source](https://github.com/jhy/jsoup)) | compile | patch | `1.17.1` -> `1.17.2` |
| [io.hypersistence:hypersistence-utils-hibernate-62](https://github.com/vladmihalcea/hypersistence-utils) | compile | minor | `3.6.1` -> `3.7.0` |
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | patch | `3.6.3` -> `3.6.4` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | patch | `3.6.3` -> `3.6.4` |
| [org.apache.maven.plugins:maven-compiler-plugin](https://maven.apache.org/plugins/) | build | minor | `3.11.0` -> `3.12.1` |

---

### Release Notes

<details>
<summary>flowtype/flow-bin</summary>

### [`v0.225.1`](flow/flow-bin@62a43fb...23ec616)

[Compare Source](flow/flow-bin@62a43fb...23ec616)

### [`v0.225.0`](flow/flow-bin@e6104a1...62a43fb)

[Compare Source](flow/flow-bin@e6104a1...62a43fb)

</details>

<details>
<summary>liquibase/liquibase</summary>

### [`v4.25.1`](https://github.com/liquibase/liquibase/blob/HEAD/changelog.txt#Liquibase-4251-is-a-patch-release)

[Compare Source](liquibase/liquibase@v4.25.0...v4.25.1)

</details>

<details>
<summary>jhy/jsoup</summary>

### [`v1.17.2`](https://github.com/jhy/jsoup/blob/HEAD/CHANGES.md#&#8203;1172-2023-Dec-29)

##### Improvements

-   **Attribute object accessors**: Added `Element.attribute(String)` and `Attributes.attribute(String)` to more simply
    obtain an `Attribute` object. [2069](jhy/jsoup#2069)
-   **Attribute source tracking**: If source tracking is on, and an Attribute's key is changed (
    via `Attribute.setKey(String)`), the source range is now still tracked
    in `Attribute.sourceRange()`. [2070](jhy/jsoup#2070)
-   **Wildcard attribute selector**: Added support for the `[*]` element with any attribute selector. And also restored
    support for selecting by an empty attribute name prefix (`[^]`). [2079](jhy/jsoup#2079)

##### Bug Fixes

-   **Mixed-cased source position**: When tracking the source position of attributes, if the source attribute name was
    mix-cased but the parser was lower-case normalizing attribute names, the source position for that attribute was not
    tracked correctly. [2067](jhy/jsoup#2067)
-   **Source position NPE**: When tracking the source position of a body fragment parse, a null pointer
    exception was thrown. [2068](jhy/jsoup#2068)
-   **Multi-point emoji entity**: A multi-point encoded emoji entity may be incorrectly decoded to the replacement
    character. [2074](jhy/jsoup#2074)
-   **Selector sub-expressions**: (Regression) in a selector like `parent [attr=va], other`, the `, OR` was binding
    to `[attr=va]` instead of `parent [attr=va]`, causing incorrect selections. The fix includes a EvaluatorDebug class
    that generates a sexpr to represent the query, allowing simpler and more thorough query parse
    tests. [2073](jhy/jsoup#2073)
-   **XML CData output**: When generating XML-syntax output from parsed HTML, script nodes containing (pseudo) CData
    sections would have an extraneous CData section added, causing script execution errors. Now, the data content is
    emitted in a HTML/XML/XHTML polyglot format, if the data is not already within a CData
    section. [2078](jhy/jsoup#2078)
-   **Thread safety**: The `:has` evaluator held a non-thread-safe Iterator, and so if an Evaluator object was
    shared across multiple concurrent threads, a NoSuchElement exception may be thrown, and the selected results may be
    incorrect. Now, the iterator object is a thread-local. [2088](jhy/jsoup#2088)

***

Older changes for versions 0.1.1 (2010-Jan-31) through 1.17.1 (2023-Nov-27) may be found in
[change-archive.txt](./change-archive.txt).

</details>

<details>
<summary>vladmihalcea/hypersistence-utils</summary>

### [`v3.7.0`](https://github.com/vladmihalcea/hypersistence-utils/blob/HEAD/changelog.txt#Version-370---December-18-2023)

\================================================================================

Oracle Interval Type does not support negative intervals [#&#8203;682](vladmihalcea/hypersistence-utils#682)

Return original object if target and original are the same when merging [#&#8203;677](vladmihalcea/hypersistence-utils#677)

Add a hypersistence-utils-hibernate-63 module for Hibernate 6.3 [#&#8203;657](vladmihalcea/hypersistence-utils#657)

</details>

<details>
<summary>quarkusio/quarkus</summary>

### [`v3.6.4`](https://github.com/quarkusio/quarkus/releases/tag/3.6.4)

[Compare Source](quarkusio/quarkus@3.6.3...3.6.4)

##### Complete changelog

-   [#&#8203;37808](quarkusio/quarkus#37808) - CLI - Rework how missing commands are detected
-   [#&#8203;37803](quarkusio/quarkus#37803) - Dev mode: add null checks to TimestampSet.isRestartNeeded()
-   [#&#8203;37798](quarkusio/quarkus#37798) - Only update ~/.docker/config.json if it exists
-   [#&#8203;37787](quarkusio/quarkus#37787) - Take priority into account in ConfigurationImpl
-   [#&#8203;37775](quarkusio/quarkus#37775) - Docs: fix typo in rabbitmq reference documentation
-   [#&#8203;37770](quarkusio/quarkus#37770) - Add SequencedCollection to BANNED_INTERFACE_TYPES
-   [#&#8203;37768](quarkusio/quarkus#37768) - Running application build with JDK21 and target Java 17 crash with NoClassDefFoundError: java/util/SequencedCollection
-   [#&#8203;37731](quarkusio/quarkus#37731) - Query logging is being done in io.quarkus.mongodb.panache.common.runtime.MongoOperations
-   [#&#8203;37723](quarkusio/quarkus#37723) - Do not use CSRF cookie as the next token value
-   [#&#8203;37717](quarkusio/quarkus#37717) - Docs: Fix incorrect link reference in Cross-Site Request Forgery Prevention guide
-   [#&#8203;37714](quarkusio/quarkus#37714) - Remove the driver property in the documentation for Cloud SQL
-   [#&#8203;37710](quarkusio/quarkus#37710) - Use NoStackTraceException in metrics
-   [#&#8203;37677](quarkusio/quarkus#37677) - Bump io.quarkus:quarkus-platform-bom-maven-plugin from 0.0.100 to 0.0.101
-   [#&#8203;37654](quarkusio/quarkus#37654) - Make sure dev mode is properly written in doc
-   [#&#8203;36848](quarkusio/quarkus#36848) - CSRF Token with HMAC signature gets double signed

</details>

<details>
<summary>quarkusio/quarkus-platform</summary>

### [`v3.6.4`](quarkusio/quarkus-platform@3.6.3...3.6.4)

[Compare Source](quarkusio/quarkus-platform@3.6.3...3.6.4)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This MR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4yNC4wIiwidXBkYXRlZEluVmVyIjoiMzQuMjQuMCJ9-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

10 participants