Skip to content

[fix](plugin) Allow legacy unversioned authentication plugins - #67286

Merged
CalvinKirs merged 3 commits into
apache:masterfrom
CalvinKirs:fix-auth-plugin-legacy-api-compat
Oct 30, 2026
Merged

CalvinKirs merged 3 commits into
apache:masterfrom
CalvinKirs:fix-auth-plugin-legacy-api-compat

Conversation

@CalvinKirs

@CalvinKirs CalvinKirs commented Aug 28, 2026 •

Copy link
Copy Markdown
Member

What problem does this PR solve?

#66211

Problem Summary:

The authentication plugin API-version gate rejects every plugin jar that does not contain Doris-Authentication-Plugin-Api-Version. Authentication plugins were distributed before this manifest contract existed, so upgrading FE breaks those legacy artifacts even when they implement the current v1 API.

This change adds an opt-in legacy mapping to the generic API gate and configures only the authentication family to treat a genuinely absent declaration as API 1.0:

  • unversioned legacy authentication plugins load with an operator warning;
  • empty, malformed, and explicitly incompatible declarations remain rejected;
  • connector, filesystem, lineage, and other strict gates keep their existing fail-closed behavior;
  • when the FE authentication API moves to another major, legacy v1 plugins are rejected automatically.

@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@CalvinKirs

Copy link
Copy Markdown
Member Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 16967 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit fe4c9b72bc58eae60b24c73aefe3e45741b0feca, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17619	3115	3124	3115
q2	2144	252	248	248
q3	10190	877	518	518
q4	4672	247	210	210
q5	7665	631	391	391
q6	139	117	94	94
q7	529	504	386	386
q8	9242	938	917	917
q9	3460	2409	2378	2378
q10	6531	855	691	691
q11	403	198	181	181
q12	620	264	194	194
q13	18127	1526	1174	1174
q14	164	151	141	141
q15	q16	451	400	368	368
q17	1354	840	793	793
q18	3151	2245	2268	2245
q19	1256	929	761	761
q20	366	280	207	207
q21	5610	1727	1809	1727
q22	334	274	228	228
Total cold run time: 94027 ms
Total hot run time: 16967 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	3513	3436	3390	3390
q2	511	400	405	400
q3	2251	2379	2233	2233
q4	1198	1186	923	923
q5	2228	2116	2118	2116
q6	168	119	86	86
q7	1011	925	854	854
q8	1603	1443	1441	1441
q9	3178	3169	3128	3128
q10	1864	1797	1608	1608
q11	355	277	254	254
q12	460	432	355	355
q13	1487	1534	1172	1172
q14	175	173	158	158
q15	q16	409	409	361	361
q17	3643	3280	3223	3223
q18	4857	4442	4765	4442
q19	994	890	872	872
q20	1022	986	826	826
q21	3932	3203	3283	3203
q22	410	360	313	313
Total cold run time: 35269 ms
Total hot run time: 31358 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 82569 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit fe4c9b72bc58eae60b24c73aefe3e45741b0feca, data reload: false

query5	4261	397	322	322
query6	425	132	132	132
query7	4938	423	233	233
query8	301	125	124	124
query9	8699	2885	2895	2885
query10	456	240	173	173
query11	5382	1040	915	915
query12	111	69	69	69
query13	1205	430	320	320
query14	6126	2208	2103	2103
query14_1	1985	1982	1991	1982
query15	177	119	116	116
query16	924	375	356	356
query17	830	454	381	381
query18	2330	357	229	229
query19	164	134	103	103
query20	74	72	68	68
query21	207	100	88	88
query22	5368	5271	5297	5271
query23	6668	6185	6217	6185
query23_1	5947	6208	6241	6208
query24	7285	1100	764	764
query24_1	779	768	774	768
query25	411	288	238	238
query26	1220	226	134	134
query27	2788	435	256	256
query28	4655	1484	1501	1484
query29	938	427	341	341
query30	250	151	133	133
query31	813	402	324	324
query32	124	89	69	69
query33	462	217	180	180
query34	991	830	474	474
query35	406	393	353	353
query36	570	574	509	509
query37	122	82	71	71
query38	1007	846	800	800
query39	500	493	485	485
query39_1	470	468	474	468
query40	204	88	76	76
query41	55	52	52	52
query42	74	74	72	72
query43	237	240	211	211
query44	1031	552	548	548
query45	113	101	96	96
query46	797	840	546	546
query47	757	757	708	708
query48	318	320	243	243
query49	575	244	201	201
query50	783	270	198	198
query51	8510	8317	8220	8220
query52	68	76	66	66
query53	193	222	203	203
query54	259	183	176	176
query55	79	60	57	57
query56	202	194	165	165
query57	730	690	598	598
query58	209	171	169	169
query59	1259	1275	1120	1120
query60	260	174	179	174
query61	116	115	119	115
query62	386	204	179	179
query63	164	150	138	138
query64	2856	666	597	597
query65	1655	1594	1628	1594
query66	1771	267	197	197
query67	10138	9735	9821	9735
query68	2984	1083	738	738
query69	354	228	192	192
query70	652	621	629	621
query71	258	164	169	164
query72	2413	1788	1585	1585
query73	651	609	349	349
query74	2022	1222	1137	1137
query75	1196	1089	955	955
query76	2382	719	541	541
query77	240	253	217	217
query78	3929	3682	3163	3163
query79	2808	895	617	617
query80	1635	326	266	266
query81	516	153	133	133
query82	959	127	99	99
query83	289	211	191	191
query84	298	111	91	91
query85	871	409	300	300
query86	482	195	180	180
query87	1033	974	879	879
query88	3066	2106	2114	2106
query89	304	199	180	180
query90	2104	129	130	129
query91	130	117	101	101
query92	98	67	73	67
query93	2062	1113	679	679
query94	673	245	219	219
query95	587	260	229	229
query96	805	585	264	264
query97	1076	1080	986	986
query98	181	135	127	127
query99	436	350	314	314
Total cold run time: 181068 ms
Total hot run time: 82569 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 14.73 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit fe4c9b72bc58eae60b24c73aefe3e45741b0feca, data reload: false

query1	0.00	0.01	0.00
query2	0.08	0.04	0.03
query3	0.25	0.11	0.11
query4	1.60	0.09	0.09
query5	0.17	0.17	0.16
query6	1.22	0.68	0.69
query7	0.04	0.01	0.00
query8	0.05	0.03	0.03
query9	0.29	0.21	0.22
query10	0.37	0.36	0.35
query11	0.17	0.11	0.11
query12	0.14	0.12	0.12
query13	0.32	0.30	0.31
query14	0.45	0.45	0.45
query15	0.37	0.35	0.34
query16	0.22	0.21	0.24
query17	0.69	0.69	0.70
query18	0.19	0.18	0.17
query19	1.19	1.16	1.16
query20	0.01	0.01	0.01
query21	15.48	0.16	0.13
query22	5.07	0.04	0.04
query23	16.16	0.25	0.10
query24	3.04	0.34	0.25
query25	0.10	0.05	0.04
query26	0.72	0.17	0.13
query27	0.03	0.03	0.03
query28	3.60	0.58	0.27
query29	12.46	3.22	2.59
query30	0.25	0.12	0.12
query31	2.76	0.37	0.18
query32	3.44	0.33	0.24
query33	1.47	1.54	1.39
query34	15.40	2.16	1.78
query35	1.75	1.76	1.70
query36	0.47	0.29	0.30
query37	0.06	0.04	0.04
query38	0.06	0.03	0.03
query39	0.04	0.03	0.03
query40	0.11	0.07	0.07
query41	0.08	0.03	0.02
query42	0.03	0.03	0.02
query43	0.03	0.02	0.03
Total cold run time: 90.43 s
Total hot run time: 14.73 s

@morningman

Copy link
Copy Markdown
Contributor

/review

@CalvinKirs

Copy link
Copy Markdown
Member Author

run external

@CalvinKirs

Copy link
Copy Markdown
Member Author

/review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Request changes: the legacy compatibility branch makes a directory-loader manifest lookup failure indistinguishable from a genuinely unversioned legacy artifact, so an unverifiable authentication plugin can be published.

