#include <iostream>
using namespace std;
template < class T>
struct test1 {
enum test2 {
test3, test4
} ;
} ;
template < class T>
typename test1< T> :: test2 operator | ( typename test1< T> :: test2 f1, typename test1< T> :: test2 f2) {
return static_cast < typename test1< T> :: test2 > (
static_cast < unsigned > ( f1) | static_cast < unsigned > ( f2)
) ;
}
int main( ) {
test1< int > :: test2 flags = test1< int > :: test3 | test1< int > :: test4 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCB0ZXN0MSB7CgllbnVtIHRlc3QyIHsKCQl0ZXN0MywgdGVzdDQKCX07Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KdHlwZW5hbWUgdGVzdDE8VD46OnRlc3QyIG9wZXJhdG9yIHwgKHR5cGVuYW1lIHRlc3QxPFQ+Ojp0ZXN0MiBmMSwgdHlwZW5hbWUgdGVzdDE8VD46OnRlc3QyIGYyKSB7CglyZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgdGVzdDE8VD46OnRlc3QyPigKCQlzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZjEpIHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGYyKQoJKTsKfQoKaW50IG1haW4oKSB7Cgl0ZXN0MTxpbnQ+Ojp0ZXN0MiBmbGFncyA9IHRlc3QxPGludD46OnRlc3QzIHwgdGVzdDE8aW50Pjo6dGVzdDQ7Cn0=