powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как сохранить изображение из WebBrowser?
24 сообщений из 24, страница 1 из 1
Как сохранить изображение из WebBrowser?
    #37972282
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуйста выручите!
В VB.net это возможно, а в VB6?

Загрузку по URL не предлогать.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37972304
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hulimontana,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Option Explicit

Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpstrCLSID As Long, lpCLSID As Any) As Long
Private Declare Function OleLoadPicturePath Lib "oleaut32" (ByVal szURLorPath As Long, ByVal punkCaller As Long, ByVal dwReserved As Long, ByVal clrReserved As OLE_COLOR, ByRef riid As Any, ByRef ppvRet As Any) As Long

Public Function LoadPictureFromURL(ByVal url As String) As Picture
    Dim IPic(15) As Byte 'holds the IPicture interface
    CLSIDFromString StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), IPic(0)
    OleLoadPicturePath StrPtr(url), 0&, 0&, 0&, IPic(0), LoadPictureFromURL
End Function

Private Sub Form_Load()
    Me.Picture = LoadPictureFromURL("http://niphyr.topcities.com/program.gif")
End Sub
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37972310
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The following example assumes that you have a reference set to Edanmo's OLE Interfaces and Functions library. As with the previous example, you need a form with a picturebox and a command button:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Option Explicit

