mirror of
https://src.fedoraproject.org/rpms/sagemath.git
synced 2025-04-22 11:45:56 -04:00
Version 9.7
Drop upstreamed patches: -infinite-recursion, -use-after-free, -sphinx
This commit is contained in:
parent
fed038c815
commit
bf7a318833
17 changed files with 532 additions and 1033 deletions
|
@ -1,6 +1,6 @@
|
|||
diff -up src/doc/en/thematic_tutorials/lie/weyl_groups.rst.orig src/doc/en/thematic_tutorials/lie/weyl_groups.rst
|
||||
--- src/doc/en/thematic_tutorials/lie/weyl_groups.rst.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/doc/en/thematic_tutorials/lie/weyl_groups.rst 2022-09-14 15:23:59.397522485 -0600
|
||||
--- src/doc/en/thematic_tutorials/lie/weyl_groups.rst.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/doc/en/thematic_tutorials/lie/weyl_groups.rst 2023-01-15 17:13:38.581179558 -0700
|
||||
@@ -139,12 +139,12 @@ string, which you can print::
|
||||
X.1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
X.2 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 1
|
||||
|
@ -20,22 +20,10 @@ diff -up src/doc/en/thematic_tutorials/lie/weyl_groups.rst.orig src/doc/en/thema
|
|||
X.10 4 -2 . -1 . . . 2 . . 1 . -4
|
||||
X.11 4 2 . -1 . . . -2 . . 1 . -4
|
||||
X.12 6 . -2 . . -2 -2 . . . . 2 6
|
||||
diff -up src/sage/coding/codecan/autgroup_can_label.pyx.orig src/sage/coding/codecan/autgroup_can_label.pyx
|
||||
--- src/sage/coding/codecan/autgroup_can_label.pyx.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/coding/codecan/autgroup_can_label.pyx 2022-09-14 15:25:12.653773783 -0600
|
||||
@@ -76,7 +76,7 @@ columns do share the same coloring::
|
||||
[[1],
|
||||
[2],
|
||||
[3, 5, 4],
|
||||
- [6, 19, 16, 9, 21, 10, 8, 15, 14, 11, 20, 13, 12, 7, 17, 18]]
|
||||
+ [6, 19, 16, 21, 9, 10, 15, 8, 20, 11, 14, 13, 7, 12, 18, 17]]
|
||||
|
||||
We can also restrict the group action to linear isometries::
|
||||
|
||||
diff -up src/sage/coding/linear_code.py.orig src/sage/coding/linear_code.py
|
||||
--- src/sage/coding/linear_code.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/coding/linear_code.py 2022-09-14 15:30:11.231797910 -0600
|
||||
@@ -465,7 +465,10 @@ class AbstractLinearCode(AbstractLinearC
|
||||
--- src/sage/coding/linear_code.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/coding/linear_code.py 2023-01-15 17:13:38.582179539 -0700
|
||||
@@ -466,7 +466,10 @@ class AbstractLinearCode(AbstractLinearC
|
||||
0
|
||||
sage: C = codes.HammingCode(GF(4, 'z'), 3)
|
||||
sage: C.automorphism_group_gens()
|
||||
|
@ -47,7 +35,7 @@ diff -up src/sage/coding/linear_code.py.orig src/sage/coding/linear_code.py
|
|||
Defn: z |--> z + 1),
|
||||
((z + 1, 1, 1, z, z + 1, z, z, z + 1, z + 1, z + 1, 1, z + 1, z, z, 1, z + 1, 1, z, z + 1, z + 1, z); (1,18,6,19,2,9,17,10,13,14,21,11,4,5,12)(3,20,7,16,8), Ring endomorphism of Finite Field in z of size 2^2
|
||||
Defn: z |--> z),
|
||||
@@ -473,19 +476,20 @@ class AbstractLinearCode(AbstractLinearC
|
||||
@@ -474,19 +477,20 @@ class AbstractLinearCode(AbstractLinearC
|
||||
Defn: z |--> z)],
|
||||
362880)
|
||||
sage: C.automorphism_group_gens(equivalence="linear")
|
||||
|
@ -73,7 +61,7 @@ diff -up src/sage/coding/linear_code.py.orig src/sage/coding/linear_code.py
|
|||
Defn: z |--> z),
|
||||
((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); (2,13)(3,14)(4,20)(5,11)(8,18)(9,19)(10,15)(16,21), Ring endomorphism of Finite Field in z of size 2^2
|
||||
Defn: z |--> z)],
|
||||
@@ -691,10 +695,10 @@ class AbstractLinearCode(AbstractLinearC
|
||||
@@ -692,10 +696,10 @@ class AbstractLinearCode(AbstractLinearC
|
||||
sage: C_iso == aut_group_can_label.get_canonical_form()
|
||||
True
|
||||
sage: aut_group_can_label.get_autom_gens()
|
||||
|
@ -88,8 +76,8 @@ diff -up src/sage/coding/linear_code.py.orig src/sage/coding/linear_code.py
|
|||
Defn: z |--> z)]
|
||||
"""
|
||||
diff -up src/sage/combinat/root_system/hecke_algebra_representation.py.orig src/sage/combinat/root_system/hecke_algebra_representation.py
|
||||
--- src/sage/combinat/root_system/hecke_algebra_representation.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/combinat/root_system/hecke_algebra_representation.py 2022-09-14 15:30:46.462918766 -0600
|
||||
--- src/sage/combinat/root_system/hecke_algebra_representation.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/combinat/root_system/hecke_algebra_representation.py 2023-01-15 17:13:38.583179521 -0700
|
||||
@@ -355,7 +355,7 @@ class HeckeAlgebraRepresentation(WithEqu
|
||||
sage: q1, q2 = K.gens()
|
||||
sage: KW = W.algebra(K)
|
||||
|
@ -100,8 +88,8 @@ diff -up src/sage/combinat/root_system/hecke_algebra_representation.py.orig src/
|
|||
sage: T = KW.demazure_lusztig_operators(q1,q2)
|
||||
sage: T12 = T.Tw( (1,2) )
|
||||
diff -up src/sage/combinat/symmetric_group_algebra.py.orig src/sage/combinat/symmetric_group_algebra.py
|
||||
--- src/sage/combinat/symmetric_group_algebra.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/combinat/symmetric_group_algebra.py 2022-09-14 15:35:42.552934349 -0600
|
||||
--- src/sage/combinat/symmetric_group_algebra.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/combinat/symmetric_group_algebra.py 2023-01-15 17:13:38.583179521 -0700
|
||||
@@ -101,7 +101,7 @@ def SymmetricGroupAlgebra(R, W, category
|
||||
sage: SGA.group()
|
||||
Weyl Group of type ['A', 3] (as a matrix group acting on the ambient space)
|
||||
|
@ -112,8 +100,8 @@ diff -up src/sage/combinat/symmetric_group_algebra.py.orig src/sage/combinat/sym
|
|||
The preferred way to construct the symmetric group algebra is to
|
||||
go through the usual ``algebra`` method::
|
||||
diff -up src/sage/groups/abelian_gps/abelian_group_gap.py.orig src/sage/groups/abelian_gps/abelian_group_gap.py
|
||||
--- src/sage/groups/abelian_gps/abelian_group_gap.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/groups/abelian_gps/abelian_group_gap.py 2022-09-14 15:23:05.702338312 -0600
|
||||
--- src/sage/groups/abelian_gps/abelian_group_gap.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/groups/abelian_gps/abelian_group_gap.py 2023-01-15 17:13:38.583179521 -0700
|
||||
@@ -338,7 +338,7 @@ class AbelianGroup_gap(UniqueRepresentat
|
||||
if isinstance(x, AbelianGroupElement_gap):
|
||||
try:
|
||||
|
@ -133,10 +121,10 @@ diff -up src/sage/groups/abelian_gps/abelian_group_gap.py.orig src/sage/groups/a
|
|||
return Hom(phi)
|
||||
|
||||
diff -up src/sage/groups/finitely_presented.py.orig src/sage/groups/finitely_presented.py
|
||||
--- src/sage/groups/finitely_presented.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/groups/finitely_presented.py 2022-09-14 15:36:48.057159029 -0600
|
||||
@@ -596,9 +596,9 @@ class RewritingSystem(object):
|
||||
sage: k=G.rewriting_system()
|
||||
--- src/sage/groups/finitely_presented.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/groups/finitely_presented.py 2023-01-15 17:13:38.584179501 -0700
|
||||
@@ -596,9 +596,9 @@ class RewritingSystem():
|
||||
sage: k = G.rewriting_system()
|
||||
sage: k.gap()
|
||||
Knuth Bendix Rewriting System for Monoid( [ a, A, b, B ] ) with rules
|
||||
- [ [ a^2, <identity ...> ], [ a*A, <identity ...> ],
|
||||
|
@ -149,8 +137,8 @@ diff -up src/sage/groups/finitely_presented.py.orig src/sage/groups/finitely_pre
|
|||
return self._gap
|
||||
|
||||
diff -up src/sage/groups/fqf_orthogonal.py.orig src/sage/groups/fqf_orthogonal.py
|
||||
--- src/sage/groups/fqf_orthogonal.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/groups/fqf_orthogonal.py 2022-09-14 15:37:12.377242440 -0600
|
||||
--- src/sage/groups/fqf_orthogonal.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/groups/fqf_orthogonal.py 2023-01-15 17:13:38.584179501 -0700
|
||||
@@ -143,7 +143,7 @@ class FqfOrthogonalGroup(AbelianGroupAut
|
||||
[2/3 0 0]
|
||||
[ 0 2/3 0]
|
||||
|
@ -161,8 +149,8 @@ diff -up src/sage/groups/fqf_orthogonal.py.orig src/sage/groups/fqf_orthogonal.p
|
|||
sage: T = TorsionQuadraticForm(q)
|
||||
sage: T.orthogonal_group().order()
|
||||
diff -up src/sage/groups/libgap_wrapper.pyx.orig src/sage/groups/libgap_wrapper.pyx
|
||||
--- src/sage/groups/libgap_wrapper.pyx.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/groups/libgap_wrapper.pyx 2022-09-14 15:37:50.457373037 -0600
|
||||
--- src/sage/groups/libgap_wrapper.pyx.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/groups/libgap_wrapper.pyx 2023-01-15 17:13:38.584179501 -0700
|
||||
@@ -25,7 +25,7 @@ Note how we call the constructor of both
|
||||
its output via LibGAP::
|
||||
|
||||
|
@ -191,8 +179,8 @@ diff -up src/sage/groups/libgap_wrapper.pyx.orig src/sage/groups/libgap_wrapper.
|
|||
(f1,)
|
||||
"""
|
||||
diff -up src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx.orig src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx
|
||||
--- src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx 2022-09-14 15:39:54.849811749 -0600
|
||||
--- src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx 2023-01-15 17:13:38.584179501 -0700
|
||||
@@ -427,7 +427,7 @@ cdef class LabelledBranching:
|
||||
sage: from sage.groups.perm_gps.partn_ref2.refinement_generic import LabelledBranching
|
||||
sage: L = LabelledBranching(3)
|
||||
|
@ -203,10 +191,10 @@ diff -up src/sage/groups/perm_gps/partn_ref2/refinement_generic.pyx.orig src/sag
|
|||
sage: L.small_generating_set()
|
||||
[(1,2,3)]
|
||||
diff -up src/sage/groups/perm_gps/permgroup.py.orig src/sage/groups/perm_gps/permgroup.py
|
||||
--- src/sage/groups/perm_gps/permgroup.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/groups/perm_gps/permgroup.py 2022-09-14 16:03:50.495931767 -0600
|
||||
@@ -875,7 +875,7 @@ class PermutationGroup_generic(FiniteGro
|
||||
sage: f=PG._coerce_map_from_(MG)
|
||||
--- src/sage/groups/perm_gps/permgroup.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/groups/perm_gps/permgroup.py 2023-01-15 17:13:38.585179483 -0700
|
||||
@@ -927,7 +927,7 @@ class PermutationGroup_generic(FiniteGro
|
||||
sage: f = PG._coerce_map_from_(MG)
|
||||
sage: mg = MG.an_element()
|
||||
sage: p = f(mg); p
|
||||
- (2,33,32,23,31,55)(3,49,38,44,40,28)(4,17,59,62,58,46)(5,21,47,20,43,8)(6,53,50)(7,37,12,57,14,29)(9,41,56,34,64,10)(11,25,19)(13,61,26,51,22,15)(16,45,36)(18,27,35,48,52,54)(24,63,42)(30,39,60)
|
||||
|
@ -214,7 +202,7 @@ diff -up src/sage/groups/perm_gps/permgroup.py.orig src/sage/groups/perm_gps/per
|
|||
sage: PG(p._gap_()) == p
|
||||
True
|
||||
|
||||
@@ -921,12 +921,12 @@ class PermutationGroup_generic(FiniteGro
|
||||
@@ -973,12 +973,12 @@ class PermutationGroup_generic(FiniteGro
|
||||
sage: P = G.as_permutation_group(algorithm='smaller', seed=5)
|
||||
sage: P1 = G.as_permutation_group()
|
||||
sage: P == P1
|
||||
|
@ -230,7 +218,7 @@ diff -up src/sage/groups/perm_gps/permgroup.py.orig src/sage/groups/perm_gps/per
|
|||
|
||||
Another check for :trac:`5583`::
|
||||
|
||||
@@ -4291,7 +4291,7 @@ class PermutationGroup_generic(FiniteGro
|
||||
@@ -4375,7 +4375,7 @@ class PermutationGroup_generic(FiniteGro
|
||||
|
||||
sage: G = PermutationGroup([[(1,2,3,4,5)],[(1,2)]]) #S_5 on [1..5]
|
||||
sage: G.is_transitive([1,4,5])
|
||||
|
@ -239,7 +227,7 @@ diff -up src/sage/groups/perm_gps/permgroup.py.orig src/sage/groups/perm_gps/per
|
|||
sage: G.is_transitive([2..6])
|
||||
False
|
||||
sage: G.is_transitive(G.non_fixed_points())
|
||||
@@ -4355,7 +4355,7 @@ class PermutationGroup_generic(FiniteGro
|
||||
@@ -4440,7 +4440,7 @@ class PermutationGroup_generic(FiniteGro
|
||||
sage: G.is_primitive([1..4])
|
||||
False
|
||||
sage: G.is_primitive([1,2,3])
|
||||
|
@ -249,9 +237,9 @@ diff -up src/sage/groups/perm_gps/permgroup.py.orig src/sage/groups/perm_gps/per
|
|||
sage: G.is_primitive(G.non_fixed_points())
|
||||
True
|
||||
diff -up src/sage/interfaces/gap.py.orig src/sage/interfaces/gap.py
|
||||
--- src/sage/interfaces/gap.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/interfaces/gap.py 2022-09-14 15:21:29.734019419 -0600
|
||||
@@ -1490,6 +1490,8 @@ def gap_reset_workspace(max_workspace_si
|
||||
--- src/sage/interfaces/gap.py.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/interfaces/gap.py 2023-01-15 17:13:38.586179464 -0700
|
||||
@@ -1512,6 +1512,8 @@ def gap_reset_workspace(max_workspace_si
|
||||
"""
|
||||
# Create new workspace with filename WORKSPACE
|
||||
g = Gap(use_workspace_cache=False, max_workspace_size=None)
|
||||
|
@ -261,8 +249,8 @@ diff -up src/sage/interfaces/gap.py.orig src/sage/interfaces/gap.py
|
|||
from sage.tests.gap_packages import all_installed_packages
|
||||
for pkg in all_installed_packages(gap=g):
|
||||
diff -up src/sage/libs/gap/element.pxd.orig src/sage/libs/gap/element.pxd
|
||||
--- src/sage/libs/gap/element.pxd.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/libs/gap/element.pxd 2022-09-27 18:35:39.449724078 -0600
|
||||
--- src/sage/libs/gap/element.pxd.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/libs/gap/element.pxd 2023-01-15 17:13:38.586179464 -0700
|
||||
@@ -29,9 +29,9 @@ cdef GapElement_Boolean make_GapElement_
|
||||
cdef GapElement_Function make_GapElement_Function(parent, Obj obj)
|
||||
cdef GapElement_Permutation make_GapElement_Permutation(parent, Obj obj)
|
||||
|
@ -277,8 +265,8 @@ diff -up src/sage/libs/gap/element.pxd.orig src/sage/libs/gap/element.pxd
|
|||
|
||||
cdef class GapElement(RingElement):
|
||||
diff -up src/sage/libs/gap/element.pyx.orig src/sage/libs/gap/element.pyx
|
||||
--- src/sage/libs/gap/element.pyx.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/libs/gap/element.pyx 2022-09-27 18:46:41.755240259 -0600
|
||||
--- src/sage/libs/gap/element.pyx.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/libs/gap/element.pyx 2023-01-15 17:13:38.586179464 -0700
|
||||
@@ -120,7 +120,7 @@ cdef Obj make_gap_matrix(sage_list, gap_
|
||||
return l.value
|
||||
|
||||
|
@ -477,8 +465,8 @@ diff -up src/sage/libs/gap/element.pyx.orig src/sage/libs/gap/element.pyx
|
|||
|
||||
if isinstance(i, tuple):
|
||||
diff -up src/sage/libs/gap/gap_includes.pxd.orig src/sage/libs/gap/gap_includes.pxd
|
||||
--- src/sage/libs/gap/gap_includes.pxd.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/libs/gap/gap_includes.pxd 2022-09-14 15:19:47.996693822 -0600
|
||||
--- src/sage/libs/gap/gap_includes.pxd.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/libs/gap/gap_includes.pxd 2023-01-15 17:13:38.587179445 -0700
|
||||
@@ -13,8 +13,8 @@ from libc.stdint cimport uintptr_t, uint
|
||||
|
||||
cdef extern from "gap/system.h" nogil:
|
||||
|
@ -609,9 +597,9 @@ diff -up src/sage/libs/gap/gap_includes.pxd.orig src/sage/libs/gap/gap_includes.
|
|||
+ Obj NEW_STRING(Int len)
|
||||
+ Obj MakeStringWithLen(const char *buf, size_t len)
|
||||
diff -up src/sage/libs/gap/libgap.pyx.orig src/sage/libs/gap/libgap.pyx
|
||||
--- src/sage/libs/gap/libgap.pyx.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/libs/gap/libgap.pyx 2022-09-14 15:43:04.473558811 -0600
|
||||
@@ -691,7 +691,7 @@ class Gap(Parent):
|
||||
--- src/sage/libs/gap/libgap.pyx.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/libs/gap/libgap.pyx 2023-01-15 17:13:38.587179445 -0700
|
||||
@@ -695,7 +695,7 @@ class Gap(Parent):
|
||||
sage: libgap.List
|
||||
<Gap function "List">
|
||||
sage: libgap.GlobalRandomSource
|
||||
|
@ -621,9 +609,9 @@ diff -up src/sage/libs/gap/libgap.pyx.orig src/sage/libs/gap/libgap.pyx
|
|||
if name in dir(self.__class__):
|
||||
return getattr(self.__class__, name)
|
||||
diff -up src/sage/libs/gap/util.pyx.orig src/sage/libs/gap/util.pyx
|
||||
--- src/sage/libs/gap/util.pyx.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/libs/gap/util.pyx 2022-09-14 16:00:31.367311730 -0600
|
||||
@@ -353,15 +353,9 @@ cdef Obj gap_eval(str gap_string) except
|
||||
--- src/sage/libs/gap/util.pyx.orig 2022-09-19 16:38:18.000000000 -0600
|
||||
+++ src/sage/libs/gap/util.pyx 2023-01-15 17:13:38.587179445 -0700
|
||||
@@ -362,15 +362,9 @@ cdef Obj gap_eval(str gap_string) except
|
||||
GAPError: Error, Variable: 'Complex' must have a value
|
||||
Syntax error: ; expected in stream:1
|
||||
Complex Field with 53 bits of precision;;
|
||||
|
@ -640,7 +628,7 @@ diff -up src/sage/libs/gap/util.pyx.orig src/sage/libs/gap/util.pyx
|
|||
Error, Variable: 'precision' must have a value
|
||||
|
||||
Test that on a subsequent attempt we get the same message (no garbage was
|
||||
@@ -379,7 +373,7 @@ cdef Obj gap_eval(str gap_string) except
|
||||
@@ -388,7 +382,7 @@ cdef Obj gap_eval(str gap_string) except
|
||||
"""
|
||||
initialize()
|
||||
cdef Obj result
|
||||
|
@ -650,8 +638,8 @@ diff -up src/sage/libs/gap/util.pyx.orig src/sage/libs/gap/util.pyx
|
|||
# Careful: We need to keep a reference to the bytes object here
|
||||
# so that Cython doesn't deallocate it before GAP is done with
|
||||
diff -up src/sage/tests/gap_packages.py.orig src/sage/tests/gap_packages.py
|
||||
--- src/sage/tests/gap_packages.py.orig 2022-05-15 16:11:11.000000000 -0600
|
||||
+++ src/sage/tests/gap_packages.py 2022-09-14 16:00:53.429380443 -0600
|
||||
--- src/sage/tests/gap_packages.py.orig 2022-09-19 16:38:19.000000000 -0600
|
||||
+++ src/sage/tests/gap_packages.py 2023-01-15 17:13:38.587179445 -0700
|
||||
@@ -103,7 +103,7 @@ def all_installed_packages(ignore_dot_ga
|
||||
|
||||
sage: from sage.tests.gap_packages import all_installed_packages
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue