Changes imported from Abseil "staging" branch:
- 432508bf64998983b3c194d5f164872ce3c2e573 Put visibility tags into absl external build files by Jon Cohen <cohenjon@google.com> - 25d59d11e7b833fe632cddb5bf4d76075ae6282b Use ABSL_PREDICT_TRUE instead of *FALSE for the range che... by Jon Cohen <cohenjon@google.com> - 8d8a5890a55ddd19aac849748441eeb57c684f10 Better detection for MSVC support on std::optional. by Xiaoyi Zhang <zhangxy@google.com> - c1b31e4a97939885c3bbc23ecb093e9619e73ad1 Internal cleanup by Gennadiy Rozental <rogeeff@google.com> - 4f56ad20c4eeccc6f5fb21ec6c7191233d34a090 Internal change. by Matt Calabrese <calabrese@google.com> - d2a02b52c75c295708170f4d17b7ff442c8d6a97 Fixed a minor typo in the SimpleAtob() function comment. by Abseil Team <absl-team@google.com> - 5adbff5c23a45278d06de2ef3a29ea51b0d1269e Internal cleanup by Gennadiy Rozental <rogeeff@google.com> GitOrigin-RevId: 432508bf64998983b3c194d5f164872ce3c2e573 Change-Id: I32ddd151d3350b96a22e8f1830f19b59374953ad
This commit is contained in:
		
							parent
							
								
									1a9ba5e2e5
								
							
						
					
					
						commit
						6de53819a7
					
				
					 13 changed files with 75 additions and 16 deletions
				
			
		|  | @ -1,7 +0,0 @@ | ||||||
