Compare commits

...

15 Commits

Author SHA1 Message Date
b037373799 run composer 2025-04-18 18:33:57 -04:00
Lorenzo Yario
83b644f0f5 Merge pull request #920 from vichan-devel/5.2.1
5.2.1 Release
2025-04-02 04:45:22 -05:00
Lorenzo Yario
953635f807 Delete static/banners/.gitkeep 2025-04-02 04:44:51 -05:00
Lorenzo Yario
5968118231 bugfix 2025-04-02 04:39:20 -05:00
Lorenzo Yario
03da3b8db0 bug fix 2025-04-02 04:27:38 -05:00
Lorenzo Yario
f27e5a6989 ensure premade ban reasons are passed 2025-04-02 04:04:08 -05:00
Lorenzo Yario
0866adc89f styling for predefined ban reasons 2025-04-02 03:56:03 -05:00
Lorenzo Yario
5259f88262 Update config.php 2025-04-02 03:46:07 -05:00
Lorenzo Yario
87420966b2 kick doesn't seem all too bad anymore. Removed X/Bluesky test 2025-04-02 03:03:58 -05:00
Lorenzo Yario
8350645a70 we don't need kick it doesn't embed nicely 2025-04-02 02:52:44 -05:00
Lorenzo Yario
54f32bc75d X 2025-03-30 21:54:28 -05:00
Lorenzo Yario
5f1598367c Merge pull request #783 from perdedora/fix-poster-id
fix: wrong poster id for op in api
2025-03-16 02:59:08 -05:00
Weav
3987b2a25d Merge branch 'master' into fix-poster-id 2025-03-15 17:18:22 +00:00
Weav
562ad74a12 Merge branch 'vichan-devel:master' into fix-poster-id 2024-08-09 14:16:42 -03:00
fowr
73fce5e571 fix: wrong poster id for op; 2024-08-09 14:10:18 -03:00
8 changed files with 161 additions and 114 deletions

