library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

extension BestCom<T extends core::num> on core::Iterable<T>? {
  method best = self::BestCom|best;
  tearoff best = self::BestCom|get#best;
}
extension BestList<T extends core::Object? = dynamic> on core::List<T%> {
  method best = self::BestList|best;
  tearoff best = self::BestList|get#best;
}
extension BestSpec on core::List<core::num> {
  method best = self::BestSpec|best;
  tearoff best = self::BestSpec|get#best;
}
static method BestCom|best<T extends core::num>(lowered final core::Iterable<self::BestCom|best::T>? #this) → self::BestCom|best::T?
  return null;
static method BestCom|get#best<T extends core::num>(lowered final core::Iterable<self::BestCom|get#best::T>? #this) → () → self::BestCom|get#best::T?
  return () → self::BestCom|get#best::T? => self::BestCom|best<self::BestCom|get#best::T>(#this);
static method BestList|best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|best::T%> #this) → self::BestList|best::T?
  return null;
static method BestList|get#best<T extends core::Object? = dynamic>(lowered final core::List<self::BestList|get#best::T%> #this) → () → self::BestList|get#best::T?
  return () → self::BestList|get#best::T? => self::BestList|best<self::BestList|get#best::T%>(#this);
static method BestSpec|best(lowered final core::List<core::num> #this) → core::num?
  return null;
static method BestSpec|get#best(lowered final core::List<core::num> #this) → () → core::num?
  return () → core::num? => self::BestSpec|best(#this);
static method main() → dynamic {
  core::List<core::int>? x;
  core::int? v = self::BestCom|best<core::int>(x);
  core::List<core::num>? y;
  core::num? w = self::BestCom|best<core::num>(y);
}
