Skip to content

Commit 371e787

Browse files
authored
Merge branch '6.0-dev' into github_codespaces
2 parents 493aa9a + 70997a3 commit 371e787

File tree

430 files changed

+5308
-18891
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

430 files changed

+5308
-18891
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ jobs:
140140
- name: Start LDAP container
141141
uses: docker://docker
142142
with:
143-
args: docker run -d --name openldap --network ${{ job.container.network }} --network-alias openldap -e "LDAP_ADMIN_USERNAME=admin" -e "LDAP_ADMIN_PASSWORD=adminpassword" -e "LDAP_USERS=customuser" -e "LDAP_PASSWORDS=custompassword" -e "LDAP_ENABLE_TLS=yes" -e "LDAP_TLS_CERT_FILE=/certs/openldap.crt" -e "LDAP_TLS_KEY_FILE=/certs/openldap.key" -e "LDAP_TLS_CA_FILE=/certs/CA.crt" -e "BITNAMI_DEBUG=true" -e "LDAP_CONFIG_ADMIN_ENABLED=yes" -e "LDAP_CONFIG_ADMIN_USERNAME=admin" -e "LDAP_CONFIG_ADMIN_PASSWORD=configpassword" -v "${{ github.workspace }}/tests/certs/openldap.crt":"/certs/openldap.crt" -v "${{ github.workspace }}/tests/certs/openldap.key":"/certs/openldap.key" -v "${{ github.workspace }}/tests/certs/CA.crt":"/certs/CA.crt" bitnami/openldap:latest
143+
args: docker run -d --name openldap --network ${{ job.container.network }} --network-alias openldap -e "LDAP_ADMIN_USERNAME=admin" -e "LDAP_ADMIN_PASSWORD=adminpassword" -e "LDAP_USERS=customuser" -e "LDAP_PASSWORDS=custompassword" -e "LDAP_ENABLE_TLS=yes" -e "LDAP_TLS_CERT_FILE=/certs/openldap.crt" -e "LDAP_TLS_KEY_FILE=/certs/openldap.key" -e "LDAP_TLS_CA_FILE=/certs/CA.crt" -e "BITNAMI_DEBUG=true" -e "LDAP_CONFIG_ADMIN_ENABLED=yes" -e "LDAP_CONFIG_ADMIN_USERNAME=admin" -e "LDAP_CONFIG_ADMIN_PASSWORD=configpassword" -v "${{ github.workspace }}/tests/certs/openldap.crt":"/certs/openldap.crt" -v "${{ github.workspace }}/tests/certs/openldap.key":"/certs/openldap.key" -v "${{ github.workspace }}/tests/certs/CA.crt":"/certs/CA.crt" ghcr.io/joomla-projects/mirror-bitnami-openldap:latest
144144
- uses: actions/cache/restore@v4
145145
with:
146146
path: libraries/vendor

administrator/components/com_actionlogs/src/View/Actionlogs/HtmlView.php

Lines changed: 26 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@
1111
namespace Joomla\Component\Actionlogs\Administrator\View\Actionlogs;
1212

1313
use Joomla\CMS\Component\ComponentHelper;
14-
use Joomla\CMS\Form\Form;
1514
use Joomla\CMS\Language\Text;
16-
use Joomla\CMS\MVC\View\GenericDataException;
17-
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
18-
use Joomla\CMS\Pagination\Pagination;
15+
use Joomla\CMS\MVC\View\ListView;
1916
use Joomla\CMS\Toolbar\ToolbarHelper;
2017
use Joomla\Component\Actionlogs\Administrator\Helper\ActionlogsHelper;
21-
use Joomla\Component\Actionlogs\Administrator\Model\ActionlogsModel;
2218

2319
// phpcs:disable PSR1.Files.SideEffects
2420
\defined('_JEXEC') or die;
@@ -29,48 +25,8 @@
2925
*
3026
* @since 3.9.0
3127
*/
32-
class HtmlView extends BaseHtmlView
28+
class HtmlView extends ListView
3329
{
34-
/**
35-
* An array of items.
36-
*
37-
* @var array
38-
* @since 3.9.0
39-
*/
40-
protected $items;
41-
42-
/**
43-
* The model state
44-
*
45-
* @var array
46-
* @since 3.9.0
47-
*/
48-
protected $state;
49-
50-
/**
51-
* The pagination object
52-
*
53-
* @var Pagination
54-
* @since 3.9.0
55-
*/
56-
protected $pagination;
57-
58-
/**
59-
* Form object for search filters
60-
*
61-
* @var Form
62-
* @since 3.9.0
63-
*/
64-
public $filterForm;
65-
66-
/**
67-
* The active search filters
68-
*
69-
* @var array
70-
* @since 3.9.0
71-
*/
72-
public $activeFilters;
73-
7430
/**
7531
* Setting if the IP column should be shown
7632
*
@@ -88,44 +44,46 @@ class HtmlView extends BaseHtmlView
8844
protected $dateRelative = false;
8945

9046
/**
91-
* Method to display the view.
47+
* Constructor
9248
*
93-
* @param string $tpl A template file to load. [optional]
49+
* @param array $config An optional associative array of configuration settings.
9450
*
95-
* @return void
51+
* @since __DEPLOY_VERSION__
52+
*/
53+
public function __construct(array $config)
54+
{
55+
if (empty($config['option'])) {
56+
$config['option'] = 'com_actionlogs';
57+
}
58+
59+
$config['toolbar_title'] = 'COM_ACTIONLOGS_MANAGER_USERLOGS';
60+
$config['toolbar_icon'] = 'list-2 actionlog';
61+
62+
parent::__construct($config);
63+
}
64+
65+
/**
66+
* Prepare view data
9667
*
97-
* @since 3.9.0
68+
* @return void
9869
*
99-
* @throws \Exception
70+
* @since __DEPLOY_VERSION__
10071
*/
101-
public function display($tpl = null)
72+
protected function initializeView()
10273
{
103-
/** @var ActionlogsModel $model */
104-
$model = $this->getModel();
105-
$this->items = $model->getItems();
106-
$this->state = $model->getState();
107-
$this->pagination = $model->getPagination();
108-
$this->filterForm = $model->getFilterForm();
109-
$this->activeFilters = $model->getActiveFilters();
74+
parent::initializeView();
75+
11076
$params = ComponentHelper::getParams('com_actionlogs');
11177
$this->showIpColumn = (bool) $params->get('ip_logging', 0);
11278
$this->dateRelative = (bool) $params->get('date_relative', 1);
11379

114-
if (\count($errors = $model->getErrors())) {
115-
throw new GenericDataException(implode("\n", $errors), 500);
116-
}
117-
118-
$this->addToolbar();
119-
12080
// Load all actionlog plugins language files
12181
ActionlogsHelper::loadActionLogPluginsLanguage();
12282

12383
// Add form control fields
12484
$this->filterForm
12585
->addControlField('task', '')
12686
->addControlField('boxchecked', '0');
127-
128-
parent::display($tpl);
12987
}
13088

13189
/**
@@ -138,6 +96,7 @@ public function display($tpl = null)
13896
protected function addToolbar()
13997
{
14098
ToolbarHelper::title(Text::_('COM_ACTIONLOGS_MANAGER_USERLOGS'), 'icon-list-2');
99+
141100
$toolbar = $this->getDocument()->getToolbar();
142101

143102
$toolbar->standardButton('download', 'COM_ACTIONLOGS_EXPORT_CSV', 'actionlogs.exportSelectedLogs')

administrator/components/com_admin/script.php

Lines changed: 176 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false)
452452
'/administrator/components/com_admin/sql/updates/mysql/5.3.0-2025-03-14.sql',
453453
'/administrator/components/com_admin/sql/updates/mysql/5.4.0-2025-04-23.sql',
454454
'/administrator/components/com_admin/sql/updates/mysql/5.4.0-2025-05-10.sql',
455+
'/administrator/components/com_admin/sql/updates/mysql/5.4.0-2025-08-02.sql',
455456
'/administrator/components/com_admin/sql/updates/postgresql/5.0.0-2023-03-11.sql',
456457
'/administrator/components/com_admin/sql/updates/postgresql/5.0.0-2023-03-17.sql',
457458
'/administrator/components/com_admin/sql/updates/postgresql/5.0.0-2023-07-12.sql',
@@ -488,6 +489,7 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false)
488489
'/administrator/components/com_admin/sql/updates/postgresql/5.3.1-2025-04-27.sql',
489490
'/administrator/components/com_admin/sql/updates/postgresql/5.4.0-2025-04-23.sql',
490491
'/administrator/components/com_admin/sql/updates/postgresql/5.4.0-2025-05-10.sql',
492+
'/administrator/components/com_admin/sql/updates/postgresql/5.4.0-2025-08-02.sql',
491493
'/administrator/components/com_content/forms/filter_featured.xml',
492494
'/administrator/components/com_content/tmpl/featured/default.php',
493495
'/administrator/components/com_content/tmpl/featured/default.xml',
@@ -523,9 +525,6 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false)
523525
'/libraries/src/Input/Files.php',
524526
'/libraries/src/Input/Input.php',
525527
'/libraries/src/Input/Json.php',
526-
'/libraries/vendor/algo26-matthias/idna-convert/src/NamePrep/CaseFolding.php',
527-
'/libraries/vendor/algo26-matthias/idna-convert/src/NamePrep/CaseFoldingData.php',
528-
'/libraries/vendor/algo26-matthias/idna-convert/src/NamePrep/CaseFoldingDataInterface.php',
529528
'/libraries/vendor/symfony/polyfill-iconv/bootstrap.php',
530529
'/libraries/vendor/symfony/polyfill-iconv/bootstrap80.php',
531530
'/libraries/vendor/symfony/polyfill-iconv/Iconv.php',
@@ -824,6 +823,164 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false)
824823
'/media/legacy/js/tabs-state.js',
825824
'/media/legacy/js/tabs-state.min.js',
826825
'/media/legacy/js/tabs-state.min.js.gz',
826+
// From 6.0.0-alpha2 to 6.0.0-alpha3
827+
'/administrator/modules/mod_menu/mod_menu.php',
828+
'/modules/mod_random_image/mod_random_image.php',
829+
// From 6.0.0-alpha3 to 6.0.0-beta1
830+
'/administrator/modules/mod_latest/mod_latest.php',
831+
'/administrator/modules/mod_logged/mod_logged.php',
832+
'/administrator/modules/mod_popular/mod_popular.php',
833+
'/administrator/modules/mod_privacy_dashboard/mod_privacy_dashboard.php',
834+
'/administrator/modules/mod_submenu/mod_submenu.php',
835+
'/libraries/src/Adapter/Adapter.php',
836+
'/libraries/src/Adapter/AdapterInstance.php',
837+
'/libraries/src/MVC/Model/DatabaseAwareTrait.php',
838+
'/libraries/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php',
839+
'/libraries/vendor/joomla/database/src/Query/LimitableInterface.php',
840+
'/libraries/vendor/joomla/database/src/Query/PreparableInterface.php',
841+
'/libraries/vendor/joomla/string/src/phputf8/LICENSE',
842+
'/libraries/vendor/joomla/string/src/phputf8/mbstring/core.php',
843+
'/libraries/vendor/joomla/string/src/phputf8/native/core.php',
844+
'/libraries/vendor/joomla/string/src/phputf8/ord.php',
845+
'/libraries/vendor/joomla/string/src/phputf8/README',
846+
'/libraries/vendor/joomla/string/src/phputf8/str_ireplace.php',
847+
'/libraries/vendor/joomla/string/src/phputf8/str_pad.php',
848+
'/libraries/vendor/joomla/string/src/phputf8/str_split.php',
849+
'/libraries/vendor/joomla/string/src/phputf8/strcasecmp.php',
850+
'/libraries/vendor/joomla/string/src/phputf8/strcspn.php',
851+
'/libraries/vendor/joomla/string/src/phputf8/stristr.php',
852+
'/libraries/vendor/joomla/string/src/phputf8/strrev.php',
853+
'/libraries/vendor/joomla/string/src/phputf8/strspn.php',
854+
'/libraries/vendor/joomla/string/src/phputf8/substr_replace.php',
855+
'/libraries/vendor/joomla/string/src/phputf8/trim.php',
856+
'/libraries/vendor/joomla/string/src/phputf8/ucfirst.php',
857+
'/libraries/vendor/joomla/string/src/phputf8/ucwords.php',
858+
'/libraries/vendor/joomla/string/src/phputf8/utf8.php',
859+
'/libraries/vendor/joomla/string/src/phputf8/utils/ascii.php',
860+
'/libraries/vendor/joomla/string/src/phputf8/utils/bad.php',
861+
'/libraries/vendor/joomla/string/src/phputf8/utils/patterns.php',
862+
'/libraries/vendor/joomla/string/src/phputf8/utils/position.php',
863+
'/libraries/vendor/joomla/string/src/phputf8/utils/specials.php',
864+
'/libraries/vendor/joomla/string/src/phputf8/utils/unicode.php',
865+
'/libraries/vendor/joomla/string/src/phputf8/utils/validation.php',
866+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/create_uploaded_file.legacy.php',
867+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.legacy.php',
868+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.legacy.php',
869+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/marshal_protocol_version_from_sapi.legacy.php',
870+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.legacy.php',
871+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php',
872+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/normalize_server.legacy.php',
873+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/normalize_uploaded_files.legacy.php',
874+
'/libraries/vendor/laminas/laminas-diactoros/src/functions/parse_cookie_header.legacy.php',
875+
'/libraries/vendor/laminas/laminas-diactoros/src/PhpInputStream.php',
876+
'/libraries/vendor/lcobucci/clock/renovate.json',
877+
'/libraries/vendor/symfony/http-client/Internal/AmpBody.php',
878+
'/libraries/vendor/symfony/http-client/Internal/AmpClientState.php',
879+
'/libraries/vendor/symfony/http-client/Internal/AmpListener.php',
880+
'/libraries/vendor/symfony/http-client/Internal/AmpResolver.php',
881+
'/libraries/vendor/symfony/http-client/Internal/LegacyHttplugInterface.php',
882+
'/libraries/vendor/symfony/http-client/Response/AmpResponse.php',
883+
'/libraries/vendor/symfony/polyfill-php83/bootstrap.php',
884+
'/libraries/vendor/symfony/polyfill-php83/bootstrap81.php',
885+
'/libraries/vendor/symfony/polyfill-php83/LICENSE',
886+
'/libraries/vendor/symfony/polyfill-php83/Php83.php',
887+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php',
888+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php',
889+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php',
890+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php',
891+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php',
892+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php',
893+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php',
894+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php',
895+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php',
896+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/Override.php',
897+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php',
898+
'/media/legacy/js/ajax-chosen.js',
899+
'/media/legacy/js/ajax-chosen.min.js',
900+
'/media/legacy/js/ajax-chosen.min.js.gz',
901+
'/media/legacy/js/joomla-chosen.js',
902+
'/media/legacy/js/joomla-chosen.min.js',
903+
'/media/legacy/js/joomla-chosen.min.js.gz',
904+
'/media/system/js/fields/tag.js',
905+
'/media/system/js/fields/tag.min.js',
906+
'/media/system/js/fields/tag.min.js.gz',
907+
'/media/templates/site/cassiopeia/scss/vendor/_chosen.scss',
908+
'/media/vendor/chosen/css/chosen-sprite.png',
909+
'/media/vendor/chosen/css/chosen-sprite@2x.png',
910+
'/media/vendor/chosen/css/chosen.css',
911+
'/media/vendor/chosen/js/chosen.jquery.js',
912+
'/media/vendor/chosen/js/chosen.jquery.min.js',
913+
'/media/vendor/chosen/js/chosen.jquery.min.js.gz',
914+
'/media/vendor/tinymce/langs/af.js',
915+
'/media/vendor/tinymce/langs/af.min.js',
916+
'/media/vendor/tinymce/langs/af.min.js.gz',
917+
'/media/vendor/tinymce/langs/bg.js',
918+
'/media/vendor/tinymce/langs/bg.min.js',
919+
'/media/vendor/tinymce/langs/bg.min.js.gz',
920+
'/media/vendor/tinymce/langs/bs.js',
921+
'/media/vendor/tinymce/langs/bs.min.js',
922+
'/media/vendor/tinymce/langs/bs.min.js.gz',
923+
'/media/vendor/tinymce/langs/fo.js',
924+
'/media/vendor/tinymce/langs/fo.min.js',
925+
'/media/vendor/tinymce/langs/fo.min.js.gz',
926+
'/media/vendor/tinymce/langs/fr.js',
927+
'/media/vendor/tinymce/langs/fr.min.js',
928+
'/media/vendor/tinymce/langs/fr.min.js.gz',
929+
'/media/vendor/tinymce/langs/he.js',
930+
'/media/vendor/tinymce/langs/he.min.js',
931+
'/media/vendor/tinymce/langs/he.min.js.gz',
932+
'/media/vendor/tinymce/langs/hu.js',
933+
'/media/vendor/tinymce/langs/hu.min.js',
934+
'/media/vendor/tinymce/langs/hu.min.js.gz',
935+
'/media/vendor/tinymce/langs/ka.js',
936+
'/media/vendor/tinymce/langs/ka.min.js',
937+
'/media/vendor/tinymce/langs/ka.min.js.gz',
938+
'/media/vendor/tinymce/langs/km.js',
939+
'/media/vendor/tinymce/langs/km.min.js',
940+
'/media/vendor/tinymce/langs/km.min.js.gz',
941+
'/media/vendor/tinymce/langs/ko.js',
942+
'/media/vendor/tinymce/langs/ko.min.js',
943+
'/media/vendor/tinymce/langs/ko.min.js.gz',
944+
'/media/vendor/tinymce/langs/lb.js',
945+
'/media/vendor/tinymce/langs/lb.min.js',
946+
'/media/vendor/tinymce/langs/lb.min.js.gz',
947+
'/media/vendor/tinymce/langs/mk.js',
948+
'/media/vendor/tinymce/langs/mk.min.js',
949+
'/media/vendor/tinymce/langs/mk.min.js.gz',
950+
'/media/vendor/tinymce/langs/ms.js',
951+
'/media/vendor/tinymce/langs/ms.min.js',
952+
'/media/vendor/tinymce/langs/ms.min.js.gz',
953+
'/media/vendor/tinymce/langs/nb.js',
954+
'/media/vendor/tinymce/langs/nb.min.js',
955+
'/media/vendor/tinymce/langs/nb.min.js.gz',
956+
'/media/vendor/tinymce/langs/readme.md',
957+
'/media/vendor/tinymce/langs/si-LK.js',
958+
'/media/vendor/tinymce/langs/si-LK.min.js',
959+
'/media/vendor/tinymce/langs/si-LK.min.js.gz',
960+
'/media/vendor/tinymce/langs/sl.js',
961+
'/media/vendor/tinymce/langs/sl.min.js',
962+
'/media/vendor/tinymce/langs/sl.min.js.gz',
963+
'/media/vendor/tinymce/langs/sv.js',
964+
'/media/vendor/tinymce/langs/sv.min.js',
965+
'/media/vendor/tinymce/langs/sv.min.js.gz',
966+
'/media/vendor/tinymce/langs/sw.js',
967+
'/media/vendor/tinymce/langs/sw.min.js',
968+
'/media/vendor/tinymce/langs/sw.min.js.gz',
969+
'/media/vendor/tinymce/langs/sy.js',
970+
'/media/vendor/tinymce/langs/sy.min.js',
971+
'/media/vendor/tinymce/langs/sy.min.js.gz',
972+
'/media/vendor/tinymce/langs/th.js',
973+
'/media/vendor/tinymce/langs/th.min.js',
974+
'/media/vendor/tinymce/langs/th.min.js.gz',
975+
'/media/vendor/tinymce/license.txt',
976+
'/media/vendor/webcomponentsjs/js/webcomponents-bundle.js',
977+
'/media/vendor/webcomponentsjs/js/webcomponents-bundle.min.js',
978+
'/media/vendor/webcomponentsjs/js/webcomponents-bundle.min.js.gz',
979+
'/media/vendor/webcomponentsjs/LICENSE.md',
980+
'/modules/mod_finder/mod_finder.php',
981+
'/modules/mod_login/mod_login.php',
982+
'/modules/mod_menu/mod_menu.php',
983+
'/modules/mod_whosonline/mod_whosonline.php',
827984
];
828985

829986
$folders = [
@@ -859,6 +1016,22 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false)
8591016
'/libraries/src/Application/CLI',
8601017
'/administrator/components/com_finder/helpers/indexer',
8611018
'/administrator/components/com_content/tmpl/featured',
1019+
// From 6.0.0-alpha3 to 6.0.0-beta1
1020+
'/media/vendor/webcomponentsjs/js',
1021+
'/media/vendor/webcomponentsjs',
1022+
'/media/vendor/chosen/js',
1023+
'/media/vendor/chosen/css',
1024+
'/media/vendor/chosen',
1025+
'/libraries/vendor/symfony/polyfill-php83/Resources/stubs',
1026+
'/libraries/vendor/symfony/polyfill-php83/Resources',
1027+
'/libraries/vendor/symfony/polyfill-php83',
1028+
'/libraries/vendor/joomla/string/src/phputf8/utils',
1029+
'/libraries/vendor/joomla/string/src/phputf8/native',
1030+
'/libraries/vendor/joomla/string/src/phputf8/mbstring',
1031+
'/libraries/vendor/joomla/string/src/phputf8',
1032+
'/libraries/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector',
1033+
'/libraries/vendor/doctrine/inflector/lib/Doctrine/Common',
1034+
'/libraries/src/Adapter',
8621035
];
8631036

8641037
$status['files_checked'] = $files;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
INSERT INTO `#__extensions` (`package_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `locked`, `manifest_cache`, `params`, `custom_data`, `ordering`, `state`) VALUES
2+
(0, 'plg_fields_note', 'plugin', 'note', 'fields', 0, 1, 1, 0, 1, '', '{"class":"alert alert-info","heading":"h4"}', '', -1, 0);

0 commit comments

Comments
 (0)