library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:_internal" as _in;

static method useAddAll() → void {
  dynamic dynamicSet1 = block {
    final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
    #t1.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
    #t1.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
    #t1.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
  } =>#t1;
  dynamic dynamicSet2 = block {
    final core::Set<core::num*>* #t2 = col::LinkedHashSet::•<core::num*>();
    #t2.{core::Set::add}{Invariant}(3){(core::num*) →* core::bool*};
    #t2.{core::Set::add}{Invariant}(4){(core::num*) →* core::bool*};
    #t2.{core::Set::add}{Invariant}(5){(core::num*) →* core::bool*};
  } =>#t2;
  core::Iterable<core::int*>* iterableIntSet = block {
    final core::Set<core::int*>* #t3 = col::LinkedHashSet::•<core::int*>();
    #t3.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
    #t3.{core::Set::add}{Invariant}(7){(core::int*) →* core::bool*};
    #t3.{core::Set::add}{Invariant}(8){(core::int*) →* core::bool*};
  } =>#t3;
  core::Iterable<core::num*>* iterableNumSet1 = block {
    final core::Set<core::int*>* #t4 = col::LinkedHashSet::•<core::int*>();
    #t4.{core::Set::add}{Invariant}(9){(core::int*) →* core::bool*};
    #t4.{core::Set::add}{Invariant}(10){(core::int*) →* core::bool*};
    #t4.{core::Set::add}{Invariant}(11){(core::int*) →* core::bool*};
  } =>#t4;
  core::Iterable<core::num*>* iterableNumSet2 = block {
    final core::Set<core::num*>* #t5 = col::LinkedHashSet::•<core::num*>();
    #t5.{core::Set::add}{Invariant}(12){(core::num*) →* core::bool*};
    #t5.{core::Set::add}{Invariant}(13){(core::num*) →* core::bool*};
    #t5.{core::Set::add}{Invariant}(14){(core::num*) →* core::bool*};
  } =>#t5;
  core::Set<core::int*>* intSet = block {
    final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
    #t6.{core::Set::add}{Invariant}(15){(core::int*) →* core::bool*};
    #t6.{core::Set::add}{Invariant}(16){(core::int*) →* core::bool*};
    #t6.{core::Set::add}{Invariant}(17){(core::int*) →* core::bool*};
  } =>#t6;
  core::Set<core::num*>* numSet1 = block {
    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
    #t7.{core::Set::add}{Invariant}(18){(core::int*) →* core::bool*};
    #t7.{core::Set::add}{Invariant}(19){(core::int*) →* core::bool*};
    #t7.{core::Set::add}{Invariant}(20){(core::int*) →* core::bool*};
  } =>#t7;
  core::Set<core::num*>* numSet2 = block {
    final core::Set<core::num*>* #t8 = col::LinkedHashSet::•<core::num*>();
    #t8.{core::Set::add}{Invariant}(21){(core::num*) →* core::bool*};
    #t8.{core::Set::add}{Invariant}(22){(core::num*) →* core::bool*};
    #t8.{core::Set::add}{Invariant}(23){(core::num*) →* core::bool*};
  } =>#t8;
  core::Set<core::int*>* set1 = block {
    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
    for (final dynamic #t10 in dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t11 = #t10 as{TypeError} core::int*;
      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
    }
    for (final dynamic #t12 in dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t13 = #t12 as{TypeError} core::int*;
      #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
    }
    #t9.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int*>*) →* void};
    for (final dynamic #t14 in iterableNumSet1) {
      final core::int* #t15 = #t14 as{TypeError} core::int*;
      #t9.{core::Set::add}{Invariant}(#t15){(core::int*) →* core::bool*};
    }
    for (final dynamic #t16 in iterableNumSet2) {
      final core::int* #t17 = #t16 as{TypeError} core::int*;
      #t9.{core::Set::add}{Invariant}(#t17){(core::int*) →* core::bool*};
    }
    #t9.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int*>*) →* void};
    for (final dynamic #t18 in numSet1) {
      final core::int* #t19 = #t18 as{TypeError} core::int*;
      #t9.{core::Set::add}{Invariant}(#t19){(core::int*) →* core::bool*};
    }
    for (final dynamic #t20 in numSet2) {
      final core::int* #t21 = #t20 as{TypeError} core::int*;
      #t9.{core::Set::add}{Invariant}(#t21){(core::int*) →* core::bool*};
    }
  } =>#t9;
  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::int*>*}, set1);
  core::Set<core::num*>* set2 = block {
    final core::Set<core::num*>* #t22 = col::LinkedHashSet::•<core::num*>();
    for (final dynamic #t23 in dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::num* #t24 = #t23 as{TypeError} core::num*;
      #t22.{core::Set::add}{Invariant}(#t24){(core::num*) →* core::bool*};
    }
    for (final dynamic #t25 in dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::num* #t26 = #t25 as{TypeError} core::num*;
      #t22.{core::Set::add}{Invariant}(#t26){(core::num*) →* core::bool*};
    }
    #t22.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num*>*) →* void};
    #t22.{core::Set::addAll}{Invariant}(iterableNumSet1){(core::Iterable<core::num*>*) →* void};
    #t22.{core::Set::addAll}{Invariant}(iterableNumSet2){(core::Iterable<core::num*>*) →* void};
    #t22.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num*>*) →* void};
    #t22.{core::Set::addAll}{Invariant}(numSet1){(core::Iterable<core::num*>*) →* void};
    #t22.{core::Set::addAll}{Invariant}(numSet2){(core::Iterable<core::num*>*) →* void};
  } =>#t22;
  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set2);
  core::Set<core::int*>* set3 = block {
    final core::Set<core::int*>* #t27 = col::LinkedHashSet::•<core::int*>();
    final core::Iterable<dynamic>* #t28 = dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t28 == null))
      for (final dynamic #t29 in #t28) {
        final core::int* #t30 = #t29 as{TypeError} core::int*;
        #t27.{core::Set::add}{Invariant}(#t30){(core::int*) →* core::bool*};
      }
    final core::Iterable<dynamic>* #t31 = dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t31 == null))
      for (final dynamic #t32 in #t31) {
        final core::int* #t33 = #t32 as{TypeError} core::int*;
        #t27.{core::Set::add}{Invariant}(#t33){(core::int*) →* core::bool*};
      }
    final core::Iterable<core::int*>* #t34 = iterableIntSet;
    if(!(#t34 == null))
      #t27.{core::Set::addAll}{Invariant}(#t34){(core::Iterable<core::int*>*) →* void};
    final core::Iterable<dynamic>* #t35 = iterableNumSet1;
    if(!(#t35 == null))
      for (final dynamic #t36 in #t35) {
        final core::int* #t37 = #t36 as{TypeError} core::int*;
        #t27.{core::Set::add}{Invariant}(#t37){(core::int*) →* core::bool*};
      }
    final core::Iterable<dynamic>* #t38 = iterableNumSet2;
    if(!(#t38 == null))
      for (final dynamic #t39 in #t38) {
        final core::int* #t40 = #t39 as{TypeError} core::int*;
        #t27.{core::Set::add}{Invariant}(#t40){(core::int*) →* core::bool*};
      }
    final core::Iterable<core::int*>* #t41 = intSet;
    if(!(#t41 == null))
      #t27.{core::Set::addAll}{Invariant}(#t41){(core::Iterable<core::int*>*) →* void};
    final core::Iterable<dynamic>* #t42 = numSet1;
    if(!(#t42 == null))
      for (final dynamic #t43 in #t42) {
        final core::int* #t44 = #t43 as{TypeError} core::int*;
        #t27.{core::Set::add}{Invariant}(#t44){(core::int*) →* core::bool*};
      }
    final core::Iterable<dynamic>* #t45 = numSet2;
    if(!(#t45 == null))
      for (final dynamic #t46 in #t45) {
        final core::int* #t47 = #t46 as{TypeError} core::int*;
        #t27.{core::Set::add}{Invariant}(#t47){(core::int*) →* core::bool*};
      }
  } =>#t27;
  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::int*>*}, set3);
  core::Set<core::num*>* set4 = block {
    final core::Set<core::num*>* #t48 = col::LinkedHashSet::•<core::num*>();
    final core::Iterable<dynamic>* #t49 = dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t49 == null))
      for (final dynamic #t50 in #t49) {
        final core::num* #t51 = #t50 as{TypeError} core::num*;
        #t48.{core::Set::add}{Invariant}(#t51){(core::num*) →* core::bool*};
      }
    final core::Iterable<dynamic>* #t52 = dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
    if(!(#t52 == null))
      for (final dynamic #t53 in #t52) {
        final core::num* #t54 = #t53 as{TypeError} core::num*;
        #t48.{core::Set::add}{Invariant}(#t54){(core::num*) →* core::bool*};
      }
    final core::Iterable<core::num*>* #t55 = iterableIntSet;
    if(!(#t55 == null))
      #t48.{core::Set::addAll}{Invariant}(#t55){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t56 = iterableNumSet1;
    if(!(#t56 == null))
      #t48.{core::Set::addAll}{Invariant}(#t56){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t57 = iterableNumSet2;
    if(!(#t57 == null))
      #t48.{core::Set::addAll}{Invariant}(#t57){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t58 = intSet;
    if(!(#t58 == null))
      #t48.{core::Set::addAll}{Invariant}(#t58){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t59 = numSet1;
    if(!(#t59 == null))
      #t48.{core::Set::addAll}{Invariant}(#t59){(core::Iterable<core::num*>*) →* void};
    final core::Iterable<core::num*>* #t60 = numSet2;
    if(!(#t60 == null))
      #t48.{core::Set::addAll}{Invariant}(#t60){(core::Iterable<core::num*>*) →* void};
  } =>#t48;
  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set4);
}
static method main() → dynamic {
  self::useAddAll();
}
static method expect(core::Set<dynamic>* set1, core::Set<dynamic>* set2) → void {
  if(!(set1.{_in::EfficientLengthIterable::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} set2.{_in::EfficientLengthIterable::length}{core::int*})) {
    throw "Unexpected length. Expected ${set1.{_in::EfficientLengthIterable::length}{core::int*}}, actual ${set2.{_in::EfficientLengthIterable::length}{core::int*}}.";
  }
  for (dynamic element in set1) {
    if(!set2.{core::Set::contains}(element){(core::Object*) →* core::bool*}) {
      throw "Element ${element} not found. Expected ${set1}, actual ${set2}.";
    }
  }
}
