dashscope 1.8.0__py3-none-any.whl → 1.25.6__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.
- dashscope/__init__.py +61 -14
- dashscope/aigc/__init__.py +10 -3
- dashscope/aigc/chat_completion.py +282 -0
- dashscope/aigc/code_generation.py +145 -0
- dashscope/aigc/conversation.py +71 -12
- dashscope/aigc/generation.py +288 -16
- dashscope/aigc/image_synthesis.py +473 -31
- dashscope/aigc/multimodal_conversation.py +299 -14
- dashscope/aigc/video_synthesis.py +610 -0
- dashscope/api_entities/aiohttp_request.py +8 -5
- dashscope/api_entities/api_request_data.py +4 -2
- dashscope/api_entities/api_request_factory.py +68 -20
- dashscope/api_entities/base_request.py +20 -3
- dashscope/api_entities/chat_completion_types.py +344 -0
- dashscope/api_entities/dashscope_response.py +243 -15
- dashscope/api_entities/encryption.py +179 -0
- dashscope/api_entities/http_request.py +216 -62
- dashscope/api_entities/websocket_request.py +43 -34
- dashscope/app/__init__.py +5 -0
- dashscope/app/application.py +203 -0
- dashscope/app/application_response.py +246 -0
- dashscope/assistants/__init__.py +16 -0
- dashscope/assistants/assistant_types.py +175 -0
- dashscope/assistants/assistants.py +311 -0
- dashscope/assistants/files.py +197 -0
- dashscope/audio/__init__.py +4 -2
- dashscope/audio/asr/__init__.py +17 -1
- dashscope/audio/asr/asr_phrase_manager.py +203 -0
- dashscope/audio/asr/recognition.py +167 -27
- dashscope/audio/asr/transcription.py +107 -14
- dashscope/audio/asr/translation_recognizer.py +1006 -0
- dashscope/audio/asr/vocabulary.py +177 -0
- dashscope/audio/qwen_asr/__init__.py +7 -0
- dashscope/audio/qwen_asr/qwen_transcription.py +189 -0
- dashscope/audio/qwen_omni/__init__.py +11 -0
- dashscope/audio/qwen_omni/omni_realtime.py +524 -0
- dashscope/audio/qwen_tts/__init__.py +5 -0
- dashscope/audio/qwen_tts/speech_synthesizer.py +77 -0
- dashscope/audio/qwen_tts_realtime/__init__.py +10 -0
- dashscope/audio/qwen_tts_realtime/qwen_tts_realtime.py +355 -0
- dashscope/audio/tts/__init__.py +2 -0
- dashscope/audio/tts/speech_synthesizer.py +5 -0
- dashscope/audio/tts_v2/__init__.py +12 -0
- dashscope/audio/tts_v2/enrollment.py +179 -0
- dashscope/audio/tts_v2/speech_synthesizer.py +886 -0
- dashscope/cli.py +157 -37
- dashscope/client/base_api.py +652 -87
- dashscope/common/api_key.py +2 -0
- dashscope/common/base_type.py +135 -0
- dashscope/common/constants.py +13 -16
- dashscope/common/env.py +2 -0
- dashscope/common/error.py +58 -22
- dashscope/common/logging.py +2 -0
- dashscope/common/message_manager.py +2 -0
- dashscope/common/utils.py +276 -46
- dashscope/customize/__init__.py +0 -0
- dashscope/customize/customize_types.py +192 -0
- dashscope/customize/deployments.py +146 -0
- dashscope/customize/finetunes.py +234 -0
- dashscope/embeddings/__init__.py +5 -1
- dashscope/embeddings/batch_text_embedding.py +208 -0
- dashscope/embeddings/batch_text_embedding_response.py +65 -0
- dashscope/embeddings/multimodal_embedding.py +118 -10
- dashscope/embeddings/text_embedding.py +13 -1
- dashscope/{file.py → files.py} +19 -4
- dashscope/io/input_output.py +2 -0
- dashscope/model.py +11 -2
- dashscope/models.py +43 -0
- dashscope/multimodal/__init__.py +20 -0
- dashscope/multimodal/dialog_state.py +56 -0
- dashscope/multimodal/multimodal_constants.py +28 -0
- dashscope/multimodal/multimodal_dialog.py +648 -0
- dashscope/multimodal/multimodal_request_params.py +313 -0
- dashscope/multimodal/tingwu/__init__.py +10 -0
- dashscope/multimodal/tingwu/tingwu.py +80 -0
- dashscope/multimodal/tingwu/tingwu_realtime.py +579 -0
- dashscope/nlp/__init__.py +0 -0
- dashscope/nlp/understanding.py +64 -0
- dashscope/protocol/websocket.py +3 -0
- dashscope/rerank/__init__.py +0 -0
- dashscope/rerank/text_rerank.py +69 -0
- dashscope/resources/qwen.tiktoken +151643 -0
- dashscope/threads/__init__.py +26 -0
- dashscope/threads/messages/__init__.py +0 -0
- dashscope/threads/messages/files.py +113 -0
- dashscope/threads/messages/messages.py +220 -0
- dashscope/threads/runs/__init__.py +0 -0
- dashscope/threads/runs/runs.py +501 -0
- dashscope/threads/runs/steps.py +112 -0
- dashscope/threads/thread_types.py +665 -0
- dashscope/threads/threads.py +212 -0
- dashscope/tokenizers/__init__.py +7 -0
- dashscope/tokenizers/qwen_tokenizer.py +111 -0
- dashscope/tokenizers/tokenization.py +125 -0
- dashscope/tokenizers/tokenizer.py +45 -0
- dashscope/tokenizers/tokenizer_base.py +32 -0
- dashscope/utils/__init__.py +0 -0
- dashscope/utils/message_utils.py +838 -0
- dashscope/utils/oss_utils.py +243 -0
- dashscope/utils/param_utils.py +29 -0
- dashscope/version.py +3 -1
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/METADATA +53 -50
- dashscope-1.25.6.dist-info/RECORD +112 -0
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/WHEEL +1 -1
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/entry_points.txt +0 -1
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info/licenses}/LICENSE +2 -4
- dashscope/deployment.py +0 -129
- dashscope/finetune.py +0 -149
- dashscope-1.8.0.dist-info/RECORD +0 -49
- {dashscope-1.8.0.dist-info → dashscope-1.25.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Copyright (c) Alibaba, Inc. and its affiliates.
|
|
2
|
+
|
|
3
|
+
# yapf: disable
|
|
4
|
+
|
|
5
|
+
from dashscope.threads.messages.messages import Messages
|
|
6
|
+
from dashscope.threads.runs.runs import Runs
|
|
7
|
+
from dashscope.threads.runs.steps import Steps
|
|
8
|
+
from dashscope.threads.thread_types import (MessageFile, Run, RunList, RunStep,
|
|
9
|
+
RunStepList, Thread, ThreadMessage,
|
|
10
|
+
ThreadMessageList)
|
|
11
|
+
from dashscope.threads.threads import Threads
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
MessageFile,
|
|
15
|
+
Messages,
|
|
16
|
+
Run,
|
|
17
|
+
Runs,
|
|
18
|
+
RunList,
|
|
19
|
+
Steps,
|
|
20
|
+
RunStep,
|
|
21
|
+
RunStepList,
|
|
22
|
+
Threads,
|
|
23
|
+
Thread,
|
|
24
|
+
ThreadMessage,
|
|
25
|
+
ThreadMessageList,
|
|
26
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Copyright (c) Alibaba, Inc. and its affiliates.
|
|
2
|
+
|
|
3
|
+
from dashscope.client.base_api import GetStatusMixin, ListObjectMixin
|
|
4
|
+
from dashscope.common.error import InputRequired
|
|
5
|
+
from dashscope.threads.thread_types import MessageFile, MessageFileList
|
|
6
|
+
|
|
7
|
+
__all__ = ['Files']
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Files(ListObjectMixin, GetStatusMixin):
|
|
11
|
+
SUB_PATH = 'messages' # useless
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
def retrieve(cls,
|
|
15
|
+
file_id: str,
|
|
16
|
+
*,
|
|
17
|
+
thread_id: str,
|
|
18
|
+
message_id: str,
|
|
19
|
+
workspace: str = None,
|
|
20
|
+
api_key: str = None,
|
|
21
|
+
**kwargs) -> MessageFile:
|
|
22
|
+
"""Retrieve the `MessageFile`.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
thread_id (str): The thread id.
|
|
26
|
+
message_id (str): The message id.
|
|
27
|
+
file_id (str): The file id.
|
|
28
|
+
workspace (str): The dashscope workspace id.
|
|
29
|
+
api_key (str, optional): The api key. Defaults to None.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
MessageFile: The `MessageFile` object.
|
|
33
|
+
"""
|
|
34
|
+
return cls.get(file_id,
|
|
35
|
+
thread_id=thread_id,
|
|
36
|
+
message_id=message_id,
|
|
37
|
+
workspace=workspace,
|
|
38
|
+
api_key=api_key,
|
|
39
|
+
**kwargs)
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def get(cls,
|
|
43
|
+
file_id: str,
|
|
44
|
+
*,
|
|
45
|
+
message_id: str,
|
|
46
|
+
thread_id: str,
|
|
47
|
+
workspace: str = None,
|
|
48
|
+
api_key: str = None,
|
|
49
|
+
**kwargs) -> MessageFile:
|
|
50
|
+
"""Retrieve the `MessageFile`.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
assistant_id (str): The assistant id.
|
|
54
|
+
message_id (str): The message id.
|
|
55
|
+
file_id (str): The file id.
|
|
56
|
+
workspace (str): The dashscope workspace id.
|
|
57
|
+
api_key (str, optional): The api key. Defaults to None.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
MessageFile: The `MessageFile` object.
|
|
61
|
+
"""
|
|
62
|
+
if not thread_id or not message_id or not file_id:
|
|
63
|
+
raise InputRequired(
|
|
64
|
+
'thread id, message id and file id are required!')
|
|
65
|
+
response = super().get(
|
|
66
|
+
message_id,
|
|
67
|
+
path=f'threads/{thread_id}/messages/{message_id}/files/{file_id}',
|
|
68
|
+
workspace=workspace,
|
|
69
|
+
api_key=api_key,
|
|
70
|
+
flattened_output=True,
|
|
71
|
+
**kwargs)
|
|
72
|
+
return MessageFile(**response)
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def list(cls,
|
|
76
|
+
message_id: str,
|
|
77
|
+
*,
|
|
78
|
+
thread_id: str,
|
|
79
|
+
limit: int = None,
|
|
80
|
+
order: str = None,
|
|
81
|
+
after: str = None,
|
|
82
|
+
before: str = None,
|
|
83
|
+
workspace: str = None,
|
|
84
|
+
api_key: str = None,
|
|
85
|
+
**kwargs) -> MessageFileList:
|
|
86
|
+
"""List message files.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
thread_id (str): The thread id.
|
|
90
|
+
message_id (str): The message_id.
|
|
91
|
+
limit (int, optional): How many assistant to retrieve. Defaults to None.
|
|
92
|
+
order (str, optional): Sort order by created_at. Defaults to None.
|
|
93
|
+
after (str, optional): Assistant id after. Defaults to None.
|
|
94
|
+
before (str, optional): Assistant id before. Defaults to None.
|
|
95
|
+
workspace (str, optional): The DashScope workspace id. Defaults to None.
|
|
96
|
+
api_key (str, optional): Your DashScope api key. Defaults to None.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
MessageFileList: The `MessageFileList`.
|
|
100
|
+
"""
|
|
101
|
+
if not thread_id or not message_id:
|
|
102
|
+
raise InputRequired('thread id, message id are required!')
|
|
103
|
+
response = super().list(
|
|
104
|
+
limit=limit,
|
|
105
|
+
order=order,
|
|
106
|
+
after=after,
|
|
107
|
+
before=before,
|
|
108
|
+
path=f'threads/{thread_id}/messages/{message_id}/files',
|
|
109
|
+
workspace=workspace,
|
|
110
|
+
api_key=api_key,
|
|
111
|
+
flattened_output=True,
|
|
112
|
+
**kwargs)
|
|
113
|
+
return MessageFileList(**response)
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Copyright (c) Alibaba, Inc. and its affiliates.
|
|
2
|
+
|
|
3
|
+
from typing import Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from dashscope.client.base_api import (CreateMixin, GetStatusMixin,
|
|
6
|
+
ListObjectMixin, UpdateMixin)
|
|
7
|
+
from dashscope.common.error import InputRequired
|
|
8
|
+
from dashscope.threads.thread_types import ThreadMessage, ThreadMessageList
|
|
9
|
+
|
|
10
|
+
__all__ = ['Messages']
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Messages(CreateMixin, ListObjectMixin, GetStatusMixin, UpdateMixin):
|
|
14
|
+
SUB_PATH = 'messages' # useless
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def call(cls,
|
|
18
|
+
thread_id: str,
|
|
19
|
+
*,
|
|
20
|
+
content: str,
|
|
21
|
+
role: str = 'user',
|
|
22
|
+
file_ids: List[str] = [],
|
|
23
|
+
metadata: Optional[object] = None,
|
|
24
|
+
workspace: str = None,
|
|
25
|
+
api_key: str = None,
|
|
26
|
+
**kwargs) -> ThreadMessage:
|
|
27
|
+
"""Create message of thread.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
thread_id (str): The thread id.
|
|
31
|
+
content (str): The message content.
|
|
32
|
+
role (str, optional): The message role. Defaults to 'user'.
|
|
33
|
+
file_ids (List[str], optional): The file_ids include in message. Defaults to [].
|
|
34
|
+
metadata (Optional[object], optional): The custom key/value pairs. Defaults to None.
|
|
35
|
+
workspace (str, optional): The DashScope workspace id. Defaults to None.
|
|
36
|
+
api_key (str, optional): The DashScope api key. Defaults to None.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
ThreadMessage: The `ThreadMessage` object.
|
|
40
|
+
"""
|
|
41
|
+
return cls.create(thread_id,
|
|
42
|
+
content=content,
|
|
43
|
+
role=role,
|
|
44
|
+
file_ids=file_ids,
|
|
45
|
+
metadata=metadata,
|
|
46
|
+
workspace=workspace,
|
|
47
|
+
**kwargs)
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def create(cls,
|
|
51
|
+
thread_id: str,
|
|
52
|
+
*,
|
|
53
|
+
content: str,
|
|
54
|
+
role: str = 'user',
|
|
55
|
+
file_ids: List[str] = [],
|
|
56
|
+
metadata: Optional[object] = None,
|
|
57
|
+
workspace: str = None,
|
|
58
|
+
api_key: str = None,
|
|
59
|
+
**kwargs) -> ThreadMessage:
|
|
60
|
+
"""Create message of thread.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
thread_id (str): The thread id.
|
|
64
|
+
content (str): The message content.
|
|
65
|
+
role (str, optional): The message role. Defaults to 'user'.
|
|
66
|
+
file_ids (List[str], optional): The file_ids include in message. Defaults to [].
|
|
67
|
+
metadata (Optional[object], optional): The custom key/value pairs. Defaults to None.
|
|
68
|
+
workspace (str, optional): The DashScope workspace id. Defaults to None.
|
|
69
|
+
api_key (str, optional): The DashScope api key. Defaults to None.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
ThreadMessage: The `ThreadMessage` object.
|
|
73
|
+
"""
|
|
74
|
+
cls.SUB_PATH = '%s/messages' % thread_id
|
|
75
|
+
data = {}
|
|
76
|
+
if not thread_id or not content:
|
|
77
|
+
raise InputRequired('thread_id and content are required!')
|
|
78
|
+
data['content'] = content
|
|
79
|
+
data['role'] = role
|
|
80
|
+
if metadata:
|
|
81
|
+
data['metadata'] = metadata
|
|
82
|
+
if file_ids:
|
|
83
|
+
data['file_ids'] = file_ids
|
|
84
|
+
response = super().call(data=data,
|
|
85
|
+
path=f'threads/{thread_id}/messages',
|
|
86
|
+
api_key=api_key,
|
|
87
|
+
flattened_output=True,
|
|
88
|
+
workspace=workspace,
|
|
89
|
+
**kwargs)
|
|
90
|
+
return ThreadMessage(**response)
|
|
91
|
+
|
|
92
|
+
@classmethod
|
|
93
|
+
def retrieve(cls,
|
|
94
|
+
message_id: str,
|
|
95
|
+
*,
|
|
96
|
+
thread_id: str,
|
|
97
|
+
workspace: str = None,
|
|
98
|
+
api_key: str = None,
|
|
99
|
+
**kwargs) -> ThreadMessage:
|
|
100
|
+
"""Get the `ThreadMessage`.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
thread_id (str): The thread id.
|
|
104
|
+
message_id (str): The message id.
|
|
105
|
+
workspace (str): The dashscope workspace id.
|
|
106
|
+
api_key (str, optional): The api key. Defaults to None.
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
ThreadMessage: The `ThreadMessage` object.
|
|
110
|
+
"""
|
|
111
|
+
return cls.get(message_id,
|
|
112
|
+
thread_id=thread_id,
|
|
113
|
+
workspace=workspace,
|
|
114
|
+
api_key=api_key,
|
|
115
|
+
**kwargs)
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def get(cls,
|
|
119
|
+
message_id: str,
|
|
120
|
+
*,
|
|
121
|
+
thread_id: str,
|
|
122
|
+
workspace: str = None,
|
|
123
|
+
api_key: str = None,
|
|
124
|
+
**kwargs) -> ThreadMessage:
|
|
125
|
+
"""Get the `ThreadMessage`.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
thread_id (str): The thread id.
|
|
129
|
+
message_id (str): The message id.
|
|
130
|
+
workspace (str): The dashscope workspace id.
|
|
131
|
+
api_key (str, optional): The api key. Defaults to None.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
ThreadMessage: The `ThreadMessage` object.
|
|
135
|
+
"""
|
|
136
|
+
if not message_id or not thread_id:
|
|
137
|
+
raise InputRequired('thread id, message id are required!')
|
|
138
|
+
response = super().get(
|
|
139
|
+
message_id,
|
|
140
|
+
path=f'threads/{thread_id}/messages/{message_id}',
|
|
141
|
+
workspace=workspace,
|
|
142
|
+
api_key=api_key,
|
|
143
|
+
flattened_output=True,
|
|
144
|
+
**kwargs)
|
|
145
|
+
return ThreadMessage(**response)
|
|
146
|
+
|
|
147
|
+
@classmethod
|
|
148
|
+
def list(cls,
|
|
149
|
+
thread_id: str,
|
|
150
|
+
*,
|
|
151
|
+
limit: int = None,
|
|
152
|
+
order: str = None,
|
|
153
|
+
after: str = None,
|
|
154
|
+
before: str = None,
|
|
155
|
+
workspace: str = None,
|
|
156
|
+
api_key: str = None,
|
|
157
|
+
**kwargs) -> ThreadMessageList:
|
|
158
|
+
"""List message of the thread.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
thread_id (str): The thread id.
|
|
162
|
+
limit (int, optional): How many assistant to retrieve. Defaults to None.
|
|
163
|
+
order (str, optional): Sort order by created_at. Defaults to None.
|
|
164
|
+
after (str, optional): Assistant id after. Defaults to None.
|
|
165
|
+
before (str, optional): Assistant id before. Defaults to None.
|
|
166
|
+
workspace (str, optional): The DashScope workspace id. Defaults to None.
|
|
167
|
+
api_key (str, optional): Your DashScope api key. Defaults to None.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
ThreadMessageList: The `ThreadMessageList` object.
|
|
171
|
+
"""
|
|
172
|
+
if not thread_id:
|
|
173
|
+
raise InputRequired('thread id is required!')
|
|
174
|
+
response = super().list(limit=limit,
|
|
175
|
+
order=order,
|
|
176
|
+
after=after,
|
|
177
|
+
before=before,
|
|
178
|
+
path=f'threads/{thread_id}/messages',
|
|
179
|
+
workspace=workspace,
|
|
180
|
+
api_key=api_key,
|
|
181
|
+
flattened_output=True,
|
|
182
|
+
**kwargs)
|
|
183
|
+
return ThreadMessageList(**response)
|
|
184
|
+
|
|
185
|
+
@classmethod
|
|
186
|
+
def update(cls,
|
|
187
|
+
message_id: str,
|
|
188
|
+
*,
|
|
189
|
+
thread_id: str,
|
|
190
|
+
metadata: Dict = None,
|
|
191
|
+
workspace: str = None,
|
|
192
|
+
api_key: str = None,
|
|
193
|
+
**kwargs) -> ThreadMessage:
|
|
194
|
+
"""Update an message of the thread.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
thread_id (str): The thread id.
|
|
198
|
+
message_id (str): The message id.
|
|
199
|
+
content (str): The message content.
|
|
200
|
+
role (str, optional): The message role. Defaults to 'user'.
|
|
201
|
+
file_ids (List[str], optional): The file_ids include in message. Defaults to [].
|
|
202
|
+
metadata (Optional[object], optional): The custom key/value pairs. Defaults to None.
|
|
203
|
+
workspace (str, optional): The DashScope workspace id. Defaults to None.
|
|
204
|
+
api_key (str, optional): The DashScope api key. Defaults to None.
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
ThreadMessage: The `ThreadMessage` object.
|
|
208
|
+
"""
|
|
209
|
+
if not thread_id or not message_id:
|
|
210
|
+
raise InputRequired('thread id and message id are required!')
|
|
211
|
+
response = super().update(target=message_id,
|
|
212
|
+
json={'metadata': metadata},
|
|
213
|
+
path='threads/%s/messages/%s' %
|
|
214
|
+
(thread_id, message_id),
|
|
215
|
+
api_key=api_key,
|
|
216
|
+
workspace=workspace,
|
|
217
|
+
flattened_output=True,
|
|
218
|
+
method='post',
|
|
219
|
+
**kwargs)
|
|
220
|
+
return ThreadMessage(**response)
|
|
File without changes
|