main = #lib::main;
 [@vm.bytecode=
ComponentBytecodeMetadata {

Bytecode (version: stable)
Main library: #lib

}
] [@vm.bytecode=
MembersBytecodeMetadata {

Members {
Field '_stdinFD', type = dart:core::int, reflectable, static
    value = const 0

Field '_stdoutFD', type = dart:core::int, reflectable, static
    value = const 1

Field '_stderrFD', type = dart:core::int, reflectable, static
    value = const 2

Field '_rawScript', type = dart:core::String, reflectable, static
    value = null

Field '_stdin', type = #lib::Stdin, reflectable, static
    value = null

Function '_printString', static, reflectable, debuggable, native 'Builtin_PrintString'
    parameters [dart:core::String 's'] (required: 1)
    return-type void


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Builtin_PrintString
}


Function '_print', static, reflectable, debuggable
    parameters [dynamic 'arg'] (required: 1)
    return-type void


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  InterfaceCall        1, CP#0
  DirectCall           1, CP#2
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = InterfaceCall 'dart:core::Object::toString', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
  [2] = DirectCall '#lib::_printString', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
}


Function '_getPrintClosure', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic


Bytecode {
  Entry                0
  CheckStack           0
  PushConstant         CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const tear-off #lib::_print
}


Function '_setScheduleImmediateClosure', static, reflectable, debuggable
    parameters [FunctionType (FunctionType () -> void) -> void 'closure'] (required: 1)
    return-type void


Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  StoreStaticTOS       CP#0
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_ScheduleImmediate::_closure (field)
}


Function '_setStdioFDs', static, reflectable, debuggable
    parameters [dart:core::int 'stdin', dart:core::int 'stdout', dart:core::int 'stderr'] (required: 3)
    return-type void


Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-7]
  StoreStaticTOS       CP#0
  Push                 FP[-6]
  StoreStaticTOS       CP#1
  Push                 FP[-5]
  StoreStaticTOS       CP#2
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_stdinFD (field)
  [1] = StaticField #lib::_stdoutFD (field)
  [2] = StaticField #lib::_stderrFD (field)
}


Function '_scriptUri', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dart:core::Uri


Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#1
  InterfaceCall        2, CP#2
  AssertBoolean        0
  JumpIfTrue           L1
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#4
  InterfaceCall        2, CP#2
  AssertBoolean        0
  PopLocal             r1
  Jump                 L2
L1:
  PushTrue
  PopLocal             r1
L2:
  Push                 r1
  JumpIfTrue           L3
  PushConstant         CP#0
  PushStatic           CP#0
  PushConstant         CP#5
  InterfaceCall        2, CP#2
  AssertBoolean        0
  PopLocal             r0
  Jump                 L4
L3:
  PushTrue
  PopLocal             r0
L4:
  Push                 r0
  JumpIfFalse          L5
  PushConstant         CP#0
  PushStatic           CP#0
  DirectCall           1, CP#6
  ReturnTOS
L5:
  DirectCall           0, CP#8
  PushNull
  PushConstant         CP#0
  PushStatic           CP#0
  DirectCall           2, CP#10
  InterfaceCall        2, CP#12
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_rawScript (field)
  [1] = ObjectRef 'http:'
  [2] = InterfaceCall 'dart:core::String::startsWith', ArgDesc num-args 2, num-type-args 0, names []
  [3] = Reserved
  [4] = ObjectRef 'https:'
  [5] = ObjectRef 'file:'
  [6] = DirectCall 'dart:core::Uri::parse', ArgDesc num-args 1, num-type-args 0, names []
  [7] = Reserved
  [8] = DirectCall 'dart:core::Uri::get:base', ArgDesc num-args 0, num-type-args 0, names []
  [9] = Reserved
  [10] = DirectCall 'dart:core::_Uri::file (constructor)', ArgDesc num-args 2, num-type-args 0, names []
  [11] = Reserved
  [12] = InterfaceCall 'dart:core::Uri::resolveUri', ArgDesc num-args 2, num-type-args 0, names []
  [13] = Reserved
}


Function '_setupHooks', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic


Bytecode {
  Entry                1
  CheckStack           0
  PushConstant         CP#0
  DirectCall           1, CP#1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ObjectRef const tear-off #lib::_scriptUri
  [1] = DirectCall '#lib::VMLibraryHooks::set:platformScript', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
}


Function 'get:stdin', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::Stdin


Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  PushConstant         CP#1
  PushStatic           CP#1
  DirectCall           1, CP#2
  StoreLocal           r1
  Push                 r1
  StoreStaticTOS       CP#0
  PopLocal             r0
  Jump                 L2
L1:
  PushNull
  PopLocal             r0
L2:
  Push                 r0
  Drop1
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_stdin (field)
  [1] = StaticField #lib::_stdinFD (field)
  [2] = DirectCall '#lib::_StdIOUtils::_getStdioInputStream', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
}


Function 'main', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic


Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}

}

}
]library #lib from "#lib" as #lib {

  typedef _ScheduleImmediateClosure = (() → void) → void;
[@vm.bytecode=
MembersBytecodeMetadata {

Members {
Field '_closure', type = FunctionType (FunctionType () -> void) -> void, reflectable, static
    value = null

Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::_ScheduleImmediate


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

}

}
]  class _ScheduleImmediate extends dart.core::Object {
    static field (() → void) → void _closure = null;
    synthetic constructor •() → #lib::_ScheduleImmediate
      : super dart.core::Object::•()
      ;
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {
Field '_cachedNamespace', type = #lib::_NamespaceImpl, reflectable, static
    value = null

Function '_', constructor, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::_NamespaceImpl


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function '_create', static, reflectable, debuggable, native 'Namespace_Create'
    parameters [#lib::_NamespaceImpl 'namespace', dynamic 'n'] (required: 2)
    return-type #lib::_NamespaceImpl


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-6]
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_Create
}


Function '_getPointer', static, reflectable, debuggable, native 'Namespace_GetPointer'
    parameters [#lib::_NamespaceImpl 'namespace'] (required: 1)
    return-type dart:core::int


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_GetPointer
}


Function '_getDefault', static, reflectable, debuggable, native 'Namespace_GetDefault'
    parameters [] (required: 0)
    return-type dart:core::int


Bytecode {
  Entry                0
  CheckStack           0
  NativeCall           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = NativeEntry Namespace_GetDefault
}


Function '_setupNamespace', static, reflectable, debuggable
    parameters [dynamic 'namespace'] (required: 1)
    return-type void


Bytecode {
  Entry                2
  CheckStack           0
  Allocate             CP#0
  StoreLocal           r1
  Push                 r1
  DirectCall           1, CP#1
  Drop1
  Push                 FP[-5]
  DirectCall           2, CP#3
  StoreStaticTOS       CP#5
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Class #lib::_NamespaceImpl
  [1] = DirectCall '#lib::_NamespaceImpl::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = DirectCall '#lib::_NamespaceImpl::_create', ArgDesc num-args 2, num-type-args 0, names []
  [4] = Reserved
  [5] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
}


Function 'get:_namespace', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::_NamespaceImpl


Bytecode {
  Entry                2
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  Allocate             CP#1
  StoreLocal           r1
  Push                 r1
  DirectCall           1, CP#2
  Drop1
  DirectCall           0, CP#4
  DirectCall           2, CP#6
  StoreStaticTOS       CP#0
L1:
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
  [1] = Class #lib::_NamespaceImpl
  [2] = DirectCall '#lib::_NamespaceImpl::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
  [4] = DirectCall '#lib::_NamespaceImpl::_getDefault', ArgDesc num-args 0, num-type-args 0, names []
  [5] = Reserved
  [6] = DirectCall '#lib::_NamespaceImpl::_create', ArgDesc num-args 2, num-type-args 0, names []
  [7] = Reserved
}


Function 'get:_namespacePointer', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dart:core::int


Bytecode {
  Entry                0
  CheckStack           0
  DirectCall           0, CP#0
  DirectCall           1, CP#2
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespace', ArgDesc num-args 0, num-type-args 0, names []
  [1] = Reserved
  [2] = DirectCall '#lib::_NamespaceImpl::_getPointer', ArgDesc num-args 1, num-type-args 0, names []
  [3] = Reserved
}

}

}
]  class _NamespaceImpl extends dart.core::Object implements #lib::_Namespace {
    static field #lib::_NamespaceImpl _cachedNamespace = null;
    constructor _() → #lib::_NamespaceImpl
      : super dart.core::Object::•()
      ;
    @dart._internal::ExternalName::•("Namespace_Create")
    external static method _create(#lib::_NamespaceImpl namespace, dynamic n) → #lib::_NamespaceImpl;
    @dart._internal::ExternalName::•("Namespace_GetPointer")
    external static method _getPointer(#lib::_NamespaceImpl namespace) → dart.core::int;
    @dart._internal::ExternalName::•("Namespace_GetDefault")
    external static method _getDefault() → dart.core::int;
    static method _setupNamespace(dynamic namespace) → void {
      #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), namespace);
    }
    static get _namespace() → #lib::_NamespaceImpl {
      if(#lib::_NamespaceImpl::_cachedNamespace.{dart.core::Object::==}(null)) {
        #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), #lib::_NamespaceImpl::_getDefault());
      }
      return #lib::_NamespaceImpl::_cachedNamespace;
    }
    static get _namespacePointer() → dart.core::int
      return #lib::_NamespaceImpl::_getPointer(#lib::_NamespaceImpl::_namespace);
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {

Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::_Namespace


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function '_setupNamespace', static, reflectable, debuggable
    parameters [dynamic 'namespace'] (required: 1)
    return-type void


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::_setupNamespace', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'get:_namespace', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type #lib::_Namespace


Bytecode {
  Entry                0
  CheckStack           0
  DirectCall           0, CP#0
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespace', ArgDesc num-args 0, num-type-args 0, names []
  [1] = Reserved
}


Function 'get:_namespacePointer', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dart:core::int


Bytecode {
  Entry                0
  CheckStack           0
  DirectCall           0, CP#0
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespacePointer', ArgDesc num-args 0, num-type-args 0, names []
  [1] = Reserved
}

}

}
]  class _Namespace extends dart.core::Object {
    synthetic constructor •() → #lib::_Namespace
      : super dart.core::Object::•()
      ;
    static method _setupNamespace(dynamic namespace) → void {
      #lib::_NamespaceImpl::_setupNamespace(namespace);
    }
    static get _namespace() → #lib::_Namespace
      return #lib::_NamespaceImpl::_namespace;
    static get _namespacePointer() → dart.core::int
      return #lib::_NamespaceImpl::_namespacePointer;
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {
Field 'timerFactory', type = dynamic, reflectable, static
    value = null

Field 'eventHandlerSendData', type = dynamic, reflectable, static
    value = null

Field 'timerMillisecondClock', type = dynamic, reflectable, static
    value = null

Field 'resourceReadAsBytes', type = dynamic, reflectable, static
    value = null

Field 'packageRootString', type = dynamic, reflectable, static
    value = null

Field 'packageConfigString', type = dynamic, reflectable, static
    value = null

Field 'packageRootUriFuture', type = dynamic, reflectable, static
    value = null

Field 'packageConfigUriFuture', type = dynamic, reflectable, static
    value = null

Field 'resolvePackageUriFuture', type = dynamic, reflectable, static
    value = null

Field '_computeScriptUri', type = dynamic, reflectable, static
    value = null

Field '_cachedScript', type = dynamic, reflectable, static
    value = null

Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::VMLibraryHooks


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function 'set:platformScript', setter, static, reflectable, debuggable
    parameters [dynamic 'f'] (required: 1)
    return-type void


Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  StoreStaticTOS       CP#0
  PushNull
  StoreStaticTOS       CP#1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
  [1] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
}


Function 'get:platformScript', getter, static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic


Bytecode {
  Entry                1
  CheckStack           0
  PushConstant         CP#0
  PushStatic           CP#0
  EqualsNull
  JumpIfFalse          L1
  PushConstant         CP#1
  PushStatic           CP#1
  EqualsNull
  BooleanNegateTOS
  PopLocal             r0
  Jump                 L2
L1:
  PushFalse
  PopLocal             r0
L2:
  Push                 r0
  JumpIfFalse          L3
  PushConstant         CP#1
  PushStatic           CP#1
  DynamicCall          1, CP#3
  StoreStaticTOS       CP#0
L3:
  PushConstant         CP#0
  PushStatic           CP#0
  ReturnTOS
}
ConstantPool {
  [0] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
  [1] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
  [2] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
  [3] = ICData dynamic target-name 'call', arg-desc CP#2
}

}

}
]  class VMLibraryHooks extends dart.core::Object {
    static field dynamic timerFactory = null;
    static field dynamic eventHandlerSendData = null;
    static field dynamic timerMillisecondClock = null;
    static field dynamic resourceReadAsBytes = null;
    static field dynamic packageRootString = null;
    static field dynamic packageConfigString = null;
    static field dynamic packageRootUriFuture = null;
    static field dynamic packageConfigUriFuture = null;
    static field dynamic resolvePackageUriFuture = null;
    static field dynamic _computeScriptUri = null;
    static field dynamic _cachedScript = null;
    synthetic constructor •() → #lib::VMLibraryHooks
      : super dart.core::Object::•()
      ;
    static set platformScript(dynamic f) → void {
      #lib::VMLibraryHooks::_computeScriptUri = f;
      #lib::VMLibraryHooks::_cachedScript = null;
    }
    static get platformScript() → dynamic {
      if(#lib::VMLibraryHooks::_cachedScript.{dart.core::Object::==}(null) && !#lib::VMLibraryHooks::_computeScriptUri.{dart.core::Object::==}(null)) {
        #lib::VMLibraryHooks::_cachedScript = [@vm.call-site-attributes.metadata=receiverType:dynamic] #lib::VMLibraryHooks::_computeScriptUri.call();
      }
      return #lib::VMLibraryHooks::_cachedScript;
    }
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {

Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::Stdin


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}

}

}
]  class Stdin extends dart.core::Object {
    synthetic constructor •() → #lib::Stdin
      : super dart.core::Object::•()
      ;
  }
[@vm.bytecode=
MembersBytecodeMetadata {

Members {

Function '', constructor, reflectable
    parameters [] (required: 0)
    return-type #lib::_StdIOUtils


Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  DirectCall           1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
  [1] = Reserved
}


Function '_getStdioInputStream', static, reflectable, debuggable
    parameters [dart:core::int 'fd'] (required: 1)
    return-type #lib::Stdin


Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}

}

}
]  class _StdIOUtils extends dart.core::Object {
    synthetic constructor •() → #lib::_StdIOUtils
      : super dart.core::Object::•()
      ;
    static method _getStdioInputStream(dart.core::int fd) → #lib::Stdin
      return null;
  }
  static field dart.core::int _stdinFD = 0;
  static field dart.core::int _stdoutFD = 1;
  static field dart.core::int _stderrFD = 2;
  static field dart.core::String _rawScript;
  static field #lib::Stdin _stdin;
  @dart._internal::ExternalName::•("Builtin_PrintString")
  external static method _printString(dart.core::String s) → void;
  static method _print(dynamic arg) → void {
    #lib::_printString(arg.{dart.core::Object::toString}());
  }
  static method _getPrintClosure() → dynamic
    return #lib::_print;
  static method _setScheduleImmediateClosure((() → void) → void closure) → void {
    #lib::_ScheduleImmediate::_closure = closure;
  }
  static method _setStdioFDs(dart.core::int stdin, dart.core::int stdout, dart.core::int stderr) → void {
    #lib::_stdinFD = stdin;
    #lib::_stdoutFD = stdout;
    #lib::_stderrFD = stderr;
  }
  static method _scriptUri() → dart.core::Uri {
    if(#lib::_rawScript.{dart.core::String::startsWith}("http:") || #lib::_rawScript.{dart.core::String::startsWith}("https:") || #lib::_rawScript.{dart.core::String::startsWith}("file:")) {
      return dart.core::Uri::parse(#lib::_rawScript);
    }
    else {
      return dart.core::Uri::base.{dart.core::Uri::resolveUri}(dart.core::_Uri::file(#lib::_rawScript));
    }
  }
  static method _setupHooks() → dynamic {
    #lib::VMLibraryHooks::platformScript = #lib::_scriptUri;
  }
  static get stdin() → #lib::Stdin {
    #lib::_stdin.{dart.core::Object::==}(null) ?{#lib::Stdin} #lib::_stdin = #lib::_StdIOUtils::_getStdioInputStream(#lib::_stdinFD) : null;
    return #lib::_stdin;
  }
  static method main() → dynamic {}
}
