From b16aeb6756bdab08cdf12d40baab5b51f7d15b16 Mon Sep 17 00:00:00 2001
From: Abseil Team <absl-team@google.com>
Date: Mon, 7 Jan 2019 09:01:16 -0800
Subject: [PATCH] Export of internal Abseil changes. --
 5f1cf6547231f1b1daad6d1b785df6b0b999b3c9 by Samuel Benzaquen
 <sbenza@google.com>:

Fix uninitialized member in the `iterator` class by using a union of the two
possible states of the iterator.
This silences a Wuninitialized warning in gcc>=7.

PiperOrigin-RevId: 228175148

--
98b4e3204c0ec3cfd4cb037e24d443ea4b63fc84 by CJ Johnson <johnsoncj@google.com>:

Factors out the implementation of InlinedVector::swap(...) into a private member function

PiperOrigin-RevId: 228173383

--
f1432ad3a8b05285c6d55bc4754cfae765485b7f by Abseil Team <absl-team@google.com>:

Import of CCTZ from GitHub.

PiperOrigin-RevId: 227891984

--
03fc00c7a4efc6000e6d9125cb2e252bffda76fe by Andy Getzendanner <durandal@google.com>:

Add a missing linebreak to a comment and markdownify two unordered lists.

PiperOrigin-RevId: 227861389

--
0d66c9afba4fc9aa52e61d9fb410e165018a7b48 by Abseil Team <absl-team@google.com>:

Add an API to register a new source for the cycle clock.

PiperOrigin-RevId: 227779218

--
14d3f9b70c8818b8541e5fb2f6ca4c59d479de31 by Andy Getzendanner <durandal@google.com>:

Correct a typo in a stripping marker.

PiperOrigin-RevId: 227750014

--
59df88740f4e315beb57a8772f8bcf7879440c74 by Matt Kulukundis <kfm@google.com>:

Switch thread local handling to be more cross platform

PiperOrigin-RevId: 227695133

--
75deed5bfcb5c42534e933f104aa7d94e11e348d by Abseil Team <absl-team@google.com>:

Rollback workaround toolchain bug for incorrect handling of thread_local in inline
functions

PiperOrigin-RevId: 227689133

--
54994bf0afec026e6e0e7a199df0bbb4b7d9a4aa by Derek Mauro <dmauro@google.com>:

Add -pthread to linkopts where it actually belongs, on the library
that uses it.
Fixes https://github.com/abseil/abseil-cpp/issues/240.

PiperOrigin-RevId: 227612492

--
893875f3536b7e0a1bad993aa6b2e083abb3b25a by Derek Mauro <dmauro@google.com>:

Internal change

PiperOrigin-RevId: 227582833

--
506c9b8e9002ca3389c7040473b68d4cbf94bdcc by Matt Kulukundis <kfm@google.com>:

Workaround toolchain bug for incorrect handling of thread_local in inline
functions

PiperOrigin-RevId: 227561449

--
29ee90d96dfe3114cf93f9bb92ea0cc9e768a407 by Derek Mauro <dmauro@google.com>:

Internal change

PiperOrigin-RevId: 227054634
GitOrigin-RevId: 5f1cf6547231f1b1daad6d1b785df6b0b999b3c9
Change-Id: Ibc90566d92ee6e0ad7e150f513ec7f5d22ec0a94
---
 absl/UPGRADES.md => UPGRADES.md               |   0
 absl/base/BUILD.bazel                         |  16 +-
 absl/base/internal/cycleclock.cc              |  12 +-
 absl/base/internal/cycleclock.h               |  14 ++
 absl/base/internal/per_thread_tls.h           |  12 +-
 absl/container/BUILD.bazel                    |  11 ++
 absl/container/CMakeLists.txt                 |  11 ++
 absl/container/inlined_vector.h               | 151 +++++++++---------
 absl/container/inlined_vector_test.cc         |  53 +-----
 absl/container/internal/counting_allocator.h  |  79 +++++++++
 absl/container/internal/hashtablez_sampler.cc |   4 +
 absl/container/internal/hashtablez_sampler.h  |  11 +-
 absl/container/internal/raw_hash_set.h        |   6 +-
 absl/copts/copts.py                           |   2 -
 absl/synchronization/BUILD.bazel              |   8 +-
 absl/time/internal/cctz/BUILD.bazel           |   2 +-
 .../cctz/src/time_zone_format_test.cc         |  17 +-
 .../cctz/src/time_zone_lookup_test.cc         |   2 +
 absl/time/internal/cctz/testdata/version      |   2 +-
 .../cctz/testdata/zoneinfo/Africa/Sao_Tome    | Bin 225 -> 254 bytes
 .../cctz/testdata/zoneinfo/America/Metlakatla | Bin 1409 -> 1409 bytes
 .../cctz/testdata/zoneinfo/Asia/Hong_Kong     | Bin 1175 -> 1191 bytes
 .../cctz/testdata/zoneinfo/Asia/Qostanay      | Bin 0 -> 1033 bytes
 .../cctz/testdata/zoneinfo/Asia/Qyzylorda     | Bin 1017 -> 1047 bytes
 .../cctz/testdata/zoneinfo/Asia/Tehran        | Bin 1704 -> 2610 bytes
 .../internal/cctz/testdata/zoneinfo/Hongkong  | Bin 1175 -> 1191 bytes
 .../time/internal/cctz/testdata/zoneinfo/Iran | Bin 1704 -> 2610 bytes
 .../internal/cctz/testdata/zoneinfo/Kwajalein | Bin 250 -> 340 bytes
 .../cctz/testdata/zoneinfo/Pacific/Chuuk      | Bin 174 -> 287 bytes
 .../cctz/testdata/zoneinfo/Pacific/Guam       | Bin 216 -> 516 bytes
 .../cctz/testdata/zoneinfo/Pacific/Kosrae     | Bin 242 -> 377 bytes
 .../cctz/testdata/zoneinfo/Pacific/Kwajalein  | Bin 250 -> 340 bytes
 .../cctz/testdata/zoneinfo/Pacific/Majuro     | Bin 212 -> 330 bytes
 .../cctz/testdata/zoneinfo/Pacific/Nauru      | Bin 268 -> 268 bytes
 .../cctz/testdata/zoneinfo/Pacific/Palau      | Bin 173 -> 190 bytes
 .../cctz/testdata/zoneinfo/Pacific/Pohnpei    | Bin 174 -> 325 bytes
 .../cctz/testdata/zoneinfo/Pacific/Ponape     | Bin 174 -> 325 bytes
 .../cctz/testdata/zoneinfo/Pacific/Saipan     | Bin 216 -> 516 bytes
 .../cctz/testdata/zoneinfo/Pacific/Truk       | Bin 174 -> 287 bytes
 .../cctz/testdata/zoneinfo/Pacific/Yap        | Bin 174 -> 287 bytes
 .../cctz/testdata/zoneinfo/zone1970.tab       |   1 +
 41 files changed, 253 insertions(+), 161 deletions(-)
 rename absl/UPGRADES.md => UPGRADES.md (100%)
 create mode 100644 absl/container/internal/counting_allocator.h
 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qostanay

diff --git a/absl/UPGRADES.md b/UPGRADES.md
similarity index 100%
rename from absl/UPGRADES.md
rename to UPGRADES.md
diff --git a/absl/base/BUILD.bazel b/absl/base/BUILD.bazel
index 2717df0c..49ae1824 100644
--- a/absl/base/BUILD.bazel
+++ b/absl/base/BUILD.bazel
@@ -89,6 +89,10 @@ cc_library(
         "internal/low_level_alloc.h",
     ],
     copts = ABSL_DEFAULT_COPTS,
