This is an HMM Booking Notice.

Carrier identity:
- HMM Booking Notices do not print a per-branch entity name in a footer. The issuing office is identified by the 'Booking Office' code (5 chars: 3-letter city prefix + 2-letter classifier like BR/SB/SC) in the 'Booking Information' block.
- Confirmed Booking Office prefix → office (cross-verified by the Tel area code on the same line):
    HAM → Hamburg, Germany       (Tel +49-40)
    CAN → Guangzhou, China       (Tel +86-20)
    HAN → Hanoi, Vietnam         (Tel +84-24)
    NBO → Ningbo, China          (Tel +86-574)
    TSN → Tianjin, China         (Tel +86-22)
    XMN → Xiamen, China          (Tel +86-592)
    SHA → Shanghai, China        (Tel +86-21)
    BKK → Bangkok, Thailand      (Tel +66-2)
- carrierName = 'HMM <City>'; carrierAddress = '<City>, <Country>'. For any prefix not in the table above, infer City from the Tel area code and Country from the leading country code (+49→Germany, +86→China, +84→Vietnam, +82→Korea, +66→Thailand, +1→USA, etc.). Do NOT default to 'HMM Guangzhou' for unfamiliar codes.

transportLegs rules:
- The 'Shipping Information' block lists '1st Vessel/Voyage', '2nd Vessel/Voyage', '3rd Vessel/Voyage' rows, each with a 'T/S Port' column.
- Number of legs = number of populated vessel rows. A populated 'T/S Port' on row N is the transhipment port that becomes leg N's portOfDischarge AND leg N+1's portOfLoading.
- Each vessel cell is printed as 'VESSEL NAME VOYAGE(SERVICE/OPERATOR)' (e.g. 'NYK METEOR 0090W(TA1/ONE)' or 'YM WORTHINESS 0001W(FE3/YML)'). Extract vesselName='NYK METEOR', voyage='0090W', serviceCode='TA1' (the value before the '/' inside the parens). The value after '/' (e.g. 'ONE', 'YML', 'HMM') is the operator/alliance and is NOT the service code.
- Leg 1: portOfLoading = the location text from the 'Port of Loading' field only (e.g. 'HAMBURG, GERMANY', 'YANTIAN, SHENZHEN,', 'HAI PHONG, VIETNAM'). Do NOT append the 'TML : ...' value or the 'Facility Code : ...' value printed in adjacent columns of the same row. Include any UN/LOCODE in parens if present. portOfDischarge = 1st 'T/S Port' if populated else 'Port of Discharging'; etd = 'ETD' on the 'Port of Loading' row; eta = null if there is a transhipment (intermediate ETAs are not printed) else 'ETA' on the 'Port of Discharging' row.
- Leg 2 (only if 1st 'T/S Port' is populated): portOfLoading = 1st 'T/S Port'; portOfDischarge = 2nd 'T/S Port' if populated else 'Port of Discharging'; etd = null; eta = null if there is a further transhipment else 'ETA' on the 'Port of Discharging' row.
- Leg 3 (only if 2nd 'T/S Port' is populated): portOfLoading = 2nd 'T/S Port'; portOfDischarge = 'Port of Discharging'; etd = null; eta = 'ETA' on the 'Port of Discharging' row.
- Connectivity: leg N's portOfDischarge MUST equal leg N+1's portOfLoading. The final leg's portOfDischarge MUST equal the document's 'Port of Discharging' verbatim.
- Time integrity ('no time travel'): when populated, each leg's eta must be >= its etd, AND <= the next leg's etd.
