import sys
def addToLevel(name, levelwise, level, number):
if(name.strip()):
if(number == 0):
number = 1
levelwise[level][name] = number
def atomprinter(atoms):
for atom in atoms:
print(atom + ": " + str(atoms[atom]))
def getNumber(formula, start):
number = 0
for index in range(start, len(formula)):
if(formula[index].isdigit()):
number = number * 10 + int(formula[index])
else:
return number, index
return number, index + 1
def getElement(formula, start):
if start == len(formula) - 1:
return formula[start], len(formula)
if(formula[start + 1].islower()):
return formula[start:start + 2], start + 2
else:
return formula[start], start + 1
def mergeLevel(levelWise, level, number):
if(number == 0):
number = 1
previous = levelWise[level - 1]
current = levelWise[level]
for key in current:
if(key in previous):
previous[key] += (number * current[key])
else:
previous[key] = current[key] * number
levelWise.pop(level)
return levelWise
def atomfinder(formula):
formula = formula.strip()
levelwise = {}
levelwise[0] = {}
level = 0
name = ''
number = 0
index = 0
while index >= 0 and index < len(formula):
char = formula[index]
if(char == '('):
addToLevel(name, levelwise, level, number)
name = ''
level += 1
levelwise[level] = {}
index += 1
elif(char == ')'):
addToLevel(name, levelwise, level, number)
number = 0
name = ''
if(index < len(formula) - 1):
if(formula[index + 1].isdigit):
number, index = getNumber(formula, index + 1)
else:
index += 1
else:
index += 1
levelwise = mergeLevel(levelwise, level, number)
level -= 1
elif(char.isupper()):
addToLevel(name, levelwise, level, number)
name = ''
number = 0
name, index = getElement(formula, index)
elif(char.isdigit()):
number, index = getNumber(formula, index)
addToLevel(name, levelwise, level, number)
atomprinter(levelwise[0])
def main():
for formula in sys.stdin:
atomfinder(formula.strip())
if __name__ == '__main__':
main()
aW1wb3J0IHN5cwoKCmRlZiBhZGRUb0xldmVsKG5hbWUsIGxldmVsd2lzZSwgbGV2ZWwsIG51bWJlcik6CiAgICBpZihuYW1lLnN0cmlwKCkpOgogICAgICAgIGlmKG51bWJlciA9PSAwKToKICAgICAgICAgICAgbnVtYmVyID0gMQogICAgICAgIGxldmVsd2lzZVtsZXZlbF1bbmFtZV0gPSBudW1iZXIKCgpkZWYgYXRvbXByaW50ZXIoYXRvbXMpOgogICAgZm9yIGF0b20gaW4gYXRvbXM6CiAgICAgICAgcHJpbnQoYXRvbSArICI6ICIgKyBzdHIoYXRvbXNbYXRvbV0pKQoKCmRlZiBnZXROdW1iZXIoZm9ybXVsYSwgc3RhcnQpOgogICAgbnVtYmVyID0gMAogICAgZm9yIGluZGV4IGluIHJhbmdlKHN0YXJ0LCBsZW4oZm9ybXVsYSkpOgogICAgICAgIGlmKGZvcm11bGFbaW5kZXhdLmlzZGlnaXQoKSk6CiAgICAgICAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgaW50KGZvcm11bGFbaW5kZXhdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBudW1iZXIsIGluZGV4CiAgICByZXR1cm4gbnVtYmVyLCBpbmRleCArIDEKCgpkZWYgZ2V0RWxlbWVudChmb3JtdWxhLCBzdGFydCk6CiAgICBpZiBzdGFydCA9PSBsZW4oZm9ybXVsYSkgLSAxOgogICAgICAgIHJldHVybiBmb3JtdWxhW3N0YXJ0XSwgbGVuKGZvcm11bGEpCiAgICBpZihmb3JtdWxhW3N0YXJ0ICsgMV0uaXNsb3dlcigpKToKICAgICAgICByZXR1cm4gZm9ybXVsYVtzdGFydDpzdGFydCArIDJdLCBzdGFydCArIDIKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGZvcm11bGFbc3RhcnRdLCBzdGFydCArIDEKCgpkZWYgbWVyZ2VMZXZlbChsZXZlbFdpc2UsIGxldmVsLCBudW1iZXIpOgogICAgaWYobnVtYmVyID09IDApOgogICAgICAgIG51bWJlciA9IDEKICAgIHByZXZpb3VzID0gbGV2ZWxXaXNlW2xldmVsIC0gMV0KICAgIGN1cnJlbnQgPSBsZXZlbFdpc2VbbGV2ZWxdCiAgICBmb3Iga2V5IGluIGN1cnJlbnQ6CiAgICAgICAgaWYoa2V5IGluIHByZXZpb3VzKToKICAgICAgICAgICAgcHJldmlvdXNba2V5XSArPSAobnVtYmVyICogY3VycmVudFtrZXldKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByZXZpb3VzW2tleV0gPSBjdXJyZW50W2tleV0gKiBudW1iZXIKICAgIGxldmVsV2lzZS5wb3AobGV2ZWwpCiAgICByZXR1cm4gbGV2ZWxXaXNlCgoKZGVmIGF0b21maW5kZXIoZm9ybXVsYSk6CiAgICBmb3JtdWxhID0gZm9ybXVsYS5zdHJpcCgpCiAgICBsZXZlbHdpc2UgPSB7fQogICAgbGV2ZWx3aXNlWzBdID0ge30KICAgIGxldmVsID0gMAogICAgbmFtZSA9ICcnCiAgICBudW1iZXIgPSAwCiAgICBpbmRleCA9IDAKICAgIHdoaWxlIGluZGV4ID49IDAgYW5kIGluZGV4IDwgbGVuKGZvcm11bGEpOgogICAgICAgIGNoYXIgPSBmb3JtdWxhW2luZGV4XQogICAgICAgIGlmKGNoYXIgPT0gJygnKToKICAgICAgICAgICAgYWRkVG9MZXZlbChuYW1lLCBsZXZlbHdpc2UsIGxldmVsLCBudW1iZXIpCiAgICAgICAgICAgIG5hbWUgPSAnJwogICAgICAgICAgICBsZXZlbCArPSAxCiAgICAgICAgICAgIGxldmVsd2lzZVtsZXZlbF0gPSB7fQogICAgICAgICAgICBpbmRleCArPSAxCiAgICAgICAgZWxpZihjaGFyID09ICcpJyk6CiAgICAgICAgICAgIGFkZFRvTGV2ZWwobmFtZSwgbGV2ZWx3aXNlLCBsZXZlbCwgbnVtYmVyKQogICAgICAgICAgICBudW1iZXIgPSAwCiAgICAgICAgICAgIG5hbWUgPSAnJwogICAgICAgICAgICBpZihpbmRleCA8IGxlbihmb3JtdWxhKSAtIDEpOgogICAgICAgICAgICAgICAgaWYoZm9ybXVsYVtpbmRleCArIDFdLmlzZGlnaXQpOgogICAgICAgICAgICAgICAgICAgIG51bWJlciwgaW5kZXggPSBnZXROdW1iZXIoZm9ybXVsYSwgaW5kZXggKyAxKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbmRleCArPSAxCiAgICAgICAgICAgIGxldmVsd2lzZSA9IG1lcmdlTGV2ZWwobGV2ZWx3aXNlLCBsZXZlbCwgbnVtYmVyKQogICAgICAgICAgICBsZXZlbCAtPSAxCiAgICAgICAgZWxpZihjaGFyLmlzdXBwZXIoKSk6CiAgICAgICAgICAgIGFkZFRvTGV2ZWwobmFtZSwgbGV2ZWx3aXNlLCBsZXZlbCwgbnVtYmVyKQogICAgICAgICAgICBuYW1lID0gJycKICAgICAgICAgICAgbnVtYmVyID0gMAogICAgICAgICAgICBuYW1lLCBpbmRleCA9IGdldEVsZW1lbnQoZm9ybXVsYSwgaW5kZXgpCiAgICAgICAgZWxpZihjaGFyLmlzZGlnaXQoKSk6CiAgICAgICAgICAgIG51bWJlciwgaW5kZXggPSBnZXROdW1iZXIoZm9ybXVsYSwgaW5kZXgpCiAgICBhZGRUb0xldmVsKG5hbWUsIGxldmVsd2lzZSwgbGV2ZWwsIG51bWJlcikKICAgIGF0b21wcmludGVyKGxldmVsd2lzZVswXSkKCgpkZWYgbWFpbigpOgogICAgZm9yIGZvcm11bGEgaW4gc3lzLnN0ZGluOgogICAgICAgIGF0b21maW5kZXIoZm9ybXVsYS5zdHJpcCgpKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQ==