wizards/Package_scriptforge.mk                    |    1 
 wizards/source/scriptforge/SF_PythonHelper.xba    |   11 
 wizards/source/scriptforge/SF_Root.xba            |   17 
 wizards/source/scriptforge/SF_Services.xba        |   47 +-
 wizards/source/scriptforge/SF_Session.xba         |    6 
 wizards/source/scriptforge/SF_SharedMemory.xba    |  468 ++++++++++++++++++++++
 wizards/source/scriptforge/python/scriptforge.py  |   43 +-
 wizards/source/scriptforge/python/scriptforge.pyi |   84 +++
 wizards/source/scriptforge/script.xlb             |   21 
 9 files changed, 648 insertions(+), 50 deletions(-)

New commits:
commit e79a47409f2cae3485ed9e0399ed15a60b66a3ac
Author:     Jean-Pierre Ledure <j...@ledure.be>
AuthorDate: Mon Aug 25 15:01:44 2025 +0200
Commit:     Jean-Pierre Ledure <j...@ledure.be>
CommitDate: Mon Aug 25 16:24:31 2025 +0200

    ScriptForge - new SharedMemory service
    
    Singleton class implementing the
      "ScriptForge.SharedMemory"
    service. Implemented as a usual Basic module.
    
    Contains the mechanisms to manage persistent memory storage
    across Basic and/or Python scripts.
    
    When a script stops running, all the variables it uses vanish,
    except Basic Global variables, which stay in memory until
    the end of the LibreOffice session.
    
    However event-driven scripting can often benefit from having
    variables still being available when the next script is
    triggered, probably due to a user action.
    
    The SharedMemory service implements interfaces allowing
    to store both BASIC and PYTHON variables in persistent storage,
    and to retrieve them later from either BASIC or PYTHON scripts
    interchangeably.
    
    The use of the Basic Global statement is more efficient
    than the actual service and should be preferred when the variables
    are created and retrieved in basic scripts only.
    
    The supported variable types are:
     * Scalar or tuple combining:
      - int, within the bounds of the Basic Long type
      - float, within the bounds of the Basic Double type
      - str
      - bool
      - None
     * datetime.datetime
     * UNO object
     * ScriptForge class instance
    
    Example:
      Sub CreateDoc()
        ui = CreateScriptService("UI")
        doc = ui.CreateDocument("Calc")
        store = CreateScriptService("SharedMemory")
        store.StoreValue(doc, "actualdocument")
      ...
    
      def UpdateDoc():
        store = CreateScriptService("SharedMemory")
        doc = store.ReadValue("actualdocument")
        ...
    
    The service is available both for Basic and Python scripts.
    The actual commit requires the creation of an additional
    Help page.
    
    Change-Id: Id53994be5105206c16659f769338261b3dde2d3a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190174
    Reviewed-by: Jean-Pierre Ledure <j...@ledure.be>
    Tested-by: Jenkins