198
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "72e79f203581eea6e6b0455147b25878",
"content-hash": "6298cafcd8c1a268baa833023b9dfce9",
"packages": [
{
"name": "dapphp/securimage",
@@ -63,6 +63,56 @@
"abandoned": true,
"time": "2020-05-30T10:05:48+00:00"
},
{
"name": "erusev/parsedown",
"version": "1.7.4",
"source": {
"type": "git",
"url": "https://github.com/erusev/parsedown.git",
"reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
"reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35"
},
"type": "library",
"autoload": {
"psr-0": {
"Parsedown": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Emanuil Rusev",
"email": "hello@erusev.com",
"homepage": "http://erusev.com"
}
],
"description": "Parser for Markdown.",
"homepage": "http://parsedown.org",
"keywords": [
"markdown",
"parser"
],
"support": {
"issues": "https://github.com/erusev/parsedown/issues",
"source": "https://github.com/erusev/parsedown/tree/1.7.x"
},
"time": "2019-12-30T22:54:17+00:00"
},
{
"name": "geoip/geoip",
"version": "v1.17",
@@ -119,16 +169,16 @@
},
{
"name": "gettext/gettext",
"version": "v5.7.0",
"version": "v5.7.3",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Gettext.git",
"reference": "8657e580747bb3baacccdcebe69cac094661e404"
"reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-gettext/Gettext/zipball/8657e580747bb3baacccdcebe69cac094661e404",
"reference": "8657e580747bb3baacccdcebe69cac094661e404",
"url": "https://api.github.com/repos/php-gettext/Gettext/zipball/95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1",
"reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1",
"shasum": ""
},
"require": {
@@ -173,7 +223,7 @@
"support": {
"email": "oom@oscarotero.com",
"issues": "https://github.com/php-gettext/Gettext/issues",
"source": "https://github.com/php-gettext/Gettext/tree/v5.7.0"
"source": "https://github.com/php-gettext/Gettext/tree/v5.7.3"
},
"funding": [
{
@@ -189,20 +239,20 @@
"type": "patreon"
}
],
"time": "2022-07-27T19:54:55+00:00"
"time": "2024-12-01T10:18:08+00:00"
},
{
"name": "gettext/languages",
"version": "2.10.0",
"version": "2.12.1",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Languages.git",
"reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab"
"reference": "0b0b0851c55168e1dfb14305735c64019732b5f1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab",
"reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab",
"url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1",
"reference": "0b0b0851c55168e1dfb14305735c64019732b5f1",
"shasum": ""
},
"require": {
@@ -212,7 +262,8 @@
"phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
},
"bin": [
"bin/export-plural-rules"
"bin/export-plural-rules",
"bin/import-cldr-data"
],
"type": "library",
"autoload": {
@@ -251,7 +302,7 @@
],
"support": {
"issues": "https://github.com/php-gettext/Languages/issues",
"source": "https://github.com/php-gettext/Languages/tree/2.10.0"
"source": "https://github.com/php-gettext/Languages/tree/2.12.1"
},
"funding": [
{
@@ -263,7 +314,7 @@
"type": "github"
}
],
"time": "2022-10-18T15:00:10+00:00"
"time": "2025-03-19T11:14:02+00:00"
},
{
"name": "lifo/ip",
@@ -365,26 +416,26 @@
},
{
"name": "phpmyadmin/twig-i18n-extension",
"version": "v4.0.1",
"version": "4.1.3",
"source": {
"type": "git",
"url": "https://github.com/phpmyadmin/twig-i18n-extension.git",
"reference": "c0d0dd171cd1c7733bf152fd44b61055843df052"
"reference": "4c9e1e3554dfff3091679c8f16a9c2c28a397e38"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpmyadmin/twig-i18n-extension/zipball/c0d0dd171cd1c7733bf152fd44b61055843df052",
"reference": "c0d0dd171cd1c7733bf152fd44b61055843df052",
"url": "https://api.github.com/repos/phpmyadmin/twig-i18n-extension/zipball/4c9e1e3554dfff3091679c8f16a9c2c28a397e38",
"reference": "4c9e1e3554dfff3091679c8f16a9c2c28a397e38",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0",
"php": "^7.2 || ^8.0",
"twig/twig": "^1.42.3|^2.0|^3.0"
},
"require-dev": {
"phpmyadmin/coding-standard": "^3.0.0",
"phpmyadmin/motranslator": "^5.2",
"phpstan/phpstan": "^0.12.66",
"phpstan/phpstan": "^1.9.4",
"phpunit/phpunit": "^7 || ^8 || ^9"
},
"type": "library",
@@ -417,24 +468,24 @@
"issues": "https://github.com/phpmyadmin/twig-i18n-extension/issues",
"source": "https://github.com/phpmyadmin/twig-i18n-extension"
},
"time": "2021-06-10T15:53:38+00:00"
"time": "2024-09-08T16:46:55+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.27.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
"reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
"reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"provide": {
"ext-ctype": "*"
@@ -444,12 +495,9 @@
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@@ -483,7 +531,7 @@
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
},
"funding": [
{
@@ -499,24 +547,24 @@
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.27.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"provide": {
"ext-mbstring": "*"
@@ -526,12 +574,9 @@
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@@ -566,7 +611,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
},
"funding": [
{
@@ -582,41 +627,30 @@
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php72",
"version": "v1.27.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
"reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce",
"reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"type": "library",
"type": "metapackage",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php72\\": ""
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -642,7 +676,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
"source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0"
},
"funding": [
{
@@ -658,20 +692,20 @@
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "twig/twig",
"version": "v2.15.4",
"version": "v2.16.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3"
"reference": "19185947ec75d433a3ac650af32fc05649b95ee1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/3e059001d6d597dd50ea7c74dd2464b4adea48d3",
"reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/19185947ec75d433a3ac650af32fc05649b95ee1",
"reference": "19185947ec75d433a3ac650af32fc05649b95ee1",
"shasum": ""
},
"require": {
@@ -682,12 +716,12 @@
},
"require-dev": {
"psr/container": "^1.0",
"symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
"symfony/phpunit-bridge": "^5.4.9|^6.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.15-dev"
"dev-master": "2.16-dev"
}
},
"autoload": {
@@ -726,7 +760,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v2.15.4"
"source": "https://github.com/twigphp/Twig/tree/v2.16.1"
},
"funding": [
{
@@ -738,20 +772,24 @@
"type": "tidelift"
}
],
"time": "2022-12-27T12:26:20+00:00"
"time": "2024-09-09T17:53:56+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"ext-mbstring": ">=5.4",
"ext-gd": ">=5.4",
"ext-pdo": ">=5.4"
"php": ">=7.4",
"ext-mbstring": ">=7.4",
"ext-gd": ">=7.4",
"ext-pdo": ">=7.4"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
"platform-dev": {},
"platform-overrides": {
"php": "7.4"
},
"plugin-api-version": "2.6.0"
}

View File

@@ -119,8 +119,9 @@ class Api {
$fields = $threadsPage ? self::THREADS_PAGE_FIELDS : $this->postFields;
$this->translateFields($fields, $post, $apiPost);
if (isset($config['poster_ids']) && $config['poster_ids']) {
$apiPost['id'] = poster_id($post->ip, $post->thread, $board['uri']);
$apiPost['id'] = poster_id($post->ip, $post->thread ?? $post->id);
}
if ($threadsPage) {
return $apiPost;

View File

@@ -1164,7 +1164,7 @@
'<iframe style="float: left; margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%" frameborder="0" src="https://www.dailymotion.com/embed/video/$2" allowfullscreen></iframe>'
),
array(
'/^https?:\/\/(www\.)?rumble\.com\/(?:embed\/)?([a-zA-Z0-9]+)(?:\/[a-zA-Z0-9\-]+\.html)?(?:\?[^\'"<>]*)?$/i',
'/^https?:\/\/(www\.)?rumble\.com\/embed\/([a-zA-Z0-9]+)(\/\?[^\'"<>]*)?$/i',
'<iframe class="rumble" width="%%tb_width%%" height="%%tb_height%%" src="https://rumble.com/embed/$2/" frameborder="0" allowfullscreen></iframe>'
),
array(
@@ -1172,14 +1172,15 @@
'<iframe allowfullscreen="true" width="%%tb_width%%" height="%%tb_height%%" scrolling="no" frameborder="0" style="border: none;" src="https://www.bitchute.com/embed/$2"></iframe>'
),
array(
'/^https?:\/\/(www\.)?kick\.com\/([a-zA-Z0-9_]+)(\?[^\'"<>]*)?$/i',
'<iframe src="https://kick.com/embed/$2" frameborder="0" allowfullscreen="true" scrolling="no" height="%%tb_height%%" width="%%tb_width%%"></iframe>'
'/^https?:\/\/(?:www\.)?odysee\.com\/(?:@[^\/]+\/)?([-a-zA-Z0-9_]+:[a-zA-Z0-9]+)(\/)?(\?[^\'"<>]*)?$/i',
'<iframe width="%%tb_width%%" height="%%tb_height%%" src="https://odysee.com/$/embed/$1" allowfullscreen></iframe>'
),
array(
'/^https?:\/\/(www\.)?odysee\.com\/(?:\$\/embed\/)?(?:@[^:\/]+:[a-zA-Z0-9]+\/)?[a-zA-Z0-9\-]+:([a-zA-Z0-9]+)(\/)?(\?[^\'"<>]*)?$/i',
'<iframe width="%%tb_width%%" height="%%tb_height%%" src="https://odysee.com/$/embed/$2" allowfullscreen></iframe>'
),
'/^https?:\/\/(www\.)?kick\.com\/([a-zA-Z0-9_]+)(\?[^\'"<>]*)?$/i',
'<iframe src="https://player.kick.com/$2" height="%%tb_height%%" width="%%tb_width%%" frameborder="0" scrolling="no" allowfullscreen="true"></iframe>'
),
/*
//Both TikTok and Instagram are commented out since they contain some extra scripting you might not want natively on your website.
array(
'/^https?:\/\/(www\.)?tiktok\.com\/@([a-zA-Z0-9_.]+)\/video\/([0-9]+)(\?[^\'"<>]*)?$/i',
'<blockquote class="tiktok-embed" cite="https://www.tiktok.com/@$2/video/$3" data-video-id="$3" style="max-width: %%tb_width%%px;min-width: 325px;"><section></section></blockquote><script async src="https://www.tiktok.com/embed.js"></script>'
@@ -1188,22 +1189,7 @@
'/^https?:\/\/(www\.)?instagram\.com\/(p|reel|tv)\/([a-zA-Z0-9_-]+)(\/)?(\?[^\'"<>]*)?$/i',
'<blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/$2/$3/" data-instgrm-version="14" style="max-width: %%tb_width%%px; min-width: 326px; width: 100%;"></blockquote><script async src="//www.instagram.com/embed.js"></script>'
),
array(
'/^https?:\/\/(www\.)?(twitter|x)\.com\/([a-zA-Z0-9_]+)\/status\/([0-9]+)(\?[^\'"<>]*)?$/i',
'<blockquote class="twitter-tweet"><a href="https://x.com/$3/status/$4"></a></blockquote><script async src="https://platform.x.com/widgets.js"></script>'
),
array(
'/^https?:\/\/(www\.)?bsky\.app\/profile\/([a-zA-Z0-9_.-]+)\/post\/([a-zA-Z0-9]+)(\?[^\'"<>]*)?$/i',
'<iframe src="https://embed.bsky.app/profile/$2/post/$3" width="%%tb_width%%" height="300" style="border:none; overflow:hidden;" scrolling="no"></iframe>'
),*/
array(
'/^https?:\/\/(www\.)?bilibili\.com\/video\/(BV[a-zA-Z0-9]+|av[0-9]+)(\/)?(\?[^\'"<>]*)?$/i',
'<iframe width="%%tb_width%%" height="%%tb_height%%" src="https://player.bilibili.com/player.html?bvid=$2" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>'
),
array(
'/^https?:\/\/(www\.)?(nicovideo\.jp\/watch|nico\.ms)\/(sm[0-9]+)(\?[^\'"<>]*)?$/i',
'<iframe width="%%tb_width%%" height="%%tb_height%%" src="https://embed.nicovideo.jp/watch/$3" frameborder="0" allowfullscreen></iframe>'
),
*/
array(
'/^https?:\/\/(\w+\.)?(vocaroo\.com\/|voca\.ro\/)([a-zA-Z0-9]{2,12})$/i',
'<iframe style="float: left; margin: 10px 20px;" width="300" height="60" frameborder="0" src="https://vocaroo.com/embed/$3"></iframe>'

View File

@@ -60,8 +60,8 @@ var banlist_init = function(token, my_boards, inMod) {
// duration?
expires: {name: _("Expires"), width: "235px", fmt: function(f) {
if (!f.expires || f.expires == 0) return "<em>"+_("never")+"</em>";
return strftime(window.post_date, new Date((f.expires|0)*1000), datelocale) +
((f.expires < time()) ? "" : " <small>"+_("in ")+until(f.expires|0)+"</small>");
var formattedDate = strftime("%m/%d/%Y (%a) %H:%M:%S", new Date((f.expires|0)*1000), datelocale);
return formattedDate + ((f.expires < time()) ? "" : " <small>"+_("in ")+until(f.expires|0)+"</small>");
} },
username: {name: _("Staff"), width: "100px", fmt: function(f) {
var pre='',suf='',un=f.username;

View File

@@ -1 +0,0 @@

View File

@@ -1234,12 +1234,35 @@ div.mix {
display: inline-block;
}
.ban-reason-table .warning-reason-table tr td:first-child {
text-align: right;
padding-right: 10px;
.ban-reason-table {
margin: 10px auto;
border-collapse: collapse;
width: auto;
font-size: 10pt;
}
.ban-reason-table .warning-reason-table tr:hover td {
cursor: pointer;
background-color: rgba(100%,100%,100%,0.2);
.ban-reason-table th,
.ban-reason-table td {
border: 1px solid #98E;
padding: 4px 8px;
text-align: left;
}
.ban-reason-table th {
background-color: #98E;
color: black;
font-weight: bold;
}
.ban-reason-table tr:nth-child(even) td {
background-color: #EEF2FF;
}
.ban-reason-table tr:nth-child(odd) td {
background-color: #FFFFFF;
}
.ban-reason-table tr:hover td {
background-color: #D6DAF0;
cursor: pointer;
}

View File

@@ -11,7 +11,7 @@
</tr>
<tr>
<th>{% trans 'IP' %}</th>
<td>{{ ban.cmask }}</td>
<td><a class="ip-link" style="margin:0;" href="?/IP/{{ ban.mask|cloak_mask }}">{{ ban.mask|cloak_mask }}</a></td>
</tr>
<tr>
<th>{% trans 'Reason' %}</th>

View File

@@ -103,7 +103,7 @@
<fieldset>
<legend>{% trans 'New ban' %}</legend>
{% set redirect = '?/IP/' ~ ip|cloak_ip ~ '#bans' %}
{% include 'mod/ban_form.html' %}
{% include 'mod/ban_form.html' with { 'reasons': config.premade_ban_reasons } %}
</fieldset>
{% endif %}