#!/usr/bin/env python
import sys
from datetime import datetime
from itertools import groupby
# find all 'name: value' pairs
file = sys.stdin
pairs = ([s.strip() for s in line.partition(':')[::2]]
for line in file if ':' in line)
# group records
def record_start(pair, count=[False]):
"""Mark start of a record."""
if pair[0] == 'Build':
count[0] = not count[0]
return count[0]
records = (dict(record) for _, record in groupby(pairs, record_start))
approved = (r for r in records if r.get('Status') == 'Approved' and
all(r.get(name) for name in "BuildDate Location".split()))
# find latest record
def get_date(record):
try:
return datetime.strptime(record['BuildDate'], '%m/%d/%Y %H:%M:%S')
except ValueError:
return datetime.min # handle invalid date strings
latest = max(approved, key=get_date)
assert get_date(latest) != datetime.min
print(latest['Location'])
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmltcG9ydCBzeXMKZnJvbSBkYXRldGltZSAgaW1wb3J0IGRhdGV0aW1lCmZyb20gaXRlcnRvb2xzIGltcG9ydCBncm91cGJ5CgojIGZpbmQgYWxsICduYW1lOiB2YWx1ZScgcGFpcnMKZmlsZSA9IHN5cy5zdGRpbgpwYWlycyA9IChbcy5zdHJpcCgpIGZvciBzIGluIGxpbmUucGFydGl0aW9uKCc6JylbOjoyXV0KICAgICAgICAgZm9yIGxpbmUgaW4gZmlsZSBpZiAnOicgaW4gbGluZSkKCiMgZ3JvdXAgcmVjb3JkcwpkZWYgcmVjb3JkX3N0YXJ0KHBhaXIsIGNvdW50PVtGYWxzZV0pOgogICAgIiIiTWFyayBzdGFydCBvZiBhIHJlY29yZC4iIiIKICAgIGlmIHBhaXJbMF0gPT0gJ0J1aWxkJzoKICAgICAgICBjb3VudFswXSA9IG5vdCBjb3VudFswXQogICAgcmV0dXJuIGNvdW50WzBdCnJlY29yZHMgPSAoZGljdChyZWNvcmQpIGZvciBfLCByZWNvcmQgaW4gZ3JvdXBieShwYWlycywgcmVjb3JkX3N0YXJ0KSkKCmFwcHJvdmVkID0gKHIgZm9yIHIgaW4gcmVjb3JkcyBpZiByLmdldCgnU3RhdHVzJykgPT0gJ0FwcHJvdmVkJyBhbmQKICAgICAgICAgICAgYWxsKHIuZ2V0KG5hbWUpIGZvciBuYW1lIGluICJCdWlsZERhdGUgTG9jYXRpb24iLnNwbGl0KCkpKQoKIyBmaW5kIGxhdGVzdCByZWNvcmQKZGVmIGdldF9kYXRlKHJlY29yZCk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHJlY29yZFsnQnVpbGREYXRlJ10sICclbS8lZC8lWSAlSDolTTolUycpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByZXR1cm4gZGF0ZXRpbWUubWluICMgaGFuZGxlIGludmFsaWQgZGF0ZSBzdHJpbmdzCgpsYXRlc3QgPSBtYXgoYXBwcm92ZWQsIGtleT1nZXRfZGF0ZSkKYXNzZXJ0IGdldF9kYXRlKGxhdGVzdCkgIT0gZGF0ZXRpbWUubWluCnByaW50KGxhdGVzdFsnTG9jYXRpb24nXSk=
SU5QVVQ6LQpCdWlsZDogICAgICAgICAgTTEyMzRCQUFBQU5BQVc5MzIxLjEKTG9jYXRpb246ICAgICAgIFxcZHJleWVyc1xidWlsZHM0NjhcSU5URUdSQVRJT05cTTEyMzRCQUFBQU5BQTkzMjEuMQpDb21tZW50czogICAgICAgQnVpbGQgY29tcGxldGVkLCBsYWJlbGVkLCBhbmQgbWFya2VkIGZvciByZXRlbnRpb24uClN0YXR1czogICAgICAgICBBcHByb3ZlZApCdWlsZERhdGU6ICAgICAgMTAvMjUvMjAxMiAxMjo1MToyNQoKCkJ1aWxkOiAgICAgICAgICBNMTIzNEJBQUFBTkFBVzkzMjEuMgpMb2NhdGlvbjogICAgICAgXFxjcm1ibGQwMVxCdWlsZHNcRkFJTEVEXE0xMjM0QkFBQUFOQUE5MzIxLjIKQ29tbWVudHM6ICAgICAgIFRoZSBidWlsZCBpcyBjdXJyZW50bHkgaW4gYSBmYWlsZWQgc3RhdHVzLgpTdGF0dXM6ICAgICAgICAgRmFpbGVkCkJ1aWxkRGF0ZTogICAgICAxMC8yNS8yMDEyIDE5OjM3OjE3CgoKQnVpbGQ6ICAgICAgICAgIE0xMjM0QkFBQUFOQUFXOTMyMS4zCkxvY2F0aW9uOiAgICAgICBcXGZyZWV6ZVxidWlsZHM0MjdcSU5URUdSQVRJT05cTTEyMzRCQUFBQU5BQTkzMjEuMwpDb21tZW50czogICAgICAgQnVpbGQgY29tcGxldGVkLCBsYWJlbGVkLCBhbmQgbWFya2VkIGZvciByZXRlbnRpb24uClN0YXR1czogICAgICAgICBBcHByb3ZlZApCdWlsZERhdGU6ICAgICAgMTAvMjUvMjAxMiAxOTo0MzoyOAoKT1VUUFVUOi1cXGZyZWV6ZVxidWlsZHM0MjdcSU5URUdSQVRJT05cTTEyMzRCQUFBQU5BQTkzMjEuMwoK
INPUT:-
Build: M1234BAAAANAAW9321.1
Location: \\dreyers\builds468\INTEGRATION\M1234BAAAANAA9321.1
Comments: Build completed, labeled, and marked for retention.
Status: Approved
BuildDate: 10/25/2012 12:51:25
Build: M1234BAAAANAAW9321.2
Location: \\crmbld01\Builds\FAILED\M1234BAAAANAA9321.2
Comments: The build is currently in a failed status.
Status: Failed
BuildDate: 10/25/2012 19:37:17
Build: M1234BAAAANAAW9321.3
Location: \\freeze\builds427\INTEGRATION\M1234BAAAANAA9321.3
Comments: Build completed, labeled, and marked for retention.
Status: Approved
BuildDate: 10/25/2012 19:43:28
OUTPUT:-\\freeze\builds427\INTEGRATION\M1234BAAAANAA9321.3