formula/source/core/api/token.cxx                   |   81 ++++++++++-
 include/formula/token.hxx                           |   17 ++
 include/formula/tokenarray.hxx                      |    7 
 sc/qa/unit/data/functions/spreadsheet/fods/let.fods |  143 ++++++++++++++------
 sc/source/core/inc/interpre.hxx                     |    5 
 sc/source/core/tool/compiler.cxx                    |    2 
 sc/source/core/tool/interpr1.cxx                    |   92 ++++++------
 sc/source/core/tool/interpr4.cxx                    |    3 
 8 files changed, 250 insertions(+), 100 deletions(-)

New commits:
commit acc00651a64298d337c2e3fbe61f6e97318541ac
Author:     Balazs Varga <balazs.varga.ext...@allotropia.de>
AuthorDate: Mon Feb 24 17:07:27 2025 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Mar 6 15:09:03 2025 +0100

    Related: tdf#164997 - sc refactor and optimize LET function calculation
    
    Fix crash because of missing new svStringName from ConvertMatrixParameters
    
    Change-Id: Ifd3b67c5709476058412cddeae53b695a83cb5a9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182095
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Tested-by: Jenkins
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182334

diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index ec15ec351b77..5cedce9a176b 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -1478,6 +1478,7 @@ bool ScInterpreter::ConvertMatrixParameters()
             {
                 case svDouble:
                 case svString:
+                case svStringName:
                 case svSingleRef:
                 case svExternalSingleRef:
                 case svMissing:
commit b05bdbfefe04139c265744df829cae459497add0
Author:     Balazs Varga <balazs.varga.ext...@allotropia.de>
AuthorDate: Fri Feb 14 12:03:59 2025 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Mar 6 15:08:55 2025 +0100

    tdf#164997 - sc refactor and optimize LET function calculation
    
    With the original solution the embeded LET function into another
    functions caused unexpected error values.
    
    Such as: IFERROR(LET(...)...) gave error for non-error LET result
    
    Change-Id: I5f09a8771ce38492269cfeb567b9c3357cfd510c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181662
    Reviewed-by: Balazs Varga <balazs.varga.ext...@allotropia.de>
    Tested-by: Jenkins
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181764

diff --git a/formula/source/core/api/token.cxx 
b/formula/source/core/api/token.cxx
index 1167b3ebcd0d..10f91aad2450 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -789,6 +789,24 @@ FormulaToken* FormulaTokenArray::ReplaceToken( sal_uInt16 
nOffset, FormulaToken*
     }
 }
 
+FormulaToken* FormulaTokenArray::ReplaceRPNToken( sal_uInt16 nOffset, 
FormulaToken* t )
+{
+    if (nOffset < nRPN)
+    {
+        CheckToken(*t);
+        t->IncRef();
+        FormulaToken* p = pRPN[nOffset];
+        pRPN[nOffset] = t;
+        p->DecRef();    // may be dead now
+        return t;
+    }
+    else
+    {
+        t->DeleteIfZeroRef();
+        return nullptr;
+    }
+}
+
 sal_uInt16 FormulaTokenArray::RemoveToken( sal_uInt16 nOffset, sal_uInt16 
nCount )
 {
     if (nOffset < nLen)
@@ -888,6 +906,11 @@ FormulaToken* FormulaTokenArray::AddString( const 
svl::SharedString& rStr )
     return Add( new FormulaStringToken( rStr ) );
 }
 
+FormulaToken* FormulaTokenArray::AddStringName( const svl::SharedString& rStr )
+{
+    return Add( new FormulaStringNameToken( rStr ) );
+}
+
 FormulaToken* FormulaTokenArray::AddDouble( double fVal )
 {
     return Add( new FormulaDoubleToken( fVal ) );
@@ -1619,13 +1642,13 @@ void FormulaTokenArray::ReinternStrings( 
svl::SharedStringPool& rPool )
 
 /*----------------------------------------------------------------------*/
 
-FormulaTokenIterator::Item::Item(const FormulaTokenArray* pArray, short pc, 
short stop) :
-    pArr(pArray), nPC(pc), nStop(stop)
+FormulaTokenIterator::Item::Item(const FormulaTokenArray* pArray, short pc, 
short stop, bool lambda) :
+    pArr(pArray), nPC(pc), nStop(stop), bLambda(lambda)
 {
 }
 
 FormulaTokenIterator::FormulaTokenIterator( const FormulaTokenArray& rArr )
-    : maStack{ FormulaTokenIterator::Item(&rArr, -1, SHRT_MAX) }
+    : maStack{ FormulaTokenIterator::Item(&rArr, -1, SHRT_MAX, false) }
 {
 }
 
@@ -1635,7 +1658,7 @@ FormulaTokenIterator::~FormulaTokenIterator()
 
 void FormulaTokenIterator::Push( const FormulaTokenArray* pArr )
 {
-    FormulaTokenIterator::Item item(pArr, -1, SHRT_MAX);
+    FormulaTokenIterator::Item item(pArr, -1, SHRT_MAX, false);
 
     maStack.push_back(item);
 }
@@ -1645,12 +1668,23 @@ void FormulaTokenIterator::Pop()
     maStack.pop_back();
 }
 
+void FormulaTokenIterator::FrontPop()
+{
+    maStack.erase(maStack.begin());
+}
+
+void FormulaTokenIterator::Lambda(bool bOpt)
+{
+    maStack.back().bLambda = bOpt;
+}
+
 void FormulaTokenIterator::Reset()
 {
     while( maStack.size() > 1 )
         maStack.pop_back();
 
-    maStack.back().nPC = -1;
+    if (!maStack.back().bLambda)
+        maStack.back().nPC = -1;
 }
 
 FormulaToken* FormulaTokenArrayPlainIterator::GetNextName()
@@ -1669,12 +1703,12 @@ FormulaToken* 
FormulaTokenArrayPlainIterator::GetNextName()
 
 FormulaToken* FormulaTokenArrayPlainIterator::GetNextStringName()
 {
-    if (mpFTA->GetArray())
+    if (mpFTA->GetCode())
     {
-        while (mnIndex < mpFTA->GetLen())
+        while (mnIndex < mpFTA->GetCodeLen())
         {
-            FormulaToken* t = mpFTA->GetArray()[mnIndex++];
-            if (t->GetType() == svString && t->GetOpCode() == ocStringName)
+            FormulaToken* t = mpFTA->GetCode()[ mnIndex++ ];
+            if (t->GetType() == svStringName)
                 return t;
         }
     }
@@ -2000,6 +2034,35 @@ bool FormulaStringOpToken::operator==( const 
FormulaToken& r ) const
     return FormulaByteToken::operator==( r ) && maString == r.GetString();
 }
 
+FormulaStringNameToken::FormulaStringNameToken( svl::SharedString r ) :
+    FormulaToken( svStringName ), maString(std::move( r ))
+{
+}
+
+FormulaStringNameToken::FormulaStringNameToken( const FormulaStringNameToken& 
r ) :
+    FormulaToken( r ), maString( r.maString ) {
+}
+
+FormulaToken* FormulaStringNameToken::Clone() const
+{
+    return new FormulaStringNameToken(*this);
+}
+
+const svl::SharedString& FormulaStringNameToken::GetString() const
+{
+    return maString;
+}
+
+void FormulaStringNameToken::SetString( const svl::SharedString& rStr )
+{
+    maString = rStr;
+}
+
+bool FormulaStringNameToken::operator==( const FormulaToken& r ) const
+{
+    return FormulaToken::operator==( r ) && maString == r.GetString();
+}
+
 sal_uInt16  FormulaIndexToken::GetIndex() const             { return nIndex; }
 void        FormulaIndexToken::SetIndex( sal_uInt16 n )     { nIndex = n; }
 sal_Int16   FormulaIndexToken::GetSheet() const             { return mnSheet; }
diff --git a/include/formula/token.hxx b/include/formula/token.hxx
index 89043877a4fd..d497f8e5d3f7 100644
--- a/include/formula/token.hxx
+++ b/include/formula/token.hxx
@@ -50,6 +50,7 @@ enum StackVar : sal_uInt8
     svByte,
     svDouble,
     svString,
+    svStringName,
     svSingleRef,
     svDoubleRef,
     svMatrix,
@@ -93,6 +94,7 @@ inline std::string StackVarEnumToString(StackVar const e)
         case svByte:              return "Byte";
         case svDouble:            return "Double";
         case svString:            return "String";
+        case svStringName:        return "StringName";
         case svSingleRef:         return "SingleRef";
         case svDoubleRef:         return "DoubleRef";
         case svMatrix:            return "Matrix";
@@ -396,6 +398,21 @@ public:
     virtual bool operator==( const FormulaToken& rToken ) const override;
 };
 
+// FormulaStringNameToken
+class FORMULA_DLLPUBLIC FormulaStringNameToken final : public FormulaToken
+{
+    svl::SharedString maString;
+public:
+    FormulaStringNameToken(svl::SharedString r);
+    FormulaStringNameToken(const FormulaStringNameToken& r);
+
+    virtual FormulaToken* Clone() const override;
+    virtual const svl::SharedString& GetString() const override;
+    virtual void SetString(const svl::SharedString& rStr) override;
+    virtual bool operator==(const FormulaToken& rToken) const override;
+};
+
+
 class FORMULA_DLLPUBLIC FormulaIndexToken final : public FormulaToken
 {
 private:
diff --git a/include/formula/tokenarray.hxx b/include/formula/tokenarray.hxx
index 98e1f4dbb17b..320937844bfa 100644
--- a/include/formula/tokenarray.hxx
+++ b/include/formula/tokenarray.hxx
@@ -271,6 +271,7 @@ public:
                 token as well.
      */
     FormulaToken*           ReplaceToken( sal_uInt16 nOffset, FormulaToken*, 
ReplaceMode eMode );
+    FormulaToken*           ReplaceRPNToken( sal_uInt16 nOffset, FormulaToken* 
);
 
     /** Remove a sequence of tokens from pCode array, and pRPN array if the
         tokens are referenced there.
@@ -480,6 +481,7 @@ public:
     FormulaToken* AddToken( const FormulaToken& );
 
     FormulaToken* AddString( const svl::SharedString& rStr );
+    FormulaToken* AddStringName( const svl::SharedString& rStr );
     FormulaToken* AddDouble( double fVal );
     void          AddExternal( const sal_Unicode* pStr );
     /** Xcl import may play dirty tricks with OpCode!=ocExternal.
@@ -540,8 +542,9 @@ class FORMULA_DLLPUBLIC FormulaTokenIterator
         const FormulaTokenArray* pArr;
         short nPC;
         short nStop;
+        bool bLambda;
 
-        Item(const FormulaTokenArray* arr, short pc, short stop);
+        Item(const FormulaTokenArray* arr, short pc, short stop, bool lambda);
     };
 
     std::vector<Item> maStack;
@@ -572,6 +575,8 @@ public:
     void Jump( short nStart, short nNext, short nStop = SHRT_MAX );
     void Push( const FormulaTokenArray* );
     void Pop();
+    void FrontPop();
+    void Lambda( bool bOpt );
 
     /** Reconstruct the iterator afresh from a token array
     */
diff --git a/sc/qa/unit/data/functions/spreadsheet/fods/let.fods 
b/sc/qa/unit/data/functions/spreadsheet/fods/let.fods
index 9e13c4556ed3..06a390722a77 100644
--- a/sc/qa/unit/data/functions/spreadsheet/fods/let.fods
+++ b/sc/qa/unit/data/functions/spreadsheet/fods/let.fods
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<office:document 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:dc="http://purl.org/dc/elements/1.1/"; 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:ooow="http://openoffice.org/200
 4/writer" xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:xforms="http://www.w3.org/2002/xforms"; 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
 xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; xmlns
 :css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" 
office:version="1.3" 
office:mimetype="application/vnd.oasis.opendocument.spreadsheet">
- 
<office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT7H29M10S</meta:editing-duration><meta:editing-cycles>111</meta:editing-cycles><meta:generator>LibreOfficeDev/24.8.0.0.alpha1$Windows_X86_64
 
LibreOffice_project/38dff367d75365eb75c80c73385ec818f9a5aabd</meta:generator><dc:date>2024-06-11T09:22:21.072000000</dc:date><meta:document-statistic
 meta:table-count="2" meta:cell-count="351" 
meta:object-count="0"/></office:meta>
+<office:document 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:dc="http://purl.org/dc/elements/1.1/"; 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:ooow="http://openoffice.org/200
 4/writer" xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:xforms="http://www.w3.org/2002/xforms"; 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
 xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; xmlns
 :css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" 
office:version="1.4" 
office:mimetype="application/vnd.oasis.opendocument.spreadsheet">
+ 
<office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT7H32M50S</meta:editing-duration><meta:editing-cycles>112</meta:editing-cycles><meta:generator>LibreOfficeDev/25.8.0.0.alpha0$Windows_X86_64
 
LibreOffice_project/b0d4b4664a295631ce4d8dee2ceb5cd94ae12edb</meta:generator><dc:date>2025-02-14T10:53:13.361868000</dc:date><meta:document-statistic
 meta:table-count="2" meta:cell-count="367" 
meta:object-count="0"/></office:meta>
  <office:settings>
   <config:config-item-set config:name="ooo:view-settings">
    <config:config-item config:name="VisibleAreaTop" 
config:type="int">0</config:config-item>
@@ -30,13 +30,13 @@
        <config:config-item config:name="IgnoreBreakAfterMultilineField" 
config:type="boolean">false</config:config-item>
       </config:config-item-map-entry>
       <config:config-item-map-entry config:name="Sheet2">
-       <config:config-item config:name="CursorPositionX" 
config:type="int">7</config:config-item>
-       <config:config-item config:name="CursorPositionY" 
config:type="int">47</config:config-item>
+       <config:config-item config:name="CursorPositionX" 
config:type="int">9</config:config-item>
+       <config:config-item config:name="CursorPositionY" 
config:type="int">51</config:config-item>
        <config:config-item config:name="ActiveSplitRange" 
config:type="short">2</config:config-item>
        <config:config-item config:name="PositionLeft" 
config:type="int">0</config:config-item>
        <config:config-item config:name="PositionRight" 
config:type="int">0</config:config-item>
        <config:config-item config:name="PositionTop" 
config:type="int">0</config:config-item>
-       <config:config-item config:name="PositionBottom" 
config:type="int">0</config:config-item>
+       <config:config-item config:name="PositionBottom" 
config:type="int">12</config:config-item>
        <config:config-item config:name="ZoomType" 
config:type="short">0</config:config-item>
        <config:config-item config:name="ZoomValue" 
config:type="int">75</config:config-item>
        <config:config-item config:name="PageViewZoomValue" 
config:type="int">60</config:config-item>
@@ -48,7 +48,7 @@
       </config:config-item-map-entry>
      </config:config-item-map-named>
      <config:config-item config:name="ActiveTable" 
config:type="string">Sheet1</config:config-item>
-     <config:config-item config:name="HorizontalScrollbarWidth" 
config:type="int">2495</config:config-item>
+     <config:config-item config:name="HorizontalScrollbarWidth" 
config:type="int">1851</config:config-item>
      <config:config-item config:name="ZoomType" 
config:type="short">0</config:config-item>
      <config:config-item config:name="ZoomValue" 
config:type="int">75</config:config-item>
      <config:config-item config:name="PageViewZoomValue" 
config:type="int">60</config:config-item>
@@ -59,7 +59,7 @@
      <config:config-item config:name="ShowFormulasMarks" 
config:type="boolean">false</config:config-item>
      <config:config-item config:name="ShowGrid" 
config:type="boolean">true</config:config-item>
      <config:config-item config:name="GridColor" 
config:type="int">12632256</config:config-item>
-     <config:config-item config:name="FormulaBarHeight" 
config:type="short">1</config:config-item>
+     <config:config-item config:name="ShowPageBreaks" 
config:type="boolean">true</config:config-item>
      <config:config-item config:name="HasColumnRowHeaders" 
config:type="boolean">true</config:config-item>
      <config:config-item config:name="HasSheetTabs" 
config:type="boolean">true</config:config-item>
      <config:config-item config:name="IsOutlineSymbolsSet" 
config:type="boolean">true</config:config-item>
@@ -71,6 +71,7 @@
      <config:config-item config:name="RasterSubdivisionX" 
config:type="int">1</config:config-item>
      <config:config-item config:name="RasterSubdivisionY" 
config:type="int">1</config:config-item>
      <config:config-item config:name="IsRasterAxisSynchronized" 
config:type="boolean">true</config:config-item>
+     <config:config-item config:name="FormulaBarHeight" 
config:type="short">1</config:config-item>
      <config:config-item config:name="AnchoredTextOverflowLegacy" 
config:type="boolean">false</config:config-item>
      <config:config-item config:name="LegacySingleLineFontwork" 
config:type="boolean">false</config:config-item>
      <config:config-item config:name="ConnectorUseSnapRect" 
config:type="boolean">false</config:config-item>
@@ -110,7 +111,7 @@
    <config:config-item config:name="LoadReadonly" 
config:type="boolean">false</config:config-item>
    <config:config-item config:name="PrinterName" 
config:type="string">Microsoft Print to PDF</config:config-item>
    <config:config-item config:name="PrinterPaperFromSetup" 
config:type="boolean">false</config:config-item>
-   <config:config-item config:name="PrinterSetup" 
config:type="base64Binary">ZBb+/01pY3Jvc29mdCBQcmludCB0byBQREYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATWljcm9zb2Z0IFByaW50IFRvIFBERgAAAAAAAAAAAAAWAAEANhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAMG3ABQFAMvAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDIACQDLBE/XXt+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAFNNVEoAAAAAEAC4AHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAsEQAAVjRETQEAAAAAAAAAnApwIhwAAADsAAAAAwAAAPoBTwg05ndNg+4HSBfANYHQAAAATAAAAAMAAAAACAAAAAAAAAAAAAADAAAAAAgAACoAAAAACAAAAwAAAEAAAABWAAAAABAAAEQAbwBjAHUAbQBlAG4AdABVAHMAZQByAFAAYQBzAHMAdwBvAHIAZAAAAEQAbwBjAHUAbQBlAG4AdABPAHcAbgBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AEMAcgB5AHAAdABTA
 
GUAYwB1AHIAaQB0AHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgBDT01QQVRfRFVQTEVYX01PREUTAER1cGxleE1vZGU6OlVua25vd24MAFBSSU5URVJfTkFNRRYATWljcm9zb2Z0IFByaW50IHRvIFBERgsARFJJVkVSX05BTUUWAE1pY3Jvc29mdCBQcmludCBUbyBQREY=</config:config-item>
+   <config:config-item config:name="PrinterSetup" 
config:type="base64Binary">bBb+/01pY3Jvc29mdCBQcmludCB0byBQREYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATWljcm9zb2Z0IFByaW50IFRvIFBERgAAAAAAAAAAAAAWAAEAPhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAMG3ABYFAMtAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDQACwDLBHiXo1TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAABkAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAFNNVEoAAAAAEADAAHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwRAABWNERNAQAAAAAAAACcCnAiHAAAAOwAAAADAAAA+gFPCDTmd02D7gdIF8A1gdAAAABMAAAAAwAAAAAIAAAAAAAAAAAAAAMAAAAACAAAKgAAAAAIAAADAAAAQAAAAFYAAAAAEAAARABvAGMAdQBtAGUAbgB0AFUAcwBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AE8AdwBuAGUAcgBQAGEAcwBzAHcAbwByAGQAAABEAG8AYwB1AG0AZQBuAHQAQwByA
 
HkAcAB0AFMAZQBjAHUAcgBpAHQAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAENPTVBBVF9EVVBMRVhfTU9ERRMARHVwbGV4TW9kZTo6VW5rbm93bgwAUFJJTlRFUl9OQU1FFgBNaWNyb3NvZnQgUHJpbnQgdG8gUERGCwBEUklWRVJfTkFNRRYATWljcm9zb2Z0IFByaW50IFRvIFBERg==</config:config-item>
    <config:config-item config:name="RasterIsVisible" 
config:type="boolean">false</config:config-item>
    <config:config-item config:name="RasterResolutionX" 
config:type="int">1270</config:config-item>
    <config:config-item config:name="RasterResolutionY" 
config:type="int">1270</config:config-item>
@@ -3039,33 +3040,33 @@
   <number:boolean-style style:name="N99">
    <number:boolean/>
   </number:boolean-style>
-  <style:style style:name="ce13" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce10" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties fo:wrap-option="no-wrap"/>
    <style:text-properties fo:font-size="20pt" fo:font-weight="bold" 
style:font-size-asian="20pt" style:font-weight-asian="bold" 
style:font-size-complex="20pt" style:font-weight-complex="bold"/>
   </style:style>
-  <style:style style:name="ce16" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce11" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:text-properties fo:font-size="14pt" fo:font-weight="bold" 
style:font-size-asian="14pt" style:font-weight-asian="bold" 
style:font-size-complex="14pt" style:font-weight-complex="bold"/>
   </style:style>
-  <style:style style:name="ce20" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce12" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:text-properties fo:font-size="12pt" fo:font-weight="bold" 
style:font-size-asian="12pt" style:font-weight-asian="bold" 
style:font-size-complex="12pt" style:font-weight-complex="bold"/>
   </style:style>
-  <style:style style:name="ce22" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
+  <style:style style:name="ce14" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:map style:condition="cell-content()=&quot;&quot;" 
style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce23" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce21" style:family="table-cell" 
style:parent-style-name="Default">
    <style:map style:condition="cell-content()=&quot;&quot;" 
style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce24" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce25" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" 
style:font-weight-complex="bold"/>
@@ -3073,42 +3074,42 @@
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce27" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
+  <style:style style:name="ce26" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
    <style:map style:condition="cell-content()=&quot;&quot;" 
style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce28" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce29" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
   </style:style>
-  <style:style style:name="ce10" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce13" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties fo:wrap-option="no-wrap"/>
    <style:text-properties fo:font-size="20pt" fo:font-weight="bold" 
style:font-size-asian="20pt" style:font-weight-asian="bold" 
style:font-size-complex="20pt" style:font-weight-complex="bold"/>
   </style:style>
-  <style:style style:name="ce11" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce16" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:text-properties fo:font-size="14pt" fo:font-weight="bold" 
style:font-size-asian="14pt" style:font-weight-asian="bold" 
style:font-size-complex="14pt" style:font-weight-complex="bold"/>
   </style:style>
-  <style:style style:name="ce12" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce20" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:text-properties fo:font-size="12pt" fo:font-weight="bold" 
style:font-size-asian="12pt" style:font-weight-asian="bold" 
style:font-size-complex="12pt" style:font-weight-complex="bold"/>
   </style:style>
-  <style:style style:name="ce14" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
+  <style:style style:name="ce22" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:map style:condition="cell-content()=&quot;&quot;" 
style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce21" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce23" style:family="table-cell" 
style:parent-style-name="Default">
    <style:map style:condition="cell-content()=&quot;&quot;" 
style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce25" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce24" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
    <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" 
style:font-weight-complex="bold"/>
@@ -3116,12 +3117,12 @@
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce26" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
+  <style:style style:name="ce27" style:family="table-cell" 
style:parent-style-name="Default" style:data-style-name="N99">
    <style:map style:condition="cell-content()=&quot;&quot;" 
style:apply-style-name="Default" style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=1" style:apply-style-name="true" 
style:base-cell-address="Sheet1.B3"/>
    <style:map style:condition="cell-content()=0" 
style:apply-style-name="false" style:base-cell-address="Sheet1.B3"/>
   </style:style>
-  <style:style style:name="ce29" style:family="table-cell" 
style:parent-style-name="Default">
+  <style:style style:name="ce28" style:family="table-cell" 
style:parent-style-name="Default">
    <style:table-cell-properties style:text-align-source="fix" 
style:repeat-content="false"/>
    <style:paragraph-properties fo:text-align="center" fo:margin-left="0cm"/>
   </style:style>
@@ -3204,7 +3205,7 @@
      
<text:p><text:sheet-name>???</text:sheet-name><text:s/>(<text:title>???</text:title>)</text:p>
     </style:region-left>
     <style:region-right>
-     <text:p><text:date style:data-style-name="N2" 
text:date-value="2024-06-11">0000.00.00</text:date>, <text:time 
style:data-style-name="N2" 
text:time-value="09:19:41.184000000">00:00:00</text:time></text:p>
+     <text:p><text:date style:data-style-name="N2" 
text:date-value="2025-02-14">0000.00.00</text:date>, <text:time 
style:data-style-name="N2" 
text:time-value="10:49:33.518964500">00:00:00</text:time></text:p>
     </style:region-right>
    </style:header>
    <style:header-left style:display="false"/>
@@ -3221,10 +3222,10 @@
    <table:calculation-settings table:automatic-find-labels="false" 
table:use-regular-expressions="false" table:use-wildcards="true"/>
    <table:table table:name="Sheet1" table:style-name="ta1">
     <table:table-column table:style-name="co1" 
table:default-cell-style-name="Default"/>
-    <table:table-column table:style-name="co2" 
table:default-cell-style-name="ce21"/>
+    <table:table-column table:style-name="co2" 
table:default-cell-style-name="ce23"/>
     <table:table-column table:style-name="co3" 
table:default-cell-style-name="Default"/>
     <table:table-row table:style-name="ro1">
-     <table:table-cell table:style-name="ce10" office:value-type="string" 
calcext:value-type="string">
+     <table:table-cell table:style-name="ce13" office:value-type="string" 
calcext:value-type="string">
       <text:p>LET Function</text:p>
      </table:table-cell>
      <table:table-cell table:style-name="Default"/>
@@ -3236,10 +3237,10 @@
      <table:table-cell/>
     </table:table-row>
     <table:table-row table:style-name="ro3">
-     <table:table-cell table:style-name="ce11" office:value-type="string" 
calcext:value-type="string">
+     <table:table-cell table:style-name="ce16" office:value-type="string" 
calcext:value-type="string">
       <text:p>Result</text:p>
      </table:table-cell>
-     <table:table-cell table:style-name="ce14" 
table:formula="of:=AND([.B8:.B95])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+     <table:table-cell table:style-name="ce22" 
table:formula="of:=AND([.B8:.B95])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
       <text:p>IGAZ</text:p>
      </table:table-cell>
      <table:table-cell/>
@@ -3248,13 +3249,13 @@
      <table:table-cell table:number-columns-repeated="3"/>
     </table:table-row>
     <table:table-row table:style-name="ro4">
-     <table:table-cell table:style-name="ce12" office:value-type="string" 
calcext:value-type="string">
+     <table:table-cell table:style-name="ce20" office:value-type="string" 
calcext:value-type="string">
       <text:p>Sheet</text:p>
      </table:table-cell>
-     <table:table-cell table:style-name="ce25" office:value-type="string" 
calcext:value-type="string">
+     <table:table-cell table:style-name="ce24" office:value-type="string" 
calcext:value-type="string">
       <text:p>Result</text:p>
      </table:table-cell>
-     <table:table-cell table:style-name="ce12" office:value-type="string" 
calcext:value-type="string">
+     <table:table-cell table:style-name="ce20" office:value-type="string" 
calcext:value-type="string">
       <text:p>Description</text:p>
      </table:table-cell>
     </table:table-row>
@@ -3262,16 +3263,16 @@
      <table:table-cell office:value-type="float" office:value="2" 
calcext:value-type="float">
       <text:p>2</text:p>
      </table:table-cell>
-     <table:table-cell table:style-name="ce14" 
table:formula="of:=AND([Sheet2.I2:.I211])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+     <table:table-cell table:style-name="ce22" 
table:formula="of:=AND([Sheet2.I2:.I211])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
       <text:p>IGAZ</text:p>
      </table:table-cell>
-     <table:table-cell table:style-name="ce29" office:value-type="string" 
calcext:value-type="string">
+     <table:table-cell table:style-name="ce28" office:value-type="string" 
calcext:value-type="string">
       <text:p>Simple LET formulas with local references and values</text:p>
      </table:table-cell>
     </table:table-row>
     <table:table-row table:style-name="ro2" table:number-rows-repeated="20">
      <table:table-cell/>
-     <table:table-cell table:style-name="ce26"/>
+     <table:table-cell table:style-name="ce27"/>
      <table:table-cell/>
     </table:table-row>
     <table:table-row table:style-name="ro2" table:number-rows-repeated="21">
@@ -4672,15 +4673,75 @@
      <table:table-cell table:style-name="ce37"/>
      <table:table-cell table:number-columns-repeated="27"/>
     </table:table-row>
-    <table:table-row table:style-name="ro2" table:number-rows-repeated="2">
-     <table:table-cell table:style-name="ce17"/>
+    <table:table-row table:style-name="ro2">
+     <table:table-cell table:style-name="ce17" 
table:formula="of:=IFERROR(COM.MICROSOFT.LET(_xlpm.a_1;1;_xlpm.a_1);&quot;ERROR&quot;)"
 office:value-type="float" office:value="1" calcext:value-type="float">
+      <text:p>1</text:p>
+     </table:table-cell>
      <table:table-cell table:number-columns-repeated="3"/>
-     <table:table-cell table:style-name="ce17"/>
+     <table:table-cell table:style-name="ce17" office:value-type="float" 
office:value="1" calcext:value-type="float">
+      <text:p>1</text:p>
+     </table:table-cell>
      <table:table-cell table:number-columns-repeated="3"/>
-     <table:table-cell table:style-name="ce37"/>
-     <table:table-cell table:number-columns-repeated="27"/>
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=([.A49]=[.E49])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>IGAZ</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A49])" 
office:value-type="string" 
office:string-value="=IFERROR(LET(a_1;1;a_1);&quot;ERROR&quot;)" 
calcext:value-type="string">
+      <text:p>=IFERROR(LET(a_1;1;a_1);&quot;ERROR&quot;)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="26"/>
     </table:table-row>
-    <table:table-row table:style-name="ro2" table:number-rows-repeated="3">
+    <table:table-row table:style-name="ro2">
+     <table:table-cell table:style-name="ce17" 
table:formula="of:=SUM(COM.MICROSOFT.LET(_xlpm.a_1;SUM(5;4);_xlpm.a_1);2)" 
office:value-type="float" office:value="11" calcext:value-type="float">
+      <text:p>11</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="3"/>
+     <table:table-cell table:style-name="ce17" office:value-type="float" 
office:value="11" calcext:value-type="float">
+      <text:p>11</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="3"/>
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=([.A50]=[.E50])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>IGAZ</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A50])" 
office:value-type="string" office:string-value="=SUM(LET(a_1;SUM(5;4);a_1);2)" 
calcext:value-type="string">
+      <text:p>=SUM(LET(a_1;SUM(5;4);a_1);2)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="26"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro2">
+     <table:table-cell 
table:formula="of:=COM.MICROSOFT.LET(_xlpm.a_1;1;_xlpm.a_1)" 
office:value-type="float" office:value="1" calcext:value-type="float">
+      <text:p>1</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="3"/>
+     <table:table-cell office:value-type="float" office:value="1" 
calcext:value-type="float">
+      <text:p>1</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="3"/>
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=([.A51]=[.E51])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>IGAZ</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A51])" 
office:value-type="string" office:string-value="=LET(a_1;1;a_1)" 
calcext:value-type="string">
+      <text:p>=LET(a_1;1;a_1)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="26"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro2">
+     <table:table-cell table:formula="of:=COM.MICROSOFT.LET(_xlpm.avg; 
AVERAGE([.O2:.R2]); IF(_xlpm.avg&gt;249; &quot;Excellent&quot;; &quot;No 
good&quot;))" office:value-type="string" office:string-value="No good" 
calcext:value-type="string">
+      <text:p>No good</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="3"/>
+     <table:table-cell office:value-type="string" calcext:value-type="string">
+      <text:p>No good</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="3"/>
+     <table:table-cell table:style-name="ce37" 
table:formula="of:=([.A52]=[.E52])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>IGAZ</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A52])" 
office:value-type="string" office:string-value="=LET(avg; AVERAGE(O2:R2); 
IF(avg&gt;249; &quot;Excellent&quot;; &quot;No good&quot;))" 
calcext:value-type="string">
+      <text:p>=LET(avg; AVERAGE(O2:R2); IF(avg&gt;249; &quot;Excellent&quot;; 
&quot;No good&quot;))</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="26"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro2">
      <table:table-cell table:number-columns-repeated="8"/>
      <table:table-cell table:style-name="ce37"/>
      <table:table-cell table:number-columns-repeated="27"/>
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 1630e8c6b794..e0b99568324c 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -516,9 +516,10 @@ private:
     sc::RangeMatrix GetRangeMatrix();
 
     // Get tokens at specific parameters for LET (lambda) function
-    void getTokensAtParameter( std::unique_ptr<ScTokenArray>& pTokens, short 
nPos );
     static void replaceNamesToResult( const std::unordered_map<OUString, 
formula::FormulaToken*>& rResultIndexes,
-        std::unique_ptr<ScTokenArray>& pTokens );
+        std::unique_ptr<ScTokenArray>& pTokens, short nStartPos, short nEndPos 
);
+    std::unique_ptr<ScTokenArray> checkPushTokens( const 
std::unique_ptr<ScTokenArray>& pTokens,
+        short nStartPos, short nEndPos );
 
     void ScTableOp();                                       // repeated 
operations
 
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 9fffacba570f..8d925b7e909c 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -5158,7 +5158,7 @@ ScRangeData* ScCompiler::GetRangeData( const 
FormulaToken& rToken ) const
 bool ScCompiler::HandleStringName()
 {
     ScTokenArray* pNew = new ScTokenArray(rDoc);
-    pNew->AddString(mpToken->GetString());
+    pNew->AddStringName(mpToken->GetString());
     PushTokenArray(pNew, true);
     return GetToken();
 }
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 2b6d990570bd..80dea68bb357 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -8975,44 +8975,34 @@ void ScInterpreter::ScUnique()
     }
 }
 
-void ScInterpreter::getTokensAtParameter( std::unique_ptr<ScTokenArray>& 
pTokens, short nPos )
+void ScInterpreter::replaceNamesToResult( const std::unordered_map<OUString, 
formula::FormulaToken*>& rResultIndexes,
+    std::unique_ptr<ScTokenArray>& pTokens, short nStartPos, short nEndPos )
 {
-    sal_uInt16 nOpen = 0;
-    sal_uInt16 nSepCount = 0;
-    formula::FormulaTokenArrayPlainIterator aIter(*pArr);
-    formula::FormulaToken* t = aIter.First();
-    for (t = aIter.NextNoSpaces(); t; t = aIter.NextNoSpaces())
+    formula::FormulaTokenArrayPlainIterator aIterResult(*pTokens);
+    aIterResult.Jump(nStartPos + 1);
+    for (FormulaToken* t = aIterResult.GetNextStringName(); t; t = 
aIterResult.GetNextStringName())
     {
-        OpCode aOpCode = t->GetOpCode();
-        formula::StackVar aIntType = t->GetType();
-        if ((aOpCode == ocOpen || aOpCode == ocArrayOpen || aOpCode == 
ocTableRefOpen) && aIntType == formula::StackVar::svSep)
-            nOpen++;
-        else if ((aOpCode == ocClose || aOpCode == ocArrayClose || aOpCode == 
ocTableRefClose) && aIntType == formula::StackVar::svSep)
-            nOpen--;
-        else if (aOpCode == ocSep && aIntType == formula::StackVar::svSep && 
nOpen == 1)
-        {
-            nSepCount++;
-            continue;
-        }
-
-        if (nSepCount == nPos && nOpen > 0)
-        {
-            pTokens->AddToken(*t->Clone());
-        }
+        if (aIterResult.GetIndex() > nEndPos)
+            break;
+        auto iRes = rResultIndexes.find(t->GetString().getString());
+        if (iRes != rResultIndexes.end())
+            pTokens->ReplaceRPNToken(aIterResult.GetIndex() - 1, 
iRes->second->Clone());
     }
 }
 
-void ScInterpreter::replaceNamesToResult(const std::unordered_map<OUString, 
formula::FormulaToken*>& rResultIndexes,
-    std::unique_ptr<ScTokenArray>& pTokens )
+std::unique_ptr<ScTokenArray> ScInterpreter::checkPushTokens(const 
std::unique_ptr<ScTokenArray>& pTokens, short nStartPos, short nEndPos)
 {
     formula::FormulaTokenArrayPlainIterator aIterResult(*pTokens);
-    for (FormulaToken* t = aIterResult.GetNextStringName(); t; t = 
aIterResult.GetNextStringName())
+    aIterResult.Jump(nStartPos + 1);
+    unique_ptr<ScTokenArray> pTempTokens(new ScTokenArray(mrDoc));
+    for (FormulaToken* t = aIterResult.NextRPN(); t; t = aIterResult.NextRPN())
     {
-        auto iRes = rResultIndexes.find(t->GetString().getString());
-        if (iRes != rResultIndexes.end())
-            pTokens->ReplaceToken(aIterResult.GetIndex() - 1, 
iRes->second->Clone(),
-                FormulaTokenArray::ReplaceMode::CODE_ONLY);
+        if (aIterResult.GetIndex() > nEndPos)
+            break;
+
+        pTempTokens->AddToken(*t->Clone());
     }
+    return pTempTokens;
 }
 
 void ScInterpreter::ScLet()
@@ -9031,7 +9021,8 @@ void ScInterpreter::ScLet()
     OUString aStrName;
     std::unordered_map<OUString, formula::FormulaToken*> nResultIndexes;
     formula::FormulaTokenArrayPlainIterator aIter(*pArr);
-    unique_ptr<ScTokenArray> pValueTokens(new ScTokenArray(mrDoc));
+    // clone tokens for replacing string name tokens
+    unique_ptr<ScTokenArray> pValueTokens = pArr->Clone();
 
     // name and function pairs parameter
     while (nJumpCount > 1)
@@ -9054,17 +9045,21 @@ void ScInterpreter::ScLet()
         }
         nJumpCount--;
 
-        // get value tokens
-        getTokensAtParameter(pValueTokens, nOrgJumpCount - nJumpCount);
-        nJumpCount--;
-
         // replace names with result tokens
-        replaceNamesToResult(nResultIndexes, pValueTokens);
+        replaceNamesToResult(nResultIndexes, pValueTokens, pJump[nOrgJumpCount 
- nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1]);
+
+        unique_ptr<ScTokenArray> pTempTokens = checkPushTokens(pValueTokens, 
pJump[nOrgJumpCount - nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1]);
 
         // calculate the inner results unless we already have a push result 
token
-        if (pValueTokens->GetLen() == 1 && 
pValueTokens->GetArray()[0]->GetOpCode() == ocPush)
+        if (pTempTokens->GetLen() == 0)
+        {
+            PushIllegalParameter();
+            aCode.Jump(pJump[nOrgJumpCount], pJump[nOrgJumpCount]);
+            return;
+        }
+        else if (pTempTokens->GetLen() == 1 && 
pTempTokens->GetArray()[0]->GetOpCode() == ocPush)
         {
-            if (!nResultIndexes.insert(std::make_pair(aStrName, 
pValueTokens->GetArray()[0]->Clone())).second)
+            if (!nResultIndexes.insert(std::make_pair(aStrName, 
pTempTokens->GetArray()[0]->Clone())).second)
             {
                 PushIllegalParameter();
                 aCode.Jump(pJump[nOrgJumpCount], pJump[nOrgJumpCount]);
@@ -9073,11 +9068,15 @@ void ScInterpreter::ScLet()
         }
         else
         {
-            ScCompiler aComp(mrDoc, aPos, *pValueTokens, mrDoc.GetGrammar(), 
false, false, &mrContext);
-            aComp.CompileTokenArray();
             ScInterpreter aInt(mrDoc.GetFormulaCell(aPos), mrDoc, mrContext, 
aPos, *pValueTokens);
+            aInt.aCode.Jump(pJump[nOrgJumpCount - nJumpCount], 
pJump[nOrgJumpCount - nJumpCount + 1], pJump[nOrgJumpCount - nJumpCount + 1]);
+            while (aInt.aCode.HasStacked())
+                aInt.aCode.FrontPop();
+            aInt.aCode.Lambda(true);
+
             sfx2::LinkManager aNewLinkMgr(mrDoc.GetDocumentShell());
             aInt.SetLinkManager(&aNewLinkMgr);
+
             formula::StackVar aIntType = aInt.Interpret();
 
             if (aIntType == formula::svMatrixCell)
@@ -9101,20 +9100,20 @@ void ScInterpreter::ScLet()
                 }
             }
         }
