ampsci
c++ program for high-precision atomic structure calculations of single-valence systems
format-inl.h
1 // Formatting library for C++ - implementation
2 //
3 // Copyright (c) 2012 - 2016, Victor Zverovich
4 // All rights reserved.
5 //
6 // For the license information refer to format.h.
7 
8 #ifndef FMT_FORMAT_INL_H_
9 #define FMT_FORMAT_INL_H_
10 #ifdef __GNUC__
11 // Avoid tons of warnings with root code
12 #pragma GCC system_header
13 #endif
14 #ifdef __clang__
15 // Avoid tons of warnings with root code
16 #pragma clang system_header
17 #endif
18 
19 #include <algorithm>
20 #include <cctype>
21 #include <cerrno> // errno
22 #include <climits>
23 #include <cmath>
24 #include <cstdarg>
25 #include <cstring> // std::memmove
26 #include <cwchar>
27 #include <exception>
28 
29 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
30 #include <locale>
31 #endif
32 
33 #ifdef _WIN32
34 #include <io.h> // _isatty
35 #endif
36 
37 #include "format.h"
38 
39 FMT_BEGIN_NAMESPACE
40 namespace detail {
41 
42 FMT_FUNC void assert_fail(const char *file, int line, const char *message) {
43  // Use unchecked std::fprintf to avoid triggering another assertion when
44  // writing to stderr fails
45  std::fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message);
46  // Chosen instead of std::abort to satisfy Clang in CUDA mode during device
47  // code pass.
48  std::terminate();
49 }
50 
51 FMT_FUNC void throw_format_error(const char *message) {
52  FMT_THROW(format_error(message));
53 }
54 
55 FMT_FUNC void format_error_code(detail::buffer<char> &out, int error_code,
56  string_view message) noexcept {
57  // Report error code making sure that the output fits into
58  // inline_buffer_size to avoid dynamic memory allocation and potential
59  // bad_alloc.
60  out.try_resize(0);
61  static const char SEP[] = ": ";
62  static const char ERROR_STR[] = "error ";
63  // Subtract 2 to account for terminating null characters in SEP and ERROR_STR.
64  size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;
65  auto abs_value = static_cast<uint32_or_64_or_128_t<int>>(error_code);
66  if (detail::is_negative(error_code)) {
67  abs_value = 0 - abs_value;
68  ++error_code_size;
69  }
70  error_code_size += detail::to_unsigned(detail::count_digits(abs_value));
71  auto it = buffer_appender<char>(out);
72  if (message.size() <= inline_buffer_size - error_code_size)
73  format_to(it, FMT_STRING("{}{}"), message, SEP);
74  format_to(it, FMT_STRING("{}{}"), ERROR_STR, error_code);
75  FMT_ASSERT(out.size() <= inline_buffer_size, "");
76 }
77 
78 FMT_FUNC void report_error(format_func func, int error_code,
79  const char *message) noexcept {
80  memory_buffer full_message;
81  func(full_message, error_code, message);
82  // Don't use fwrite_fully because the latter may throw.
83  if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0)
84  std::fputc('\n', stderr);
85 }
86 
87 // A wrapper around fwrite that throws on error.
88 inline void fwrite_fully(const void *ptr, size_t size, size_t count,
89  FILE *stream) {
90  size_t written = std::fwrite(ptr, size, count, stream);
91  if (written < count)
92  FMT_THROW(system_error(errno, FMT_STRING("cannot write to file")));
93 }
94 
95 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
96 template <typename Locale>
97 locale_ref::locale_ref(const Locale &loc) : locale_(&loc) {
98  static_assert(std::is_same<Locale, std::locale>::value, "");
99 }
100 
101 template <typename Locale> Locale locale_ref::get() const {
102  static_assert(std::is_same<Locale, std::locale>::value, "");
103  return locale_ ? *static_cast<const std::locale *>(locale_) : std::locale();
104 }
105 
106 template <typename Char>
107 FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<Char> {
108  auto &facet = std::use_facet<std::numpunct<Char>>(loc.get<std::locale>());
109  auto grouping = facet.grouping();
110  auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep();
111  return {std::move(grouping), thousands_sep};
112 }
113 template <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref loc) {
114  return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>())
115  .decimal_point();
116 }
117 #else
118 template <typename Char>
119 FMT_FUNC auto thousands_sep_impl(locale_ref) -> thousands_sep_result<Char> {
120  return {"\03", FMT_STATIC_THOUSANDS_SEPARATOR};
121 }
122 template <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref) {
123  return '.';
124 }
125 #endif
126 
127 FMT_FUNC auto write_loc(appender out, loc_value value,
128  const format_specs<> &specs, locale_ref loc) -> bool {
129 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
130  auto locale = loc.get<std::locale>();
131  // We cannot use the num_put<char> facet because it may produce output in
132  // a wrong encoding.
133  using facet = format_facet<std::locale>;
134  if (std::has_facet<facet>(locale))
135  return std::use_facet<facet>(locale).put(out, value, specs);
136  return facet(locale).put(out, value, specs);
137 #endif
138  return false;
139 }
140 } // namespace detail
141 
142 template <typename Locale> typename Locale::id format_facet<Locale>::id;
143 
144 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
145 template <typename Locale> format_facet<Locale>::format_facet(Locale &loc) {
146  auto &numpunct = std::use_facet<std::numpunct<char>>(loc);
147  grouping_ = numpunct.grouping();
148  if (!grouping_.empty())
149  separator_ = std::string(1, numpunct.thousands_sep());
150 }
151 
152 template <>
153 FMT_API FMT_FUNC auto
154 format_facet<std::locale>::do_put(appender out, loc_value val,
155  const format_specs<> &specs) const -> bool {
156  return val.visit(
157  detail::loc_writer<>{out, specs, separator_, grouping_, decimal_point_});
158 }
159 #endif
160 
161 #if !FMT_MSC_VERSION
162 FMT_API FMT_FUNC format_error::~format_error() noexcept = default;
163 #endif
164 
165 FMT_FUNC std::system_error vsystem_error(int error_code, string_view format_str,
166  format_args args) {
167  auto ec = std::error_code(error_code, std::generic_category());
168  return std::system_error(ec, vformat(format_str, args));
169 }
170 
171 namespace detail {
172 
173 template <typename F> inline bool operator==(basic_fp<F> x, basic_fp<F> y) {
174  return x.f == y.f && x.e == y.e;
175 }
176 
177 // Compilers should be able to optimize this into the ror instruction.
178 FMT_CONSTEXPR inline uint32_t rotr(uint32_t n, uint32_t r) noexcept {
179  r &= 31;
180  return (n >> r) | (n << (32 - r));
181 }
182 FMT_CONSTEXPR inline uint64_t rotr(uint64_t n, uint32_t r) noexcept {
183  r &= 63;
184  return (n >> r) | (n << (64 - r));
185 }
186 
187 // Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox.
188 namespace dragonbox {
189 // Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a
190 // 64-bit unsigned integer.
191 inline uint64_t umul96_upper64(uint32_t x, uint64_t y) noexcept {
192  return umul128_upper64(static_cast<uint64_t>(x) << 32, y);
193 }
194 
195 // Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a
196 // 128-bit unsigned integer.
197 inline uint128_fallback umul192_lower128(uint64_t x,
198  uint128_fallback y) noexcept {
199  uint64_t high = x * y.high();
200  uint128_fallback high_low = umul128(x, y.low());
201  return {high + high_low.high(), high_low.low()};
202 }
203 
204 // Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a
205 // 64-bit unsigned integer.
206 inline uint64_t umul96_lower64(uint32_t x, uint64_t y) noexcept {
207  return x * y;
208 }
209 
210 // Various fast log computations.
211 inline int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept {
212  FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent");
213  return (e * 631305 - 261663) >> 21;
214 }
215 
216 static constexpr struct {
217  uint32_t divisor;
218  int shift_amount;
219 } div_small_pow10_infos[] = {{10, 16}, {100, 16}};
220 
221 // Replaces n by floor(n / pow(10, N)) returning true if and only if n is
222 // divisible by pow(10, N).
223 // Precondition: n <= pow(10, N + 1).
224 template <int N>
225 bool check_divisibility_and_divide_by_pow10(uint32_t &n) noexcept {
226  // The numbers below are chosen such that:
227  // 1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100,
228  // 2. nm mod 2^k < m if and only if n is divisible by d,
229  // where m is magic_number, k is shift_amount
230  // and d is divisor.
231  //
232  // Item 1 is a common technique of replacing division by a constant with
233  // multiplication, see e.g. "Division by Invariant Integers Using
234  // Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set
235  // to ceil(2^k/d) for large enough k.
236  // The idea for item 2 originates from Schubfach.
237  constexpr auto info = div_small_pow10_infos[N - 1];
238  FMT_ASSERT(n <= info.divisor * 10, "n is too large");
239  constexpr uint32_t magic_number =
240  (1u << info.shift_amount) / info.divisor + 1;
241  n *= magic_number;
242  const uint32_t comparison_mask = (1u << info.shift_amount) - 1;
243  bool result = (n & comparison_mask) < magic_number;
244  n >>= info.shift_amount;
245  return result;
246 }
247 
248 // Computes floor(n / pow(10, N)) for small n and N.
249 // Precondition: n <= pow(10, N + 1).
250 template <int N> uint32_t small_division_by_pow10(uint32_t n) noexcept {
251  constexpr auto info = div_small_pow10_infos[N - 1];
252  FMT_ASSERT(n <= info.divisor * 10, "n is too large");
253  constexpr uint32_t magic_number =
254  (1u << info.shift_amount) / info.divisor + 1;
255  return (n * magic_number) >> info.shift_amount;
256 }
257 
258 // Computes floor(n / 10^(kappa + 1)) (float)
259 inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) noexcept {
260  // 1374389535 = ceil(2^37/100)
261  return static_cast<uint32_t>((static_cast<uint64_t>(n) * 1374389535) >> 37);
262 }
263 // Computes floor(n / 10^(kappa + 1)) (double)
264 inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) noexcept {
265  // 2361183241434822607 = ceil(2^(64+7)/1000)
266  return umul128_upper64(n, 2361183241434822607ull) >> 7;
267 }
268 
269 // Various subroutines using pow10 cache
270 template <class T> struct cache_accessor;
271 
272 template <> struct cache_accessor<float> {
273  using carrier_uint = float_info<float>::carrier_uint;
274  using cache_entry_type = uint64_t;
275 
276  static uint64_t get_cached_power(int k) noexcept {
277  FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,
278  "k is out of range");
279  static constexpr const uint64_t pow10_significands[] = {
280  0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
281  0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
282  0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
283  0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
284  0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
285  0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
286  0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
287  0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
288  0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
289  0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
290  0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
291  0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
292  0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
293  0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
294  0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
295  0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
296  0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
297  0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
298  0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
299  0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985,
300  0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297,
301  0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7,
302  0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21,
303  0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe,
304  0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a,
305  0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f};
306  return pow10_significands[k - float_info<float>::min_k];
307  }
308 
309  struct compute_mul_result {
310  carrier_uint result;
311  bool is_integer;
312  };
313  struct compute_mul_parity_result {
314  bool parity;
315  bool is_integer;
316  };
317 
318  static compute_mul_result
319  compute_mul(carrier_uint u, const cache_entry_type &cache) noexcept {
320  auto r = umul96_upper64(u, cache);
321  return {static_cast<carrier_uint>(r >> 32),
322  static_cast<carrier_uint>(r) == 0};
323  }
324 
325  static uint32_t compute_delta(const cache_entry_type &cache,
326  int beta) noexcept {
327  return static_cast<uint32_t>(cache >> (64 - 1 - beta));
328  }
329 
330  static compute_mul_parity_result
331  compute_mul_parity(carrier_uint two_f, const cache_entry_type &cache,
332  int beta) noexcept {
333  FMT_ASSERT(beta >= 1, "");
334  FMT_ASSERT(beta < 64, "");
335 
336  auto r = umul96_lower64(two_f, cache);
337  return {((r >> (64 - beta)) & 1) != 0,
338  static_cast<uint32_t>(r >> (32 - beta)) == 0};
339  }
340 
341  static carrier_uint
342  compute_left_endpoint_for_shorter_interval_case(const cache_entry_type &cache,
343  int beta) noexcept {
344  return static_cast<carrier_uint>(
345  (cache - (cache >> (num_significand_bits<float>() + 2))) >>
346  (64 - num_significand_bits<float>() - 1 - beta));
347  }
348 
349  static carrier_uint compute_right_endpoint_for_shorter_interval_case(
350  const cache_entry_type &cache, int beta) noexcept {
351  return static_cast<carrier_uint>(
352  (cache + (cache >> (num_significand_bits<float>() + 1))) >>
353  (64 - num_significand_bits<float>() - 1 - beta));
354  }
355 
356  static carrier_uint
357  compute_round_up_for_shorter_interval_case(const cache_entry_type &cache,
358  int beta) noexcept {
359  return (static_cast<carrier_uint>(
360  cache >> (64 - num_significand_bits<float>() - 2 - beta)) +
361  1) /
362  2;
363  }
364 };
365 
366 template <> struct cache_accessor<double> {
367  using carrier_uint = float_info<double>::carrier_uint;
368  using cache_entry_type = uint128_fallback;
369 
370  static uint128_fallback get_cached_power(int k) noexcept {
371  FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,
372  "k is out of range");
373 
374  static constexpr const uint128_fallback pow10_significands[] = {
375 #if FMT_USE_FULL_CACHE_DRAGONBOX
376  {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
377  {0x9faacf3df73609b1, 0x77b191618c54e9ad},
378  {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
379  {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
380  {0x9becce62836ac577, 0x4ee367f9430aec33},
381  {0xc2e801fb244576d5, 0x229c41f793cda740},
382  {0xf3a20279ed56d48a, 0x6b43527578c11110},
383  {0x9845418c345644d6, 0x830a13896b78aaaa},
384  {0xbe5691ef416bd60c, 0x23cc986bc656d554},
385  {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
386  {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
387  {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
388  {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
389  {0x91376c36d99995be, 0x23100809b9c21fa2},
390  {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
391  {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
392  {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
393  {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
394  {0xdd95317f31c7fa1d, 0x40405643d711d584},
395  {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
396  {0xad1c8eab5ee43b66, 0xda3243650005eed0},
397  {0xd863b256369d4a40, 0x90bed43e40076a83},
398  {0x873e4f75e2224e68, 0x5a7744a6e804a292},
399  {0xa90de3535aaae202, 0x711515d0a205cb37},
400  {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
401  {0x8412d9991ed58091, 0xe858790afe9486c3},
402  {0xa5178fff668ae0b6, 0x626e974dbe39a873},
403  {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
404  {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
405  {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
406  {0xc987434744ac874e, 0xa327ffb266b56221},
407  {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
408  {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
409  {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
410  {0xf6019da07f549b2b, 0x7e2a53a146606a49},
411  {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
412  {0xc0314325637a1939, 0xfa911155fefb5309},
413  {0xf03d93eebc589f88, 0x793555ab7eba27cb},
414  {0x96267c7535b763b5, 0x4bc1558b2f3458df},
415  {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
416  {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
417  {0x92a1958a7675175f, 0x0bfacd89ec191eca},
418  {0xb749faed14125d36, 0xcef980ec671f667c},
419  {0xe51c79a85916f484, 0x82b7e12780e7401b},
420  {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
421  {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
422  {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
423  {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
424  {0xaecc49914078536d, 0x58fae9f773886e19},
425  {0xda7f5bf590966848, 0xaf39a475506a899f},
426  {0x888f99797a5e012d, 0x6d8406c952429604},
427  {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
428  {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
429  {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
430  {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
431  {0xd0601d8efc57b08b, 0xf13b94daf124da27},
432  {0x823c12795db6ce57, 0x76c53d08d6b70859},
433  {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
434  {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
435  {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
436  {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
437  {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
438  {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
439  {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
440  {0xc21094364dfb5636, 0x985915fc12f542e5},
441  {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
442  {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
443  {0xbd8430bd08277231, 0x50c6ff782a838354},
444  {0xece53cec4a314ebd, 0xa4f8bf5635246429},
445  {0x940f4613ae5ed136, 0x871b7795e136be9a},
446  {0xb913179899f68584, 0x28e2557b59846e40},
447  {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
448  {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
449  {0xb4bca50b065abe63, 0x0fed077a756b53aa},
450  {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
451  {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
452  {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
453  {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
454  {0x89e42caaf9491b60, 0xf41686c49db57245},
455  {0xac5d37d5b79b6239, 0x311c2875c522ced6},
456  {0xd77485cb25823ac7, 0x7d633293366b828c},
457  {0x86a8d39ef77164bc, 0xae5dff9c02033198},
458  {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
459  {0xd267caa862a12d66, 0xd072df63c324fd7c},
460  {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
461  {0xa46116538d0deb78, 0x52d9be85f074e609},
462  {0xcd795be870516656, 0x67902e276c921f8c},
463  {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
464  {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
465  {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
466  {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
467  {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
468  {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
469  {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
470  {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
471  {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
472  {0xef340a98172aace4, 0x86fb897116c87c35},
473  {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
474  {0xbae0a846d2195712, 0x8974836059cca10a},
475  {0xe998d258869facd7, 0x2bd1a438703fc94c},
476  {0x91ff83775423cc06, 0x7b6306a34627ddd0},
477  {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
478  {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
479  {0x8e938662882af53e, 0x547eb47b7282ee9d},
480  {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
481  {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
482  {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
483  {0xae0b158b4738705e, 0x9624ab50b148d446},
484  {0xd98ddaee19068c76, 0x3badd624dd9b0958},
485  {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
486  {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
487  {0xd47487cc8470652b, 0x7647c32000696720},
488  {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
489  {0xa5fb0a17c777cf09, 0xf468107100525891},
490  {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
491  {0x81ac1fe293d599bf, 0xc6f14cd848405531},
492  {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
493  {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
494  {0xfd442e4688bd304a, 0x908f4a166d1da664},
495  {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
496  {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
497  {0xf7549530e188c128, 0xd12bee59e68ef47d},
498  {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
499  {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
500  {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
501  {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
502  {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
503  {0xebdf661791d60f56, 0x111b495b3464ad22},
504  {0x936b9fcebb25c995, 0xcab10dd900beec35},
505  {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
506  {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
507  {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
508  {0xb3f4e093db73a093, 0x59ed216765690f57},
509  {0xe0f218b8d25088b8, 0x306869c13ec3532d},
510  {0x8c974f7383725573, 0x1e414218c73a13fc},
511  {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
512  {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
513  {0x894bc396ce5da772, 0x6b8bba8c328eb784},
514  {0xab9eb47c81f5114f, 0x066ea92f3f326565},
515  {0xd686619ba27255a2, 0xc80a537b0efefebe},
516  {0x8613fd0145877585, 0xbd06742ce95f5f37},
517  {0xa798fc4196e952e7, 0x2c48113823b73705},
518  {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
519  {0x82ef85133de648c4, 0x9a984d73dbe722fc},
520  {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
521  {0xcc963fee10b7d1b3, 0x318df905079926a9},
522  {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
523  {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
524  {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
525  {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
526  {0x9c1661a651213e2d, 0x06bea10ca65c084f},
527  {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
528  {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
529  {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
530  {0xbe89523386091465, 0xf6bbb397f1135824},
531  {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
532  {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
533  {0xba121a4650e4ddeb, 0x92f34d62616ce414},
534  {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
535  {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
536  {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
537  {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
538  {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
539  {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
540  {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
541  {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
542  {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
543  {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
544  {0x87625f056c7c4a8b, 0x11471cd764ad4973},
545  {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
546  {0xd389b47879823479, 0x4aff1d108d4ec2c4},
547  {0x843610cb4bf160cb, 0xcedf722a585139bb},
548  {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
549  {0xce947a3da6a9273e, 0x733d226229feea33},
550  {0x811ccc668829b887, 0x0806357d5a3f5260},
551  {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
552  {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
553  {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
554  {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
555  {0xc5029163f384a931, 0x0a9e795e65d4df12},
556  {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
557  {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
558  {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
559  {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
560  {0x964e858c91ba2655, 0x3a6a07f8d510f870},
561  {0xbbe226efb628afea, 0x890489f70a55368c},
562  {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
563  {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
564  {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
565  {0xe55990879ddcaabd, 0xcc420a6a101d0516},
566  {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
567  {0xb32df8e9f3546564, 0x47939822dc96abfa},
568  {0xdff9772470297ebd, 0x59787e2b93bc56f8},
569  {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
570  {0xaefae51477a06b03, 0xede622920b6b23f2},
571  {0xdab99e59958885c4, 0xe95fab368e45ecee},
572  {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
573  {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
574  {0xd59944a37c0752a2, 0x4be76d3346f04960},
575  {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
576  {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
577  {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
578  {0x825ecc24c873782f, 0x8ed400668c0c28c9},
579  {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
580  {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
581  {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
582  {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
583  {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
584  {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
585  {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
586  {0xc24452da229b021b, 0xfbe85badce996169},
587  {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
588  {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
589  {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
590  {0xed246723473e3813, 0x290123e9aab23b69},
591  {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
592  {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
593  {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
594  {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
595  {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
596  {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
597  {0x8d590723948a535f, 0x579c487e5a38ad0f},
598  {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
599  {0xdcdb1b2798182244, 0xf8e431456cf88e66},
600  {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
601  {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
602  {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
603  {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
604  {0xa87fea27a539e9a5, 0x3f2398d747b36225},
605  {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
606  {0x83a3eeeef9153e89, 0x1953cf68300424ad},
607  {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
608  {0xcdb02555653131b6, 0x3792f412cb06794e},
609  {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
610  {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
611  {0xc8de047564d20a8b, 0xf245825a5a445276},
612  {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
613  {0x9ced737bb6c4183d, 0x55464dd69685606c},
614  {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
615  {0xf53304714d9265df, 0xd53dd99f4b3066a9},
616  {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
617  {0xbf8fdb78849a5f96, 0xde98520472bdd034},
618  {0xef73d256a5c0f77c, 0x963e66858f6d4441},
619  {0x95a8637627989aad, 0xdde7001379a44aa9},
620  {0xbb127c53b17ec159, 0x5560c018580d5d53},
621  {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
622  {0x9226712162ab070d, 0xcab3961304ca70e9},
623  {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
624  {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
625  {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
626  {0xb267ed1940f1c61c, 0x55f038b237591ed4},
627  {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
628  {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
629  {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
630  {0xd9c7dced53c72255, 0x96e7bd358c904a22},
631  {0x881cea14545c7575, 0x7e50d64177da2e55},
632  {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
633  {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
634  {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
635  {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
636  {0xcfb11ead453994ba, 0x67de18eda5814af3},
637  {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
638  {0xa2425ff75e14fc31, 0xa1258379a94d028e},
639  {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
640  {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
641  {0x9e74d1b791e07e48, 0x775ea264cf55347e},
642  {0xc612062576589dda, 0x95364afe032a819e},
643  {0xf79687aed3eec551, 0x3a83ddbd83f52205},
644  {0x9abe14cd44753b52, 0xc4926a9672793543},
645  {0xc16d9a0095928a27, 0x75b7053c0f178294},
646  {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
647  {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
648  {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
649  {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
650  {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
651  {0xb877aa3236a4b449, 0x09befeb9fad487c3},
652  {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
653  {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
654  {0xb424dc35095cd80f, 0x538484c19ef38c95},
655  {0xe12e13424bb40e13, 0x2865a5f206b06fba},
656  {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
657  {0xafebff0bcb24aafe, 0xf78f69a51539d749},
658  {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
659  {0x89705f4136b4a597, 0x31680a88f8953031},
660  {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
661  {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
662  {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
663  {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
664  {0xd1b71758e219652b, 0xd3c36113404ea4a9},
665  {0x83126e978d4fdf3b, 0x645a1cac083126ea},
666  {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
667  {0xcccccccccccccccc, 0xcccccccccccccccd},
668  {0x8000000000000000, 0x0000000000000000},
669  {0xa000000000000000, 0x0000000000000000},
670  {0xc800000000000000, 0x0000000000000000},
671  {0xfa00000000000000, 0x0000000000000000},
672  {0x9c40000000000000, 0x0000000000000000},
673  {0xc350000000000000, 0x0000000000000000},
674  {0xf424000000000000, 0x0000000000000000},
675  {0x9896800000000000, 0x0000000000000000},
676  {0xbebc200000000000, 0x0000000000000000},
677  {0xee6b280000000000, 0x0000000000000000},
678  {0x9502f90000000000, 0x0000000000000000},
679  {0xba43b74000000000, 0x0000000000000000},
680  {0xe8d4a51000000000, 0x0000000000000000},
681  {0x9184e72a00000000, 0x0000000000000000},
682  {0xb5e620f480000000, 0x0000000000000000},
683  {0xe35fa931a0000000, 0x0000000000000000},
684  {0x8e1bc9bf04000000, 0x0000000000000000},
685  {0xb1a2bc2ec5000000, 0x0000000000000000},
686  {0xde0b6b3a76400000, 0x0000000000000000},
687  {0x8ac7230489e80000, 0x0000000000000000},
688  {0xad78ebc5ac620000, 0x0000000000000000},
689  {0xd8d726b7177a8000, 0x0000000000000000},
690  {0x878678326eac9000, 0x0000000000000000},
691  {0xa968163f0a57b400, 0x0000000000000000},
692  {0xd3c21bcecceda100, 0x0000000000000000},
693  {0x84595161401484a0, 0x0000000000000000},
694  {0xa56fa5b99019a5c8, 0x0000000000000000},
695  {0xcecb8f27f4200f3a, 0x0000000000000000},
696  {0x813f3978f8940984, 0x4000000000000000},
697  {0xa18f07d736b90be5, 0x5000000000000000},
698  {0xc9f2c9cd04674ede, 0xa400000000000000},
699  {0xfc6f7c4045812296, 0x4d00000000000000},
700  {0x9dc5ada82b70b59d, 0xf020000000000000},
701  {0xc5371912364ce305, 0x6c28000000000000},
702  {0xf684df56c3e01bc6, 0xc732000000000000},
703  {0x9a130b963a6c115c, 0x3c7f400000000000},
704  {0xc097ce7bc90715b3, 0x4b9f100000000000},
705  {0xf0bdc21abb48db20, 0x1e86d40000000000},
706  {0x96769950b50d88f4, 0x1314448000000000},
707  {0xbc143fa4e250eb31, 0x17d955a000000000},
708  {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
709  {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
710  {0xb7abc627050305ad, 0xf14a3d9e40000000},
711  {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
712  {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
713  {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
714  {0xe0352f62a19e306e, 0xd50b2037ad200000},
715  {0x8c213d9da502de45, 0x4526f422cc340000},
716  {0xaf298d050e4395d6, 0x9670b12b7f410000},
717  {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
718  {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
719  {0xab0e93b6efee0053, 0x8eea0d047a457a00},
720  {0xd5d238a4abe98068, 0x72a4904598d6d880},
721  {0x85a36366eb71f041, 0x47a6da2b7f864750},
722  {0xa70c3c40a64e6c51, 0x999090b65f67d924},
723  {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
724  {0x82818f1281ed449f, 0xbff8f10e7a8921a5},
725  {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
726  {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
727  {0xfee50b7025c36a08, 0x02f236d04753d5b5},
728  {0x9f4f2726179a2245, 0x01d762422c946591},
729  {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
730  {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3},
731  {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
732  {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc},
733  {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
734  {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad},
735  {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
736  {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde},
737  {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
738  {0xb975d6b6ee39e436, 0xb3e2fd538e122b45},
739  {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
740  {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce},
741  {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
742  {0xe264589a4dcdab14, 0xc696963c7eed2dd2},
743  {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
744  {0xb0de65388cc8ada8, 0x3b25a55f43294bcc},
745  {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
746  {0x8a2dbf142dfcc7ab, 0x6e3569326c784338},
747  {0xacb92ed9397bf996, 0x49c2c37f07965405},
748  {0xd7e77a8f87daf7fb, 0xdc33745ec97be907},
749  {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
750  {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d},
751  {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
752  {0x83c7088e1aab65db, 0x792667c6da79e0fb},
753  {0xa4b8cab1a1563f52, 0x577001b891185939},
754  {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
755  {0x80b05e5ac60b6178, 0x544f8158315b05b5},
756  {0xa0dc75f1778e39d6, 0x696361ae3db1c722},
757  {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
758  {0xfb5878494ace3a5f, 0x04ab48a04065c724},
759  {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
760  {0xc45d1df942711d9a, 0x3ba5d0bd324f8395},
761  {0xf5746577930d6500, 0xca8f44ec7ee3647a},
762  {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc},
763  {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
764  {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f},
765  {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
766  {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98},
767  {0xea1575143cf97226, 0xf52d09d71a3293be},
768  {0x924d692ca61be758, 0x593c2626705f9c57},
769  {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
770  {0xe498f455c38b997a, 0x0b6dfb9c0f956448},
771  {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
772  {0xb2977ee300c50fe7, 0x58edec91ec2cb658},
773  {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
774  {0x8b865b215899f46c, 0xbd79e0d20082ee75},
775  {0xae67f1e9aec07187, 0xecd8590680a3aa12},
776  {0xda01ee641a708de9, 0xe80e6f4820cc9496},
777  {0x884134fe908658b2, 0x3109058d147fdcde},
778  {0xaa51823e34a7eede, 0xbd4b46f0599fd416},
779  {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
780  {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
781  {0xa6539930bf6bff45, 0x84db8346b786151d},
782  {0xcfe87f7cef46ff16, 0xe612641865679a64},
783  {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
784  {0xa26da3999aef7749, 0xe3be5e330f38f09e},
785  {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
786  {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7},
787  {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
788  {0xc646d63501a1511d, 0xb281e1fd541501b9},
789  {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
790  {0x9ae757596946075f, 0x3375788de9b06959},
791  {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
792  {0xf209787bb47d6b84, 0xc0678c5dbd23a49b},
793  {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
794  {0xbd176620a501fbff, 0xb650e5a93bc3d899},
795  {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
796  {0x93ba47c980e98cdf, 0xc66f336c36b10138},
797  {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
798  {0xe6d3102ad96cec1d, 0xa60dc059157491e6},
799  {0x9043ea1ac7e41392, 0x87c89837ad68db30},
800  {0xb454e4a179dd1877, 0x29babe4598c311fc},
801  {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
802  {0x8ce2529e2734bb1d, 0x1899e4a65f58660d},
803  {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
804  {0xdc21a1171d42645d, 0x76707543f4fa1f74},
805  {0x899504ae72497eba, 0x6a06494a791c53a9},
806  {0xabfa45da0edbde69, 0x0487db9d17636893},
807  {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
808  {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
809  {0xa7f26836f282b732, 0x8e6cac7768d7141f},
810  {0xd1ef0244af2364ff, 0x3207d795430cd927},
811  {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
812  {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7},
813  {0xcd036837130890a1, 0x36dba887c37a8c10},
814  {0x802221226be55a64, 0xc2494954da2c978a},
815  {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
816  {0xc83553c5c8965d3d, 0x6f92829494e5acc8},
817  {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
818  {0x9c69a97284b578d7, 0xff2a760414536efc},
819  {0xc38413cf25e2d70d, 0xfef5138519684abb},
820  {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a},
821  {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
822  {0xbeeefb584aff8603, 0xaafb550ffacfd8fb},
823  {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
824  {0x952ab45cfa97a0b2, 0xdd945a747bf26184},
825  {0xba756174393d88df, 0x94f971119aeef9e5},
826  {0xe912b9d1478ceb17, 0x7a37cd5601aab85e},
827  {0x91abb422ccb812ee, 0xac62e055c10ab33b},
828  {0xb616a12b7fe617aa, 0x577b986b314d600a},
829  {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
830  {0x8e41ade9fbebc27d, 0x14588f13be847308},
831  {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
832  {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc},
833  {0x8aec23d680043bee, 0x25de7bb9480d5855},
834  {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
835  {0xd910f7ff28069da4, 0x1b2ba1518094da05},
836  {0x87aa9aff79042286, 0x90fb44d2f05d0843},
837  {0xa99541bf57452b28, 0x353a1607ac744a54},
838  {0xd3fa922f2d1675f2, 0x42889b8997915ce9},
839  {0x847c9b5d7c2e09b7, 0x69956135febada12},
840  {0xa59bc234db398c25, 0x43fab9837e699096},
841  {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
842  {0x8161afb94b44f57d, 0x1d1be0eebac278f6},
843  {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
844  {0xca28a291859bbf93, 0x7d7b8f7503cfdcff},
845  {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
846  {0x9defbf01b061adab, 0x3a0888136afa64a8},
847  {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
848  {0xf6c69a72a3989f5b, 0x8aad549e57273d46},
849  {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
850  {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de},
851  {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
852  {0x969eb7c47859e743, 0x9f644ae5a4b1b326},
853  {0xbc4665b596706114, 0x873d5d9f0dde1fef},
854  {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb},
855  {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
856  {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30},
857  {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
858  {0x8fa475791a569d10, 0xf96e017d694487bd},
859  {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
860  {0xe070f78d3927556a, 0x85bbe253f47b1418},
861  {0x8c469ab843b89562, 0x93956d7478ccec8f},
862  {0xaf58416654a6babb, 0x387ac8d1970027b3},
863  {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
864  {0x88fcf317f22241e2, 0x441fece3bdf81f04},
865  {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
866  {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075},
867  {0x85c7056562757456, 0xf6872d5667844e4a},
868  {0xa738c6bebb12d16c, 0xb428f8ac016561dc},
869  {0xd106f86e69d785c7, 0xe13336d701beba53},
870  {0x82a45b450226b39c, 0xecc0024661173474},
871  {0xa34d721642b06084, 0x27f002d7f95d0191},
872  {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5},
873  {0xff290242c83396ce, 0x7e67047175a15272},
874  {0x9f79a169bd203e41, 0x0f0062c6e984d387},
875  {0xc75809c42c684dd1, 0x52c07b78a3e60869},
876  {0xf92e0c3537826145, 0xa7709a56ccdf8a83},
877  {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
878  {0xc2abf989935ddbfe, 0x6acff893d00ea436},
879  {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
880  {0x98165af37b2153de, 0xc3727a337a8b704b},
881  {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
882  {0xeda2ee1c7064130c, 0x1162def06f79df74},
883  {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
884  {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693},
885  {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
886  {0x910ab1d4db9914a0, 0x1d9c9892400a22a3},
887  {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
888  {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
889  {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
890  {0xb10d8e1456105dad, 0x7425a83e872c5f48},
891  {0xdd50f1996b947518, 0xd12f124e28f7771a},
892  {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70},
893  {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
894  {0xd8210befd30efa5a, 0x3c47f7e05401aa4f},
895  {0x8714a775e3e95c78, 0x65acfaec34810a72},
896  {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e},
897  {0xd31045a8341ca07c, 0x1ede48111209a051},
898  {0x83ea2b892091e44d, 0x934aed0aab460433},
899  {0xa4e4b66b68b65d60, 0xf81da84d56178540},
900  {0xce1de40642e3f4b9, 0x36251260ab9d668f},
901  {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
902  {0xa1075a24e4421730, 0xb24cf65b8612f820},
903  {0xc94930ae1d529cfc, 0xdee033f26797b628},
904  {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2},
905  {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
906  {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3},
907  {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
908  {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a},
909  {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
910  {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1},
911  {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
912  {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2},
913  {0xea53df5fd18d5513, 0x84c86189216dc5ee},
914  {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5},
915  {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
916  {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
917  {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
918  {0xb2c71d5bca9023f8, 0x743e20e9ef511013},
919  {0xdf78e4b2bd342cf6, 0x914da9246b255417},
920  {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f},
921  {0xae9672aba3d0c320, 0xa184ac2473b529b2},
922  {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f},
923  {0x8865899617fb1871, 0x7e2fa67c7a658893},
924  {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8},
925  {0xd51ea6fa85785631, 0x552a74227f3ea566},
926  {0x8533285c936b35de, 0xd53a88958f872760},
927  {0xa67ff273b8460356, 0x8a892abaf368f138},
928  {0xd01fef10a657842c, 0x2d2b7569b0432d86},
929  {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
930  {0xa298f2c501f45f42, 0x8349f3ba91b47b90},
931  {0xcb3f2f7642717713, 0x241c70a936219a74},
932  {0xfe0efb53d30dd4d7, 0xed238cd383aa0111},
933  {0x9ec95d1463e8a506, 0xf4363804324a40ab},
934  {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6},
935  {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
936  {0x9b10a4e5e9913128, 0xca7cf2b4191c8327},
937  {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
938  {0xf24a01a73cf2dccf, 0xbc633b39673c8ced},
939  {0x976e41088617ca01, 0xd5be0503e085d814},
940  {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19},
941  {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
942  {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
943  {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
944  {0xe7109bfba19c0c9d, 0x0cc512670a783ad5},
945  {0x906a617d450187e2, 0x27fb2b80668b24c6},
946  {0xb484f9dc9641e9da, 0xb1f9f660802dedf7},
947  {0xe1a63853bbd26451, 0x5e7873f8a0396974},
948  {0x8d07e33455637eb2, 0xdb0b487b6423e1e9},
949  {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
950  {0xdc5c5301c56b75f7, 0x7641a140cc7810fc},
951  {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
952  {0xac2820d9623bf429, 0x546345fa9fbdcd45},
953  {0xd732290fbacaf133, 0xa97c177947ad4096},
954  {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e},
955  {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
956  {0xd226fc195c6a2f8c, 0x73832eec6fff3112},
957  {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
958  {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56},
959  {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
960  {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4},
961  {0xa0555e361951c366, 0xd7e105bcc3326220},
962  {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8},
963  {0xfa856334878fc150, 0xb14f98f6f0feb952},
964  {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4},
965  {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
966  {0xf4a642e14c6262c8, 0xcd27bb612758c0fb},
967  {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
968  {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4},
969  {0xeeea5d5004981478, 0x1858ccfce06cac75},
970  {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
971  {0xbaa718e68396cffd, 0xd30560258f54e6bb},
972  {0xe950df20247c83fd, 0x47c6b82ef32a206a},
973  {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
974  {0xb6472e511c81471d, 0xe0133fe4adf8e953},
975  {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
976  {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649},
977  {0xb201833b35d63f73, 0x2cd2cc6551e513db},
978  {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2},
979  {0x8b112e86420f6191, 0xfb04afaf27faf783},
980  {0xadd57a27d29339f6, 0x79c5db9af1f9b564},
981  {0xd94ad8b1c7380874, 0x18375281ae7822bd},
982  {0x87cec76f1c830548, 0x8f2293910d0b15b6},
983  {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
984  {0xd433179d9c8cb841, 0x5fa60692a46151ec},
985  {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
986  {0xa5c7ea73224deff3, 0x12b9b522906c0801},
987  {0xcf39e50feae16bef, 0xd768226b34870a01},
988  {0x81842f29f2cce375, 0xe6a1158300d46641},
989  {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
990  {0xca5e89b18b602368, 0x385bb19cb14bdfc5},
991  {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
992  {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2},
993  {0xc5a05277621be293, 0xc7098b7305241886},
994  {0xf70867153aa2db38, 0xb8cbee4fc66d1ea8},
995  {0x9a65406d44a5c903, 0x737f74f1dc043329},
996  {0xc0fe908895cf3b44, 0x505f522e53053ff3},
997  {0xf13e34aabb430a15, 0x647726b9e7c68ff0},
998  {0x96c6e0eab509e64d, 0x5eca783430dc19f6},
999  {0xbc789925624c5fe0, 0xb67d16413d132073},
1000  {0xeb96bf6ebadf77d8, 0xe41c5bd18c57e890},
1001  {0x933e37a534cbaae7, 0x8e91b962f7b6f15a},
1002  {0xb80dc58e81fe95a1, 0x723627bbb5a4adb1},
1003  {0xe61136f2227e3b09, 0xcec3b1aaa30dd91d},
1004  {0x8fcac257558ee4e6, 0x213a4f0aa5e8a7b2},
1005  {0xb3bd72ed2af29e1f, 0xa988e2cd4f62d19e},
1006  {0xe0accfa875af45a7, 0x93eb1b80a33b8606},
1007  {0x8c6c01c9498d8b88, 0xbc72f130660533c4},
1008  {0xaf87023b9bf0ee6a, 0xeb8fad7c7f8680b5},
1009  {0xdb68c2ca82ed2a05, 0xa67398db9f6820e2}
1010 #else
1011  {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
1012  {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
1013  {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
1014  {0x86a8d39ef77164bc, 0xae5dff9c02033198},
1015  {0xd98ddaee19068c76, 0x3badd624dd9b0958},
1016  {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
1017  {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
1018  {0xe55990879ddcaabd, 0xcc420a6a101d0516},
1019  {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1020  {0x95a8637627989aad, 0xdde7001379a44aa9},
1021  {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1022  {0xc350000000000000, 0x0000000000000000},
1023  {0x9dc5ada82b70b59d, 0xf020000000000000},
1024  {0xfee50b7025c36a08, 0x02f236d04753d5b5},
1025  {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
1026  {0xa6539930bf6bff45, 0x84db8346b786151d},
1027  {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
1028  {0xd910f7ff28069da4, 0x1b2ba1518094da05},
1029  {0xaf58416654a6babb, 0x387ac8d1970027b3},
1030  {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
1031  {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
1032  {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
1033  {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
1034  {0xf13e34aabb430a15, 0x647726b9e7c68ff0}
1035 #endif
1036  };
1037 
1038 #if FMT_USE_FULL_CACHE_DRAGONBOX
1039  return pow10_significands[k - float_info<double>::min_k];
1040 #else
1041  static constexpr const uint64_t powers_of_5_64[] = {
1042  0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1043  0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1044  0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1045  0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1046  0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1047  0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1048  0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1049  0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1050  0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1051 
1052  static const int compression_ratio = 27;
1053 
1054  // Compute base index.
1055  int cache_index = (k - float_info<double>::min_k) / compression_ratio;
1056  int kb = cache_index * compression_ratio + float_info<double>::min_k;
1057  int offset = k - kb;
1058 
1059  // Get base cache.
1060  uint128_fallback base_cache = pow10_significands[cache_index];
1061  if (offset == 0)
1062  return base_cache;
1063 
1064  // Compute the required amount of bit-shift.
1065  int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;
1066  FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected");
1067 
1068  // Try to recover the real cache.
1069  uint64_t pow5 = powers_of_5_64[offset];
1070  uint128_fallback recovered_cache = umul128(base_cache.high(), pow5);
1071  uint128_fallback middle_low = umul128(base_cache.low(), pow5);
1072 
1073  recovered_cache += middle_low.high();
1074 
1075  uint64_t high_to_middle = recovered_cache.high() << (64 - alpha);
1076  uint64_t middle_to_low = recovered_cache.low() << (64 - alpha);
1077 
1078  recovered_cache =
1079  uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle,
1080  ((middle_low.low() >> alpha) | middle_to_low)};
1081  FMT_ASSERT(recovered_cache.low() + 1 != 0, "");
1082  return {recovered_cache.high(), recovered_cache.low() + 1};
1083 #endif
1084  }
1085 
1086  struct compute_mul_result {
1087  carrier_uint result;
1088  bool is_integer;
1089  };
1090  struct compute_mul_parity_result {
1091  bool parity;
1092  bool is_integer;
1093  };
1094 
1095  static compute_mul_result
1096  compute_mul(carrier_uint u, const cache_entry_type &cache) noexcept {
1097  auto r = umul192_upper128(u, cache);
1098  return {r.high(), r.low() == 0};
1099  }
1100 
1101  static uint32_t compute_delta(cache_entry_type const &cache,
1102  int beta) noexcept {
1103  return static_cast<uint32_t>(cache.high() >> (64 - 1 - beta));
1104  }
1105 
1106  static compute_mul_parity_result
1107  compute_mul_parity(carrier_uint two_f, const cache_entry_type &cache,
1108  int beta) noexcept {
1109  FMT_ASSERT(beta >= 1, "");
1110  FMT_ASSERT(beta < 64, "");
1111 
1112  auto r = umul192_lower128(two_f, cache);
1113  return {((r.high() >> (64 - beta)) & 1) != 0,
1114  ((r.high() << beta) | (r.low() >> (64 - beta))) == 0};
1115  }
1116 
1117  static carrier_uint
1118  compute_left_endpoint_for_shorter_interval_case(const cache_entry_type &cache,
1119  int beta) noexcept {
1120  return (cache.high() -
1121  (cache.high() >> (num_significand_bits<double>() + 2))) >>
1122  (64 - num_significand_bits<double>() - 1 - beta);
1123  }
1124 
1125  static carrier_uint compute_right_endpoint_for_shorter_interval_case(
1126  const cache_entry_type &cache, int beta) noexcept {
1127  return (cache.high() +
1128  (cache.high() >> (num_significand_bits<double>() + 1))) >>
1129  (64 - num_significand_bits<double>() - 1 - beta);
1130  }
1131 
1132  static carrier_uint
1133  compute_round_up_for_shorter_interval_case(const cache_entry_type &cache,
1134  int beta) noexcept {
1135  return ((cache.high() >> (64 - num_significand_bits<double>() - 2 - beta)) +
1136  1) /
1137  2;
1138  }
1139 };
1140 
1141 FMT_FUNC uint128_fallback get_cached_power(int k) noexcept {
1142  return cache_accessor<double>::get_cached_power(k);
1143 }
1144 
1145 // Various integer checks
1146 template <class T>
1147 bool is_left_endpoint_integer_shorter_interval(int exponent) noexcept {
1148  const int case_shorter_interval_left_endpoint_lower_threshold = 2;
1149  const int case_shorter_interval_left_endpoint_upper_threshold = 3;
1150  return exponent >= case_shorter_interval_left_endpoint_lower_threshold &&
1151  exponent <= case_shorter_interval_left_endpoint_upper_threshold;
1152 }
1153 
1154 // Remove trailing zeros from n and return the number of zeros removed (float)
1155 FMT_INLINE int remove_trailing_zeros(uint32_t &n) noexcept {
1156  FMT_ASSERT(n != 0, "");
1157  // Modular inverse of 5 (mod 2^32): (mod_inv_5 * 5) mod 2^32 = 1.
1158  // See https://github.com/fmtlib/fmt/issues/3163 for more details.
1159  const uint32_t mod_inv_5 = 0xcccccccd;
1160  // Casts are needed to workaround a bug in MSVC 19.22 and older.
1161  const uint32_t mod_inv_25 =
1162  static_cast<uint32_t>(uint64_t(mod_inv_5) * mod_inv_5);
1163 
1164  int s = 0;
1165  while (true) {
1166  auto q = rotr(n * mod_inv_25, 2);
1167  if (q > max_value<uint32_t>() / 100)
1168  break;
1169  n = q;
1170  s += 2;
1171  }
1172  auto q = rotr(n * mod_inv_5, 1);
1173  if (q <= max_value<uint32_t>() / 10) {
1174  n = q;
1175  s |= 1;
1176  }
1177  return s;
1178 }
1179 
1180 // Removes trailing zeros and returns the number of zeros removed (double)
1181 FMT_INLINE int remove_trailing_zeros(uint64_t &n) noexcept {
1182  FMT_ASSERT(n != 0, "");
1183 
1184  // This magic number is ceil(2^90 / 10^8).
1185  constexpr uint64_t magic_number = 12379400392853802749ull;
1186  auto nm = umul128(n, magic_number);
1187 
1188  // Is n is divisible by 10^8?
1189  if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) {
1190  // If yes, work with the quotient.
1191  auto n32 = static_cast<uint32_t>(nm.high() >> (90 - 64));
1192 
1193  const uint32_t mod_inv_5 = 0xcccccccd;
1194  const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5;
1195 
1196  int s = 8;
1197  while (true) {
1198  auto q = rotr(n32 * mod_inv_25, 2);
1199  if (q > max_value<uint32_t>() / 100)
1200  break;
1201  n32 = q;
1202  s += 2;
1203  }
1204  auto q = rotr(n32 * mod_inv_5, 1);
1205  if (q <= max_value<uint32_t>() / 10) {
1206  n32 = q;
1207  s |= 1;
1208  }
1209 
1210  n = n32;
1211  return s;
1212  }
1213 
1214  // If n is not divisible by 10^8, work with n itself.
1215  const uint64_t mod_inv_5 = 0xcccccccccccccccd;
1216  const uint64_t mod_inv_25 = mod_inv_5 * mod_inv_5;
1217 
1218  int s = 0;
1219  while (true) {
1220  auto q = rotr(n * mod_inv_25, 2);
1221  if (q > max_value<uint64_t>() / 100)
1222  break;
1223  n = q;
1224  s += 2;
1225  }
1226  auto q = rotr(n * mod_inv_5, 1);
1227  if (q <= max_value<uint64_t>() / 10) {
1228  n = q;
1229  s |= 1;
1230  }
1231 
1232  return s;
1233 }
1234 
1235 // The main algorithm for shorter interval case
1236 template <class T>
1237 FMT_INLINE decimal_fp<T> shorter_interval_case(int exponent) noexcept {
1238  decimal_fp<T> ret_value;
1239  // Compute k and beta
1240  const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);
1241  const int beta = exponent + floor_log2_pow10(-minus_k);
1242 
1243  // Compute xi and zi
1244  using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1245  const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1246 
1247  auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(
1248  cache, beta);
1249  auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(
1250  cache, beta);
1251 
1252  // If the left endpoint is not an integer, increase it
1253  if (!is_left_endpoint_integer_shorter_interval<T>(exponent))
1254  ++xi;
1255 
1256  // Try bigger divisor
1257  ret_value.significand = zi / 10;
1258 
1259  // If succeed, remove trailing zeros if necessary and return
1260  if (ret_value.significand * 10 >= xi) {
1261  ret_value.exponent = minus_k + 1;
1262  ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1263  return ret_value;
1264  }
1265 
1266  // Otherwise, compute the round-up of y
1267  ret_value.significand =
1268  cache_accessor<T>::compute_round_up_for_shorter_interval_case(cache,
1269  beta);
1270  ret_value.exponent = minus_k;
1271 
1272  // When tie occurs, choose one of them according to the rule
1273  if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
1274  exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
1275  ret_value.significand = ret_value.significand % 2 == 0 ?
1276  ret_value.significand :
1277  ret_value.significand - 1;
1278  } else if (ret_value.significand < xi) {
1279  ++ret_value.significand;
1280  }
1281  return ret_value;
1282 }
1283 
1284 template <typename T> decimal_fp<T> to_decimal(T x) noexcept {
1285  // Step 1: integer promotion & Schubfach multiplier calculation.
1286 
1287  using carrier_uint = typename float_info<T>::carrier_uint;
1288  using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1289  auto br = bit_cast<carrier_uint>(x);
1290 
1291  // Extract significand bits and exponent bits.
1292  const carrier_uint significand_mask =
1293  (static_cast<carrier_uint>(1) << num_significand_bits<T>()) - 1;
1294  carrier_uint significand = (br & significand_mask);
1295  int exponent =
1296  static_cast<int>((br & exponent_mask<T>()) >> num_significand_bits<T>());
1297 
1298  if (exponent != 0) { // Check if normal.
1299  exponent -= exponent_bias<T>() + num_significand_bits<T>();
1300 
1301  // Shorter interval case; proceed like Schubfach.
1302  // In fact, when exponent == 1 and significand == 0, the interval is
1303  // regular. However, it can be shown that the end-results are anyway same.
1304  if (significand == 0)
1305  return shorter_interval_case<T>(exponent);
1306 
1307  significand |= (static_cast<carrier_uint>(1) << num_significand_bits<T>());
1308  } else {
1309  // Subnormal case; the interval is always regular.
1310  if (significand == 0)
1311  return {0, 0};
1312  exponent =
1313  std::numeric_limits<T>::min_exponent - num_significand_bits<T>() - 1;
1314  }
1315 
1316  const bool include_left_endpoint = (significand % 2 == 0);
1317  const bool include_right_endpoint = include_left_endpoint;
1318 
1319  // Compute k and beta.
1320  const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;
1321  const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1322  const int beta = exponent + floor_log2_pow10(-minus_k);
1323 
1324  // Compute zi and deltai.
1325  // 10^kappa <= deltai < 10^(kappa + 1)
1326  const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta);
1327  const carrier_uint two_fc = significand << 1;
1328 
1329  // For the case of binary32, the result of integer check is not correct for
1330  // 29711844 * 2^-82
1331  // = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18
1332  // and 29711844 * 2^-81
1333  // = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17,
1334  // and they are the unique counterexamples. However, since 29711844 is even,
1335  // this does not cause any problem for the endpoints calculations; it can only
1336  // cause a problem when we need to perform integer check for the center.
1337  // Fortunately, with these inputs, that branch is never executed, so we are
1338  // fine.
1339  const typename cache_accessor<T>::compute_mul_result z_mul =
1340  cache_accessor<T>::compute_mul((two_fc | 1) << beta, cache);
1341 
1342  // Step 2: Try larger divisor; remove trailing zeros if necessary.
1343 
1344  // Using an upper bound on zi, we might be able to optimize the division
1345  // better than the compiler; we are computing zi / big_divisor here.
1346  decimal_fp<T> ret_value;
1347  ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result);
1348  uint32_t r = static_cast<uint32_t>(z_mul.result - float_info<T>::big_divisor *
1349  ret_value.significand);
1350 
1351  if (r < deltai) {
1352  // Exclude the right endpoint if necessary.
1353  if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) {
1354  --ret_value.significand;
1355  r = float_info<T>::big_divisor;
1356  goto small_divisor_case_label;
1357  }
1358  } else if (r > deltai) {
1359  goto small_divisor_case_label;
1360  } else {
1361  // r == deltai; compare fractional parts.
1362  const typename cache_accessor<T>::compute_mul_parity_result x_mul =
1363  cache_accessor<T>::compute_mul_parity(two_fc - 1, cache, beta);
1364 
1365  if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint)))
1366  goto small_divisor_case_label;
1367  }
1368  ret_value.exponent = minus_k + float_info<T>::kappa + 1;
1369 
1370  // We may need to remove trailing zeros.
1371  ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1372  return ret_value;
1373 
1374  // Step 3: Find the significand with the smaller divisor.
1375 
1376 small_divisor_case_label:
1377  ret_value.significand *= 10;
1378  ret_value.exponent = minus_k + float_info<T>::kappa;
1379 
1380  uint32_t dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);
1381  const bool approx_y_parity =
1382  ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;
1383 
1384  // Is dist divisible by 10^kappa?
1385  const bool divisible_by_small_divisor =
1386  check_divisibility_and_divide_by_pow10<float_info<T>::kappa>(dist);
1387 
1388  // Add dist / 10^kappa to the significand.
1389  ret_value.significand += dist;
1390 
1391  if (!divisible_by_small_divisor)
1392  return ret_value;
1393 
1394  // Check z^(f) >= epsilon^(f).
1395  // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1,
1396  // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f).
1397  // Since there are only 2 possibilities, we only need to care about the
1398  // parity. Also, zi and r should have the same parity since the divisor
1399  // is an even number.
1400  const auto y_mul = cache_accessor<T>::compute_mul_parity(two_fc, cache, beta);
1401 
1402  // If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f),
1403  // or equivalently, when y is an integer.
1404  if (y_mul.parity != approx_y_parity)
1405  --ret_value.significand;
1406  else if (y_mul.is_integer & (ret_value.significand % 2 != 0))
1407  --ret_value.significand;
1408  return ret_value;
1409 }
1410 } // namespace dragonbox
1411 } // namespace detail
1412 
1413 template <> struct formatter<detail::bigint> {
1414  FMT_CONSTEXPR auto parse(format_parse_context &ctx)
1415  -> format_parse_context::iterator {
1416  return ctx.begin();
1417  }
1418 
1419  auto format(const detail::bigint &n, format_context &ctx) const
1420  -> format_context::iterator {
1421  auto out = ctx.out();
1422  bool first = true;
1423  for (auto i = n.bigits_.size(); i > 0; --i) {
1424  auto value = n.bigits_[i - 1u];
1425  if (first) {
1426  out = format_to(out, FMT_STRING("{:x}"), value);
1427  first = false;
1428  continue;
1429  }
1430  out = format_to(out, FMT_STRING("{:08x}"), value);
1431  }
1432  if (n.exp_ > 0)
1433  out = format_to(out, FMT_STRING("p{}"),
1434  n.exp_ * detail::bigint::bigit_bits);
1435  return out;
1436  }
1437 };
1438 
1439 FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {
1440  for_each_codepoint(s, [this](uint32_t cp, string_view) {
1441  if (cp == invalid_code_point)
1442  FMT_THROW(std::runtime_error("invalid utf8"));
1443  if (cp <= 0xFFFF) {
1444  buffer_.push_back(static_cast<wchar_t>(cp));
1445  } else {
1446  cp -= 0x10000;
1447  buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));
1448  buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));
1449  }
1450  return true;
1451  });
1452  buffer_.push_back(0);
1453 }
1454 
1455 FMT_FUNC void format_system_error(detail::buffer<char> &out, int error_code,
1456  const char *message) noexcept {
1457  FMT_TRY {
1458  auto ec = std::error_code(error_code, std::generic_category());
1459  write(std::back_inserter(out), std::system_error(ec, message).what());
1460  return;
1461  }
1462  FMT_CATCH(...) {}
1463  format_error_code(out, error_code, message);
1464 }
1465 
1466 FMT_FUNC void report_system_error(int error_code,
1467  const char *message) noexcept {
1468  report_error(format_system_error, error_code, message);
1469 }
1470 
1471 FMT_FUNC std::string vformat(string_view fmt, format_args args) {
1472  // Don't optimize the "{}" case to keep the binary size small and because it
1473  // can be better optimized in fmt::format anyway.
1474  auto buffer = memory_buffer();
1475  detail::vformat_to(buffer, fmt, args);
1476  return to_string(buffer);
1477 }
1478 
1479 namespace detail {
1480 #ifdef _WIN32
1481 using dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>;
1482 extern "C" __declspec(dllimport) int __stdcall WriteConsoleW( //
1483  void *, const void *, dword, dword *, void *);
1484 
1485 FMT_FUNC bool write_console(std::FILE *f, string_view text) {
1486  auto fd = _fileno(f);
1487  if (_isatty(fd)) {
1488  detail::utf8_to_utf16 u16(string_view(text.data(), text.size()));
1489  auto written = detail::dword();
1490  if (detail::WriteConsoleW(reinterpret_cast<void *>(_get_osfhandle(fd)),
1491  u16.c_str(), static_cast<uint32_t>(u16.size()),
1492  &written, nullptr)) {
1493  return true;
1494  }
1495  }
1496  // We return false if the file descriptor was not TTY, or it was but
1497  // SetConsoleW failed which can happen if the output has been redirected to
1498  // NUL. In both cases when we return false, we should attempt to do regular
1499  // write via fwrite or std::ostream::write.
1500  return false;
1501 }
1502 #endif
1503 
1504 FMT_FUNC void print(std::FILE *f, string_view text) {
1505 #ifdef _WIN32
1506  if (write_console(f, text))
1507  return;
1508 #endif
1509  detail::fwrite_fully(text.data(), 1, text.size(), f);
1510 }
1511 } // namespace detail
1512 
1513 FMT_FUNC void vprint(std::FILE *f, string_view format_str, format_args args) {
1515  detail::vformat_to(buffer, format_str, args);
1516  detail::print(f, {buffer.data(), buffer.size()});
1517 }
1518 
1519 #ifdef _WIN32
1520 // Print assuming legacy (non-Unicode) encoding.
1521 FMT_FUNC void detail::vprint_mojibake(std::FILE *f, string_view format_str,
1522  format_args args) {
1524  detail::vformat_to(buffer, format_str,
1525  basic_format_args<buffer_context<char>>(args));
1526  fwrite_fully(buffer.data(), 1, buffer.size(), f);
1527 }
1528 #endif
1529 
1530 FMT_FUNC void vprint(string_view format_str, format_args args) {
1531  vprint(stdout, format_str, args);
1532 }
1533 
1534 namespace detail {
1535 
1536 struct singleton {
1537  unsigned char upper;
1538  unsigned char lower_count;
1539 };
1540 
1541 inline auto is_printable(uint16_t x, const singleton *singletons,
1542  size_t singletons_size,
1543  const unsigned char *singleton_lowers,
1544  const unsigned char *normal, size_t normal_size)
1545  -> bool {
1546  auto upper = x >> 8;
1547  auto lower_start = 0;
1548  for (size_t i = 0; i < singletons_size; ++i) {
1549  auto s = singletons[i];
1550  auto lower_end = lower_start + s.lower_count;
1551  if (upper < s.upper)
1552  break;
1553  if (upper == s.upper) {
1554  for (auto j = lower_start; j < lower_end; ++j) {
1555  if (singleton_lowers[j] == (x & 0xff))
1556  return false;
1557  }
1558  }
1559  lower_start = lower_end;
1560  }
1561 
1562  auto xsigned = static_cast<int>(x);
1563  auto current = true;
1564  for (size_t i = 0; i < normal_size; ++i) {
1565  auto v = static_cast<int>(normal[i]);
1566  auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v;
1567  xsigned -= len;
1568  if (xsigned < 0)
1569  break;
1570  current = !current;
1571  }
1572  return current;
1573 }
1574 
1575 // This code is generated by support/printable.py.
1576 FMT_FUNC auto is_printable(uint32_t cp) -> bool {
1577  static constexpr singleton singletons0[] = {
1578  {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8},
1579  {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13},
1580  {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5},
1581  {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22},
1582  {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3},
1583  {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8},
1584  {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9},
1585  };
1586  static constexpr unsigned char singletons0_lower[] = {
1587  0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90,
1588  0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f,
1589  0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1,
1590  0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04,
1591  0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d,
1592  0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf,
1593  0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1594  0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d,
1595  0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d,
1596  0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d,
1597  0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5,
1598  0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7,
1599  0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49,
1600  0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7,
1601  0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7,
1602  0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e,
1603  0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16,
1604  0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e,
1605  0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f,
1606  0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf,
1607  0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0,
1608  0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27,
1609  0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91,
1610  0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7,
1611  0xfe, 0xff,
1612  };
1613  static constexpr singleton singletons1[] = {
1614  {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2},
1615  {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5},
1616  {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5},
1617  {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2},
1618  {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5},
1619  {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2},
1620  {0xfa, 2}, {0xfb, 1},
1621  };
1622  static constexpr unsigned char singletons1_lower[] = {
1623  0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07,
1624  0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36,
1625  0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87,
1626  0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1627  0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b,
1628  0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9,
1629  0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
1630  0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27,
1631  0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc,
1632  0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7,
1633  0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6,
1634  0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c,
1635  0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
1636  0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0,
1637  0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93,
1638  };
1639  static constexpr unsigned char normal0[] = {
1640  0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04,
1641  0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0,
1642  0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01,
1643  0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03,
1644  0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03,
1645  0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a,
1646  0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15,
1647  0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f,
1648  0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80,
1649  0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07,
1650  0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06,
1651  0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04,
1652  0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac,
1653  0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c,
1654  0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11,
1655  0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c,
1656  0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b,
1657  0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6,
1658  0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03,
1659  0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80,
1660  0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06,
1661  0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c,
1662  0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17,
1663  0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80,
1664  0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80,
1665  0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d,
1666  };
1667  static constexpr unsigned char normal1[] = {
1668  0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f,
1669  0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e,
1670  0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04,
1671  0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09,
1672  0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16,
1673  0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f,
1674  0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36,
1675  0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33,
1676  0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08,
1677  0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e,
1678  0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41,
1679  0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03,
1680  0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22,
1681  0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04,
1682  0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45,
1683  0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03,
1684  0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81,
1685  0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75,
1686  0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1,
1687  0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a,
1688  0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11,
1689  0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09,
1690  0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89,
1691  0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6,
1692  0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09,
1693  0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50,
1694  0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05,
1695  0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83,
1696  0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05,
1697  0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80,
1698  0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80,
1699  0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07,
1700  0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e,
1701  0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07,
1702  0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06,
1703  };
1704  auto lower = static_cast<uint16_t>(cp);
1705  if (cp < 0x10000) {
1706  return is_printable(lower, singletons0,
1707  sizeof(singletons0) / sizeof(*singletons0),
1708  singletons0_lower, normal0, sizeof(normal0));
1709  }
1710  if (cp < 0x20000) {
1711  return is_printable(lower, singletons1,
1712  sizeof(singletons1) / sizeof(*singletons1),
1713  singletons1_lower, normal1, sizeof(normal1));
1714  }
1715  if (0x2a6de <= cp && cp < 0x2a700)
1716  return false;
1717  if (0x2b735 <= cp && cp < 0x2b740)
1718  return false;
1719  if (0x2b81e <= cp && cp < 0x2b820)
1720  return false;
1721  if (0x2cea2 <= cp && cp < 0x2ceb0)
1722  return false;
1723  if (0x2ebe1 <= cp && cp < 0x2f800)
1724  return false;
1725  if (0x2fa1e <= cp && cp < 0x30000)
1726  return false;
1727  if (0x3134b <= cp && cp < 0xe0100)
1728  return false;
1729  if (0xe01f0 <= cp && cp < 0x110000)
1730  return false;
1731  return cp < 0x110000;
1732 }
1733 
1734 } // namespace detail
1735 
1736 FMT_END_NAMESPACE
1737 
1738 #endif // FMT_FORMAT_INL_H_
Definition: core.h:1975
Definition: core.h:688
Definition: format.h:907
constexpr auto size() const noexcept -> size_t
Definition: core.h:480
constexpr auto data() const noexcept -> const Char *
Definition: core.h:477
Definition: core.h:899
FMT_CONSTEXPR auto data() noexcept -> T *
Definition: core.h:945
constexpr auto size() const noexcept -> size_t
Definition: core.h:939
Definition: format.h:1041
constexpr int parity(int la, int lb, int k)
Parity rule. Returns 1 only if la+lb+k is even.
Definition: Wigner369j.hpp:125