#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<std::string> lines;
    for(;;)
    {
        std::string line;
        std::cin >> line;
        lines.push_back(std::move(line));
        if(std::cin.eof()) break;

    }
    int width = lines[0].size();
    int height = lines.size();

    std::vector<std::vector<char>> input(width, std::vector<char>(height));

    for(int y = 0; y < height; ++y)
    {
        for(int x = 0; x < width; ++x)
        {
            input[x][y] = lines[y][x];
        }
    }

    std::vector<std::vector<int>> possibilities(width, std::vector<int>(height, 0));

    for(int y = 0; y < height - 1; ++y) //filling where 2x2 square fits
    {
        for(int x = 0; x < width - 1; ++x)
        {
            if(input[x][y] == '1' && input[x + 1][y] == '1' && input[x][y + 1] == '1' && input[x + 1][y + 1] == '1')
            {
                possibilities[x][y] = 1;
            }
        }
    }

    for(int y = 0; y < height; ++y) //printing for debug
    {
        for(int x = 0; x < width; ++x)
        {
            std::cout << possibilities[x][y] << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    for(int y = 0; y < height; ++y) //counting neighbours
    {
        for(int x = 0; x < width; ++x)
        {
            if(possibilities[x][y] == 0) continue;
            int minX = -1;
            int minY = -1;
            int maxX = 1;
            int maxY = 1;
            if(x <= 0) minX = 0;
            if(y <= 0) minY = 0;
            if(x >= width - 1) maxX = 0;
            if(y >= height - 1) maxY = 0;
            for(int xx = minX; xx <= maxX; ++xx)
            {
                for(int yy = minY; yy <= maxY; ++yy)
                {
                    if(xx == 0 && yy == 0) continue;
                    if(possibilities[xx + x][yy + y] > 0) ++possibilities[x][y];
                }
            }
        }
    }

    for(int y = 0; y < height; ++y) //printing for debug
    {
        for(int x = 0; x < width; ++x)
        {
            std::cout << possibilities[x][y] << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    struct Element
    {
        int value;
        int x;
        int y;
    };
    std::vector<Element> sortedElements;
    for(int y = 0; y < height; ++y) //printing for debug
    {
        for(int x = 0; x < width; ++x)
        {
            if(possibilities[x][y] > 0) sortedElements.push_back(Element {possibilities[x][y], x, y});
        }
    }
    std::sort(sortedElements.begin(), sortedElements.end(), [](const Element & lhs, const Element & rhs) -> bool {return lhs.value < rhs.value;});
    /*
    for(int y = 0; y < height; ++y) //taking values with lesser neighbours
    {
        for(int x = 0; x < width; ++x)
        {
            if(possibilities[x][y] == 0) continue;
            int minX = -1;
            int minY = -1;
            int maxX = 1;
            int maxY = 1;
            if(x <= 0) minX = 0;
            if(y <= 0) minY = 0;
            if(x >= width - 1) maxX = 0;
            if(y >= height - 1) maxY = 0;
            bool inSolution = true;
            for(int xx = minX; xx <= maxX; ++xx)
            {
                for(int yy = minY; yy <= maxY; ++yy)
                {
                    if(xx == 0 && yy == 0) continue;
                    if(possibilities[xx + x][yy + y] == 0) continue;
                    if(possibilities[x][y] > possibilities[xx + x][yy + y])
                    {
                        inSolution = false;
                        xx = maxX + 1; //to break out of two loops
                        break;
                    }
                }
            }
            if(inSolution)
            {
                for(int xx = minX; xx <= maxX; ++xx)
                {
                    for(int yy = minY; yy <= maxY; ++yy)
                    {
                        if(xx == 0 && yy == 0) continue;
                        possibilities[xx + x][yy + y] = 0;
                    }
                }
            }
        }
    }
    */
    for(auto& element : sortedElements)
    {
        int x = element.x;
        int y = element.y;
        if(possibilities[x][y] == 0) continue;
        int minX = -1;
        int minY = -1;
        int maxX = 1;
        int maxY = 1;
        if(x <= 0) minX = 0;
        if(y <= 0) minY = 0;
        if(x >= width - 1) maxX = 0;
        if(y >= height - 1) maxY = 0;
        bool inSolution = true;
        for(int xx = minX; xx <= maxX; ++xx)
        {
            for(int yy = minY; yy <= maxY; ++yy)
            {
                if(xx == 0 && yy == 0) continue;
                if(possibilities[xx + x][yy + y] == 0) continue;
                if(possibilities[x][y] > possibilities[xx + x][yy + y])
                {
                    inSolution = false;
                    xx = maxX + 1; //to break out of two loops
                    break;
                }
            }
        }
        if(inSolution)
        {
            for(int xx = minX; xx <= maxX; ++xx)
            {
                for(int yy = minY; yy <= maxY; ++yy)
                {
                    if(xx == 0 && yy == 0) continue;
                    possibilities[xx + x][yy + y] = 0;
                }
            }
        }
    }

	int count = 0;
    for(int y = 0; y < height; ++y) //printing for debug
    {
        for(int x = 0; x < width; ++x)
        {
            std::cout << possibilities[x][y] << ' ';
            if(possibilities[x][y] > 0) ++count;
        }
        std::cout << '\n';
    }
	std::cout << '\n' << "Count: " << count;

    return 0;
}