Critical checkpoints:

  • Goal and proof: readable legacy authentication JARs are now accepted with a warning, while blank, malformed, and incompatible declarations remain rejected. The goal is not fully met because unresolved or unreadable defining-JAR metadata also enters the legacy branch; the missing loader-level negative test is called out inline.
  • Scope and clarity: the five-file change is focused, and the generic gate keeps legacy behavior opt-in.
  • Concurrency and lifecycle: no new shared mutable state or lock order is introduced; the immutable gate and warning run inside the existing load lifecycle. External JAR mutation is not protected by that lock and exposes the accepted issue. Existing PluginLoadException cleanup would close the classloader once read failures are propagated.
  • Compatibility and parallel paths: repository history supports authentication API 1.0 as the pre-manifest contract, and the fixed legacy major is compared with the independently filtered current major, so a future 2.x FE rejects it. Connector, filesystem, and lineage remain strict. The classpath-provider path also remains fail-closed on JAR I/O errors; only the directory path has the inline inconsistency.
  • Tests and results: the added tests correctly cover readable absence, warning selection, malformed legacy configuration, and legacy/current major mismatch. No result files changed. I did not run local builds or tests because this review environment forbids them; the live PR currently reports Compile, FE UT, and CheckStyle passing.
  • Observability and performance: the warning is useful and negligible for true legacy loads, but becomes misleading on the accepted failure path. No other hot-path or observability concern was found.
  • Configuration, persistence, transactions, data writes, and FE-BE protocol variables: not applicable to this change.
  • User focus: no additional focus was provided.

Review completion: two bounded rounds completed with two full-coverage lanes and one separate risk-focused lane. Round 2 returned NO_NEW_VALUABLE_FINDINGS in all lanes; every candidate was accepted, deduplicated, or dismissed with evidence. One inline issue remains.

return "no " + manifestAttribute + " in the plugin jar MANIFEST; this FE serves " + familyLabel
+ " plugin API " + expectedVersion + ". Declare the attribute and rebuild the plugin"
+ " against this Doris release.";
if (declaredVersion == null) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P2] Distinguish an absent declaration from a failed manifest lookup

On the directory-loading path, null does not prove that a readable defining JAR genuinely omitted this attribute. readFromDefiningJar also returns null after every JarFile/manifest IOException, or when the fallback scan cannot find the factory class. For example, lazy loading can define a self-contained factory and then race a JAR removal or permission/read failure before the separate manifest opens; this branch then admits and publishes the unverifiable plugin as legacy 1.0. Preserve an explicit successfully-read-but-absent result for this legacy case, reject unresolved/read failures at STAGE_API_VERSION, and add a loader-level negative test alongside the true-absence case.

### What problem does this PR solve?

Issue Number: N/A

Related PR: apache#67286

Problem Summary: The directory plugin loader used null for both a genuinely absent API-version declaration and a failed defining-JAR lookup. With legacy authentication compatibility enabled, an unreadable JAR, malformed manifest, or unresolved factory could therefore be admitted as API 1.0. Propagate lookup failures as apiVersion load failures before construction and publication, retain missing defining-JAR locations instead of falling back to another copy of the class, and keep release-version display metadata best effort. Add deterministic loader tests for readable legacy plugins, explicit invalid declarations, corrupt JARs/manifests, missing defining JARs, and unavailable provenance.

### Release note

Authentication plugins with unreadable or unresolved API-version metadata are rejected. Readable legacy plugins without a declaration continue to load with a warning.

### Check List (For Author)

- Test: Unit Test
    - run-fe-ut.sh with CUSTOM_MVN scoping the reactor to fe-extension-loader and fe-authentication-handler: 59 tests passed, including six new loader tests; Checkstyle passed for all 10 selected reactor modules. Full build.sh --fe was stopped after incomplete native third-party dependencies triggered an unrelated dependency rebuild.
- Behavior changed: Yes (failed API-version metadata verification cannot use legacy compatibility)
- Does this need documentation: No
@CalvinKirs

Copy link
Copy Markdown
Member Author

run buildall

@CalvinKirs

Copy link
Copy Markdown
Member Author

Local pipeline review — ✅ PASS

schema: doris-repo-review/v1
status: PASS
pr: apache/doris#67286
commit: 785744e577ae64ae697746b84215132fd7e3a492
base: 0cfc81c6163b79a6717e165e4c9dc1c8e27faa60
reviewed_at: 2026-10-14T11:40+08:00
reviewer: CalvinKirs
model: gpt-6.1-sol
effort: high
findings: {blocker: 0, major: 0, minor: 0, nit: 0}
rounds: 1
converged: true

Notes for maintainers

  • fe/fe-extension-loader/src/main/java/org/apache/doris/extension/loader/DirectoryPluginRuntimeManager.java:290 — The previous review issue is fixed: unreadable or unresolved defining-JAR metadata fails at STAGE_API_VERSION before factory construction or publication; genuinely absent declarations remain eligible for the legacy mapping.
  • fe/fe-extension-loader/src/main/java/org/apache/doris/extension/loader/ManifestVersions.java:106 — Missing defining-JAR locations remain authoritative, preventing substitution by another candidate containing the same factory class. Only authentication opts into legacy API 1.0; other plugin families remain strict.
  • Repair validation: 59 relevant unit tests and Checkstyle passed. Two full-review lanes and one test-risk lane covered all seven changed files; the verdict converged in round 1 with no findings. Full FE packaging was not completed because incomplete native third-party dependencies triggered an unrelated rebuild, which was stopped.

Reviewed locally with the doris-repo-review pipeline (a local port of .github/workflows/code-review-runner.yml). This is not a CI status check.

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 29513 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 785744e577ae64ae697746b84215132fd7e3a492, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17601	5691	5593	5593
q2	2160	326	257	257
q3	10191	1429	854	854
q4	4683	482	364	364
q5	7436	826	558	558
q6	197	193	166	166
q7	801	825	617	617
q8	9257	1344	1123	1123
q9	5846	4530	4490	4490
q10	6818	1275	1034	1034
q11	433	269	239	239
q12	633	422	306	306
q13	18056	3089	2404	2404
q14	268	283	247	247
q15	q16	744	726	684	684
q17	1183	749	593	593
q18	7065	6261	6196	6196
q19	1104	969	629	629
q20	388	343	228	228
q21	5581	2614	2694	2614
q22	416	387	317	317
Total cold run time: 100861 ms
Total hot run time: 29513 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	6712	6672	6892	6672
q2	783	580	552	552
q3	5557	5732	5224	5224
q4	2087	2188	1589	1589
q5	5902	5743	5749	5743
q6	266	197	159	159
q7	2249	2024	1778	1778
q8	3147	2802	2857	2802
q9	8180	8371	8156	8156
q10	3678	3660	3289	3289
q11	599	403	377	377
q12	679	701	522	522
q13	2741	3095	2407	2407
q14	279	285	270	270
q15	q16	676	686	624	624
q17	7781	7070	7023	7023
q18	13142	12279	13247	12279
q19	970	855	850	850
q20	2214	2174	1954	1954
q21	5955	4823	5047	4823
q22	511	448	404	404
Total cold run time: 74108 ms
Total hot run time: 67497 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 152897 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 785744e577ae64ae697746b84215132fd7e3a492, data reload: false

query5	4301	618	453	453
query6	417	217	189	189
query7	4797	434	227	227
query8	316	191	162	162
query9	8780	4026	4052	4026
query10	449	319	285	285
query11	5920	3432	3175	3175
query12	149	85	84	84
query13	1260	435	318	318
query14	6528	4801	4513	4513
query14_1	4304	4325	4267	4267
query15	211	205	181	181
query16	943	450	420	420
query17	859	653	549	549
query18	2435	422	319	319
query19	200	168	145	145
query20	82	81	80	80
query21	212	133	117	117
query22	12959	13060	12817	12817
query23	13177	12517	12236	12236
query23_1	12269	12361	12228	12228
query24	7150	828	467	467
query24_1	490	474	484	474
query25	542	422	362	362
query26	1264	259	140	140
query27	2759	441	279	279
query28	4619	1950	1923	1923
query29	1548	613	459	459
query30	294	221	185	185
query31	870	761	656	656
query32	163	96	90	90
query33	520	322	249	249
query34	1020	856	495	495
query35	749	769	675	675
query36	833	805	741	741
query37	133	103	95	95
query38	1798	1778	1705	1705
query39	713	720	677	677
query39_1	679	688	650	650
query40	227	118	95	95
query41	71	69	70	69
query42	94	125	84	84
query43	365	379	333	333
query44	1288	714	696	696
query45	183	180	161	161
query46	841	944	567	567
query47	3004	3034	2919	2919
query48	292	307	214	214
query49	577	398	276	276
query50	694	278	213	213
query51	10751	10489	10481	10481
query52	78	79	72	72
query53	188	206	153	153
query54	235	187	176	176
query55	73	69	64	64
query56	227	224	219	219
query57	1601	1590	1558	1558
query58	280	260	246	246
query59	2366	2392	2124	2124
query60	287	242	228	228
query61	151	149	139	139
query62	391	346	291	291
query63	197	160	168	160
query64	2770	921	778	778
query65	3429	3370	3408	3370
query66	1775	405	303	303
query67	20255	20221	20242	20221
query68	2966	994	616	616
query69	375	285	253	253
query70	915	845	851	845
query71	287	232	210	210
query72	2707	2613	2388	2388
query73	521	520	297	297
query74	4576	4500	4321	4321
query75	2329	2297	1954	1954
query76	2295	1025	615	615
query77	360	387	298	298
query78	9073	8984	8527	8527
query79	989	883	524	524
query80	538	421	339	339
query81	530	324	275	275
query82	580	139	108	108
query83	297	201	179	179
query84	307	124	104	104
query85	815	425	363	363
query86	314	240	232	232
query87	2022	1977	1863	1863
query88	3610	2716	2716	2716
query89	340	299	261	261
query90	1889	192	233	192
query91	163	156	126	126
query92	95	89	91	89
query93	990	982	574	574
query94	441	307	283	283
query95	603	342	389	342
query96	674	523	237	237
query97	2493	2431	2304	2304
query98	163	151	144	144
query99	773	762	640	640
Total cold run time: 234081 ms
Total hot run time: 152897 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.63 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 785744e577ae64ae697746b84215132fd7e3a492, data reload: false

