Global: Some fixes

I corrected the layout and tabulation a bit and put the QA Team back in the OpenVK version description.
This commit is contained in:
Ilya Prokopenko 2022-01-09 08:47:57 +03:00
parent 70dd7e3773
commit 3b1d85d64f
No known key found for this signature in database
GPG key ID: 7736BBBB05F14A56
3 changed files with 193 additions and 219 deletions

View file

@ -1,21 +1,23 @@
{var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Произошёл троллинг... | OpenVK</title> <title>An error occurred - {$instance_name}</title>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no" /> <meta name="viewport" content="width=device-width, user-scalable=no" />
<style> <style>
@keyframes gradient { @keyframes gradient {
0% { 0% {
background-position:0% 50% background-position: 0% 50%;
} }
50% { 50% {
background-position:100% 50% background-position: 100% 50%;
} }
100% { 100% {
background-position:0% 50% background-position: 0% 50%;
} }
} }

View file

@ -1,5 +1,6 @@
{var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']} {var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
<!DOCTYPE html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'">
<html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'"> <html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'">
<head> <head>
<title> <title>
@ -9,8 +10,9 @@
<link rel="shortcut icon" href="/assets/packages/static/openvk/img/icon.ico" /> <link rel="shortcut icon" href="/assets/packages/static/openvk/img/icon.ico" />
<meta name="application-name" content="{$instance_name}" /> <meta name="application-name" content="{$instance_name}" />
<meta n:ifset="$csrfToken" name="csrf" value="{$csrfToken}" /> <meta n:ifset="$csrfToken" name="csrf" value="{$csrfToken}" />
<script src="/language/{php echo getLanguage()}.js" crossorigin="anonymous"></script> <script src="/language/{php echo getLanguage()}.js" crossorigin="anonymous"></script>
{script "js/node_modules/jquery/dist/jquery.min.js"} {script "js/node_modules/jquery/dist/jquery.min.js"}
{script "js/node_modules/umbrellajs/umbrella.min.js"} {script "js/node_modules/umbrellajs/umbrella.min.js"}
{script "js/l10n.js"} {script "js/l10n.js"}
{script "js/openvk.cls.js"} {script "js/openvk.cls.js"}
@ -21,16 +23,18 @@
{/if} {/if}
{if $theme !== null} {if $theme !== null}
{if $theme->inheritDefault()} {if $theme->inheritDefault()}
{css "css/style.css"} {css "css/style.css"}
{css "css/dialog.css"} {css "css/dialog.css"}
{css "css/notifications.css"} {css "css/notifications.css"}
{if $isXmas} {if $isXmas}
{css "css/xmas.css"} {css "css/xmas.css"}
{/if} {/if}
{/if} {/if}
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/stylesheet/styles.css" /> <link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/stylesheet/styles.css" />
{if $isXmas} {if $isXmas}
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/resource/xmas.css" /> <link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/resource/xmas.css" />
{/if} {/if}
@ -38,6 +42,7 @@
{css "css/style.css"} {css "css/style.css"}
{css "css/dialog.css"} {css "css/dialog.css"}
{css "css/notifications.css"} {css "css/notifications.css"}
{if $isXmas} {if $isXmas}
{css "css/xmas.css"} {css "css/xmas.css"}
{/if} {/if}
@ -46,13 +51,13 @@
{if $thisUser->getStyleAvatar() == 1} {if $thisUser->getStyleAvatar() == 1}
{css "css/avatar.1.css"} {css "css/avatar.1.css"}
{/if} {/if}
{if $thisUser->getStyleAvatar() == 2} {if $thisUser->getStyleAvatar() == 2}
{css "css/avatar.2.css"} {css "css/avatar.2.css"}
{/if} {/if}
{if $thisUser->hasMicroblogEnabled() == 1} {if $thisUser->hasMicroblogEnabled() == 1}
{css "css/microblog.css"} {css "css/microblog.css"}
{/if} {/if}
{else} {else}
{css "css/style.css"} {css "css/style.css"}
@ -65,7 +70,9 @@
{/if} {/if}
{/ifset} {/ifset}
{ifset headIncludes}{include headIncludes}{/ifset} {ifset headIncludes}
{include headIncludes}
{/ifset}
</head> </head>
<body> <body>
<div id="sudo-banner" n:if="isset($thisUser) && $userTainted"> <div id="sudo-banner" n:if="isset($thisUser) && $userTainted">
@ -77,8 +84,10 @@
</div> </div>
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['testLabel']" id="test-label">FOR TESTING PURPOSES ONLY</div> <div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['testLabel']" id="test-label">FOR TESTING PURPOSES ONLY</div>
<div class="notifications_global_wrap"></div>
<div class="notifications_global_wrap"></div>
<div class="dimmer"></div> <div class="dimmer"></div>
<div class="toTop"> <div class="toTop">
⬆ Вверх ⬆ Вверх
</div> </div>
@ -89,45 +98,38 @@
<a href="/" class="home_button {if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}home_button_custom{/if}" title="{$instance_name}">{$instance_name}</a> <a href="/" class="home_button {if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}home_button_custom{/if}" title="{$instance_name}">{$instance_name}</a>
<div n:if="isset($thisUser) ? !$thisUser->isBanned() : true" class="header_navigation"> <div n:if="isset($thisUser) ? !$thisUser->isBanned() : true" class="header_navigation">
{ifset $thisUser} {ifset $thisUser}
<div class="link"> <div class="link">
<a href="/">{_"header_home"}</a> <a href="/">{_header_home}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/search?type=groups">{_"header_groups"}</a> <a href="/search?type=groups">{_header_groups}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/search">{_"header_search"}</a> <a href="/search">{_header_search}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/invite"> <a href="/invite">{_header_invite}</a>
{_"header_invite"} </div>
</a> <div class="link">
</div> <a href="/support">{_header_help} <b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b></a>
<div class="link"> </div>
<a href="/support"> <div class="link">
{_"header_help"} <a href="/logout?hash={urlencode($csrfToken)}">{_header_log_out}</a>
<b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b> </div>
</a> <div class="link">
</div> <form action="/search" method="get">
<div class="link"> <input type="search" name="query" placeholder="{_header_search}" style="height: 20px;background: url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px; background-color: #fff; padding-left: 18px;width: 120px;" />
<a href="/logout?hash={urlencode($csrfToken)}">{_"header_log_out"}</a> </form>
</div> </div>
<div class="link">
<form action="/search" method="get">
<input type="search" name="query" placeholder="{_"header_search"}" style="height: 20px;background: url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px; background-color: #fff; padding-left: 18px;width: 120px;" />
</form>
</div>
{else} {else}
<div class="link"> <div class="link">
<a href="/login">{_"header_login"}</a> <a href="/login">{_header_login}</a>
</div> </div>
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" class="link"> <div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" class="link">
<a href="/reg">{_"header_registration"}</a> <a href="/reg">{_header_registration}</a>
</div> </div>
<div class="link"> <div class="link">
<a href="/support">{_"header_help"}</a> <a href="/support">{_header_help}</a>
</div> </div>
{/ifset} {/ifset}
</div> </div>
@ -135,91 +137,71 @@
<div class="sidebar"> <div class="sidebar">
<div class="navigation"> <div class="navigation">
{ifset $thisUser} {ifset $thisUser}
{if !$thisUser->isBanned()} {if !$thisUser->isBanned()}
<a href="/edit" class="link edit-button">{_"edit_button"}</a> <a href="/edit" class="link edit-button">{_edit_button}</a>
<a href="{$thisUser->getURL()}" class="link">{_"my_page"}</a> <a href="{$thisUser->getURL()}" class="link">{_my_page}</a>
<a href="/friends{$thisUser->getId()}" class="link">{_"my_friends"} <a href="/friends{$thisUser->getId()}" class="link">{_my_friends}
{if $thisUser->getFollowersCount() > 0} <object type="internal/link" n:if="$thisUser->getFollowersCount() > 0">
<object type="internal/link"> <a href="/friends{$thisUser->getId()}?act=incoming">
<a href="/friends{$thisUser->getId()}?act=incoming"> (<b>{$thisUser->getFollowersCount()}</b>)
(<b>{$thisUser->getFollowersCount()}</b>) </a>
</object>
</a> </a>
</object> <a n:if="$thisUser->getLeftMenuItemStatus('photos')" href="/albums{$thisUser->getId()}" class="link">{_my_photos}</a>
{/if}</a> <a n:if="$thisUser->getLeftMenuItemStatus('videos')" href="/videos{$thisUser->getId()}" class="link">{_my_videos}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('photos')" href="/albums{$thisUser->getId()}" class="link">{_"my_photos"}</a> <a n:if="$thisUser->getLeftMenuItemStatus('messages')" href="/im" class="link">{_my_messages}
<a n:if="$thisUser->getLeftMenuItemStatus('videos')" href="/videos{$thisUser->getId()}" class="link">{_"my_videos"}</a> <object type="internal/link" n:if="$thisUser->getUnreadMessagesCount() > 0">
<a n:if="$thisUser->getLeftMenuItemStatus('messages')" href="/im" class="link">{_"my_messages"} (<b>{$thisUser->getUnreadMessagesCount()}</b>)
{if $thisUser->getUnreadMessagesCount() > 0} </object>
<object type="internal/link"> </a>
(<b>{$thisUser->getUnreadMessagesCount()}</b>) <a n:if="$thisUser->getLeftMenuItemStatus('notes')" href="/notes{$thisUser->getId()}" class="link">{_my_notes}</a>
</object> <a n:if="$thisUser->getLeftMenuItemStatus('groups')" href="/groups{$thisUser->getId()}" class="link">{_my_groups}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('news')" href="/feed" class="link">{_my_feed}</a>
<a href="/notifications" class="link">{_my_feedback}
{if $thisUser->getNotificationsCount() > 0}
(<b>{$thisUser->getNotificationsCount()}</b>)
{/if}
</a>
<a href="/settings" class="link">{_my_settings}</a>
{/if} {var canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
</a> {var canAccessHelpdesk = $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
<a n:if="$thisUser->getLeftMenuItemStatus('notes')" href="/notes{$thisUser->getId()}" class="link">{_"my_notes"}</a> {var menuLinksAvaiable = sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0 && $thisUser->getLeftMenuItemStatus('links')}
<a n:if="$thisUser->getLeftMenuItemStatus('groups')" href="/groups{$thisUser->getId()}" class="link">{_"my_groups"}</a> <div n:if="$canAccessAdminPanel || $canAccessHelpdesk || $menuLinksAvaiable" class="menu_divider"></div>
<a n:if="$thisUser->getLeftMenuItemStatus('news')" href="/feed" class="link">{_"my_feed"}</a> <a href="/admin" class="link" n:if="$canAccessAdminPanel">Админ-панель</a>
<a href="/notifications" class="link">{_my_feedback} <a href="/support/tickets" class="link" n:if="$canAccessHelpdesk">Helpdesk
{if $thisUser->getNotificationsCount() > 0}
(<b>{$thisUser->getNotificationsCount()}</b>)
{/if}
</a>
<a href="/settings" class="link">{_"my_settings"}</a>
{var canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
{var canAccessHelpdesk = $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
{var menuLinksAvaiable = sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0 && $thisUser->getLeftMenuItemStatus('links')}
<div n:if="$canAccessAdminPanel || $canAccessHelpdesk || $menuLinksAvaiable" class="menu_divider"></div>
{if $canAccessAdminPanel}
<a href="/admin" class="link">Админ-панель</a>
{/if}
{if $canAccessHelpdesk}
<a href="/support/tickets" class="link">Helpdesk
{if $helpdeskTicketNotAnsweredCount > 0} {if $helpdeskTicketNotAnsweredCount > 0}
(<b>{$helpdeskTicketNotAnsweredCount}</b>) (<b>{$helpdeskTicketNotAnsweredCount}</b>)
{/if} {/if}
</a> </a>
{/if}
<a
n:if="$thisUser->getLeftMenuItemStatus('links')"
n:foreach="OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links'] as $menuItem"
href="{$menuItem['url']}"
target="_blank"
class="link">{strpos($menuItem["name"], "@") === 0 ? tr(substr($menuItem["name"], 1)) : $menuItem["name"]}</a>
<div id="_groupListPinnedGroups">
<div n:if="$thisUser->getPinnedClubCount() > 0" class="menu_divider"></div>
<a
n:foreach="$thisUser->getPinnedClubs() as $club"
href="{$club->getURL()}"
class="link group_link">{$club->getName()}</a>
</div> <a n:if="$thisUser->getLeftMenuItemStatus('links')" n:foreach="OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links'] as $menuItem" href="{$menuItem['url']}" target="_blank" class="link">{strpos($menuItem["name"], "@") === 0 ? tr(substr($menuItem["name"], 1)) : $menuItem["name"]}</a>
<a
n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable'] && $thisUser->getLeftMenuItemStatus('poster')" <div id="_groupListPinnedGroups">
href="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['link']}" > <div n:if="$thisUser->getPinnedClubCount() > 0" class="menu_divider"></div>
<img <a n:foreach="$thisUser->getPinnedClubs() as $club" href="{$club->getURL()}" class="link group_link">{$club->getName()}</a>
src="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['src']}" </div>
alt="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']}" <a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable'] && $thisUser->getLeftMenuItemStatus('poster')" href="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['link']}" >
class="psa-poster" <img src="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['src']}" alt="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']}" class="psa-poster" style="max-width: 100%; margin-top: 50px;" />
style="max-width: 100%; margin-top: 50px;" /> </a>
</a> {else}
<a href="/support" class="link">{_menu_support}</a>
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_menu_logout}</a>
{/if}
{else} {else}
<a href="/support" class="link">{_"menu_support"}</a> <form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data">
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_"menu_logout"}</a> <label for="login"><span>{_email}:</span></label>
{/if} <input id="login" type="text" name="login" required />
{else} <label for="password"><span>{_password}:</span></label>
<form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data"> <input id="password" type="password" name="password" required />
<label for="login"><span>{_"email"}:</span></label> <input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" />
<input id="login" type="text" name="login" required /> <input type="hidden" name="hash" value="{$csrfToken}" />
<label for="password"><span>{_"password"}:</span></label> <input type="submit" value="{_log_in}" class="button" style="display: inline-block;" />
<input id="password" type="password" name="password" required /> <a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" href="/reg" class="button" style="display: inline-block;">{_registration}</a><br><br>
<input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" /> <a href="/restore">{_forgot_password}</a>
<input type="hidden" name="hash" value="{$csrfToken}" /> </form>
<input type="submit" value="{_'log_in'}" class="button" style="display: inline-block;" /> {/ifset}
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" href="/reg" class="button" style="display: inline-block;" >{_registration}</a><br><br>
<a href="/restore">{_"forgot_password"}</a>
</form>
{/ifset}
</div> </div>
</div> </div>
@ -227,39 +209,34 @@
<div id="wrapH"> <div id="wrapH">
<div id="wrapHI"> <div id="wrapHI">
<div n:ifcontent class="page_yellowheader"> <div n:ifcontent class="page_yellowheader">
{include header} {include header}
</div> </div>
</div> </div>
</div> </div>
{ifset wrap} {ifset wrap}
{ifset $flashMessage} <div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
<div class="msg msg_{$flashMessage->type}"> <b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape}
</div>
{include wrap}
{else}
<div class="wrap2">
<div class="wrap1">
<div id="auth" class="page-wrap">
<div class="page_content">
<div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
<b>{$flashMessage->title}</b><br/> <b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape} {$flashMessage->msg|noescape}
</div> </div>
{/ifset}
{include wrap} {include content}
{else}
<div class="wrap2">
<div class="wrap1">
<div id="auth" class="page-wrap">
<div class="page_content">
{ifset $flashMessage}
<div class="msg msg_{$flashMessage->type}">
<b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape}
</div>
{/ifset}
{include content}
</div>
</div>
</div>
</div> </div>
{/ifset} </div>
</div>
</div>
{/ifset}
</div> </div>
</div> </div>
@ -300,9 +277,7 @@
</script> </script>
{/if} {/if}
<script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['enable']" <script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['enable']" async defer data-domain="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['domain']}" src="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['server']}js/plausible.js"></script>
async defer data-domain="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['domain']}"
src="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['server']}js/plausible.js"></script>
{ifset bodyScripts} {ifset bodyScripts}
{include bodyScripts} {include bodyScripts}

View file

@ -28,8 +28,7 @@
text-align: center !important; text-align: center !important;
} }
td, td, th {
th {
border: 1px solid #666; border: 1px solid #666;
vertical-align: baseline; vertical-align: baseline;
padding: 4px 5px; padding: 4px 5px;
@ -62,7 +61,7 @@
.h { .h {
background-color: #13599f; background-color: #13599f;
font-weight: bold; font-weight: bold;
color: #fff color: #fff;
} }
.v { .v {
@ -133,7 +132,7 @@
<tr class="v"> <tr class="v">
<td> <td>
This program makes use of the Chandler open-source web application server:<br/> This program makes use of the Chandler open-source web application server:<br/>
libchandler {=CHANDLER_VER} by rem-pai libchandler {=CHANDLER_VER} by Celestora
</td> </td>
</tr> </tr>
</tbody> </tbody>
@ -362,7 +361,7 @@
Default OpenVK look and feel. Default OpenVK look and feel.
</td> </td>
<td class="v"> <td class="v">
Vladimir Barinov, Konstantin Kichulkin and Daniil Myslivets Vladimir Barinov, Konstantin Kichulkin and Daniel Myslivets
</td> </td>
</tr> </tr>
<tr n:foreach="$themes as $theme"> <tr n:foreach="$themes as $theme">
@ -396,8 +395,8 @@
</tr> </tr>
<tr> <tr>
<td class="e"> <td class="e">
Vladimir Barinov (veselcraft), Alexandra Katunina (rem-pai), Konstantin Kichulkin (kosfurler), Vladimir Barinov (veselcraft), Celestora, Konstantin Kichulkin (kosfurler),
Nikita Volkov (sup_ban), Daniel Myslivets (myslivets), Alexander Kotov (l-lacker), Nikita Volkov (sup_ban), Daniel Myslivets, Alexander Kotov (l-lacker),
Alexey Assemblerov (BiosNod), Ilya Prokopenko (dsrev) and Maxim Leshchenko (maksales / maksalees) Alexey Assemblerov (BiosNod), Ilya Prokopenko (dsrev) and Maxim Leshchenko (maksales / maksalees)
</td> </td>
</tr> </tr>
@ -459,7 +458,7 @@
</tr> </tr>
<tr> <tr>
<td class="e">Initial hosting</td> <td class="e">Initial hosting</td>
<td class="v">Ilya Prokopenko (dsrev) and Alexandra Katunina (rem-pai)</td> <td class="v">Ilya Prokopenko (dsrev) and Celestora</td>
</tr> </tr>
<tr> <tr>
<td class="e">Initial bug-tracker hosting</td> <td class="e">Initial bug-tracker hosting</td>
@ -467,22 +466,18 @@
</tr> </tr>
<tr> <tr>
<td class="e">Images</td> <td class="e">Images</td>
<td class="v">Vladimir Barinov (veselcraft), Konstantin Kichulkin (kosfurler) and Daniil Myslivets (myslivets)</td> <td class="v">Vladimir Barinov (veselcraft), Konstantin Kichulkin (kosfurler) and Daniel Myslivets</td>
</tr> </tr>
<tr> <tr>
<td class="e">Illustrations</td> <td class="e">Illustrations</td>
<td class="v">Ash Defenders</td> <td class="v">Ash Defenders, Polina Katunina (RousPhaul)</td>
</tr>
<tr>
<td class="e">Soundtrack</td>
<td class="v">Ash Defenders</td>
</tr> </tr>
<tr> <tr>
<td class="e">Best barmaid</td> <td class="e">Best barmaid</td>
<td class="v">Jill</td> <td class="v">Jill</td> {* I can agree ~~ dsrev *}
</tr> </tr>
<tr> <tr>
<td class="e">Helpdesk implementation</td> <td class="e">Initial Helpdesk implementation</td>
<td class="v">Nikita Volkov (sup_ban)</td> <td class="v">Nikita Volkov (sup_ban)</td>
</tr> </tr>
</tbody> </tbody>
@ -495,8 +490,10 @@
</tr> </tr>
<tr class="e"> <tr class="e">
<td> <td>
Vladimir Lapskiy (0x7d5), Alexander Minkin (WerySkok), Polina Katunina (RousPhaul), kovaltim, Vladimir Lapskiy (0x7d5), Alexander Minkin (WerySkok), Polina Katunina (RousPhaul), veth,
Egor Shevchenko, Dmitriy Daemon and Ilya Prokopenko (dsrev). Egor Shevchenko, Vadim Korovin (yuni), Ash Defenders,
Pavel Silaev, Dmitriy Daemon, Ilya Prokopenko (dsrev),
cmed404 and unknown tester, who disappeared shortly after trying to upload post with cat.
</td> </td>
</tr> </tr>
</tbody> </tbody>