#include <bits/stdc++.h>

using namespace std;

using ll = int_fast64_t;
constexpr ll llmax = INT_FAST64_MAX;
constexpr ll llmin = INT_FAST64_MIN;
using ull = uint_fast64_t;
constexpr ull ullmax = UINT_FAST64_MAX;

#define FOR(i, b, e) for (int i = (b); i < (e); ++i)
#define RFOR(i, b, e) for (int i = ((e) - 1); (b) <= i; --i)
#define REP(i, N) for (int i = 0; i < (N); ++i)
#define RREP(i, N) for (int i = ((N) - 1); 0 <= i; --i)
#define scanInt(x) int x; scanf("%d", &(x)); getchar();
#define scanLLInt(x) ll x; scanf("%lld", &(x)); getchar();
#define scanVecInt(A, N) vector<int> A(N); REP(i, N){scanf("%d", &(A[i])); getchar();}
#define scanVecLLInt(A, N) vector<ll> A(N); REP(i, N){scanf("%lld", &(A[i])); getchar();}

constexpr uint mod = 1000000007;

inline
uint modPlus(uint a, uint b){return (a + b) % mod;}

inline
uint modMinus(uint a, uint b){return (mod + a - b) % mod;}

inline
uint modMultiple(uint a, uint b){return (static_cast<long long>(a) * b) % mod;}

class ModInverse {
    std::vector<uint> table;
public:
    ModInverse(uint max)
        : table(max)
    {
        for (int n = 1; n <= max; ++n){
            uint mod_minus_2 = mod - 2;
            vector<uint> temp_table(static_cast<uint>(floor(log2f(mod_minus_2))) + 1);
            temp_table[0] = n;
            for (uint i = 1; i < temp_table.size(); ++i){
                temp_table[i] = modMultiple(temp_table[i - 1], temp_table[i - 1]);
            }
            table[n - 1] = 1;
            for (uint i = 0; mod_minus_2; ++i, mod_minus_2 >>= 1){
                if (!(mod_minus_2 & 1)) continue;
                table[n - 1] = modMultiple(table[n - 1], temp_table[i]);
            }
        }
    }
    uint operator () (uint n)
    {
        return table[n - 1];
    }
};

class PowerN {
    std::vector<uint> table;
public:
    PowerN(uint N, uint max) // max:使いたい引数nの最大
    {
        if (max == 0) return;
        table.resize(static_cast<uint>(floor(log2f(max))) + 1);
        table[0] = N;
        for (uint i = 1; i < table.size(); ++i){
            table[i] = modMultiple(table[i - 1], table[i - 1]); // N ^ (2 ^ i)
        }
    }

    uint operator () (int n)
    {
        if (n < 0) return 0;
        if (n == 0) return 1;
        uint result = 1;
        for (uint i = 0; n; ++i, n >>= 1){
            if (!(n & 1)) continue;
            result = modMultiple(result, table[i]);
        }
        return result;
    }
};

// 階乗数n!を最初に計算して、呼ばれた時に返す
class Factorial {
    std::vector<uint> table;
public:
    Factorial(uint max) : table(max) // max:テーブルのサイズ
    {
        if (max == 0) return;
        table[0] = 1;
        for (uint i = 1; i < max; ++i){
            table[i] = modMultiple(table[i - 1], i + 1);
        }
    }

    uint operator () (int n)
    {
        if (n < 0) return 0;
        if (n == 0) return 1;
        return table[n - 1];
    }
};

// 階上数n!の逆数（逆元）を最初に計算して、呼ばれた時に返す
class FactorialInverse {
    std::vector<uint> table;
    Factorial& fact;
public:
    FactorialInverse(uint max, Factorial fact) : table(max), fact(fact) // max:テーブルのサイズ
    {
        if (max == 0) return;
        uint digit  = 0;
        {
            uint temp = mod - 2;
            while (temp > 0){
                temp >>= 1;
                ++digit;
            }
        }
        uint origin = fact(max);
        std::vector<uint> powerorigin2(digit);
        powerorigin2[0] = origin;
        for (uint i = 1; i < digit; ++i){
            powerorigin2[i] = modMultiple(powerorigin2[i - 1], powerorigin2[i - 1]);
        }
        {
            uint table_max = 1;
            uint temp = mod - 2;
            for (uint i = 0; temp > 0; ++i, temp >>= 1){
                if (!(temp & 1)) continue;
                table_max = modMultiple(table_max, powerorigin2[i]);
            }
            table[max - 1] = table_max; // origin^(mod - 2)
        }
        for (int i = max - 2; i >= 0; --i){
            table[i] = modMultiple(table[i + 1], i + 2);
        }
    }

    uint operator () (int n)
    {
        if (n < 0) return 0;
        if (n == 0) return 1;
        return table[n - 1];
    }
};

int main()
{
    scanInt(B);
    scanInt(W);

    Factorial fact(B + W);
    FactorialInverse factinv(B + W, fact);
    auto nCr = [&](uint n, uint r){
        return modMultiple(modMultiple(fact(n), factinv(r)), factinv(n - r));
    };
    const int half = 500000004;
    PowerN powi2(half, B + W);

    vector<int> PBmax(B + W);
    vector<int> PWmax(B + W);
    PBmax[0] = 0;
    PWmax[0] = 0;
    FOR(i, 1, B + W){
        PBmax[i] = modPlus(PBmax[i - 1], modMultiple(nCr(i - 1, B - 1), powi2(i)));
        PWmax[i] = modPlus(PWmax[i - 1], modMultiple(nCr(i - 1, W - 1), powi2(i)));
    }
    REP(i, B + W){
        cout << modMultiple(modMinus(modPlus(1, PWmax[i]), PBmax[i]), half) << endl;
    }
}


Measured memory_bytes: 5360