query1	0.01	0.00	0.01
query2	0.10	0.04	0.05
query3	0.27	0.12	0.12
query4	1.60	0.13	0.12
query5	0.28	0.25	0.22
query6	1.17	0.69	0.69
query7	0.04	0.01	0.00
query8	0.05	0.04	0.04
query9	0.41	0.35	0.36
query10	0.58	0.58	0.57
query11	0.22	0.16	0.15
query12	0.19	0.16	0.15
query13	0.50	0.50	0.50
query14	0.98	0.98	0.97
query15	0.64	0.61	0.61
query16	0.36	0.38	0.36
query17	1.12	1.13	1.15
query18	0.25	0.22	0.22
query19	2.09	1.97	1.98
query20	0.02	0.02	0.01
query21	15.51	0.26	0.15
query22	4.51	0.06	0.05
query23	16.25	0.32	0.13
query24	3.05	0.67	0.41
query25	0.13	0.07	0.06
query26	1.47	0.24	0.14
query27	0.05	0.03	0.04
query28	1.97	0.61	0.41
query29	12.47	4.26	3.31
query30	0.28	0.14	0.16
query31	2.77	0.58	0.35
query32	3.22	0.62	0.51
query33	3.36	3.21	3.25
query34	15.49	4.06	3.41
query35	3.36	3.35	3.34
query36	0.55	0.44	0.43
query37	0.10	0.06	0.06
query38	0.05	0.04	0.04
query39	0.04	0.02	0.02
query40	0.17	0.14	0.14
query41	0.09	0.03	0.02
query42	0.04	0.02	0.02
query43	0.04	0.04	0.03
Total cold run time: 95.85 s
Total hot run time: 24.63 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 0.00% (0/140) 🎉
Increment coverage report
Complete coverage report

@CalvinKirs

Copy link
Copy Markdown
Member Author

run feut

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage `` 🎉
Increment coverage report
Complete coverage report

@CalvinKirs

Copy link
Copy Markdown
Member Author

/review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Static review completed for PR 67286 at exact head 785744e. The change meets its stated goal: authentication directory plugins may use a genuinely absent manifest declaration as documented legacy API 1.0, while explicit empty, malformed, or incompatible declarations remain rejected and other plugin families remain strict. The loader now distinguishes a readable manifest with an absent attribute from missing, unreadable, malformed, or unresolved defining-jar metadata; those failures become STAGE_API_VERSION failures and the runtime classloader is closed before the per-directory failure is recorded. Manifest provenance and the display-only version path were checked across all in-tree callers. The added unit coverage was inspected but not executed because this review is static-only. Concurrency, lifecycle/cleanup, compatibility, parallel family paths, error staging, observability, and focused user concerns (none supplied) were reviewed with no new defect found. Existing inline P2 comment 3922803703 is addressed by this head and is not reposted. Review converged after one round; no P0/P1 findings or remaining supported-path coverage gaps remain. Unsupported custom or special CodeSource loaders were considered but do not establish a finding for this PR.

Review converged after 1 round(s).

@CalvinKirs
CalvinKirs merged commit fb61aee into apache:master Oct 30, 2026
38 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

PR approved by anyone and no changes requested.

@github-actions github-actions Bot added the approved Indicates a PR has been approved by one committer. label Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR approved by at least one committer and no changes requested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by one committer. dev/5.0.x reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants