Job-Planning: implement handling of deadlines for prerequisites

...simple implementation
...decide *not* to cache the deadlines for now (possibly quadratic!)
...Test GREEN
This commit is contained in:
Fischlurch 2023-06-19 18:28:01 +02:00
parent b8309e5565
commit 848bb6fb86
4 changed files with 73 additions and 87 deletions

View file

@ -56,8 +56,6 @@
** the stack level above). See the [IterExplorer unit test](\ref lib::IterTreeExplorer_test::verify_expandOperation)
** to understand this recursive on-demand processing in greater detail.
**
** @warning as of 4/2023 a complete rework of the Dispatcher is underway ///////////////////////////////////////////TICKET #1275
**
** @see JobPlanning_test
** @see JobTicket
** @see Dispatcher
@ -78,7 +76,6 @@
#include "lib/time/timevalue.hpp"
#include "lib/itertools.hpp"
#include "lib/nocopy.hpp"
#include "lib/util.hpp"
@ -91,8 +88,6 @@ namespace engine {
using play::Timings;
using lib::time::Time;
using lib::time::Duration;
using util::unConst;
using util::isnil;
@ -108,8 +103,6 @@ namespace engine {
* persisted (other then in the job to be created). The implementation draws
* on a recursive exploration of the corresponding JobTicket, which acts as
* a general blueprint for creating jobs within this segment of the timeline.
*
* @todo WIP-WIP 6/2023 reworking the job-planning pipeline for »PlaybackVerticalSlice«
*/
class JobPlanning
: util::MoveOnly
@ -159,8 +152,7 @@ namespace engine {
return Time::ANYTIME;
case play::TIMEBOUND:
return timings.getTimeDue(frameNr_)
- totalLatency(timings);
return doCalcDeadline (timings);
}
NOTREACHED ("unexpected playbackUrgency");
}
@ -229,6 +221,14 @@ namespace engine {
+ timings.outputLatency;
}
Time
doCalcDeadline(Timings const& timings)
{
Time anchor = isTopLevel()? timings.getTimeDue(frameNr_)
: dependentPlan_->determineDeadline (timings); ////////////////////TICKET #1310 : quadratic in the depth of the dependency chain
return anchor
- totalLatency(timings);
}
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1301 : likely to become obsolete

View file

@ -49,11 +49,14 @@ return: 0
END
PLANNED "Render job planning calculation" JobPlanning_test <<END
TEST "Render job planning calculation" JobPlanning_test <<END
out-lit: Frame #5 @ ∆200ms
out-lit: real-time-origin : 0:05:00.000
out-lit: total latency : ≺52ms≻
out-lit: deadline : 0:05:00.148
out-lit: Prerequisite......
out-lit: latency : ≺52ms≻
out-lit: deadline : 0:05:00.096
return: 0
END

View file

@ -22,38 +22,21 @@
/** @file job-planning-test.cpp
** unit test \ref JobPlanning_test
**
** @warning as of 4/2023 a complete rework of the Dispatcher is underway ///////////////////////////////////////////TICKET #1275
*/
#include "lib/test/run.hpp"
#include "lib/error.hpp"
//#include "steam/engine/procnode.hpp"
//#include "steam/play/dummy-play-connection.hpp"
//#include "steam/mobject/model-port.hpp"
#include "steam/engine/mock-dispatcher.hpp"
#include "steam/play/timings.hpp"
#include "lib/time/timevalue.hpp"
//#include "lib/time/timequant.hpp"
#include "lib/format-cout.hpp" ///////////////TODO
//#include "lib/depend.hpp"
//#include "lib/itertools.hpp"
//#include "lib/util-coll.hpp"
#include "lib/format-cout.hpp"
#include "lib/util.hpp"
//#include <functional>
//#include <vector>
#include <utility>
using test::Test;
//using util::isnil;
//using util::last;
//using std::vector;
//using std::function;
//using std::rand;
using std::move;
using util::isSameObject;
namespace steam {
@ -61,29 +44,9 @@ namespace engine{
namespace test {
using lib::time::FrameRate;
// using lib::time::Duration;
using lib::time::Offset;
// using lib::time::TimeVar;
using lib::time::Time;
// using mobject::ModelPort;
using play::Timings;
using util::isSameObject;
namespace { // used internally
// ModelPort
// getTestPort()
// {
// return mockDispatcher().provideMockModelPort();
// }
} // (End) internal defs
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
@ -92,7 +55,6 @@ namespace test {
/***************************************************************//**
* @test document and verify the data aggregation and the calculations
* necessary to prepare render jobs for scheduling.
* @todo WIP-WIP 6/2023
*/
class JobPlanning_test : public Test
{
@ -194,7 +156,7 @@ namespace test {
JobTicket& ticket = dispatcher.getJobTicketFor(portIDX, nominalTime);
JobTicket& prereq = *(ticket.getPrerequisites()); // pick up the (only) prerequisite
JobPlanning masterPlan{ticket,nominalTime,frameNr};
JobPlanning masterPlan{ticket,nominalTime,frameNr}; // the job plan for the master frame calculation
JobPlanning prereqPlan{move(*(masterPlan.buildDependencyPlanning() ))}; // build a plan for calculating the prerequisite
CHECK (isSameObject(ticket, masterPlan.ticket()));

View file

@ -75720,20 +75720,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686840707781" ID="ID_886260955" MODIFIED="1686840740791" TEXT="nur die ExitNode wei&#xdf; im Detail, wie die Ausf&#xfc;hrung auszul&#xf6;sen ist">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685034304654" ID="ID_187208942" MODIFIED="1686839878645" TEXT="JobPlanning">
<linktarget COLOR="#e14d4a" DESTINATION="ID_187208942" ENDARROW="Default" ENDINCLINATION="-864;159;" ID="Arrow_ID_426419648" SOURCE="ID_288857114" STARTARROW="None" STARTINCLINATION="1065;0;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685052158905" ID="ID_298268641" MODIFIED="1685802456361" TEXT="ist eine State-Facade f&#xfc;r den aktuellen Planungs-Stand">
<node COLOR="#338800" CREATED="1685034304654" ID="ID_187208942" MODIFIED="1687191797464" TEXT="JobPlanning">
<linktarget COLOR="#5a459d" DESTINATION="ID_187208942" ENDARROW="Default" ENDINCLINATION="-864;159;" ID="Arrow_ID_426419648" SOURCE="ID_288857114" STARTARROW="None" STARTINCLINATION="1067;-60;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1685052158905" ID="ID_298268641" MODIFIED="1687191693244" TEXT="ist eine State-Facade f&#xfc;r den aktuellen Planungs-Stand">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685802434530" ID="ID_84580124" MODIFIED="1685802448802" TEXT="f&#xfc;gt die DataSink(Handle) hinzu">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1685052155282" ID="ID_1374932582" MODIFIED="1687191730982" TEXT="verlinkt auf Frame-Nr und nominalTime">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685052155282" ID="ID_1374932582" MODIFIED="1685802461544" TEXT="f&#xfc;gt die FrameCoord hinzu">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1685802434530" ID="ID_84580124" MODIFIED="1687191738145" TEXT="f&#xfc;gt die DataSink(Handle) hinzu">
<icon BUILTIN="hourglass"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686793407407" ID="ID_194609603" MODIFIED="1686793411216" TEXT="Erzeugung">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686793407407" FOLDED="true" ID="ID_194609603" MODIFIED="1687191688480" TEXT="Erzeugung">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1686840957950" ID="ID_845216336" MODIFIED="1686867992404" TEXT="ben&#xf6;tigte Daten">
<icon BUILTIN="info"/>
<node CREATED="1686840974924" ID="ID_652755563" MODIFIED="1686840977248" TEXT="FrameCoord">
@ -75751,12 +75751,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686868079216" ID="ID_20062168" MODIFIED="1686868093219" TEXT="Builder">
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686868094902" ID="ID_1505078713" MODIFIED="1686868116317" TEXT="&#x27f9; Timing-Berechnungen erfolgen erst bei Bedarf"/>
<node COLOR="#435e98" CREATED="1686868094902" ID="ID_1505078713" MODIFIED="1687191655603" TEXT="&#x27f9; Timing-Berechnungen erfolgen erst bei Bedarf"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686793412168" ID="ID_566542363" MODIFIED="1686793437280" TEXT="Deadline festsetzen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686793444999" ID="ID_890638508" MODIFIED="1686964333735" TEXT="einfacher Job">
<node COLOR="#338800" CREATED="1686793412168" ID="ID_566542363" MODIFIED="1687191659953" TEXT="Deadline festsetzen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686793444999" FOLDED="true" ID="ID_890638508" MODIFIED="1686964333735" TEXT="einfacher Job">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1686873856076" ID="ID_1099231430" MODIFIED="1686964330736" TEXT="eigentlich liegt das Wissen dar&#xfc;ber im JobFunktor">
<arrowlink COLOR="#a56c6d" DESTINATION="ID_1464401657" ENDARROW="Default" ENDINCLINATION="-74;-579;" ID="Arrow_ID_1368232066" STARTARROW="None" STARTINCLINATION="933;50;"/>
@ -75766,8 +75766,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1686874325457" ID="ID_1367759543" MODIFIED="1686878348271" TEXT="in ExitNode">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686874330784" ID="ID_1065139085" MODIFIED="1686874366808" TEXT="und dort per Test-Spec aus dem Mock injizieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1686874330784" ID="ID_1065139085" MODIFIED="1687191647885" TEXT="und dort per Test-Spec aus dem Mock injizieren">
<icon BUILTIN="hourglass"/>
</node>
</node>
</node>
@ -75809,18 +75809,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1686963873774" ID="ID_1368816821" MODIFIED="1686963903814" TEXT="wird also au&#xdf;erhalb der Dispatcher-Pipeline verwaltet">
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686963884292" ID="ID_713008551" MODIFIED="1686963926980" TEXT="dann wohl im CalcStream">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686963884292" ID="ID_713008551" MODIFIED="1687191640923" TEXT="dann wohl im CalcStream">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686793449011" ID="ID_1790599874" MODIFIED="1686793453060" TEXT="abh&#xe4;ngiger Job">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686964367620" ID="ID_673983932" MODIFIED="1686964434017" TEXT="braucht Deadline des unmittelbar abh&#xe4;ngigen Nachfolger-Jobs">
<node COLOR="#338800" CREATED="1686793449011" FOLDED="true" ID="ID_1790599874" MODIFIED="1687191683372" TEXT="abh&#xe4;ngiger Job">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1686964367620" ID="ID_673983932" MODIFIED="1687191633500" TEXT="braucht Deadline des unmittelbar abh&#xe4;ngigen Nachfolger-Jobs">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686964642887" ID="ID_1372706833" MODIFIED="1686964706541" TEXT="verwende diese anstelle der erwarteten real-Grid-Time">
<node COLOR="#435e98" CREATED="1686964642887" ID="ID_1372706833" MODIFIED="1687191631837" TEXT="verwende diese anstelle der erwarteten real-Grid-Time">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686965001287" ID="ID_1948616906" MODIFIED="1687137549677">
@ -76190,32 +76190,49 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687137618239" ID="ID_1445585564" MODIFIED="1687137626846" TEXT="Verkettung der Deadlines implementieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687044201408" ID="ID_1507798641" MODIFIED="1687137690544" TEXT="die Deadline sollte man als Wert speichern (caching)">
<node COLOR="#338800" CREATED="1687137618239" ID="ID_1445585564" MODIFIED="1687191627752" TEXT="Verkettung der Deadlines implementieren">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1687044201408" ID="ID_1507798641" MODIFIED="1687188666784" TEXT="die Deadline sollte man als Wert speichern (caching)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...denn sonst w&#252;rde es genau zu rekursiven kaskadierenden (exponentiell aufwendigen) Aufrufen der Deadline-Berechnungs-Logik kommen; um das Caching zu steuern, kann ich einen Marker-Wert Time::NEVER verwenden
...denn sonst w&#252;rde es genau zu rekursiven kaskadierenden (quadratisch aufwendigen) Aufrufen der Deadline-Berechnungs-Logik kommen; um das Caching zu steuern, kann ich einen Marker-Wert Time::NEVER verwenden
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#e42d77" DESTINATION="ID_1561329377" ENDARROW="Default" ENDINCLINATION="361;27;" ID="Arrow_ID_242786471" STARTARROW="None" STARTINCLINATION="481;-20;"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1687188669884" HGAP="30" ID="ID_419509522" MODIFIED="1687191103504" TEXT="ja .... aber YAGNI" VSHIFT="15">
<linktarget COLOR="#955173" DESTINATION="ID_419509522" ENDARROW="Default" ENDINCLINATION="-1499;205;" ID="Arrow_ID_1313834873" SOURCE="ID_503672803" STARTARROW="None" STARTINCLINATION="-455;22;"/>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687137710306" ID="ID_1967222999" MODIFIED="1687137719434" TEXT="Refactoring: Berechnung symmetrisch machen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1687188700992" HGAP="30" ID="ID_1176783672" MODIFIED="1687188838995" TEXT="die ersten paar sind billig, und die Kosten sind nicht klar" VSHIFT="2">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Ich kann mir nicht vorstellen, da&#223; die gro&#223;e Mehrheit der Jobs mehr als eine Prerequisite bekommt...&#160;&#160;der Aufwand ist n/2 * (n+1), das bringt uns erst mal solange nicht um (bis es uns nachweislich umbringt...)
</p>
</body>
</html></richcontent>
</node>
</node>
<node COLOR="#338800" CREATED="1687137710306" ID="ID_1967222999" MODIFIED="1687191110809" TEXT="Refactoring: Berechnung symmetrisch machen">
<icon BUILTIN="button_ok"/>
<node CREATED="1687137733390" ID="ID_1496251627" MODIFIED="1687137744225" TEXT="top-Level: Deadline stammt von den Timings"/>
<node CREATED="1687137744907" ID="ID_348107888" MODIFIED="1687137759424" TEXT="Prerequisite: Deadline stammt vom dependent Plan"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686840122729" ID="ID_1592165499" MODIFIED="1686840132630" TEXT="Ergebnis">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686840122729" ID="ID_1592165499" MODIFIED="1687191673155" TEXT="Ergebnis">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1686840134669" ID="ID_1671465923" MODIFIED="1686840507523" TEXT="Form?">
<icon BUILTIN="help"/>
<node COLOR="#5b280f" CREATED="1686840163409" ID="ID_936153920" MODIFIED="1686840418535" TEXT="per direkter Konversion">
@ -76301,8 +76318,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686875085793" ID="ID_922531661" MODIFIED="1686875092431" TEXT="determineLeeway">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1686875085793" ID="ID_922531661" MODIFIED="1687191669854" TEXT="determineLeeway">
<icon BUILTIN="hourglass"/>
<node CREATED="1686874949274" ID="ID_1842763016" MODIFIED="1686875271688">
<richcontent TYPE="NODE"><html>
<head>
@ -76747,14 +76764,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="pencil"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686839683285" ID="ID_36707137" MODIFIED="1686839686828" TEXT="JobPlanning">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686839683285" ID="ID_36707137" MODIFIED="1687191788043" TEXT="JobPlanning">
<icon BUILTIN="pencil"/>
<node COLOR="#5b280f" CREATED="1686839707718" ID="ID_608495626" MODIFIED="1686839807822" TEXT="1.Entwurf (Monaden)">
<arrowlink COLOR="#596573" DESTINATION="ID_181262071" ENDARROW="Default" ENDINCLINATION="336;992;" ID="Arrow_ID_1922586461" STARTARROW="None" STARTINCLINATION="253;-27;"/>
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686839823154" ID="ID_288857114" MODIFIED="1686839878645" TEXT="&#xdc;berarbeitung (&#xbb;PlaybackVerticalSlice&#xab;)">
<arrowlink COLOR="#e14d4a" DESTINATION="ID_187208942" ENDARROW="Default" ENDINCLINATION="-864;159;" ID="Arrow_ID_426419648" STARTARROW="None" STARTINCLINATION="1065;0;"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686839823154" ID="ID_288857114" MODIFIED="1687191778565" TEXT="&#xdc;berarbeitung (&#xbb;PlaybackVerticalSlice&#xab;)">
<arrowlink COLOR="#5a459d" DESTINATION="ID_187208942" ENDARROW="Default" ENDINCLINATION="-864;159;" ID="Arrow_ID_426419648" STARTARROW="None" STARTINCLINATION="1067;-60;"/>
<icon BUILTIN="pencil"/>
</node>
<node CREATED="1686839910080" ID="ID_713870050" MODIFIED="1686839917267" TEXT="Aufbau">
@ -86847,7 +86864,7 @@ class Something
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1664730709910" FOLDED="true" ID="ID_532850171" MODIFIED="1664731043947" TEXT="Performance">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1664730709910" FOLDED="true" ID="ID_532850171" MODIFIED="1687191026011" TEXT="Performance">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1664730715885" ID="ID_1774914566" MODIFIED="1664731036535" TEXT="GUI">
<arrowlink COLOR="#6e6b89" DESTINATION="ID_580266574" ENDARROW="Default" ENDINCLINATION="-1072;126;" ID="Arrow_ID_1760515184" STARTARROW="None" STARTINCLINATION="-1832;638;"/>
@ -86859,6 +86876,10 @@ class Something
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1664730718511" ID="ID_1773381955" MODIFIED="1664730727367" TEXT="Engine">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687190990795" ID="ID_503672803" MODIFIED="1687191103504" TEXT="#1310 investigate job-planning and scheduling overhead">
<arrowlink COLOR="#955173" DESTINATION="ID_419509522" ENDARROW="Default" ENDINCLINATION="-1499;205;" ID="Arrow_ID_1313834873" STARTARROW="None" STARTINCLINATION="-455;22;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1664730722868" ID="ID_1536097796" MODIFIED="1664730727368" TEXT="Session">
<icon BUILTIN="hourglass"/>