huaweicloudsdkmrs 3.1.98__py2.py3-none-any.whl → 3.1.99__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- huaweicloudsdkmrs/v1/model/create_cluster_req_v11.py +3 -3
- huaweicloudsdkmrs/v1/model/node_group_v11.py +3 -3
- huaweicloudsdkmrs/v1/model/task_node_group.py +3 -3
- huaweicloudsdkmrs/v1/model/task_node_info.py +3 -3
- huaweicloudsdkmrs/v2/__init__.py +7 -0
- huaweicloudsdkmrs/v2/model/__init__.py +7 -0
- huaweicloudsdkmrs/v2/model/cluster_node.py +396 -0
- huaweicloudsdkmrs/v2/model/component_info.py +521 -0
- huaweicloudsdkmrs/v2/model/list_nodes_request.py +375 -0
- huaweicloudsdkmrs/v2/model/list_nodes_response.py +145 -0
- huaweicloudsdkmrs/v2/model/node_detail.py +376 -0
- huaweicloudsdkmrs/v2/model/node_group_v2.py +3 -3
- huaweicloudsdkmrs/v2/model/server_info.py +340 -0
- huaweicloudsdkmrs/v2/model/show_mrs_flavors_request.py +32 -3
- huaweicloudsdkmrs/v2/model/tag.py +6 -6
- huaweicloudsdkmrs/v2/model/volume_info.py +170 -0
- huaweicloudsdkmrs/v2/mrs_async_client.py +85 -0
- huaweicloudsdkmrs/v2/mrs_client.py +85 -0
- {huaweicloudsdkmrs-3.1.98.dist-info → huaweicloudsdkmrs-3.1.99.dist-info}/METADATA +2 -2
- {huaweicloudsdkmrs-3.1.98.dist-info → huaweicloudsdkmrs-3.1.99.dist-info}/RECORD +23 -16
- {huaweicloudsdkmrs-3.1.98.dist-info → huaweicloudsdkmrs-3.1.99.dist-info}/LICENSE +0 -0
- {huaweicloudsdkmrs-3.1.98.dist-info → huaweicloudsdkmrs-3.1.99.dist-info}/WHEEL +0 -0
- {huaweicloudsdkmrs-3.1.98.dist-info → huaweicloudsdkmrs-3.1.99.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,375 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
import six
|
4
|
+
|
5
|
+
from huaweicloudsdkcore.utils.http_utils import sanitize_for_serialization
|
6
|
+
|
7
|
+
|
8
|
+
class ListNodesRequest:
|
9
|
+
|
10
|
+
"""
|
11
|
+
Attributes:
|
12
|
+
openapi_types (dict): The key is attribute name
|
13
|
+
and the value is attribute type.
|
14
|
+
attribute_map (dict): The key is attribute name
|
15
|
+
and the value is json key in definition.
|
16
|
+
"""
|
17
|
+
sensitive_list = []
|
18
|
+
|
19
|
+
openapi_types = {
|
20
|
+
'cluster_id': 'str',
|
21
|
+
'node_group': 'str',
|
22
|
+
'limit': 'int',
|
23
|
+
'offset': 'int',
|
24
|
+
'node_name': 'str',
|
25
|
+
'sort_key': 'str',
|
26
|
+
'sort_dir': 'str',
|
27
|
+
'query_node_detail': 'bool',
|
28
|
+
'query_ecs_detail': 'bool',
|
29
|
+
'internal_ip': 'str'
|
30
|
+
}
|
31
|
+
|
32
|
+
attribute_map = {
|
33
|
+
'cluster_id': 'cluster_id',
|
34
|
+
'node_group': 'node_group',
|
35
|
+
'limit': 'limit',
|
36
|
+
'offset': 'offset',
|
37
|
+
'node_name': 'node_name',
|
38
|
+
'sort_key': 'sort_key',
|
39
|
+
'sort_dir': 'sort_dir',
|
40
|
+
'query_node_detail': 'query_node_detail',
|
41
|
+
'query_ecs_detail': 'query_ecs_detail',
|
42
|
+
'internal_ip': 'internal_ip'
|
43
|
+
}
|
44
|
+
|
45
|
+
def __init__(self, cluster_id=None, node_group=None, limit=None, offset=None, node_name=None, sort_key=None, sort_dir=None, query_node_detail=None, query_ecs_detail=None, internal_ip=None):
|
46
|
+
"""ListNodesRequest
|
47
|
+
|
48
|
+
The model defined in huaweicloud sdk
|
49
|
+
|
50
|
+
:param cluster_id: 集群ID。
|
51
|
+
:type cluster_id: str
|
52
|
+
:param node_group: 要查询的节点组名称。
|
53
|
+
:type node_group: str
|
54
|
+
:param limit: 返回结果中每页显示条数。缺省值:10。
|
55
|
+
:type limit: int
|
56
|
+
:param offset: 表示作业列表从该偏移量开始查询。缺省值:1。
|
57
|
+
:type offset: int
|
58
|
+
:param node_name: 指定节点名称,支持模糊搜索。
|
59
|
+
:type node_name: str
|
60
|
+
:param sort_key: 排序键,支持对节点名称排序。
|
61
|
+
:type sort_key: str
|
62
|
+
:param sort_dir: 列表排序方式,desc为降序,asc为升序。
|
63
|
+
:type sort_dir: str
|
64
|
+
:param query_node_detail: 是否查询节点详情。该字段设为true时可能会影响接口性能。
|
65
|
+
:type query_node_detail: bool
|
66
|
+
:param query_ecs_detail: 是否查询ECS详情信息,会涉及对ECS接口调用。
|
67
|
+
:type query_ecs_detail: bool
|
68
|
+
:param internal_ip: 指定内网IP。
|
69
|
+
:type internal_ip: str
|
70
|
+
"""
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
self._cluster_id = None
|
75
|
+
self._node_group = None
|
76
|
+
self._limit = None
|
77
|
+
self._offset = None
|
78
|
+
self._node_name = None
|
79
|
+
self._sort_key = None
|
80
|
+
self._sort_dir = None
|
81
|
+
self._query_node_detail = None
|
82
|
+
self._query_ecs_detail = None
|
83
|
+
self._internal_ip = None
|
84
|
+
self.discriminator = None
|
85
|
+
|
86
|
+
self.cluster_id = cluster_id
|
87
|
+
if node_group is not None:
|
88
|
+
self.node_group = node_group
|
89
|
+
if limit is not None:
|
90
|
+
self.limit = limit
|
91
|
+
if offset is not None:
|
92
|
+
self.offset = offset
|
93
|
+
if node_name is not None:
|
94
|
+
self.node_name = node_name
|
95
|
+
if sort_key is not None:
|
96
|
+
self.sort_key = sort_key
|
97
|
+
if sort_dir is not None:
|
98
|
+
self.sort_dir = sort_dir
|
99
|
+
if query_node_detail is not None:
|
100
|
+
self.query_node_detail = query_node_detail
|
101
|
+
if query_ecs_detail is not None:
|
102
|
+
self.query_ecs_detail = query_ecs_detail
|
103
|
+
if internal_ip is not None:
|
104
|
+
self.internal_ip = internal_ip
|
105
|
+
|
106
|
+
@property
|
107
|
+
def cluster_id(self):
|
108
|
+
"""Gets the cluster_id of this ListNodesRequest.
|
109
|
+
|
110
|
+
集群ID。
|
111
|
+
|
112
|
+
:return: The cluster_id of this ListNodesRequest.
|
113
|
+
:rtype: str
|
114
|
+
"""
|
115
|
+
return self._cluster_id
|
116
|
+
|
117
|
+
@cluster_id.setter
|
118
|
+
def cluster_id(self, cluster_id):
|
119
|
+
"""Sets the cluster_id of this ListNodesRequest.
|
120
|
+
|
121
|
+
集群ID。
|
122
|
+
|
123
|
+
:param cluster_id: The cluster_id of this ListNodesRequest.
|
124
|
+
:type cluster_id: str
|
125
|
+
"""
|
126
|
+
self._cluster_id = cluster_id
|
127
|
+
|
128
|
+
@property
|
129
|
+
def node_group(self):
|
130
|
+
"""Gets the node_group of this ListNodesRequest.
|
131
|
+
|
132
|
+
要查询的节点组名称。
|
133
|
+
|
134
|
+
:return: The node_group of this ListNodesRequest.
|
135
|
+
:rtype: str
|
136
|
+
"""
|
137
|
+
return self._node_group
|
138
|
+
|
139
|
+
@node_group.setter
|
140
|
+
def node_group(self, node_group):
|
141
|
+
"""Sets the node_group of this ListNodesRequest.
|
142
|
+
|
143
|
+
要查询的节点组名称。
|
144
|
+
|
145
|
+
:param node_group: The node_group of this ListNodesRequest.
|
146
|
+
:type node_group: str
|
147
|
+
"""
|
148
|
+
self._node_group = node_group
|
149
|
+
|
150
|
+
@property
|
151
|
+
def limit(self):
|
152
|
+
"""Gets the limit of this ListNodesRequest.
|
153
|
+
|
154
|
+
返回结果中每页显示条数。缺省值:10。
|
155
|
+
|
156
|
+
:return: The limit of this ListNodesRequest.
|
157
|
+
:rtype: int
|
158
|
+
"""
|
159
|
+
return self._limit
|
160
|
+
|
161
|
+
@limit.setter
|
162
|
+
def limit(self, limit):
|
163
|
+
"""Sets the limit of this ListNodesRequest.
|
164
|
+
|
165
|
+
返回结果中每页显示条数。缺省值:10。
|
166
|
+
|
167
|
+
:param limit: The limit of this ListNodesRequest.
|
168
|
+
:type limit: int
|
169
|
+
"""
|
170
|
+
self._limit = limit
|
171
|
+
|
172
|
+
@property
|
173
|
+
def offset(self):
|
174
|
+
"""Gets the offset of this ListNodesRequest.
|
175
|
+
|
176
|
+
表示作业列表从该偏移量开始查询。缺省值:1。
|
177
|
+
|
178
|
+
:return: The offset of this ListNodesRequest.
|
179
|
+
:rtype: int
|
180
|
+
"""
|
181
|
+
return self._offset
|
182
|
+
|
183
|
+
@offset.setter
|
184
|
+
def offset(self, offset):
|
185
|
+
"""Sets the offset of this ListNodesRequest.
|
186
|
+
|
187
|
+
表示作业列表从该偏移量开始查询。缺省值:1。
|
188
|
+
|
189
|
+
:param offset: The offset of this ListNodesRequest.
|
190
|
+
:type offset: int
|
191
|
+
"""
|
192
|
+
self._offset = offset
|
193
|
+
|
194
|
+
@property
|
195
|
+
def node_name(self):
|
196
|
+
"""Gets the node_name of this ListNodesRequest.
|
197
|
+
|
198
|
+
指定节点名称,支持模糊搜索。
|
199
|
+
|
200
|
+
:return: The node_name of this ListNodesRequest.
|
201
|
+
:rtype: str
|
202
|
+
"""
|
203
|
+
return self._node_name
|
204
|
+
|
205
|
+
@node_name.setter
|
206
|
+
def node_name(self, node_name):
|
207
|
+
"""Sets the node_name of this ListNodesRequest.
|
208
|
+
|
209
|
+
指定节点名称,支持模糊搜索。
|
210
|
+
|
211
|
+
:param node_name: The node_name of this ListNodesRequest.
|
212
|
+
:type node_name: str
|
213
|
+
"""
|
214
|
+
self._node_name = node_name
|
215
|
+
|
216
|
+
@property
|
217
|
+
def sort_key(self):
|
218
|
+
"""Gets the sort_key of this ListNodesRequest.
|
219
|
+
|
220
|
+
排序键,支持对节点名称排序。
|
221
|
+
|
222
|
+
:return: The sort_key of this ListNodesRequest.
|
223
|
+
:rtype: str
|
224
|
+
"""
|
225
|
+
return self._sort_key
|
226
|
+
|
227
|
+
@sort_key.setter
|
228
|
+
def sort_key(self, sort_key):
|
229
|
+
"""Sets the sort_key of this ListNodesRequest.
|
230
|
+
|
231
|
+
排序键,支持对节点名称排序。
|
232
|
+
|
233
|
+
:param sort_key: The sort_key of this ListNodesRequest.
|
234
|
+
:type sort_key: str
|
235
|
+
"""
|
236
|
+
self._sort_key = sort_key
|
237
|
+
|
238
|
+
@property
|
239
|
+
def sort_dir(self):
|
240
|
+
"""Gets the sort_dir of this ListNodesRequest.
|
241
|
+
|
242
|
+
列表排序方式,desc为降序,asc为升序。
|
243
|
+
|
244
|
+
:return: The sort_dir of this ListNodesRequest.
|
245
|
+
:rtype: str
|
246
|
+
"""
|
247
|
+
return self._sort_dir
|
248
|
+
|
249
|
+
@sort_dir.setter
|
250
|
+
def sort_dir(self, sort_dir):
|
251
|
+
"""Sets the sort_dir of this ListNodesRequest.
|
252
|
+
|
253
|
+
列表排序方式,desc为降序,asc为升序。
|
254
|
+
|
255
|
+
:param sort_dir: The sort_dir of this ListNodesRequest.
|
256
|
+
:type sort_dir: str
|
257
|
+
"""
|
258
|
+
self._sort_dir = sort_dir
|
259
|
+
|
260
|
+
@property
|
261
|
+
def query_node_detail(self):
|
262
|
+
"""Gets the query_node_detail of this ListNodesRequest.
|
263
|
+
|
264
|
+
是否查询节点详情。该字段设为true时可能会影响接口性能。
|
265
|
+
|
266
|
+
:return: The query_node_detail of this ListNodesRequest.
|
267
|
+
:rtype: bool
|
268
|
+
"""
|
269
|
+
return self._query_node_detail
|
270
|
+
|
271
|
+
@query_node_detail.setter
|
272
|
+
def query_node_detail(self, query_node_detail):
|
273
|
+
"""Sets the query_node_detail of this ListNodesRequest.
|
274
|
+
|
275
|
+
是否查询节点详情。该字段设为true时可能会影响接口性能。
|
276
|
+
|
277
|
+
:param query_node_detail: The query_node_detail of this ListNodesRequest.
|
278
|
+
:type query_node_detail: bool
|
279
|
+
"""
|
280
|
+
self._query_node_detail = query_node_detail
|
281
|
+
|
282
|
+
@property
|
283
|
+
def query_ecs_detail(self):
|
284
|
+
"""Gets the query_ecs_detail of this ListNodesRequest.
|
285
|
+
|
286
|
+
是否查询ECS详情信息,会涉及对ECS接口调用。
|
287
|
+
|
288
|
+
:return: The query_ecs_detail of this ListNodesRequest.
|
289
|
+
:rtype: bool
|
290
|
+
"""
|
291
|
+
return self._query_ecs_detail
|
292
|
+
|
293
|
+
@query_ecs_detail.setter
|
294
|
+
def query_ecs_detail(self, query_ecs_detail):
|
295
|
+
"""Sets the query_ecs_detail of this ListNodesRequest.
|
296
|
+
|
297
|
+
是否查询ECS详情信息,会涉及对ECS接口调用。
|
298
|
+
|
299
|
+
:param query_ecs_detail: The query_ecs_detail of this ListNodesRequest.
|
300
|
+
:type query_ecs_detail: bool
|
301
|
+
"""
|
302
|
+
self._query_ecs_detail = query_ecs_detail
|
303
|
+
|
304
|
+
@property
|
305
|
+
def internal_ip(self):
|
306
|
+
"""Gets the internal_ip of this ListNodesRequest.
|
307
|
+
|
308
|
+
指定内网IP。
|
309
|
+
|
310
|
+
:return: The internal_ip of this ListNodesRequest.
|
311
|
+
:rtype: str
|
312
|
+
"""
|
313
|
+
return self._internal_ip
|
314
|
+
|
315
|
+
@internal_ip.setter
|
316
|
+
def internal_ip(self, internal_ip):
|
317
|
+
"""Sets the internal_ip of this ListNodesRequest.
|
318
|
+
|
319
|
+
指定内网IP。
|
320
|
+
|
321
|
+
:param internal_ip: The internal_ip of this ListNodesRequest.
|
322
|
+
:type internal_ip: str
|
323
|
+
"""
|
324
|
+
self._internal_ip = internal_ip
|
325
|
+
|
326
|
+
def to_dict(self):
|
327
|
+
"""Returns the model properties as a dict"""
|
328
|
+
result = {}
|
329
|
+
|
330
|
+
for attr, _ in six.iteritems(self.openapi_types):
|
331
|
+
value = getattr(self, attr)
|
332
|
+
if isinstance(value, list):
|
333
|
+
result[attr] = list(map(
|
334
|
+
lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
|
335
|
+
value
|
336
|
+
))
|
337
|
+
elif hasattr(value, "to_dict"):
|
338
|
+
result[attr] = value.to_dict()
|
339
|
+
elif isinstance(value, dict):
|
340
|
+
result[attr] = dict(map(
|
341
|
+
lambda item: (item[0], item[1].to_dict())
|
342
|
+
if hasattr(item[1], "to_dict") else item,
|
343
|
+
value.items()
|
344
|
+
))
|
345
|
+
else:
|
346
|
+
if attr in self.sensitive_list:
|
347
|
+
result[attr] = "****"
|
348
|
+
else:
|
349
|
+
result[attr] = value
|
350
|
+
|
351
|
+
return result
|
352
|
+
|
353
|
+
def to_str(self):
|
354
|
+
"""Returns the string representation of the model"""
|
355
|
+
import simplejson as json
|
356
|
+
if six.PY2:
|
357
|
+
import sys
|
358
|
+
reload(sys)
|
359
|
+
sys.setdefaultencoding("utf-8")
|
360
|
+
return json.dumps(sanitize_for_serialization(self), ensure_ascii=False)
|
361
|
+
|
362
|
+
def __repr__(self):
|
363
|
+
"""For `print`"""
|
364
|
+
return self.to_str()
|
365
|
+
|
366
|
+
def __eq__(self, other):
|
367
|
+
"""Returns true if both objects are equal"""
|
368
|
+
if not isinstance(other, ListNodesRequest):
|
369
|
+
return False
|
370
|
+
|
371
|
+
return self.__dict__ == other.__dict__
|
372
|
+
|
373
|
+
def __ne__(self, other):
|
374
|
+
"""Returns true if both objects are not equal"""
|
375
|
+
return not self == other
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
import six
|
4
|
+
|
5
|
+
from huaweicloudsdkcore.sdk_response import SdkResponse
|
6
|
+
from huaweicloudsdkcore.utils.http_utils import sanitize_for_serialization
|
7
|
+
|
8
|
+
|
9
|
+
class ListNodesResponse(SdkResponse):
|
10
|
+
|
11
|
+
"""
|
12
|
+
Attributes:
|
13
|
+
openapi_types (dict): The key is attribute name
|
14
|
+
and the value is attribute type.
|
15
|
+
attribute_map (dict): The key is attribute name
|
16
|
+
and the value is json key in definition.
|
17
|
+
"""
|
18
|
+
sensitive_list = []
|
19
|
+
|
20
|
+
openapi_types = {
|
21
|
+
'nodes': 'list[ClusterNode]',
|
22
|
+
'node_total': 'int'
|
23
|
+
}
|
24
|
+
|
25
|
+
attribute_map = {
|
26
|
+
'nodes': 'nodes',
|
27
|
+
'node_total': 'node_total'
|
28
|
+
}
|
29
|
+
|
30
|
+
def __init__(self, nodes=None, node_total=None):
|
31
|
+
"""ListNodesResponse
|
32
|
+
|
33
|
+
The model defined in huaweicloud sdk
|
34
|
+
|
35
|
+
:param nodes: 节点列表。
|
36
|
+
:type nodes: list[:class:`huaweicloudsdkmrs.v2.ClusterNode`]
|
37
|
+
:param node_total: 节点数。
|
38
|
+
:type node_total: int
|
39
|
+
"""
|
40
|
+
|
41
|
+
super(ListNodesResponse, self).__init__()
|
42
|
+
|
43
|
+
self._nodes = None
|
44
|
+
self._node_total = None
|
45
|
+
self.discriminator = None
|
46
|
+
|
47
|
+
if nodes is not None:
|
48
|
+
self.nodes = nodes
|
49
|
+
if node_total is not None:
|
50
|
+
self.node_total = node_total
|
51
|
+
|
52
|
+
@property
|
53
|
+
def nodes(self):
|
54
|
+
"""Gets the nodes of this ListNodesResponse.
|
55
|
+
|
56
|
+
节点列表。
|
57
|
+
|
58
|
+
:return: The nodes of this ListNodesResponse.
|
59
|
+
:rtype: list[:class:`huaweicloudsdkmrs.v2.ClusterNode`]
|
60
|
+
"""
|
61
|
+
return self._nodes
|
62
|
+
|
63
|
+
@nodes.setter
|
64
|
+
def nodes(self, nodes):
|
65
|
+
"""Sets the nodes of this ListNodesResponse.
|
66
|
+
|
67
|
+
节点列表。
|
68
|
+
|
69
|
+
:param nodes: The nodes of this ListNodesResponse.
|
70
|
+
:type nodes: list[:class:`huaweicloudsdkmrs.v2.ClusterNode`]
|
71
|
+
"""
|
72
|
+
self._nodes = nodes
|
73
|
+
|
74
|
+
@property
|
75
|
+
def node_total(self):
|
76
|
+
"""Gets the node_total of this ListNodesResponse.
|
77
|
+
|
78
|
+
节点数。
|
79
|
+
|
80
|
+
:return: The node_total of this ListNodesResponse.
|
81
|
+
:rtype: int
|
82
|
+
"""
|
83
|
+
return self._node_total
|
84
|
+
|
85
|
+
@node_total.setter
|
86
|
+
def node_total(self, node_total):
|
87
|
+
"""Sets the node_total of this ListNodesResponse.
|
88
|
+
|
89
|
+
节点数。
|
90
|
+
|
91
|
+
:param node_total: The node_total of this ListNodesResponse.
|
92
|
+
:type node_total: int
|
93
|
+
"""
|
94
|
+
self._node_total = node_total
|
95
|
+
|
96
|
+
def to_dict(self):
|
97
|
+
"""Returns the model properties as a dict"""
|
98
|
+
result = {}
|
99
|
+
|
100
|
+
for attr, _ in six.iteritems(self.openapi_types):
|
101
|
+
value = getattr(self, attr)
|
102
|
+
if isinstance(value, list):
|
103
|
+
result[attr] = list(map(
|
104
|
+
lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
|
105
|
+
value
|
106
|
+
))
|
107
|
+
elif hasattr(value, "to_dict"):
|
108
|
+
result[attr] = value.to_dict()
|
109
|
+
elif isinstance(value, dict):
|
110
|
+
result[attr] = dict(map(
|
111
|
+
lambda item: (item[0], item[1].to_dict())
|
112
|
+
if hasattr(item[1], "to_dict") else item,
|
113
|
+
value.items()
|
114
|
+
))
|
115
|
+
else:
|
116
|
+
if attr in self.sensitive_list:
|
117
|
+
result[attr] = "****"
|
118
|
+
else:
|
119
|
+
result[attr] = value
|
120
|
+
|
121
|
+
return result
|
122
|
+
|
123
|
+
def to_str(self):
|
124
|
+
"""Returns the string representation of the model"""
|
125
|
+
import simplejson as json
|
126
|
+
if six.PY2:
|
127
|
+
import sys
|
128
|
+
reload(sys)
|
129
|
+
sys.setdefaultencoding("utf-8")
|
130
|
+
return json.dumps(sanitize_for_serialization(self), ensure_ascii=False)
|
131
|
+
|
132
|
+
def __repr__(self):
|
133
|
+
"""For `print`"""
|
134
|
+
return self.to_str()
|
135
|
+
|
136
|
+
def __eq__(self, other):
|
137
|
+
"""Returns true if both objects are equal"""
|
138
|
+
if not isinstance(other, ListNodesResponse):
|
139
|
+
return False
|
140
|
+
|
141
|
+
return self.__dict__ == other.__dict__
|
142
|
+
|
143
|
+
def __ne__(self, other):
|
144
|
+
"""Returns true if both objects are not equal"""
|
145
|
+
return not self == other
|