+    linkopts = select({
+        "//absl:windows": [],
+        "//conditions:default": ["-pthread"],
+    }),
     visibility = [
         "//absl:__subpackages__",
     ],
@@ -142,6 +146,10 @@ cc_library(
         "log_severity.h",
     ],
     copts = ABSL_DEFAULT_COPTS,
+    linkopts = select({
+        "//absl:windows": [],
+        "//conditions:default": ["-pthread"],
+    }),
     deps = [
         ":base_internal",
         ":config",
@@ -423,10 +431,6 @@ cc_test(
     size = "small",
     srcs = ["internal/low_level_alloc_test.cc"],
     copts = ABSL_TEST_COPTS,
-    linkopts = select({
-        "//absl:windows": [],
-        "//conditions:default": ["-pthread"],
-    }),
     tags = ["no_test_ios_x86_64"],
     deps = [":malloc_internal"],
 )
@@ -436,10 +440,6 @@ cc_test(
     size = "small",
     srcs = ["internal/thread_identity_test.cc"],
     copts = ABSL_TEST_COPTS,
-    linkopts = select({
-        "//absl:windows": [],
-        "//conditions:default": ["-pthread"],
-    }),
     tags = [
         "no_test_wasm",
     ],
diff --git a/absl/base/internal/cycleclock.cc b/absl/base/internal/cycleclock.cc
index a742df01..9eb13b8c 100644
--- a/absl/base/internal/cycleclock.cc
+++ b/absl/base/internal/cycleclock.cc
@@ -22,6 +22,7 @@
 
 #include "absl/base/internal/cycleclock.h"
 
+#include <atomic>
 #include <chrono>  // NOLINT(build/c++11)
 
 #include "absl/base/internal/unscaledcycleclock.h"
@@ -52,17 +53,26 @@ static constexpr int32_t kShift = 2;
 #endif
 
 static constexpr double kFrequencyScale = 1.0 / (1 << kShift);
+static std::atomic<CycleClockSourceFunc> cycle_clock_source;
 
 }  // namespace
 
 int64_t CycleClock::Now() {
-  return base_internal::UnscaledCycleClock::Now() >> kShift;
+  auto fn = cycle_clock_source.load(std::memory_order_relaxed);
+  if (fn == nullptr) {
+    return base_internal::UnscaledCycleClock::Now() >> kShift;
+  }
+  return fn() >> kShift;
 }
 
 double CycleClock::Frequency() {
   return kFrequencyScale * base_internal::UnscaledCycleClock::Frequency();
 }
 
+void CycleClockSource::Register(CycleClockSourceFunc source) {
+  cycle_clock_source.store(source, std::memory_order_relaxed);
+}
+
 #else
 
 int64_t CycleClock::Now() {
diff --git a/absl/base/internal/cycleclock.h b/absl/base/internal/cycleclock.h
index 60e97158..9853a66c 100644
--- a/absl/base/internal/cycleclock.h
+++ b/absl/base/internal/cycleclock.h
@@ -71,6 +71,20 @@ class CycleClock {
   CycleClock& operator=(const CycleClock&) = delete;
 };
 
+using CycleClockSourceFunc = int64_t (*)();
+
+class CycleClockSource {
+ private:
+  // CycleClockSource::Register()
+  //
+  // Register a function that provides an alternate source for the unscaled CPU
+  // cycle count value. The source function must be async signal safe, must not
+  // call CycleClock::Now(), and must have a frequency that matches that of the
+  // unscaled clock used by CycleClock. A nullptr value resets CycleClock to use
+  // the default source.
+  static void Register(CycleClockSourceFunc source);
+};
+
 }  // namespace base_internal
 }  // namespace absl
 
diff --git a/absl/base/internal/per_thread_tls.h b/absl/base/internal/per_thread_tls.h
index 2428bdc1..56359853 100644
--- a/absl/base/internal/per_thread_tls.h
+++ b/absl/base/internal/per_thread_tls.h
@@ -16,13 +16,17 @@
 #define ABSL_BASE_INTERNAL_PER_THREAD_TLS_H_
 
 // This header defines two macros:
+//
 // If the platform supports thread-local storage:
-//   ABSL_PER_THREAD_TLS_KEYWORD is the C keyword needed to declare a
-//   thread-local variable ABSL_PER_THREAD_TLS is 1
+//
+// * ABSL_PER_THREAD_TLS_KEYWORD is the C keyword needed to declare a
+//   thread-local variable
+// * ABSL_PER_THREAD_TLS is 1
 //
 // Otherwise:
-//   ABSL_PER_THREAD_TLS_KEYWORD is empty
-//   ABSL_PER_THREAD_TLS is 0
+//
+// * ABSL_PER_THREAD_TLS_KEYWORD is empty
+// * ABSL_PER_THREAD_TLS is 0
 //
 // Microsoft C supports thread-local storage.
 // GCC supports it if the appropriate version of glibc is available,
diff --git a/absl/container/BUILD.bazel b/absl/container/BUILD.bazel
index e1880a8b..623faf45 100644
--- a/absl/container/BUILD.bazel
+++ b/absl/container/BUILD.bazel
@@ -123,12 +123,21 @@ cc_library(
     ],
 )
 
