CN108664241B - 一种将SysML模型进行仿真验证的方法 - Google Patents
一种将SysML模型进行仿真验证的方法 Download PDFInfo
- Publication number
- CN108664241B CN108664241B CN201810367004.1A CN201810367004A CN108664241B CN 108664241 B CN108664241 B CN 108664241B CN 201810367004 A CN201810367004 A CN 201810367004A CN 108664241 B CN108664241 B CN 108664241B
- Authority
- CN
- China
- Prior art keywords
- value
- diagram
- model
- activity
- tag
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/34—Graphical or visual programming
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明公开了一种将SysML模型进行仿真验证的方法,涉及到的具体步骤包括:(1)定义SysML模块定义图以及活动图元素到Modelica模型元素的转换规则;(2)以模块定义图的XMI文档为输入进行解析,获取模块定义图中模块以及模块的值属性信息;(3)以活动图的XMI文档为输入进行解析,获取活动图活动分区、活动参数、节点以及边的信息;(4)根据转换规则将获取的SysML活动图和模块定义图的信息转换成Modelica模型;(5)将转换后的Modelica模型导入仿真工具,根据活动图中决定节点上的条件表达式和所覆盖分支上的监值确定仿真参数,之后进行仿真验证。本发明通过对SysML模型进行仿真验证,可以在早期的开发阶段对系统特定的业务需求进行验证,从而及早发现错误并修正。
Description
技术领域
本发明属于软件模型验证领域,具体涉及将SysML模块定义图和活动图转换为Modelica模型并利用OpenModelica进行仿真的方法,通过对早期的SysML模型进行仿真来验证系统的业务逻辑。
背景技术
随着现代软件系统的复杂程度不断递增,系统建模过程变得更加复杂和难以把握。除此之外,如何在系统开发早期阶段对系统的抽象模型进行分析验证也成为了一个研究的难点。
基于模型的开发技术优点之一就是可以利用各种方法进行软件正确性和可靠性验证。常见的方法可以分为仿真验证和形式化验证,其中形式化验证方法又可以分为定理证明和模型检测。定理证明是构建一个形式化的公理系统,包括推理规则。使用严格的推导证明来验证软件的正确性。定理证明推导过程中虽然一部分可以做到自动化,但在多数情况下还是需要人工的参与。因此,它不适合用于大型软件系统的性质验证。模型检测是比较常用的方法,通过穷尽系统状态空间进行相关性质的检验,但它的主要难点在于解决状态空间爆炸的问题。仿真验证是相对简便有效的方法,通过对系统模型仿真并分析仿真结果来验证系统性质。Simulink被广泛用来对系统模型进行仿真,其方法是建立严格的数学模型。它是根据控制工程中数据流转换的规律来建模、仿真,需要对模型进行手工推导和分解。这无疑增加的了系统验证时的工作难度,而且效率较低。基于Modelica语言的建模与仿真可以利用微分方程组对系统的行为进行描述并实现仿真运行,支持面向对象、非因果的连续与离散混合建模仿真。另外,相对于Simulink,Modelica基于方程的非因果建模仿真可以将使用者从繁琐的推理和分解工作中解脱出来。因此,使用Modelica进行仿真是一个较为有效的方法。
SysML是一种表意丰富的图形化语言,可以对系统的结构和行为进行详细地描述。但是SysML模型无法直接进行仿真验证,因此,通过将SysML模型转换成Modelica模型进行仿真验证可以在早期的开发阶段对系统特定的业务需求进行验证,从而及早发现错误并修正。
发明内容
本发明的目的是提供一种将SysML模块定义图和活动图转换成Modelica模型进行仿真的方法;首先定义SysML模块定义图以及活动图元素到Modelica模型元素的转换规则;然后以模块定义图和活动图的XMI文档为输入,解析文档获取模块定义图和活动图的基本元素信息;接着根据模块定义图和活动图中元素与Modelica模型中元素的转换规则进行模型转换;最后将转换后的Modelica模型导入工具OpenModelica中进行仿真验证。
实现本发明目的的具体技术方案是:
一种将SysML模型进行仿真验证的方法,该方法包括以下具体步骤:
步骤1:定义SysML模块定义图以及活动图元素到Modelica模型元素的转换规则;
步骤2:以模块定义图的XMI文档为输入进行解析,获取模块定义图中基本元素即模块(block)以及模块的值属性信息;
步骤3:以活动图的XMI文档为输入进行解析,获取活动图基本元素即活动分区、活动参数、节点以及边的信息;
步骤4:根据转换规则将获取的SysML活动图和模块定义图的基本元素转换成Modelica模型中的元素;
步骤5:将转换后的Modelica模型导入仿真工具,根据活动图中决定节点上的条件表达式确定仿真参数,之后进行仿真验证。
步骤1中,所述SysML模块定义图以及活动图元素到Modelica模型元素的转换规则为:
(i)模块定义图的中的每一个模块对应一个Modelica模型,模块拥有的值属性对应Modelica模型声明区的变量、参数;
(ii)活动图中每一个活动分区对应一个Modelica模型;基本动作以及发送信号动作转换为方程;等待时间动作节点根据不同类型的时间事件分别进行转换,绝对时间事件的等待时间动作转换为when语句,相对时间事件的等待时间动作需要在声明区先声明一个Timer类型实例,之后转换为if语句;接受事件动作转换为Modelica模型中的if语句;决定节点与其分支转换为if语句;合并节点与决定节点组合形成的循环结构转换为while语句。
步骤2中,模块定义图XMI文档所需要解析的为:<packagedElement>标签,<ownedAttribute>标签,<defaultValue>标签,<type>标签。
步骤3中,活动图XMI文档所需要解析的为:<group>标签,<node>标签,<ownedParameter>标签,<edge>标签,<guard>标签。
步骤4具体包括:
先通过解析活动图XMI文档获取所有活动分区集合、节点集合以及边集合;为每一个活动分区创建一个Modelica模型,并通过解析模块定义图XMI文档获取对应模块的变量集合以及参数集合,依次在模型声明区对这些变量和参数进行声明;若活动图中包含相对时间事件的等待时间动作,则在模型声明区声明一个Timer实例;然后,从活动分区的开始节点出发向下遍历,并根据不同的节点类型在模型algorithm区域输出不同的内容,包括选择、循环以及并发结构;并发结构的处理方法是每个并发分支单独进行转换,选择结构和循环结构则分别通过选择结构处理方法和循环结构处理方法。
步骤5中,所述根据活动图中决定节点上的条件表达式和所覆盖分支上的监值确定仿真参数,具体包括:
条件表达式的一般形式为E1op E2,其中E1为仿真参数,E2为数值或布尔值,op为数学比较符号,op∈{<,≤,>,≥,==};所覆盖分支上的监值为false或true;
(i)op∈{<,≤},所覆盖分支上的监值为false时,E1的取值为大于E2;所覆盖分支上的监值为true时,E1的取值为小于E2;
(ii)op∈{>,≥},所覆盖分支上的监值为false时,E1的取值为小于E2;所覆盖分支上的监值为true时,E1的取值为大于E2;
(iii)op为==,E2为数值,所覆盖分支上的监值为false时,E1取值为不等于E2;所覆盖分支上的监值为true时,E1取值为等于E2;
(iv)op为==,E2为布尔值,所覆盖分支上的监值为false时,E1取值为false;所覆盖分支上的监值为true时,E1取值true。
对软件系统模型的验证可以从多个方面出发,如何在早期开发阶段对系统的性质进行验证已经成为一个研究的难点。本发明通过将SysML活动图和模块定义图转换为Modelica模型进行仿真,可以在早期开发阶段进行系统模型验证,发现错误,验证需求是否满足特定业务逻辑。
附图说明
图1是SysML模块定义图;
图2是SysML活动图;
图3是图2活动图转换后的Modelica模型图;
图4是转换后的Modelica模型在OpenModelica工具中的仿真结果图。
具体实施方式
本发明包括以下具体步骤:
步骤1:定义SysML模块定义图以及活动图元素到Modelica模型元素的转换规则。具体为:模块定义图:模块定义图中每一个block元素对应一个Modelica模型实例,block的值属性被转换为其对应Modelica模型声明区的元素;值属性中的参数将被转换成Modelica模型中的参数,包括参数类型、名称以及默认值;值属性中的变量转换成Modelica模型的变量,包括变量类型和变量名;
活动图:活动图中每一个活动分区元素对应一个Modelica模型实例,活动参数对应模型声明区的参数,其余活动图元素将会转换为Modelica模型algorithm区域的元素;基本动作以及发送信号动作转换为方程;等待时间动作节点根据不同类型的时间事件分别进行转换,绝对时间事件的等待时间动作转换为when语句,相对时间事件的等待时间动作需要在声明区先声明一个Timer类型实例,之后转换为if语句;接受事件动作转换为Modelica模型中的if语句;决定节点与其分支转换为if语句,合并节点与决定节点组合形成的循环结构转换为while语句;表1展示了模块定义图以及活动图中元素与Modelica模型元素的转换规则。
表1.模块定义图、活动图元素与Modelica模型元素的转换规则表
步骤2:以模块定义图的XMI文档为输入,解析文档提取模块定义图中的基本元素信息。具体为:
模块定义图XMI文档中属性xmi:type为"uml:Class"的<packagedElement>标签保存了每一个block的信息,标签的name属性记录了block的名称;<packagedElement>标签下的每一个<ownedAttribute>标签对应一个block的值属性;<ownedAttribute>标签的name属性记录了每一个值属性的名称,而isStatic属性区分了值属性的类型;当isStatic的属性值为“true”时,该值属性为参数变量并含有一个默认值,该默认值由<ownedAttribute>标签下的<defaultValue>标签保存;否则,该值属性代表一般变量;<ownedAttribute>标签下的<type>标签记录了值属性所代表的变量的数据类型;表2展示了了模块定义图XMI文档中标签与模块定义图元素的映射关系。
表2.模块定义图XMI标签与元素映射关系
XMI标签 | 模块定义图元素 |
<packagedElementxmi:type=”uml:Class”> | 模块(block) |
<ownedAttribute> | 值属性 |
<defaultValue> | 参数默认值 |
<type> | 变量类型 |
步骤3:以活动图的XMI文档为输入,解析文档提取活动图中的基本元素信息。具体为:
活动图XMI文档中每一个<group>标签对应一个活动分区,标签的name属性记录了活动分区的名称;<group>标签下的每一个<node>标签对应该活动分区包含的每一个节点;<node>标签的属性xmi:type记录了节点的类型,类型包括各种控制节点和动作节点;当该节点属于动作节点时,其属性name记录了对动作的描述;<ownedParameter>标签对应一个活动参数,该标签中的xmi:type属性记录了活动参数的类型,name属性记录了活动参数的名称;<edge>标签对应一条转移边,标签的source属性记录了转移边源节点的id值,而target属性则记录了转移边目标节点的id值;当该转移边的源节点类型是决定节点时,其<edge>标签下的<guard>标签记录此转移边上的转移条件即监值(guard);表3给出了活动图XMI文档中标签与活动图元素的映射关系。
表3.活动图XMI标签与元素映射关系
XMI标签 | 活动图元素 |
<group> | 活动分区 |
<node> | 结点 |
<ownedParameter> | 活动参数 |
<edge> | 边 |
<guard> | 边上的监值 |
步骤4:根据转换规则将解析获取的活动图和模块定义图的基本元素转换成相对应的Modelica模型元素。具体为:
首先通过解析活动图XMI文档获取所有活动分区集合、节点集合以及边集合;对每一个活动分区创建一个Modelica模型,并通过解析模块定义图XMI文档法获取对应模块的变量集合以及参数集合,依次在模型声明区对这些变量和参数进行声明;若活动图中包含相对时间事件的等待时间动作,则在模型声明区声明一个Timer实例;之后,从活动分区的开始节点出发向下遍历,并根据节点的类型在模型algorithm区域输出不同的内容;其中包含选择、循环以及并发结构的处理,并发结构的处理方法是每个并发分支单独进行转换,选择结构和循环结构则分别通过选择结构处理方法和循环结构处理方法;
循环结构通过合并结点以及决定结点构建,对应Modelica模型中while语句;具体的处理方法如下:当遇到循环结构的入口合并结点时,继续向下找到决定结点;决定节点上的表达式转换为while循环语句中条件表达式;之后选择决定节点true分支继续向下遍历,当再次遇到入口合并结点时则表示循环结构结束;
选择结构对应Modelica模型中if语句;具体的处理方法如下:当遇到选择结构的入口决定结点时,将决定节点上的表达式转换为if语句之后的条件表达式;然后选择决定节点的true分支,向下遍历依次处理不同类型的结点;如果是一般的动作节点则直接转换为方程;处理完true分支后,以相同的方法处理false分支;同时,每个分支中可以嵌套选择结构和循环结构。
步骤5:将转换后的Modelica模型导入仿真工具,根据活动图中决定节点上的条件表达式和所覆盖分支上的监值确定仿真参数,之后进行仿真验证。具体为:
条件表达式的一般形式为E1 op E2,其中E1为仿真参数,E2为数值或布尔值,op为数学比较符号,op∈{<,≤,>,≥,==};所覆盖分支上的监值为false或true;
(i)op∈{<,≤},所覆盖分支上的监值为false时,E1的取值为大于E2;所覆盖分支上的监值为true时,E1的取值为小于E2;
(ii)op∈{>,≥},所覆盖分支上的监值为false时,E1的取值为小于E2;所覆盖分支上的监值为true时,E1的取值为大于E2;
(iii)op为==,E2为数值,所覆盖分支上的监值为false时,E1取值为不等于E2;所覆盖分支上的监值为true时,E1取值为等于E2;
(iv)op为==,E2为布尔值,所覆盖分支上的监值为false时,E1取值为false;所覆盖分支上的监值为true时,E1取值true。
实施例
为了详细说明从SysML模块定义图以及活动图到Modelica模型转换并进行仿真的各步骤,本实施例选择返回舱降落伞系统中主降落伞开启作为示例进行描述。
下面结合附图对本发明实施例描述如下:
步骤1:定义SysML模块定义图以及活动图元素到Modelica模型元素的转换规则,如表1所示。
步骤2:以图1模块定义图的XMI文档为输入,解析文档中<packagedElement>标签,<ownedAttribute>标签,<defaultValue>标签,<type>标签从而获取模块以及模块值属性元素信息;解析获取的信息如表4所示。
表4模块以及模块值属性元素信息
步骤3:以图2活动图的XMI文档为输入,解析文档中<group>标签,<node>标签,<ownedParameter>标签,<edge>标签,<guard>标签从而获取活动分区、活动参数、节点以及边元素信息。
步骤4:根据转换规则将解析获取的活动图和模块定义图的基本元素转换成相对应的Modelica模型元素。图2活动图转换后的Modelica模型如图3所示。
步骤5:将转换后的Modelica模型导入仿真工具,根据活动图中决定节点上的条件表达式和所覆盖分支上的监值确定仿真参数,之后进行仿真验证。
表5仿真参数
本实施例验证返回舱降落伞系统是否可以正常发出OpenCmd命令,分析仿真结果发现,在{Tm=8,SepFlag=1,WorkMode=0}这组仿真参数下,系统并没有发出OpenCmd命令,OpenCmd的值始终为0,如图4所示。
Claims (1)
1.一种将SysML模型进行仿真验证的方法,其特征在于,该方法包括以下具体步骤:
步骤1:定义SysML模块定义图以及活动图元素到Modelica模型元素的转换规则;
步骤2:以模块定义图的XMI文档为输入进行解析,获取模块定义图中基本元素即模块以及模块的值属性信息;
步骤3:以活动图的XMI文档为输入进行解析,获取活动图基本元素即活动分区、活动参数、节点以及边的信息;
步骤4:根据转换规则将获取的SysML活动图和模块定义图的基本元素转换成Modelica模型中的元素;
步骤5:将转换后的Modelica模型导入仿真工具,根据活动图中决定节点上的条件表达式和所覆盖分支上的监值确定仿真参数,之后进行仿真验证;其中:
步骤1中,SysML模块定义图以及活动图元素到Modelica模型元素的转换规则为:
() 活动图中每一个活动分区对应一个Modelica模型;基本动作以及发送信号动作转换为方程;等待时间动作节点根据不同类型的时间事件分别进行转换,绝对时间事件的等待时间动作转换为 when语句,相对时间事件的等待时间动作需要在声明区先声明一个Timer 类型实例,之后转换为 if 语句;接受事件动作转换为 Modelica模型中的 if 语句;决定节点与其分支转换为if 语句;合并节点与决定节点组合形成的循环结构转换为while 语句;
步骤2中,模块定义图XMI文档所需要解析的为:<packagedElement>标签,<ownedAttribute>标签,<defaultValue>标签,<type>标签;
步骤3中,活动图XMI文档所需要解析的为:<group>标签,<node>标签,<ownedParameter>标签,<edge>标签,<guard>标签;
步骤4具体包括:
先通过解析活动图XMI文档获取所有活动分区集合、节点集合以及边集合;为每一个活动分区创建一个Modelica模型,并通过解析模块定义图XMI文档获取对应模块的变量集合以及参数集合,依次在模型声明区对这些变量和参数进行声明;若活动图中包含相对时间事件的等待时间动作,则在模型声明区声明一个Timer实例;然后,从活动分区的开始节点出发向下遍历,并根据不同的节点类型在模型algorithm区域输出不同的内容,包括选择、循环以及并发结构;并发结构的处理方法是每个并发分支单独进行转换,选择结构和循环结构则分别通过选择结构处理方法和循环结构处理方法;
在步骤5中,所述根据活动图中决定节点上的条件表达式和所覆盖分支上的监值确定仿真参数,具体包括:
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810367004.1A CN108664241B (zh) | 2018-04-23 | 2018-04-23 | 一种将SysML模型进行仿真验证的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810367004.1A CN108664241B (zh) | 2018-04-23 | 2018-04-23 | 一种将SysML模型进行仿真验证的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108664241A CN108664241A (zh) | 2018-10-16 |
CN108664241B true CN108664241B (zh) | 2021-05-07 |
Family
ID=63780257
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810367004.1A Active CN108664241B (zh) | 2018-04-23 | 2018-04-23 | 一种将SysML模型进行仿真验证的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108664241B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111459472B (zh) * | 2020-04-01 | 2022-06-07 | 杭州华望系统科技有限公司 | 面向mbse图形建模软件的模型元素可视表达方法 |
CN112559359B (zh) * | 2020-12-22 | 2024-03-22 | 华东师范大学 | 一种基于s2ml的安全攸关系统分析与验证方法 |
CN112947112B (zh) * | 2021-01-27 | 2022-08-12 | 北京航空航天大学 | 一种基于SysML的无人车仿真方法 |
CN116415430B (zh) * | 2023-03-27 | 2023-11-14 | 中国科学院国家空间科学中心 | 面向空间科学任务论证的定制化SysML模型转换方法 |
CN116702712B (zh) * | 2023-08-09 | 2023-10-17 | 北京凯锐远景科技有限公司 | 一种Word任务书转换方法、装置、电子设备及介质 |
CN117170632B (zh) * | 2023-11-02 | 2024-02-09 | 浙江大学 | 基于Vue的SysML模型仿真的用户界面开发系统 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103514331A (zh) * | 2013-09-30 | 2014-01-15 | 西北工业大学 | 一种从Simulink模型转换至UML模型的方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130111431A1 (en) * | 2011-11-02 | 2013-05-02 | International Business Machines Corporation | Validation of a system model including an activity diagram |
-
2018
- 2018-04-23 CN CN201810367004.1A patent/CN108664241B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103514331A (zh) * | 2013-09-30 | 2014-01-15 | 西北工业大学 | 一种从Simulink模型转换至UML模型的方法 |
Non-Patent Citations (2)
Title |
---|
基于Modelica的SysML状态机模型仿真方法;冯豪;《中国优秀硕士学位论文数据库》;20160815(第8期);第40-51页 * |
基于SysML的系统设计-仿真模型可视化转换;李新光等;《计算机辅助设计与图形学学报》;20161130;第28卷(第11期);第1973-1981页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108664241A (zh) | 2018-10-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108664241B (zh) | 一种将SysML模型进行仿真验证的方法 | |
Pavlenko et al. | Hybrid model of knowledge for situation recognition in airspace | |
Ouyang et al. | Hardware/software partitioning for heterogenous mpsoc considering communication overhead | |
US20100005203A1 (en) | Method of Merging and Incremantal Construction of Minimal Finite State Machines | |
CN112783508B (zh) | 文件的编译方法、装置、设备以及存储介质 | |
Newell et al. | Translation of IEC 61131-3 function block diagrams to PVS for formal verification with real-time nuclear application | |
Pavlenko et al. | Information support for business processes at virtual enterprises with multi-agent technologies | |
Lu et al. | Zen-CC: An automated and incremental conformance checking solution to support interactive product configuration | |
CN110688368B (zh) | 一种构件行为模型挖掘方法与装置 | |
Nazaruks et al. | Joint usage of frames and the topological functioning model for domain knowledge presentation and analysis | |
Minhas et al. | An integration of UML sequence diagram with formal specification methods—A formal solution based on Z | |
Zhu et al. | A new node-based concept for solving the minimal path problem in general networks | |
CN112817560B (zh) | 一种基于表函数的计算任务处理方法、系统及计算机可读存储介质 | |
CN115658021A (zh) | 动态模型的确定方法、装置、存储介质及电子设备 | |
CN114239538A (zh) | 断言处理方法、装置、计算机设备及存储介质 | |
CN113677583B (zh) | 基于图计算的车辆驾驶数据处理方法、装置和计算机设备 | |
Tovar et al. | Finding attractors in biological models based on boolean dynamical systems using hitting set | |
CN113918211B (zh) | 一种工业设备对象数据模型的执行方法、装置及设备 | |
CN117369795B (zh) | 用于无人机决策的行为树模型可达性分析方法及装置 | |
JP6664560B1 (ja) | 実行監視装置、実行監視方法、及び、実行監視プログラム | |
CN115827494B (zh) | 一种设计层形式化验证方法及系统 | |
CN114610648A (zh) | 一种测试方法、装置及设备 | |
CN114615144B (zh) | 网络优化方法及系统 | |
AU2021287457B2 (en) | "Log Data Compliance" | |
Vörös et al. | Advanced saturation-based model checking of well-formed coloured Petri nets |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20220824 Address after: 7th Floor, Building 6, Lane 600, Yunling West Road, Putuo District, Shanghai, 200940 Patentee after: Shanghai Industrial Control Safety Innovation Technology Co.,Ltd. Address before: 200241 No. 500, Dongchuan Road, Shanghai, Minhang District Patentee before: EAST CHINA NORMAL University |