diff --git a/wizards/Package_scriptforge.mk b/wizards/Package_scriptforge.mk
index cb1e4d8fb3d2..6581c77bc586 100644
--- a/wizards/Package_scriptforge.mk
+++ b/wizards/Package_scriptforge.mk
@@ -31,6 +31,7 @@ $(eval $(call 
gb_Package_add_files,wizards_basicsrvscriptforge,$(LIBO_SHARE_FOLD
        SF_Root.xba \
        SF_Services.xba \
        SF_Session.xba \
+       SF_SharedMemory.xba \
        SF_String.xba \
        SF_TextStream.xba \
        SF_Timer.xba \
diff --git a/wizards/source/scriptforge/SF_PythonHelper.xba 
b/wizards/source/scriptforge/SF_PythonHelper.xba
index 4de5bf74d44e..085d5ff639af 100644
--- a/wizards/source/scriptforge/SF_PythonHelper.xba
+++ b/wizards/source/scriptforge/SF_PythonHelper.xba
@@ -1021,16 +1021,5 @@ Catch:
        GoTo Finally
 End Function   &apos;  ScriptForge.SF_PythonHelper._PythonDispatcher
 
-REM 
-----------------------------------------------------------------------------
-Private Function _Repr() As String
-&apos;&apos;&apos;     Convert the Basic instance to a readable string, 
typically for debugging purposes (DebugPrint ...)
-&apos;&apos;&apos;     Args:
-&apos;&apos;&apos;     Return:
-&apos;&apos;&apos;             &quot;[PythonHelper]&quot;
-
-       _Repr = &quot;[PythonHelper]&quot;
-
-End Function   &apos;  ScriptForge.SF_PythonHelper._Repr
-
 REM ================================================= END OF 
SCRIPTFORGE.SF_PythonHelper
 </script:module>
\ No newline at end of file
diff --git a/wizards/source/scriptforge/SF_Root.xba 
b/wizards/source/scriptforge/SF_Root.xba
index ddc84b41c7a5..f0db856873c8 100644
--- a/wizards/source/scriptforge/SF_Root.xba
+++ b/wizards/source/scriptforge/SF_Root.xba
@@ -74,14 +74,14 @@ Private URLTransformer              As Object       &apos; 
com.sun.star.util.URLTransformer
 Private Introspection          As Object       &apos; 
com.sun.star.beans.Introspection
 Private BrowseNodeFactory      As Object       &apos; 
com.sun.star.script.browse.BrowseNodeFactory
 Private DatabaseContext                As Object       &apos; 
com.sun.star.sdb.DatabaseContext
-Private ConfigurationProvider  As Object
-                                                                               
&apos; com.sun.star.configuration.ConfigurationProvider
+Private ConfigurationProvider _
+                                                       As Object       &apos; 
com.sun.star.configuration.ConfigurationProvider
 Private PackageProvider                As Object       &apos; 
com.sun.star.comp.deployment.PackageInformationProvider
 Private MailService                    As Object       &apos; 
com.sun.star.system.SimpleCommandMail or com.sun.star.system.SimpleSystemMail
 Private GraphicExportFilter    As Object       &apos; 
com.sun.star.drawing.GraphicExportFilter
 Private Toolkit                                As Object       &apos; 
com.sun.star.awt.Toolkit
-Private ModuleUIConfigurationManagerSupplier   As Object
-                                                                               
&apos; com.sun.star.ui.ModuleUIConfigurationManagerSupplier
+Private ModuleUIConfigurationManagerSupplier _
+                                                       As Object       &apos; 
com.sun.star.ui.ModuleUIConfigurationManagerSupplier
 Private TransientDocument      As Object       &apos; 
com.sun.star.frame.TransientDocumentsDocumentContentFactory
 
 &apos; Specific persistent services objects or properties
@@ -94,6 +94,7 @@ Private SFDialogs                     As Variant      &apos; 
Persistent storage for the SFDialogs libra
 Private SFForms                                As Variant      &apos; 
Persistent storage for the SF_Form class in the SFDocuments library
 Private PythonStorage          As Variant      &apos; Persistent storage for 
the objects created and processed in Python
 Private PythonPermanent                As Long         &apos; Number of 
permanent entries in PythonStorage containing standard module objects
+Private GlobalStorage          As Object       &apos; Dictionary of storage 
shared between Basic and Python
 
 REM ====================================================== 
CONSTRUCTOR/DESTRUCTOR
 
@@ -159,6 +160,7 @@ Private Sub Class_Initialize()
        SFForms = Empty
        PythonStorage = Empty
        PythonPermanent = -1
+       Set GlobalStorage = Nothing
 End Sub                &apos;  ScriptForge.SF_Root Constructor
 
 REM 
-----------------------------------------------------------------------------
@@ -271,7 +273,7 @@ Public Sub _InitPythonStorage()
 
 Try:
        If Not IsArray(PythonStorage) Then
-               PythonPermanent = 8
+               PythonPermanent = 9
                PythonStorage = Array()
                ReDim PythonStorage(0 To PythonPermanent)
                &apos;  Initialize each entry
@@ -282,8 +284,9 @@ Try:
                PythonStorage(4) = ScriptForge.SF_Region
                PythonStorage(5) = ScriptForge.SF_Services
                PythonStorage(6) = ScriptForge.SF_Session
-               PythonStorage(7) = ScriptForge.SF_String
-               PythonStorage(8) = ScriptForge.SF_UI
+               PythonStorage(7) = ScriptForge.SF_SharedMemory
+               PythonStorage(8) = ScriptForge.SF_String
+               PythonStorage(9) = ScriptForge.SF_UI
        End If
 
 Finally:
diff --git a/wizards/source/scriptforge/SF_Services.xba 
b/wizards/source/scriptforge/SF_Services.xba
index ebf8ef215318..42c62784193c 100644
--- a/wizards/source/scriptforge/SF_Services.xba
+++ b/wizards/source/scriptforge/SF_Services.xba
@@ -13,20 +13,34 @@ Option Explicit
 &apos;&apos;&apos;     ===========
 &apos;&apos;&apos;             Singleton class implementing the 
&quot;ScriptForge.Services&quot; service
 &apos;&apos;&apos;             Implemented as a usual Basic module
-&apos;&apos;&apos;             The ScriptForge framework includes
-&apos;&apos;&apos;                     the current ScriptForge library
-&apos;&apos;&apos;                     a number of &quot;associated&quot; 
libraries
-&apos;&apos;&apos;                     any user/contributor extension wanting 
to fit into the framework 
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The modules and classes implemented in 
ScriptForge will be invoked
+&apos;&apos;&apos;             from user scripts as &quot;Services&quot;.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             A generic constructor of those services has 
been designed for that purpose:
+&apos;&apos;&apos;                     
CreateScriptService(&quot;servicename&quot;[, arg0, arg1, ...])
+&apos;&apos;&apos;             All top-level services are created through this 
mechanism.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             To become a candidate for incorporation into 
ScriptForge, a library of services
+&apos;&apos;&apos;             must register its services by implementing a
+&apos;&apos;&apos;                     RegisterScriptServices(...)
+&apos;&apos;&apos;             method. This method must be present in any 
external library wanting to extend
+&apos;&apos;&apos;             the set of available services.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Above mechanisms make ScriptForge an easily 
extensible ecosystem combining a core library,
+&apos;&apos;&apos;             additional standard libraries and libraries 
published as extensions or distributed
+&apos;&apos;&apos;             as company extensions.
+&apos;&apos;&apos;
 &apos;&apos;&apos;             The methods in this module constitute the 
kernel of the ScriptForge framework
-&apos;&apos;&apos;                     - RegisterScriptServices
-&apos;&apos;&apos;                             Register for a library the list 
of services it implements
-&apos;&apos;&apos;                             Each library in the framework 
must implement its own RegisterScriptServices method
+&apos;&apos;&apos;                     RegisterScriptServices()
+&apos;&apos;&apos;                             Register for a library the list 
of services it implements.
+&apos;&apos;&apos;                             Each library in the framework 
must implement its own RegisterScriptServices() method.
 &apos;&apos;&apos;                             This method consists in a 
series of invocations of next 2 methods
-&apos;&apos;&apos;                     - RegisterService
-&apos;&apos;&apos;                             Register a single service
-&apos;&apos;&apos;                     - RegisterEventManager
-&apos;&apos;&apos;                             Register a single event manager
-&apos;&apos;&apos;                     - CreateScriptService
+&apos;&apos;&apos;                                     RegisterService()
+&apos;&apos;&apos;                                             Register a 
single service
+&apos;&apos;&apos;                                     RegisterEventManager()
+&apos;&apos;&apos;                                             Register a 
single event manager
+&apos;&apos;&apos;                     CreateScriptService()
 &apos;&apos;&apos;                             Called by user scripts to get 
an object giving access to a service or to the event manager
 &apos;&apos;&apos;
 &apos;&apos;&apos;             Detailed user documentation:
@@ -84,12 +98,12 @@ Public Function CreateScriptService(Optional ByRef Service 
As Variant _
 &apos;&apos;&apos;             UNKNOWNSERVICEERROR                             
Service not found
 &apos;&apos;&apos;     Examples
 &apos;&apos;&apos;             CreateScriptService(&quot;Array&quot;)
-&apos;&apos;&apos;                                     =&gt; Refers to 
ScriptForge.Array or SF_Array
-&apos;&apos;&apos;             
CreateScriptService(&quot;ScriptForge.Dictionary&quot;)
+&apos;&apos;&apos;                                     =&gt; Refers to 
&quot;ScriptForge.Array&quot;, i.e. the ScriptForge.SF_Array module
+&apos;&apos;&apos;             
CreateScriptService(&quot;ScriptForge.Dictionary&quot;, ...)
 &apos;&apos;&apos;                                     =&gt; Returns a new 
empty dictionary; &quot;ScriptForge.&quot; is optional
-&apos;&apos;&apos;             
CreateScriptService(&quot;SFDocuments.Calc&quot;)
+&apos;&apos;&apos;             
CreateScriptService(&quot;SFDocuments.Calc&quot;, ...)
 &apos;&apos;&apos;                                     =&gt; Refers to the 
Calc service, implemented in the SFDocuments library
-&apos;&apos;&apos;             CreateScriptService(&quot;Dialog&quot;, dlgName)
+&apos;&apos;&apos;             CreateScriptService(&quot;Dialog&quot;, 
dlgName, ...)
 &apos;&apos;&apos;                                     =&gt; Returns a Dialog 
instance referring to the dlgName dialog
 &apos;&apos;&apos;             
CreateScriptService(&quot;SFDocuments.Event&quot;, oEvent)
 &apos;&apos;&apos;                                     =&gt; Refers to the 
Document service instance, implemented in the SFDocuments library, having 
triggered the event
@@ -301,6 +315,7 @@ Public Sub RegisterScriptServices() As Variant
                .RegisterService(&quot;Platform&quot;, 
GlobalScope.ScriptForge.SF_Platform)
                .RegisterService(&quot;Region&quot;, 
GlobalScope.ScriptForge.SF_Region)
                .RegisterService(&quot;Session&quot;, 
GlobalScope.ScriptForge.SF_Session)
+               .RegisterService(&quot;SharedMemory&quot;, 
GlobalScope.ScriptForge.SF_SharedMemory)
                .RegisterService(&quot;String&quot;, 
GlobalScope.ScriptForge.SF_String)
                .RegisterService(&quot;Timer&quot;, 
&quot;ScriptForge.SF_Services._NewTimer&quot;)
                .RegisterService(&quot;UI&quot;, GlobalScope.ScriptForge.SF_UI)
diff --git a/wizards/source/scriptforge/SF_Session.xba 
b/wizards/source/scriptforge/SF_Session.xba
index ce89fb8f3bbc..a4f7088e8536 100644
--- a/wizards/source/scriptforge/SF_Session.xba
+++ b/wizards/source/scriptforge/SF_Session.xba
@@ -67,7 +67,7 @@ REM ===================================================== 
CONSTRUCTOR/DESTRUCTOR
 REM 
-----------------------------------------------------------------------------
 Public Function Dispose() As Variant
        Set Dispose = Nothing
-End Function   &apos;  ScriptForge.SF_Array Explicit destructor
+End Function   &apos;  ScriptForge.SF_Session Explicit destructor
 
 REM ================================================================== 
PROPERTIES
 
@@ -81,7 +81,7 @@ REM 
----------------------------------------------------------------------------
 Property Get ServiceName As String
 &apos;&apos;&apos;     Internal use
        ServiceName = &quot;ScriptForge.Session&quot;
-End Property   &apos;  ScriptForge.SF_Array.ServiceName
+End Property   &apos;  ScriptForge.SF_Session.ServiceName
 
 REM 
-----------------------------------------------------------------------------
 Property Get SCRIPTISAPPLICATION As String
@@ -1188,4 +1188,4 @@ CatchNotFound:
 End Function   &apos;  ScriptForge.SF_Session._GetScript
 
 REM =============================================== END OF 
SCRIPTFORGE.SF_SESSION
-</script:module>
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/scriptforge/SF_SharedMemory.xba 
b/wizards/source/scriptforge/SF_SharedMemory.xba
new file mode 100644
index 000000000000..f16a323f0d60
--- /dev/null
+++ b/wizards/source/scriptforge/SF_SharedMemory.xba
@@ -0,0 +1,468 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" 
"module.dtd">
+<script:module xmlns:script="http://openoffice.org/2000/script"; 
script:name="SF_SharedMemory" script:language="StarBasic" 
script:moduleType="normal">REM 
=======================================================================================================================
+REM ===                        The ScriptForge library and its associated 
libraries are part of the LibreOffice project.                               ===
+REM ===                                        Full documentation is available 
on https://help.libreoffice.org/                                                
                ===
+REM 
=======================================================================================================================
+
+Option Compatible
+Option Explicit
+
+&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
+&apos;&apos;&apos;     SF_SharedMemory
+&apos;&apos;&apos;     ===============
+&apos;&apos;&apos;             Singleton class implementing the 
&quot;ScriptForge.SharedMemory&quot; service
+&apos;&apos;&apos;             Implemented as a usual Basic module
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Contains the mechanisms to manage persistent 
memory storage
+&apos;&apos;&apos;             across Basic and/or Python scripts.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             When a script stops running, all the variables 
it uses vanish,
+&apos;&apos;&apos;             except Basic Global variables, which stay in 
memory until the end
+&apos;&apos;&apos;             of the LibreOffice session.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             However event-driven scripting can often 
benefit from having variables
+&apos;&apos;&apos;             still being available when the next script is 
triggered, probably due
+&apos;&apos;&apos;             to a user action.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The SharedMemory service implements interfaces 
allowing to store both BASIC
+&apos;&apos;&apos;             and PYTHON variables in persistent storage, and 
to retrieve them later
+&apos;&apos;&apos;             from either BASIC or PYTHON scripts 
interchangeably.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             The use of the Basic Global statement is more 
efficient than the actual service
+&apos;&apos;&apos;             and should be preferred when the variables are 
created and retrieved in basic
+&apos;&apos;&apos;             scripts only.
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Service invocation example:
+&apos;&apos;&apos;                     Dim memory As Variant
+&apos;&apos;&apos;                     memory = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Example:
+&apos;&apos;&apos;                     Sub CreateDoc()
+&apos;&apos;&apos;                     ui = CreateScriptService(&quot;UI&quot;)
+&apos;&apos;&apos;                     doc = 
ui.CreateDocument(&quot;Calc&quot;)
+&apos;&apos;&apos;                     store = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;                     store.StoreValue(doc, 
&quot;actualdocument&quot;)
+&apos;&apos;&apos;                     ...
+&apos;&apos;&apos;
+&apos;&apos;&apos;                     def UpdateDoc():
+&apos;&apos;&apos;                             store = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;                             doc = 
store.ReadValue(&quot;actualdocument&quot;)
+&apos;&apos;&apos;                             ...
+&apos;&apos;&apos;
+&apos;&apos;&apos;             Detailed user documentation:
+&apos;&apos;&apos;                     
https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03/sf_SharedMemory.html?DbPAR=BASIC
+&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;&apos;
+
+REM ================================================================== 
EXCEPTIONS
+
+REM ============================================================ MODULE 
CONSTANTS
+
+REM ===================================================== 
CONSTRUCTOR/DESTRUCTOR
+
+REM 
-----------------------------------------------------------------------------
+Public Function Dispose() As Variant
+       RemoveAll()
+       Set Dispose = Nothing
+End Function   &apos;  ScriptForge.SF_SharedMemory Explicit destructor
+
+REM ================================================================== 
PROPERTIES
+
+REM 
-----------------------------------------------------------------------------
+Property Get ObjectType As String
+&apos;&apos;&apos;     Only to enable object representation
+       ObjectType = &quot;SF_SharedMemory&quot;
+End Property   &apos;  ScriptForge.SF_SharedMemory.ObjectType
+
+REM 
-----------------------------------------------------------------------------
+Property Get ServiceName As String
+&apos;&apos;&apos;     Internal use
+       ServiceName = &quot;ScriptForge.SharedMemory&quot;
+End Property   &apos;  ScriptForge.SF_SharedMemory.ServiceName
+
+REM ============================================================== PUBLIC 
METHODS
+
+REM 
-----------------------------------------------------------------------------
+Public Function GetProperty(Optional ByVal PropertyName As Variant) As Variant
+&apos;&apos;&apos;     Return the actual value of the given property
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             PropertyName: the name of the property as a 
string
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The actual value of the property
+&apos;&apos;&apos;     Exceptions
+&apos;&apos;&apos;             ARGUMENTERROR           The property does not 
exist
+
+Const cstThisSub = &quot;SharedMemory.GetProperty&quot;
+Const cstSubArgs = &quot;PropertyName&quot;
+
+       If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       GetProperty = Null
+
+Check:SharedMemory
+       If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not SF_Utils._Validate(PropertyName, 
&quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
+       End If
+
+Try:
+       Select Case UCase(PropertyName)
+               Case Else
+       End Select
+
+Finally:
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  ScriptForge.SF_SharedMemory.GetProperty
+
+REM 
-----------------------------------------------------------------------------
+Public Function Methods() As Variant
+&apos;&apos;&apos;     Return the list of public methods of the SharedMemory 
service as an array
+
+       Methods = Array( _
+                                       &quot;Exists&quot; _
+                                       , &quot;ReadValue&quot; _
+                                       , &quot;Rename&quot; _
+                                       , &quot;Remove&quot; _
+                                       , &quot;RemoveAll&quot; _
+                                       , &quot;StoreValue&quot; _
+                                       )
+
+End Function   &apos;  ScriptForge.SF_SharedMemory.Methods
+
+REM 
-----------------------------------------------------------------------------
+Public Function Properties() As Variant
+&apos;&apos;&apos;     Return the list or properties as an array
+
+       Properties = Array( _
+                                       )
+
+End Function   &apos;  ScriptForge.SF_SharedMemory.Properties
+
+REM 
-----------------------------------------------------------------------------
+Public Function Exists(Optional ByVal VariableName As Variant) As Boolean
+&apos;&apos;&apos;     Returns True if the given name exists in the shared and 
persistent storage.
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             VariableName: a case-sensitive name.
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True if VariableName exists.
+&apos;&apos;&apos;     Example:
+&apos;&apos;&apos;             memory = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;             If memory.Exists(&quot;ActualDoc&quot;) Then
+&apos;&apos;&apos;                     ...
+
+Dim bExists As Boolean                 &apos;  Return value
+
+Const cstThisSub = &quot;SharedMemory.Exists&quot;
+Const cstSubArgs = &quot;VariableName&quot;
+
+       If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bExists = False
+
+Check:
+       If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not SF_Utils._Validate(VariableName, 
&quot;VariableName&quot;, V_STRING) Then GoTo Catch
+       End If
+
+Try:
+       If Not IsNull(_SF_.GlobalStorage) Then bExists = 
_SF_.GlobalStorage.Exists(VariableName)
+
+Finally:
+       Exists = bExists
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  ScriptForge.SF_SharedMemory.Exists
+
+REM 
-----------------------------------------------------------------------------
+Public Function ReadValue(Optional ByVal VariableName As Variant) As Variant
+&apos;&apos;&apos;     Read in the shared and persistent storage area the 
requested value or array of values.
+&apos;&apos;&apos;     If the returned value is a ScriptForge class instance, 
the user script can verify if the
+&apos;&apos;&apos;     corresponding interface (dialog, document, ...) is 
still valid with its IsAlive property.
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             VariableName: the case-sensitive name of the 
value to retrieve.
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A scalar or an array of scalars.
+&apos;&apos;&apos;             If VariableName does not exist, an error is 
generated.
+&apos;&apos;&apos;     Example:
+&apos;&apos;&apos;             memory = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;             doc = CreateScriptService(&quot;Document&quot;, 
ThisComponent)
+&apos;&apos;&apos;             memory.StoreValue(doc, &quot;ActualDoc&quot;)
+&apos;&apos;&apos;             ...             &apos;  The script might be 
stopped
+&apos;&apos;&apos;             doc2 = memory.ReadValue(&quot;ActualDoc&quot;)
+&apos;&apos;&apos;             If doc2.IsAlive Then    &apos;  Check that the 
document has not be closed by the user
+&apos;&apos;&apos;                     ...
+
+Dim vRead As Variant                   &apos;  Return value
+Dim vKeys As Variant                   &apos;  Array of dictionary keys
+
+Const cstThisSub = &quot;SharedMemory.ReadValue&quot;
+Const cstSubArgs = &quot;VariableName&quot;
+
+       If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       vRead = Empty
+       &apos;  Initialize the dictionary if necessary
+       If IsNull(_SF_.GlobalStorage) Then _SF_.GlobalStorage = 
CreateScriptService(&quot;Dictionary&quot;, True)
+
+Check:
+       vKeys = _SF_.GlobalStorage.Keys
+       If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not SF_Utils._Validate(VariableName, 
&quot;VariableName&quot;, V_STRING, vKeys, True) Then GoTo Catch
+       End If
+
+Try:
+       &apos;  Read the value in the persistent dictionary
+       vRead =  _SF_.GlobalStorage.Item(VariableName)
+
+Finally:
+       ReadValue = vRead
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  ScriptForge.SF_SharedMemory.ReadValue
+
+REM 
-----------------------------------------------------------------------------
+Public Function Remove(Optional ByVal VariableName As Variant) As Boolean
+&apos;&apos;&apos;     Remove the entry in the shared and persistent storage 
area corresponding with the given name.
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             VariableName: the case-sensitive name to remove.
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             A scalar or an array of scalars.
+&apos;&apos;&apos;             If VariableName does not exist, an error is 
generated.
+&apos;&apos;&apos;     Example:
+&apos;&apos;&apos;             memory = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;             If memory.Exists(&quot;ActualDoc&quot;) Then 
memory.Remove(&quot;ActualDoc&quot;)
+&apos;&apos;&apos;                     ...
+
+Dim bRemove As Boolean                 &apos;  Return value
+Dim vKeys As Variant                   &apos;  Array of dictionary keys
+
+Const cstThisSub = &quot;SharedMemory.Remove&quot;
+Const cstSubArgs = &quot;VariableName&quot;
+
+       If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bRemove = False
+       &apos;  Initialize the dictionary if necessary
+       If IsNull(_SF_.GlobalStorage) Then _SF_.GlobalStorage = 
CreateScriptService(&quot;Dictionary&quot;, True)
+
+Check:
+       vKeys = _SF_.GlobalStorage.Keys
+       If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not SF_Utils._Validate(VariableName, 
&quot;VariableName&quot;, V_STRING, vKeys, True) Then GoTo Catch
+       End If
+
+Try:
+       &apos;  Remove key and item from the persistent dictionary
+       bRemove =  _SF_.GlobalStorage.Remove(VariableName)
+
+Finally:
+       Remove = bRemove
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  ScriptForge.SF_SharedMemory.Remove
+
+REM 
-----------------------------------------------------------------------------
+Public Function RemoveAll() As Boolean
+&apos;&apos;&apos;     Remove the whole content of the shared and persistent 
storage area.
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True when successful.
+&apos;&apos;&apos;     Example:
+&apos;&apos;&apos;             memory = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;             memory.RemoveAll()
+&apos;&apos;&apos;             MsgBox memory.Exists(&quot;ActualDoc&quot;)     
&apos;  False
+&apos;&apos;&apos;                     ...
+
+Dim bRemoveAll As Boolean                      &apos;  Return value
+
+Const cstThisSub = &quot;SharedMemory.RemoveAll&quot;
+Const cstSubArgs = &quot;&quot;
+
+       If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bRemoveAll = False
+
+Check:
+       SF_Utils._EnterFunction(cstThisSub, cstSubArgs)
+
+Try:
+       If Not IsNull(_SF_.GlobalStorage) Then bRemoveAll = 
_SF_.GlobalStorage.RemoveAll()
+
+Finally:
+       RemoveAll = bRemoveAll
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  ScriptForge.SF_SharedMemory.RemoveAll
+
+REM 
-----------------------------------------------------------------------------
+Public Function SetProperty(Optional ByVal PropertyName As Variant _
+                                                               , Optional 
ByRef Value As Variant _
+                                                               ) As Boolean
+&apos;&apos;&apos;     Set a new value to the given property
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             PropertyName: the name of the property as a 
string
+&apos;&apos;&apos;             Value: its new value
+&apos;&apos;&apos;     Exceptions
+&apos;&apos;&apos;             ARGUMENTERROR           The property does not 
exist
+
+Const cstThisSub = &quot;SharedMemory.SetProperty&quot;
+Const cstSubArgs = &quot;PropertyName, Value&quot;
+
+       If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       SetProperty = False
+
+Check:
+       If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If Not SF_Utils._Validate(PropertyName, 
&quot;PropertyName&quot;, V_STRING, Properties()) Then GoTo Catch
+       End If
+
+Try:
+       Select Case UCase(PropertyName)
+               Case Else
+       End Select
+       SetProperty = True
+
+Finally:
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  ScriptForge.SF_SharedMemory.SetProperty
+
+REM 
-----------------------------------------------------------------------------
+Public Function StoreValue(Optional ByVal Value As Variant _
+                                                               , Optional 
ByVal VariableName As Variant _
+                                                               ) As Boolean
+&apos;&apos;&apos;     Store in the shared and persistent storage area the 
given value.
+&apos;&apos;&apos;     Later retrieval will be done thanks to the given 
variable name.
+&apos;&apos;&apos;     If the given name already exists, its value is replaced 
without warning.
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             Value: the value to be stored.
+&apos;&apos;&apos;                     The supported variable types are:
+&apos;&apos;&apos;                     * Scalar or 1D-array/tuple combining :
+&apos;&apos;&apos;                             - Integer/Long or int, within 
the bounds of the Basic Long type
+&apos;&apos;&apos;                             - Single/Double or float, 
within the bounds of the Basic Double type
+&apos;&apos;&apos;                             - String or str
+&apos;&apos;&apos;                             - Boolean or bool
+&apos;&apos;&apos;                             - Null or None (Empty and 
Nothing are reset to Null)
+&apos;&apos;&apos;                             - Variant embedding one of 
above types
+&apos;&apos;&apos;                     * Date or datetime.datetime
+&apos;&apos;&apos;                     * UNO object
+&apos;&apos;&apos;                     * ScriptForge class instance
+&apos;&apos;&apos;             VariableName: the case-sensitive name to 
retrieve the Value when needed.
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             True when successful
+&apos;&apos;&apos;     Example:
+&apos;&apos;&apos;             memory = 
CreateScriptService(&quot;SharedMemory&quot;)
+&apos;&apos;&apos;             doc = CreateScriptService(&quot;Document&quot;, 
ThisComponent)
+&apos;&apos;&apos;             memory.StoreValue(doc, &quot;ActualDoc&quot;)
+
+Dim bStore As Boolean                  &apos;  Return value
+Dim vGlobal As Variant                 &apos;  A stored value
+Dim i As Long
+
+Const cstThisSub = &quot;SharedMemory.StoreValue&quot;
+Const cstSubArgs = &quot;Value, VariableName&quot;
+
+       If SF_Utils._ErrorHandling() Then On Local Error GoTo Catch
+       bStore = False
+
+Check:
+       If SF_Utils._EnterFunction(cstThisSub, cstSubArgs) Then
+               If IsArray(Value) Then
+                       If Not SF_Utils._ValidateArray(Value, 
&quot;Value&quot;, 1) Then GoTo Catch
+               End If
+               If Not SF_Utils._Validate(VariableName, 
&quot;VariableName&quot;, V_STRING) Then GoTo Catch
+       End If
+
+Try:
+       &apos;  Initialize the dictionary if necessary
+       If IsNull(_SF_.GlobalStorage) Then _SF_.GlobalStorage = 
CreateScriptService(&quot;Dictionary&quot;, True)
+
+       &apos;  Size the returned array when the input is an array
+       If IsArray(Value) Then
+               vGlobal = Array()
+               ReDim vGlobal(LBound(Value) To UBound(Value))
+               For i = LBound(vGlobal) To UBound(vGlobal)
+                       vGlobal(i) = _ConvertValue(Value(i), pbArray := True)
+                       If IsEmpty(vGlobal(i)) Then
+                               vGlobal = Empty
+                               Exit For
+                       End If
+               Next i
+       Else
+               vGlobal = _ConvertValue(Value, pbArray := False)
+       End If
+
+       &apos;  Store the value in the persistent dictionary
+       If Not IsEmpty(vGlobal) Then
+               With _SF_.GlobalStorage
+                       If .Exists(VariableName) Then bStore = 
.ReplaceItem(VariableName, vGlobal) Else bStore = .Add(VariableName, vGlobal)
+               End With
+       End If
+
+Finally:
+       StoreValue = bStore
+       SF_Utils._ExitFunction(cstThisSub)
+       Exit Function
+Catch:
+       GoTo Finally
+End Function   &apos;  ScriptForge.SF_SharedMemory.StoreValue
+
+REM =========================================================== PRIVATE 
FUNCTIONS
+
+REM 
-----------------------------------------------------------------------------
+Private Function _ConvertValue(pvValue As Variant _
+                                                               , pbArray As 
Boolean _
+                                                               ) As Variant
+&apos;&apos;&apos;     Convert the input value to one of the types applicable
+&apos;&apos;&apos;     to shared memory constraints.
+&apos;&apos;&apos;     Args:
+&apos;&apos;&apos;             pvValue: the input value, must not be an array
+&apos;&apos;&apos;             pbArray: when True, pvValue is an item inside 
an array
+&apos;&apos;&apos;     Returns:
+&apos;&apos;&apos;             The converted value.
+&apos;&apos;&apos;             Empty when the conversion was not successful.
+
+Dim vGlobal As Variant                 &apos;  Return value
+Dim iObjectType As Integer             &apos;  The object type returned by 
_VarTypeObj()
+
+Try:
+       vGlobal = Empty
+       Select Case VarType(pvValue)
+               Case V_INTEGER, V_LONG, V_BIGINT
+                       vGlobal = CLng(pvValue)
+               Case V_SINGLE, V_DOUBLE, V_CURRENCY, V_DECIMAL
+                       vGlobal = CDbl(pvValue)
+               Case V_EMPTY, V_NULL
+                       vGlobal = Null
+               Case V_STRING, ScriptForge.V_BOOLEAN
+                       vGlobal = pvValue
+               Case V_DATE                                             &apos;  
No dates in arrays
+                       If Not pbArray Then vGlobal = pvValue
+               Case ScriptForge.V_OBJECT
+                       If Not pbArray Then                     &apos;  No 
objects in arrays
+                               iObjectType = 
SF_Utils._VarTypeObj(pvValue).iVarType
+                               Select Case iObjectType
+                                       Case ScriptForge.V_Nothing
+                                               vGlobal = Null
+                                       Case ScriptForge.V_UNOOBJECT, 
ScriptForge.V_SFOBJECT
+                                               vGlobal = pvValue
+                                       Case Else       &apos;  V_BASICOBJECT
+                               End Select
+                       End If
+               Case &gt;= ScriptForge.V_ARRAY          &apos;  No subarrays
+               Case Else
+       End Select
+
+Finally:
+       _ConvertValue = vGlobal
+       Exit Function
+End Function   &apos;  ScriptForge.SF_SharedMemory._ConvertValue
+
+REM =============================================== END OF 
SCRIPTFORGE.SF_SHAREDMEMORY
+</script:module>
\ No newline at end of file
diff --git a/wizards/source/scriptforge/python/scriptforge.py 
b/wizards/source/scriptforge/python/scriptforge.py
index eb1a39ad6809..3e21db3f114b 100644
--- a/wizards/source/scriptforge/python/scriptforge.py
+++ b/wizards/source/scriptforge/python/scriptforge.py
@@ -145,8 +145,9 @@ class ScriptForge(object, metaclass = _Singleton):
                             ('ScriptForge.Region', 4),
                             ('ScriptForge.Services', 5),
                             ('ScriptForge.Session', 6),
-                            ('ScriptForge.String', 7),
-                            ('ScriptForge.UI', 8)])
+                            ('ScriptForge.SharedMemory', 7),
+                            ('ScriptForge.String', 8),
+                            ('ScriptForge.UI', 9)])
 
     def __init__(self, hostname = '', port = 0, pipe = ''):
         """
@@ -1609,6 +1610,43 @@ class SFScriptForge:
         def WebService(self, uri):
             return self.ExecMethod(self.vbMethod, 'WebService', uri)
 
+    # #########################################################################
+    # SF_SharedMemory CLASS
+    # #########################################################################
+    class SF_SharedMemory(SFServices, metaclass = _Singleton):
+        """
+            Contains the mechanisms to manage persistent memory storage across 
Basic and/or Python scripts.
+
+            The SharedMemory service implements interfaces allowing to store 
both Basic and Python variables
+            in persistent storage, and to retrieve them later from either 
Basic or Python scripts interchangeably.
+            """
+        # Mandatory class properties for service registration
+        serviceimplementation = 'basic'
+        servicename = 'ScriptForge.SharedMemory'
+        servicesynonyms = ('sharedmemory', 'scriptforge.sharedmemory')
+        serviceproperties = dict()
+
+        def Exists(self, variablename):
+            return self.ExecMethod(self.vbMethod, 'Exists', variablename)
+
+        def ReadValue(self, variablename):
+            return self.ExecMethod(self.vbMethod + self.flgArrayRet, 
'ReadValue', variablename)
+
+        def Remove(self, variablename):
+            return self.ExecMethod(self.vbMethod, 'Remove', variablename)
+
+        def RemoveAll(self):
+            return self.ExecMethod(self.vbMethod, 'RemoveAll')
+
+        def StoreValue(self, value, variablename):
+            if isinstance(value, SFServices):
+                return self.ExecMethod(self.vbMethod + self.flgObject, 
'StoreValue',
+                                       value.objectreference, variablename)
+            if isinstance(value, datetime.datetime):
+                value = SFScriptForge.SF_Basic.CDateToUnoDateTime(value)
+                return self.ExecMethod(self.vbMethod + self.flgDateArg, 
'StoreValue', value, variablename)
+            return self.ExecMethod(self.vbMethod, 'StoreValue', value, 
variablename)
+
     # #########################################################################
     # SF_String CLASS
     # #########################################################################
@@ -3170,6 +3208,7 @@ L10N = SFScriptForge.SF_L10N
 PLATFORM = SFScriptForge.SF_Platform
 REGION = SFScriptForge.SF_Region
 SESSION = SFScriptForge.SF_Session
+SHAREDMEMORY = SFScriptForge.SF_SharedMemory
 STRING = SFScriptForge.SF_String
 TEXTSTREAM = SFScriptForge.SF_TextStream
 TIMER = SFScriptForge.SF_Timer
diff --git a/wizards/source/scriptforge/python/scriptforge.pyi 
b/wizards/source/scriptforge/python/scriptforge.pyi
index 1b7067bba499..1a4ed520047d 100644
--- a/wizards/source/scriptforge/python/scriptforge.pyi
+++ b/wizards/source/scriptforge/python/scriptforge.pyi
@@ -63,6 +63,7 @@ L10N = SFScriptForge.SF_L10N
 PLATFORM = SFScriptForge.SF_Platform
 REGION = SFScriptForge.SF_Region
 SESSION = SFScriptForge.SF_Session
+SHAREDMEMORY = SFScriptForge.SF_SharedMemory
 STRING = SFScriptForge.SF_String
 TEXTSTREAM = SFScriptForge.SF_TextStream
 TIMER = SFScriptForge.SF_Timer
@@ -1795,7 +1796,7 @@ class SFScriptForge:
 
         @classmethod
         def ExecuteBasicScript(
-            cls, scope: str = ..., script: str = ..., *args: Optional[Any]
+            cls, scope: Optional[str] = ..., script: str = ..., *args: 
Optional[Any]
         ) -> Any:
             """
                 Execute the Basic script given its name and location and fetch 
its result if any.
@@ -2035,6 +2036,85 @@ class SFScriptForge:
                         The web page content of the URI.
                 """
             ...
+
+    # #########################################################################
+    # SF_SharedMemory CLASS
+    # #########################################################################
+    class SF_SharedMemory(SFServices, metaclass = ...):
+        """
+            Contains the mechanisms to manage persistent memory storage across 
Basic and/or Python scripts.
+
+            The SharedMemory service implements interfaces allowing to store 
both Basic and Python variables
+            in persistent storage, and to retrieve them later from either 
Basic or Python scripts interchangeably.
+            """
+
+        def Exists(self, variablename: str) -> bool:
+            """
+                Returns whether the given name exists in the shared and 
persistent storage.
+                    Args
+                        ``variablename``: a case-sensitive name.
+                    Returns
+                        ``True`` when the name has been found.
+                """
+            ...
+
+        def ReadValue(self, variablename: str) -> Any:
+            """
+                Read in the shared and persistent storage area the requested 
value or array of values.
+                    Args
+                        ``variablename``: the case-sensitive name of the value 
to retrieve.
+                    Returns
+                        A scalar or a tuple of scalars. If ``variablename`` 
does not exist, an error is raised.
+                    Note
+                        If the returned value is a ``ScriptForge`` class 
instance, the user script can verify if the
+                        corresponding interface (dialog, document, ...) is 
still valid with its ``IsAlive`` property.
+                """
+            ...
+
+        def Remove(self, variablename: str) -> bool:
+            """
+                Remove the entry in the shared and persistent storage area 
corresponding with the given name.
+                    Args
+                        ``variablename``: the case-sensitive name of the 
variable to remove.
+                    Returns
+                        ``True`` when the name has been removed successfully.
+                """
+            ...
+
+        def RemoveAll(self) -> bool:
+            """
+                Remove the whole content of the shared and persistent storage 
area.
+                    Returns
+                        ``True`` when successful.
+                """
+            ...
+
+        def StoreValue(self,
+                       value: Union[Any | datetime.datetime | UNO, 
Tuple[Union[int, float, str, bool]]],
+                       variablename: str
+                       ) -> bool:
+            """
+                Store in the shared and persistent storage area the given 
value. Later retrieval will be done thanks
+                to the given variable name. If the given name already exists, 
its value is replaced without warning.
+                    Args
+                        ``value``: the value to be stored.
+                            The supported variable types are:
+                                * Scalar or tuple combining:
+                                    - int, within the bounds of the Basic Long 
type
+                                    - float, within the bounds of the Basic 
Double type
+                                    - str
+                                    - bool
+                                    - None
+                                * datetime.datetime
+                                * UNO object
+                                * ScriptForge class instance
+
+                        ``variablename``: the case-sensitive name to retrieve 
``value`` when needed.
+                    Returns
+                        ``True`` when successful
+                """
+            ...
+
     # #########################################################################
     # SF_String CLASS
     # #########################################################################
@@ -7713,6 +7793,8 @@ def CreateScriptService(service: Literal['region', 
'Region', 'ScriptForge.Region
 @overload
 def CreateScriptService(service: Literal['session', 'Session', 
'ScriptForge.Session']) -> SESSION: ...
 @overload
+def CreateScriptService(service: Literal['sharedmemory', 'SharedMemory', 
'ScriptForge.SharedMemory']) -> SHAREDMEMORY: ...
+@overload
 def CreateScriptService(service: Literal['string', 'String', 
'ScriptForge.String']) -> STRING: ...
 @overload
 def CreateScriptService(service: Literal['timer', 'Timer', 
'ScriptForge.Timer'], start: bool = False
diff --git a/wizards/source/scriptforge/script.xlb 
b/wizards/source/scriptforge/script.xlb
index 98570642b8e2..7c5f29231c27 100644
--- a/wizards/source/scriptforge/script.xlb
+++ b/wizards/source/scriptforge/script.xlb
@@ -1,23 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 
1.0//EN" "library.dtd">
 <library:library xmlns:library="http://openoffice.org/2000/library"; 
library:name="ScriptForge" library:readonly="false" 
library:passwordprotected="false">
- <library:element library:name="SF_Root"/>
- <library:element library:name="__License"/>
- <library:element library:name="SF_Region"/>
- <library:element library:name="SF_L10N"/>
- <library:element library:name="SF_String"/>
- <library:element library:name="_ModuleModel"/>
- <library:element library:name="SF_UI"/>
- <library:element library:name="SF_Services"/>
  <library:element library:name="SF_PythonHelper"/>
  <library:element library:name="SF_Platform"/>
  <library:element library:name="SF_Array"/>
  <library:element library:name="SF_TextStream"/>
  <library:element library:name="SF_Utils"/>
- <library:element library:name="SF_FileSystem"/>
+ <library:element library:name="SF_String"/>
+ <library:element library:name="_ModuleModel"/>
+ <library:element library:name="SF_SharedMemory"/>
+ <library:element library:name="SF_L10N"/>
+ <library:element library:name="SF_Region"/>
+ <library:element library:name="__License"/>
+ <library:element library:name="SF_Root"/>
  <library:element library:name="SF_Timer"/>
- <library:element library:name="SF_Session"/>
+ <library:element library:name="SF_FileSystem"/>
+ <library:element library:name="SF_Services"/>
+ <library:element library:name="SF_UI"/>
  <library:element library:name="SF_Exception"/>
  <library:element library:name="SF_Dictionary"/>
+ <library:element library:name="SF_Session"/>
  <library:element library:name="_CodingConventions"/>
 </library:library>
\ No newline at end of file

Reply via email to