commit: a476bc45fdd2b9462f7f86745c8b7025cd3923fe
parent 3957e385eaa266651e852fd52dacd7b1f887e682
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date: Mon, 6 May 2024 05:16:11 +0200
test-lib/mode: Roll TAP producer
Diffstat:
3 files changed, 235 insertions(+), 277 deletions(-)
diff --git a/Makefile b/Makefile
@@ -88,7 +88,7 @@ cmd/timeout: cmd/timeout.c lib/strtodur.c lib/sys_signame.h Makefile
$(CC) -std=c99 $(CFLAGS) -o $@ cmd/timeout.c lib/strtodur.c $(LDFLAGS) $(LDSTATIC)
test-lib/mode: test-lib/mode.c lib/mode.c Makefile
- $(CC) -std=c99 $(CFLAGS) $(ATF_CFLAGS) -o $@ test-lib/mode.c lib/mode.c $(LDFLAGS) $(ATF_LIBS)
+ $(CC) -std=c99 $(CFLAGS) -o $@ test-lib/mode.c lib/mode.c $(LDFLAGS) $(LDSTATIC)
test-lib/strtodur: test-lib/strtodur.c lib/strtodur.c Makefile
$(CC) -std=c99 $(CFLAGS) $(ATF_CFLAGS) -o $@ test-lib/strtodur.c lib/strtodur.c $(LDFLAGS) $(ATF_LIBS)
diff --git a/test-lib/Kyuafile b/test-lib/Kyuafile
@@ -5,7 +5,7 @@ syntax(2)
test_suite("utils-std libs")
-- 7,$|LC_ALL=C.UTF-8 sort
-atf_test_program{name="mode"}
+tap_test_program{name="mode"}
atf_test_program{name="strtodur"}
atf_test_program{name="symbolize_mode"}
atf_test_program{name="truncation"}
diff --git a/test-lib/mode.c b/test-lib/mode.c
@@ -3,352 +3,310 @@
// SPDX-License-Identifier: MPL-2.0
#define _POSIX_C_SOURCE 200809L
-#include <atf-c.h>
#include <assert.h>
-#include <signal.h> // SIGABRT
+#include <stdio.h> // printf
+#include <string.h> // strcmp
#include <sys/stat.h> // umask
#include "../lib/mode.h"
-#define CHECK_EQ_MODE(expect, got) ATF_CHECK_EQ_MSG(expect, got, "Expected %04o; Got 0%06o\n", expect, got)
+int counter = 0;
+int err = 0;
-#define TEST_MODE(str, old, expect) \
- res = new_mode(str, old, &errstr); \
- CHECK_EQ_MODE(expect, res); \
- ATF_CHECK_MSG(errstr == NULL, "errstr: %s", errstr)
-
-#define TEST_ERRSTR(str, old, error) \
- res = new_mode(str, old, &errstr); \
- CHECK_EQ_MODE(0, res); \
- ATF_CHECK(errstr != NULL); \
- ATF_CHECK_STREQ(error, errstr)
-
-ATF_TC(empty);
-ATF_TC_HEAD(empty, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Empty string");
-}
-ATF_TC_BODY(empty, tc)
+static void
+t_mode(char *str, mode_t old, mode_t expect)
{
+ int id = ++counter;
const char *errstr = NULL;
- mode_t res;
-
- TEST_MODE("", 0, 0);
- TEST_MODE("", 00777, 00777);
+ mode_t got = new_mode(str, old, &errstr);
+ if(got == expect && errstr == NULL)
+ {
+ printf("ok %d - new_mode(\"%s\", %d) == %d\n", id, str, old, expect);
+ return;
+ }
+
+ err = 1;
+ printf("not ok %d - new_mode(\"%s\", %d) == %d\n", id, str, old, expect);
+ if(got != expect) printf("# Got: %d\n", got);
+ if(errstr != NULL) printf("# Errstr: \"%s\"\n", errstr);
}
-ATF_TC(null_str);
-ATF_TC_HEAD(null_str, tc)
+static void
+t_mode_errstr(char *str, mode_t old, char *expect_errstr)
{
- atf_tc_set_md_var(tc, "descr", "NULL string");
-}
-ATF_TC_BODY(null_str, tc)
-{
- const char *errstr = NULL;
- mode_t res;
-
- TEST_MODE(NULL, 0, 0);
- TEST_MODE(NULL, 00777, 00777);
-}
+ assert(expect_errstr != NULL);
-ATF_TC(sole_comma);
-ATF_TC_HEAD(sole_comma, tc)
-{
- atf_tc_set_md_var(tc, "descr", "string containing only a comma");
-}
-ATF_TC_BODY(sole_comma, tc)
-{
+ int id = ++counter;
const char *errstr = NULL;
- mode_t res;
-
- TEST_MODE(",", 0, 0);
- TEST_MODE(",", 00777, 00777);
+ (void)new_mode(str, old, &errstr);
+
+ if(errstr != NULL && strcmp(errstr, expect_errstr) == 0)
+ {
+ printf("ok %d - new_mode(\"%s\", %d) -> %s\n", id, str, old, expect_errstr);
+ }
+ else
+ {
+ printf("not ok %d - new_mode(\"%s\", %d) -> %s\n", id, str, old, expect_errstr);
+ printf("# Got errstr: \"%s\"\n", errstr);
+ err = 1;
+ }
}
-ATF_TC(add_read);
-ATF_TC_HEAD(add_read, tc)
-{
- atf_tc_set_md_var(tc, "descr", "chmod +r");
-}
-ATF_TC_BODY(add_read, tc)
+static void
+add_read()
{
- const char *errstr = NULL;
- mode_t res;
-
+ printf("# => add_read\n");
umask(0044);
- TEST_MODE( "+r", 0, 00400);
- TEST_MODE("a+r", 0, 00444);
- TEST_MODE("u+r", 0, 00400);
- TEST_MODE("g+r", 0, 00040);
- TEST_MODE("o+r", 0, 00004);
- TEST_MODE("ug+r", 0, 00440);
- TEST_MODE("go+r", 0, 00044);
- TEST_MODE("uo+r", 0, 00404);
- TEST_MODE("u+r,g+r", 0, 00440);
- TEST_MODE("g+r,o+r", 0, 00044);
- TEST_MODE("u+r,o+r", 0, 00404);
-
- TEST_MODE( "+r", 00777, 00777);
- TEST_MODE("a+r", 00777, 00777);
- TEST_MODE("u+r", 00777, 00777);
- TEST_MODE("g+r", 00777, 00777);
- TEST_MODE("o+r", 00777, 00777);
- TEST_MODE("ug+r", 00777, 00777);
- TEST_MODE("go+r", 00777, 00777);
- TEST_MODE("uo+r", 00777, 00777);
- TEST_MODE("u+r,g+r", 00777, 00777);
- TEST_MODE("g+r,o+r", 00777, 00777);
- TEST_MODE("u+r,o+r", 00777, 00777);
+ t_mode( "+r", 0, 00400);
+ t_mode("a+r", 0, 00444);
+ t_mode("u+r", 0, 00400);
+ t_mode("g+r", 0, 00040);
+ t_mode("o+r", 0, 00004);
+ t_mode("ug+r", 0, 00440);
+ t_mode("go+r", 0, 00044);
+ t_mode("uo+r", 0, 00404);
+ t_mode("u+r,g+r", 0, 00440);
+ t_mode("g+r,o+r", 0, 00044);
+ t_mode("u+r,o+r", 0, 00404);
+
+ t_mode( "+r", 00777, 00777);
+ t_mode("a+r", 00777, 00777);
+ t_mode("u+r", 00777, 00777);
+ t_mode("g+r", 00777, 00777);
+ t_mode("o+r", 00777, 00777);
+ t_mode("ug+r", 00777, 00777);
+ t_mode("go+r", 00777, 00777);
+ t_mode("uo+r", 00777, 00777);
+ t_mode("u+r,g+r", 00777, 00777);
+ t_mode("g+r,o+r", 00777, 00777);
+ t_mode("u+r,o+r", 00777, 00777);
}
-ATF_TC(set_read);
-ATF_TC_HEAD(set_read, tc)
-{
- atf_tc_set_md_var(tc, "descr", "chmod =r");
-}
-ATF_TC_BODY(set_read, tc)
+static void
+set_read()
{
- const char *errstr = NULL;
- mode_t res;
-
+ printf("# => set_read\n");
umask(0044);
- TEST_MODE( "=r", 0, 00400);
- TEST_MODE("a=r", 0, 00444);
- TEST_MODE("u=r", 0, 00400);
- TEST_MODE("g=r", 0, 00040);
- TEST_MODE("o=r", 0, 00004);
- TEST_MODE("ug=r", 0, 00440);
- TEST_MODE("go=r", 0, 00044);
- TEST_MODE("uo=r", 0, 00404);
- TEST_MODE("u=r,g=r", 0, 00440);
- TEST_MODE("g=r,o=r", 0, 00044);
- TEST_MODE("u=r,o=r", 0, 00404);
-
- TEST_MODE( "=r", 00777, 00400);
- TEST_MODE("a=r", 00777, 00444);
- TEST_MODE("u=r", 00777, 00477);
- TEST_MODE("g=r", 00777, 00747);
- TEST_MODE("o=r", 00777, 00774);
- TEST_MODE("ug=r", 00777, 00447);
- TEST_MODE("go=r", 00777, 00744);
- TEST_MODE("uo=r", 00777, 00474);
- TEST_MODE("u=r,g=r", 00777, 00447);
- TEST_MODE("g=r,o=r", 00777, 00744);
- TEST_MODE("u=r,o=r", 00777, 00474);
+ t_mode( "=r", 0, 00400);
+ t_mode("a=r", 0, 00444);
+ t_mode("u=r", 0, 00400);
+ t_mode("g=r", 0, 00040);
+ t_mode("o=r", 0, 00004);
+ t_mode("ug=r", 0, 00440);
+ t_mode("go=r", 0, 00044);
+ t_mode("uo=r", 0, 00404);
+ t_mode("u=r,g=r", 0, 00440);
+ t_mode("g=r,o=r", 0, 00044);
+ t_mode("u=r,o=r", 0, 00404);
+
+ t_mode( "=r", 00777, 00400);
+ t_mode("a=r", 00777, 00444);
+ t_mode("u=r", 00777, 00477);
+ t_mode("g=r", 00777, 00747);
+ t_mode("o=r", 00777, 00774);
+ t_mode("ug=r", 00777, 00447);
+ t_mode("go=r", 00777, 00744);
+ t_mode("uo=r", 00777, 00474);
+ t_mode("u=r,g=r", 00777, 00447);
+ t_mode("g=r,o=r", 00777, 00744);
+ t_mode("u=r,o=r", 00777, 00474);
}
-ATF_TC(del_read);
-ATF_TC_HEAD(del_read, tc)
+static void
+del_read()
{
- atf_tc_set_md_var(tc, "descr", "chmod -r");
-}
-ATF_TC_BODY(del_read, tc)
-{
- const char *errstr = NULL;
- mode_t res;
-
+ printf("# => del_read\n");
umask(0044);
- TEST_MODE( "-r", 0, 0);
- TEST_MODE("a-r", 0, 0);
- TEST_MODE("u-r", 0, 0);
- TEST_MODE("g-r", 0, 0);
- TEST_MODE("o-r", 0, 0);
- TEST_MODE("ug-r", 0, 0);
- TEST_MODE("go-r", 0, 0);
- TEST_MODE("uo-r", 0, 0);
- TEST_MODE("u-r,g-r", 0, 0);
- TEST_MODE("g-r,o-r", 0, 0);
- TEST_MODE("u-r,o-r", 0, 0);
-
- TEST_MODE( "-r", 00777, 00377);
- TEST_MODE("a-r", 00777, 00333);
- TEST_MODE("u-r", 00777, 00377);
- TEST_MODE("g-r", 00777, 00737);
- TEST_MODE("o-r", 00777, 00773);
- TEST_MODE("ug-r", 00777, 00337);
- TEST_MODE("go-r", 00777, 00733);
- TEST_MODE("uo-r", 00777, 00373);
- TEST_MODE("u-r,g-r", 00777, 00337);
- TEST_MODE("g-r,o-r", 00777, 00733);
- TEST_MODE("u-r,o-r", 00777, 00373);
+ t_mode( "-r", 0, 0);
+ t_mode("a-r", 0, 0);
+ t_mode("u-r", 0, 0);
+ t_mode("g-r", 0, 0);
+ t_mode("o-r", 0, 0);
+ t_mode("ug-r", 0, 0);
+ t_mode("go-r", 0, 0);
+ t_mode("uo-r", 0, 0);
+ t_mode("u-r,g-r", 0, 0);
+ t_mode("g-r,o-r", 0, 0);
+ t_mode("u-r,o-r", 0, 0);
+
+ t_mode( "-r", 00777, 00377);
+ t_mode("a-r", 00777, 00333);
+ t_mode("u-r", 00777, 00377);
+ t_mode("g-r", 00777, 00737);
+ t_mode("o-r", 00777, 00773);
+ t_mode("ug-r", 00777, 00337);
+ t_mode("go-r", 00777, 00733);
+ t_mode("uo-r", 00777, 00373);
+ t_mode("u-r,g-r", 00777, 00337);
+ t_mode("g-r,o-r", 00777, 00733);
+ t_mode("u-r,o-r", 00777, 00373);
}
-ATF_TC(search);
-ATF_TC_HEAD(search, tc)
-{
- atf_tc_set_md_var(tc, "descr", "chmod [-+=]X");
-}
-ATF_TC_BODY(search, tc)
+static void
+search()
{
- const char *errstr = NULL;
- mode_t res;
-
- TEST_MODE( "-X", 0, 0);
- TEST_MODE("a-X", 0, 0);
- TEST_MODE("u-X", 0, 0);
- TEST_MODE("g-X", 0, 0);
- TEST_MODE("o-X", 0, 0);
-
- TEST_MODE( "+X", 0, 0);
- TEST_MODE("a+X", 0, 0);
- TEST_MODE("u+X", 0, 0);
- TEST_MODE("g+X", 0, 0);
- TEST_MODE("o+X", 0, 0);
-
- TEST_MODE( "=X", 0, 0);
- TEST_MODE("a=X", 0, 0);
- TEST_MODE("u=X", 0, 0);
- TEST_MODE("g=X", 0, 0);
- TEST_MODE("o=X", 0, 0);
+ printf("# => search\n");
+ t_mode( "-X", 0, 0);
+ t_mode("a-X", 0, 0);
+ t_mode("u-X", 0, 0);
+ t_mode("g-X", 0, 0);
+ t_mode("o-X", 0, 0);
+
+ t_mode( "+X", 0, 0);
+ t_mode("a+X", 0, 0);
+ t_mode("u+X", 0, 0);
+ t_mode("g+X", 0, 0);
+ t_mode("o+X", 0, 0);
+
+ t_mode( "=X", 0, 0);
+ t_mode("a=X", 0, 0);
+ t_mode("u=X", 0, 0);
+ t_mode("g=X", 0, 0);
+ t_mode("o=X", 0, 0);
// S_IFDIR = 0040000
- TEST_MODE( "-X", 0040777, 0040666);
- TEST_MODE("a-X", 0040777, 0040666);
- TEST_MODE("u-X", 0040777, 0040677);
- TEST_MODE("g-X", 0040777, 0040767);
- TEST_MODE("o-X", 0040777, 0040776);
-
- TEST_MODE( "+X", 0040777, 0040777);
- TEST_MODE("a+X", 0040777, 0040777);
- TEST_MODE("u+X", 0040777, 0040777);
- TEST_MODE("g+X", 0040777, 0040777);
- TEST_MODE("o+X", 0040777, 0040777);
-
- TEST_MODE( "=X", 0040777, 0040111);
- TEST_MODE("a=X", 0040777, 0040111);
- TEST_MODE("u=X", 0040777, 0040177);
- TEST_MODE("g=X", 0040777, 0040717);
- TEST_MODE("o=X", 0040777, 0040771);
-
- TEST_MODE( "-X", 0040000, 0040000);
- TEST_MODE("a-X", 0040000, 0040000);
- TEST_MODE("u-X", 0040000, 0040000);
- TEST_MODE("g-X", 0040000, 0040000);
- TEST_MODE("o-X", 0040000, 0040000);
-
- TEST_MODE( "+X", 0040000, 0040111);
- TEST_MODE("a+X", 0040000, 0040111);
- TEST_MODE("u+X", 0040000, 0040100);
- TEST_MODE("g+X", 0040000, 0040010);
- TEST_MODE("o+X", 0040000, 0040001);
-
- TEST_MODE( "=X", 0040000, 0040111);
- TEST_MODE("a=X", 0040000, 0040111);
- TEST_MODE("u=X", 0040000, 0040100);
- TEST_MODE("g=X", 0040000, 0040010);
- TEST_MODE("o=X", 0040000, 0040001);
+ t_mode( "-X", 0040777, 0040666);
+ t_mode("a-X", 0040777, 0040666);
+ t_mode("u-X", 0040777, 0040677);
+ t_mode("g-X", 0040777, 0040767);
+ t_mode("o-X", 0040777, 0040776);
+
+ t_mode( "+X", 0040777, 0040777);
+ t_mode("a+X", 0040777, 0040777);
+ t_mode("u+X", 0040777, 0040777);
+ t_mode("g+X", 0040777, 0040777);
+ t_mode("o+X", 0040777, 0040777);
+
+ t_mode( "=X", 0040777, 0040111);
+ t_mode("a=X", 0040777, 0040111);
+ t_mode("u=X", 0040777, 0040177);
+ t_mode("g=X", 0040777, 0040717);
+ t_mode("o=X", 0040777, 0040771);
+
+ t_mode( "-X", 0040000, 0040000);
+ t_mode("a-X", 0040000, 0040000);
+ t_mode("u-X", 0040000, 0040000);
+ t_mode("g-X", 0040000, 0040000);
+ t_mode("o-X", 0040000, 0040000);
+
+ t_mode( "+X", 0040000, 0040111);
+ t_mode("a+X", 0040000, 0040111);
+ t_mode("u+X", 0040000, 0040100);
+ t_mode("g+X", 0040000, 0040010);
+ t_mode("o+X", 0040000, 0040001);
+
+ t_mode( "=X", 0040000, 0040111);
+ t_mode("a=X", 0040000, 0040111);
+ t_mode("u=X", 0040000, 0040100);
+ t_mode("g=X", 0040000, 0040010);
+ t_mode("o=X", 0040000, 0040001);
}
-ATF_TC(syntax);
-ATF_TC_HEAD(syntax, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Weird syntax and syntax errors");
-}
-ATF_TC_BODY(syntax, tc)
+static void
+syntax()
{
- const char *errstr = NULL;
- mode_t res;
+ printf("# => syntax\n");
- TEST_MODE("=", 0, 0);
- TEST_MODE("=", 0040777, 0040000);
+ t_mode("=", 0, 0);
+ t_mode("=", 0040777, 0040000);
- TEST_MODE("-", 0, 0);
- TEST_MODE("-", 0040777, 0040777);
+ t_mode("-", 0, 0);
+ t_mode("-", 0040777, 0040777);
- TEST_MODE("+", 0, 0);
- TEST_MODE("+", 0040777, 0040777);
+ t_mode("+", 0, 0);
+ t_mode("+", 0040777, 0040777);
- TEST_ERRSTR("/", 0, "syntax error, got invalid character");
+ t_mode_errstr("/", 0, "syntax error, got invalid character");
- TEST_ERRSTR("foo", 0, "syntax error, got invalid character");
+ t_mode_errstr("foo", 0, "syntax error, got invalid character");
- TEST_ERRSTR("77777", 0, "can't be higher than 0o7777");
+ t_mode_errstr("77777", 0, "can't be higher than 0o7777");
- TEST_ERRSTR("-0", 0, "syntax error, got invalid character");
+ t_mode_errstr("-0", 0, "syntax error, got invalid character");
}
-ATF_TC(posix_examples);
-ATF_TC_HEAD(posix_examples, tc)
+static void
+posix_examples()
{
- atf_tc_set_md_var(tc, "descr", "Examples as given by POSIX in chmod(1p)");
-}
-ATF_TC_BODY(posix_examples, tc)
-{
- const char *errstr = NULL;
- mode_t res;
+ // Examples as given by POSIX in chmod(1p)
+ printf("# => posix_examples\n");
// clears all file mode bits.
- TEST_MODE("a+=", 0040777, 0040000);
- TEST_MODE("a+=", 0040000, 0040000);
+ t_mode("a+=", 0040777, 0040000);
+ t_mode("a+=", 0040000, 0040000);
// clears group and other write bits
- TEST_MODE("go+-w", 0040777, 0040755);
- TEST_MODE("go+-w", 0040000, 0040000);
+ t_mode("go+-w", 0040777, 0040755);
+ t_mode("go+-w", 0040000, 0040000);
// sets group bit to match other bits and then clears group write bit.
- TEST_MODE("g=o-w", 0040777, 0040757);
- TEST_MODE("g=o-w", 0040642, 0040602);
- TEST_MODE("g=o-w", 0040246, 0040246);
- TEST_MODE("g=o-w", 0040000, 0040000);
+ t_mode("g=o-w", 0040777, 0040757);
+ t_mode("g=o-w", 0040642, 0040602);
+ t_mode("g=o-w", 0040246, 0040246);
+ t_mode("g=o-w", 0040000, 0040000);
// clears group read bit and sets group write bit.
- TEST_MODE("g-r+w", 0040777, 0040737);
- TEST_MODE("g-r+w", 0040000, 0040020);
+ t_mode("g-r+w", 0040777, 0040737);
+ t_mode("g-r+w", 0040000, 0040020);
// Sets owner bits to match group bits and sets other bits to match group bits.
- TEST_MODE("uo=g", 0040777, 0040777);
- TEST_MODE("uo=g", 0040642, 0040444);
- TEST_MODE("uo=g", 0040000, 0040000);
+ t_mode("uo=g", 0040777, 0040777);
+ t_mode("uo=g", 0040642, 0040444);
+ t_mode("uo=g", 0040000, 0040000);
}
-ATF_TC(non_symbolic);
-ATF_TC_HEAD(non_symbolic, tc)
+static void
+non_symbolic()
{
- atf_tc_set_md_var(tc, "descr", "chmod /[0-7]{1,4}/");
-}
-ATF_TC_BODY(non_symbolic, tc)
-{
- const char *errstr = NULL;
- mode_t res;
+ printf("# => non_symbolic\n");
- TEST_MODE("0", 0, 0);
- TEST_MODE("0", 0040777, 0040000);
+ t_mode("0", 0, 0);
+ t_mode("0", 0040777, 0040000);
- TEST_MODE("7", 0, 07);
- TEST_MODE("7", 0040777, 0040007);
+ t_mode("7", 0, 07);
+ t_mode("7", 0040777, 0040007);
- TEST_MODE("77", 0, 077);
- TEST_MODE("77", 0040777, 0040077);
+ t_mode("77", 0, 077);
+ t_mode("77", 0040777, 0040077);
- TEST_MODE("777", 0, 0777);
- TEST_MODE("777", 0040777, 0040777);
+ t_mode("777", 0, 0777);
+ t_mode("777", 0040777, 0040777);
- TEST_MODE("700", 0, 0700);
- TEST_MODE("700", 0040777, 0040700);
+ t_mode("700", 0, 0700);
+ t_mode("700", 0040777, 0040700);
- TEST_MODE("7777", 0, 07777);
- TEST_MODE("7777", 0040777, 0047777);
+ t_mode("7777", 0, 07777);
+ t_mode("7777", 0040777, 0047777);
}
-ATF_TP_ADD_TCS(tp)
+int
+main()
{
- ATF_TP_ADD_TC(tp, empty);
- ATF_TP_ADD_TC(tp, null_str);
- ATF_TP_ADD_TC(tp, sole_comma);
+ int plan = 152;
+ printf("1..%d\n", plan);
+
+ t_mode(NULL, 0, 0);
+ t_mode(NULL, 00777, 00777);
+ t_mode("", 0, 0);
+ t_mode("", 00777, 00777);
+ t_mode(",", 0, 0);
+ t_mode(",", 00777, 00777);
+
+ add_read();
+ set_read();
+ del_read();
- ATF_TP_ADD_TC(tp, add_read);
- ATF_TP_ADD_TC(tp, set_read);
- ATF_TP_ADD_TC(tp, del_read);
+ search();
- ATF_TP_ADD_TC(tp, search);
+ posix_examples();
- ATF_TP_ADD_TC(tp, syntax);
- ATF_TP_ADD_TC(tp, posix_examples);
+ syntax();
- ATF_TP_ADD_TC(tp, non_symbolic);
+ non_symbolic();
- return atf_no_error();
+ assert(counter == plan);
+ return err;
}