Skip to content

Commit

Permalink
AbsSeriesElem -> AbsPowerSeriesRingElem etc.
Browse files Browse the repository at this point in the history
  • Loading branch information
fingolfin committed Feb 23, 2023
1 parent 6b5578f commit 5241c1e
Show file tree
Hide file tree
Showing 36 changed files with 119 additions and 119 deletions.
2 changes: 1 addition & 1 deletion docs/src/developer/img/types.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions docs/src/developer/interfaces.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ for which one should usually prefer to write generic implementations.
* `MPolyRingElem{T}` : all multivariate polynomial types (see note below)
* `MatrixElem{T}` : union of all matrix types including matrix algebras
* `MatElem{T}` : all matrix types not including matrix algebras
* `AbsSeriesElem{T}` : all abstract series types
* `RelSeriesElem{T}` : all relative series types
* `AbsPowerSeriesRingElem{T}` : all abstract series types
* `RelPowerSeriesRingElem{T}` : all relative series types
* `LaurentSeriesElem{T}` : union of all Laurent series over rings and fields
* `PuiseuxSeriesElem{T}` : union of all Puiseux series over rings and fields
* `FPModule{T}` : all finitely presented modules over a Euclidean domain
Expand Down
4 changes: 2 additions & 2 deletions docs/src/developer/parents.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,8 @@ it is convenient to be able to construct a parent just as a user would. For
this purpose various light-weight and very safe parent constructors are
provided for use in library code.

For example there are the constructors `PolyRing`, `AbsSeriesRing` and
`RelSeriesRing`. These functions return the parent ring $R$ only and no
For example there are the constructors `PolyRing`, `AbsPowerSeriesRing` and
`RelPowerSeriesRing`. These functions return the parent ring $R$ only and no
generator (it can be obtained by calling `gen(R)`). They also set the
variable for printing to a default (usually `x`). Moreover, these parents
are not cached, so they are completely safe to use in library code. They
Expand Down
4 changes: 2 additions & 2 deletions docs/src/developer/topics.md
Original file line number Diff line number Diff line change
Expand Up @@ -456,8 +456,8 @@ to a parent constructor to avoid caching the parent object it creates. This
parameter normally has a default value of `true` and under normal circumstances
doesn't need to be supplied.

Note that special light-weight parent constructors, `PolyRing`, `AbsSeriesRing`,
`RelSeriesRing`, etc. are also provided which do not cache.
Note that special light-weight parent constructors, `PolyRing`, `AbsPowerSeriesRing`,
`RelPowerSeriesRing`, etc. are also provided which do not cache.

## Throw/nothrow for `check_parent`

Expand Down
12 changes: 6 additions & 6 deletions docs/src/series.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type information is mainly of concern to developers).

Base ring | Library | Element type | Parent type
--------------------------------------|--------------------|-----------------------|----------------------
Generic ring $R$ | AbstractAlgebra.jl | `Generic.RelSeries{T} | `Generic.RelSeriesRing{T}`
Generic ring $R$ | AbstractAlgebra.jl | `Generic.RelSeries{T} | `Generic.RelPowerSeriesRing{T}`
$\mathbb{Z}$ | Flint | `ZZRelPowerSeriesRingElem` | `ZZRelPowerSeriesRing`
$\mathbb{Z}/n\mathbb{Z}$ (small $n$) | Flint | `zzModRelPowerSeriesRingElem` | zzModRelPowerSeriesRing
$\mathbb{Z}/n\mathbb{Z}$ (large $n$) | Flint | `ZZModRelPowerSeriesRingElem` | `ZZModRelPowerSeriesRing`
Expand All @@ -34,8 +34,8 @@ $\mathbb{F}_p$ (large $n$) | Flint | `FpRelPowerSeriesRi
$\mathbb{F}_{p^n}$ (small $p$) | Flint | `fqPolyRepRelPowerSeriesRingElem` | `fqPolyRepRelPowerSeriesRing`
$\mathbb{F}_{p^n}$ (large $p$) | Flint | `FqPolyRepRelPowerSeriesRingElem` | `FqPolyRepRelPowerSeriesRing`

All relative power series elements belong to the abstract type `RelSeriesElem` and all
of the relative power series ring types belong to the abstract type `RelSeriesRing`.
All relative power series elements belong to the abstract type `RelPowerSeriesRingElem` and all
of the relative power series ring types belong to the abstract type `RelPowerSeriesRing`.

The maximum relative precision, the string representation of the variable and
the base ring $R$ of a generic power series are stored in its parent object.
Expand All @@ -44,7 +44,7 @@ Here is the corresponding table for the absolute power series types.

Base ring | Library | Element type | Parent type
--------------------------------------|--------------------|-----------------------|----------------------
Generic ring $R$ | AbstractAlgebra.jl | `Generic.AbsSeries{T}`| `Generic.AbsSeriesRing{T}`
Generic ring $R$ | AbstractAlgebra.jl | `Generic.AbsSeries{T}`| `Generic.AbsPowerSeriesRing{T}`
$\mathbb{Z}$ | Flint | `ZZAbsPowerSeriesRingElem` | `ZZAbsPowerSeriesRing`
$\mathbb{Z}/n\mathbb{Z}$ (small $n$) | Flint | `zzModAbsPowerSeriesRingElem` | `zzModAbsPowerSeriesRing`
$\mathbb{Z}/n\mathbb{Z}$ (large $n$) | Flint | `ZZModAbsPowerSeriesRingElem` | `ZZModAbsPowerSeriesRing`
Expand All @@ -54,8 +54,8 @@ $\mathbb{F}_p$ (large $n$) | Flint | `FpAbsPowerSeriesRi
$\mathbb{F}_{p^n}$ (small $n$) | Flint | `fqPolyRepAbsPowerSeriesRingElem` | `fqPolyRepAbsPowerSeriesRing`
$\mathbb{F}_{p^n}$ (large $n$) | Flint | `FqPolyRepAbsPowerSeriesRingElem` | `FqPolyRepAbsPowerSeriesRing`

All absolute power series elements belong to the abstract type `AbsSeriesElem` and all
of the absolute power series ring types belong to the abstract type `AbsSeriesRing`.
All absolute power series elements belong to the abstract type `AbsPowerSeriesRingElem` and all
of the absolute power series ring types belong to the abstract type `AbsPowerSeriesRing`.

The absolute precision, the string representation of the variable and
the base ring $R$ of a generic power series are stored in its parent object.
Expand Down
32 changes: 16 additions & 16 deletions src/ambiguities.jl
Original file line number Diff line number Diff line change
Expand Up @@ -59,37 +59,37 @@ evaluate(::PolyRingElem{ZZRingElem}, ::ZZRingElem) = nothing

==(::SeriesElem{ZZRingElem}, ::ZZRingElem) = nothing

*(::ZZRingElem, ::RelSeriesElem{ZZRingElem}) = nothing
*(::ZZRingElem, ::RelPowerSeriesRingElem{ZZRingElem}) = nothing

