#include <bits/stdc++.h>
using namespace std;
set < string > cppKeywords = {
"alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit", "atomic_noexcept",
"auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class",
"compl", "concept", "const", "consteval", "constexpr", "const_cast", "continue", "co_await", "co_return",
"co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit",
"export", "extern", "false", "float", "for", "friend", "goto", "if", "import", "inline", "int", "long",
"mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq",
"private", "protected", "public", "register", "reinterpret_cast", "requires", "return", "short", "signed",
"sizeof", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local",
"throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void",
"volatile", "wchar_t", "while", "xor", "xor_eq"
};
set< string > cppOperators = {
"+", "-", "*", "/", "%", "++", "--", "=", "+=", "-=", "*=", "/=", "%=",
"==", "!=", "<", ">", "<=", ">=", "&&", "||", "!", "&", "|", "^", "~",
"<<", ">>", ">>=", "<<=", "->", "&=", "|=", "^="
};
vector < string > tokens;
bool isSymbol(char ch) {return !isalpha(ch) and !isdigit(ch) and (ch != ' ') and (static_cast<int>(ch) != 9);}
bool isSymbol(string ch) {return (ch.size() > 1) ? false: isSymbol(ch[0]);}
bool isNumber(char ch) {return ch >= '0' and ch <= '9';}
bool isNumber(string s) {
for (int i = 0; i < s.size(); i++) {
if (s[i] < '0' or s[i] > '9')
return false;
}
return true;
}
bool isFloat(string s) {
bool point = false;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '.') point = true;
else if (s[i] < '0' and s[i] > '9') return false;
}
return point;
}
bool handle_operator(string s, int &i, string &tmp) {
if ((i < s.size() - 1)) {
string newS;
newS += s[i];
newS += s[i + 1];
// cout << newS << endl;
if (cppOperators.find(newS) != cppOperators.end()) {
tokens.push_back(newS);
tmp = "";
i++;
return true;
}
}
return false;
}
void getToken(string s) {
string tmp;
int cnt = 0;
for (int i = 0; i < s.size(); i++) {
if (isNumber(s[i])) {
string num;
while (i < s.size() and (isNumber(s[i]) or (s[i] == '.'))) {
num += s[i];
i++;
}
tokens.push_back(num);
}
if (isSymbol(s[i])) {
if (
i - 1 != -1 and
i + 1 != s.size() and
s[i - 1] != ' ' and
s[i + 1] != ' '
) {
if (tmp.size()) tokens.push_back(tmp);
string str;
str += s[i];
if (handle_operator(s, i, tmp)) continue;
tokens.push_back(str);
tmp = "";
continue;
}
else {
string str;
str += s[i];
if (tmp.size()) tokens.push_back(tmp);
if (handle_operator(s, i, tmp)) continue;
tokens.push_back(str);
tmp = "";
continue;
}
}
else if (s[i] == ' ' and !isSymbol(s[i - 1])) {
if (tmp.size()) tokens.push_back(tmp);
tmp = "";
}
if ((s[i] != ' ') and (static_cast<int>(s[i] != 9))) {
tmp += s[i];
}
}
}
vector < string > getKeywords() {
vector < string > keywords;
for (auto el: tokens) {
if (cppKeywords.find(el) != cppKeywords.end())
keywords.push_back(el);
}
return keywords;
}
vector < string > getIdentifier() {
vector < string > identifier;
for (auto el: tokens) {
if (cppKeywords.find(el) == cppKeywords.end() and !isSymbol(el) and !isNumber(el) and !isFloat(el) and cppOperators.find(el) == cppOperators.end())
identifier.push_back(el);
}
return identifier;
}
vector < string > getOperator() {
vector < string > operators;
for (auto el: tokens) {
if (cppOperators.find(el) != cppOperators.end())
operators.push_back(el);
}
return operators;
}
vector < string > getSymbols() {
vector < string > symbols;
for (auto el: tokens) {
if (isSymbol(el) and (cppOperators.find(el) == cppOperators.end()))
symbols.push_back(el);
}
return symbols;
}
vector < string > getNumbers() {
vector < string > numbers;
for (auto el: tokens) {
if (isNumber(el))
numbers.push_back(el);
}
return numbers;
}
vector < string > getFloats() {
vector < string > floats;
for (auto el: tokens) {
if (isFloat(el))
floats.push_back(el);
}
return floats;
}
int main() {
string s;
int token = 0;
while (getline(cin, s)) {
getToken(s);
}
vector < string > keywords = getKeywords();
vector < string > identifiers = getIdentifier();
vector < string > operators = getOperator();
vector < string > symbols = getSymbols();
vector < string > numbers = getNumbers();
vector < string > floats = getFloats();
cout << "Total Numbers of Tokens\t\t:" << tokens.size() << endl;
cout << "Keywords\t\t\t\t\t:" << keywords.size() << " ";
for (auto el: keywords) cout << el << " ";
cout << endl;
cout << "Identifiers\t\t\t\t\t:" << identifiers.size() << " ";
for (auto el: identifiers) cout << el << " ";
cout << endl;
cout << "Operators\t\t\t\t\t:" << operators.size() << " ";
for (auto el: operators) cout << el << " ";
cout << endl;
cout << "Symbols\t\t\t\t\t\t:" << symbols.size() << " ";
for (auto el: symbols) cout << el << " ";
cout << endl;
cout << "Integer Constants\t\t\t:" << numbers.size() << " ";
for (auto el: numbers) cout << el << " ";
cout << endl;
cout << "Floating Point Constants\t:" << floats.size() << " ";
for (auto el: floats) cout << el << " ";
cout << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzZXQgPCBzdHJpbmcgPiBjcHBLZXl3b3JkcyA9IHsKICAgICAgICAiYWxpZ25hcyIsICJhbGlnbm9mIiwgImFuZCIsICJhbmRfZXEiLCAiYXNtIiwgImF0b21pY19jYW5jZWwiLCAiYXRvbWljX2NvbW1pdCIsICJhdG9taWNfbm9leGNlcHQiLAogICAgICAgICJhdXRvIiwgImJpdGFuZCIsICJiaXRvciIsICJib29sIiwgImJyZWFrIiwgImNhc2UiLCAiY2F0Y2giLCAiY2hhciIsICJjaGFyMTZfdCIsICJjaGFyMzJfdCIsICJjbGFzcyIsCiAgICAgICAgImNvbXBsIiwgImNvbmNlcHQiLCAiY29uc3QiLCAiY29uc3RldmFsIiwgImNvbnN0ZXhwciIsICJjb25zdF9jYXN0IiwgImNvbnRpbnVlIiwgImNvX2F3YWl0IiwgImNvX3JldHVybiIsCiAgICAgICAgImNvX3lpZWxkIiwgImRlY2x0eXBlIiwgImRlZmF1bHQiLCAiZGVsZXRlIiwgImRvIiwgImRvdWJsZSIsICJkeW5hbWljX2Nhc3QiLCAiZWxzZSIsICJlbnVtIiwgImV4cGxpY2l0IiwKICAgICAgICAiZXhwb3J0IiwgImV4dGVybiIsICJmYWxzZSIsICJmbG9hdCIsICJmb3IiLCAiZnJpZW5kIiwgImdvdG8iLCAiaWYiLCAiaW1wb3J0IiwgImlubGluZSIsICJpbnQiLCAibG9uZyIsCiAgICAgICAgIm11dGFibGUiLCAibmFtZXNwYWNlIiwgIm5ldyIsICJub2V4Y2VwdCIsICJub3QiLCAibm90X2VxIiwgIm51bGxwdHIiLCAib3BlcmF0b3IiLCAib3IiLCAib3JfZXEiLAogICAgICAgICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLCAicmVnaXN0ZXIiLCAicmVpbnRlcnByZXRfY2FzdCIsICJyZXF1aXJlcyIsICJyZXR1cm4iLCAic2hvcnQiLCAic2lnbmVkIiwKICAgICAgICAic2l6ZW9mIiwgInN0YXRpYyIsICJzdGF0aWNfYXNzZXJ0IiwgInN0YXRpY19jYXN0IiwgInN0cnVjdCIsICJzd2l0Y2giLCAidGVtcGxhdGUiLCAidGhpcyIsICJ0aHJlYWRfbG9jYWwiLAogICAgICAgICJ0aHJvdyIsICJ0cnVlIiwgInRyeSIsICJ0eXBlZGVmIiwgInR5cGVpZCIsICJ0eXBlbmFtZSIsICJ1bmlvbiIsICJ1bnNpZ25lZCIsICJ1c2luZyIsICJ2aXJ0dWFsIiwgInZvaWQiLAogICAgICAgICJ2b2xhdGlsZSIsICJ3Y2hhcl90IiwgIndoaWxlIiwgInhvciIsICJ4b3JfZXEiCn07CgpzZXQ8IHN0cmluZyA+IGNwcE9wZXJhdG9ycyA9IHsKICAgICAgICAiKyIsICItIiwgIioiLCAiLyIsICIlIiwgIisrIiwgIi0tIiwgIj0iLCAiKz0iLCAiLT0iLCAiKj0iLCAiLz0iLCAiJT0iLAogICAgICAgICI9PSIsICIhPSIsICI8IiwgIj4iLCAiPD0iLCAiPj0iLCAiJiYiLCAifHwiLCAiISIsICImIiwgInwiLCAiXiIsICJ+IiwKICAgICAgICAiPDwiLCAiPj4iLCAiPj49IiwgIjw8PSIsICItPiIsICImPSIsICJ8PSIsICJePSIKfTsKCnZlY3RvciA8IHN0cmluZyA+IHRva2VuczsKCmJvb2wgaXNTeW1ib2woY2hhciBjaCkge3JldHVybiAhaXNhbHBoYShjaCkgYW5kICFpc2RpZ2l0KGNoKSBhbmQgKGNoICE9ICcgJykgYW5kIChzdGF0aWNfY2FzdDxpbnQ+KGNoKSAhPSA5KTt9CmJvb2wgaXNTeW1ib2woc3RyaW5nIGNoKSB7cmV0dXJuIChjaC5zaXplKCkgPiAxKSA/IGZhbHNlOiBpc1N5bWJvbChjaFswXSk7fQpib29sIGlzTnVtYmVyKGNoYXIgY2gpIHtyZXR1cm4gY2ggPj0gJzAnIGFuZCBjaCA8PSAnOSc7fQpib29sIGlzTnVtYmVyKHN0cmluZyBzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICBpZiAoc1tpXSA8ICcwJyBvciBzW2ldID4gJzknKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBpc0Zsb2F0KHN0cmluZyBzKSB7CiAgICBib29sIHBvaW50ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICBpZiAoc1tpXSA9PSAnLicpIHBvaW50ID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChzW2ldIDwgJzAnIGFuZCBzW2ldID4gJzknKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gcG9pbnQ7Cn0KCmJvb2wgaGFuZGxlX29wZXJhdG9yKHN0cmluZyBzLCBpbnQgJmksIHN0cmluZyAmdG1wKSB7CiAgICBpZiAoKGkgPCBzLnNpemUoKSAtIDEpKSB7CiAgICAgICAgc3RyaW5nIG5ld1M7CiAgICAgICAgbmV3UyArPSBzW2ldOwogICAgICAgIG5ld1MgKz0gc1tpICsgMV07CiAgICAgICAgLy8gY291dCA8PCBuZXdTIDw8IGVuZGw7CiAgICAgICAgaWYgKGNwcE9wZXJhdG9ycy5maW5kKG5ld1MpICE9IGNwcE9wZXJhdG9ycy5lbmQoKSkgewogICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKG5ld1MpOwogICAgICAgICAgICAgICAgdG1wID0gIiI7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKdm9pZCBnZXRUb2tlbihzdHJpbmcgcykgewogICAgc3RyaW5nIHRtcDsKICAgIGludCBjbnQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgaWYgKGlzTnVtYmVyKHNbaV0pKSB7CiAgICAgICAgICAgIHN0cmluZyBudW07CiAgICAgICAgICAgIHdoaWxlIChpIDwgcy5zaXplKCkgYW5kIChpc051bWJlcihzW2ldKSBvciAoc1tpXSA9PSAnLicpKSkgewogICAgICAgICAgICAgICAgbnVtICs9IHNbaV07CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayhudW0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzU3ltYm9sKHNbaV0pKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGkgLSAxICE9IC0xIGFuZAogICAgICAgICAgICAgICAgaSArIDEgIT0gcy5zaXplKCkgYW5kCiAgICAgICAgICAgICAgICBzW2kgLSAxXSAhPSAnICcgYW5kCiAgICAgICAgICAgICAgICBzW2kgKyAxXSAhPSAnICcKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBpZiAodG1wLnNpemUoKSkgdG9rZW5zLnB1c2hfYmFjayh0bXApOwogICAgICAgICAgICAgICAgc3RyaW5nIHN0cjsKICAgICAgICAgICAgICAgIHN0ciArPSBzW2ldOwoKICAgICAgICAgICAgICAgIGlmIChoYW5kbGVfb3BlcmF0b3IocywgaSwgdG1wKSkgY29udGludWU7CgogICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayhzdHIpOwoKICAgICAgICAgICAgICAgIHRtcCA9ICIiOwoKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3RyaW5nIHN0cjsKICAgICAgICAgICAgICAgIHN0ciArPSBzW2ldOwoKICAgICAgICAgICAgICAgIGlmICh0bXAuc2l6ZSgpKSB0b2tlbnMucHVzaF9iYWNrKHRtcCk7CgogICAgICAgICAgICAgICAgaWYgKGhhbmRsZV9vcGVyYXRvcihzLCBpLCB0bXApKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKHN0cik7CgogICAgICAgICAgICAgICAgdG1wID0gIiI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0gCiAgICAgICAgZWxzZSBpZiAoc1tpXSA9PSAnICcgYW5kICFpc1N5bWJvbChzW2kgLSAxXSkpIHsKCiAgICAgICAgICAgIGlmICh0bXAuc2l6ZSgpKSB0b2tlbnMucHVzaF9iYWNrKHRtcCk7CiAgICAgICAgICAgIHRtcCA9ICIiOwogICAgICAgIH0KCiAgICAgICAgaWYgKChzW2ldICE9ICcgJykgYW5kIChzdGF0aWNfY2FzdDxpbnQ+KHNbaV0gIT0gOSkpKSB7CgogICAgICAgICAgICB0bXAgKz0gc1tpXTsKICAgICAgICB9CgogICAgfQp9Cgp2ZWN0b3IgPCBzdHJpbmcgPiBnZXRLZXl3b3JkcygpIHsKCiAgICB2ZWN0b3IgPCBzdHJpbmcgPiBrZXl3b3JkczsKICAgIGZvciAoYXV0byBlbDogdG9rZW5zKSB7CgogICAgICAgIGlmIChjcHBLZXl3b3Jkcy5maW5kKGVsKSAhPSBjcHBLZXl3b3Jkcy5lbmQoKSkgCiAgICAgICAgICAgIGtleXdvcmRzLnB1c2hfYmFjayhlbCk7CgogICAgfQoKICAgIHJldHVybiBrZXl3b3JkczsKCn0KCnZlY3RvciA8IHN0cmluZyA+IGdldElkZW50aWZpZXIoKSB7CgogICAgdmVjdG9yIDwgc3RyaW5nID4gaWRlbnRpZmllcjsKCiAgICBmb3IgKGF1dG8gZWw6IHRva2VucykgewogICAgICAgIGlmIChjcHBLZXl3b3Jkcy5maW5kKGVsKSA9PSBjcHBLZXl3b3Jkcy5lbmQoKSBhbmQgIWlzU3ltYm9sKGVsKSBhbmQgIWlzTnVtYmVyKGVsKSBhbmQgIWlzRmxvYXQoZWwpIGFuZCBjcHBPcGVyYXRvcnMuZmluZChlbCkgPT0gY3BwT3BlcmF0b3JzLmVuZCgpKQogICAgICAgICAgICBpZGVudGlmaWVyLnB1c2hfYmFjayhlbCk7CiAgICB9CgogICAgcmV0dXJuIGlkZW50aWZpZXI7Cn0KCnZlY3RvciA8IHN0cmluZyA+IGdldE9wZXJhdG9yKCkgewogICAgdmVjdG9yIDwgc3RyaW5nID4gb3BlcmF0b3JzOwogICAgZm9yIChhdXRvIGVsOiB0b2tlbnMpIHsKICAgICAgICBpZiAoY3BwT3BlcmF0b3JzLmZpbmQoZWwpICE9IGNwcE9wZXJhdG9ycy5lbmQoKSkKICAgICAgICAgICAgb3BlcmF0b3JzLnB1c2hfYmFjayhlbCk7CiAgICB9CgogICAgcmV0dXJuIG9wZXJhdG9yczsKfQoKdmVjdG9yIDwgc3RyaW5nID4gZ2V0U3ltYm9scygpIHsKICAgIHZlY3RvciA8IHN0cmluZyA+IHN5bWJvbHM7CiAgICBmb3IgKGF1dG8gZWw6IHRva2VucykgewogICAgICAgIGlmIChpc1N5bWJvbChlbCkgYW5kIChjcHBPcGVyYXRvcnMuZmluZChlbCkgPT0gY3BwT3BlcmF0b3JzLmVuZCgpKSkKICAgICAgICAgICAgc3ltYm9scy5wdXNoX2JhY2soZWwpOwogICAgfQoKICAgIHJldHVybiBzeW1ib2xzOwp9Cgp2ZWN0b3IgPCBzdHJpbmcgPiBnZXROdW1iZXJzKCkgewogICAgdmVjdG9yIDwgc3RyaW5nID4gbnVtYmVyczsKICAgIGZvciAoYXV0byBlbDogdG9rZW5zKSB7CiAgICAgICAgaWYgKGlzTnVtYmVyKGVsKSkKICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soZWwpOwogICAgfQogICAgcmV0dXJuIG51bWJlcnM7Cn0KCnZlY3RvciA8IHN0cmluZyA+IGdldEZsb2F0cygpIHsKICAgIHZlY3RvciA8IHN0cmluZyA+IGZsb2F0czsKICAgIGZvciAoYXV0byBlbDogdG9rZW5zKSB7CiAgICAgICAgaWYgKGlzRmxvYXQoZWwpKQogICAgICAgICAgICBmbG9hdHMucHVzaF9iYWNrKGVsKTsKICAgIH0KICAgIHJldHVybiBmbG9hdHM7Cn0KCmludCBtYWluKCkgewoKICAgIHN0cmluZyBzOyAKICAgIGludCB0b2tlbiA9IDA7CgogICAgd2hpbGUgKGdldGxpbmUoY2luLCBzKSkgewoKICAgICAgICBnZXRUb2tlbihzKTsKCiAgICB9CgogICAgdmVjdG9yIDwgc3RyaW5nID4ga2V5d29yZHMgPSBnZXRLZXl3b3JkcygpOwogICAgdmVjdG9yIDwgc3RyaW5nID4gaWRlbnRpZmllcnMgPSBnZXRJZGVudGlmaWVyKCk7CiAgICB2ZWN0b3IgPCBzdHJpbmcgPiBvcGVyYXRvcnMgPSBnZXRPcGVyYXRvcigpOwogICAgdmVjdG9yIDwgc3RyaW5nID4gc3ltYm9scyA9IGdldFN5bWJvbHMoKTsKICAgIHZlY3RvciA8IHN0cmluZyA+IG51bWJlcnMgPSBnZXROdW1iZXJzKCk7CiAgICB2ZWN0b3IgPCBzdHJpbmcgPiBmbG9hdHMgPSBnZXRGbG9hdHMoKTsKCiAgICBjb3V0IDw8ICJUb3RhbCBOdW1iZXJzIG9mIFRva2Vuc1x0XHQ6IiA8PCB0b2tlbnMuc2l6ZSgpIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJLZXl3b3Jkc1x0XHRcdFx0XHQ6IiA8PCBrZXl3b3Jkcy5zaXplKCkgPDwgIiAiOwogICAgZm9yIChhdXRvIGVsOiBrZXl3b3JkcykgY291dCA8PCBlbCA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7CiAgICBjb3V0IDw8ICJJZGVudGlmaWVyc1x0XHRcdFx0XHQ6IiA8PCBpZGVudGlmaWVycy5zaXplKCkgPDwgIiAiOwogICAgZm9yIChhdXRvIGVsOiBpZGVudGlmaWVycykgY291dCA8PCBlbCA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7CiAgICBjb3V0IDw8ICJPcGVyYXRvcnNcdFx0XHRcdFx0OiIgPDwgb3BlcmF0b3JzLnNpemUoKSA8PCAiICI7CiAgICBmb3IgKGF1dG8gZWw6IG9wZXJhdG9ycykgY291dCA8PCBlbCA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7CiAgICBjb3V0IDw8ICJTeW1ib2xzXHRcdFx0XHRcdFx0OiIgPDwgc3ltYm9scy5zaXplKCkgPDwgIiAiOwogICAgZm9yIChhdXRvIGVsOiBzeW1ib2xzKSBjb3V0IDw8IGVsIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKICAgIGNvdXQgPDwgIkludGVnZXIgQ29uc3RhbnRzXHRcdFx0OiIgPDwgbnVtYmVycy5zaXplKCkgPDwgIiAiOwogICAgZm9yIChhdXRvIGVsOiBudW1iZXJzKSBjb3V0IDw8IGVsIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKICAgIGNvdXQgPDwgIkZsb2F0aW5nIFBvaW50IENvbnN0YW50c1x0OiIgPDwgZmxvYXRzLnNpemUoKSA8PCAiICI7CiAgICBmb3IgKGF1dG8gZWw6IGZsb2F0cykgY291dCA8PCBlbCA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=