683 lines
18 KiB
Plaintext
683 lines
18 KiB
Plaintext
/* SABP Templates in TTCN-3
|
|
* (C) 2019 Harald Welte <laforge@gnumonks.org>
|
|
* All rights reserved.
|
|
*
|
|
* Released under the terms of GNU General Public License, Version 2 or
|
|
* (at your option) any later version.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
module SABP_Templates {
|
|
|
|
import from General_Types all;
|
|
|
|
import from SABP_IEs all;
|
|
import from SABP_CommonDataTypes all;
|
|
import from SABP_Constants all;
|
|
import from SABP_Containers all;
|
|
import from SABP_PDU_Contents all;
|
|
import from SABP_PDU_Descriptions all;
|
|
|
|
template (value) Service_Area_Identifier ts_SabpSai(template (value) OCT3 plmn_id,
|
|
template (value) OCT2 lac,
|
|
template (value) OCT2 sac) := {
|
|
pLMNidentity := plmn_id,
|
|
lac := lac,
|
|
sac := sac
|
|
}
|
|
|
|
/* 9.1.3 WRITE REPLACE */
|
|
template (value) SABP_PDU
|
|
ts_SABP_Write(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
|
|
template (value) Service_Areas_List sa_list, template (value) integer rep_per,
|
|
template (value) integer num_bcast, template (value) BIT8 dcs,
|
|
template (value) bitstring content) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Write_Replace,
|
|
criticality := reject,
|
|
value_ := {
|
|
Write_Replace := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_New_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { New_Serial_Number := ser_nr }
|
|
}, {
|
|
/* Optional: Old Serial Number */
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}, {
|
|
/* Optional: Category */
|
|
id := SABP_Constants.id_Repetition_Period,
|
|
criticality := reject,
|
|
value_ := { Repetition_Period := rep_per }
|
|
}, {
|
|
id := SABP_Constants.id_Number_of_Broadcasts_Requested,
|
|
criticality := reject,
|
|
value_ := { Number_of_Broadcasts_Requested := num_bcast }
|
|
}, {
|
|
id := SABP_Constants.id_Data_Coding_Scheme,
|
|
criticality := reject,
|
|
value_ := { Data_Coding_Scheme := dcs }
|
|
}, {
|
|
id := SABP_Constants.id_Broadcast_Message_Content,
|
|
criticality := reject,
|
|
value_ := { Broadcast_Message_Content := content }
|
|
}
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_Write(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
|
|
template (present) Service_Areas_List sa_list := ?, template (present) integer rep_per := ?,
|
|
template (present) integer num_bcast := ?, template (present) BIT8 dcs := ?,
|
|
template (present) bitstring content := ?) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Write_Replace,
|
|
criticality := reject,
|
|
value_ := {
|
|
Write_Replace := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_New_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { New_Serial_Number := ser_nr }
|
|
}, *, /* Optional: Old Serial Number */
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}, * /* Optional: Category */,
|
|
{
|
|
id := SABP_Constants.id_Repetition_Period,
|
|
criticality := reject,
|
|
value_ := { Repetition_Period := rep_per }
|
|
}, {
|
|
id := SABP_Constants.id_Number_of_Broadcasts_Requested,
|
|
criticality := reject,
|
|
value_ := { Number_of_Broadcasts_Requested := num_bcast }
|
|
}, {
|
|
id := SABP_Constants.id_Data_Coding_Scheme,
|
|
criticality := reject,
|
|
value_ := { Data_Coding_Scheme := dcs }
|
|
}, {
|
|
id := SABP_Constants.id_Broadcast_Message_Content,
|
|
criticality := reject,
|
|
value_ := { Broadcast_Message_Content := content }
|
|
}
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.4 WRITE REPLACE COMPLETE */
|
|
template (value) SABP_PDU
|
|
ts_SABPWriteCompl(template (value) BIT16 msg_id, template (value) BIT16 ser_nr) := {
|
|
successfulOutcome := {
|
|
procedureCode := id_Write_Replace,
|
|
criticality := reject,
|
|
value_ := {
|
|
Write_Replace_Complete := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_New_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { New_Serial_Number := ser_nr }
|
|
}
|
|
/* Optional: Number of Broadcasts Completed List */
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_WriteCompl(template (present) BIT16 msg_id, template (present) BIT16 ser_nr) := {
|
|
successfulOutcome := {
|
|
procedureCode := id_Write_Replace,
|
|
criticality := reject,
|
|
value_ := {
|
|
Write_Replace_Complete := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_New_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { New_Serial_Number := ser_nr }
|
|
}, *
|
|
/* Optional: Number of Broadcasts Completed List */
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.5 WRITE REPLACE FAILURE */
|
|
template (value) SABP_PDU
|
|
ts_SABP_WriteFail(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
|
|
template (value) Failure_List fail_list) := {
|
|
unsuccessfulOutcome := {
|
|
procedureCode := id_Write_Replace,
|
|
criticality := reject,
|
|
value_ := {
|
|
Write_Replace_Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_New_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { New_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Failure_List,
|
|
criticality := reject,
|
|
value_ := { Failure_List := fail_list }
|
|
}
|
|
/* Optional: Number of Broadcasts Completed List */
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_WriteFail(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
|
|
template (present) Failure_List fail_list := ?) := {
|
|
unsuccessfulOutcome := {
|
|
procedureCode := id_Write_Replace,
|
|
criticality := reject,
|
|
value_ := {
|
|
Write_Replace_Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_New_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { New_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Failure_List,
|
|
criticality := reject,
|
|
value_ := { Failure_List := fail_list }
|
|
}, *
|
|
/* Optional: Number of Broadcasts Completed List */
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.6 KILL */
|
|
template (value) SABP_PDU
|
|
ts_SABP_Kill(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
|
|
template (value) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Kill,
|
|
criticality := reject,
|
|
value_ := {
|
|
kill_ := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_Old_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { Old_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_Kill(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
|
|
template (present) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Kill,
|
|
criticality := reject,
|
|
value_ := {
|
|
kill_ := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_Old_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { Old_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.7 KILL COMPLETE */
|
|
template (value) SABP_PDU
|
|
ts_SABP_KillCompl(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
|
|
template (value) Number_of_Broadcasts_Completed_List num_bcast_compl) := {
|
|
successfulOutcome := {
|
|
procedureCode := id_Kill,
|
|
criticality := reject,
|
|
value_ := {
|
|
Kill_Complete := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_Old_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { Old_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Number_of_Broadcasts_Completed_List,
|
|
criticality := reject,
|
|
value_ := { Number_of_Broadcasts_Completed_List := num_bcast_compl }
|
|
}
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_KillCompl(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
|
|
template (present) Number_of_Broadcasts_Completed_List num_bcast_compl := ?) := {
|
|
successfulOutcome := {
|
|
procedureCode := id_Kill,
|
|
criticality := reject,
|
|
value_ := {
|
|
Kill_Complete := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_Old_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { Old_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Number_of_Broadcasts_Completed_List,
|
|
criticality := reject,
|
|
value_ := { Number_of_Broadcasts_Completed_List := num_bcast_compl }
|
|
}, *
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* 9.1.7 KILL FAILURE */
|
|
template (value) SABP_PDU
|
|
ts_SABP_KillFail(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
|
|
template (value) Failure_List fail_list) := {
|
|
unsuccessfulOutcome := {
|
|
procedureCode := id_Kill,
|
|
criticality := reject,
|
|
value_ := {
|
|
Kill_Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_Old_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { Old_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Failure_List,
|
|
criticality := reject,
|
|
value_ := { Failure_List := fail_list }
|
|
}
|
|
/* Optional: Number-of-Broadcasts-Completed-List */
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_KillFail(template (present) BIT16 msg_id, template (present) BIT16 ser_nr,
|
|
template (present) Failure_List fail_list := ?) := {
|
|
unsuccessfulOutcome := {
|
|
procedureCode := id_Kill,
|
|
criticality := reject,
|
|
value_ := {
|
|
Kill_Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := reject,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_Old_Serial_Number,
|
|
criticality := reject,
|
|
value_ := { Old_Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Failure_List,
|
|
criticality := reject,
|
|
value_ := { Failure_List := fail_list }
|
|
}, *
|
|
/* Optional: Number-of-Broadcasts-Completed-List */
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* TODO: Load Query + Complete + Failure */
|
|
/* TODO: Message Status Query + Complete + Failure */
|
|
|
|
/* 9.1.15 RESET */
|
|
template (value) SABP_PDU
|
|
ts_SABP_Reset(template (value) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Reset,
|
|
criticality := reject,
|
|
value_ := {
|
|
Reset := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_Reset(template (present) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Reset,
|
|
criticality := reject,
|
|
value_ := {
|
|
Reset := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* 9.1.16 RESET COMPLETE */
|
|
template (value) SABP_PDU
|
|
ts_SABP_ResetCompl(template (value) Service_Areas_List sa_list) := {
|
|
successfulOutcome := {
|
|
procedureCode := id_Reset,
|
|
criticality := reject,
|
|
value_ := {
|
|
Reset_Complete := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_ResetCompl(template (present) Service_Areas_List sa_list) := {
|
|
successfulOutcome := {
|
|
procedureCode := id_Reset,
|
|
criticality := reject,
|
|
value_ := {
|
|
Reset_Complete := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}, *
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.17 RESET FAILURE */
|
|
template (value) SABP_PDU
|
|
ts_SABP_ResetFail(template (value) Failure_List f_list) := {
|
|
unsuccessfulOutcome := {
|
|
procedureCode := id_Reset,
|
|
criticality := reject,
|
|
value_ := {
|
|
Reset_Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Failure_List,
|
|
criticality := reject,
|
|
value_ := { Failure_List := f_list }
|
|
}
|
|
/* Optional: Service Area List */
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_ResetFail(template (present) Failure_List f_list := ?) := {
|
|
unsuccessfulOutcome := {
|
|
procedureCode := id_Reset,
|
|
criticality := reject,
|
|
value_ := {
|
|
Reset_Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Failure_List,
|
|
criticality := reject,
|
|
value_ := { Failure_List := f_list }
|
|
}, *
|
|
/* Optional: Service Area List */
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.18 RESTART (RNC->CN) */
|
|
template (value) SABP_PDU
|
|
ts_SABP_Restart(template (value) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Restart_Indication,
|
|
criticality := ignore,
|
|
value_ := {
|
|
Restart := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
/* Optional: Recovery_Indication */
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_Restart(template (present) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Restart_Indication,
|
|
criticality := ignore,
|
|
value_ := {
|
|
Restart := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := reject,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}, *
|
|
/* Optional: Recovery_Indication */
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.19 FAILURE (RNC->CN) */
|
|
template (value) SABP_PDU
|
|
ts_SABP_Failure(template (value) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Failure_Indication,
|
|
criticality := ignore,
|
|
value_ := {
|
|
Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := ignore,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_Failure(template (present) Service_Areas_List sa_list) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Failure_Indication,
|
|
criticality := ignore,
|
|
value_ := {
|
|
Failure := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Service_Areas_List,
|
|
criticality := ignore,
|
|
value_ := { Service_Areas_List := sa_list }
|
|
}
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 9.1.20 ERROR INDICATION (RNC->CN) */
|
|
template (value) SABP_PDU
|
|
ts_SABP_ErrorInd(template (value) BIT16 msg_id, template (value) BIT16 ser_nr,
|
|
template (value) Cause cause) := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Error_Indication,
|
|
criticality := ignore,
|
|
value_ := {
|
|
Error_Indication := {
|
|
protocolIEs := {
|
|
{
|
|
id := SABP_Constants.id_Message_Identifier,
|
|
criticality := ignore,
|
|
value_ := { Message_Identifier := msg_id }
|
|
}, {
|
|
id := SABP_Constants.id_Serial_Number,
|
|
criticality := ignore,
|
|
value_ := { Serial_Number := ser_nr }
|
|
}, {
|
|
id := SABP_Constants.id_Cause,
|
|
criticality := ignore,
|
|
value_ :={ Cause := cause }
|
|
}
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template (present) SABP_PDU
|
|
tr_SABP_ErrorInd := {
|
|
initiatingMessage := {
|
|
procedureCode := id_Error_Indication,
|
|
criticality := ignore,
|
|
value_ := {
|
|
Error_Indication := {
|
|
protocolIEs := {
|
|
*
|
|
/* Optional: Message-Identifier */
|
|
/* Optional: Serial-Number */
|
|
/* Optional: Cause */
|
|
/* Optional: Criticality-Diagnostics */
|
|
},
|
|
protocolExtensions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|