- #include<vector> 
- #include<iostream> 
- #include<utility> 
-   
-    namespace named_operator { 
-       template<class D>struct make_operator{make_operator(){}}; 
-   
-       template<class T, char, class O> struct half_apply { T&& lhs; }; 
-   
-       template<class Lhs, class Op> 
-       half_apply<Lhs, '+', Op> operator+( Lhs&& lhs, make_operator<Op> ) { 
-         return {std::forward<Lhs>(lhs)}; 
-       } 
-   
-       template<class Lhs, class Op, class Rhs> 
-       auto operator+( half_apply<Lhs, '+', Op>&& lhs, Rhs&& rhs ) 
-       -> decltype( named_invoke( std::forward<Lhs>(lhs.lhs), Op{}, std::forward<Rhs>(rhs) ) ) 
-       { 
-         return named_invoke( std::forward<Lhs>(lhs.lhs), Op{}, std::forward<Rhs>(rhs) ); 
-       } 
-     } 
-   
-     namespace ops { 
-       struct concat_t:named_operator::make_operator<concat_t>{}; 
-       static const concat_t concat{}; 
-       template<class T, class A, class A2> 
-       std::vector<T,A> named_invoke( std::vector<T,A> lhs, concat_t, std::vector<T,A2> const& rhs){ 
-         lhs.insert(lhs.end(), rhs.begin(), rhs.end()); 
-         return std::move(lhs); 
-       } 
-     } 
-     using ops::concat; 
-   
-     int main(){ 
-        std::vector<int> a{1,2,3}; 
-        std::vector<int> b{7,8,9}; 
-   
-       for( auto x: a +concat+ a +concat+ b ) 
-         std::cout <<x<<'\n'; 
-     } 
				I2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8dXRpbGl0eT4KCiAgIG5hbWVzcGFjZSBuYW1lZF9vcGVyYXRvciB7CiAgICAgIHRlbXBsYXRlPGNsYXNzIEQ+c3RydWN0IG1ha2Vfb3BlcmF0b3J7bWFrZV9vcGVyYXRvcigpe319OwoKICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2hhciwgY2xhc3MgTz4gc3RydWN0IGhhbGZfYXBwbHkgeyBUJiYgbGhzOyB9OwoKICAgICAgdGVtcGxhdGU8Y2xhc3MgTGhzLCBjbGFzcyBPcD4KICAgICAgaGFsZl9hcHBseTxMaHMsICcrJywgT3A+IG9wZXJhdG9yKyggTGhzJiYgbGhzLCBtYWtlX29wZXJhdG9yPE9wPiApIHsKICAgICAgICByZXR1cm4ge3N0ZDo6Zm9yd2FyZDxMaHM+KGxocyl9OwogICAgICB9CgogICAgICB0ZW1wbGF0ZTxjbGFzcyBMaHMsIGNsYXNzIE9wLCBjbGFzcyBSaHM+CiAgICAgIGF1dG8gb3BlcmF0b3IrKCBoYWxmX2FwcGx5PExocywgJysnLCBPcD4mJiBsaHMsIFJocyYmIHJocyApCiAgICAgIC0+IGRlY2x0eXBlKCBuYW1lZF9pbnZva2UoIHN0ZDo6Zm9yd2FyZDxMaHM+KGxocy5saHMpLCBPcHt9LCBzdGQ6OmZvcndhcmQ8UmhzPihyaHMpICkgKQogICAgICB7CiAgICAgICAgcmV0dXJuIG5hbWVkX2ludm9rZSggc3RkOjpmb3J3YXJkPExocz4obGhzLmxocyksIE9we30sIHN0ZDo6Zm9yd2FyZDxSaHM+KHJocykgKTsKICAgICAgfQogICAgfQoKICAgIG5hbWVzcGFjZSBvcHMgewogICAgICBzdHJ1Y3QgY29uY2F0X3Q6bmFtZWRfb3BlcmF0b3I6Om1ha2Vfb3BlcmF0b3I8Y29uY2F0X3Q+e307CiAgICAgIHN0YXRpYyBjb25zdCBjb25jYXRfdCBjb25jYXR7fTsKICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQSwgY2xhc3MgQTI+CiAgICAgIHN0ZDo6dmVjdG9yPFQsQT4gbmFtZWRfaW52b2tlKCBzdGQ6OnZlY3RvcjxULEE+IGxocywgY29uY2F0X3QsIHN0ZDo6dmVjdG9yPFQsQTI+IGNvbnN0JiByaHMpewogICAgICAgIGxocy5pbnNlcnQobGhzLmVuZCgpLCByaHMuYmVnaW4oKSwgcmhzLmVuZCgpKTsKICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGxocyk7CiAgICAgIH0KICAgIH0KICAgIHVzaW5nIG9wczo6Y29uY2F0OwoKICAgIGludCBtYWluKCl7CiAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGF7MSwyLDN9OwogICAgICAgc3RkOjp2ZWN0b3I8aW50PiBiezcsOCw5fTsKCiAgICAgIGZvciggYXV0byB4OiBhICtjb25jYXQrIGEgK2NvbmNhdCsgYiApCiAgICAgICAgc3RkOjpjb3V0IDw8eDw8J1xuJzsKICAgIH0=