<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_all_at(self, index, items):
 """ Adds all of the elements in the specified collection into this list at the specified position. Elements in this positions and following elements are shifted to the right, if any. The order of new elements is determined by the specified collection's iterator. :param index: (int), the specified index at which the first element of specified collection is added. :param items: (Collection), the specified collection which includes the elements to be added to list. :return: (bool), ``true`` if this call changed the list, ``false`` otherwise. """

        check_not_none(items, "Value can't be None")
        data_items = []
        for item in items:
            check_not_none(item, "Value can't be None")
            data_items.append(self._to_data(item))
        return self._encode_invoke(list_add_all_with_index_codec, index=index, value_list=data_items)