Private Sub Command1_Click()
    Picture1.Picture = GetPicFromHTTP("http://msdn.microsoft.com/library/shared/toolbar/graphi...;) '("http://www.wandtv.com/rdrimg.jpg";)
End Sub


Private Function GetPicFromHTTP(strURL As String, Optional Username As String, Optional Password As String) As StdPicture
    Dim bytearray() As Byte
    
    Inet1.URL = strURL
    Inet1.Username = Username
    Inet1.Password = Password
    bytearray() = Inet1.OpenURL(, icByteArray)
    
    Set GetPicFromHTTP = LoadImage(bytearray)

End Function

Public Function LoadImage( _
   ImageBytes() As Byte) As StdPicture
Dim oPersist As IPersistStream
Dim oStream As IStream
Dim lSize As Long

   ' Calculate the array size
   lSize = UBound(ImageBytes) - LBound(ImageBytes) + 1

   ' Create a stream object
   ' in global memory
   Set oStream = CreateStreamOnHGlobal(0, True)

   ' Write the header to the stream
   oStream.Write &H746C&, 4&

   ' Write the array size
   oStream.Write lSize, 4&

   ' Write the image data
   oStream.Write ImageBytes(LBound(ImageBytes)), lSize

   ' Move the stream position to
   ' the start of the stream
   oStream.Seek 0, STREAM_SEEK_SET

   ' Create a new empty picture object
   Set LoadImage = New StdPicture

   ' Get the IPersistStream interface
   ' of the picture object
   Set oPersist = LoadImage

   ' Load the picture from the stream
   oPersist.Load oStream

   ' Release the streamobject
   Set oStream = Nothing

End Function
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37973097
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladConn огромное СПАСИБО ! Верхний пример это загрузка по url, а пониже то что мне нужно, я правильно понял?

У меня не хват. знаний чтобы сходу понять как работает этот код, поэтому меня пугает присутствие url картинки в каждом примере. Зачем он там? Он там обязательно нужен?
URL нужных мне картинок у меня нету и не будет, там на них стоит неплохая защита
(куки, реферер, динамические ссылки и еще что-то злое)

Если не лень, помогите понять как использовать эти примеры?
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37973168
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
Picture1.Picture = GetPicFromHTTP("http://msdn.microsoft.com/library/shared/toolbar/graphi...;) '("http://www.wandtv.com/rdrimg.jpg";)



Тут я указываю адрес страницы на которой находится нужная мне картинка -
http://msdn.microsoft.com/library/shared/toolbar/graphi...

А где и по каким параметрам код определяет какая именно картинка на этом сайте нужна мне?
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37973294
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оба этих примера грузят картинку по URL.
Уже загруженную картинку можно выдрать из кэша IE по ее урлу. Вам поможет этот класс:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
Option Explicit

Private Const LMEM_FIXED As Long = &H0
Private Const LMEM_ZEROINIT As Long = &H40

Private Type FILETIME
    lLowDateTime As Long
    lHighDateTime As Long
End Type

Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type

Private Type INTERNET_CACHE_ENTRY_INFO
   dwStructSize As Long
   lpszSourceUrlName As Long
   lpszLocalFileName As Long
   CacheEntryType As Long
   dwUseCount As Long
   dwHitRate As Long
   dwSizeLow As Long
   dwSizeHigh As Long
   LastModifiedTime As FILETIME
   ExpireTime As FILETIME
   LastAccessTime As FILETIME
   LastSyncTime As FILETIME
   lpHeaderInfo As Long
   dwHeaderInfoSize As Long
   lpszFileExtension As Long
   dwExemptDelta As Long
End Type

Private Declare Function FindFirstUrlCacheEntry Lib "wininet.dll" Alias "FindFirstUrlCacheEntryA" ( _
        ByVal lpszSearchPattern As String, _
        ByVal lpCacheInfo As Long, _
        lpdwFirstCacheEntryInfoBufferSize As Long) As Long
    
Private Declare Function FindNextUrlCacheEntry Lib "wininet.dll" Alias "FindNextUrlCacheEntryA" ( _
        ByVal hEnumHandle As Long, _
        ByVal lpCacheInfo As Long, _
        lpdwNextCacheEntryInfoBufferSize As Long) As Long

Private Declare Function FindCloseUrlCache Lib "wininet.dll" ( _
        ByVal hEnumHandle As Long) As Long
        
Private Declare Function GetUrlCacheEntryInfo Lib "wininet.dll" Alias "GetUrlCacheEntryInfoA" ( _
        ByVal lpszUrlName As String, _
        ByVal lpCacheInfo As Long, _
        lpdwCacheEntryInfoBufferSize As Long) As Long

Private Declare Function DeleteUrlCacheEntry Lib "wininet.dll" Alias "DeleteUrlCacheEntryA" ( _
        ByVal lpszUrlName As String) As Long
    
Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" (ByVal RetVal As String, ByVal Ptr As Long) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function LocalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal uBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpyA Lib "kernel32" (ByVal RetVal As String, ByVal Ptr As Long) As Long
Private Declare Function lstrlenA Lib "kernel32" (ByVal Ptr As Any) As Long
  
Private hEnumHandle As Long
Private ci As INTERNET_CACHE_ENTRY_INFO
Private lPtrCI As Long

Public Property Get CachedEntryCacheType() As Long
    CachedEntryCacheType = ci.CacheEntryType
End Property

Public Property Get CachedEntryExpireTime() As Date
On Local Error Resume Next
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.ExpireTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryExpireTime = dExpire
End Property

Public Property Get CachedEntryFileExtension() As String
Dim strData As String
Dim lReturnValue As Long
Dim iPosition As Long
    strData = Space(250)
    lReturnValue = PtrToStr(strData, ci.lpszFileExtension)
    If lReturnValue Then
        iPosition = InStr(strData, Chr(0))
        CachedEntryFileExtension = Left$(strData, iPosition - 1)
    End If
End Property

Public Property Get CachedEntryLastAccessTime() As Date
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.LastAccessTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryLastAccessTime = dExpire
End Property

Public Property Get CachedEntryLastModifiedTime() As Date
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.LastModifiedTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryLastModifiedTime = dExpire
End Property

Public Property Get CachedEntryLastSyncTime() As Date
Dim dExpire As Date
Dim stSystemTime As SYSTEMTIME
Dim lReturnValue As Long
    lReturnValue = FileTimeToSystemTime(ci.LastSyncTime, stSystemTime)
    With stSystemTime
        dExpire = CDate(.wMonth & "/" & .wDay & "/" & .wYear & " " & .wHour & ":" & .wMinute & ":" & .wSecond)
    End With
    CachedEntryLastSyncTime = dExpire
End Property

Public Property Get CachedEntryFileName() As String
Dim strData As String
Dim lReturnValue As Long
Dim iPosition As Long
    strData = String$(lstrlenA(ByVal ci.lpszLocalFileName), 0)
    lReturnValue = lstrcpyA(strData, ci.lpszLocalFileName)
    If lReturnValue Then CachedEntryFileName = strData
End Property

Public Property Get CachedEntrySourceURL() As String
Dim strData As String
Dim lReturnValue As Long
Dim iPosition As Long
    strData = String$(lstrlenA(ci.lpszSourceUrlName), 0)
    lReturnValue = lstrcpyA(strData, ci.lpszSourceUrlName)
    If lReturnValue Then CachedEntrySourceURL = strData
End Property

Public Function DeleteCacheEntry(SourceUrl As String) As Boolean
Dim lReturnValue As Long
    lReturnValue = DeleteUrlCacheEntry(SourceUrl)
    DeleteCacheEntry = CBool(lReturnValue)
End Function

Public Function FindEntryInCache(Url As String) As Boolean
Dim lReturnValue As Long, lSizeOfStruct As Long
    lReturnValue = GetUrlCacheEntryInfo(Url, 0&, lSizeOfStruct)
    If lPtrCI Then LocalFree lPtrCI
    lPtrCI = LocalAlloc(LMEM_FIXED, lSizeOfStruct)
    If lPtrCI Then
        CopyMemory ByVal lPtrCI, lSizeOfStruct, 4
        lReturnValue = GetUrlCacheEntryInfo(Url, lPtrCI, lSizeOfStruct)
        CopyMemory ci, ByVal lPtrCI, Len(ci)
        LocalFree lPtrCI
    End If
    FindEntryInCache = CBool(lReturnValue)
End Function

Public Function FindFirstCacheEntry() As Boolean
Dim lSizeOfStruct As Long
    If hEnumHandle <> 0 Then FindCloseUrlCache hEnumHandle
    hEnumHandle = FindFirstUrlCacheEntry(vbNullString, 0&, lSizeOfStruct)
    If lPtrCI Then LocalFree lPtrCI
    lPtrCI = LocalAlloc(LMEM_FIXED, lSizeOfStruct)
    If lPtrCI Then
        CopyMemory ByVal lPtrCI, lSizeOfStruct, 4
        hEnumHandle = FindFirstUrlCacheEntry(ByVal vbNullString, lPtrCI, lSizeOfStruct)
        CopyMemory ci, ByVal lPtrCI, Len(ci)
    End If
    FindFirstCacheEntry = CBool(hEnumHandle)
End Function

Public Function FindNextCacheEntry() As Boolean
Dim lReturnValue As Long, lSizeOfStruct As Long
    If hEnumHandle <> 0 Then
        lReturnValue = FindNextUrlCacheEntry(hEnumHandle, 0&, lSizeOfStruct)
        If lPtrCI Then LocalFree lPtrCI
        lPtrCI = LocalAlloc(LMEM_FIXED, lSizeOfStruct)
        If lPtrCI Then
            CopyMemory ByVal lPtrCI, lSizeOfStruct, 4
            lReturnValue = FindNextUrlCacheEntry(hEnumHandle, lPtrCI, lSizeOfStruct)
            CopyMemory ci, ByVal lPtrCI, Len(ci)
        End If
        If lReturnValue <> 0 Then FindNextCacheEntry = CBool(lReturnValue)
    End If
End Function

Private Sub Class_Terminate()
    If hEnumHandle Then Call FindCloseUrlCache(hEnumHandle)
End Sub

...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37973394
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hulimontana,

My pleasure.

У меня уже нет ВБ6, чтобы наверняка показать. Может кто-то другой покажет. Обратите внимание на Username и Password. Может это то, что требуется?
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37973546
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
Picture1.Picture = FindEntryInCache(http://www.site.ru/items/8083pkey=5ab339d62ce94ef8a31dffadff65e4ab)



Такого рода код выдает ошибку, что я не правильно понял?
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37973608
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно, вообще ничего. Даже ошибку не указали, впрочем это не важно.
Адрес не в кавычках, а функция возвращает булево значение найдено/не найдено. Если найдено, в свойстве CachedEntryFileName будет путь к файлу.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37973616
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще не объявлен и не создан объект из предоставленного класса.
Похоже вы только начинаете заниматься программированием. Вам будет крайне полезен этот справочник.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37976641
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Спасибо за помощь!
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37977784
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Создал Class Module, поместил туда весь предоставленный вами код назвав модуль "ICache"
Option Explicit добавил в (General) (Declaration)
Так-же в (General) (Declaration) создал объект для класса ICache:
Код: vbnet
1.
Public IExCache As ICache



Выдает ошибку 91: Object variable or with block variable not set.
Ссылаясь на строчку кода:
Код: vbnet
1.
Text1.Text = IExCache.FindEntryInCache(Text2.Text)


В Text2.Text содержится URL картинки в кэше.

Пожалуйста наставьте на путь истинный!
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37977825
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не создал экземпляр класса:
либо при объявлении
Код: vbnet
1.
Public IExCache As New ICache


либо позже
Код: vbnet
1.
Set IExCache = New ICache
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979212
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Спасибо заработало!

Но возникла новая проблема:

Получаю URL всех изображений на загруженной странице:
Код: vbnet
1.
2.
3.
4.
5.
For i = 0 To WebBrowser1.Document.images.length - 1
   MsgBox WebBrowser1.Document.images(i).src
   Text4.Text = Text4.Text & WebBrowser1.Document.images(i).src & vbCrLf
  Next i
End Sub



Начинаю искать их в кеше забивая в Text3.Text каждый URL по очереди:
Код: vbnet
1.
Text1.Text = IExCache.FindEntryInCache(Text3.Text)



В Text1.Text возвращается True\False. Но находит не все изображения,
а именно то что мне нужно не находится.
URL изображения которое мне нужно не настоящее, генерируемое.
Имеет примерно такой вид:
http://www.site.ru/items/8083pkey=5ab339d62ce94ef8a31dffadff65e4ab

У всех остальных изображений нормальный URL с расширением на конце *.jpg *.gif

Что скажете, идея провалилась?
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979284
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо этим картинкам запрещено кэширование.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979304
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

По моему остается один вариант - правая кнопка мыши "Сохранить как..."
Возможно-ли автоматизировать этот процесс? Но не таким сложным и не надежным методом как - клик мышки по заданным координатам, где предположительно должна быть нужная мне картинка.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979311
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе можно, но муторно. Начать можно с примера в аттаче.
Проще скачать, если это возможно.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979321
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Положение картинки в окне браузера не постоянно.
Оно постоянно только по отношению к рядом прикрепленной ссылке.
Вот если бы можно было переместить указатель мыши на эту ссылку, а от неё чуть отступить в низ и там точно будет нужное мне изображение.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979333
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще я выяснил что положение картинки не постоянно только Y координатам (т.е. по высоте)
по X координате оно имеет фиксированное положение. Это наводит меня только на одну мысль - создать цикл с изменяющейся Y координатой и парсить по цвету координат.

Что можете посоветовать?
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979385
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получить ссылку на html документ и узнать точные координаты.
6570704
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979400
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Простите, не понял сути. К чему мне ссылка на Internet Explorer если передо мной WebBrowser с уже загруженной нужной мне страницей.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979479
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hulimontana,

Без ссылки видимо я не получу hwnd?
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979496
Hulimontana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил проблему, тему можно закрыть.

Огромное спасибо тем кто откликнулся VladConn , Antonariy , Shocker.Pro

Отдельное спасибо Antonariy за предоставленный пример работы с кешем.
...
Рейтинг: 0 / 0
Как сохранить изображение из WebBrowser?
    #37979546
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HulimontanaAntonariy,

Простите, не понял сути. К чему мне ссылка на Internet Explorer если передо мной WebBrowser с уже загруженной нужной мне страницей.Забыл)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как сохранить изображение из WebBrowser?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]