Commit Graph

3586 Commits

Author SHA1 Message Date
Kelsey Gilbert
aeeb1e199d Bug 1750310 - Centralize and reuse pixelstorei pack/unpack handling. r=lsalzman
* Accept that finding an explicit unpack for a given stride might fail.
* Directly use the logic from the GLES spec for unpacking stride calculations.
* Use structuredSrcSize member.
* Calc explicit unpack based on dstStride, not srcStride.

Differential Revision: https://phabricator.services.mozilla.com/D136052
2022-02-12 02:20:42 +00:00
Lee Salzman
5c61fe02e5 Bug 1754130 - Support presenting a WebGLFramebuffer to its own swap chain without opaque FB. r=aosmond,jgilbert
Most of the support for presenting a WebGLFramebuffer to a swap chain existed as part of the
mechanism for opaque WebXR framebuffer support. However, such "opaque" framebuffer are meant
to be opaque in the sense that their attachments can't be inspected or changed, which does
not provide the requisite level of control for efficiently implementing Canvas2D snapshots.

To this end, the existing Present mechanism is slightly extended to allow presenting to the
swap chain already present in WebGLFramebuffer without the existence of a corresponding
MozFramebuffer.

This also fixes a bug in that AsWebgl() was no longer being utilized in CanvasRenderer, such
that a new mechanism that routed GetFrontBuffer() was needed to fix the code rot.

There are also some efforts to remove a couple redundant copies I noticed in profiles along
the way.

Differential Revision: https://phabricator.services.mozilla.com/D138119
2022-02-11 19:49:56 +00:00
Lee Salzman
58cc63bda7 Bug 1754130 - Implement SourceSurfaceWebgl for faster snapshots of DrawTargetWebgl. r=aosmond
Now that each DrawTargetWebgl shares the same WebGL context, we can efficiently draw snapshots
of one DrawTargetWebgl to another without requiring any readback or error-prone driver-provided
shared context/resource mechanism. We just need to simply pass the WebGL texture from one target
to the other, and use it like any other texture.

This provides SourceSurfaceWebgl to store and pass along that WebGL texture. It is largely
modeled off of SourceSurfaceSkia in terms of its copy-on-write behavior. There are three
noteworthy state changes that it must track from DrawTargetWebgl - when the framebuffer
contents is changing, when the framebuffer is being destroyed, and when any cached texture
handle separate from a framebuffer is also being destroyed. It will copy, orphan, or read
back data as appropriate to handle each case.

If it needs to be mapped, it just forces a read back of the data into a CPU surface that
can be mapped as requested.

Differential Revision: https://phabricator.services.mozilla.com/D138118
2022-02-11 19:49:55 +00:00
Lee Salzman
8346a766e0 Bug 1754130 - Implement SharedContext for sharing WebGL state among many DrawTargetWebgls. r=aosmond
Within DrawTargetWebgl, this implements a SharedContext class to store both the WebGL context and
also related resources for drawing with it. Not a lot of new code has actually been added as this
was mostly accomplished by refactoring as much drawing code as possible that touched the WebGL
context to be moved into SharedContext, while leaving any code that was only dealing with Skia
software rasterization still within DrawTargetWebgl itself as well as individual framebuffer state
that is unique to each DrawTargetWebgl instance.

Before DrawTargetWebgl can use SharedContext to draw, it must use SetTarget to install its framebuffer
as the one that the WebGL context will draw to as well as to learn details about the viewport and
other per-framebuffer state. All of the high-level cache state that was previously on DrawTargetWebgl
has now moved into SharedContext, so that SharedContext can easily access this for drawing as well
as to provide for the goal of simplifying resource limiting.

Differential Revision: https://phabricator.services.mozilla.com/D138117
2022-02-11 19:49:55 +00:00
Marian-Vasile Laza
610558649b Backed out 3 changesets (bug 1754130) for causing mochitest failures. CLOSED TREE
Backed out changeset 7fea32057b92 (bug 1754130)
Backed out changeset 1ac8f10e0025 (bug 1754130)
Backed out changeset 3d56b847ddf9 (bug 1754130)
2022-02-11 18:30:11 +02:00
Lee Salzman
4fb52bf9bc Bug 1754130 - Support presenting a WebGLFramebuffer to its own swap chain without opaque FB. r=aosmond,jgilbert
Most of the support for presenting a WebGLFramebuffer to a swap chain existed as part of the
mechanism for opaque WebXR framebuffer support. However, such "opaque" framebuffer are meant
to be opaque in the sense that their attachments can't be inspected or changed, which does
not provide the requisite level of control for efficiently implementing Canvas2D snapshots.

To this end, the existing Present mechanism is slightly extended to allow presenting to the
swap chain already present in WebGLFramebuffer without the existence of a corresponding
MozFramebuffer.

This also fixes a bug in that AsWebgl() was no longer being utilized in CanvasRenderer, such
that a new mechanism that routed GetFrontBuffer() was needed to fix the code rot.

There are also some efforts to remove a couple redundant copies I noticed in profiles along
the way.

Differential Revision: https://phabricator.services.mozilla.com/D138119
2022-02-11 15:36:30 +00:00
Lee Salzman
8a34e8c65e Bug 1754130 - Implement SourceSurfaceWebgl for faster snapshots of DrawTargetWebgl. r=aosmond
Now that each DrawTargetWebgl shares the same WebGL context, we can efficiently draw snapshots
of one DrawTargetWebgl to another without requiring any readback or error-prone driver-provided
shared context/resource mechanism. We just need to simply pass the WebGL texture from one target
to the other, and use it like any other texture.

This provides SourceSurfaceWebgl to store and pass along that WebGL texture. It is largely
modeled off of SourceSurfaceSkia in terms of its copy-on-write behavior. There are three
noteworthy state changes that it must track from DrawTargetWebgl - when the framebuffer
contents is changing, when the framebuffer is being destroyed, and when any cached texture
handle separate from a framebuffer is also being destroyed. It will copy, orphan, or read
back data as appropriate to handle each case.

If it needs to be mapped, it just forces a read back of the data into a CPU surface that
can be mapped as requested.

Differential Revision: https://phabricator.services.mozilla.com/D138118
2022-02-11 15:36:30 +00:00
Lee Salzman
fc2d848bbe Bug 1754130 - Implement SharedContext for sharing WebGL state among many DrawTargetWebgls. r=aosmond
Within DrawTargetWebgl, this implements a SharedContext class to store both the WebGL context and
also related resources for drawing with it. Not a lot of new code has actually been added as this
was mostly accomplished by refactoring as much drawing code as possible that touched the WebGL
context to be moved into SharedContext, while leaving any code that was only dealing with Skia
software rasterization still within DrawTargetWebgl itself as well as individual framebuffer state
that is unique to each DrawTargetWebgl instance.

Before DrawTargetWebgl can use SharedContext to draw, it must use SetTarget to install its framebuffer
as the one that the WebGL context will draw to as well as to learn details about the viewport and
other per-framebuffer state. All of the high-level cache state that was previously on DrawTargetWebgl
has now moved into SharedContext, so that SharedContext can easily access this for drawing as well
as to provide for the goal of simplifying resource limiting.

Differential Revision: https://phabricator.services.mozilla.com/D138117
2022-02-11 15:36:29 +00:00
Sylvestre Ledru
98949ee751 Bug 1754767 - Remove duplicate includes r=media-playback-reviewers,padenot
Differential Revision: https://phabricator.services.mozilla.com/D138441
2022-02-11 10:01:15 +00:00
Nika Layzell
dabb46c84d Bug 1736371 - Default new actors to be refcounted, r=alwu,media-playback-reviewers,mccr8
The changes to ipdl actors were mechanical, and largely automated using
a script.

Differential Revision: https://phabricator.services.mozilla.com/D137237
2022-02-09 17:29:47 +00:00
Nika Layzell
9919099425 Bug 1738734 - Directly pass around handles rather than using TransportDescriptor, r=jld,media-playback-reviewers,alwu
This simplifies the logic around descriptors significantly, which is
especially useful considering how few places use the type. There is a
small change required on Windows to create the NamedPipe directly and
transfer around each end's handle, rather than connecting between
processes after the fact.

A named pipe has to be used, rather than an anonymous pipe, as
bidirectional communication is required.

Differential Revision: https://phabricator.services.mozilla.com/D130381
2022-02-08 23:53:45 +00:00
Jed Davis
8deabc42dd Bug 1753340 - Increase compositor stack size limit to deal with Mesa and OOP WebGL. r=jgilbert
Some versions of Mesa, including what we currently use on CI, need more
stack memory than what we currently provide on the compositor thread
order to pass the WebGL test suite in out-of-process mode.  This patch
increases the limit and re-enables the previously broken tests.

(Testing on Try found that the threshold was somewhere between 384k and
448k, but because this depends on a third-party library and content
controlled input, I'm giving it 512k so we have some safety margin.)

Differential Revision: https://phabricator.services.mozilla.com/D137787
2022-02-04 17:56:34 +00:00
Andrew Osmond
8347b9c975 Bug 1753657 - Make gCanvasAzureMemoryUsed atomic for OffscreenCanvas. r=gfx-reviewers,jrmuizel
This needs to be atomic since it can be updated by multiple threads.

Differential Revision: https://phabricator.services.mozilla.com/D137863
2022-02-04 14:42:00 +00:00
Andrew Osmond
c8f32ba43f Bug 1746750 - Part 4. Update test annotations for OffscreenCanvasRenderingContext2D. r=lsalzman
Differential Revision: https://phabricator.services.mozilla.com/D137214
2022-02-03 20:00:26 +00:00
Andrew Osmond
193a13db35 Bug 1746750 - Part 3. Implement partial OffscreenCanvasRenderingContext2D. r=lsalzman,webidl,smaug
This patch adds a partial OffscreenCanvasRenderingContext2D
implementation. It is missing anything text and UI related, including
CanvasFilters, CanvasUserInterface, CanvasText, CanvasTextDrawingStyles,
and CanvasHitRegions.

Differential Revision: https://phabricator.services.mozilla.com/D135354
2022-02-03 20:00:25 +00:00
Andrew Osmond
4d8e11ca77 Bug 1746750 - Part 2. Add new WebIDL method variants to support OffscreenCanvasRenderingContext2D. r=lsalzman
This patch is a non-functional change. It overloads some WebIDL methods
of CanvasRenderingContext2D to account for the difference between the
main thread and worker prototypes.

Differential Revision: https://phabricator.services.mozilla.com/D135353
2022-02-03 20:00:25 +00:00
Andrew Osmond
7e3355deb4 Bug 1746750 - Part 1. Refactoring to support OffscreenCanvasRenderingContext2D. r=lsalzman
This patch is a non-functional change which allows the shutdown observer
to be overridden (since workers have a different mechanism). It also
fixes a static counter to be atomic, and adds mOffscreenCanvas to the
cycle collection tracking.

Differential Revision: https://phabricator.services.mozilla.com/D135352
2022-02-03 20:00:24 +00:00
Kelsey Gilbert
2be1faceef Bug 1752167 - Use official name(js::Scalar::Type). r=jonco
Also mention one reason that Type might be MaxTypedArrayViewType, which
otherwise sounds like a pure sentinel.

Differential Revision: https://phabricator.services.mozilla.com/D137716
2022-02-03 19:23:22 +00:00
Iulian Moraru
39e3ddd037 Backed out 4 changesets (bug 1746750) as per request. CLOSED TREE
Backed out changeset bf79a6b72d87 (bug 1746750)
Backed out changeset 87dde3962558 (bug 1746750)
Backed out changeset 08e0ff1804f6 (bug 1746750)
Backed out changeset 4a3da2db3bc0 (bug 1746750)
2022-02-03 03:24:42 +02:00
Andrew Osmond
da4969ca5b Bug 1746750 - Part 4. Update test annotations for OffscreenCanvasRenderingContext2D. r=lsalzman
Differential Revision: https://phabricator.services.mozilla.com/D137214
2022-02-02 23:25:51 +00:00
Andrew Osmond
1c3016c525 Bug 1746750 - Part 3. Implement partial OffscreenCanvasRenderingContext2D. r=lsalzman,webidl,smaug
This patch adds a partial OffscreenCanvasRenderingContext2D
implementation. It is missing anything text and UI related, including
CanvasFilters, CanvasUserInterface, CanvasText, CanvasTextDrawingStyles,
and CanvasHitRegions.

Differential Revision: https://phabricator.services.mozilla.com/D135354
2022-02-02 23:25:51 +00:00
Andrew Osmond
c816b079d7 Bug 1746750 - Part 2. Add new WebIDL method variants to support OffscreenCanvasRenderingContext2D. r=lsalzman
This patch is a non-functional change. It overloads some WebIDL methods
of CanvasRenderingContext2D to account for the difference between the
main thread and worker prototypes.

Differential Revision: https://phabricator.services.mozilla.com/D135353
2022-02-02 23:25:50 +00:00
Andrew Osmond
1915c08c00 Bug 1746750 - Part 1. Refactoring to support OffscreenCanvasRenderingContext2D. r=lsalzman
This patch is a non-functional change which allows the shutdown observer
to be overridden (since workers have a different mechanism). It also
fixes a static counter to be atomic, and adds mOffscreenCanvas to the
cycle collection tracking.

Differential Revision: https://phabricator.services.mozilla.com/D135352
2022-02-02 23:25:50 +00:00
Jan-Ivar Bruaroey
952f7ff478 Bug 1752351 - Fix test to handle intermittent lack of outbound-rtp stats. r=ng
Differential Revision: https://phabricator.services.mozilla.com/D137697
2022-02-02 22:30:35 +00:00
Jan-Ivar Bruaroey
6a22d5ab9d Bug 1752351 - Skip test_capture_throttled.html on android which doesn't appear to reliably throttle rAF in background, at least not from window.open() of a new tab. r=mjf
Differential Revision: https://phabricator.services.mozilla.com/D137671
2022-02-02 22:30:34 +00:00
Andreas Pehrson
29c2042c1c Bug 1752351 - Test throttled frame capture with a slower TimerDriver. r=jib
Differential Revision: https://phabricator.services.mozilla.com/D137291
2022-02-02 22:30:32 +00:00
Andreas Pehrson
13fa64b511 Bug 1752351 - Improve the throttled capture mochitest. r=jib
Turned out the refresh driver was not at all throttled in the test. rAF was
throttled but these are not always in sync.

This patch changes the approach to causing throttling by being closer to a real
scenario -- put the tab in the background by opening another tab in the
foreground.

This also meant that the method by which we were measuring the captured frame
rate became moot (videoElement.mozPaintedFrames), as the frames are not
composited in the background, and the compositor is what reports painted frames.

This patch changes the frame counting approach to a local peer connection and
the outbound-rtp stats' framesEncoded member.

Differential Revision: https://phabricator.services.mozilla.com/D137290
2022-02-02 22:30:32 +00:00
Iulian Moraru
30f1186aa5 Backed out 4 changesets (bug 1746750) for causing mochitest webgl failures on test_2_conformance2__offscreencanvas__offscreencanvas-sync.html. CLOSED TREE
Backed out changeset 011f75653bfb (bug 1746750)
Backed out changeset 9c2aca08a507 (bug 1746750)
Backed out changeset cccf6afc3ce9 (bug 1746750)
Backed out changeset 36fedb339908 (bug 1746750)
2022-02-02 23:28:30 +02:00
Csoregi Natalia
17a1c33aea Backed out 7 changesets (bug 1752351) for failures on test_capture_throttled.html. CLOSED TREE
Backed out changeset 7d6d47f9429b (bug 1752351)
Backed out changeset 8f75bab2ab54 (bug 1752351)
Backed out changeset 0c171c3b5e27 (bug 1752351)
Backed out changeset 1694bfb744ee (bug 1752351)
Backed out changeset 801268f30e94 (bug 1752351)
Backed out changeset 861e5267cafc (bug 1752351)
Backed out changeset 34237ea4f82f (bug 1752351)
2022-02-02 22:15:04 +02:00
Jan-Ivar Bruaroey
0cff49de98 Bug 1752351 - Skip test_capture_throttled.html on android which doesn't appear to reliably throttle rAF in background, at least not from window.open() of a new tab. r=mjf
Differential Revision: https://phabricator.services.mozilla.com/D137671
2022-02-02 18:47:58 +00:00
Andreas Pehrson
e2fd9a1343 Bug 1752351 - Test throttled frame capture with a slower TimerDriver. r=jib
Differential Revision: https://phabricator.services.mozilla.com/D137291
2022-02-02 18:47:56 +00:00
Andreas Pehrson
405ce08244 Bug 1752351 - Improve the throttled capture mochitest. r=jib
Turned out the refresh driver was not at all throttled in the test. rAF was
throttled but these are not always in sync.

This patch changes the approach to causing throttling by being closer to a real
scenario -- put the tab in the background by opening another tab in the
foreground.

This also meant that the method by which we were measuring the captured frame
rate became moot (videoElement.mozPaintedFrames), as the frames are not
composited in the background, and the compositor is what reports painted frames.

This patch changes the frame counting approach to a local peer connection and
the outbound-rtp stats' framesEncoded member.

Differential Revision: https://phabricator.services.mozilla.com/D137290
2022-02-02 18:47:56 +00:00
Andrew Osmond
9c1604b27c Bug 1746750 - Part 4. Update test annotations for OffscreenCanvasRenderingContext2D. r=lsalzman
Differential Revision: https://phabricator.services.mozilla.com/D137214
2022-02-02 16:41:27 +00:00
Andrew Osmond
48f822060f Bug 1746750 - Part 3. Implement partial OffscreenCanvasRenderingContext2D. r=lsalzman,webidl,smaug
This patch adds a partial OffscreenCanvasRenderingContext2D
implementation. It is missing anything text and UI related, including
CanvasFilters, CanvasUserInterface, CanvasText, CanvasTextDrawingStyles,
and CanvasHitRegions.

Differential Revision: https://phabricator.services.mozilla.com/D135354
2022-02-02 16:41:26 +00:00
Andrew Osmond
94c44e84c9 Bug 1746750 - Part 2. Add new WebIDL method variants to support OffscreenCanvasRenderingContext2D. r=lsalzman
This patch is a non-functional change. It overloads some WebIDL methods
of CanvasRenderingContext2D to account for the difference between the
main thread and worker prototypes.

Differential Revision: https://phabricator.services.mozilla.com/D135353
2022-02-02 16:41:26 +00:00
Andrew Osmond
1e00358fd7 Bug 1746750 - Part 1. Refactoring to support OffscreenCanvasRenderingContext2D. r=lsalzman
This patch is a non-functional change which allows the shutdown observer
to be overridden (since workers have a different mechanism). It also
fixes a static counter to be atomic, and adds mOffscreenCanvas to the
cycle collection tracking.

Differential Revision: https://phabricator.services.mozilla.com/D135352
2022-02-02 16:41:26 +00:00
Andrew Osmond
88238b2eed Bug 1751205 - Part 2. Ensure we y-flip surfaces with OffscreenCanvas if needed. r=gfx-reviewers,jgilbert
On the path that we need to read the pixels from the canvas for display
purposes, instead of using a platform buffer handle, we need to take
into account the need to y-flip for WebGL. This patch ensures that we do
so.

Differential Revision: https://phabricator.services.mozilla.com/D136504
2022-02-01 13:20:50 +00:00
Sandor Molnar
6035b5cf95 Backed out changeset ba6624225635 (bug 1738734) for causing build bustages in ipc/PUtilityProcessParent. 2022-02-01 00:57:12 +02:00
Nika Layzell
c45d6350d4 Bug 1738734 - Directly pass around handles rather than using TransportDescriptor, r=jld,media-playback-reviewers,alwu
This simplifies the logic around descriptors significantly, which is
especially useful considering how few places use the type. There is a
small change required on Windows to create the NamedPipe directly and
transfer around each end's handle, rather than connecting between
processes after the fact.

A named pipe has to be used, rather than an anonymous pipe, as
bidirectional communication is required.

Differential Revision: https://phabricator.services.mozilla.com/D130381
2022-01-31 22:26:05 +00:00
Kelsey Gilbert
213f39f6e5 Bug 1749302 - Validate mode for webgl.hint(). r=gfx-reviewers,lsalzman
Differential Revision: https://phabricator.services.mozilla.com/D137378
2022-01-31 02:59:26 +00:00
Norisz Fay
beb556025c Backed out 2 changesets (bug 1751205) for causing multiple wpt failures on offscreencanvas.resize.html CLOSED TREE
Backed out changeset 70e5f13d08cc (bug 1751205)
Backed out changeset e97271d90795 (bug 1751205)
2022-01-28 09:14:15 +02:00
Andrew Osmond
162ffc6920 Bug 1751205 - Part 2. Ensure we y-flip surfaces with OffscreenCanvas if needed. r=gfx-reviewers,jgilbert
On the path that we need to read the pixels from the canvas for display
purposes, instead of using a platform buffer handle, we need to take
into account the need to y-flip for WebGL. This patch ensures that we do
so.

Differential Revision: https://phabricator.services.mozilla.com/D136504
2022-01-28 05:16:02 +00:00
Butkovits Atila
c26eab5ff1 Backed out 2 changesets (bug 1751205) for causing failures at webgl-color-offscreen-test.html. CLOSED TREE
Backed out changeset 211ffc98eb32 (bug 1751205)
Backed out changeset 2a1e5a439a3b (bug 1751205)
2022-01-28 03:11:14 +02:00
Andrew Osmond
36a69b3a0d Bug 1744172 - Fix a crash in ClientWebGLContext::DeleteQuery. r=jgilbert
When DeleteQuery is called, it uses mTarget to determine whether or not
BeginQuery has been called. This is an insufficient condition because
QueryCounter also sets mTarget without calling BeginQuery and occupying
a slot in current query map. This patch fixes the crash by checking if
the slot is empty first.

Differential Revision: https://phabricator.services.mozilla.com/D137070
2022-01-27 16:49:19 +00:00
Andrew Osmond
50109bb823 Bug 1751915 - Ensure WebGLRenderingContext texImage/etc support OffscreenCanvas as a source. r=jgilbert,webidl,smaug
This patch adds OffscreenCanvas as a texture source for texImage2D,
texSubImage2D and texSubImage2D. This applies to both
WebGLRenderingContext and WebGL2RenderingContext. This was causing
several test failures in the WebGL conformance suite with
OffscreenCanvas.

Differential Revision: https://phabricator.services.mozilla.com/D136924
2022-01-27 15:38:02 +00:00
Andrew Osmond
b887b0e78c Bug 1751205 - Part 2. Ensure we y-flip surfaces with OffscreenCanvas if needed. r=gfx-reviewers,jgilbert
On the path that we need to read the pixels from the canvas for display
purposes, instead of using a platform buffer handle, we need to take
into account the need to y-flip for WebGL. This patch ensures that we do
so.

Differential Revision: https://phabricator.services.mozilla.com/D136504
2022-01-27 15:17:43 +00:00
Kelsey Gilbert
5fdc06d164 Bug 1748271 - Make switch exhaustive so we don't assert. r=gfx-reviewers,aosmond
Differential Revision: https://phabricator.services.mozilla.com/D136835
2022-01-25 04:46:25 +00:00
Andrew Osmond
6939c74a85 Bug 1749323 - Allow controlling access to OffscreenCanvas via a domain allowlist pref. r=gfx-reviewers,webidl,lsalzman,smaug
This patch adds several new prefs to control what happens with
OffscreenCanvas. gfx.offscreencanvas.enabled works as it did before.

- gfx.offscreencanvas.domain-enabled: Enables OffscreenCanvas for
domains on the allowlist.

- gfx.offscreencanvas.domain-allowlist: Comma separated allowlist
which controls which domains can access the OffscreenCanvas constructor
and HTMLCanvasElement.transferControlToOffscreen.

- dom.workers.requestAnimation: Controls whether or not
request/cancelAnimationFrame are accessible from dedicated workers.
Ideally this would have used the same decision process as
OffscreenCanvas but there were unrelated build/runtime issues around
using a Func directive with DedicatedWorkerGlobalScope.

Differential Revision: https://phabricator.services.mozilla.com/D135928
2022-01-24 16:12:02 +00:00
Lee Salzman
f0f28a2a42 Bug 1751603 - Fix inverted path comparison in PathCacheEntry::MatchesPath. r=aosmond
The intention of the if-clause in MatchesPath was was to early-out with false if
the path geometry doesn't actually match as an artifact of how earlier versions of
this code was written. Due to an accidental typo, the path comparison for this case
got inverted. This fixes that by just cleaning up the inverted mess to be easier to
read in the first place.

Differential Revision: https://phabricator.services.mozilla.com/D136694
2022-01-24 15:52:25 +00:00
Andreas Pehrson
077549e08e Bug 1344524 - Change ContextCleanForFrameCapture flag to a Watchable FrameCaptureState. r=jgilbert
This allows the canvas element to be notified when a draw that would trigger
a captureStream-frame to be captured.

Differential Revision: https://phabricator.services.mozilla.com/D136003
2022-01-24 15:31:14 +00:00