const im = (o) => ({ ...BLANK_MEMBER(), unit: '2/B/1-502 IN', ...o });
const INF_BILLETS = [
['PL','Platoon Leader (O-1/2)'], ['PSG','Platoon Sergeant (E-7)'], ['RTO','Radio Operator'], ['68W','Platoon Medic'], ['FO','Forward Observer (13F)'],
['SL','1st Squad Leader'], ['TL','Alpha Team Leader'], ['GRN','Grenadier'], ['AR','Automatic Rifleman'], ['RFL','Rifleman'], ['TL','Bravo Team Leader'], ['GRN','Grenadier'], ['AR','Automatic Rifleman'], ['RFL','Rifleman'],
['SL','2nd Squad Leader'], ['TL','Alpha Team Leader'], ['GRN','Grenadier'], ['AR','Automatic Rifleman'], ['RFL','Rifleman'], ['TL','Bravo Team Leader'], ['GRN','Grenadier'], ['AR','Automatic Rifleman'], ['RFL','Rifleman'],
['SL','3rd Squad Leader'], ['TL','Alpha Team Leader'], ['GRN','Grenadier'], ['AR','Automatic Rifleman'], ['RFL','Rifleman'], ['TL','Bravo Team Leader'], ['GRN','Grenadier'], ['AR','Automatic Rifleman'], ['RFL','Rifleman'],
['WSL','Weapons Squad Leader'], ['MG','Gunner (M240)'], ['AG','Assistant Gunner'], ['AB','Ammo Bearer'], ['MG','Gunner (M240)'], ['AG','Assistant Gunner'], ['AB','Ammo Bearer'],
];
const INF_SQUADS = [
{ name: 'Platoon HQ', slots: [0,1,2,3,4] },
{ name: '1st Squad · A / B teams', slots: [5,6,7,8,9,10,11,12,13] },
{ name: '2nd Squad · A / B teams', slots: [14,15,16,17,18,19,20,21,22] },
{ name: '3rd Squad · A / B teams', slots: [23,24,25,26,27,28,29,30,31] },
{ name: 'Weapons Squad · 2 × M240', slots: [32,33,34,35,36,37,38] },
];
const IDS = ['HQ1','HQ2','HQ3','HQ4','HQ5', '1SL','1A1','1A2','1A3','1A4','1B1','1B2','1B3','1B4', '2SL','2A1','2A2','2A3','2A4','2B1','2B2','2B3','2B4', '3SL','3A1','3A2','3A3','3A4','3B1','3B2','3B3','3B4', 'WSL','W11','W12','W13','W21','W22','W23'];
const NAMES = [
['CARRINGTON, J.','4410','O+',82], ['MALDONADO, R.','7731','A+',94], ['PIKE, T.','0952','B+',78], ['OSEI, K.','3318','O-',80], ['BRANDT, E.','6604','A-',85],
['HOLLIS, D.','2210','O+',90], ['NAVARRO, L.','8842','A+',84], ['TREMBLAY, S.','5573','O+',79], ['WASHINGTON, M.','1187','B-',96], ['GUTIERREZ, A.','9015','O+',77], ['FENN, C.','4478','AB+',83], ['ODUYA, P.','2296','O-',81], ['KELLERMAN, B.','6602','A+',92], ['SZABO, N.','3396','O+',76],
['REDFEATHER, W.','7702','B+',88], ['LARKIN, T.','1348','O+',82], ['MBATHA, S.','8823','A+',80], ['DOMINGUEZ, E.','5561','O-',95], ['COLE, J.','2094','O+',78], ['YOUNGBLOOD, K.','6075','A-',86], ['PATEL, R.','9941','B+',79], ['SORENSEN, H.','2267','O+',93], ['BAKER, D.','8810','AB-',75],
['VILLARREAL, M.','5533','O+',89], ['ABARA, C.','4482','A+',83], ['LINDGREN, P.','0119','O+',81], ['HAWKINS, T.','7726','B+',97], ['MORENO, J.','3104','O-',80], ['DUFRESNE, A.','8804','A+',84], ['KIM, S.','1190','O+',77], ['BELLAMY, R.','4437','A+',91], ['OYELOWO, T.','9026','O+',78],
['STRICKLAND, G.','3351','B-',93], ['RAMIREZ, D.','6612','O+',90], ['FOSTER, K.','0388','A+',85], ['NDIAYE, M.','7745','O+',88], ['HALVERSON, E.','2201','O-',92], ['CRUZ, A.','5589','B+',84], ['WEBB, L.','2273','A-',86],
];
const OVER = {
9:  { evac:'urgent', triage:'immediate', mechanism:['GSW'], allergies:'NKDA',
injuries:[{view:'front',x:78,y:295,type:'gsw'},{view:'front',x:130,y:200,type:'gsw'}],
tourniquets:{ ...EMPTY_TQ(), rLeg:{active:true,type:'CAT',time:'1412',position:'Proximal'} },
vitals:[{time:'1408',hr:'134',sbp:'86',dbp:'54',rr:'26',spo2:'92',pain:'9'},{time:'1416',hr:'122',sbp:'94',dbp:'60',rr:'22',spo2:'95',pain:'6'},{time:'1424',hr:'112',sbp:'100',dbp:'66',rr:'18',spo2:'97',pain:'4'}],
draftVitals:{hr:'112',sbp:'100',dbp:'66',rr:'18',spo2:'97',pain:'4'}, avpu:'V',
interventions:['M:Tourniquet applied','M:Wound packed (hemostatic)','M:TXA 2g IV/IO','C:IV 18g established','C:Whole blood started','H:HPMK applied','P:Ketamine IV/IO 20–30 mg','A2:Ertapenem 1 g IV/IM'],
medsGiven:[{id:1,time:'1413',name:'TXA',dose:'2 g IV'},{id:2,time:'1419',name:'Ketamine IV',dose:'30 mg'}], fluidsGiven:[{id:1,time:'1418',type:'Whole Blood',vol:'500'}],
pain:{rung:'severe'}, abx:{erta:true}, ammo:'red',
notes:'1410: Contact from tree line, GSW R thigh + L flank. CAT high on R thigh, bleeding controlled, L flank packed. IV R AC 18g, TXA 2 g, FWB from PSG (O+). HPMK on. CCP at bldg 4.' },
17: { evac:'priority', triage:'delayed', mechanism:['IED','Blast','Burn'], injuries:[{view:'front',x:100,y:180,type:'shrap'},{view:'back',x:60,y:380,type:'frac'}], burnedRegions:['f-rArm','f-chest'],
vitals:[{time:'1411',hr:'116',sbp:'118',dbp:'76',rr:'24',spo2:'95',pain:'8'},{time:'1425',hr:'104',sbp:'122',dbp:'78',rr:'20',spo2:'96',pain:'5'}], draftVitals:{hr:'104',sbp:'122',dbp:'78',rr:'20',spo2:'96',pain:'5'},
interventions:['R:SpO₂ monitored','C:IV 18g established','H:Remove wet / burned clothing','H:HPMK applied','W:Burns covered dry sterile','S:SAM splint applied','S:Distal CSM checked','P:Fentanyl OTFC 800 mcg'],
medsGiven:[{id:1,time:'1414',name:'Fentanyl OTFC',dose:'800 mcg'}], fluidsGiven:[{id:1,time:'1420',type:'LR',vol:'500'}],
burn:{ formula:'parkland', burnTime:'1406', inhal:false, circ:false, uop:[], care:['Stop','Assess','Wounds','Hypothermia'] }, pain:{rung:'moderate'}, equip:'amber',
notes:'1408: Pressure-plate IED, dismounted. Flash burns R arm / ant chest, frag L abdomen, closed L lower-leg fx — splinted.' },
4:  { evac:'routine', triage:'minimal', mechanism:['Blast'], vitals:[{time:'1420',hr:'92',sbp:'132',dbp:'84',rr:'16',spo2:'98',pain:'4'}], draftVitals:{hr:'92',sbp:'132',dbp:'84',rr:'16',spo2:'98',pain:'4'},
tbi:{ loc:false, aoc:true, headache:true }, interventions:['H:TBI screen (MACE 2)','P:Acetaminophen 1 g PO + Meloxicam 15 mg PO'], pain:{rung:'mild'},
notes:'1409: ~5 m from IED, dazed, no LOC. HA 4/10, pupils equal. Pulled off the net, RTO covering FO duties.' },
36: { evac:'routine', triage:'minimal', mechanism:['Fall'], injuries:[{view:'back',x:135,y:150,type:'frac'}], interventions:['S:SAM splint applied','S:Distal CSM checked','P:Acetaminophen 1 g PO + Meloxicam 15 mg PO'], pain:{rung:'mild'},
vitals:[{time:'1330',hr:'88',sbp:'126',dbp:'80',rr:'14',spo2:'99',pain:'5'}], draftVitals:{hr:'88',sbp:'126',dbp:'80',rr:'14',spo2:'99',pain:'5'}, notes:'1328: Fell off wall with the 240 tripod, R shoulder — probable clavicle fx, sling-and-swathe, ambulatory.' },
12: { ammo:'amber' }, 21: { ammo:'amber' }, 30: { ammo:'red' }, 34: { equip:'amber' }, 38: { ammo:'amber' },
};
const PLT = INF_BILLETS.map(([role, title], i) => im({ id: IDS[i], role, title, name: NAMES[i][0], last4: NAMES[i][1], bloodType: NAMES[i][2], pos: i + 1, weight: NAMES[i][3], squad: INF_SQUADS.findIndex(s => s.slots.includes(i)), ...(OVER[i] || {}) }));
window.UNIT_PROFILE = {
key: 'tccc360-inf-v1',
brand: <><b>TCCC</b> · INFANTRY PLATOON VIEW · 360</>,
appClass: 'inf',
unitShort: 'PLT', paxLabel: 'RIFLE PLT · 39 PAX', boardTitle: 'INFANTRY PLATOON STATUS BOARD',
leaderLbl: 'PSG', medicLbl: '68W', leader: 'SFC R. MALDONADO', medic: 'SPC K. OSEI', opName: 'IRON RESOLVE',
pax: 39, squads: INF_SQUADS, billets: INF_BILLETS, blankUnit: '',
blankTitle: 'Blank rifle platoon (39)', blankDesc: 'Empty, fillable platoon — HQ (PL, PSG, RTO, medic, FO), three 9-man rifle squads with A/B fire teams, and a 7-man weapons squad. Enter names, last-4, blood types and weights in the casualty header.',
blankConfirm: 'Start a blank rifle platoon? All names, blood types and casualty data will be cleared.',
resetConfirm: 'Reset the platoon to the sample roster?',
teamName: 'B CO 1-502 IN',
platoons: [ { id: 'P2', name: '2ND PLT', team: PLT } ],
defaultPlatoon: 'P2', defaultSelected: '1A4',
settingsDefaults: { compactStrip: true },
migrate: null,
};