code: public <T> AsyncMutateInBuilder arrayInsertAll(String path, Collection<T> values) {
          if (StringUtil.isNullOrEmpty(path)) {
              throw new IllegalArgumentException("Path must not be empty for arrayInsert");
          }
          this.mutationSpecs.add(new MutationSpec(Mutation.ARRAY_INSERT, path, new MultiValue<T>(values)));
          return this;
      }
docs: Insert multiple values at once in an existing array at a specified position (denoted in the
  path, eg. "sub.array[2]"), inserting all values in the collection's iteration order at the given
  position and shifting existing values beyond the position by the number of elements in the collection.
  
  Each item in the collection is inserted as an individual element of the array, but a bit of overhead
  is saved compared to individual {@link #arrayInsert(String, Object)} by grouping mutations in a single packet.
  
  For example given an array [ A, B, C ], inserting the values X and Y at position 1 yields [ A, B, X, Y, C ]
  and not [ A, B, [ X, Y ], C ].
  
  @param path the path of the array.
  @param values the values to insert at the specified position of the array, each value becoming an entry at or
  after the insert position.
  @param <T> the type of data in the collection (must be JSON serializable).