+cc_library(
+    name = "counting_allocator",
+    testonly = 1,
+    hdrs = ["internal/counting_allocator.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    visibility = ["//visibility:private"],
+)
+
 cc_test(
     name = "inlined_vector_test",
     srcs = ["inlined_vector_test.cc"],
     copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG,
     linkopts = ABSL_EXCEPTIONS_FLAG_LINKOPTS,
     deps = [
+        ":counting_allocator",
         ":inlined_vector",
         ":test_instance_tracker",
         "//absl/base",
@@ -146,6 +155,7 @@ cc_test(
     srcs = ["inlined_vector_test.cc"],
     copts = ABSL_TEST_COPTS,
     deps = [
+        ":counting_allocator",
         ":inlined_vector",
         ":test_instance_tracker",
         "//absl/base",
@@ -443,6 +453,7 @@ cc_library(
     copts = ABSL_DEFAULT_COPTS,
     deps = [
         ":have_sse",
+        "//absl/base",
         "//absl/base:core_headers",
         "//absl/debugging:stacktrace",
         "//absl/memory",
diff --git a/absl/container/CMakeLists.txt b/absl/container/CMakeLists.txt
index 4162d269..de9b22f7 100644
--- a/absl/container/CMakeLists.txt
+++ b/absl/container/CMakeLists.txt
@@ -122,6 +122,15 @@ absl_cc_library(
   PUBLIC
 )
 
+absl_cc_library(
+  NAME
+    counting_allocator
+  HDRS
+    "internal/counting_allocator.h"
+  COPTS
+    ${ABSL_DEFAULT_COPTS}
+)
+
 absl_cc_test(
   NAME
     inlined_vector_test
@@ -132,6 +141,7 @@ absl_cc_test(
   LINKOPTS
     ${ABSL_EXCEPTIONS_FLAG_LINKOPTS}
   DEPS
+    absl::counting_allocator
     absl::inlined_vector
     absl::test_instance_tracker
     absl::base
@@ -437,6 +447,7 @@ absl_cc_library(
   COPTS
     ${ABSL_DEFAULT_COPTS}
   DEPS
+    absl::base
     absl::have_sse
     absl::synchronization
 )
diff --git a/absl/container/inlined_vector.h b/absl/container/inlined_vector.h
index fe228001..b6063441 100644
--- a/absl/container/inlined_vector.h
+++ b/absl/container/inlined_vector.h
@@ -795,79 +795,7 @@ class InlinedVector {
   void swap(InlinedVector& other) {
     if (ABSL_PREDICT_FALSE(this == &other)) return;
 
-    using std::swap;  // Augment ADL with `std::swap`.
-    if (allocated() && other.allocated()) {
-      // Both out of line, so just swap the tag, allocation, and allocator.
-      swap(tag(), other.tag());
-      swap(allocation(), other.allocation());
-      swap(allocator(), other.allocator());
-      return;
-    }
-    if (!allocated() && !other.allocated()) {
-      // Both inlined: swap up to smaller size, then move remaining elements.
-      InlinedVector* a = this;
-      InlinedVector* b = &other;
-      if (size() < other.size()) {
-        swap(a, b);
-      }
-
-      const size_type a_size = a->size();
-      const size_type b_size = b->size();
-      assert(a_size >= b_size);
-      // `a` is larger. Swap the elements up to the smaller array size.
-      std::swap_ranges(a->inlined_space(), a->inlined_space() + b_size,
-                       b->inlined_space());
-
-      // Move the remaining elements:
-      //   [`b_size`, `a_size`) from `a` -> [`b_size`, `a_size`) from `b`
-      b->UninitializedCopy(a->inlined_space() + b_size,
-                           a->inlined_space() + a_size,
-                           b->inlined_space() + b_size);
-      a->Destroy(a->inlined_space() + b_size, a->inlined_space() + a_size);
-
-      swap(a->tag(), b->tag());
-      swap(a->allocator(), b->allocator());
-      assert(b->size() == a_size);
-      assert(a->size() == b_size);
-      return;
-    }
-
-    // One is out of line, one is inline.
-    // We first move the elements from the inlined vector into the
-    // inlined space in the other vector.  We then put the other vector's
-    // pointer/capacity into the originally inlined vector and swap
-    // the tags.
-    InlinedVector* a = this;
-    InlinedVector* b = &other;
-    if (a->allocated()) {
-      swap(a, b);
-    }
-    assert(!a->allocated());
-    assert(b->allocated());
-    const size_type a_size = a->size();
-    const size_type b_size = b->size();
-    // In an optimized build, `b_size` would be unused.
-    static_cast<void>(b_size);
-
-    // Made Local copies of `size()`, don't need `tag()` accurate anymore
-    swap(a->tag(), b->tag());
-
-    // Copy `b_allocation` out before `b`'s union gets clobbered by
-    // `inline_space`
-    Allocation b_allocation = b->allocation();
-
-    b->UninitializedCopy(a->inlined_space(), a->inlined_space() + a_size,
-                         b->inlined_space());
-    a->Destroy(a->inlined_space(), a->inlined_space() + a_size);
-
-    a->allocation() = b_allocation;
-
-    if (a->allocator() != b->allocator()) {
-      swap(a->allocator(), b->allocator());
-    }
-
-    assert(b->size() == a_size);
-    assert(a->size() == b_size);
+    SwapImpl(other);
   }
 
  private:
@@ -1238,6 +1166,83 @@ class InlinedVector {
     return begin() + index;
   }
 
+  void SwapImpl(InlinedVector& other) {
+    using std::swap;  // Augment ADL with `std::swap`.
+
+    if (allocated() && other.allocated()) {
+      // Both out of line, so just swap the tag, allocation, and allocator.
+      swap(tag(), other.tag());
+      swap(allocation(), other.allocation());
+      swap(allocator(), other.allocator());
+      return;
+    }
+    if (!allocated() && !other.allocated()) {
+      // Both inlined: swap up to smaller size, then move remaining elements.
+      InlinedVector* a = this;
+      InlinedVector* b = &other;
+      if (size() < other.size()) {
+        swap(a, b);
+      }
+
+      const size_type a_size = a->size();
+      const size_type b_size = b->size();
+      assert(a_size >= b_size);
+      // `a` is larger. Swap the elements up to the smaller array size.
+      std::swap_ranges(a->inlined_space(), a->inlined_space() + b_size,
+                       b->inlined_space());
+
+      // Move the remaining elements:
+      //   [`b_size`, `a_size`) from `a` -> [`b_size`, `a_size`) from `b`
+      b->UninitializedCopy(a->inlined_space() + b_size,
+                           a->inlined_space() + a_size,
+                           b->inlined_space() + b_size);
+      a->Destroy(a->inlined_space() + b_size, a->inlined_space() + a_size);
+
+      swap(a->tag(), b->tag());
+      swap(a->allocator(), b->allocator());
+      assert(b->size() == a_size);
+      assert(a->size() == b_size);
+      return;
+    }
+
+    // One is out of line, one is inline.
+    // We first move the elements from the inlined vector into the
+    // inlined space in the other vector.  We then put the other vector's
+    // pointer/capacity into the originally inlined vector and swap
+    // the tags.
+    InlinedVector* a = this;
+    InlinedVector* b = &other;
+    if (a->allocated()) {
+      swap(a, b);
+    }
+    assert(!a->allocated());
+    assert(b->allocated());
+    const size_type a_size = a->size();
+    const size_type b_size = b->size();
+    // In an optimized build, `b_size` would be unused.
+    static_cast<void>(b_size);
+
+    // Made Local copies of `size()`, don't need `tag()` accurate anymore
+    swap(a->tag(), b->tag());
+
+    // Copy `b_allocation` out before `b`'s union gets clobbered by
+    // `inline_space`
+    Allocation b_allocation = b->allocation();
+
+    b->UninitializedCopy(a->inlined_space(), a->inlined_space() + a_size,
+                         b->inlined_space());
+    a->Destroy(a->inlined_space(), a->inlined_space() + a_size);
+
+    a->allocation() = b_allocation;
+
+    if (a->allocator() != b->allocator()) {
+      swap(a->allocator(), b->allocator());
+    }
+
+    assert(b->size() == a_size);
+    assert(a->size() == b_size);
+  }
+
   // Stores either the inlined or allocated representation
   union Rep {
     using ValueTypeBuffer =
diff --git a/absl/container/inlined_vector_test.cc b/absl/container/inlined_vector_test.cc
index 3a1ea8ac..b3dcc7f0 100644
--- a/absl/container/inlined_vector_test.cc
+++ b/absl/container/inlined_vector_test.cc
@@ -30,6 +30,7 @@
 #include "absl/base/internal/exception_testing.h"
 #include "absl/base/internal/raw_logging.h"
 #include "absl/base/macros.h"
+#include "absl/container/internal/counting_allocator.h"
 #include "absl/container/internal/test_instance_tracker.h"
 #include "absl/hash/hash_testing.h"
 #include "absl/memory/memory.h"
@@ -37,6 +38,7 @@
 
 namespace {
 
+using absl::container_internal::CountingAllocator;
 using absl::test_internal::CopyableMovableInstance;
 using absl::test_internal::CopyableOnlyInstance;
 using absl::test_internal::InstanceTracker;
@@ -138,57 +140,6 @@ static IntVec Fill(int len, int offset = 0) {
   return v;
 }
 
-// This is a stateful allocator, but the state lives outside of the
-// allocator (in whatever test is using the allocator). This is odd
-// but helps in tests where the allocator is propagated into nested
-// containers - that chain of allocators uses the same state and is
-// thus easier to query for aggregate allocation information.
-template <typename T>
-class CountingAllocator : public std::allocator<T> {
- public:
-  using Alloc = std::allocator<T>;
-  using pointer = typename Alloc::pointer;
-  using size_type = typename Alloc::size_type;
-
-  CountingAllocator() : bytes_used_(nullptr) {}
-  explicit CountingAllocator(int64_t* b) : bytes_used_(b) {}
-
-  template <typename U>
-  CountingAllocator(const CountingAllocator<U>& x)
-      : Alloc(x), bytes_used_(x.bytes_used_) {}
-
-  pointer allocate(size_type n,
-                   std::allocator<void>::const_pointer hint = nullptr) {
-    assert(bytes_used_ != nullptr);
-    *bytes_used_ += n * sizeof(T);
-    return Alloc::allocate(n, hint);
-  }
-
-  void deallocate(pointer p, size_type n) {
-    Alloc::deallocate(p, n);
-    assert(bytes_used_ != nullptr);
-    *bytes_used_ -= n * sizeof(T);
-  }
-
-  template<typename U>
-  class rebind {
-   public:
-    using other = CountingAllocator<U>;
-  };
-
-  friend bool operator==(const CountingAllocator& a,
-                         const CountingAllocator& b) {
-    return a.bytes_used_ == b.bytes_used_;
-  }
-
-  friend bool operator!=(const CountingAllocator& a,
-                         const CountingAllocator& b) {
-    return !(a == b);
-  }
-
-  int64_t* bytes_used_;
-};
-
 TEST(IntVec, SimpleOps) {
   for (int len = 0; len < 20; len++) {
     IntVec v;
diff --git a/absl/container/internal/counting_allocator.h b/absl/container/internal/counting_allocator.h
new file mode 100644
index 00000000..f4e652d9
--- /dev/null
+++ b/absl/container/internal/counting_allocator.h
@@ -0,0 +1,79 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_CONTAINER_INTERNAL_COUNTING_ALLOCATOR_H_
+#define ABSL_CONTAINER_INTERNAL_COUNTING_ALLOCATOR_H_
+
+#include <cassert>
+#include <cstdint>
+#include <memory>
+
+namespace absl {
+namespace container_internal {
+
+// This is a stateful allocator, but the state lives outside of the
+// allocator (in whatever test is using the allocator). This is odd
+// but helps in tests where the allocator is propagated into nested
+// containers - that chain of allocators uses the same state and is
+// thus easier to query for aggregate allocation information.
+template <typename T>
+class CountingAllocator : public std::allocator<T> {
+ public:
+  using Alloc = std::allocator<T>;
+  using pointer = typename Alloc::pointer;
+  using size_type = typename Alloc::size_type;
+
+  CountingAllocator() : bytes_used_(nullptr) {}
+  explicit CountingAllocator(int64_t* b) : bytes_used_(b) {}
+
+  template <typename U>
+  CountingAllocator(const CountingAllocator<U>& x)
+      : Alloc(x), bytes_used_(x.bytes_used_) {}
+
+  pointer allocate(size_type n,
+                   std::allocator<void>::const_pointer hint = nullptr) {
+    assert(bytes_used_ != nullptr);
+    *bytes_used_ += n * sizeof(T);
+    return Alloc::allocate(n, hint);
+  }
+
+  void deallocate(pointer p, size_type n) {
+    Alloc::deallocate(p, n);
+    assert(bytes_used_ != nullptr);
+    *bytes_used_ -= n * sizeof(T);
+  }
+
+  template<typename U>
+  class rebind {
+   public:
+    using other = CountingAllocator<U>;
+  };
+
+  friend bool operator==(const CountingAllocator& a,
+                         const CountingAllocator& b) {
+    return a.bytes_used_ == b.bytes_used_;
+  }
+
+  friend bool operator!=(const CountingAllocator& a,
+                         const CountingAllocator& b) {
+    return !(a == b);
+  }
+
+  int64_t* bytes_used_;
+};
+
+}  // namespace container_internal
+}  // namespace absl
+
+#endif  // ABSL_CONTAINER_INTERNAL_COUNTING_ALLOCATOR_H_
diff --git a/absl/container/internal/hashtablez_sampler.cc b/absl/container/internal/hashtablez_sampler.cc
index 6cc10c20..e588f24c 100644
--- a/absl/container/internal/hashtablez_sampler.cc
+++ b/absl/container/internal/hashtablez_sampler.cc
@@ -238,6 +238,10 @@ HashtablezInfo* SampleSlow(int64_t* next_sample) {
   return HashtablezSampler::Global().Register();
 }
 
+#if ABSL_PER_THREAD_TLS == 1
+ABSL_PER_THREAD_TLS_KEYWORD int64_t next_sample = 0;
+#endif  // ABSL_PER_THREAD_TLS == 1
+
 void UnsampleSlow(HashtablezInfo* info) {
   HashtablezSampler::Global().Unregister(info);
 }
diff --git a/absl/container/internal/hashtablez_sampler.h b/absl/container/internal/hashtablez_sampler.h
index 4aea3ffa..c42f1842 100644
--- a/absl/container/internal/hashtablez_sampler.h
+++ b/absl/container/internal/hashtablez_sampler.h
@@ -31,6 +31,7 @@
 #include <memory>
 #include <vector>
 
+#include "absl/base/internal/per_thread_tls.h"
 #include "absl/base/optimization.h"
 #include "absl/synchronization/mutex.h"
 #include "absl/utility/utility.h"
@@ -147,14 +148,16 @@ class HashtablezInfoHandle {
 
 // Returns an RAII sampling handle that manages registration and unregistation
 // with the global sampler.
+#if ABSL_PER_THREAD_TLS == 1
+extern ABSL_PER_THREAD_TLS_KEYWORD int64_t next_sample;
+#endif  // ABSL_PER_THREAD_TLS
+
 inline HashtablezInfoHandle Sample() {
-#if ABSL_HAVE_THREAD_LOCAL
-  thread_local int64_t next_sample = 0;
-#else   // ABSL_HAVE_THREAD_LOCAL
+#if ABSL_PER_THREAD_TLS == 0
   static auto* mu = new absl::Mutex;
   static int64_t next_sample = 0;
   absl::MutexLock l(mu);
-#endif  // ABSL_HAVE_THREAD_LOCAL
+#endif  // !ABSL_HAVE_THREAD_LOCAL
 
   if (ABSL_PREDICT_TRUE(--next_sample > 0)) {
     return HashtablezInfoHandle(nullptr);
diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h
index 34d69d7a..8cdea4ec 100644
--- a/absl/container/internal/raw_hash_set.h
+++ b/absl/container/internal/raw_hash_set.h
@@ -785,7 +785,11 @@ class raw_hash_set {
     }
 
     ctrl_t* ctrl_ = nullptr;
-    slot_type* slot_;
+    // To avoid uninitialized member warnigs, put slot_ in an anonymous union.
+    // The member is not initialized on singleton and end iterators.
+    union {
+      slot_type* slot_;
+    };
   };
 
   class const_iterator {
diff --git a/absl/copts/copts.py b/absl/copts/copts.py
index 40a8062f..4da8442d 100644
--- a/absl/copts/copts.py
+++ b/absl/copts/copts.py
@@ -10,8 +10,6 @@ compilation options:
 The generated copts are consumed by configure_copts.bzl and
 AbseilConfigureCopts.cmake.
 """
-
-import collections  # absl:google-only(used for internal flags)
 COPT_VARS = {
     "GCC_FLAGS": [
         "-Wall",
diff --git a/absl/synchronization/BUILD.bazel b/absl/synchronization/BUILD.bazel
index 53e79884..43680046 100644
--- a/absl/synchronization/BUILD.bazel
+++ b/absl/synchronization/BUILD.bazel
@@ -69,6 +69,10 @@ cc_library(
         "notification.h",
     ],
     copts = ABSL_DEFAULT_COPTS,
+    linkopts = select({
+        "//absl:windows": [],
+        "//conditions:default": ["-pthread"],
+    }),
     deps = [
         ":graphcycles_internal",
         "//absl/base",
@@ -245,10 +249,6 @@ cc_test(
         "lifetime_test.cc",
     ],
     copts = ABSL_TEST_COPTS,
-    linkopts = select({
-        "//absl:windows": [],
-        "//conditions:default": ["-pthread"],
-    }),
     tags = ["no_test_ios_x86_64"],
     deps = [
         ":synchronization",
diff --git a/absl/time/internal/cctz/BUILD.bazel b/absl/time/internal/cctz/BUILD.bazel
index e2cfe801..a2053c97 100644
--- a/absl/time/internal/cctz/BUILD.bazel
+++ b/absl/time/internal/cctz/BUILD.bazel
@@ -98,13 +98,13 @@ cc_test(
 cc_test(
     name = "time_zone_lookup_test",
     size = "small",
+    timeout = "moderate",
     srcs = ["src/time_zone_lookup_test.cc"],
     data = [":zoneinfo"],
     tags = [
         "no_test_android_arm",
         "no_test_android_arm64",
         "no_test_android_x86",
-        "no_test_wasm",
     ],
     deps = [
         ":civil_time",
diff --git a/absl/time/internal/cctz/src/time_zone_format_test.cc b/absl/time/internal/cctz/src/time_zone_format_test.cc
index cd0ae23f..b99e1c63 100644
--- a/absl/time/internal/cctz/src/time_zone_format_test.cc
+++ b/absl/time/internal/cctz/src/time_zone_format_test.cc
@@ -64,17 +64,6 @@ void TestFormatSpecifier(time_point<D> tp, time_zone tz, const std::string& fmt,
   EXPECT_EQ("xxx " + ans + " yyy", format("xxx " + fmt + " yyy", tp, tz));
 }
 
-// These tests sometimes run on platforms that have zoneinfo data so old
-// that the transition we are attempting to check does not exist, most
-// notably Android emulators.  Fortunately, AndroidZoneInfoSource supports
-// time_zone::version() so, in cases where we've learned that it matters,
-// we can make the check conditionally.
-int VersionCmp(time_zone tz, const std::string& target) {
-  std::string version = tz.version();
-  if (version.empty() && !target.empty()) return 1;  // unknown > known
-  return version.compare(target);
-}
-
 }  // namespace
 
 //
@@ -174,7 +163,9 @@ TEST(Format, PosixConversions) {
   TestFormatSpecifier(tp, tz, "%M", "00");
   TestFormatSpecifier(tp, tz, "%S", "00");
   TestFormatSpecifier(tp, tz, "%U", "00");
+#if !defined(__EMSCRIPTEN__)
   TestFormatSpecifier(tp, tz, "%w", "4");  // 4=Thursday
+#endif
   TestFormatSpecifier(tp, tz, "%W", "00");
   TestFormatSpecifier(tp, tz, "%y", "70");
   TestFormatSpecifier(tp, tz, "%Y", "1970");
@@ -1464,6 +1455,10 @@ TEST(FormatParse, RoundTrip) {
 #if defined(_WIN32) || defined(_WIN64)
   // Initial investigations indicate the %c does not roundtrip on Windows.
   // TODO: Figure out what is going on here (perhaps a locale problem).
+#elif defined(__EMSCRIPTEN__)
+  // strftime() and strptime() use different defintions for "%c" under
+  // emscripten (see https://github.com/kripken/emscripten/pull/7491),
+  // causing its round-trip test to fail.
 #else
   // Even though we don't know what %c will produce, it should roundtrip,
   // but only in the 0-offset timezone.
diff --git a/absl/time/internal/cctz/src/time_zone_lookup_test.cc b/absl/time/internal/cctz/src/time_zone_lookup_test.cc
index e84b9469..e9865659 100644
--- a/absl/time/internal/cctz/src/time_zone_lookup_test.cc
+++ b/absl/time/internal/cctz/src/time_zone_lookup_test.cc
@@ -666,6 +666,7 @@ int VersionCmp(time_zone tz, const std::string& target) {
 
 }  // namespace
 
+#if !defined(__EMSCRIPTEN__)
 TEST(TimeZones, LoadZonesConcurrently) {
   std::promise<void> ready_promise;
   std::shared_future<void> ready_future(ready_promise.get_future());
@@ -713,6 +714,7 @@ TEST(TimeZones, LoadZonesConcurrently) {
   }
   EXPECT_LE(failures.size(), max_failures) << testing::PrintToString(failures);
 }
+#endif
 
 TEST(TimeZone, NamedTimeZones) {
   const time_zone utc = utc_time_zone();
diff --git a/absl/time/internal/cctz/testdata/version b/absl/time/internal/cctz/testdata/version
index ac954d74..63f58006 100644
--- a/absl/time/internal/cctz/testdata/version
+++ b/absl/time/internal/cctz/testdata/version
@@ -1 +1 @@
-2018g-9-gf0d2759
+2018i
diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome
index d2a64bd1d3d5e7bbdf3b44882005ff9420c12e68..59f3759c409a1fb50e632ef5ef613d3fee7af7ef 100644
GIT binary patch
literal 254
zcmWHE%1kq2zyPd35fBCe79a+(c^ZJkq-T8%QJx(FF<QGPFfuU%<=6rk82<nNo(z-(
z0iXz<00Rev?c*E5;10y$jv+t+Mvx$o2qD4F|3DCD^Va}GgX{(w0kR)NQ{o0LptB6P
E0Q0IRegFUf

literal 225
zcmWHE%1kq2zyK^j5fBCeW*`Q!c^ZJkq-T8%QJx(Fj7&gbwg3i(|Np-y1I0lAsEAL1
ufy2i)guxw%!yQ9_f{b7sLV`8_fgsN2uK|b#SqC(Lfeb6TfcEPeasdFpyd(Ai

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla b/absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla
index 26356078f8d158e6cea100856baf7620a3296b84..85a7e16e165d79dbea866996b084d8ddcf72cb2e 100644
GIT binary patch
delta 24
gcmZqVZsguDfsv7M^F+o#W=5vT4_VYEbFx+d09MQfuK)l5

delta 32
ncmZqVZsguDfpPLQM#ahV8QC^(XVhk%{EbC;@_!aCAZ`Kxx~L1!

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong
index 8e5c5813666a4d023bc9f7f7bd0e53ca1a61dd85..91eaff488f8c550346aede494d1154e4fe7adf48 100644
GIT binary patch
delta 298
zcmbQvxtw!?xF#C|0|N+yfGZG#*n+K@$rDcbT3DRAJ=x&2cVWdP-_0K;I+!wTdp@!J
zBnu-GGs|Q}7PHCmjNFb44B1>Dy#);nEDQ{F6Bs!d7|J^!YzAJ4xQ}lLgNHW=2Zu0t
z0WmU|Aa0A*4gY}v<PH!GatoLSx(7sq+ytUQ?wTyblnZp&=0>K8j3`d?px9|#Ku7CZ
GZ~*`*cuvy*

delta 271
zcmZ3^Ih}KYxF#zD0|N+yfGZG#*n+K@QQuC!3g2<+meq>W-W3g(e3A+#I+!x8iJn+~
zl7)$piFvXji=82m!N8Es1=3nKfsuuQp`d|*6U1iVg|K~mLl``~gF!?HgI93K<lT%)
zwpeZa4+J1vK{Uu_5Dl^&M1x!aqCu{hEX9-ybjIdRriqMjhd7h$5Rj9hfD7n0T?;M%
D31CcY

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qostanay b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qostanay
new file mode 100644
index 0000000000000000000000000000000000000000..cb6e2d90f8139c67cd9d2318a2fa1219130d3270
GIT binary patch
literal 1033
zcmd6lPe@a79Ke5@TKnUnOQ}ukmFZKLW^<02bFRziVDLo-f=t-K1i@1z2?|1t2=t~W
z@gOQ5qQitbRp6mx(D%?ys*4v1I#id?F@K-8%b=4te~;hq^V|D99=v@%xyjj?nE7vn
z?Hwi~ZYTRIuUlT_-|dt$SKXD;wdMn-DX{M}{rj`keEhrAa_BnOKR+);J`}a}&Ahg4
z&ghNR3B9@WNS(PMy_N6L+hY-JPc`bDXjwZVzqB*_L*0h3xPMQj>*%D=y|7d0{`y^d
zK7Ens+XK0~yDz=#+tOEDlY7sK(my>f_oucr_H<DPMqX%qd`bt~rZo{8)kHa~$w*$3
z-@0_@BrOj<hIIJQk<^|mBk%o^ei@X}jU&lC`6&;JMwcs<iqBtHU+1@1!=;+*a-il%
z?Sb6~gT@T+@~0#-rrwyWn1C_4g0GR)*tPafR($rf`egN#C&wP=Ote34=b)VlUS^EX
z8`ZtH=FZ{8eo6&55I?*CM-WdCS01e|h%<;ch&zZsh(m}+h)al1h*OAHh+BwXh+~Ln
zh--*%kJdTFJH)+5>mSkpqytC`kRBjSK)Qgm0qFzM2&5B8E0A6w&3LrkK-%$W`++nB
i=?Kyiq$fyIkggzYLHdF;2A8dqi`-c#WgATQCPHTx4%{CA

literal 0
HcmV?d00001

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qyzylorda b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qyzylorda
index 00b278440592895901730ba41ae6fa14b6f94107..fc636b3b868bf26e31c7616d7f08278bb7c00b79 100644
GIT binary patch
delta 123
zcmey#KAmHNxF9zJ0|N+yfGH4jPt>@;5+i+M!NectOiWCZ4H#|M7#Q3F7&s>9Fsd*y
gFksWOc?aVHMh=iJkTF<w0`1_k(Kax((>3J+0BaEy<p2Nx

delta 90
zcmbQv@soXmxF8n;0|N+yfC&(DP1LwBIhWa-kz?{QW}C?`m{qVT+I*C80VAq1PA(g5
K12a2aGcEx7(-E8i

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran
index ad9058b4937b8786f58e2cbd61adff5ffb6f0657..0ae2f65fcdaa2f57b2def772d7a3f4bd93b27ea0 100644
GIT binary patch
delta 881
zcmW-gT}V@L07viDGAS)+LIzRMl!6A*7Hts~q+lgvR_H_7!;&N+g$lvGmX@<@nsd!I
z%bBI-cg>HS<xJC+Tbf$xvbK^EQb-Ci=nHB)_vO#I=luTn>DGichZRZ16l;V@G<1t8
z26@l{Lso!PbhVTP$O1JN5)SVad{1`tl*)hR$o2jH^J3&OoBzBdao}@<;_$h1Kk?en
z=ka;&bMR$XAbiDUrO&Td(qA=C;dQz+e8HJ;eBp76-)n?x$z{AK+AC$C-!{ykctaus
z!|HkX>r3<TMp213ez)UGK6S!3#&^J`zHjvA_DuTHYAODvsTO}LF9~0k<@I@uAXtuh
zcu{^x&ER(25(X7pjSTL{qVacEI`NgEnfS_ofALjc|G?EBv*CLqQS>#vZS=LxYJ6Sg
zG``+Yf^X2SQ2D<vG@f!2G^NH9+)vsAKiD-2TU9v>n%4(&VaxJ1d~3)SeCzKSeA{dW
z{-HM=ZXcS1ZCw@g9oDt<kIKjJkBbkg{NEQkvx5ojCkqL>jugO85+!hVOb>$|Wh@sy
zjhw^xhM&gwEm()|`_+VZ%rwH!JPP=^Ym&a-ew5zX5QcYIN;L#83StQcG=l_#83XW3
z^*(qgL0~W(t)(B4EAX!(I`FS0srb?Pv-r^;U*NIn6Y#iu6}{V8MgPXOA3sqipCEW^
z))Ktag%EhoE`q)3diZ_vb_O5f9V-5!NioJSDX#JTO=*jjo1^3#WxM5@6uxuef8yo!
AHvj+t

delta 62
zcmdlavVwPlGGppSl^KjI_5c6>pZtL%WwJa|1!L;w8B99N$YP<B`MAV*EDZDwbi9nr
IO!N)701eg_2LJ#7

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Hongkong b/absl/time/internal/cctz/testdata/zoneinfo/Hongkong
index 8e5c5813666a4d023bc9f7f7bd0e53ca1a61dd85..91eaff488f8c550346aede494d1154e4fe7adf48 100644
GIT binary patch
delta 298
zcmbQvxtw!?xF#C|0|N+yfGZG#*n+K@$rDcbT3DRAJ=x&2cVWdP-_0K;I+!wTdp@!J
zBnu-GGs|Q}7PHCmjNFb44B1>Dy#);nEDQ{F6Bs!d7|J^!YzAJ4xQ}lLgNHW=2Zu0t
z0WmU|Aa0A*4gY}v<PH!GatoLSx(7sq+ytUQ?wTyblnZp&=0>K8j3`d?px9|#Ku7CZ
GZ~*`*cuvy*

delta 271
zcmZ3^Ih}KYxF#zD0|N+yfGZG#*n+K@QQuC!3g2<+meq>W-W3g(e3A+#I+!x8iJn+~
zl7)$piFvXji=82m!N8Es1=3nKfsuuQp`d|*6U1iVg|K~mLl``~gF!?HgI93K<lT%)
zwpeZa4+J1vK{Uu_5Dl^&M1x!aqCu{hEX9-ybjIdRriqMjhd7h$5Rj9hfD7n0T?;M%
D31CcY

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Iran b/absl/time/internal/cctz/testdata/zoneinfo/Iran
index ad9058b4937b8786f58e2cbd61adff5ffb6f0657..0ae2f65fcdaa2f57b2def772d7a3f4bd93b27ea0 100644
GIT binary patch
delta 881
zcmW-gT}V@L07viDGAS)+LIzRMl!6A*7Hts~q+lgvR_H_7!;&N+g$lvGmX@<@nsd!I
z%bBI-cg>HS<xJC+Tbf$xvbK^EQb-Ci=nHB)_vO#I=luTn>DGichZRZ16l;V@G<1t8
z26@l{Lso!PbhVTP$O1JN5)SVad{1`tl*)hR$o2jH^J3&OoBzBdao}@<;_$h1Kk?en
z=ka;&bMR$XAbiDUrO&Td(qA=C;dQz+e8HJ;eBp76-)n?x$z{AK+AC$C-!{ykctaus
z!|HkX>r3<TMp213ez)UGK6S!3#&^J`zHjvA_DuTHYAODvsTO}LF9~0k<@I@uAXtuh
zcu{^x&ER(25(X7pjSTL{qVacEI`NgEnfS_ofALjc|G?EBv*CLqQS>#vZS=LxYJ6Sg
zG``+Yf^X2SQ2D<vG@f!2G^NH9+)vsAKiD-2TU9v>n%4(&VaxJ1d~3)SeCzKSeA{dW
z{-HM=ZXcS1ZCw@g9oDt<kIKjJkBbkg{NEQkvx5ojCkqL>jugO85+!hVOb>$|Wh@sy
zjhw^xhM&gwEm()|`_+VZ%rwH!JPP=^Ym&a-ew5zX5QcYIN;L#83StQcG=l_#83XW3
z^*(qgL0~W(t)(B4EAX!(I`FS0srb?Pv-r^;U*NIn6Y#iu6}{V8MgPXOA3sqipCEW^
z))Ktag%EhoE`q)3diZ_vb_O5f9V-5!NioJSDX#JTO=*jjo1^3#WxM5@6uxuef8yo!
AHvj+t

delta 62
zcmdlavVwPlGGppSl^KjI_5c6>pZtL%WwJa|1!L;w8B99N$YP<B`MAV*EDZDwbi9nr
IO!N)701eg_2LJ#7

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Kwajalein b/absl/time/internal/cctz/testdata/zoneinfo/Kwajalein
index 54bd71ff2dc7d7fc6f3ddb6e3e5ceed4c92b72f5..d6413577f980dfb40e8a187483117f367677eef3 100644
GIT binary patch
literal 340
zcmWHE%1kq2zyNGO5fBCeb|40^B^rRl!MCOtPQKzwIPcc@;eVTSfKC~oL;e5%{~4K>
z8Ch6a85rg~0IFh`wSj?!fuUys0|x^`-2?`n|Np}s7z7v?Rvcgu@$n5|&^9y#Vgm+k
z14{;7Ln9y?)e#{iI16a||2i`X1rQB#9*71x5k!NX31R@93UU|7xgfe8C`4r^bJ+kr
JVF&aK7XY8yP&EJm

literal 250
zcmWHE%1kq2zyK^j5fBCe7+atL$obzU9iUUP=Rp1c|Nj}8n3)+E<~#rjGtAn+!1Dip
zxB~+R1H*~~3_L!*Aq?7vh77ufMnD>2LkJ1>0j>C7XC|QlqCxh8>;c&gqU(V|<k-(;
L19XiY&{bRj+D$OG

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk
index e79bca2dafa7e914a9baa568edec1b428a2ac63d..8004d65bbe563273c0ca626a4a15e7a65185ce10 100644
GIT binary patch
literal 287
zcmWHE%1kq2zyK^j5fBCeHXsJEc^ZJk48g?@7FhoLaPk#b!X-hz5B2~5|7T<ZLdO69
zZO#A{F!U?{sji#AzyV?V_=YfO8yYZZ8(4y*!5{>?t*k&v5C#EuAO^8{fEN50dAQ#M
zMAw<AZ2{3BSAb}cOF%TpH6R+~B9P{KAe)hi83>tR&g%04Nf6^W1_mx0po8sn4Gp*e
DkP%Dx

literal 174
zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14Ew=NUCQ61B;Ju2!pnv0f@^GLV{^P
YgZ|f<scix2!*42=4bXf$T|)yd06J?KGXMYp

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam
index ffdf8c24b86220d1bc67908fa080a37f250544db..e22424758f8d04d3389b3d361bde0058b02ca6a0 100644
GIT binary patch
literal 516
zcmbV|KTE?<97S*b)Rq#9L$f;SU@KK5MHh#PUFu{&5fm3iw=Ci!rCSj?C@2M8gnoez
z&N?~SLBE0Sf*A$D_)bKG>g0X=-g$XE2={~=`@6IHm5jMzNYM;uzh$=j>iN^d^l|)B
zz0qs%7QbIgAB&Tn#2Qz!xgM)qlC^vg*@p!=6Khd6>MA>UjJ@2cyrXt$^!BV(*y%+J
zwXJQ-ww$5mCP^@7exuHnT&a1YoOIE*y!2+Qu@b7j8fvOCuliD`+MfCNN%(h}5%Yo}
zz8TJbVp4p*8^C5zZa~UG3PMUkibBf5v@i!s6N(d4o*)1sfgl1RBc%}nk&@DgfyjXf
bf?tvx+Z|e&Z%gfKp8d;}l*e9qrjq{zz|)A1

literal 216
zcmWHE%1kq2zyQoZ5fBCeCLji}c^iO)m2+GIBh&x?W+p%mL(c*R7BI=-;~T=@9vs5p
zoB<>tAOyS7Kn);GU;r`}#OD1E1R@WQo&nKyX1YEgS%_84FuU5ffCTZ{$iTn_vR~KG
GfC~UJHYHvF

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae
index b6bd4b089416a12b02a37eba8a1082dfa28b7797..11583b13e468c9a33eda602b0afa43699e283ac6 100644
GIT binary patch
literal 377
zcmWHE%1kq2zyNGO5fBCeP9O%cMH+y_48f@v7FhoLaPY0^g_Ezi5-thyefZxd9bnd-
z?oj{#|9?g%MrI~P7DmSZ|J{9n>KSHjU|?ZjsGGpR!NAb7fPsgBVZ{Lk0f@MdZwQ07
zp&^5|fhCYO0Af_9gkX0ZJJ47V1_3T02C+qecK;W7xMd57t}~M{0ns4Gf@qL~K{UwG
zAR6Rw5Dj)bhynBf$S{y6Ky*D&h>?kziG`Vom5B-FlNo0~a+LT7=v*71f9-S)4Y>fx
CfM=Qj

literal 242
zcmWHE%1kq2zyK^j5fBCe7@Ma7$obzU9bnd-?oj{#|9?g%Mn(pP8D~I>W^DkeTXBGa
z1H$(44PnqWGz4OV=^-T81vLJDotcaYhz8jSvIAr<h^_|;k!m-W4bU}qx`u{a0Gwtk
AUjP6A

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein
index 54bd71ff2dc7d7fc6f3ddb6e3e5ceed4c92b72f5..d6413577f980dfb40e8a187483117f367677eef3 100644
GIT binary patch
literal 340
zcmWHE%1kq2zyNGO5fBCeb|40^B^rRl!MCOtPQKzwIPcc@;eVTSfKC~oL;e5%{~4K>
z8Ch6a85rg~0IFh`wSj?!fuUys0|x^`-2?`n|Np}s7z7v?Rvcgu@$n5|&^9y#Vgm+k
z14{;7Ln9y?)e#{iI16a||2i`X1rQB#9*71x5k!NX31R@93UU|7xgfe8C`4r^bJ+kr
JVF&aK7XY8yP&EJm

literal 250
zcmWHE%1kq2zyK^j5fBCe7+atL$obzU9iUUP=Rp1c|Nj}8n3)+E<~#rjGtAn+!1Dip
zxB~+R1H*~~3_L!*Aq?7vh77ufMnD>2LkJ1>0j>C7XC|QlqCxh8>;c&gqU(V|<k-(;
L19XiY&{bRj+D$OG

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro
index 53f32886d08156820aaf860bcaedd3009c35f601..65990cbba94137c966b638c552393651261a92e6 100644
GIT binary patch
literal 330
zcmWHE%1kq2zyPd35fBCe4j=}xMH+y_48f@v7FhoLaPY0^g_Ezi63*MY7yNIN4ygbC
z|34!WBQp~t3kw6o0+3RMSsNID?79gc6M7af@Gvl}IKUv_;~T=DZD`1#ZD0wc4S*Qg
z{tyz}1GMsgota1jhz7X}M1$N0qCxHh(I7X1Xs|m$44_*<ZmS0}so`EO8=(8`bPbKT
E00<sehX4Qo

literal 212
zcmWHE%1kq2zyQoZ5fBCe7@Ma7$obzU9Z>)O|9?g%CI*HDAQ6UH8yHv^7*-r$;PCMc
rVbC@-1Y($xAtV?NH1&U-nMebO23Z3#yB^3S(kd<+ptW|ohDKZfj`Jm{

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru
index 7e7d920e11396d3b210f28c1d69389bc68d33548..86d3b7d1e72f8af1e2c5dc2b8f01a37a8b129842 100644
GIT binary patch
delta 61
zcmeBS>S3B-z;kB8%M+KJ)jtR-u6QxgrdR^R{|^KpF$N$2iG%2gHr8BRHrj?pcDjZ}
FTmWT!7x4f9

delta 61
zcmeBS>S3B-z;k-bevb=I0R@8HEGH(~6ia~k|A7D`#sCB$aS%Px#+r-EM%&QHPS?<g
F3jhf!6?*^x

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau
index 968f1956c8eefeb78d96651051befba0b1a3ab82..05633b88e720d8df3dbec52141dfbda4fcce416f 100644
GIT binary patch
delta 87
zcmZ3>xQ}sy8O#6wI#VW25Si#FZpO^OzyQJ^0Aq9f2Lh3Y=W{@GotfDikYqiO&B(+A
X(#pUvu}6ZNfq~0L+rZLJ*OChW;%OXk

delta 69
zcmdnTxR!B(84CkLoybHh?TO-|#{Yq!&dlr$0}#{$*^G=JNf57Y0t1VWZwQ07fhCB`
Nz-0qu+38wx0RRc%60HCL

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei
index d3393a20d85209df94887e0de0c88e08442e4009..090429c09e766d547d4b9b6b583c5593b5028c5f 100644
GIT binary patch
literal 325
zcmWHE%1kq2zyPd35fBCeb|40^1sZ_F48f@v7FhoLaPY0^g_Ezi5-thyeW?Hc|34!W
zBQp~t<NyCoSAeP*W^G_#VPL46z`()4(6fMn2O{F*8^WM%Xvm;#U<srRKnkHC1iLfX
zfYKlg0zi|%YyqHc|3x0|)B(|TW(sRSG{{*X8ssz(4RRic200N#gPaL6q#np-WMXDw
cVP;~2xphhiNQP7wGca)30R3X8YiP&?0HJJIM*si-

literal 174
zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m1H+UMkkqUV3@kprAq?7vh9E9O2nnVE
Y4f<barmzO255K8gHbC?3bPWx;08pJ7fdBvi

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape
index d3393a20d85209df94887e0de0c88e08442e4009..090429c09e766d547d4b9b6b583c5593b5028c5f 100644
GIT binary patch
literal 325
zcmWHE%1kq2zyPd35fBCeb|40^1sZ_F48f@v7FhoLaPY0^g_Ezi5-thyeW?Hc|34!W
zBQp~t<NyCoSAeP*W^G_#VPL46z`()4(6fMn2O{F*8^WM%Xvm;#U<srRKnkHC1iLfX
zfYKlg0zi|%YyqHc|3x0|)B(|TW(sRSG{{*X8ssz(4RRic200N#gPaL6q#np-WMXDw
cVP;~2xphhiNQP7wGca)30R3X8YiP&?0HJJIM*si-

literal 174
zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m1H+UMkkqUV3@kprAq?7vh9E9O2nnVE
Y4f<barmzO255K8gHbC?3bPWx;08pJ7fdBvi

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan
index ffdf8c24b86220d1bc67908fa080a37f250544db..e22424758f8d04d3389b3d361bde0058b02ca6a0 100644
GIT binary patch
literal 516
zcmbV|KTE?<97S*b)Rq#9L$f;SU@KK5MHh#PUFu{&5fm3iw=Ci!rCSj?C@2M8gnoez
z&N?~SLBE0Sf*A$D_)bKG>g0X=-g$XE2={~=`@6IHm5jMzNYM;uzh$=j>iN^d^l|)B
zz0qs%7QbIgAB&Tn#2Qz!xgM)qlC^vg*@p!=6Khd6>MA>UjJ@2cyrXt$^!BV(*y%+J
zwXJQ-ww$5mCP^@7exuHnT&a1YoOIE*y!2+Qu@b7j8fvOCuliD`+MfCNN%(h}5%Yo}
zz8TJbVp4p*8^C5zZa~UG3PMUkibBf5v@i!s6N(d4o*)1sfgl1RBc%}nk&@DgfyjXf
bf?tvx+Z|e&Z%gfKp8d;}l*e9qrjq{zz|)A1

literal 216
zcmWHE%1kq2zyQoZ5fBCeCLji}c^iO)m2+GIBh&x?W+p%mL(c*R7BI=-;~T=@9vs5p
zoB<>tAOyS7Kn);GU;r`}#OD1E1R@WQo&nKyX1YEgS%_84FuU5ffCTZ{$iTn_vR~KG
GfC~UJHYHvF

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk
index e79bca2dafa7e914a9baa568edec1b428a2ac63d..8004d65bbe563273c0ca626a4a15e7a65185ce10 100644
GIT binary patch
literal 287
zcmWHE%1kq2zyK^j5fBCeHXsJEc^ZJk48g?@7FhoLaPk#b!X-hz5B2~5|7T<ZLdO69
zZO#A{F!U?{sji#AzyV?V_=YfO8yYZZ8(4y*!5{>?t*k&v5C#EuAO^8{fEN50dAQ#M
zMAw<AZ2{3BSAb}cOF%TpH6R+~B9P{KAe)hi83>tR&g%04Nf6^W1_mx0po8sn4Gp*e
DkP%Dx

literal 174
zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14Ew=NUCQ61B;Ju2!pnv0f@^GLV{^P
YgZ|f<scix2!*42=4bXf$T|)yd06J?KGXMYp

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap
index e79bca2dafa7e914a9baa568edec1b428a2ac63d..8004d65bbe563273c0ca626a4a15e7a65185ce10 100644
GIT binary patch
literal 287
zcmWHE%1kq2zyK^j5fBCeHXsJEc^ZJk48g?@7FhoLaPk#b!X-hz5B2~5|7T<ZLdO69
zZO#A{F!U?{sji#AzyV?V_=YfO8yYZZ8(4y*!5{>?t*k&v5C#EuAO^8{fEN50dAQ#M
zMAw<AZ2{3BSAb}cOF%TpH6R+~B9P{KAe)hi83>tR&g%04Nf6^W1_mx0po8sn4Gp*e
DkP%Dx

literal 174
zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14Ew=NUCQ61B;Ju2!pnv0f@^GLV{^P
YgZ|f<scix2!*42=4bXf$T|)yd06J?KGXMYp

diff --git a/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab b/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab
index 2729e6e8..9a8e4244 100644
--- a/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab
+++ b/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab
@@ -211,6 +211,7 @@ KP	+3901+12545	Asia/Pyongyang
 KR	+3733+12658	Asia/Seoul
 KZ	+4315+07657	Asia/Almaty	Kazakhstan (most areas)
 KZ	+4448+06528	Asia/Qyzylorda	Qyzylorda/Kyzylorda/Kzyl-Orda
+KZ	+5312+06337	Asia/Qostanay	Qostanay/Kostanay/Kustanay
 KZ	+5017+05710	Asia/Aqtobe	Aqtöbe/Aktobe
 KZ	+4431+05016	Asia/Aqtau	Mangghystaū/Mankistau
 KZ	+4707+05156	Asia/Atyrau	Atyraū/Atirau/Gur'yev
-- 
GitLab