*(::RelSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
*(::RelPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

+(::ZZRingElem, ::RelSeriesElem{ZZRingElem}) = nothing
+(::ZZRingElem, ::RelPowerSeriesRingElem{ZZRingElem}) = nothing

+(::RelSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
+(::RelPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

-(::ZZRingElem, ::RelSeriesElem{ZZRingElem}) = nothing
-(::ZZRingElem, ::RelPowerSeriesRingElem{ZZRingElem}) = nothing

-(::RelSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
-(::RelPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

==(::ZZRingElem, ::RelSeriesElem{ZZRingElem}) = nothing
==(::ZZRingElem, ::RelPowerSeriesRingElem{ZZRingElem}) = nothing

==(::RelSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
==(::RelPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

*(::ZZRingElem, ::AbsSeriesElem{ZZRingElem}) = nothing
*(::ZZRingElem, ::AbsPowerSeriesRingElem{ZZRingElem}) = nothing

*(::AbsSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
*(::AbsPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

+(::ZZRingElem, ::AbsSeriesElem{ZZRingElem}) = nothing
+(::ZZRingElem, ::AbsPowerSeriesRingElem{ZZRingElem}) = nothing

+(::AbsSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
+(::AbsPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

-(::ZZRingElem, ::AbsSeriesElem{ZZRingElem}) = nothing
-(::ZZRingElem, ::AbsPowerSeriesRingElem{ZZRingElem}) = nothing

-(::AbsSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
-(::AbsPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

==(::ZZRingElem, ::AbsSeriesElem{ZZRingElem}) = nothing
==(::ZZRingElem, ::AbsPowerSeriesRingElem{ZZRingElem}) = nothing

==(::AbsSeriesElem{ZZRingElem}, ::ZZRingElem) = nothing
==(::AbsPowerSeriesRingElem{ZZRingElem}, ::ZZRingElem) = nothing

*(::ZZRingElem, ::MatElem{ZZRingElem}) = nothing

Expand Down
36 changes: 18 additions & 18 deletions src/flint/FlintTypes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2997,7 +2997,7 @@ end

const FmpzRelSeriesID = Dict{Tuple{Int, Symbol}, ZZRelPowerSeriesRing}()

mutable struct ZZRelPowerSeriesRingElem <: RelSeriesElem{ZZRingElem}
mutable struct ZZRelPowerSeriesRingElem <: RelPowerSeriesRingElem{ZZRingElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3063,7 +3063,7 @@ end

const FmpzAbsSeriesID = Dict{Tuple{Int, Symbol}, ZZAbsPowerSeriesRing}()

mutable struct ZZAbsPowerSeriesRingElem <: AbsSeriesElem{ZZRingElem}
mutable struct ZZAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{ZZRingElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3247,7 +3247,7 @@ end

const FmpqRelSeriesID = Dict{Tuple{Int, Symbol}, QQRelPowerSeriesRing}()

mutable struct QQRelPowerSeriesRingElem <: RelSeriesElem{QQFieldElem}
mutable struct QQRelPowerSeriesRingElem <: RelPowerSeriesRingElem{QQFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3314,7 +3314,7 @@ end

const FmpqAbsSeriesID = Dict{Tuple{Int, Symbol}, QQAbsPowerSeriesRing}()

mutable struct QQAbsPowerSeriesRingElem <: AbsSeriesElem{QQFieldElem}
mutable struct QQAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{QQFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3381,7 +3381,7 @@ end
const GFPRelSeriesID = Dict{Tuple{fpField, Int, Symbol},
fpRelPowerSeriesRing}()

mutable struct fpRelPowerSeriesRingElem <: RelSeriesElem{fpFieldElem}
mutable struct fpRelPowerSeriesRingElem <: RelPowerSeriesRingElem{fpFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3482,7 +3482,7 @@ end
const NmodRelSeriesID = Dict{Tuple{zzModRing, Int, Symbol},
zzModRelPowerSeriesRing}()

mutable struct zzModRelPowerSeriesRingElem <: RelSeriesElem{zzModRingElem}
mutable struct zzModRelPowerSeriesRingElem <: RelPowerSeriesRingElem{zzModRingElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3582,7 +3582,7 @@ end
const GFPFmpzRelSeriesID = Dict{Tuple{FpField, Int, Symbol},
FpRelPowerSeriesRing}()

mutable struct FpRelPowerSeriesRingElem <: RelSeriesElem{FpFieldElem}
mutable struct FpRelPowerSeriesRingElem <: RelPowerSeriesRingElem{FpFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3694,7 +3694,7 @@ end
const FmpzModRelSeriesID = Dict{Tuple{ZZModRing, Int, Symbol},
ZZModRelPowerSeriesRing}()

mutable struct ZZModRelPowerSeriesRingElem <: RelSeriesElem{ZZModRingElem}
mutable struct ZZModRelPowerSeriesRingElem <: RelPowerSeriesRingElem{ZZModRingElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3806,7 +3806,7 @@ end
const GFPFmpzAbsSeriesID = Dict{Tuple{FpField, Int, Symbol},
FpAbsPowerSeriesRing}()

mutable struct FpAbsPowerSeriesRingElem <: AbsSeriesElem{FpFieldElem}
mutable struct FpAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{FpFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -3915,7 +3915,7 @@ end
const NmodAbsSeriesID = Dict{Tuple{zzModRing, Int, Symbol},
zzModAbsPowerSeriesRing}()

mutable struct zzModAbsPowerSeriesRingElem <: AbsSeriesElem{zzModRingElem}
mutable struct zzModAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{zzModRingElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -4016,7 +4016,7 @@ end
const GFPAbsSeriesID = Dict{Tuple{fpField, Int, Symbol},
fpAbsPowerSeriesRing}()

mutable struct fpAbsPowerSeriesRingElem <: AbsSeriesElem{fpFieldElem}
mutable struct fpAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{fpFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -4115,7 +4115,7 @@ end
const FmpzModAbsSeriesID = Dict{Tuple{ZZModRing, Int, Symbol},
ZZModAbsPowerSeriesRing}()

mutable struct ZZModAbsPowerSeriesRingElem <: AbsSeriesElem{ZZModRingElem}
mutable struct ZZModAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{ZZModRingElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -4223,7 +4223,7 @@ end

const FqDefaultRelSeriesID = Dict{Tuple{FqField, Int, Symbol}, FqRelPowerSeriesRing}()

mutable struct FqRelPowerSeriesRingElem <: RelSeriesElem{FqFieldElem}
mutable struct FqRelPowerSeriesRingElem <: RelPowerSeriesRingElem{FqFieldElem}
# fq_default_poly_struct is 48 bytes on 64 bit machine
opaque::NTuple{48, Int8}
# end of flint struct
Expand Down Expand Up @@ -4294,7 +4294,7 @@ end

const FqRelSeriesID = Dict{Tuple{FqPolyRepField, Int, Symbol}, FqPolyRepRelPowerSeriesRing}()

mutable struct FqPolyRepRelPowerSeriesRingElem <: RelSeriesElem{FqPolyRepFieldElem}
mutable struct FqPolyRepRelPowerSeriesRingElem <: RelPowerSeriesRingElem{FqPolyRepFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -4363,7 +4363,7 @@ end

const FqDefaultAbsSeriesID = Dict{Tuple{FqField, Int, Symbol}, FqAbsPowerSeriesRing}()

mutable struct FqAbsPowerSeriesRingElem <: AbsSeriesElem{FqFieldElem}
mutable struct FqAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{FqFieldElem}
# fq_default_poly_struct is 48 bytes on 64 bit machine
opaque::NTuple{48, Int8}
# end of flint struct
Expand Down Expand Up @@ -4431,7 +4431,7 @@ end

const FqAbsSeriesID = Dict{Tuple{FqPolyRepField, Int, Symbol}, FqPolyRepAbsPowerSeriesRing}()

mutable struct FqPolyRepAbsPowerSeriesRingElem <: AbsSeriesElem{FqPolyRepFieldElem}
mutable struct FqPolyRepAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{FqPolyRepFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -4499,7 +4499,7 @@ end
const FqNmodRelSeriesID = Dict{Tuple{fqPolyRepField, Int, Symbol},
fqPolyRepRelPowerSeriesRing}()

mutable struct fqPolyRepRelPowerSeriesRingElem <: RelSeriesElem{fqPolyRepFieldElem}
mutable struct fqPolyRepRelPowerSeriesRingElem <: RelPowerSeriesRingElem{fqPolyRepFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down Expand Up @@ -4569,7 +4569,7 @@ end
const FqNmodAbsSeriesID = Dict{Tuple{fqPolyRepField, Int, Symbol},
fqPolyRepAbsPowerSeriesRing}()

mutable struct fqPolyRepAbsPowerSeriesRingElem <: AbsSeriesElem{fqPolyRepFieldElem}
mutable struct fqPolyRepAbsPowerSeriesRingElem <: AbsPowerSeriesRingElem{fqPolyRepFieldElem}
coeffs::Ptr{Nothing}
alloc::Int
length::Int
Expand Down
24 changes: 12 additions & 12 deletions src/flint/adhoc.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
###############################################################################

function *(a::ZZRingElem, b::AbsSeriesElem)
function *(a::ZZRingElem, b::AbsPowerSeriesRingElem)
len = length(b)
z = parent(b)()
fit!(z, len)
Expand All @@ -16,14 +16,14 @@ function *(a::ZZRingElem, b::AbsSeriesElem)
return z
end

*(a::AbsSeriesElem, b::ZZRingElem) = b*a
*(a::AbsPowerSeriesRingElem, b::ZZRingElem) = b*a

==(x::AbsSeriesElem, y::ZZRingElem) = precision(x) == 0 || ((length(x) == 0 && iszero(y))
==(x::AbsPowerSeriesRingElem, y::ZZRingElem) = precision(x) == 0 || ((length(x) == 0 && iszero(y))
|| (length(x) == 1 && coeff(x, 0) == y))

==(x::ZZRingElem, y::AbsSeriesElem) = y == x
==(x::ZZRingElem, y::AbsPowerSeriesRingElem) = y == x

function divexact(x::AbsSeriesElem, y::ZZRingElem; check::Bool=true)
function divexact(x::AbsPowerSeriesRingElem, y::ZZRingElem; check::Bool=true)
iszero(y) && throw(DivideError())
lenx = length(x)
z = parent(x)()
Expand All @@ -35,7 +35,7 @@ function divexact(x::AbsSeriesElem, y::ZZRingElem; check::Bool=true)
return z
end

function (a::Generic.AbsSeriesRing{T})(b::ZZRingElem) where {T <: RingElement}
function (a::Generic.AbsPowerSeriesRing{T})(b::ZZRingElem) where {T <: RingElement}
if iszero(b)
z = Generic.AbsSeries{T}(Array{T}(undef, 0), 0, a.prec_max)
else
Expand All @@ -51,7 +51,7 @@ end
#
###############################################################################

function *(a::ZZRingElem, b::RelSeriesElem)
function *(a::ZZRingElem, b::RelPowerSeriesRingElem)
len = pol_length(b)
z = parent(b)()
fit!(z, len)
Expand All @@ -65,15 +65,15 @@ function *(a::ZZRingElem, b::RelSeriesElem)
return z
end

*(a::RelSeriesElem, b::ZZRingElem) = b*a
*(a::RelPowerSeriesRingElem, b::ZZRingElem) = b*a

==(x::RelSeriesElem, y::ZZRingElem) = precision(x) == 0 ||
==(x::RelPowerSeriesRingElem, y::ZZRingElem) = precision(x) == 0 ||
((pol_length(x) == 0 && iszero(y)) || (pol_length(x) == 1 &&
valuation(x) == 0 && polcoeff(x, 0) == y))

==(x::ZZRingElem, y::RelSeriesElem) = y == x
==(x::ZZRingElem, y::RelPowerSeriesRingElem) = y == x

function divexact(x::RelSeriesElem, y::ZZRingElem; check::Bool=true)
function divexact(x::RelPowerSeriesRingElem, y::ZZRingElem; check::Bool=true)
iszero(y) && throw(DivideError())
lenx = pol_length(x)
z = parent(x)()
Expand All @@ -86,7 +86,7 @@ function divexact(x::RelSeriesElem, y::ZZRingElem; check::Bool=true)
return z
end

function (a::Generic.RelSeriesRing{T})(b::ZZRingElem) where {T <: RingElement}
function (a::Generic.RelPowerSeriesRing{T})(b::ZZRingElem) where {T <: RingElement}
if iszero(b)
z = Generic.RelSeries{T}(Array{T}(undef, 0), 0, a.prec_max, a.prec_max)
else
Expand Down
6 changes: 3 additions & 3 deletions src/flint/fmpq_abs_series.jl
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ characteristic(::QQAbsPowerSeriesRing) = 0
#
###############################################################################

function similar(f::AbsSeriesElem, R::QQField, max_prec::Int,
function similar(f::AbsPowerSeriesRingElem, R::QQField, max_prec::Int,
s::Symbol=var(parent(f)); cached::Bool=true)
z = QQAbsPowerSeriesRingElem()
if base_ring(f) === R && s == var(parent(f)) &&
Expand Down Expand Up @@ -907,10 +907,10 @@ function power_series_ring(R::QQField, prec::Int, s::AbstractString; model=:capp
return power_series_ring(R, prec, Symbol(s); model=model, cached=cached)
end

function AbsSeriesRing(R::QQField, prec::Int)
function AbsPowerSeriesRing(R::QQField, prec::Int)
return QQAbsPowerSeriesRing(prec, :x, false)
end

function RelSeriesRing(R::QQField, prec::Int)
function RelPowerSeriesRing(R::QQField, prec::Int)
return QQRelPowerSeriesRing(prec, :x, false)
end
2 changes: 1 addition & 1 deletion src/flint/fmpq_rel_series.jl
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ characteristic(::QQRelPowerSeriesRing) = 0
#
###############################################################################

function similar(f::RelSeriesElem, R::QQField, max_prec::Int,
function similar(f::RelPowerSeriesRingElem, R::QQField, max_prec::Int,
s::Symbol=var(parent(f)); cached::Bool=true)
z = QQRelPowerSeriesRingElem()
if base_ring(f) === R && s == var(parent(f)) &&
Expand Down
Loading

0 comments on commit 5241c1e

Please sign in to comment.