| // This is a relaxed JSON format, you can have comments in it. |  | ||||||
| // This is a list of configuration for the job that does not specify a configuration. |  | ||||||
| [ |  | ||||||
|     {"node": "linux-x86_64"}, |  | ||||||
|     {"node": "ubuntu_16.04-x86_64"}, |  | ||||||
|     {"node": "darwin-x86_64"} |  | ||||||
| ] |  | ||||||
|  | @ -23,6 +23,7 @@ config_setting( | ||||||
|     values = { |     values = { | ||||||
|         "compiler": "llvm", |         "compiler": "llvm", | ||||||
|     }, |     }, | ||||||
|  |     visibility = [":__subpackages__"], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| # following configs are based on mapping defined in: https://git.io/v5Ijz | # following configs are based on mapping defined in: https://git.io/v5Ijz | ||||||
|  | @ -31,6 +32,7 @@ config_setting( | ||||||
|     values = { |     values = { | ||||||
|         "cpu": "darwin", |         "cpu": "darwin", | ||||||
|     }, |     }, | ||||||
|  |     visibility = [":__subpackages__"], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| config_setting( | config_setting( | ||||||
|  | @ -38,6 +40,7 @@ config_setting( | ||||||
|     values = { |     values = { | ||||||
|         "cpu": "x64_windows", |         "cpu": "x64_windows", | ||||||
|     }, |     }, | ||||||
|  |     visibility = [":__subpackages__"], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| config_setting( | config_setting( | ||||||
|  | @ -45,4 +48,5 @@ config_setting( | ||||||
|     values = { |     values = { | ||||||
|         "cpu": "ppc", |         "cpu": "ppc", | ||||||
|     }, |     }, | ||||||
|  |     visibility = [":__subpackages__"], | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -25,8 +25,6 @@ package(default_visibility = ["//visibility:public"]) | ||||||
| 
 | 
 | ||||||
| licenses(["notice"])  # Apache 2.0 | licenses(["notice"])  # Apache 2.0 | ||||||
| 
 | 
 | ||||||
| exports_files(["thread_annotations.h"]) |  | ||||||
| 
 |  | ||||||
| cc_library( | cc_library( | ||||||
|     name = "spinlock_wait", |     name = "spinlock_wait", | ||||||
|     srcs = [ |     srcs = [ | ||||||
|  | @ -39,6 +37,9 @@ cc_library( | ||||||
|         "internal/spinlock_wait.h", |         "internal/spinlock_wait.h", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_DEFAULT_COPTS, |     copts = ABSL_DEFAULT_COPTS, | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl/base:__pkg__", | ||||||
|  |     ], | ||||||
|     deps = [":core_headers"], |     deps = [":core_headers"], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -83,6 +84,9 @@ cc_library( | ||||||
|         "internal/malloc_extension_c.h", |         "internal/malloc_extension_c.h", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_DEFAULT_COPTS, |     copts = ABSL_DEFAULT_COPTS, | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl:__subpackages__", | ||||||
|  |     ], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":core_headers", |         ":core_headers", | ||||||
|         ":dynamic_annotations", |         ":dynamic_annotations", | ||||||
|  | @ -108,6 +112,9 @@ cc_library( | ||||||
|     textual_hdrs = [ |     textual_hdrs = [ | ||||||
|         "internal/malloc_hook_invoke.h", |         "internal/malloc_hook_invoke.h", | ||||||
|     ], |     ], | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl:__subpackages__", | ||||||
|  |     ], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":base", |         ":base", | ||||||
|         ":config", |         ":config", | ||||||
|  | @ -124,6 +131,9 @@ cc_library( | ||||||
|         "internal/invoke.h", |         "internal/invoke.h", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_DEFAULT_COPTS, |     copts = ABSL_DEFAULT_COPTS, | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl:__subpackages__", | ||||||
|  |     ], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| cc_library( | cc_library( | ||||||
|  | @ -183,6 +193,9 @@ cc_library( | ||||||
|     features = [ |     features = [ | ||||||
|         "-use_header_modules", |         "-use_header_modules", | ||||||
|     ], |     ], | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl:__subpackages__", | ||||||
|  |     ], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":base", |         ":base", | ||||||
|         ":config", |         ":config", | ||||||
|  | @ -205,6 +218,7 @@ cc_library( | ||||||
|     testonly = 1, |     testonly = 1, | ||||||
|     hdrs = ["internal/exception_testing.h"], |     hdrs = ["internal/exception_testing.h"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//absl:__subpackages__"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":config", |         ":config", | ||||||
|         "@com_google_googletest//:gtest", |         "@com_google_googletest//:gtest", | ||||||
|  |  | ||||||
|  | @ -372,4 +372,19 @@ | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | // For MSVC, `__has_include` is supported in VS 2017 15.3, which is later than
 | ||||||
|  | // the support for <optional>, <any>, <string_view>. So we use _MSC_VER to check
 | ||||||
|  | // whether we have VS 2017 RTM (when <optional>, <any>, <string_view> is
 | ||||||
|  | // implemented) or higher.
 | ||||||
|  | // Also, `__cplusplus` is not correctly set by MSVC, so we use `_MSVC_LANG` to
 | ||||||
|  | // check the language version.
 | ||||||
|  | // TODO(zhangxy): fix tests before enabling aliasing for `std::any`,
 | ||||||
|  | // `std::string_view`.
 | ||||||
|  | #if defined(_MSC_VER) && _MSC_VER >= 1910 && \ | ||||||
|  |     ((defined(_MSVC_LANG) && _MSVC_LANG > 201402) || __cplusplus > 201402) | ||||||
|  | // #define ABSL_HAVE_STD_ANY 1
 | ||||||
|  | #define ABSL_HAVE_STD_OPTIONAL 1 | ||||||
|  | // #define ABSL_HAVE_STD_STRING_VIEW 1
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #endif  // ABSL_BASE_CONFIG_H_
 | #endif  // ABSL_BASE_CONFIG_H_
 | ||||||
|  |  | ||||||
|  | @ -112,6 +112,9 @@ cc_library( | ||||||
|     srcs = ["internal/test_instance_tracker.cc"], |     srcs = ["internal/test_instance_tracker.cc"], | ||||||
|     hdrs = ["internal/test_instance_tracker.h"], |     hdrs = ["internal/test_instance_tracker.h"], | ||||||
|     copts = ABSL_DEFAULT_COPTS, |     copts = ABSL_DEFAULT_COPTS, | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl:__subpackages__", | ||||||
|  |     ], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| cc_test( | cc_test( | ||||||
|  |  | ||||||
|  | @ -103,6 +103,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["match_test.cc"], |     srcs = ["match_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "@com_google_googletest//:gtest_main", |         "@com_google_googletest//:gtest_main", | ||||||
|  | @ -117,6 +118,7 @@ cc_test( | ||||||
|         "internal/escaping_test_common.inc", |         "internal/escaping_test_common.inc", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  | @ -130,6 +132,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["ascii_test.cc"], |     srcs = ["ascii_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  | @ -145,6 +148,7 @@ cc_test( | ||||||
|         "internal/memutil_test.cc", |         "internal/memutil_test.cc", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  | @ -159,6 +163,7 @@ cc_test( | ||||||
|         "internal/utf8_test.cc", |         "internal/utf8_test.cc", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":internal", |         ":internal", | ||||||
|         ":strings", |         ":strings", | ||||||
|  | @ -172,6 +177,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["string_view_test.cc"], |     srcs = ["string_view_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG, |     copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:config", |         "//absl/base:config", | ||||||
|  | @ -186,6 +192,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["substitute_test.cc"], |     srcs = ["substitute_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  | @ -198,6 +205,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["str_replace_test.cc"], |     srcs = ["str_replace_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "@com_google_googletest//:gtest_main", |         "@com_google_googletest//:gtest_main", | ||||||
|  | @ -208,6 +216,7 @@ cc_test( | ||||||
|     name = "str_split_test", |     name = "str_split_test", | ||||||
|     srcs = ["str_split_test.cc"], |     srcs = ["str_split_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  | @ -221,6 +230,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["internal/ostringstream_test.cc"], |     srcs = ["internal/ostringstream_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":internal", |         ":internal", | ||||||
|         "@com_google_googletest//:gtest_main", |         "@com_google_googletest//:gtest_main", | ||||||
|  | @ -235,6 +245,7 @@ cc_test( | ||||||
|         "internal/resize_uninitialized_test.cc", |         "internal/resize_uninitialized_test.cc", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|         "//absl/meta:type_traits", |         "//absl/meta:type_traits", | ||||||
|  | @ -247,6 +258,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["str_join_test.cc"], |     srcs = ["str_join_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  | @ -260,6 +272,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["str_cat_test.cc"], |     srcs = ["str_cat_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  | @ -278,6 +291,7 @@ cc_test( | ||||||
|     tags = [ |     tags = [ | ||||||
|         "no_test_loonix", |         "no_test_loonix", | ||||||
|     ], |     ], | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base", |         "//absl/base", | ||||||
|  | @ -291,6 +305,7 @@ cc_test( | ||||||
|     size = "small", |     size = "small", | ||||||
|     srcs = ["strip_test.cc"], |     srcs = ["strip_test.cc"], | ||||||
|     copts = ABSL_TEST_COPTS, |     copts = ABSL_TEST_COPTS, | ||||||
|  |     visibility = ["//visibility:private"], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":strings", |         ":strings", | ||||||
|         "@com_google_googletest//:gtest_main", |         "@com_google_googletest//:gtest_main", | ||||||
|  |  | ||||||
|  | @ -25,7 +25,6 @@ | ||||||
| #include <cstddef> | #include <cstddef> | ||||||
| #include <cstdint> | #include <cstdint> | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| namespace absl { | namespace absl { | ||||||
| namespace strings_internal { | namespace strings_internal { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -53,7 +53,7 @@ inline bool StrContains(absl::string_view haystack, absl::string_view needle) { | ||||||
| inline bool StartsWith(absl::string_view text, absl::string_view prefix) { | inline bool StartsWith(absl::string_view text, absl::string_view prefix) { | ||||||
|   return prefix.empty() || |   return prefix.empty() || | ||||||
|          (text.size() >= prefix.size() && |          (text.size() >= prefix.size() && | ||||||
|          memcmp(text.data(), prefix.data(), prefix.size()) == 0); |           memcmp(text.data(), prefix.data(), prefix.size()) == 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // EndsWith()
 | // EndsWith()
 | ||||||
|  | @ -63,7 +63,8 @@ inline bool EndsWith(absl::string_view text, absl::string_view suffix) { | ||||||
|   return suffix.empty() || |   return suffix.empty() || | ||||||
|          (text.size() >= suffix.size() && |          (text.size() >= suffix.size() && | ||||||
|           memcmp(text.data() + (text.size() - suffix.size()), suffix.data(), |           memcmp(text.data() + (text.size() - suffix.size()), suffix.data(), | ||||||
|   suffix.size()) == 0); |                  suffix.size()) == 0 | ||||||
|  |          ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // StartsWithIgnoreCase()
 | // StartsWithIgnoreCase()
 | ||||||
|  |  | ||||||
|  | @ -62,9 +62,9 @@ ABSL_MUST_USE_RESULT bool SimpleAtod(absl::string_view str, double* value); | ||||||
| 
 | 
 | ||||||
| // SimpleAtob()
 | // SimpleAtob()
 | ||||||
| //
 | //
 | ||||||
| // Converts the given std::string into into a boolean, returning `true` if
 | // Converts the given std::string into a boolean, returning `true` if successful.
 | ||||||
| // successful. The following case-insensitive strings are interpreted as boolean
 | // The following case-insensitive strings are interpreted as boolean `true`:
 | ||||||
| // `true`: "true", "t", "yes", "y", "1". The following case-insensitive strings
 | // "true", "t", "yes", "y", "1". The following case-insensitive strings
 | ||||||
| // are interpreted as boolean `false`: "false", "f", "no", "n", "0".
 | // are interpreted as boolean `false`: "false", "f", "no", "n", "0".
 | ||||||
| ABSL_MUST_USE_RESULT bool SimpleAtob(absl::string_view str, bool* value); | ABSL_MUST_USE_RESULT bool SimpleAtob(absl::string_view str, bool* value); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -34,6 +34,9 @@ cc_library( | ||||||
|         "internal/graphcycles.h", |         "internal/graphcycles.h", | ||||||
|     ], |     ], | ||||||
|     copts = ABSL_DEFAULT_COPTS, |     copts = ABSL_DEFAULT_COPTS, | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl:__subpackages__", | ||||||
|  |     ], | ||||||
|     deps = [ |     deps = [ | ||||||
|         "//absl/base", |         "//absl/base", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|  |  | ||||||
|  | @ -57,6 +57,9 @@ cc_library( | ||||||
|     ], |     ], | ||||||
|     hdrs = ["internal/test_util.h"], |     hdrs = ["internal/test_util.h"], | ||||||
|     copts = ABSL_DEFAULT_COPTS, |     copts = ABSL_DEFAULT_COPTS, | ||||||
|  |     visibility = [ | ||||||
|  |         "//absl/time:__pkg__", | ||||||
|  |     ], | ||||||
|     deps = [ |     deps = [ | ||||||
|         ":time", |         ":time", | ||||||
|         "//absl/base", |         "//absl/base", | ||||||
|  |  | ||||||
|  | @ -270,8 +270,17 @@ TEST(optionalTest, CopyConstructor) { | ||||||
|     EXPECT_TRUE(absl::is_trivially_copy_constructible< |     EXPECT_TRUE(absl::is_trivially_copy_constructible< | ||||||
|                 absl::optional<const TrivialCopyable>>::value); |                 absl::optional<const TrivialCopyable>>::value); | ||||||
| #endif | #endif | ||||||
|  |     // When testing with VS 2017 15.3, there seems to be a bug in MSVC
 | ||||||
|  |     // std::optional when T is volatile-qualified. So skipping this test.
 | ||||||
|  |     // Bug report:
 | ||||||
|  |     // https://connect.microsoft.com/VisualStudio/feedback/details/3142534
 | ||||||
|  | #if defined(ABSL_HAVE_STD_OPTIONAL) && defined(_MSC_VER) && _MSC_VER >= 1911 | ||||||
|  | #define ABSL_MSVC_OPTIONAL_VOLATILE_COPY_BUG 1 | ||||||
|  | #endif | ||||||
|  | #ifndef ABSL_MSVC_OPTIONAL_VOLATILE_COPY_BUG | ||||||
|     EXPECT_FALSE(std::is_copy_constructible< |     EXPECT_FALSE(std::is_copy_constructible< | ||||||
|                  absl::optional<volatile TrivialCopyable>>::value); |                  absl::optional<volatile TrivialCopyable>>::value); | ||||||
|  | #endif | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -378,7 +378,7 @@ class Span { | ||||||
|   //
 |   //
 | ||||||
|   // Returns a reference to the i'th element of this span.
 |   // Returns a reference to the i'th element of this span.
 | ||||||
|   constexpr reference at(size_type i) const { |   constexpr reference at(size_type i) const { | ||||||
|     return ABSL_PREDICT_FALSE(i < size()) |     return ABSL_PREDICT_TRUE(i < size()) | ||||||
|                ? ptr_[i] |                ? ptr_[i] | ||||||
|                : (base_internal::ThrowStdOutOfRange( |                : (base_internal::ThrowStdOutOfRange( | ||||||
|                       "Span::at failed bounds check"), |                       "Span::at failed bounds check"), | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue