library;
import self as self;
import "dart:core" as core;

static method useAddAll() → void {
  dynamic dynamicList1 = <core::int*>[0, 1, 2];
  dynamic dynamicList2 = <core::num*>[3, 4, 5];
  core::Iterable<core::int*>* iterableIntList = <core::int*>[6, 7, 8];
  core::Iterable<core::num*>* iterableNumList1 = <core::int*>[9, 10, 11];
  core::Iterable<core::num*>* iterableNumList2 = <core::num*>[12, 13, 14];
  core::List<core::int*>* intList = <core::int*>[15, 16, 17];
  core::List<core::num*>* numList1 = <core::int*>[18, 19, 20];
  core::List<core::num*>* numList2 = <core::num*>[21, 22, 23];
  core::List<core::int*>* list1 = block {
    final core::List<core::int*>* #t1 = <core::int*>[];
    for (final dynamic #t2 in dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t3 = #t2 as{TypeError} core::int*;
      #t1.{core::List::add}(#t3){(core::int*) →* void};
    }
    for (final dynamic #t4 in dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t5 = #t4 as{TypeError} core::int*;
      #t1.{core::List::add}(#t5){(core::int*) →* void};
    }
    #t1.{core::List::addAll}(iterableIntList){(core::Iterable<core::int*>*) →* void};
    for (final dynamic #t6 in iterableNumList1) {
      final core::int* #t7 = #t6 as{TypeError} core::int*;
      #t1.{core::List::add}(#t7){(core::int*) →* void};
    }
    for (final dynamic #t8 in iterableNumList2) {
      final core::int* #t9 = #t8 as{TypeError} core::int*;
      #t1.{core::List::add}(#t9){(core::int*) →* void};
    }
    #t1.{core::List::addAll}(intList){(core::Iterable<core::int*>*) →* void};
    for (final dynamic #t10 in numList1) {
      final core::int* #t11 = #t10 as{TypeError} core::int*;
      #t1.{core::List::add}(#t11){(core::int*) →* void};
    }
    for (final dynamic #t12 in numList2) {
      final core::int* #t13 = #t12 as{TypeError} core::int*;
      #t1.{core::List::add}(#t13){(core::int*) →* void};
    }
  } =>#t1;
  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i), list1);
  core::List<core::num*>* list2 = block {
    final core::List<core::num*>* #t14 = <core::num*>[];
    for (final dynamic #t15 in dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::num* #t16 = #t15 as{TypeError} core::num*;
      #t14.{core::List::add}(#t16){(core::num*) →* void};
    }
    for (final dynamic #t17 in dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::num* #t18 = #t17 as{TypeError} core::num*;
      #t14.{core::List::add}(#t18){(core::num*) →* void};
    }
    #t14.{core::List::addAll}(iterableIntList){(core::Iterable<core::num*>*) →* void};
    #t14.{core::List::addAll}(iterableNumList1){(core::Iterable<core::num*>*) →* void};
    #t14.{core::List::addAll}(iterableNumList2){(core::Iterable<core::num*>*) →* void};
    #t14.{core::List::addAll}(intList){(core::Iterable<core::num*>*) →* void};
    #t14.{core::List::addAll}(numList1){(core::Iterable<core::num*>*) →* void};
    #t14.{core::List::addAll}(numList2){(core::Iterable<core::num*>*) →* void};
  } =>#t14;
  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i), list2);
  core::List<core::int*>* list3 = block {
    final core::List<core::int*>* #t19 = <core::int*>[];
    final core::Iterable<dynamic>* #t20 = dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t20 == null))
      for (final dynamic #t21 in #t20) {
        final core::int* #t22 = #t21 as{TypeError} core::int*;
        #t19.{core::List::add}(#t22){(core::int*) →* void};
      }
    final core::Iterable<dynamic>* #t23 = dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t23 == null))
      for (final dynamic #t24 in #t23) {
        final core::int* #t25 = #t24 as{TypeError} core::int*;
        #t19.{core::List::add}(#t25){(core::int*) →* void};
      }
    final core::Iterable<core::int*>* #t26 = iterableIntList;
    if(!(#t26 == null))
      #t19.{core::List::addAll}(#t26){(core::Iterable<core::int*>*) →* void};
    final core::Iterable<dynamic>* #t27 = iterableNumList1;
    if(!(#t27 == null))
      for (final dynamic #t28 in #t27) {
        final core::int* #t29 = #t28 as{TypeError} core::int*;
        #t19.{core::List::add}(#t29){(core::int*) →* void};
      }
    final core::Iterable<dynamic>* #t30 = iterableNumList2;
    if(!(#t30 == null))
      for (final dynamic #t31 in #t30) {
        final core::int* #t32 = #t31 as{TypeError} core::int*;
        #t19.{core::List::add}(#t32){(core::int*) →* void};
      }
    final core::Iterable<core::int*>* #t33 = intList;
    if(!(#t33 == null))
      #t19.{core::List::addAll}(#t33){(core::Iterable<core::int*>*) →* void};
    final core::Iterable<dynamic>* #t34 = numList1;
    if(!(#t34 == null))
      for (final dynamic #t35 in #t34) {
        final core::int* #t36 = #t35 as{TypeError} core::int*;
        #t19.{core::List::add}(#t36){(core::int*) →* void};
      }
    final core::Iterable<dynamic>* #t37 = numList2;
    if(!(#t37 == null))
      for (final dynamic #t38 in #t37) {
        final core::int* #t39 = #t38 as{TypeError} core::int*;
        #t19.{core::List::add}(#t39){(core::int*) →* void};
      }
  } =>#t19;
  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i), list3);
  core::List<core::num*>* list4 = block {
    final core::List<core::num*>* #t40 = <core::num*>[];
    final core::Iterable<dynamic>* #t41 = dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t41 == null))
      for (final dynamic #t42 in #t41) {
        final core::num* #t43 = #t42 as{TypeError} core::num*;
        #t40.{core::List::add}(#t43){(core::num*) →* void};
      }
    final core::Iterable<dynamic>* #t44 = dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t44 == null))
      for (final dynamic #t45 in #t44) {
        final core::num* #t46 = #t45 as{TypeError} core::num*;
        #t40.{core::List::add}(#t46){(core::num*) →* void};
      }
    final core::Iterable<core::num*>* #t47 = iterableIntList;
    if(!(#t47 == null))
      #t40.{core::List::addAll}(#t47){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t48 = iterableNumList1;
    if(!(#t48 == null))
      #t40.{core::List::addAll}(#t48){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t49 = iterableNumList2;
    if(!(#t49 == null))
      #t40.{core::List::addAll}(#t49){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t50 = intList;
    if(!(#t50 == null))
      #t40.{core::List::addAll}(#t50){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t51 = numList1;
    if(!(#t51 == null))
      #t40.{core::List::addAll}(#t51){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t52 = numList2;
    if(!(#t52 == null))
      #t40.{core::List::addAll}(#t52){(core::Iterable<core::num*>*) →* void};
  } =>#t40;
  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i), list4);
}
static method main() → dynamic {
  self::useAddAll();
}
static method expect(core::List<dynamic>* list1, core::List<dynamic>* list2) → void {
  if(!(list1.{core::List::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} list2.{core::List::length}{core::int*})) {
    throw "Unexpected length. Expected ${list1.{core::List::length}{core::int*}}, actual ${list2.{core::List::length}{core::int*}}.";
  }
  for (core::int* i = 0; i.{core::num::<}(list1.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
    if(!(list1.{core::List::[]}(i){(core::int*) →* dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} list2.{core::List::[]}(i){(core::int*) →* dynamic})) {
      throw "Unexpected element at index ${i}. Expected ${list1.{core::List::[]}(i){(core::int*) →* dynamic}}, actual ${list2.{core::List::[]}(i){(core::int*) →* dynamic}}.";
    }
  }
}