-        pValueTokens->Clear();
+        nJumpCount--;
     }
 
     // last parameter: calculation
-    getTokensAtParameter(pValueTokens, nOrgJumpCount - nJumpCount);
-    nJumpCount--;
-
     // replace names with result tokens
-    replaceNamesToResult(nResultIndexes, pValueTokens);
+    replaceNamesToResult(nResultIndexes, pValueTokens, pJump[nOrgJumpCount - 
nJumpCount], pJump[nOrgJumpCount - nJumpCount + 1]);
 
     // calculate the final result
-    ScCompiler aComp(mrDoc, aPos, *pValueTokens, mrDoc.GetGrammar(), false, 
false, &mrContext);
-    aComp.CompileTokenArray();
     ScInterpreter aInt(mrDoc.GetFormulaCell(aPos), mrDoc, mrContext, aPos, 
*pValueTokens);
+    aInt.aCode.Jump(pJump[nOrgJumpCount - nJumpCount], pJump[nOrgJumpCount - 
nJumpCount + 1], pJump[nOrgJumpCount - nJumpCount + 1]);
+    while (aInt.aCode.HasStacked())
+        aInt.aCode.FrontPop();
+    aInt.aCode.Lambda(true);
+
     sfx2::LinkManager aNewLinkMgr(mrDoc.GetDocumentShell());
     aInt.SetLinkManager(&aNewLinkMgr);
     formula::StackVar aIntType = aInt.Interpret();
@@ -9137,6 +9136,7 @@ void ScInterpreter::ScLet()
         }
     }
 
+    nJumpCount--;
     pValueTokens.reset();
     aCode.Jump(pJump[nOrgJumpCount], pJump[nOrgJumpCount]);
 }
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index fcc58c364ec4..ec15ec351b77 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -827,6 +827,7 @@ const svl::SharedString & ScInterpreter::PopString()
                 nGlobalError = p->GetError();
                 break;
             case svString:
+            case svStringName:
                 return p->GetString();
             case svEmptyCell:
             case svMissing:
@@ -2383,6 +2384,7 @@ svl::SharedString ScInterpreter::GetString()
             return GetStringFromDouble( PopDouble() );
         }
         case svString:
+        case svStringName:
             return PopString();
         case svSingleRef:
         {

Reply via email to