#include <assert.h>
#include <functional>
using namespace std;
template< class BaseObjectId >
class Check
{
protected:
Check( function<bool()> const f ) { assert( f() ); }
};
template< int tpMinValue, int tpMaxValue >
class IntegerSubrange
: private Check< IntegerSubrange< tpMinValue, tpMaxValue > >
{
private:
int value_;
public:
enum :int { minValue = tpMinValue, maxValue = tpMaxValue };
static bool rangeContains( int const x )
{
return (minValue <= x && x <= maxValue);
}
operator int() const
{
return value_;
}
void operator/=( int const rhs )
{
value_ /= rhs;
assert( rangeContains( value_ ) );
}
explicit IntegerSubrange( int const value )
: Check< IntegerSubrange< tpMinValue, tpMaxValue > >(
[=]() -> bool { return rangeContains( value ); }
)
, value_( value )
{}
};
int main() {}
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICB0ZW1wbGF0ZTwgY2xhc3MgQmFzZU9iamVjdElkID4KICAgIGNsYXNzIENoZWNrCiAgICB7CiAgICBwcm90ZWN0ZWQ6CiAgICAgICAgQ2hlY2soIGZ1bmN0aW9uPGJvb2woKT4gY29uc3QgZiApIHsgYXNzZXJ0KCBmKCkgKTsgfQogICAgfTsKCiAgICB0ZW1wbGF0ZTwgaW50IHRwTWluVmFsdWUsIGludCB0cE1heFZhbHVlID4KICAgIGNsYXNzIEludGVnZXJTdWJyYW5nZQogICAgICAgIDogcHJpdmF0ZSBDaGVjazwgSW50ZWdlclN1YnJhbmdlPCB0cE1pblZhbHVlLCB0cE1heFZhbHVlID4gPgogICAgewogICAgcHJpdmF0ZToKICAgICAgICBpbnQgICAgIHZhbHVlXzsKCiAgICBwdWJsaWM6CiAgICAgICAgZW51bSA6aW50IHsgbWluVmFsdWUgPSB0cE1pblZhbHVlLCBtYXhWYWx1ZSA9IHRwTWF4VmFsdWUgfTsKCiAgICAgICAgc3RhdGljIGJvb2wgcmFuZ2VDb250YWlucyggaW50IGNvbnN0IHggKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChtaW5WYWx1ZSA8PSB4ICYmIHggPD0gbWF4VmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgaW50KCkgY29uc3QKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZV87CiAgICAgICAgfQoKICAgICAgICB2b2lkIG9wZXJhdG9yLz0oIGludCBjb25zdCByaHMgKQogICAgICAgIHsKICAgICAgICAgICAgdmFsdWVfIC89IHJoczsKICAgICAgICAgICAgYXNzZXJ0KCByYW5nZUNvbnRhaW5zKCB2YWx1ZV8gKSApOwogICAgICAgIH0KCiAgICAgICAgZXhwbGljaXQgSW50ZWdlclN1YnJhbmdlKCBpbnQgY29uc3QgdmFsdWUgKQogICAgICAgICAgICA6IENoZWNrPCBJbnRlZ2VyU3VicmFuZ2U8IHRwTWluVmFsdWUsIHRwTWF4VmFsdWUgPiA+KAogICAgICAgICAgICAgICAgWz1dKCkgLT4gYm9vbCB7IHJldHVybiByYW5nZUNvbnRhaW5zKCB2YWx1ZSApOyB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICwgdmFsdWVfKCB2YWx1ZSApCiAgICAgICAge30KICAgIH07CgppbnQgbWFpbigpIHt9