//! Opcode tables generated from Hermes BytecodeList.def source.
//! Source: facebook/hermes git repo at verified version-specific commits.
//! Regenerate: bash tools/gen_opcodes.sh
#![allow(missing_docs, reason = "internal")]

/// Typed opcode identifier — generated from all Hermes bytecode versions.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize)]
#[allow(non_camel_case_types, reason = "Hermes opcode names follow the upstream Hermes runtime's camelCase convention which Rust's lint rejects.")]
#[non_exhaustive]
pub enum OpCode {
    Add,
    Add32,
    AddEmptyString,
    AddN,
    AddOwnPrivateBySym,
    AddS,
    AsyncBreakCheck,
    BitAnd,
    BitNot,
    BitOr,
    BitXor,
    CacheNewObject,
    Call,
    Call1,
    Call2,
    Call3,
    Call4,
    CallBuiltin,
    CallBuiltinLong,
    CallDirect,
    CallDirectLongIndex,
    CallLong,
    CallRequire,
    CallWithNewTarget,
    CallWithNewTargetLong,
    Catch,
    CoerceThisNS,
    CompleteGenerator,
    Construct,
    ConstructLong,
    CreateAsyncClosure,
    CreateAsyncClosureLongIndex,
    CreateBaseClass,
    CreateBaseClassLongIndex,
    CreateClosure,
    CreateClosureLongIndex,
    CreateDerivedClass,
    CreateDerivedClassLongIndex,
    CreateEnvironment,
    CreateFunctionEnvironment,
    CreateGenerator,
    CreateGeneratorClosure,
    CreateGeneratorClosureLongIndex,
    CreateGeneratorLongIndex,
    CreateInnerEnvironment,
    CreatePrivateName,
    CreateRegExp,
    CreateThis,
    CreateThisForNew,
    CreateThisForSuper,
    CreateTopLevelEnvironment,
    Debugger,
    DebuggerCheckBreak,
    Dec,
    DeclareGlobalVar,
    DefineOwnById,
    DefineOwnByIdLong,
    DefineOwnByIndex,
    DefineOwnByIndexL,
    DefineOwnByVal,
    DefineOwnGetterSetterByVal,
    DefineOwnInDenseArray,
    DefineOwnInDenseArrayL,
    DelById,
    DelByIdLong,
    DelByIdLoose,
    DelByIdLooseLong,
    DelByIdStrict,
    DelByIdStrictLong,
    DelByVal,
    DelByValLoose,
    DelByValStrict,
    DirectEval,
    Div,
    DivN,
    Divi32,
    Divu32,
    Eq,
    FastArrayAppend,
    FastArrayLength,
    FastArrayLoad,
    FastArrayPush,
    FastArrayStore,
    GetArgumentsLength,
    GetArgumentsPropByVal,
    GetArgumentsPropByValLoose,
    GetArgumentsPropByValStrict,
    GetBuiltinClosure,
    GetById,
    GetByIdLong,
    GetByIdShort,
    GetByIdWithReceiverLong,
    GetByIndex,
    GetByVal,
    GetByValWithReceiver,
    GetClosureEnvironment,
    GetEnvironment,
    GetGlobalObject,
    GetNewTarget,
    GetNextPName,
    GetOwnBySlotIdx,
    GetOwnBySlotIdxLong,
    GetOwnPrivateBySym,
    GetPNameList,
    GetParentEnvironment,
    Greater,
    GreaterEq,
    Inc,
    InstanceOf,
    IsIn,
    IteratorBegin,
    IteratorClose,
    IteratorNext,
    JEqual,
    JEqualLong,
    JGreater,
    JGreaterEqual,
    JGreaterEqualLong,
    JGreaterEqualN,
    JGreaterEqualNLong,
    JGreaterLong,
    JGreaterN,
    JGreaterNLong,
    JLess,
    JLessEqual,
    JLessEqualLong,
    JLessEqualN,
    JLessEqualNLong,
    JLessLong,
    JLessN,
    JLessNLong,
    JNotEqual,
    JNotEqualLong,
    JNotGreater,
    JNotGreaterEqual,
    JNotGreaterEqualLong,
    JNotGreaterEqualN,
    JNotGreaterEqualNLong,
    JNotGreaterLong,
    JNotGreaterN,
    JNotGreaterNLong,
    JNotLess,
    JNotLessEqual,
    JNotLessEqualLong,
    JNotLessEqualN,
    JNotLessEqualNLong,
    JNotLessLong,
    JNotLessN,
    JNotLessNLong,
    JStrictEqual,
    JStrictEqualLong,
    JStrictNotEqual,
    JStrictNotEqualLong,
    Jmp,
    JmpBuiltinIs,
    JmpBuiltinIsLong,
    JmpBuiltinIsNot,
    JmpBuiltinIsNotLong,
    JmpFalse,
    JmpFalseLong,
    JmpLong,
    JmpTrue,
    JmpTrueLong,
    JmpTypeOfIs,
    JmpUndefined,
    JmpUndefinedLong,
    LShift,
    Less,
    LessEq,
    LoadConstBigInt,
    LoadConstBigIntLongIndex,
    LoadConstDouble,
    LoadConstEmpty,
    LoadConstFalse,
    LoadConstInt,
    LoadConstNull,
    LoadConstString,
    LoadConstStringLongIndex,
    LoadConstTrue,
    LoadConstUInt8,
    LoadConstUndefined,
    LoadConstZero,
    LoadFromEnvironment,
    LoadFromEnvironmentL,
    LoadParam,
    LoadParamLong,
    LoadParentNoTraps,
    LoadThisNS,
    Loadi16,
    Loadi32,
    Loadi8,
    Loadu16,
    Loadu32,
    Loadu8,
    Mod,
    Mov,
    MovLong,
    Mul,
    Mul32,
    MulN,
    Negate,
    Neq,
    NewArray,
    NewArrayWithBuffer,
    NewArrayWithBufferLong,
    NewFastArray,
    NewObject,
    NewObjectWithBuffer,
    NewObjectWithBufferAndParent,
    NewObjectWithBufferLong,
    NewObjectWithParent,
    NewTypedObjectWithBuffer,
    Not,
    PrivateIsIn,
    ProfilePoint,
    PutById,
    PutByIdLong,
    PutByIdLoose,
    PutByIdLooseLong,
    PutByIdStrict,
    PutByIdStrictLong,
    PutByVal,
    PutByValLoose,
    PutByValStrict,
    PutByValWithReceiver,
    PutGetterSetter,
    PutNewOwnById,
    PutNewOwnByIdLong,
    PutNewOwnByIdShort,
    PutNewOwnNEById,
    PutNewOwnNEByIdLong,
    PutOwnById,
    PutOwnByIdLong,
    PutOwnByIdShort,
    PutOwnByIndex,
    PutOwnByIndexL,
    PutOwnBySlotIdx,
    PutOwnBySlotIdxLong,
    PutOwnByVal,
    PutOwnGetterSetterByVal,
    PutOwnPrivateBySym,
    RShift,
    ReifyArguments,
    ReifyArgumentsLoose,
    ReifyArgumentsStrict,
    ResumeGenerator,
    Ret,
    SaveGenerator,
    SaveGeneratorLong,
    SelectObject,
    StartGenerator,
    Store16,
    Store32,
    Store8,
    StoreNPToEnvironment,
    StoreNPToEnvironmentL,
    StoreToEnvironment,
    StoreToEnvironmentL,
    StrictEq,
    StrictNeq,
    StringSwitchImm,
    Sub,
    Sub32,
    SubN,
    SwitchImm,
    Throw,
    ThrowIfEmpty,
    ThrowIfHasRestrictedGlobalProperty,
    ThrowIfThisInitialized,
    ThrowIfUndefined,
    ThrowIfUndefinedInst,
    ToInt32,
    ToNumber,
    ToNumeric,
    ToPropertyKey,
    ToUint32,
    TryGetById,
    TryGetByIdLong,
    TryPutById,
    TryPutByIdLong,
    TryPutByIdLoose,
    TryPutByIdLooseLong,
    TryPutByIdStrict,
    TryPutByIdStrictLong,
    TypeOf,
    TypeOfIs,
    TypedLoadParent,
    TypedStoreParent,
    UIntSwitchImm,
    URshift,
    Unreachable,
    // Synthetic opcodes created by the optimizer (not in BytecodeList.def)
    MethodCall,
    Phi,
}

impl OpCode {
    pub fn name(self) -> &'static str {
        match self {
            OpCode::Add => "Add",
            OpCode::Add32 => "Add32",
            OpCode::AddEmptyString => "AddEmptyString",
            OpCode::AddN => "AddN",
            OpCode::AddOwnPrivateBySym => "AddOwnPrivateBySym",
            OpCode::AddS => "AddS",
            OpCode::AsyncBreakCheck => "AsyncBreakCheck",
            OpCode::BitAnd => "BitAnd",
            OpCode::BitNot => "BitNot",
            OpCode::BitOr => "BitOr",
            OpCode::BitXor => "BitXor",
            OpCode::CacheNewObject => "CacheNewObject",
            OpCode::Call => "Call",
            OpCode::Call1 => "Call1",
            OpCode::Call2 => "Call2",
            OpCode::Call3 => "Call3",
            OpCode::Call4 => "Call4",
            OpCode::CallBuiltin => "CallBuiltin",
            OpCode::CallBuiltinLong => "CallBuiltinLong",
            OpCode::CallDirect => "CallDirect",
            OpCode::CallDirectLongIndex => "CallDirectLongIndex",
            OpCode::CallLong => "CallLong",
            OpCode::CallRequire => "CallRequire",
            OpCode::CallWithNewTarget => "CallWithNewTarget",
            OpCode::CallWithNewTargetLong => "CallWithNewTargetLong",
            OpCode::Catch => "Catch",
            OpCode::CoerceThisNS => "CoerceThisNS",
            OpCode::CompleteGenerator => "CompleteGenerator",
            OpCode::Construct => "Construct",
            OpCode::ConstructLong => "ConstructLong",
            OpCode::CreateAsyncClosure => "CreateAsyncClosure",
            OpCode::CreateAsyncClosureLongIndex => "CreateAsyncClosureLongIndex",
            OpCode::CreateBaseClass => "CreateBaseClass",
            OpCode::CreateBaseClassLongIndex => "CreateBaseClassLongIndex",
            OpCode::CreateClosure => "CreateClosure",
            OpCode::CreateClosureLongIndex => "CreateClosureLongIndex",
            OpCode::CreateDerivedClass => "CreateDerivedClass",
            OpCode::CreateDerivedClassLongIndex => "CreateDerivedClassLongIndex",
            OpCode::CreateEnvironment => "CreateEnvironment",
            OpCode::CreateFunctionEnvironment => "CreateFunctionEnvironment",
            OpCode::CreateGenerator => "CreateGenerator",
            OpCode::CreateGeneratorClosure => "CreateGeneratorClosure",
            OpCode::CreateGeneratorClosureLongIndex => "CreateGeneratorClosureLongIndex",
            OpCode::CreateGeneratorLongIndex => "CreateGeneratorLongIndex",
            OpCode::CreateInnerEnvironment => "CreateInnerEnvironment",
            OpCode::CreatePrivateName => "CreatePrivateName",
            OpCode::CreateRegExp => "CreateRegExp",
            OpCode::CreateThis => "CreateThis",
            OpCode::CreateThisForNew => "CreateThisForNew",
            OpCode::CreateThisForSuper => "CreateThisForSuper",
            OpCode::CreateTopLevelEnvironment => "CreateTopLevelEnvironment",
            OpCode::Debugger => "Debugger",
            OpCode::DebuggerCheckBreak => "DebuggerCheckBreak",
            OpCode::Dec => "Dec",
            OpCode::DeclareGlobalVar => "DeclareGlobalVar",
            OpCode::DefineOwnById => "DefineOwnById",
            OpCode::DefineOwnByIdLong => "DefineOwnByIdLong",
            OpCode::DefineOwnByIndex => "DefineOwnByIndex",
            OpCode::DefineOwnByIndexL => "DefineOwnByIndexL",
            OpCode::DefineOwnByVal => "DefineOwnByVal",
            OpCode::DefineOwnGetterSetterByVal => "DefineOwnGetterSetterByVal",
            OpCode::DefineOwnInDenseArray => "DefineOwnInDenseArray",
            OpCode::DefineOwnInDenseArrayL => "DefineOwnInDenseArrayL",
            OpCode::DelById => "DelById",
            OpCode::DelByIdLong => "DelByIdLong",
            OpCode::DelByIdLoose => "DelByIdLoose",
            OpCode::DelByIdLooseLong => "DelByIdLooseLong",
            OpCode::DelByIdStrict => "DelByIdStrict",
            OpCode::DelByIdStrictLong => "DelByIdStrictLong",
            OpCode::DelByVal => "DelByVal",
            OpCode::DelByValLoose => "DelByValLoose",
            OpCode::DelByValStrict => "DelByValStrict",
            OpCode::DirectEval => "DirectEval",
            OpCode::Div => "Div",
            OpCode::DivN => "DivN",
            OpCode::Divi32 => "Divi32",
            OpCode::Divu32 => "Divu32",
            OpCode::Eq => "Eq",
            OpCode::FastArrayAppend => "FastArrayAppend",
            OpCode::FastArrayLength => "FastArrayLength",
            OpCode::FastArrayLoad => "FastArrayLoad",
            OpCode::FastArrayPush => "FastArrayPush",
            OpCode::FastArrayStore => "FastArrayStore",
            OpCode::GetArgumentsLength => "GetArgumentsLength",
            OpCode::GetArgumentsPropByVal => "GetArgumentsPropByVal",
            OpCode::GetArgumentsPropByValLoose => "GetArgumentsPropByValLoose",
            OpCode::GetArgumentsPropByValStrict => "GetArgumentsPropByValStrict",
            OpCode::GetBuiltinClosure => "GetBuiltinClosure",
            OpCode::GetById => "GetById",
            OpCode::GetByIdLong => "GetByIdLong",
            OpCode::GetByIdShort => "GetByIdShort",
            OpCode::GetByIdWithReceiverLong => "GetByIdWithReceiverLong",
            OpCode::GetByIndex => "GetByIndex",
            OpCode::GetByVal => "GetByVal",
            OpCode::GetByValWithReceiver => "GetByValWithReceiver",
            OpCode::GetClosureEnvironment => "GetClosureEnvironment",
            OpCode::GetEnvironment => "GetEnvironment",
            OpCode::GetGlobalObject => "GetGlobalObject",
            OpCode::GetNewTarget => "GetNewTarget",
            OpCode::GetNextPName => "GetNextPName",
            OpCode::GetOwnBySlotIdx => "GetOwnBySlotIdx",
            OpCode::GetOwnBySlotIdxLong => "GetOwnBySlotIdxLong",
            OpCode::GetOwnPrivateBySym => "GetOwnPrivateBySym",
            OpCode::GetPNameList => "GetPNameList",
            OpCode::GetParentEnvironment => "GetParentEnvironment",
            OpCode::Greater => "Greater",
            OpCode::GreaterEq => "GreaterEq",
            OpCode::Inc => "Inc",
            OpCode::InstanceOf => "InstanceOf",
            OpCode::IsIn => "IsIn",
            OpCode::IteratorBegin => "IteratorBegin",
            OpCode::IteratorClose => "IteratorClose",
            OpCode::IteratorNext => "IteratorNext",
            OpCode::JEqual => "JEqual",
            OpCode::JEqualLong => "JEqualLong",
            OpCode::JGreater => "JGreater",
            OpCode::JGreaterEqual => "JGreaterEqual",
            OpCode::JGreaterEqualLong => "JGreaterEqualLong",
            OpCode::JGreaterEqualN => "JGreaterEqualN",
            OpCode::JGreaterEqualNLong => "JGreaterEqualNLong",
            OpCode::JGreaterLong => "JGreaterLong",
            OpCode::JGreaterN => "JGreaterN",
            OpCode::JGreaterNLong => "JGreaterNLong",
            OpCode::JLess => "JLess",
            OpCode::JLessEqual => "JLessEqual",
            OpCode::JLessEqualLong => "JLessEqualLong",
            OpCode::JLessEqualN => "JLessEqualN",
            OpCode::JLessEqualNLong => "JLessEqualNLong",
            OpCode::JLessLong => "JLessLong",
            OpCode::JLessN => "JLessN",
            OpCode::JLessNLong => "JLessNLong",
            OpCode::JNotEqual => "JNotEqual",
            OpCode::JNotEqualLong => "JNotEqualLong",
            OpCode::JNotGreater => "JNotGreater",
            OpCode::JNotGreaterEqual => "JNotGreaterEqual",
            OpCode::JNotGreaterEqualLong => "JNotGreaterEqualLong",
            OpCode::JNotGreaterEqualN => "JNotGreaterEqualN",
            OpCode::JNotGreaterEqualNLong => "JNotGreaterEqualNLong",
            OpCode::JNotGreaterLong => "JNotGreaterLong",
            OpCode::JNotGreaterN => "JNotGreaterN",
            OpCode::JNotGreaterNLong => "JNotGreaterNLong",
            OpCode::JNotLess => "JNotLess",
            OpCode::JNotLessEqual => "JNotLessEqual",
            OpCode::JNotLessEqualLong => "JNotLessEqualLong",
            OpCode::JNotLessEqualN => "JNotLessEqualN",
            OpCode::JNotLessEqualNLong => "JNotLessEqualNLong",
            OpCode::JNotLessLong => "JNotLessLong",
            OpCode::JNotLessN => "JNotLessN",
            OpCode::JNotLessNLong => "JNotLessNLong",
            OpCode::JStrictEqual => "JStrictEqual",
            OpCode::JStrictEqualLong => "JStrictEqualLong",
            OpCode::JStrictNotEqual => "JStrictNotEqual",
            OpCode::JStrictNotEqualLong => "JStrictNotEqualLong",
            OpCode::Jmp => "Jmp",
            OpCode::JmpBuiltinIs => "JmpBuiltinIs",
            OpCode::JmpBuiltinIsLong => "JmpBuiltinIsLong",
            OpCode::JmpBuiltinIsNot => "JmpBuiltinIsNot",
            OpCode::JmpBuiltinIsNotLong => "JmpBuiltinIsNotLong",
            OpCode::JmpFalse => "JmpFalse",
            OpCode::JmpFalseLong => "JmpFalseLong",
            OpCode::JmpLong => "JmpLong",
            OpCode::JmpTrue => "JmpTrue",
            OpCode::JmpTrueLong => "JmpTrueLong",
            OpCode::JmpTypeOfIs => "JmpTypeOfIs",
            OpCode::JmpUndefined => "JmpUndefined",
            OpCode::JmpUndefinedLong => "JmpUndefinedLong",
            OpCode::LShift => "LShift",
            OpCode::Less => "Less",
            OpCode::LessEq => "LessEq",
            OpCode::LoadConstBigInt => "LoadConstBigInt",
            OpCode::LoadConstBigIntLongIndex => "LoadConstBigIntLongIndex",
            OpCode::LoadConstDouble => "LoadConstDouble",
            OpCode::LoadConstEmpty => "LoadConstEmpty",
            OpCode::LoadConstFalse => "LoadConstFalse",
            OpCode::LoadConstInt => "LoadConstInt",
            OpCode::LoadConstNull => "LoadConstNull",
            OpCode::LoadConstString => "LoadConstString",
            OpCode::LoadConstStringLongIndex => "LoadConstStringLongIndex",
            OpCode::LoadConstTrue => "LoadConstTrue",
            OpCode::LoadConstUInt8 => "LoadConstUInt8",
            OpCode::LoadConstUndefined => "LoadConstUndefined",
            OpCode::LoadConstZero => "LoadConstZero",
            OpCode::LoadFromEnvironment => "LoadFromEnvironment",
            OpCode::LoadFromEnvironmentL => "LoadFromEnvironmentL",
            OpCode::LoadParam => "LoadParam",
            OpCode::LoadParamLong => "LoadParamLong",
            OpCode::LoadParentNoTraps => "LoadParentNoTraps",
            OpCode::LoadThisNS => "LoadThisNS",
            OpCode::Loadi16 => "Loadi16",
            OpCode::Loadi32 => "Loadi32",
            OpCode::Loadi8 => "Loadi8",
            OpCode::Loadu16 => "Loadu16",
            OpCode::Loadu32 => "Loadu32",
            OpCode::Loadu8 => "Loadu8",
            OpCode::Mod => "Mod",
            OpCode::Mov => "Mov",
            OpCode::MovLong => "MovLong",
            OpCode::Mul => "Mul",
            OpCode::Mul32 => "Mul32",
            OpCode::MulN => "MulN",
            OpCode::Negate => "Negate",
            OpCode::Neq => "Neq",
            OpCode::NewArray => "NewArray",
            OpCode::NewArrayWithBuffer => "NewArrayWithBuffer",
            OpCode::NewArrayWithBufferLong => "NewArrayWithBufferLong",
            OpCode::NewFastArray => "NewFastArray",
            OpCode::NewObject => "NewObject",
            OpCode::NewObjectWithBuffer => "NewObjectWithBuffer",
            OpCode::NewObjectWithBufferAndParent => "NewObjectWithBufferAndParent",
            OpCode::NewObjectWithBufferLong => "NewObjectWithBufferLong",
            OpCode::NewObjectWithParent => "NewObjectWithParent",
            OpCode::NewTypedObjectWithBuffer => "NewTypedObjectWithBuffer",
            OpCode::Not => "Not",
            OpCode::PrivateIsIn => "PrivateIsIn",
            OpCode::ProfilePoint => "ProfilePoint",
            OpCode::PutById => "PutById",
            OpCode::PutByIdLong => "PutByIdLong",
            OpCode::PutByIdLoose => "PutByIdLoose",
            OpCode::PutByIdLooseLong => "PutByIdLooseLong",
            OpCode::PutByIdStrict => "PutByIdStrict",
            OpCode::PutByIdStrictLong => "PutByIdStrictLong",
            OpCode::PutByVal => "PutByVal",
            OpCode::PutByValLoose => "PutByValLoose",
            OpCode::PutByValStrict => "PutByValStrict",
            OpCode::PutByValWithReceiver => "PutByValWithReceiver",
            OpCode::PutGetterSetter => "PutGetterSetter",
            OpCode::PutNewOwnById => "PutNewOwnById",
            OpCode::PutNewOwnByIdLong => "PutNewOwnByIdLong",
            OpCode::PutNewOwnByIdShort => "PutNewOwnByIdShort",
            OpCode::PutNewOwnNEById => "PutNewOwnNEById",
            OpCode::PutNewOwnNEByIdLong => "PutNewOwnNEByIdLong",
            OpCode::PutOwnById => "PutOwnById",
            OpCode::PutOwnByIdLong => "PutOwnByIdLong",
            OpCode::PutOwnByIdShort => "PutOwnByIdShort",
            OpCode::PutOwnByIndex => "PutOwnByIndex",
            OpCode::PutOwnByIndexL => "PutOwnByIndexL",
            OpCode::PutOwnBySlotIdx => "PutOwnBySlotIdx",
            OpCode::PutOwnBySlotIdxLong => "PutOwnBySlotIdxLong",
            OpCode::PutOwnByVal => "PutOwnByVal",
            OpCode::PutOwnGetterSetterByVal => "PutOwnGetterSetterByVal",
            OpCode::PutOwnPrivateBySym => "PutOwnPrivateBySym",
            OpCode::RShift => "RShift",
            OpCode::ReifyArguments => "ReifyArguments",
            OpCode::ReifyArgumentsLoose => "ReifyArgumentsLoose",
            OpCode::ReifyArgumentsStrict => "ReifyArgumentsStrict",
            OpCode::ResumeGenerator => "ResumeGenerator",
            OpCode::Ret => "Ret",
            OpCode::SaveGenerator => "SaveGenerator",
            OpCode::SaveGeneratorLong => "SaveGeneratorLong",
            OpCode::SelectObject => "SelectObject",
            OpCode::StartGenerator => "StartGenerator",
            OpCode::Store16 => "Store16",
            OpCode::Store32 => "Store32",
            OpCode::Store8 => "Store8",
            OpCode::StoreNPToEnvironment => "StoreNPToEnvironment",
            OpCode::StoreNPToEnvironmentL => "StoreNPToEnvironmentL",
            OpCode::StoreToEnvironment => "StoreToEnvironment",
            OpCode::StoreToEnvironmentL => "StoreToEnvironmentL",
            OpCode::StrictEq => "StrictEq",
            OpCode::StrictNeq => "StrictNeq",
            OpCode::StringSwitchImm => "StringSwitchImm",
            OpCode::Sub => "Sub",
            OpCode::Sub32 => "Sub32",
            OpCode::SubN => "SubN",
            OpCode::SwitchImm => "SwitchImm",
            OpCode::Throw => "Throw",
            OpCode::ThrowIfEmpty => "ThrowIfEmpty",
            OpCode::ThrowIfHasRestrictedGlobalProperty => "ThrowIfHasRestrictedGlobalProperty",
            OpCode::ThrowIfThisInitialized => "ThrowIfThisInitialized",
            OpCode::ThrowIfUndefined => "ThrowIfUndefined",
            OpCode::ThrowIfUndefinedInst => "ThrowIfUndefinedInst",
            OpCode::ToInt32 => "ToInt32",
            OpCode::ToNumber => "ToNumber",
            OpCode::ToNumeric => "ToNumeric",
            OpCode::ToPropertyKey => "ToPropertyKey",
            OpCode::ToUint32 => "ToUint32",
            OpCode::TryGetById => "TryGetById",
            OpCode::TryGetByIdLong => "TryGetByIdLong",
            OpCode::TryPutById => "TryPutById",
            OpCode::TryPutByIdLong => "TryPutByIdLong",
            OpCode::TryPutByIdLoose => "TryPutByIdLoose",
            OpCode::TryPutByIdLooseLong => "TryPutByIdLooseLong",
            OpCode::TryPutByIdStrict => "TryPutByIdStrict",
            OpCode::TryPutByIdStrictLong => "TryPutByIdStrictLong",
            OpCode::TypeOf => "TypeOf",
            OpCode::TypeOfIs => "TypeOfIs",
            OpCode::TypedLoadParent => "TypedLoadParent",
            OpCode::TypedStoreParent => "TypedStoreParent",
            OpCode::UIntSwitchImm => "UIntSwitchImm",
            OpCode::URshift => "URshift",
            OpCode::Unreachable => "Unreachable",
            OpCode::MethodCall => "MethodCall",
            OpCode::Phi => "Phi",
        }
    }
}

impl std::fmt::Display for OpCode {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_str(self.name())
    }
}

const V40_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutOwnByIdShort,
    OpCode::PutOwnById,
    OpCode::PutOwnByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutGetterSetter,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::CallDirect,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::Debugger,
    OpCode::DebuggerCheckBreak,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V41_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutOwnByIdShort,
    OpCode::PutOwnById,
    OpCode::PutOwnByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutGetterSetter,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::Debugger,
    OpCode::DebuggerCheckBreak,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V44_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutOwnByIdShort,
    OpCode::PutOwnById,
    OpCode::PutOwnByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutGetterSetter,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::Debugger,
    OpCode::DebuggerCheckBreak,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V45_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::Debugger,
    OpCode::DebuggerCheckBreak,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V46_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::Debugger,
    OpCode::DebuggerCheckBreak,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V52_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::Debugger,
    OpCode::DebuggerCheckBreak,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V59_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfUndefinedInst,
    OpCode::Debugger,
    OpCode::DebuggerCheckBreak,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V61_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfUndefinedInst,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V73_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfUndefinedInst,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V80_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfUndefinedInst,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V81_OPCODES: &[OpCode] = &[
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::Unreachable,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V83_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V84_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::Add32,
    OpCode::Sub32,
    OpCode::Mul32,
    OpCode::Divi32,
    OpCode::Divu32,
    OpCode::Loadi8,
    OpCode::Loadu8,
    OpCode::Loadi16,
    OpCode::Loadu16,
    OpCode::Loadi32,
    OpCode::Loadu32,
    OpCode::Store8,
    OpCode::Store16,
    OpCode::Store32,
];
const V85_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::Add32,
    OpCode::Sub32,
    OpCode::Mul32,
    OpCode::Divi32,
    OpCode::Divu32,
    OpCode::Loadi8,
    OpCode::Loadu8,
    OpCode::Loadi16,
    OpCode::Loadu16,
    OpCode::Loadi32,
    OpCode::Loadu32,
    OpCode::Store8,
    OpCode::Store16,
    OpCode::Store32,
];
const V87_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::Add32,
    OpCode::Sub32,
    OpCode::Mul32,
    OpCode::Divi32,
    OpCode::Divu32,
    OpCode::Loadi8,
    OpCode::Loadu8,
    OpCode::Loadi16,
    OpCode::Loadu16,
    OpCode::Loadi32,
    OpCode::Loadu32,
    OpCode::Store8,
    OpCode::Store16,
    OpCode::Store32,
];
const V90_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByValLoose,
    OpCode::GetArgumentsPropByValStrict,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArgumentsStrict,
    OpCode::ReifyArgumentsLoose,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::Add32,
    OpCode::Sub32,
    OpCode::Mul32,
    OpCode::Divi32,
    OpCode::Divu32,
    OpCode::Loadi8,
    OpCode::Loadu8,
    OpCode::Loadi16,
    OpCode::Loadu16,
    OpCode::Loadi32,
    OpCode::Loadu32,
    OpCode::Store8,
    OpCode::Store16,
    OpCode::Store32,
];
const V92_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::CreateInnerEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::ThrowIfHasRestrictedGlobalProperty,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::Add32,
    OpCode::Sub32,
    OpCode::Mul32,
    OpCode::Divi32,
    OpCode::Divu32,
    OpCode::Loadi8,
    OpCode::Loadu8,
    OpCode::Loadi16,
    OpCode::Loadu16,
    OpCode::Loadi32,
    OpCode::Loadu32,
    OpCode::Store8,
    OpCode::Store16,
    OpCode::Store32,
];
const V95_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateEnvironment,
    OpCode::CreateInnerEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::ThrowIfHasRestrictedGlobalProperty,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutById,
    OpCode::PutByIdLong,
    OpCode::TryPutById,
    OpCode::TryPutByIdLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelById,
    OpCode::DelByIdLong,
    OpCode::GetByVal,
    OpCode::PutByVal,
    OpCode::DelByVal,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallDirect,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallLong,
    OpCode::ConstructLong,
    OpCode::CallDirectLongIndex,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateGeneratorClosure,
    OpCode::CreateGeneratorClosureLongIndex,
    OpCode::CreateAsyncClosure,
    OpCode::CreateAsyncClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByVal,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArguments,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::StartGenerator,
    OpCode::ResumeGenerator,
    OpCode::CompleteGenerator,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::SaveGenerator,
    OpCode::SaveGeneratorLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::Add32,
    OpCode::Sub32,
    OpCode::Mul32,
    OpCode::Divi32,
    OpCode::Divu32,
    OpCode::Loadi8,
    OpCode::Loadu8,
    OpCode::Loadi16,
    OpCode::Loadu16,
    OpCode::Loadi32,
    OpCode::Loadu32,
    OpCode::Store8,
    OpCode::Store16,
    OpCode::Store32,
];
const V97_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::AddS,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetParentEnvironment,
    OpCode::GetEnvironment,
    OpCode::GetClosureEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateFunctionEnvironment,
    OpCode::CreateTopLevelEnvironment,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutByIdLoose,
    OpCode::PutByIdStrict,
    OpCode::PutByIdLooseLong,
    OpCode::PutByIdStrictLong,
    OpCode::TryPutByIdLoose,
    OpCode::TryPutByIdStrict,
    OpCode::TryPutByIdLooseLong,
    OpCode::TryPutByIdStrictLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutOwnBySlotIdx,
    OpCode::PutOwnBySlotIdxLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelByIdLoose,
    OpCode::DelByIdStrict,
    OpCode::DelByIdLooseLong,
    OpCode::DelByIdStrictLong,
    OpCode::GetByVal,
    OpCode::GetByIndex,
    OpCode::PutByValLoose,
    OpCode::PutByValStrict,
    OpCode::DelByValLoose,
    OpCode::DelByValStrict,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallWithNewTarget,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallWithNewTargetLong,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByValLoose,
    OpCode::GetArgumentsPropByValStrict,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArgumentsStrict,
    OpCode::ReifyArgumentsLoose,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V98_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::AddS,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::GetParentEnvironment,
    OpCode::GetEnvironment,
    OpCode::GetClosureEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::CreateFunctionEnvironment,
    OpCode::CreateTopLevelEnvironment,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutByIdLoose,
    OpCode::PutByIdStrict,
    OpCode::PutByIdLooseLong,
    OpCode::PutByIdStrictLong,
    OpCode::TryPutByIdLoose,
    OpCode::TryPutByIdStrict,
    OpCode::TryPutByIdLooseLong,
    OpCode::TryPutByIdStrictLong,
    OpCode::PutNewOwnByIdShort,
    OpCode::PutNewOwnById,
    OpCode::PutNewOwnByIdLong,
    OpCode::PutOwnBySlotIdx,
    OpCode::PutOwnBySlotIdxLong,
    OpCode::GetOwnBySlotIdx,
    OpCode::GetOwnBySlotIdxLong,
    OpCode::PutNewOwnNEById,
    OpCode::PutNewOwnNEByIdLong,
    OpCode::PutOwnByIndex,
    OpCode::PutOwnByIndexL,
    OpCode::PutOwnByVal,
    OpCode::DelByIdLoose,
    OpCode::DelByIdStrict,
    OpCode::DelByIdLooseLong,
    OpCode::DelByIdStrictLong,
    OpCode::GetByVal,
    OpCode::GetByIndex,
    OpCode::PutByValLoose,
    OpCode::PutByValStrict,
    OpCode::DelByValLoose,
    OpCode::DelByValStrict,
    OpCode::PutOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallWithNewTarget,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallWithNewTargetLong,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThis,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::GetArgumentsPropByValLoose,
    OpCode::GetArgumentsPropByValStrict,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArgumentsStrict,
    OpCode::ReifyArgumentsLoose,
    OpCode::CreateRegExp,
    OpCode::SwitchImm,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::TypedLoadParent,
    OpCode::TypedStoreParent,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterN,
    OpCode::JGreaterNLong,
    OpCode::JNotGreaterN,
    OpCode::JNotGreaterNLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JGreaterEqualN,
    OpCode::JGreaterEqualNLong,
    OpCode::JNotGreaterEqualN,
    OpCode::JNotGreaterEqualNLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
];
const V99_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObjectWithBufferAndParent,
    OpCode::NewTypedObjectWithBuffer,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::NewFastArray,
    OpCode::FastArrayLength,
    OpCode::FastArrayLoad,
    OpCode::FastArrayStore,
    OpCode::FastArrayPush,
    OpCode::FastArrayAppend,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::AddS,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::PrivateIsIn,
    OpCode::TypeOfIs,
    OpCode::GetParentEnvironment,
    OpCode::GetEnvironment,
    OpCode::GetClosureEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::LoadParentNoTraps,
    OpCode::CreateFunctionEnvironment,
    OpCode::CreateTopLevelEnvironment,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::GetByIdWithReceiverLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutByIdLoose,
    OpCode::PutByIdStrict,
    OpCode::PutByIdLooseLong,
    OpCode::PutByIdStrictLong,
    OpCode::TryPutByIdLoose,
    OpCode::TryPutByIdStrict,
    OpCode::TryPutByIdLooseLong,
    OpCode::TryPutByIdStrictLong,
    OpCode::PutOwnBySlotIdx,
    OpCode::PutOwnBySlotIdxLong,
    OpCode::GetOwnBySlotIdx,
    OpCode::GetOwnBySlotIdxLong,
    OpCode::DefineOwnById,
    OpCode::DefineOwnByIdLong,
    OpCode::DefineOwnByIndex,
    OpCode::DefineOwnByIndexL,
    OpCode::DefineOwnInDenseArray,
    OpCode::DefineOwnInDenseArrayL,
    OpCode::DefineOwnByVal,
    OpCode::GetByVal,
    OpCode::GetByIndex,
    OpCode::GetByValWithReceiver,
    OpCode::PutByValLoose,
    OpCode::PutByValStrict,
    OpCode::PutByValWithReceiver,
    OpCode::DelByVal,
    OpCode::AddOwnPrivateBySym,
    OpCode::GetOwnPrivateBySym,
    OpCode::PutOwnPrivateBySym,
    OpCode::DefineOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallWithNewTarget,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallWithNewTargetLong,
    OpCode::CallRequire,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::ThrowIfUndefined,
    OpCode::ThrowIfThisInitialized,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateBaseClass,
    OpCode::CreateBaseClassLongIndex,
    OpCode::CreateDerivedClass,
    OpCode::CreateDerivedClassLongIndex,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThisForNew,
    OpCode::CreateThisForSuper,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::ToUint32,
    OpCode::AddEmptyString,
    OpCode::CreatePrivateName,
    OpCode::GetArgumentsPropByValLoose,
    OpCode::GetArgumentsPropByValStrict,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArgumentsStrict,
    OpCode::ReifyArgumentsLoose,
    OpCode::ToPropertyKey,
    OpCode::CreateRegExp,
    OpCode::UIntSwitchImm,
    OpCode::StringSwitchImm,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::TypedLoadParent,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JmpTypeOfIs,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::JmpBuiltinIs,
    OpCode::JmpBuiltinIsLong,
    OpCode::JmpBuiltinIsNot,
    OpCode::JmpBuiltinIsNotLong,
];
const V98L_OPCODES: &[OpCode] = &[
    OpCode::Unreachable,
    OpCode::NewObjectWithBuffer,
    OpCode::NewObjectWithBufferLong,
    OpCode::NewObjectWithBufferAndParent,
    OpCode::NewObject,
    OpCode::NewObjectWithParent,
    OpCode::NewArrayWithBuffer,
    OpCode::NewArrayWithBufferLong,
    OpCode::NewArray,
    OpCode::NewFastArray,
    OpCode::FastArrayLength,
    OpCode::FastArrayLoad,
    OpCode::FastArrayStore,
    OpCode::FastArrayPush,
    OpCode::FastArrayAppend,
    OpCode::CacheNewObject,
    OpCode::Mov,
    OpCode::MovLong,
    OpCode::Negate,
    OpCode::Not,
    OpCode::BitNot,
    OpCode::TypeOf,
    OpCode::Eq,
    OpCode::StrictEq,
    OpCode::Neq,
    OpCode::StrictNeq,
    OpCode::Less,
    OpCode::LessEq,
    OpCode::Greater,
    OpCode::GreaterEq,
    OpCode::Add,
    OpCode::AddN,
    OpCode::AddS,
    OpCode::Mul,
    OpCode::MulN,
    OpCode::Div,
    OpCode::DivN,
    OpCode::Mod,
    OpCode::Sub,
    OpCode::SubN,
    OpCode::LShift,
    OpCode::RShift,
    OpCode::URshift,
    OpCode::BitAnd,
    OpCode::BitXor,
    OpCode::BitOr,
    OpCode::Inc,
    OpCode::Dec,
    OpCode::InstanceOf,
    OpCode::IsIn,
    OpCode::PrivateIsIn,
    OpCode::TypeOfIs,
    OpCode::GetParentEnvironment,
    OpCode::GetEnvironment,
    OpCode::GetClosureEnvironment,
    OpCode::StoreToEnvironment,
    OpCode::StoreToEnvironmentL,
    OpCode::StoreNPToEnvironment,
    OpCode::StoreNPToEnvironmentL,
    OpCode::LoadFromEnvironment,
    OpCode::LoadFromEnvironmentL,
    OpCode::GetGlobalObject,
    OpCode::GetNewTarget,
    OpCode::LoadParentNoTraps,
    OpCode::CreateFunctionEnvironment,
    OpCode::CreateTopLevelEnvironment,
    OpCode::CreateEnvironment,
    OpCode::DeclareGlobalVar,
    OpCode::GetByIdShort,
    OpCode::GetById,
    OpCode::GetByIdLong,
    OpCode::GetByIdWithReceiverLong,
    OpCode::TryGetById,
    OpCode::TryGetByIdLong,
    OpCode::PutByIdLoose,
    OpCode::PutByIdStrict,
    OpCode::PutByIdLooseLong,
    OpCode::PutByIdStrictLong,
    OpCode::TryPutByIdLoose,
    OpCode::TryPutByIdStrict,
    OpCode::TryPutByIdLooseLong,
    OpCode::TryPutByIdStrictLong,
    OpCode::PutOwnBySlotIdx,
    OpCode::PutOwnBySlotIdxLong,
    OpCode::GetOwnBySlotIdx,
    OpCode::GetOwnBySlotIdxLong,
    OpCode::DefineOwnById,
    OpCode::DefineOwnByIdLong,
    OpCode::DefineOwnByIndex,
    OpCode::DefineOwnByIndexL,
    OpCode::DefineOwnInDenseArray,
    OpCode::DefineOwnInDenseArrayL,
    OpCode::DefineOwnByVal,
    OpCode::GetByVal,
    OpCode::GetByIndex,
    OpCode::GetByValWithReceiver,
    OpCode::PutByValLoose,
    OpCode::PutByValStrict,
    OpCode::PutByValWithReceiver,
    OpCode::DelByVal,
    OpCode::AddOwnPrivateBySym,
    OpCode::GetOwnPrivateBySym,
    OpCode::PutOwnPrivateBySym,
    OpCode::DefineOwnGetterSetterByVal,
    OpCode::GetPNameList,
    OpCode::GetNextPName,
    OpCode::Call,
    OpCode::Construct,
    OpCode::Call1,
    OpCode::CallWithNewTarget,
    OpCode::Call2,
    OpCode::Call3,
    OpCode::Call4,
    OpCode::CallWithNewTargetLong,
    OpCode::CallRequire,
    OpCode::CallBuiltin,
    OpCode::CallBuiltinLong,
    OpCode::GetBuiltinClosure,
    OpCode::Ret,
    OpCode::Catch,
    OpCode::DirectEval,
    OpCode::Throw,
    OpCode::ThrowIfEmpty,
    OpCode::ThrowIfUndefined,
    OpCode::ThrowIfThisInitialized,
    OpCode::Debugger,
    OpCode::AsyncBreakCheck,
    OpCode::ProfilePoint,
    OpCode::CreateBaseClass,
    OpCode::CreateBaseClassLongIndex,
    OpCode::CreateDerivedClass,
    OpCode::CreateDerivedClassLongIndex,
    OpCode::CreateClosure,
    OpCode::CreateClosureLongIndex,
    OpCode::CreateThisForNew,
    OpCode::CreateThisForSuper,
    OpCode::SelectObject,
    OpCode::LoadParam,
    OpCode::LoadParamLong,
    OpCode::LoadConstUInt8,
    OpCode::LoadConstInt,
    OpCode::LoadConstDouble,
    OpCode::LoadConstBigInt,
    OpCode::LoadConstBigIntLongIndex,
    OpCode::LoadConstString,
    OpCode::LoadConstStringLongIndex,
    OpCode::LoadConstEmpty,
    OpCode::LoadConstUndefined,
    OpCode::LoadConstNull,
    OpCode::LoadConstTrue,
    OpCode::LoadConstFalse,
    OpCode::LoadConstZero,
    OpCode::CoerceThisNS,
    OpCode::LoadThisNS,
    OpCode::ToNumber,
    OpCode::ToNumeric,
    OpCode::ToInt32,
    OpCode::AddEmptyString,
    OpCode::CreatePrivateName,
    OpCode::GetArgumentsPropByValLoose,
    OpCode::GetArgumentsPropByValStrict,
    OpCode::GetArgumentsLength,
    OpCode::ReifyArgumentsStrict,
    OpCode::ReifyArgumentsLoose,
    OpCode::ToPropertyKey,
    OpCode::CreateRegExp,
    OpCode::UIntSwitchImm,
    OpCode::StringSwitchImm,
    OpCode::CreateGenerator,
    OpCode::CreateGeneratorLongIndex,
    OpCode::IteratorBegin,
    OpCode::IteratorNext,
    OpCode::IteratorClose,
    OpCode::TypedLoadParent,
    OpCode::Jmp,
    OpCode::JmpLong,
    OpCode::JmpTrue,
    OpCode::JmpTrueLong,
    OpCode::JmpFalse,
    OpCode::JmpFalseLong,
    OpCode::JmpUndefined,
    OpCode::JmpUndefinedLong,
    OpCode::JmpTypeOfIs,
    OpCode::JLess,
    OpCode::JLessLong,
    OpCode::JNotLess,
    OpCode::JNotLessLong,
    OpCode::JLessN,
    OpCode::JLessNLong,
    OpCode::JNotLessN,
    OpCode::JNotLessNLong,
    OpCode::JLessEqual,
    OpCode::JLessEqualLong,
    OpCode::JNotLessEqual,
    OpCode::JNotLessEqualLong,
    OpCode::JLessEqualN,
    OpCode::JLessEqualNLong,
    OpCode::JNotLessEqualN,
    OpCode::JNotLessEqualNLong,
    OpCode::JGreater,
    OpCode::JGreaterLong,
    OpCode::JNotGreater,
    OpCode::JNotGreaterLong,
    OpCode::JGreaterEqual,
    OpCode::JGreaterEqualLong,
    OpCode::JNotGreaterEqual,
    OpCode::JNotGreaterEqualLong,
    OpCode::JEqual,
    OpCode::JEqualLong,
    OpCode::JNotEqual,
    OpCode::JNotEqualLong,
    OpCode::JStrictEqual,
    OpCode::JStrictEqualLong,
    OpCode::JStrictNotEqual,
    OpCode::JStrictNotEqualLong,
    OpCode::JmpBuiltinIs,
    OpCode::JmpBuiltinIsLong,
    OpCode::JmpBuiltinIsNot,
    OpCode::JmpBuiltinIsNotLong,
];

pub fn get_version_opcodes(version: u32) -> crate::Result<&'static [OpCode]> {
    Ok(match version {
        40 => V40_OPCODES,
        41 => V41_OPCODES,
        42 => V41_OPCODES, // v42 same as v41
        43 => V41_OPCODES, // v43 same as v41
        44 => V44_OPCODES,
        45 => V45_OPCODES,
        46 => V46_OPCODES,
        47 => V46_OPCODES, // v47 same as v46
        48 => V46_OPCODES, // v48 same as v46
        49 => V46_OPCODES, // v49 same as v46
        50 => V46_OPCODES, // v50 same as v46
        51 => V46_OPCODES, // v51 same as v46
        52 => V52_OPCODES,
        53 => V52_OPCODES, // v53 same as v52
        54 => V52_OPCODES, // v54 same as v52
        55 => V52_OPCODES, // v55 same as v52
        56 => V52_OPCODES, // v56 same as v52
        57 => V52_OPCODES, // v57 same as v52
        58 => V52_OPCODES, // v58 same as v52
        59 => V59_OPCODES,
        60 => V59_OPCODES, // v60 same as v59
        61 => V61_OPCODES,
        62 => V61_OPCODES, // v62 same as v61
        63 => V61_OPCODES, // v63 same as v61
        64 => V61_OPCODES, // v64 same as v61
        65 => V61_OPCODES, // v65 same as v61
        66 => V61_OPCODES, // v66 same as v61
        67 => V61_OPCODES, // v67 same as v61
        68 => V61_OPCODES, // v68 same as v61
        69 => V61_OPCODES, // v69 same as v61
        70 => V61_OPCODES, // v70 same as v61
        71 => V61_OPCODES, // v71 same as v61
        72 => V61_OPCODES, // v72 same as v61
        73 => V73_OPCODES,
        74 => V73_OPCODES, // v74 same as v73
        75 => V73_OPCODES, // v75 same as v73
        76 => V73_OPCODES, // v76 same as v73
        77 => V73_OPCODES, // v77 same as v73
        78 => V73_OPCODES, // v78 same as v73
        79 => V73_OPCODES, // v79 same as v73
        80 => V80_OPCODES,
        81 => V81_OPCODES,
        82 => V81_OPCODES, // v82 same as v81
        83 => V83_OPCODES,
        84 => V84_OPCODES,
        85 => V85_OPCODES,
        86 => V85_OPCODES, // v86 same as v85
        87 => V87_OPCODES,
        88 => V87_OPCODES, // v88 same as v87
        89 => V87_OPCODES, // v89 same as v87
        90 => V90_OPCODES,
        91 => V87_OPCODES, // v91 same as v87
        92 => V92_OPCODES,
        93 => V87_OPCODES, // v93 same as v87
        94 => V92_OPCODES, // v94 same as v92
        95 => V95_OPCODES,
        96 => V95_OPCODES, // v96 same as v95
        97 => V97_OPCODES,
        98 => V98_OPCODES,
        99 => V99_OPCODES,
        100 => V99_OPCODES, // v100 same as v99
        crate::parser::V98_LATE => V98L_OPCODES,
        _ => return Err(crate::HermesError::UnsupportedVersion { observed: version, supported_min: crate::header::MIN_SUPPORTED_VERSION, supported_max: crate::header::MAX_SUPPORTED_VERSION }),
    })
}

