code: public boolean isAfter(VectorClock other) {
          boolean anyTimestampGreater = false;
          for (Entry<String, Long> otherEntry : other.replicaTimestamps.entrySet()) {
              final String replicaId = otherEntry.getKey();
              final Long otherReplicaTimestamp = otherEntry.getValue();
              final Long localReplicaTimestamp = this.getTimestampForReplica(replicaId);
  
              if (localReplicaTimestamp == null || localReplicaTimestamp < otherReplicaTimestamp) {
                  return false;
              } else if (localReplicaTimestamp > otherReplicaTimestamp) {
                  anyTimestampGreater = true;
              }
          }
          // there is at least one local timestamp greater or local vector clock has additional timestamps
          return anyTimestampGreater || other.replicaTimestamps.size() < replicaTimestamps.size();
      }
docs: Returns {@code true} if this vector clock is causally strictly after the
  provided vector clock. This means that it the provided clock is neither
  equal to, greater than or concurrent to this vector clock.
  This method may be called from different threads and the result reflects
  the latest update on the vector clock.