bool Deobfuscate2(Block block, int i)
        {
            var instrs = block.Instructions;
            if (i >= instrs.Count - 2)
                return false;

            var ldsfld = instrs[i];
            if (ldsfld.OpCode.Code != Code.Ldsfld)
                return false;
            var info = arrayBlockState.GetFieldInfo(ldsfld.Operand as IField);
            if (info == null)
                return false;

            var ldci4 = instrs[i + 1];
            if (!ldci4.IsLdcI4())
                return false;

            var ldelem = instrs[i + 2];
            if (!IsLdelem(info, ldelem.OpCode.Code))
                return false;

            block.Remove(i, 3 - 1);
            instrs[i] = new Instr(Instruction.CreateLdcI4((int)info.ReadArrayElement(ldci4.GetLdcI4Value())));
            return true;
        }
        bool Deobfuscate3(Block block, int i)
        {
            var instrs = block.Instructions;
            if (i + 1 >= instrs.Count)
                return false;

            int start = i;
            var ldsfld = instrs[i];
            if (ldsfld.OpCode.Code != Code.Ldsfld)
                return false;
            var info = arrayBlockState.GetFieldInfo(ldsfld.Operand as IField);
            if (info == null)
                return false;

            if (!instrs[i + 1].IsLdcI4())
                return false;

            var constants = GetConstantsReader(block);
            int value;
            i += 2;
            if (!constants.GetInt32(ref i, out value))
                return false;

            if (i >= instrs.Count)
                return false;
            var stelem = instrs[i];
            if (!IsStelem(info, stelem.OpCode.Code))
                return false;

            block.Remove(start, i - start + 1);
            return true;
        }
        bool Deobfuscate1(Block block, int i)
        {
            var instrs = block.Instructions;
            if (i >= instrs.Count - 2)
                return false;

            var ldloc = instrs[i];
            if (!ldloc.IsLdloc())
                return false;
            var local = ldloc.Instruction.GetLocal(Blocks.Locals);
            if (local == null)
                return false;
            ArrayBlockState.FieldInfo info;
            if (!localToInfo.TryGetValue(local, out info))
                return false;

            var ldci4 = instrs[i + 1];
            if (!ldci4.IsLdcI4())
                return false;

            var ldelem = instrs[i + 2];
            if (!IsLdelem(info, ldelem.OpCode.Code))
                return false;

            block.Remove(i, 3 - 1);
            instrs[i] = new Instr(Instruction.CreateLdcI4((int)info.ReadArrayElement(ldci4.GetLdcI4Value())));
            return true;
        }