// v40: 158 opcodes (commit 01deee713)
const V40_SIZES: &[u8] = &[
    10, 14, 2, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 4, 7, 5, 7,
    4, 4, 4, 8, 5, 6, 4, 4, 5, 7, 7, 7, 4, 2, 2, 3, 2, 1, 1, 3, 1, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4,
    6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 2, 5, 3, 6, 3, 6, 3, 6, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7,
];
const V40_STR_OPS: &[(u8, u8, u8)] = &[
    (46, 1, 4),
    (47, 4, 1),
    (48, 4, 2),
    (49, 4, 4),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 3, 1),
    (57, 3, 2),
    (58, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 2, 4),
    (93, 2, 2),
    (94, 2, 4),
    (108, 6, 4),
];
const V40_CALL_OPS: &[(u8, u8, u8)] = &[(71, 3, 2), (74, 3, 4)];
const V40_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutOwnByIdShort",
    "PutOwnById",
    "PutOwnByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutGetterSetter",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "CallDirect",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "Debugger",
    "DebuggerCheckBreak",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v41: 162 opcodes (commit cbb5ee0c0)
const V41_SIZES: &[u8] = &[
    10, 14, 2, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 4, 7, 5, 7,
    4, 4, 4, 8, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 1, 1, 3, 1, 5, 7, 4, 4, 3, 6, 3,
    6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 2, 5, 3, 6, 3, 6, 3, 6, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7,
];
const V41_STR_OPS: &[(u8, u8, u8)] = &[
    (46, 1, 4),
    (47, 4, 1),
    (48, 4, 2),
    (49, 4, 4),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 3, 1),
    (57, 3, 2),
    (58, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 2, 4),
    (97, 2, 2),
    (98, 2, 4),
    (112, 6, 4),
];
const V41_CALL_OPS: &[(u8, u8, u8)] = &[(72, 3, 2), (78, 3, 4)];
const V41_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutOwnByIdShort",
    "PutOwnById",
    "PutOwnByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutGetterSetter",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "Debugger",
    "DebuggerCheckBreak",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v44: 163 opcodes (commit ea9d1bba9)
const V44_SIZES: &[u8] = &[
    10, 14, 2, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 4, 7, 5,
    7, 4, 4, 4, 8, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 1, 1, 3, 1, 5, 7, 4, 4, 3, 6,
    3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 2, 5, 3, 6, 3, 6, 3, 6, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7,
];
const V44_STR_OPS: &[(u8, u8, u8)] = &[
    (47, 1, 4),
    (48, 4, 1),
    (49, 4, 2),
    (50, 4, 4),
    (51, 4, 2),
    (52, 4, 4),
    (53, 4, 2),
    (54, 4, 4),
    (55, 4, 2),
    (56, 4, 4),
    (57, 3, 1),
    (58, 3, 2),
    (59, 3, 4),
    (62, 3, 2),
    (63, 3, 4),
    (67, 2, 4),
    (98, 2, 2),
    (99, 2, 4),
    (113, 6, 4),
];
const V44_CALL_OPS: &[(u8, u8, u8)] = &[(73, 3, 2), (79, 3, 4)];
const V44_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutOwnByIdShort",
    "PutOwnById",
    "PutOwnByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutGetterSetter",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "Debugger",
    "DebuggerCheckBreak",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v45: 166 opcodes (commit c334f7467)
const V45_SIZES: &[u8] = &[
    10, 14, 2, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7, 4,
    7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 1, 1, 3, 1, 5, 7, 4,
    4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 2, 5, 3, 6, 3, 6, 3, 6,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7,
];
const V45_STR_OPS: &[(u8, u8, u8)] = &[
    (47, 1, 4),
    (48, 4, 1),
    (49, 4, 2),
    (50, 4, 4),
    (51, 4, 2),
    (52, 4, 4),
    (53, 4, 2),
    (54, 4, 4),
    (55, 4, 2),
    (56, 4, 4),
    (57, 3, 1),
    (58, 3, 2),
    (59, 3, 4),
    (60, 3, 2),
    (61, 3, 4),
    (65, 3, 2),
    (66, 3, 4),
    (101, 2, 2),
    (102, 2, 4),
    (116, 6, 4),
];
const V45_CALL_OPS: &[(u8, u8, u8)] = &[(76, 3, 2), (82, 3, 4)];
const V45_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "Debugger",
    "DebuggerCheckBreak",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v46: 167 opcodes (commit 640e37f3d)
const V46_SIZES: &[u8] = &[
    10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7,
    4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 1, 1, 3, 1, 5, 7,
    4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 2, 5, 3, 6, 3, 6, 3,
    6, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V46_STR_OPS: &[(u8, u8, u8)] = &[
    (48, 1, 4),
    (49, 4, 1),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 4, 2),
    (57, 4, 4),
    (58, 3, 1),
    (59, 3, 2),
    (60, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (102, 2, 2),
    (103, 2, 4),
    (117, 6, 4),
];
const V46_CALL_OPS: &[(u8, u8, u8)] = &[(77, 3, 2), (83, 3, 4)];
const V46_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "Debugger",
    "DebuggerCheckBreak",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v52: 176 opcodes (commit fcf1a6b28)
const V52_SIZES: &[u8] = &[
    10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7,
    4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 1, 1, 3, 1, 5, 7,
    5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 1, 3, 1, 5, 7,
    2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V52_STR_OPS: &[(u8, u8, u8)] = &[
    (48, 1, 4),
    (49, 4, 1),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 4, 2),
    (57, 4, 4),
    (58, 3, 1),
    (59, 3, 2),
    (60, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (104, 2, 2),
    (105, 2, 4),
    (119, 6, 4),
];
const V52_CALL_OPS: &[(u8, u8, u8)] = &[(77, 3, 2), (83, 3, 4)];
const V52_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "Debugger",
    "DebuggerCheckBreak",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v59: 177 opcodes (commit v0.1.0)
const V59_SIZES: &[u8] = &[
    10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7,
    4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 2, 1, 1, 3, 1, 5,
    7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 1, 3, 1, 5,
    7, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V59_STR_OPS: &[(u8, u8, u8)] = &[
    (48, 1, 4),
    (49, 4, 1),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 4, 2),
    (57, 4, 4),
    (58, 3, 1),
    (59, 3, 2),
    (60, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (105, 2, 2),
    (106, 2, 4),
    (120, 6, 4),
];
const V59_CALL_OPS: &[(u8, u8, u8)] = &[(77, 3, 2), (83, 3, 4)];
const V59_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfUndefinedInst",
    "Debugger",
    "DebuggerCheckBreak",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v61: 177 opcodes (commit 2ea89f022)
const V61_SIZES: &[u8] = &[
    10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7,
    4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 2, 1, 1, 3, 1, 5,
    7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 1, 3, 1, 5,
    7, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V61_STR_OPS: &[(u8, u8, u8)] = &[
    (48, 1, 4),
    (49, 4, 1),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 4, 2),
    (57, 4, 4),
    (58, 3, 1),
    (59, 3, 2),
    (60, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (105, 2, 2),
    (106, 2, 4),
    (120, 6, 4),
];
const V61_CALL_OPS: &[(u8, u8, u8)] = &[(77, 3, 2), (83, 3, 4)];
const V61_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfUndefinedInst",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v73: 180 opcodes (commit ecded4d4a)
const V73_SIZES: &[u8] = &[
    10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7,
    4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 2, 2, 3, 2, 2, 1, 1, 3, 1, 5,
    7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 1, 3, 1, 5,
    7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V73_STR_OPS: &[(u8, u8, u8)] = &[
    (48, 1, 4),
    (49, 4, 1),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 4, 2),
    (57, 4, 4),
    (58, 3, 1),
    (59, 3, 2),
    (60, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (105, 2, 2),
    (106, 2, 4),
    (120, 6, 4),
];
const V73_CALL_OPS: &[(u8, u8, u8)] = &[(77, 3, 2), (83, 3, 4)];
const V73_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfUndefinedInst",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v80: 181 opcodes (commit e70045d84)
const V80_SIZES: &[u8] = &[
    10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7,
    4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 2, 2, 3, 2, 2, 1, 1, 3, 1,
    5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14, 18, 1, 3, 1,
    5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V80_STR_OPS: &[(u8, u8, u8)] = &[
    (48, 1, 4),
    (49, 4, 1),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 4, 2),
    (57, 4, 4),
    (58, 3, 1),
    (59, 3, 2),
    (60, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (106, 2, 2),
    (107, 2, 4),
    (121, 6, 4),
];
const V80_CALL_OPS: &[(u8, u8, u8)] = &[(77, 3, 2), (83, 3, 4)];
const V80_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfUndefinedInst",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v81: 185 opcodes (commit 7828e35c2)
const V81_SIZES: &[u8] = &[
    10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5, 7,
    4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 3, 2, 3, 1, 1, 3,
    1, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14,
    18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V81_STR_OPS: &[(u8, u8, u8)] = &[
    (48, 1, 4),
    (49, 4, 1),
    (50, 4, 2),
    (51, 4, 4),
    (52, 4, 2),
    (53, 4, 4),
    (54, 4, 2),
    (55, 4, 4),
    (56, 4, 2),
    (57, 4, 4),
    (58, 3, 1),
    (59, 3, 2),
    (60, 3, 4),
    (61, 3, 2),
    (62, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (109, 2, 2),
    (110, 2, 4),
    (125, 6, 4),
];
const V81_CALL_OPS: &[(u8, u8, u8)] = &[(77, 3, 2), (83, 3, 4)];
const V81_NAMES: &[&str] = &[
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "Unreachable",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v83: 185 opcodes (commit 322ab5f90)
const V83_SIZES: &[u8] = &[
    1, 10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5,
    7, 4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 3, 2, 3, 1, 1,
    3, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14,
    18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V83_STR_OPS: &[(u8, u8, u8)] = &[
    (49, 1, 4),
    (50, 4, 1),
    (51, 4, 2),
    (52, 4, 4),
    (53, 4, 2),
    (54, 4, 4),
    (55, 4, 2),
    (56, 4, 4),
    (57, 4, 2),
    (58, 4, 4),
    (59, 3, 1),
    (60, 3, 2),
    (61, 3, 4),
    (62, 3, 2),
    (63, 3, 4),
    (67, 3, 2),
    (68, 3, 4),
    (109, 2, 2),
    (110, 2, 4),
    (125, 6, 4),
];
const V83_CALL_OPS: &[(u8, u8, u8)] = &[(78, 3, 2), (84, 3, 4)];
const V83_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v84: 199 opcodes (commit v0.9.0)
const V84_SIZES: &[u8] = &[
    1, 10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5, 7, 5,
    7, 4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 3, 2, 3, 1, 1,
    3, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3, 2, 14,
    18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
];
const V84_STR_OPS: &[(u8, u8, u8)] = &[
    (49, 1, 4),
    (50, 4, 1),
    (51, 4, 2),
    (52, 4, 4),
    (53, 4, 2),
    (54, 4, 4),
    (55, 4, 2),
    (56, 4, 4),
    (57, 4, 2),
    (58, 4, 4),
    (59, 3, 1),
    (60, 3, 2),
    (61, 3, 4),
    (62, 3, 2),
    (63, 3, 4),
    (67, 3, 2),
    (68, 3, 4),
    (109, 2, 2),
    (110, 2, 4),
    (125, 6, 4),
];
const V84_CALL_OPS: &[(u8, u8, u8)] = &[(78, 3, 2), (84, 3, 4)];
const V84_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "Add32",
    "Sub32",
    "Mul32",
    "Divi32",
    "Divu32",
    "Loadi8",
    "Loadu8",
    "Loadi16",
    "Loadu16",
    "Loadi32",
    "Loadu32",
    "Store8",
    "Store16",
    "Store32",
];

// v85: 201 opcodes (commit b74eb2d5b)
const V85_SIZES: &[u8] = &[
    1, 10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5,
    7, 5, 7, 4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 3, 2, 3,
    1, 1, 3, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 4, 3,
    2, 14, 18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
];
const V85_STR_OPS: &[(u8, u8, u8)] = &[
    (51, 1, 4),
    (52, 4, 1),
    (53, 4, 2),
    (54, 4, 4),
    (55, 4, 2),
    (56, 4, 4),
    (57, 4, 2),
    (58, 4, 4),
    (59, 4, 2),
    (60, 4, 4),
    (61, 3, 1),
    (62, 3, 2),
    (63, 3, 4),
    (64, 3, 2),
    (65, 3, 4),
    (69, 3, 2),
    (70, 3, 4),
    (111, 2, 2),
    (112, 2, 4),
    (127, 6, 4),
];
const V85_CALL_OPS: &[(u8, u8, u8)] = &[(80, 3, 2), (86, 3, 4)];
const V85_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "Add32",
    "Sub32",
    "Mul32",
    "Divi32",
    "Divu32",
    "Loadi8",
    "Loadu8",
    "Loadi16",
    "Loadu16",
    "Loadi32",
    "Loadu32",
    "Store8",
    "Store16",
    "Store32",
];

// v87: 204 opcodes (commit 41752c658)
const V87_SIZES: &[u8] = &[
    1, 10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5,
    7, 5, 7, 4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 3, 2, 3,
    1, 1, 3, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3,
    3, 4, 3, 2, 14, 18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
];
const V87_STR_OPS: &[(u8, u8, u8)] = &[
    (51, 1, 4),
    (52, 4, 1),
    (53, 4, 2),
    (54, 4, 4),
    (55, 4, 2),
    (56, 4, 4),
    (57, 4, 2),
    (58, 4, 4),
    (59, 4, 2),
    (60, 4, 4),
    (61, 3, 1),
    (62, 3, 2),
    (63, 3, 4),
    (64, 3, 2),
    (65, 3, 4),
    (69, 3, 2),
    (70, 3, 4),
    (113, 2, 2),
    (114, 2, 4),
    (130, 6, 4),
];
const V87_CALL_OPS: &[(u8, u8, u8)] = &[(80, 3, 2), (86, 3, 4)];
const V87_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "Add32",
    "Sub32",
    "Mul32",
    "Divi32",
    "Divu32",
    "Loadi8",
    "Loadu8",
    "Loadi16",
    "Loadu16",
    "Loadi32",
    "Loadu32",
    "Store8",
    "Store16",
    "Store32",
];

// v90: 206 opcodes (commit 906b5cff3)
const V90_SIZES: &[u8] = &[
    1, 10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8, 4, 5,
    7, 5, 7, 4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 3, 2, 3,
    1, 1, 3, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3,
    3, 4, 4, 3, 2, 2, 14, 18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
];
const V90_STR_OPS: &[(u8, u8, u8)] = &[
    (51, 1, 4),
    (52, 4, 1),
    (53, 4, 2),
    (54, 4, 4),
    (55, 4, 2),
    (56, 4, 4),
    (57, 4, 2),
    (58, 4, 4),
    (59, 4, 2),
    (60, 4, 4),
    (61, 3, 1),
    (62, 3, 2),
    (63, 3, 4),
    (64, 3, 2),
    (65, 3, 4),
    (69, 3, 2),
    (70, 3, 4),
    (113, 2, 2),
    (114, 2, 4),
    (132, 6, 4),
];
const V90_CALL_OPS: &[(u8, u8, u8)] = &[(80, 3, 2), (86, 3, 4)];
const V90_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByValLoose",
    "GetArgumentsPropByValStrict",
    "GetArgumentsLength",
    "ReifyArgumentsStrict",
    "ReifyArgumentsLoose",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "Add32",
    "Sub32",
    "Mul32",
    "Divi32",
    "Divu32",
    "Loadi8",
    "Loadu8",
    "Loadi16",
    "Loadu16",
    "Loadi32",
    "Loadu32",
    "Store8",
    "Store16",
    "Store32",
];

// v92: 206 opcodes (commit b544ff4a5)
const V92_SIZES: &[u8] = &[
    1, 10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 7, 5, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8,
    4, 5, 7, 5, 7, 4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 3,
    2, 3, 1, 1, 3, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3,
    3, 3, 3, 4, 3, 2, 14, 18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
];
const V92_STR_OPS: &[(u8, u8, u8)] = &[
    (52, 1, 4),
    (53, 1, 4),
    (54, 4, 1),
    (55, 4, 2),
    (56, 4, 4),
    (57, 4, 2),
    (58, 4, 4),
    (59, 4, 2),
    (60, 4, 4),
    (61, 4, 2),
    (62, 4, 4),
    (63, 3, 1),
    (64, 3, 2),
    (65, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (71, 3, 2),
    (72, 3, 4),
    (115, 2, 2),
    (116, 2, 4),
    (132, 6, 4),
];
const V92_CALL_OPS: &[(u8, u8, u8)] = &[(82, 3, 2), (88, 3, 4)];
const V92_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "CreateInnerEnvironment",
    "DeclareGlobalVar",
    "ThrowIfHasRestrictedGlobalProperty",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "Add32",
    "Sub32",
    "Mul32",
    "Divi32",
    "Divu32",
    "Loadi8",
    "Loadu8",
    "Loadi16",
    "Loadu16",
    "Loadi32",
    "Loadu32",
    "Store8",
    "Store16",
    "Store32",
];

// v95: 206 opcodes (commit f6b56d334)
const V95_SIZES: &[u8] = &[
    1, 10, 14, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 2, 7, 5, 5, 5, 6, 8, 6, 8, 6, 8, 6, 8,
    4, 5, 7, 5, 7, 4, 7, 5, 5, 7, 4, 4, 4, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 7, 7, 7, 4, 7, 3, 2, 2, 4,
    2, 3, 1, 1, 3, 5, 7, 5, 7, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3,
    3, 3, 3, 4, 3, 2, 14, 18, 1, 3, 1, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6, 2, 5, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4,
    7, 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
];
const V95_STR_OPS: &[(u8, u8, u8)] = &[
    (52, 1, 4),
    (53, 1, 4),
    (54, 4, 1),
    (55, 4, 2),
    (56, 4, 4),
    (57, 4, 2),
    (58, 4, 4),
    (59, 4, 2),
    (60, 4, 4),
    (61, 4, 2),
    (62, 4, 4),
    (63, 3, 1),
    (64, 3, 2),
    (65, 3, 4),
    (66, 3, 2),
    (67, 3, 4),
    (71, 3, 2),
    (72, 3, 4),
    (115, 2, 2),
    (116, 2, 4),
    (132, 6, 4),
];
const V95_CALL_OPS: &[(u8, u8, u8)] = &[(82, 3, 2), (88, 3, 4)];
const V95_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "GetEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateEnvironment",
    "CreateInnerEnvironment",
    "DeclareGlobalVar",
    "ThrowIfHasRestrictedGlobalProperty",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutById",
    "PutByIdLong",
    "TryPutById",
    "TryPutByIdLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelById",
    "DelByIdLong",
    "GetByVal",
    "PutByVal",
    "DelByVal",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallDirect",
    "Call2",
    "Call3",
    "Call4",
    "CallLong",
    "ConstructLong",
    "CallDirectLongIndex",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateGeneratorClosure",
    "CreateGeneratorClosureLongIndex",
    "CreateAsyncClosure",
    "CreateAsyncClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByVal",
    "GetArgumentsLength",
    "ReifyArguments",
    "CreateRegExp",
    "SwitchImm",
    "StartGenerator",
    "ResumeGenerator",
    "CompleteGenerator",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "SaveGenerator",
    "SaveGeneratorLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "Add32",
    "Sub32",
    "Mul32",
    "Divi32",
    "Divu32",
    "Loadi8",
    "Loadu8",
    "Loadi16",
    "Loadu16",
    "Loadi32",
    "Loadu32",
    "Store8",
    "Store16",
    "Store32",
];

// v97: 197 opcodes (commit 16b5ada82)
const V97_SIZES: &[u8] = &[
    1, 6, 10, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 3, 6, 7, 5, 5, 6, 8, 6, 8, 6,
    6, 8, 8, 6, 6, 8, 8, 4, 5, 7, 4, 7, 5, 7, 4, 7, 5, 5, 5, 7, 7, 4, 4, 4, 4, 4, 4, 6, 5, 6, 4, 4,
    4, 5, 5, 6, 7, 5, 4, 7, 3, 2, 2, 4, 2, 3, 1, 1, 3, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 4, 6, 2,
    2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 3, 4, 4, 3, 2, 2, 14, 18, 5, 7, 3, 4, 3, 2, 5, 3, 6, 3, 6, 3, 6,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7,
];
const V97_STR_OPS: &[(u8, u8, u8)] = &[
    (56, 1, 4),
    (57, 4, 1),
    (58, 4, 2),
    (59, 4, 4),
    (60, 4, 2),
    (61, 4, 4),
    (62, 4, 2),
    (63, 4, 2),
    (64, 4, 4),
    (65, 4, 4),
    (66, 4, 2),
    (67, 4, 2),
    (68, 4, 4),
    (69, 4, 4),
    (70, 3, 1),
    (71, 3, 2),
    (72, 3, 4),
    (75, 3, 2),
    (76, 3, 4),
    (80, 3, 2),
    (81, 3, 2),
    (82, 3, 4),
    (83, 3, 4),
    (123, 2, 2),
    (124, 2, 4),
    (142, 6, 4),
];
const V97_CALL_OPS: &[(u8, u8, u8)] = &[];
const V97_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "AddS",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "GetParentEnvironment",
    "GetEnvironment",
    "GetClosureEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateFunctionEnvironment",
    "CreateTopLevelEnvironment",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutByIdLoose",
    "PutByIdStrict",
    "PutByIdLooseLong",
    "PutByIdStrictLong",
    "TryPutByIdLoose",
    "TryPutByIdStrict",
    "TryPutByIdLooseLong",
    "TryPutByIdStrictLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutOwnBySlotIdx",
    "PutOwnBySlotIdxLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelByIdLoose",
    "DelByIdStrict",
    "DelByIdLooseLong",
    "DelByIdStrictLong",
    "GetByVal",
    "GetByIndex",
    "PutByValLoose",
    "PutByValStrict",
    "DelByValLoose",
    "DelByValStrict",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallWithNewTarget",
    "Call2",
    "Call3",
    "Call4",
    "CallWithNewTargetLong",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByValLoose",
    "GetArgumentsPropByValStrict",
    "GetArgumentsLength",
    "ReifyArgumentsStrict",
    "ReifyArgumentsLoose",
    "CreateRegExp",
    "SwitchImm",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v98: 201 opcodes (commit c00cc5759)
const V98_SIZES: &[u8] = &[
    1, 6, 10, 2, 3, 8, 10, 4, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2, 3, 6, 7, 5, 5, 6, 8, 6, 8, 6,
    6, 8, 8, 6, 6, 8, 8, 4, 5, 7, 4, 7, 4, 7, 5, 7, 4, 7, 5, 5, 5, 7, 7, 4, 4, 4, 4, 4, 4, 6, 5, 6,
    4, 4, 4, 5, 5, 6, 7, 5, 4, 7, 3, 2, 2, 4, 2, 3, 1, 1, 3, 5, 7, 4, 4, 3, 6, 3, 6, 10, 4, 6, 4,
    6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 3, 4, 4, 3, 2, 2, 14, 18, 5, 7, 3, 4, 3, 3, 3, 2, 5, 3, 6,
    3, 6, 3, 6, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V98_STR_OPS: &[(u8, u8, u8)] = &[
    (56, 1, 4),
    (57, 4, 1),
    (58, 4, 2),
    (59, 4, 4),
    (60, 4, 2),
    (61, 4, 4),
    (62, 4, 2),
    (63, 4, 2),
    (64, 4, 4),
    (65, 4, 4),
    (66, 4, 2),
    (67, 4, 2),
    (68, 4, 4),
    (69, 4, 4),
    (70, 3, 1),
    (71, 3, 2),
    (72, 3, 4),
    (77, 3, 2),
    (78, 3, 4),
    (82, 3, 2),
    (83, 3, 2),
    (84, 3, 4),
    (85, 3, 4),
    (125, 2, 2),
    (126, 2, 4),
    (144, 6, 4),
];
const V98_CALL_OPS: &[(u8, u8, u8)] = &[];
const V98_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "AddS",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "GetParentEnvironment",
    "GetEnvironment",
    "GetClosureEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "CreateFunctionEnvironment",
    "CreateTopLevelEnvironment",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutByIdLoose",
    "PutByIdStrict",
    "PutByIdLooseLong",
    "PutByIdStrictLong",
    "TryPutByIdLoose",
    "TryPutByIdStrict",
    "TryPutByIdLooseLong",
    "TryPutByIdStrictLong",
    "PutNewOwnByIdShort",
    "PutNewOwnById",
    "PutNewOwnByIdLong",
    "PutOwnBySlotIdx",
    "PutOwnBySlotIdxLong",
    "GetOwnBySlotIdx",
    "GetOwnBySlotIdxLong",
    "PutNewOwnNEById",
    "PutNewOwnNEByIdLong",
    "PutOwnByIndex",
    "PutOwnByIndexL",
    "PutOwnByVal",
    "DelByIdLoose",
    "DelByIdStrict",
    "DelByIdLooseLong",
    "DelByIdStrictLong",
    "GetByVal",
    "GetByIndex",
    "PutByValLoose",
    "PutByValStrict",
    "DelByValLoose",
    "DelByValStrict",
    "PutOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallWithNewTarget",
    "Call2",
    "Call3",
    "Call4",
    "CallWithNewTargetLong",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThis",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "AddEmptyString",
    "GetArgumentsPropByValLoose",
    "GetArgumentsPropByValStrict",
    "GetArgumentsLength",
    "ReifyArgumentsStrict",
    "ReifyArgumentsLoose",
    "CreateRegExp",
    "SwitchImm",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "TypedLoadParent",
    "TypedStoreParent",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterN",
    "JGreaterNLong",
    "JNotGreaterN",
    "JNotGreaterNLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JGreaterEqualN",
    "JGreaterEqualNLong",
    "JNotGreaterEqualN",
    "JNotGreaterEqualNLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
];

// v99: 220 opcodes (commit 913d31acd)
const V99_SIZES: &[u8] = &[
    1, 6, 10, 11, 12, 2, 3, 8, 10, 4, 4, 3, 4, 4, 3, 3, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 5, 5, 3, 4, 3, 4, 5, 4, 5, 4, 5, 2,
    2, 3, 3, 6, 7, 5, 5, 6, 8, 9, 6, 8, 6, 6, 8, 8, 6, 6, 8, 8, 4, 7, 4, 7, 6, 8, 4, 7, 4, 5, 5, 4,
    4, 5, 4, 4, 6, 5, 4, 5, 5, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 5, 7, 4, 7, 3, 2, 2, 4, 2, 3, 3, 2, 1,
    1, 3, 6, 8, 7, 9, 5, 7, 4, 5, 4, 3, 6, 3, 6, 10, 4, 6, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3,
    3, 3, 6, 4, 4, 3, 2, 2, 3, 14, 18, 18, 5, 7, 3, 4, 3, 3, 2, 5, 3, 6, 3, 6, 3, 6, 8, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V99_STR_OPS: &[(u8, u8, u8)] = &[
    (67, 1, 4),
    (68, 4, 1),
    (69, 4, 2),
    (70, 4, 4),
    (71, 5, 4),
    (72, 4, 2),
    (73, 4, 4),
    (74, 4, 2),
    (75, 4, 2),
    (76, 4, 4),
    (77, 4, 4),
    (78, 4, 2),
    (79, 4, 2),
    (80, 4, 4),
    (81, 4, 4),
    (87, 4, 4),
    (144, 2, 2),
    (145, 2, 4),
    (159, 2, 4),
    (166, 6, 4),
];
const V99_CALL_OPS: &[(u8, u8, u8)] = &[];
const V99_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObjectWithBufferAndParent",
    "NewTypedObjectWithBuffer",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "NewFastArray",
    "FastArrayLength",
    "FastArrayLoad",
    "FastArrayStore",
    "FastArrayPush",
    "FastArrayAppend",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "AddS",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "PrivateIsIn",
    "TypeOfIs",
    "GetParentEnvironment",
    "GetEnvironment",
    "GetClosureEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "LoadParentNoTraps",
    "CreateFunctionEnvironment",
    "CreateTopLevelEnvironment",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "GetByIdWithReceiverLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutByIdLoose",
    "PutByIdStrict",
    "PutByIdLooseLong",
    "PutByIdStrictLong",
    "TryPutByIdLoose",
    "TryPutByIdStrict",
    "TryPutByIdLooseLong",
    "TryPutByIdStrictLong",
    "PutOwnBySlotIdx",
    "PutOwnBySlotIdxLong",
    "GetOwnBySlotIdx",
    "GetOwnBySlotIdxLong",
    "DefineOwnById",
    "DefineOwnByIdLong",
    "DefineOwnByIndex",
    "DefineOwnByIndexL",
    "DefineOwnInDenseArray",
    "DefineOwnInDenseArrayL",
    "DefineOwnByVal",
    "GetByVal",
    "GetByIndex",
    "GetByValWithReceiver",
    "PutByValLoose",
    "PutByValStrict",
    "PutByValWithReceiver",
    "DelByVal",
    "AddOwnPrivateBySym",
    "GetOwnPrivateBySym",
    "PutOwnPrivateBySym",
    "DefineOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallWithNewTarget",
    "Call2",
    "Call3",
    "Call4",
    "CallWithNewTargetLong",
    "CallRequire",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "ThrowIfUndefined",
    "ThrowIfThisInitialized",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateBaseClass",
    "CreateBaseClassLongIndex",
    "CreateDerivedClass",
    "CreateDerivedClassLongIndex",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThisForNew",
    "CreateThisForSuper",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "ToUint32",
    "AddEmptyString",
    "CreatePrivateName",
    "GetArgumentsPropByValLoose",
    "GetArgumentsPropByValStrict",
    "GetArgumentsLength",
    "ReifyArgumentsStrict",
    "ReifyArgumentsLoose",
    "ToPropertyKey",
    "CreateRegExp",
    "UIntSwitchImm",
    "StringSwitchImm",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "TypedLoadParent",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JmpTypeOfIs",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "JmpBuiltinIs",
    "JmpBuiltinIsLong",
    "JmpBuiltinIsNot",
    "JmpBuiltinIsNotLong",
];

// v98L: 219 opcodes (commit fbd342ebb)
const V98L_SIZES: &[u8] = &[
    1, 6, 10, 11, 2, 3, 8, 10, 4, 4, 3, 4, 4, 3, 3, 8, 3, 9, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 5, 5, 3, 4, 3, 4, 5, 4, 5, 4, 5, 2, 2,
    3, 3, 6, 7, 5, 5, 6, 8, 9, 6, 8, 6, 6, 8, 8, 6, 6, 8, 8, 4, 7, 4, 7, 6, 8, 4, 7, 4, 5, 5, 4, 4,
    5, 4, 4, 6, 5, 4, 5, 5, 6, 5, 6, 4, 4, 4, 5, 5, 6, 7, 5, 7, 4, 7, 3, 2, 2, 4, 2, 3, 3, 2, 1, 1,
    3, 6, 8, 7, 9, 5, 7, 4, 5, 4, 3, 6, 3, 6, 10, 4, 6, 4, 6, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 3,
    6, 4, 4, 3, 2, 2, 3, 14, 18, 18, 5, 7, 3, 4, 3, 3, 2, 5, 3, 6, 3, 6, 3, 6, 8, 4, 7, 4, 7, 4, 7,
    4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7,
];
const V98L_STR_OPS: &[(u8, u8, u8)] = &[
    (67, 1, 4),
    (68, 4, 1),
    (69, 4, 2),
    (70, 4, 4),
    (71, 5, 4),
    (72, 4, 2),
    (73, 4, 4),
    (74, 4, 2),
    (75, 4, 2),
    (76, 4, 4),
    (77, 4, 4),
    (78, 4, 2),
    (79, 4, 2),
    (80, 4, 4),
    (81, 4, 4),
    (87, 4, 4),
    (144, 2, 2),
    (145, 2, 4),
    (158, 2, 4),
    (165, 6, 4),
];
const V98L_CALL_OPS: &[(u8, u8, u8)] = &[];
const V98L_NAMES: &[&str] = &[
    "Unreachable",
    "NewObjectWithBuffer",
    "NewObjectWithBufferLong",
    "NewObjectWithBufferAndParent",
    "NewObject",
    "NewObjectWithParent",
    "NewArrayWithBuffer",
    "NewArrayWithBufferLong",
    "NewArray",
    "NewFastArray",
    "FastArrayLength",
    "FastArrayLoad",
    "FastArrayStore",
    "FastArrayPush",
    "FastArrayAppend",
    "CacheNewObject",
    "Mov",
    "MovLong",
    "Negate",
    "Not",
    "BitNot",
    "TypeOf",
    "Eq",
    "StrictEq",
    "Neq",
    "StrictNeq",
    "Less",
    "LessEq",
    "Greater",
    "GreaterEq",
    "Add",
    "AddN",
    "AddS",
    "Mul",
    "MulN",
    "Div",
    "DivN",
    "Mod",
    "Sub",
    "SubN",
    "LShift",
    "RShift",
    "URshift",
    "BitAnd",
    "BitXor",
    "BitOr",
    "Inc",
    "Dec",
    "InstanceOf",
    "IsIn",
    "PrivateIsIn",
    "TypeOfIs",
    "GetParentEnvironment",
    "GetEnvironment",
    "GetClosureEnvironment",
    "StoreToEnvironment",
    "StoreToEnvironmentL",
    "StoreNPToEnvironment",
    "StoreNPToEnvironmentL",
    "LoadFromEnvironment",
    "LoadFromEnvironmentL",
    "GetGlobalObject",
    "GetNewTarget",
    "LoadParentNoTraps",
    "CreateFunctionEnvironment",
    "CreateTopLevelEnvironment",
    "CreateEnvironment",
    "DeclareGlobalVar",
    "GetByIdShort",
    "GetById",
    "GetByIdLong",
    "GetByIdWithReceiverLong",
    "TryGetById",
    "TryGetByIdLong",
    "PutByIdLoose",
    "PutByIdStrict",
    "PutByIdLooseLong",
    "PutByIdStrictLong",
    "TryPutByIdLoose",
    "TryPutByIdStrict",
    "TryPutByIdLooseLong",
    "TryPutByIdStrictLong",
    "PutOwnBySlotIdx",
    "PutOwnBySlotIdxLong",
    "GetOwnBySlotIdx",
    "GetOwnBySlotIdxLong",
    "DefineOwnById",
    "DefineOwnByIdLong",
    "DefineOwnByIndex",
    "DefineOwnByIndexL",
    "DefineOwnInDenseArray",
    "DefineOwnInDenseArrayL",
    "DefineOwnByVal",
    "GetByVal",
    "GetByIndex",
    "GetByValWithReceiver",
    "PutByValLoose",
    "PutByValStrict",
    "PutByValWithReceiver",
    "DelByVal",
    "AddOwnPrivateBySym",
    "GetOwnPrivateBySym",
    "PutOwnPrivateBySym",
    "DefineOwnGetterSetterByVal",
    "GetPNameList",
    "GetNextPName",
    "Call",
    "Construct",
    "Call1",
    "CallWithNewTarget",
    "Call2",
    "Call3",
    "Call4",
    "CallWithNewTargetLong",
    "CallRequire",
    "CallBuiltin",
    "CallBuiltinLong",
    "GetBuiltinClosure",
    "Ret",
    "Catch",
    "DirectEval",
    "Throw",
    "ThrowIfEmpty",
    "ThrowIfUndefined",
    "ThrowIfThisInitialized",
    "Debugger",
    "AsyncBreakCheck",
    "ProfilePoint",
    "CreateBaseClass",
    "CreateBaseClassLongIndex",
    "CreateDerivedClass",
    "CreateDerivedClassLongIndex",
    "CreateClosure",
    "CreateClosureLongIndex",
    "CreateThisForNew",
    "CreateThisForSuper",
    "SelectObject",
    "LoadParam",
    "LoadParamLong",
    "LoadConstUInt8",
    "LoadConstInt",
    "LoadConstDouble",
    "LoadConstBigInt",
    "LoadConstBigIntLongIndex",
    "LoadConstString",
    "LoadConstStringLongIndex",
    "LoadConstEmpty",
    "LoadConstUndefined",
    "LoadConstNull",
    "LoadConstTrue",
    "LoadConstFalse",
    "LoadConstZero",
    "CoerceThisNS",
    "LoadThisNS",
    "ToNumber",
    "ToNumeric",
    "ToInt32",
    "AddEmptyString",
    "CreatePrivateName",
    "GetArgumentsPropByValLoose",
    "GetArgumentsPropByValStrict",
    "GetArgumentsLength",
    "ReifyArgumentsStrict",
    "ReifyArgumentsLoose",
    "ToPropertyKey",
    "CreateRegExp",
    "UIntSwitchImm",
    "StringSwitchImm",
    "CreateGenerator",
    "CreateGeneratorLongIndex",
    "IteratorBegin",
    "IteratorNext",
    "IteratorClose",
    "TypedLoadParent",
    "Jmp",
    "JmpLong",
    "JmpTrue",
    "JmpTrueLong",
    "JmpFalse",
    "JmpFalseLong",
    "JmpUndefined",
    "JmpUndefinedLong",
    "JmpTypeOfIs",
    "JLess",
    "JLessLong",
    "JNotLess",
    "JNotLessLong",
    "JLessN",
    "JLessNLong",
    "JNotLessN",
    "JNotLessNLong",
    "JLessEqual",
    "JLessEqualLong",
    "JNotLessEqual",
    "JNotLessEqualLong",
    "JLessEqualN",
    "JLessEqualNLong",
    "JNotLessEqualN",
    "JNotLessEqualNLong",
    "JGreater",
    "JGreaterLong",
    "JNotGreater",
    "JNotGreaterLong",
    "JGreaterEqual",
    "JGreaterEqualLong",
    "JNotGreaterEqual",
    "JNotGreaterEqualLong",
    "JEqual",
    "JEqualLong",
    "JNotEqual",
    "JNotEqualLong",
    "JStrictEqual",
    "JStrictEqualLong",
    "JStrictNotEqual",
    "JStrictNotEqualLong",
    "JmpBuiltinIs",
    "JmpBuiltinIsLong",
    "JmpBuiltinIsNot",
    "JmpBuiltinIsNotLong",
];

pub type VersionTables = (
    &'static [u8],
    &'static [(u8, u8, u8)],
    &'static [(u8, u8, u8)],
);

pub fn get_version_tables(version: u32) -> crate::Result<VersionTables> {
    Ok(match version {
        40 => (V40_SIZES, V40_STR_OPS, V40_CALL_OPS),
        41 => (V41_SIZES, V41_STR_OPS, V41_CALL_OPS),
        42 => (V41_SIZES, V41_STR_OPS, V41_CALL_OPS), // v42 same as v41
        43 => (V41_SIZES, V41_STR_OPS, V41_CALL_OPS), // v43 same as v41
        44 => (V44_SIZES, V44_STR_OPS, V44_CALL_OPS),
        45 => (V45_SIZES, V45_STR_OPS, V45_CALL_OPS),
        46 => (V46_SIZES, V46_STR_OPS, V46_CALL_OPS),
        47 => (V46_SIZES, V46_STR_OPS, V46_CALL_OPS), // v47 same as v46
        48 => (V46_SIZES, V46_STR_OPS, V46_CALL_OPS), // v48 same as v46
        49 => (V46_SIZES, V46_STR_OPS, V46_CALL_OPS), // v49 same as v46
        50 => (V46_SIZES, V46_STR_OPS, V46_CALL_OPS), // v50 same as v46
        51 => (V46_SIZES, V46_STR_OPS, V46_CALL_OPS), // v51 same as v46
        52 => (V52_SIZES, V52_STR_OPS, V52_CALL_OPS),
        53 => (V52_SIZES, V52_STR_OPS, V52_CALL_OPS), // v53 same as v52
        54 => (V52_SIZES, V52_STR_OPS, V52_CALL_OPS), // v54 same as v52
        55 => (V52_SIZES, V52_STR_OPS, V52_CALL_OPS), // v55 same as v52
        56 => (V52_SIZES, V52_STR_OPS, V52_CALL_OPS), // v56 same as v52
        57 => (V52_SIZES, V52_STR_OPS, V52_CALL_OPS), // v57 same as v52
        58 => (V52_SIZES, V52_STR_OPS, V52_CALL_OPS), // v58 same as v52
        59 => (V59_SIZES, V59_STR_OPS, V59_CALL_OPS),
        60 => (V59_SIZES, V59_STR_OPS, V59_CALL_OPS), // v60 same as v59
        61 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS),
        62 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v62 same as v61
        63 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v63 same as v61
        64 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v64 same as v61
        65 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v65 same as v61
        66 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v66 same as v61
        67 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v67 same as v61
        68 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v68 same as v61
        69 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v69 same as v61
        70 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v70 same as v61
        71 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v71 same as v61
        72 => (V61_SIZES, V61_STR_OPS, V61_CALL_OPS), // v72 same as v61
        73 => (V73_SIZES, V73_STR_OPS, V73_CALL_OPS),
        74 => (V73_SIZES, V73_STR_OPS, V73_CALL_OPS), // v74 same as v73
        75 => (V73_SIZES, V73_STR_OPS, V73_CALL_OPS), // v75 same as v73
        76 => (V73_SIZES, V73_STR_OPS, V73_CALL_OPS), // v76 same as v73
        77 => (V73_SIZES, V73_STR_OPS, V73_CALL_OPS), // v77 same as v73
        78 => (V73_SIZES, V73_STR_OPS, V73_CALL_OPS), // v78 same as v73
        79 => (V73_SIZES, V73_STR_OPS, V73_CALL_OPS), // v79 same as v73
        80 => (V80_SIZES, V80_STR_OPS, V80_CALL_OPS),
        81 => (V81_SIZES, V81_STR_OPS, V81_CALL_OPS),
        82 => (V81_SIZES, V81_STR_OPS, V81_CALL_OPS), // v82 same as v81
        83 => (V83_SIZES, V83_STR_OPS, V83_CALL_OPS),
        84 => (V84_SIZES, V84_STR_OPS, V84_CALL_OPS),
        85 => (V85_SIZES, V85_STR_OPS, V85_CALL_OPS),
        86 => (V85_SIZES, V85_STR_OPS, V85_CALL_OPS), // v86 same as v85
        87 => (V87_SIZES, V87_STR_OPS, V87_CALL_OPS),
        88 => (V87_SIZES, V87_STR_OPS, V87_CALL_OPS), // v88 same as v87
        89 => (V87_SIZES, V87_STR_OPS, V87_CALL_OPS), // v89 same as v87
        90 => (V90_SIZES, V90_STR_OPS, V90_CALL_OPS),
        91 => (V87_SIZES, V87_STR_OPS, V87_CALL_OPS), // v91 same as v87
        92 => (V92_SIZES, V92_STR_OPS, V92_CALL_OPS),
        93 => (V87_SIZES, V87_STR_OPS, V87_CALL_OPS), // v93 same as v87
        94 => (V92_SIZES, V92_STR_OPS, V92_CALL_OPS), // v94 same as v92
        95 => (V95_SIZES, V95_STR_OPS, V95_CALL_OPS),
        96 => (V95_SIZES, V95_STR_OPS, V95_CALL_OPS), // v96 same as v95
        97 => (V97_SIZES, V97_STR_OPS, V97_CALL_OPS),
        98 => (V98_SIZES, V98_STR_OPS, V98_CALL_OPS),
        99 => (V99_SIZES, V99_STR_OPS, V99_CALL_OPS),
        100 => (V99_SIZES, V99_STR_OPS, V99_CALL_OPS), // v100 same as v99
        crate::parser::V98_LATE => (V98L_SIZES, V98L_STR_OPS, V98L_CALL_OPS),
        _ => return Err(crate::HermesError::UnsupportedVersion { observed: version, supported_min: crate::header::MIN_SUPPORTED_VERSION, supported_max: crate::header::MAX_SUPPORTED_VERSION }),
    })
}

pub fn get_version_names(version: u32) -> crate::Result<&'static [&'static str]> {
    Ok(match version {
        40 => V40_NAMES,
        41 => V41_NAMES,
        42 => V41_NAMES, // v42 same as v41
        43 => V41_NAMES, // v43 same as v41
        44 => V44_NAMES,
        45 => V45_NAMES,
        46 => V46_NAMES,
        47 => V46_NAMES, // v47 same as v46
        48 => V46_NAMES, // v48 same as v46
        49 => V46_NAMES, // v49 same as v46
        50 => V46_NAMES, // v50 same as v46
        51 => V46_NAMES, // v51 same as v46
        52 => V52_NAMES,
        53 => V52_NAMES, // v53 same as v52
        54 => V52_NAMES, // v54 same as v52
        55 => V52_NAMES, // v55 same as v52
        56 => V52_NAMES, // v56 same as v52
        57 => V52_NAMES, // v57 same as v52
        58 => V52_NAMES, // v58 same as v52
        59 => V59_NAMES,
        60 => V59_NAMES, // v60 same as v59
        61 => V61_NAMES,
        62 => V61_NAMES, // v62 same as v61
        63 => V61_NAMES, // v63 same as v61
        64 => V61_NAMES, // v64 same as v61
        65 => V61_NAMES, // v65 same as v61
        66 => V61_NAMES, // v66 same as v61
        67 => V61_NAMES, // v67 same as v61
        68 => V61_NAMES, // v68 same as v61
        69 => V61_NAMES, // v69 same as v61
        70 => V61_NAMES, // v70 same as v61
        71 => V61_NAMES, // v71 same as v61
        72 => V61_NAMES, // v72 same as v61
        73 => V73_NAMES,
        74 => V73_NAMES, // v74 same as v73
        75 => V73_NAMES, // v75 same as v73
        76 => V73_NAMES, // v76 same as v73
        77 => V73_NAMES, // v77 same as v73
        78 => V73_NAMES, // v78 same as v73
        79 => V73_NAMES, // v79 same as v73
        80 => V80_NAMES,
        81 => V81_NAMES,
        82 => V81_NAMES, // v82 same as v81
        83 => V83_NAMES,
        84 => V84_NAMES,
        85 => V85_NAMES,
        86 => V85_NAMES, // v86 same as v85
        87 => V87_NAMES,
        88 => V87_NAMES, // v88 same as v87
        89 => V87_NAMES, // v89 same as v87
        90 => V90_NAMES,
        91 => V87_NAMES, // v91 same as v87
        92 => V92_NAMES,
        93 => V87_NAMES, // v93 same as v87
        94 => V92_NAMES, // v94 same as v92
        95 => V95_NAMES,
        96 => V95_NAMES, // v96 same as v95
        97 => V97_NAMES,
        98 => V98_NAMES,
        99 => V99_NAMES,
        100 => V99_NAMES, // v100 same as v99
        crate::parser::V98_LATE => V98L_NAMES,
        _ => return Err(crate::HermesError::UnsupportedVersion { observed: version, supported_min: crate::header::MIN_SUPPORTED_VERSION, supported_max: crate::header::MAX_SUPPORTED_VERSION }),
    })
}
