From e783cf020c69923d8497a2fd910ecd18483b3eb6 Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Tue, 5 Jun 2012 08:25:06 +0000 Subject: [PATCH] Text-based Browser 0.9, changes in history.txt git-svn-id: svn://kolibrios.org@2739 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/network/htmlv/browser/HTMLv.c-- | 77 +++++++++------ programs/network/htmlv/browser/History.txt | 18 +++- programs/network/htmlv/browser/TWB.h | 90 ++++++++---------- .../network/htmlv/browser/include/history.h | 15 +-- programs/network/htmlv/lib/random.h-- | 52 ++++++++++ .../htmlv/lib/scroll_bar/scroll_dll.h-- | 43 +++++++++ .../htmlv/lib/scroll_bar/scroll_lib.h-- | 95 +++++++++++++++++++ 7 files changed, 306 insertions(+), 84 deletions(-) create mode 100644 programs/network/htmlv/lib/random.h-- create mode 100644 programs/network/htmlv/lib/scroll_bar/scroll_dll.h-- create mode 100644 programs/network/htmlv/lib/scroll_bar/scroll_lib.h-- diff --git a/programs/network/htmlv/browser/HTMLv.c-- b/programs/network/htmlv/browser/HTMLv.c-- index 445b92842e..4ba61e2e3f 100644 --- a/programs/network/htmlv/browser/HTMLv.c-- +++ b/programs/network/htmlv/browser/HTMLv.c-- @@ -1,7 +1,6 @@ //HTML Viewer in C-- //Copyright 2007-2012 by Veliant & Leency -//Asper, Lrz, Nable, lev. - +//Asper, lev, Lrz, Barsuk, Nable. //home icon - rachel fu, GPL licence #include "..\lib\kolibri.h--" @@ -9,12 +8,12 @@ #include "..\lib\file_system.h--" #include "img\toolbar_icons.c" #include "img\URLgoto.txt"; -//Asper #include "..\lib\mem.h--" #include "..\lib\libio_lib.h--" #include "..\lib\libimg_lib.h--" #include "..\lib\edit_box_lib.h--" #include "..\lib\dll.h--" +#include "..\lib\scroll_bar\scroll_lib.h--" //переменные char URL[4096], @@ -22,15 +21,14 @@ char URL[4096], page_links[12000], header[512]; -int max_kolvo_strok, - max_kolvo_stolbcov, - count; - -int za_kadrom, - scroll_size, +int max_kolvo_strok, //lines_visible + max_kolvo_stolbcov, + count, //lines_all + za_kadrom, mouse_dd; edit_box edit1= {250,207,16,0xffffff,0x94AECE,0xffffff,0xffffff,0,248,#editURL,#mouse_dd,2,19,19}; +scroll_bar scroll1 = { 18,200,398, 44,18,0,115,15,0,0xeeeeee,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}; //details in scroll_lib.h-- proc_info Form; @@ -43,20 +41,16 @@ void main() mouse m; int btn; byte key; + int scroll_size; - //Asper [ - mem_Init(); - $or eax, eax - $jnz loc00 - return; - @loc00: - load_dll2(libio, #libio_init,1); - load_dll2(libimg, #libimg_init,1); - load_dll2(boxlib, #edit_box_draw,0); - //] Asper + mem_Init(); + load_dll2(libio, #libio_init,1); + load_dll2(libimg, #libimg_init,1); + load_dll2(boxlib, #edit_box_draw,0); + load_dll2(#abox_lib, #boxlib_init,0); - IF (param) copystr(#param,#URL); - ELSE copystr("/sys/index.htm",#URL); + if (param) copystr(#param,#URL); + else copystr("/sys/index.htm",#URL); copystr(#URL,#editURL); @@ -67,15 +61,28 @@ void main() SetEventMask(0x27); loop() { - switch(WaitEvent()) + WaitEventTimeout(1); + switch(EAX & 0xFF) + //switch(WaitEvent()) { - CASE evMouse: + CASE evMouse: + edit_box_mouse stdcall (#edit1); + + /*scrollbar_v_mouse (#scroll1); //конченый скролл притормажимает, идём "своим путём" + if (za_kadrom <> scroll1.position) + { + za_kadrom = scroll1.position; + WB1.ParseHTML(buf, filesize); + //break; + };*/ m.get(); + IF (m.vert==65535) //прокрутка колёсиком { IF (za_kadrom==0) break; IF (za_kadrom>3) za_kadrom-=2; ELSE za_kadrom=1; WB1.Scan(ID1); + break; } IF (m.vert==1) { @@ -84,8 +91,11 @@ void main() za_kadrom+=2; WB1.Scan(ID2); } + break; } - //IF (count=WB1.width-14) && (m.x<=WB1.width+6) && (m.y>WB1.top+16) && (m.ymax_kolvo_strok) while (m.lkm) @@ -97,7 +107,8 @@ void main() IF (max_kolvo_strok+za_kadrom>count) za_kadrom=count-max_kolvo_strok; IF (btn<>za_kadrom) WB1.ParseHTML(buf, filesize); //чтоб лишний раз не перерисовывать m.get(); - } + } + break; case evButton: btn=GetButtonID(); @@ -119,8 +130,14 @@ void main() case evReDraw: Draw_Window(); break; + default: + if (downloader_id<>0) + { + if (GetProcessSlot(downloader_id)<>0) break; + downloader_id=0; + Draw_Window(); + } } - edit_box_mouse stdcall (#edit1); } } @@ -148,15 +165,17 @@ void Draw_Window() PutImage(#URLgoto,40,19,onLeft(57,0),14); DefineButton(onLeft(37,0),15, 18, 16, GOTOURL+BT_HIDE, 0xE4DFE1); DefineButton(onLeft(56,0),15, 17, 16, SEARCHWEB+BT_HIDE, 0xE4DFE1); - DrawRegion_3D(205,14,onLeft(58,205),18,0x94AECE,0x94AECE); //ободок полосы адреса - DrawRegion_3D(206,15,onLeft(59,205),16,0xE4ECF3,0xE4ECF3); + DrawRegion(205,14,onLeft(58,205),18,0x94AECE); //ободок полосы адреса + DrawRegion(206,15,onLeft(59,205),16,0xE4ECF3); + edit1.width=Form.width-266; //edit_box_draw stdcall(#edit1); //рисуем строку адреса //shis is right WB1.top=44; - WB1.width=Form.width-11; + WB1.width=Form.width-13; WB1.height=onTop(43,5); WB1.ShowPage(#URL); + //WB1.ParseHTML(buf, filesize); //shis is right } diff --git a/programs/network/htmlv/browser/History.txt b/programs/network/htmlv/browser/History.txt index 42ed0beeee..3f075442b3 100644 --- a/programs/network/htmlv/browser/History.txt +++ b/programs/network/htmlv/browser/History.txt @@ -1,3 +1,18 @@ +04.06.12 -- v0.90 +- новый скроллбар из box_lib (спасибо lev); +- нормальная загрузка страниц без скидывания фокуса с окна; +- гениальный и грязный хак для работы с downloader'ом, который + у меня на машине даёт 99% загрузки страниц вместо 50% ранее; +- масса исправлений в работе с историей посещений и навигацией; +- в теге исправлена регрессия. + + +27.05.12 -- v0.83 +- новая иконка кнопки "домой"; +- оптимизация тега ; +- улучшения при работе с книгами xml-подобного формата fb2. + + 13.04.12 -- v0.80 - поддержка "bgcolor=" и "text="; - обработка перехода вверх "../"; @@ -20,7 +35,8 @@ 27.02.12 -- v0.75 -- 11.? Кб - при закрытии HTMLv, downloader тоже завершается; - невозможно запустить больше одного downloader'a; -- отображение процесса загрузки страницы из Интернета через кнопочку "остановить", надпись "Loading...", возможность прервать процесс; +- отображение процесса загрузки страницы из Интернета через кнопочку + "остановить", надпись "Loading...", возможность прервать процесс; - обновление страницы из Интернета приводит к её повторной загрузке. diff --git a/programs/network/htmlv/browser/TWB.h b/programs/network/htmlv/browser/TWB.h index 043238c62e..51f3abaef3 100644 --- a/programs/network/htmlv/browser/TWB.h +++ b/programs/network/htmlv/browser/TWB.h @@ -1,8 +1,6 @@ //идея - левые файлы открывать соответствующими прогами //ol - циферки -//из хттп-лоад в реадхтмл - int downloader_id; @@ -12,17 +10,14 @@ dword j, blink = 400; int i; - char download_path[]="/rd/1/.download"; +char download_path[]="/rd/1/.download"; //char search_path[]="http://nova.rambler.ru/search?words="; - char search_path[]="http://nigma.ru/index.php?s="; - char version[]=" Text-based Browser 0.83"; +char search_path[]="http://nigma.ru/index.php?s="; +char version[]=" Text-based Browser 0.9"; struct TWebBrowser { - int left, - top, - width, - height; + int left, top, width, height; void DrawScroller(); void ShowPage(); void ParseHTML(dword, dword); @@ -111,20 +106,12 @@ void TWebBrowser::Scan(dword id) { utf8rutodos(buf); break; case BACK: - BrowserHistory.GoBack(); - - copystr(#URL, #editURL); - za_kadrom = count = 0; - if (!strcmp(get_URL_part(5),"http:"))) HttpLoad(); - ShowPage(#URL); + if (!BrowserHistory.GoBack()) return; + OpenPage(); return; case FORWARD: - BrowserHistory.GoForward(); - - copystr(#URL, #editURL); - za_kadrom = count = 0; - if (!strcmp(get_URL_part(5),"http:"))) HttpLoad(); - ShowPage(#URL); + if (!BrowserHistory.GoForward()) return; + OpenPage(); return; case 054: //F5 IF(edit1.flags == 66) break; @@ -156,17 +143,13 @@ void TWebBrowser::Scan(dword id) { case GOTOURL: case 0x0D: //enter copystr(#editURL, #URL); - if (!strcmp(get_URL_part(5),"http:"))) HttpLoad(); - za_kadrom = count = 0; - ShowPage(#URL); + OpenPage(); return; case 173: //ctrl+enter case SEARCHWEB: copystr(#search_path, #URL); copystr(#editURL, #URL + strlen(#URL)); - if (!strcmp(get_URL_part(5),"http:"))) HttpLoad(); - za_kadrom = count = 0; - ShowPage(#URL); + OpenPage(); return; case ID1: //мотаем вверх @@ -201,6 +184,16 @@ void TWebBrowser::Scan(dword id) { ParseHTML(buf, filesize); } +void OpenPage() +{ + if (GetProcessSlot(downloader_id)<>0) PutPaletteImage(#toolbar,200,42,0,0,8,#toolbar_pal); + KillProcess(downloader_id); + copystr(#URL, #editURL); + za_kadrom = count = 0; + if (!strcmp(get_URL_part(5),"http:"))) HttpLoad(); + WB1.ShowPage(#URL); +} + void GetNewUrl(){ IF (!strcmp(get_URL_part(2),"./")) copystr(#URL+2,#URL); //игнорим :) @@ -238,6 +231,11 @@ void HttpLoad() DeleteFile(#download_path); IF (URL[strlen(#URL)-1]=='/') URL[strlen(#URL)-1]=''; downloader_id = RunProgram("/sys/network/downloader", #URL); + //это гениально и это пиздец!!! + Pause(60); + KillProcess(downloader_id); //убиваем старый процесс + downloader_id = RunProgram("/sys/network/downloader", #URL); + // IF (downloader_id<0) RunProgram("@notify", "Error running Downloader. Internet unavilable."); Draw_Window(); } @@ -275,7 +273,7 @@ void TWebBrowser::ShowPage(dword adress) { if (!filesize) { - DrawBar(left, top, width+2, height, 0xFFFFFF); //закрашиваем всё донизу + DrawBar(left, top, width+4, height, 0xFFFFFF); //закрашиваем всё донизу if (GetProcessSlot(downloader_id)<>0) WriteText(left + 10, top + 18, 0x80, 0, "Loading...", 0); else { @@ -410,7 +408,7 @@ void TWebBrowser::ParseHTML(dword bword, fsize){ GOTO DEFAULT_MARK; //обрабатываем букву } - WriteDebug(#tag); //тэг не найден - выводим на доску отладки + //WriteDebug(#tag); //тэг не найден - выводим на доску отладки copystr(#tag, #line + strlen(#line)); //выводим на экран необработанный тег, так браузеры зачем-то делают break; default: @@ -595,7 +593,7 @@ void TWebBrowser::WhatTextStyle(int left1, top1, width1) { ///////////////////////// if (!chTag("font")) { - IF(stroka < 0) || (stroka - 1 > max_kolvo_strok) return; + IF (stroka - 1 > max_kolvo_strok) return; COL_MARK: if (strcmp(#parametr, "color=") == 0) //&& (parametr[1] == '#') { @@ -766,7 +764,8 @@ void TWebBrowser::WhatTextStyle(int left1, top1, width1) { } -void TextGoDown(int left1, top1, width1) { +void TextGoDown(int left1, top1, width1) +{ stroka++; IF(blq_text == 1) stolbec = 8; ELSE stolbec = 0; @@ -776,23 +775,18 @@ void TextGoDown(int left1, top1, width1) { //скролл -void TWebBrowser::DrawScroller() { - dword on_y; - DrawBar(left + width - 15, top + 17, 1, height - 34, 0x94AECE); //линия слева от прокрутки - DrawFlatButton(left + width - 15, top + height - 17, 16, 16, ID2, 0xE4DFE1, "\x19"); - DrawFlatButton(left + width - 15, top, 16, 16, ID1, 0xE4DFE1, "\x18"); +void TWebBrowser::DrawScroller() //не оптимальная отрисовка, но зато в одном месте +{ + scroll1.max_area = count; + scroll1.cur_area = max_kolvo_strok; + scroll1.position = za_kadrom; - IF(count <= max_kolvo_strok) { - DrawBar(left + width - 14, top+17, 16, height - 34, 0xCED0D0); - return; - } + scroll1.all_redraw=1; + scroll1.start_x=Form.width-28; //left + width - 15 + scroll1.size_y=WB1.height; - scroll_size = height - 16 * max_kolvo_strok / count - 3; - IF(scroll_size < 10) scroll_size = 10; - IF(za_kadrom + max_kolvo_strok >= count) on_y = height - scroll_size + top - 17; - ELSE on_y = height - 32 * za_kadrom / count + top + 16; - DrawFlatButton(left + width - 15, on_y, 16, scroll_size, 0, 0xE4DFE1, ""); //ползунок - IF(on_y > top + 17) DrawBar(left + width - 14, top + 17, 16, on_y - top - 17, 0xCED0D0); //поле до ползунка - IF(height - scroll_size + top - 17 > on_y) - DrawBar(left + width - 14, on_y + scroll_size + 1, 16, height - scroll_size - on_y + top - 18, 0xCED0D0); //поле после ползунка + scrollbar_v_draw(#scroll1); + + DefineButton(scroll1.start_x+1, scroll1.start_y+1, 16, 16, ID1+BT_HIDE, 0xE4DFE1); + DefineButton(scroll1.start_x+1, scroll1.start_y+scroll1.size_y-18, 16, 16, ID2+BT_HIDE, 0xE4DFE1); } \ No newline at end of file diff --git a/programs/network/htmlv/browser/include/history.h b/programs/network/htmlv/browser/include/history.h index 8fb1d87100..dd3e48a1ba 100644 --- a/programs/network/htmlv/browser/include/history.h +++ b/programs/network/htmlv/browser/include/history.h @@ -1,8 +1,8 @@ struct UrlsHistory { dword CurrentUrl(); void AddUrl(); - void GoBack(); - void GoForward(); + byte GoBack(); + byte GoForward(); }; UrlsHistory BrowserHistory; @@ -39,17 +39,20 @@ void UrlsHistory::AddUrl() // } -void UrlsHistory::GoBack() +byte UrlsHistory::GoBack() { - if (history_current<=1) return; + if (history_current<=1) return 0; + history_current--; copystr(#history_list[history_current].Item,#URL); + return 1; } -void UrlsHistory::GoForward() +byte UrlsHistory::GoForward() { - if (history_current==history_num) return; + if (history_current==history_num) return 0; history_current++; copystr(#history_list[history_current].Item,#URL); + return 1; } \ No newline at end of file diff --git a/programs/network/htmlv/lib/random.h-- b/programs/network/htmlv/lib/random.h-- new file mode 100644 index 0000000000..11b60c117f --- /dev/null +++ b/programs/network/htmlv/lib/random.h-- @@ -0,0 +1,52 @@ +/******************************************************************************* + + MenuetOS MineSweeper + Copyright (C) 2003 Ivan Poddubny + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*******************************************************************************/ + +dword generator; // random number generator - для генерации случайных чисел + +:int random(int max) +// get pseudo-random number - получить псевдослучайное число +{ + $rdtsc // eax & edx + $xor eax,edx + $not eax + + EBX = generator; + $ror ebx,3 + $xor ebx,0xdeadbeef + EBX += EAX; + generator = EBX; + + EAX += EBX; + EAX = EAX % max; + return EAX; +} + +:randomize() +// initialize random number generator - инициализировать генератор случайных чисел +{ + asm + { + mov eax,3 + int 0x40 + ror eax,16 + } + generator = EAX; +} \ No newline at end of file diff --git a/programs/network/htmlv/lib/scroll_bar/scroll_dll.h-- b/programs/network/htmlv/lib/scroll_bar/scroll_dll.h-- new file mode 100644 index 0000000000..77477fb0b1 --- /dev/null +++ b/programs/network/htmlv/lib/scroll_bar/scroll_dll.h-- @@ -0,0 +1,43 @@ +:int load_dll3(dword dllname, import_table) +{ + EAX = 68; + EBX = 19; + ECX = dllname; + $int 0x40 + IF(EAX==0) GOTO exit3; + + EDX = EAX; + ESI = import_table; + +@import_loop3: + $lodsd + IF(EAX==0) GOTO import_done3; + $push edx +@import_find3: + EBX = DSDWORD[EDX]; + IF(EBX==0) GOTO exit3; + $push eax +@next3: + CL = DSBYTE[EAX]; + $cmp CL,DSBYTE[EBX]; + $jnz import_find_next3 + IF (CL==0) GOTO import_found3; + EAX++; + EBX++; + goto next3; +@import_find_next3: + $pop eax + EDX = EDX + 8; + goto import_find3; +@import_found3: + $pop ebx + EAX = DSDWORD[EDX+4]; + DSDWORD[ESI-4] = EAX; + $pop edx + + goto import_loop3; +@import_done3: + return 0; +@exit3: + return -1; +} diff --git a/programs/network/htmlv/lib/scroll_bar/scroll_lib.h-- b/programs/network/htmlv/lib/scroll_bar/scroll_lib.h-- new file mode 100644 index 0000000000..27e88a36a2 --- /dev/null +++ b/programs/network/htmlv/lib/scroll_bar/scroll_lib.h-- @@ -0,0 +1,95 @@ +//lev +//:dword boxlib = #abox_lib; +:char abox_lib[]="/sys/lib/box_lib.obj"; + +:char aboxlib_init[] = "lib_init"; +:char aScrollbar_v_draw = "scrollbar_v_draw"; +:char aScrollbar_v_mouse = "scrollbar_v_mouse"; +:char aScrollbar_h_draw = "scrollbar_h_draw"; +:char aScrollbar_h_mouse = "scrollbar_h_mouse"; +:char aVersion_scrollbar = "version_scrollbar"; + +dword boxlib_init = #aboxlib_init; +dword scrollbar_v_draw = #aScrollbar_v_draw; +dword scrollbar_v_mouse = #aScrollbar_v_mouse; +dword scrollbar_h_draw = #aScrollbar_h_draw; +dword scrollbar_h_mouse = #aScrollbar_h_mouse; +:dword version_scrollbar = #aVersion_scrollbar; + +dword sc_am__ = 0x0; +dword sc_bm__ = 0x0; + +struct scroll_bar +{ +//scroll_bar: +word size_x,// equ [edi] +start_x,// equ [edi+2] +size_y,// equ [edi+4] +start_y;// equ [edi+6] +dword btn_height, // equ [edi+8] +type,// equ [edi+12] +max_area,// equ [edi+16] +cur_area,// equ [edi+20] +position,// equ [edi+24] +bckg_col,// equ [edi+28] +frnt_col,// equ [edi+32] +line_col,// equ [edi+36] +redraw;// equ [edi+40] +word delta,// equ [edi+44] +delta2,// equ [edi+46] +r_size_x,// equ [edi+48] +r_start_x,// equ [edi+50] +r_size_y,// equ [edi+52] +r_start_y;// equ [edi+54] +dword m_pos,// equ [edi+56] +m_pos_2,// equ [edi+60] +m_keys,// equ [edi+64] +run_size,// equ [edi+68] +position2,// equ [edi+72] +work_size,// equ [edi+76] +all_redraw,// equ [edi+80] +ar_offset;// equ [edi+84] +}; + +/*scroll_bar scroll1 = { +18,//word size_x, +200, //start_x, +398, //size_y, +44,//start_y; +18,//dword btn_height, +0,//type, +115,//max_area, (100+cur_area) +15,//cur_area, +0,//position, +0xeeeeee,//bckg_col, +0xD2CED0,//frnt_col, +0x555555,//line_col, +0,//redraw; +0,//word delta, +0,//delta2, +0,//r_size_x, +0,//r_start_x, +0,//r_size_y, +0,//r_start_y; +0,//dword m_pos, +0,//m_pos_2, +0,//m_keys, +0,//run_size, +0,//position2, +0,//work_size, +1,//all_redraw, +1//ar_offset; +};*/ + +//btn_height - ўлб®в  Ў®Є®ўле Є­®Ї®Є («Ґў п Ё Їа ў п ¤«п Ј®аЁ§. Ё ўҐае­пп Ё ­Ё¦­пп ¤«п ўҐав.) +//type - type - 0-1-2, ®бв «м­лҐ ўлЈ«п¤пв Є Є 0. +//max_area - ®Ў« бвм ¬ ЄбЁ¬ «м­ п,  Євг «м­® Є®Ј¤  ­Ґ ў« §Ёв ў ®в®Ўа ¦ Ґ¬го ®Ў« бвм, в.Ґ. б«гз ©  ЄвЁў­®бвЁ Є®¬Ї®­Ґ­в  (ўҐбм ¬ ЄбЁ¬ «м­л© а §¬Ґа ¤®Єг¬Ґ­в ) +//cur_area - а §¬Ґа ЎҐЈг­Є //®Ў« бвм ®в®Ўа ¦ Ґ¬ п (Є Є п з бвм ¤®Єг¬Ґ­в  ў« §Ёв ў нЄа ­) +//position - Ї®§ЁжЁп ЎҐЈг­Є  Ё§¬Ґ­пҐ¬ п ®в 0 ¤® §­ зҐ­Ёп (max_area-cur_area) +//bckg_col - 梥⠢­гв७­Ё©, ЇаЁ¬Ґ­пҐвбп ¤«п ®Ў« б⥩ ¬Ґ¦¤г ЎҐЈг­Є®¬ Ё Є­®Є ¬Ё +//frnt_col - 梥⠭ аг¦­л©, ЇаЁ¬Ґ­пҐвбп ¤«п ®Ў« б⥩ ®в«Ёз­ле ®в ЇаЁ¬Ґ­пҐ¬ле ў bckg_col +//line_col - 梥⠫Ё­Ё© Ё бв५®Є ­  Є­®ЇЄ е +//redraw - Ё­¤ЁЄ в®а ­Ґ®Ўе®¤Ё¬®бвЁ ЇҐаҐаЁб®ўЄЁ гЇа ў«пҐ¬®© ®Ў« бвЁ гзЁвлў п Ё§¬Ґ­Ґ­ЁҐ position Ё cur_area +//delta2 - Ё­¤ЁЄ в®а § еў в  д®Єгб  бЄа®««Ў а®¬ (㤥ঠ­ЁҐ ЎҐЈг­Є ) +//all_redraw - д« Ј гбв ­ ў«Ёў Ґ¬л© ў 1 ¤«п ЇҐаҐаЁб®ўЄЁ ўбҐЈ® Є®¬Ї®­Ґ­в , Ґб«Ё Ї®бв ўЁвм 0, в® ЇҐаҐаЁб®ўЄ  Їа®Ёб室Ёв в®«мЄ® ¤«п ®Ў« бвЁ ЎҐЈг­Є . ‚ўҐ¤Ґ­® ¤«п г᪮७Ёп ®ваЁб®ўЄЁ, Ї®бЄ®«мЄг ­Ґ ў® ўбҐе б«гз пе вॡгҐвбп ЇаЁ­г¤ЁвҐм­® ®ваЁб®ўлў вм ўбҐ з бвЁ Є®¬Ї®­Ґ­в . Љ®Ј¤  ўл§лў Ґвбп Ї® б®ЎлвЁо ¬лиЁ ўбҐЈ¤  ®ваЁб®ўлў Ґвбп б ¬Ё¬ Є®¬Ї®­Ґ­в®¬ б® §­ зҐ­ЁҐ¬ 0. +//ar_offset - ўҐ«ЁзЁ­  ᬥ饭Ёп ЇаЁ ®¤­®Єа в­®¬ ­ ¦ вЁЁ Ў®Є®ў®© Є­®ЇЄЁ.