diff --git a/vasl_templates/webapp/data/vehicles/british.json b/vasl_templates/webapp/data/vehicles/british.json
new file mode 100644
index 0000000..0753d7c
--- /dev/null
+++ b/vasl_templates/webapp/data/vehicles/british.json
@@ -0,0 +1,731 @@
+[
+
+{ "name": "Mark VIB",
+ "CS#": 3,
+ "capabilities2": { "sD": 6 },
+ "note_number": "1\u2020",
+ "notes": [ "N", "P" ]
+},
+{ "name": "Mark VIC",
+ "CS#": 3,
+ "capabilities2": { "sD": 6 },
+ "note_number": "1\u2020"
+},
+{ "name": "Tetrarch",
+ "CS#": 3,
+ "capabilities2": { "sD": 6 },
+ "note_number": "2\u2020"
+},
+{ "name": "Tetrarch CS",
+ "CS#": 3,
+ "capabilities2": { "HE": "9\u20201", "s": [ null, "\u20201" ], "sD": 6 },
+ "note_number": "2\u2020",
+ "notes": [ "S\u20201" ]
+},
+{ "name": "Stuart I(a)",
+ "CS#": 4,
+ "capabilities2": { "sD": 5 },
+ "note_number": "3\u2020",
+ "notes": [ "A", "N", "P" ]
+},
+{ "name": "Stuart III(a)",
+ "CS#": 4,
+ "capabilities2": { "HE": [ null, "4+" ], "C": [ [6,"4+"], "\u20201" ], "sD": 5 },
+ "note_number": "3\u2020",
+ "notes": [ "A", "C\u20201", "G", "N", "P" ]
+},
+{ "name": "Stuart V(a)",
+ "CS#": 4,
+ "capabilities2": { "C": "6\u20201", "sD": 5 },
+ "note_number": "4\u2020",
+ "notes": [ "A", "C\u20201", "G" ]
+},
+{ "name": "Locust(a)",
+ "CS#": 3,
+ "capabilities2": { "C": "6\u2020", "sD": 6 },
+ "note_number": "5",
+ "notes": [ "A", "C\u2020" ]
+},
+{ "name": "A9",
+ "CS#": "5:brewup",
+ "capabilities2": { "sD": 6 },
+ "note_number": "6\u2020",
+ "notes": [ "K\u20201", "N" ]
+},
+{ "name": "A9 CS",
+ "CS#": "5:brewup",
+ "capabilities2": { "s": [ null, "\u20202" ], "sD": 6 },
+ "note_number": "6\u2020",
+ "notes": [ "K\u20201", "N", "S\u20202" ]
+},
+{ "name": "A10 Mk IA",
+ "CS#": "5:brewup\u2020",
+ "capabilities2": { "sD": 6 },
+ "note_number": "7\u2020",
+ "notes": [ "B\u20201", "K\u20202", "N" ]
+},
+{ "name": "A10 Mk IA CS",
+ "CS#": "5:brewup\u2020",
+ "capabilities2": { "s": [ null, "\u20202" ], "sD": 6 },
+ "note_number": "7\u2020",
+ "notes": [ "K\u20201", "N", "S\u20202" ]
+},
+{ "name": "A13 Mk I",
+ "CS#": "4:brewup",
+ "capabilities2": { "sD": 6 },
+ "note_number": "8",
+ "notes": [ "K\u2020" ]
+},
+{ "name": "A13 Mk II",
+ "CS#": "4:brewup",
+ "capabilities2": { "sD": 6 },
+ "note_number": "8\u2020",
+ "notes": [ "B\u20201", "K\u20202", "N" ]
+},
+{ "name": "A13 Mk II CS",
+ "CS#": "4:brewup",
+ "capabilities2": { "s": [ null, "\u20202" ], "sD": 6 },
+ "note_number": "8\u2020",
+ "notes": [ "K\u20201", "N", "S\u20202" ]
+},
+{ "name": "Crusader I",
+ "CS#": "5:brewup",
+ "capabilities2": { "sM": 8 },
+ "note_number": "9\u2020",
+ "notes": [ "K\u20201", "N" ]
+},
+{ "name": "Crusader I CS",
+ "CS#": "5:brewup",
+ "capabilities2": { "HE": 9, "s": [ null, "\u20202" ], "sM": 8 },
+ "note_number": "9\u2020",
+ "notes": [ "K\u20201", "N", "S\u20202" ]
+},
+{ "name": "Crusader II",
+ "CS#": "4:brewup",
+ "capabilities2": { "sM": 8 },
+ "note_number": "9\u2020",
+ "notes": [ "K\u20201", "N" ]
+},
+{ "name": "Crusader II CS",
+ "CS#": "4:brewup",
+ "capabilities2": { "HE": 9, "s": [ null, "\u20202" ], "sM": 8 },
+ "note_number": "9\u2020",
+ "notes": [ "K\u20201", "N", "S\u20202" ]
+},
+{ "name": "Crusader III",
+ "CS#": "3:brewup",
+ "capabilities2": { "HE": [ [7,"F3+"], "\u20201" ], "sD": 7, "sM": "8\u20202" },
+ "note_number": "10\u2020",
+ "notes": [ "N", "Y\u20201", "Z\u20202" ]
+},
+{ "name": "Grant(a)",
+ "CS#": 6,
+ "capabilities2": { "HE": [ null, "4+" ], "C": [ [5,"4+"], "\u20201" ], "s": "8\u2020", "sM": 8 },
+ "note_number": "11\u2020",
+ "notes": [ "A", "C\u20201", "G", "N", "P" ]
+},
+{ "name": "Lee(a)",
+ "CS#": 7,
+ "capabilities2": { "HE": [ null, "4+" ], "C": [ [5,"4+"], "\u20201" ], "s": "8\u2020", "sD": 6 },
+ "note_number": "11\u2020",
+ "notes": [ "A", "C\u20201", "G", "N", "P" ]
+},
+{ "name": "Sherman II(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "s": 8, "WP": [ [6,"J4+"], "\u20203" ], "sD": 6 },
+ "note_number": "12\u2020",
+ "notes": [ "A", "G", "K\u20202", "N", "R\u20201", "W\u20203" ]
+},
+{ "name": "Sherman III(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "s": 8, "WP": [ [6,"J4+"], "\u20203" ], "sD": 6 },
+ "note_number": "13\u2020",
+ "notes": [ "A", "G", "K\u20202", "N", "R\u20201", "W\u20203" ]
+},
+{ "name": "Sherman V(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "s": 8, "WP": [ [6,"J4+"], "\u20203" ], "sD": 6 },
+ "note_number": "14\u2020",
+ "notes": [ "A", "G", "K\u20202", "P", "R\u20201", "W\u20203" ]
+},
+{ "name": "Sherman IIA(a)",
+ "CS#": 6,
+ "capabilities2": { "A": [ [4,4], [5,5] ], "s": [ [5,5] ], "sM": 8 },
+ "note_number": "15\u2020",
+ "notes": [ "A", "G", "K\u20201" ]
+},
+{ "name": "Sherman IIC(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "HE": 7, "D": [ [5,"S4"], [6,5], "\u20202" ], "sM": 8 },
+ "note_number": "16\u2020",
+ "notes": [ "A", "J\u20202", "K\u20201" ]
+},
+{ "name": "Sherman VC(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "HE": 7, "D": [ [5,"S4"], [6,5], "\u20202" ], "sM": 8 },
+ "note_number": "16\u2020",
+ "notes": [ "A", "J\u20202", "K\u20201" ]
+},
+{ "name": "Sherman IB(a)",
+ "CS#": 6,
+ "capabilities2": { "H": 9, "s": 7, "WP": 9, "sM": 8 },
+ "note_number": "17\u2020",
+ "notes": [ "A", "K\u20201" ]
+},
+{ "name": "Centaur IV",
+ "CS#": 5,
+ "capabilities2": { "H": 6, "s": 9, "sD": 7, "sM": "8\u2020" },
+ "note_number": "18",
+ "notes": [ "S", "Z\u2020" ]
+},
+{ "name": "Cromwell IV",
+ "CS#": 5,
+ "capabilities2": { "s": 8, "WP": 6, "sD": 7, "sM": "8\u20201" },
+ "note_number": "19\u2020",
+ "notes": [ "Z\u20201" ]
+},
+{ "name": "Cromwell VI",
+ "CS#": 5,
+ "capabilities2": { "H": 6, "s": 9, "sD": 7, "sM": "8\u20201" },
+ "note_number": "20\u2020",
+ "notes": [ "S", "Z\u20201" ]
+},
+{ "name": "Cromwell VII",
+ "CS#": 6,
+ "capabilities2": { "s": 8, "WP": 6, "sD": 7, "sM": "8\u2020" },
+ "note_number": "19\u2020",
+ "notes": [ "Z\u20201" ]
+},
+{ "name": "Cromwell VIII",
+ "CS#": 6,
+ "capabilities2": { "H": 6, "s": 9, "sD": 7, "sM": "8\u20201" },
+ "note_number": "20\u2020",
+ "notes": [ "S", "Z\u20201" ]
+},
+{ "name": "Challenger",
+ "CS#": 6,
+ "capabilities2": { "HE": 7, "D": [ [5,"S4"], [6,5], "\u20201" ], "sD": 7, "sM": "8\u20202" },
+ "note_number": "21\u2020",
+ "notes": [ "J\u20201", "Z\u20202" ]
+},
+{ "name": "Comet",
+ "CS#": 6,
+ "capabilities2": { "sD": 7, "sM": "8\u2020" },
+ "note_number": "22",
+ "notes": [ "Z\u2020" ]
+},
+{ "name": "Sherman Dozer(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "s": 8, "WP": 6, "sD": 6 },
+ "note_number": "23\u2020",
+ "notes": [ "A", "G", "K\u20202", "P", "R\u20201" ]
+},
+{ "name": "Sherman Crab(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "s": 8, "WP": 6, "sD": 6 },
+ "note_number": "24\u2020",
+ "notes": [ "A", "G", "K\u20202", "P", "R\u20201" ]
+},
+{ "name": "Matilda I",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "sD": 5 },
+ "note_number": "25\u2020",
+ "notes": [ "B\u20201" ]
+},
+{ "name": "Matilda II",
+ "CS#": 5,
+ "capabilities2": { "sD": 6 },
+ "note_number": "26\u2020",
+ "notes": [ "B\u20201", "K\u20202", "N", "P" ]
+},
+{ "name": "Matilda II CS",
+ "CS#": 5,
+ "capabilities2": { "HE": "9\u20202", "s": [ null, "\u20202" ], "sD": 6 },
+ "note_number": "26\u2020",
+ "notes": [ "K\u20201", "N", "P", "S\u20202" ]
+},
+{ "name": "Valentine II",
+ "CS#": 4,
+ "capabilities2": { "sM": 8 },
+ "note_number": "27\u2020",
+ "notes": [ "N" ]
+},
+{ "name": "Valentine V",
+ "CS#": 4,
+ "capabilities2": { "sM": 8 },
+ "note_number": "28\u2020",
+ "notes": [ "K\u20201", "N" ]
+},
+{ "name": "Valentine VIII",
+ "CS#": 4,
+ "capabilities2": { "HE": 7, "sD": 6 },
+ "note_number": "29",
+ "notes": [ "N" ]
+},
+{ "name": "Valentine XI",
+ "CS#": 4,
+ "capabilities2": { "s": 8, "WP": 6, "sD": 8 },
+ "note_number": "30"
+},
+{ "name": "Churchill I",
+ "CS#": 7,
+ "capabilities2": { "HE": "9\u20202", "s": [ null, "\u20202" ], "sD": [ [5,4] ], "sM": "8\u20201" },
+ "note_number": "31\u2020",
+ "notes": [ "N", "S\u20202", "Z\u20201", "CC" ]
+},
+{ "name": "Churchill IV",
+ "CS#": 7,
+ "capabilities2": { "HE": [ [7,"F3"], [8,"4+"], "\u20201" ], "D": [ [6,"J4"], [7,5], "\u20202" ], "sD": [ [6,"4+"] ], "sM": "8\u20203" },
+ "note_number": "32\u2020",
+ "notes": [ "J\u20202", "N", "Y\u20201", "Z\u20203", "CC" ]
+},
+{ "name": "Churchill V",
+ "CS#": 7,
+ "capabilities2": { "H": 6, "s": 9, "sD": 7, "sM": "8\u20201" },
+ "note_number": "33\u2020",
+ "notes": [ "S", "Z\u20201", "CC" ]
+},
+{ "name": "Churchill VI",
+ "CS#": 7,
+ "capabilities2": { "s": 8, "WP": [ [6,"J4+"], "\u20201" ], "sD": 7, "sM": "8\u20202" },
+ "note_number": "34\u2020",
+ "notes": [ "W\u20201", "Z\u20202", "CC" ]
+},
+{ "name": "Churchill VII",
+ "CS#": 7,
+ "capabilities2": { "s": 8, "WP": 6, "sD": 7, "sM": "8\u20201" },
+ "note_number": "35\u2020",
+ "notes": [ "Z\u20201", "CC" ]
+},
+{ "name": "Churchill VIII",
+ "CS#": 7,
+ "capabilities2": { "H": 6, "s": 9, "sD": 7, "sM": "8\u20201" },
+ "note_number": "35\u2020",
+ "notes": [ "S", "Z\u20201", "CC" ]
+},
+{ "name": "Valentine Bridgelayer",
+ "CS#": 2,
+ "capabilities2": { "sD": 7 },
+ "note_number": "36\u2020",
+ "notes": [ "M", "P" ]
+},
+{ "name": "Churchill Bridgelayer",
+ "CS#": 2,
+ "capabilities2": { "sD": 7 },
+ "note_number": "36\u2020",
+ "notes": [ "M", "CC" ]
+},
+{ "name": "Churchill AVRE",
+ "CS#": 8,
+ "no_if": true,
+ "capabilities2": { "sD": 7, "sM": "8\u20201" },
+ "note_number": "37\u2020",
+ "notes": [ "Z\u20201", "CC" ]
+},
+{ "name": "Churchill Crocodile",
+ "CS#": 7,
+ "capabilities2": { "s": 8, "WP": 6, "sD": 7, "sM": "8\u20201" },
+ "note_number": "38\u2020",
+ "notes": [ "Z\u20201", "CC" ]
+},
+{ "name": "Deacon",
+ "CS#": 5,
+ "capabilities2": { "HE": [ [7,"F3+"], "\u20202" ] },
+ "note_number": "39\u2020",
+ "notes": [ "L\u20201", "N", "Y\u20202" ]
+},
+{ "name": "Wolverine(a)",
+ "CS#": 7,
+ "capabilities2": { "HE": 7, "A": [ [5,"S4"], [6,5], "\u20201" ], "s": [ [5,5] ] },
+ "note_number": "40\u2020",
+ "notes": [ "A", "J\u20201" ]
+},
+{ "name": "Achilles(a)",
+ "CS#": 7,
+ "capabilities2": { "HE": 7, "D": [ [6,"S4"], [7,5], "\u20201" ] },
+ "note_number": "40\u2020",
+ "notes": [ "A", "J\u20201" ]
+},
+{ "name": "Archer",
+ "CS#": 5,
+ "capabilities2": { "HE": 7, "D": [ [6,4], [7,5], "\u20201" ], "sD": 7 },
+ "note_number": "41\u2020",
+ "notes": [ "J\u20201" ]
+},
+{ "name": "Daimler",
+ "CS#": 2,
+ "capabilities2": { "sD": [ [4,"4+"], "\u2020" ] },
+ "note_number": "42\u2020",
+ "notes": [ "M", "N", "P" ]
+},
+{ "name": "Lynx",
+ "CS#": 2,
+ "capabilities2": { "sD": 5 },
+ "note_number": "42\u2020",
+ "notes": [ "L\u20201", "M", "P" ]
+},
+{ "name": "Humber",
+ "CS#": 2,
+ "capabilities2": { "sD": [ [4,"4+"], "\u2020" ] },
+ "note_number": "43\u2020",
+ "notes": [ "L\u20201", "M", "P", "BB\u20202" ]
+},
+{ "name": "Stuart Recce",
+ "CS#": 5,
+ "note_number": "44\u2020",
+ "notes": [ "A", "D", "N", "P" ]
+},
+{ "name": "Humber III LRC",
+ "CS#": 3,
+ "capabilities2": { "sD": 5 },
+ "note_number": "45\u2020",
+ "notes": [ "L\u20201", "N", "P", "Q\u20202" ]
+},
+{ "name": "Otter LRC",
+ "CS#": 3,
+ "capabilities2": { "sD": 5 },
+ "note_number": "45\u2020",
+ "notes": [ "L\u20201", "P", "Q\u20202" ]
+},
+{ "name": "Morris CS9",
+ "CS#": 4,
+ "capabilities2": { "sD": 5 },
+ "note_number": "46\u2020",
+ "notes": [ "N", "Q\u20202", "T\u20203", "X\u20201" ]
+},
+{ "name": "Rolls Royce",
+ "CS#": 3,
+ "capabilities2": { "sD": 5 },
+ "note_number": "47\u2020",
+ "notes": [ "N", "Q\u20202", "T\u20203", "X\u20201" ]
+},
+{ "name": "Marmon-Herrington II ME",
+ "CS#": 4,
+ "note_number": "48\u2020",
+ "notes": [ "L\u20201", "N", "Q\u20202", "T\u20203" ]
+},
+{ "name": "Marmon-Herrington IIv",
+ "CS#": 4,
+ "note_number": "49\u2020",
+ "notes": [ "L\u20201", "N", "AA\u20202" ]
+},
+{ "name": "Marmon-Herrington III MFF",
+ "CS#": 4,
+ "note_number": "48\u2020",
+ "notes": [ "L\u20201", "P", "Q\u20202" ]
+},
+{ "name": "Marmon-Herrington III ME",
+ "CS#": 4,
+ "note_number": "48\u2020",
+ "notes": [ "L\u20201", "N", "Q\u20202", "T\u20203" ]
+},
+{ "name": "Marmon-Herrington IIIv",
+ "CS#": 4,
+ "note_number": "49\u2020",
+ "notes": [ "K\u20202", "L\u20201", "N", "T\u20202" ]
+},
+{ "name": "Humber II",
+ "CS#": 3,
+ "capabilities2": { "sD": 6 },
+ "note_number": "50\u2020",
+ "notes": [ "L\u20201", "N" ]
+},
+{ "name": "Humber III",
+ "CS#": 4,
+ "capabilities2": { "sD": 6 },
+ "note_number": "50\u2020",
+ "notes": [ "K\u20202", "L\u20201", "N", "P" ]
+},
+{ "name": "Humber IV",
+ "CS#": 3,
+ "capabilities2": { "C": [ [6,"4+"], "\u20202" ], "sD": 6 },
+ "note_number": "51\u2020",
+ "notes": [ "A", "C\u20202", "L\u20201", "P" ]
+},
+{ "name": "Daimler",
+ "CS#": 3,
+ "capabilities2": { "sD": 6 },
+ "note_number": "52\u2020",
+ "notes": [ "K\u20201", "N", "P" ]
+},
+{ "name": "AEC I",
+ "CS#": 3,
+ "capabilities2": { "sM": 8 },
+ "note_number": "53\u2020",
+ "notes": [ "N", "X\u20201" ]
+},
+{ "name": "AEC II",
+ "CS#": 4,
+ "capabilities2": { "HE": [ [7,3], [8,"4+"], "\u20201" ], "D": [ [6,"J4"], [7,5], "\u20202" ], "sM": 8 },
+ "note_number": "53",
+ "notes": [ "J\u20202", "X\u2020", "Y\u20201" ]
+},
+{ "name": "AEC III",
+ "CS#": 4,
+ "capabilities2": { "s": 8, "WP": 6, "sM": 8 },
+ "note_number": "53",
+ "notes": [ "X\u2020" ]
+},
+{ "name": "Staghound I(a)",
+ "CS#": 5,
+ "capabilities2": { "C": [ [6,"4+"], "\u20203" ], "sM": 8 },
+ "note_number": "54\u2020",
+ "notes": [ "A", "C\u20203", "G", "K\u20202", "X\u20201" ]
+},
+{ "name": "Staghound II(a)",
+ "CS#": 4,
+ "capabilities2": { "s": 9, "sD": 6 },
+ "note_number": "54\u2020",
+ "notes": [ "A", "K\u20203", "S\u20202", "X\u20201" ]
+},
+{ "name": "Bishop",
+ "CS#": 5,
+ "no_if": true,
+ "capabilities2": { "s": 8 },
+ "note_number": "55\u2020",
+ "notes": [ "K\u20201", "N", "P" ]
+},
+{ "name": "Priest(a)",
+ "CS#": 7,
+ "capabilities2": { "H": 6, "s": 8, "WP": 7 },
+ "note_number": "56\u2020",
+ "notes": [ "A", "N", "P" ]
+},
+{ "name": "Sexton(a)",
+ "CS#": 7,
+ "capabilities2": { "s": 8 },
+ "note_number": "57\u2020",
+ "notes": [ "A", "K\u20201" ]
+},
+{ "name": "M3 GMC(a)",
+ "CS#": 4,
+ "capabilities2": { "s": 8, "WP": [ [7,"J4+"], "\u20201" ] },
+ "note_number": "58\u2020",
+ "notes": [ "A", "N", "W\u20201" ]
+},
+{ "name": "Mk VI AA",
+ "CS#": 2,
+ "note_number": "59\u2020",
+ "notes": [ "N", "O\u20201", "AA\u20202" ]
+},
+{ "name": "Crusader AA",
+ "CS#": "4:brewup",
+ "capabilities2": { "sD": 7 },
+ "note_number": "60\u2020",
+ "notes": [ "AA\u20201" ]
+},
+{ "name": "M17 MGMC(a)",
+ "CS#": 4,
+ "note_number": "61\u2020",
+ "notes": [ "A", "F\u2020", "AA\u20201" ]
+},
+{ "name": "Humber AA",
+ "CS#": 2,
+ "note_number": "62\u2020",
+ "notes": [ "L\u20201", "N", "O\u20202", "AA\u20203" ]
+},
+{ "name": "Staghound AA(a)",
+ "CS#": 3,
+ "note_number": "62\u2020",
+ "notes": [ "A", "F\u2020", "X\u20201", "AA\u20202" ]
+},
+{ "name": "M5(a)",
+ "cs#": "5\u20201",
+ "note_number": "63\u2020",
+ "notes": [ "A", "I\u20201", "N" ]
+},
+{ "name": "M9(a)",
+ "cs#": "4\u20201",
+ "note_number": "63\u2020",
+ "notes": [ "A", "I\u20201", "N" ]
+},
+{ "name": "M5A1(a)",
+ "cs#": "5\u2020",
+ "note_number": "63",
+ "notes": [ "A", "I\u2020" ]
+},
+{ "name": "M9A1(a)",
+ "cs#": "4\u2020",
+ "note_number": "63",
+ "notes": [ "A", "I\u2020" ]
+},
+{ "name": "Carrier A",
+ "CS#": 3,
+ "capabilities2": { "sD": [ [5,"4+"], "\u20201" ] },
+ "note_number": "64\u2020",
+ "notes": [ "N", "P", "U\u20201" ]
+},
+{ "name": "Carrier B",
+ "CS#": 3,
+ "capabilities2": { "sD": [ [5,"4+"], "\u20202" ] },
+ "note_number": "64\u2020",
+ "notes": [ "N", "P", "Q\u20201", "U\u20202" ]
+},
+{ "name": "Carrier C",
+ "CS#": 3,
+ "capabilities2": { "sD": [ [5,"4+"], "\u20201" ] },
+ "note_number": "64\u2020",
+ "notes": [ "N", "P", "U\u20201" ]
+},
+{ "name": "Carrier, MMG A",
+ "CS#": 3,
+ "capabilities2": { "sD": [ [5,"4+"], "\u20202" ] },
+ "note_number": "65\u2020",
+ "notes": [ "N", "P", "Q\u20201", "U\u20202" ]
+},
+{ "name": "Carrier, MMG B",
+ "CS#": 4,
+ "capabilities2": { "sD": [ [5,"4+"], "\u20202" ] },
+ "note_number": "65\u2020",
+ "notes": [ "U\u20202", "BB\u20201" ]
+},
+{ "name": "Carrier, 2-in. MTR",
+ "CS#": 3,
+ "capabilities2": { "IR": [ [null,"2+"], "\u2020" ], "s": 7 },
+ "note_number": "66\u2020",
+ "notes": [ "N", "P", "U\u20201" ]
+},
+{ "name": "Carrier, 3-in. MTR",
+ "CS#": "4:brewup\u20201",
+ "note_number": "67\u2020",
+ "notes": [ "H\u20201", "N", "P", "U", "BB\u20202" ]
+},
+{ "name": "Priest Kangaroo(a)",
+ "CS#": 7,
+ "note_number": "68\u2020",
+ "notes": [ "A", "D" ]
+},
+{ "name": "Ram Kangaroo(a)",
+ "CS#": 7,
+ "note_number": "68\u2020",
+ "notes": [ "A", "D", "K\u20201" ]
+},
+{ "name": "White(a) SC",
+ "cs#": "4\u20201",
+ "note_number": "69\u2020",
+ "notes": [ "A", "I\u20201", "N" ]
+},
+{ "name": "IP Carrier Mk IIA",
+ "CS#": 4,
+ "note_number": "70\u2020",
+ "notes": [ "N", "P", "V", "X\u20201" ]
+},
+{ "name": "IP Carrier Mk IIB",
+ "CS#": 4,
+ "note_number": "70\u2020",
+ "notes": [ "N", "P", "Q\u20202", "V", "X\u20201" ]
+},
+{ "name": "IP Carrier AOV",
+ "CS#": 4,
+ "note_number": "70\u2020",
+ "notes": [ "P", "Q\u20201", "V", "X\u2020" ]
+},
+{ "name": "IP Carrier, 3-in. MTR",
+ "CS#": "5:brewup\u2020",
+ "capabilities": [ "IR" ],
+ "capabilities2": { "s": 8, "WP": 7 },
+ "note_number": "71\u20202",
+ "notes": [ "E\u20203", "H\u2020", "P", "V", "X\u20201", "BB\u20204" ]
+},
+{ "name": "Wasp",
+ "CS#": "3:brewup",
+ "capabilities2": { "sD": "5\u2020" },
+ "note_number": "72\u2020",
+ "notes": [ "K\u20201", "U" ]
+},
+{ "name": "Badger(a)",
+ "CS#": 3,
+ "note_number": "72\u2020",
+ "notes": [ "A", "K\u20201", "M" ]
+},
+{ "name": "Buffalo Mk II(a)",
+ "CS#": 6,
+ "capabilities2": { "sD": "5\u2020" },
+ "note_number": "73\u2020",
+ "notes": [ "A", "D", "AA\u20201" ]
+},
+{ "name": "Buffalo Mk IV(a)",
+ "CS#": 6,
+ "capabilities2": { "sD": "5\u2020" },
+ "note_number": "73\u2020",
+ "notes": [ "A", "D", "E\u20201", "AA\u20202" ]
+},
+{ "name": "Sherman III DD(a)",
+ "CS#": "5:brewup",
+ "capabilities2": { "s": 8, "WP": 6, "sD": 6 },
+ "note_number": "74\u2020",
+ "notes": [ "A", "G", "K\u20202", "R\u20201" ]
+},
+{ "name": "DUKW(a)",
+ "cs#": "7\u20201",
+ "note_number": "75\u2020",
+ "notes": [ "A", "D", "I\u20201", "P" ]
+},
+{ "name": "Terrapin Mk I",
+ "cs#": 7,
+ "note_number": "76\u2020",
+ "notes": [ "D" ]
+},
+{ "name": "2pdr Portee",
+ "CS#": "4\u20201",
+ "note_number": "77\u2020",
+ "notes": [ "H\u20201", "N", "P" ]
+},
+{ "name": "Morris C9/B",
+ "CS#": 4,
+ "note_number": "78\u2020",
+ "notes": [ "P", "AA\u20201" ]
+},
+{ "name": "Loyd Carrier",
+ "cs#": 5,
+ "note_number": "79\u2020",
+ "notes": [ "N", "P" ]
+},
+{ "name": "Quad FAT",
+ "CS#": "5:brewup\u2020",
+ "note_number": "80\u2020",
+ "notes": [ "N", "P" ]
+},
+{ "name": "15-cwt Truck",
+ "cs#": 5,
+ "note_number": "81\u2020",
+ "notes": [ "N", "P" ]
+},
+{ "name": "30-cwt Lorry",
+ "cs#": 6,
+ "note_number": "82\u2020",
+ "notes": [ "N", "P" ]
+},
+{ "name": "3-Ton Lorry",
+ "cs#": 7,
+ "note_number": "83\u2020",
+ "notes": [ "N", "P" ]
+},
+{ "name": "\u00bc-Ton Jeep(a)",
+ "cs#": "2\u20201",
+ "note_number": "84\u2020",
+ "notes": [ "A", "I\u20201", "N", "P" ]
+},
+{ "name": "\u00be-Ton Truck(a)",
+ "cs#": 4,
+ "note_number": "85",
+ "notes": [ "A", "N" ]
+},
+{ "name": "1\u00bd-Ton Truck(a)",
+ "cs#": 6,
+ "note_number": "85",
+ "notes": [ "A", "N" ]
+},
+{ "name": "2\u00bd-Ton Truck(a)",
+ "cs#": 7,
+ "note_number": "85",
+ "notes": [ "A", "N" ]
+},
+{ "name": "7\u00bd-Ton Truck(a)",
+ "cs#": 7,
+ "note_number": "85\u2020",
+ "notes": [ "A", "N" ]
+}
+
+]
diff --git a/vasl_templates/webapp/static/snippets.js b/vasl_templates/webapp/static/snippets.js
index b3dc7f5..ae44670 100644
--- a/vasl_templates/webapp/static/snippets.js
+++ b/vasl_templates/webapp/static/snippets.js
@@ -300,8 +300,8 @@ function make_capabilities( entry, scenario_theater, scenario_year, scenario_mon
capabilities.push( make_raw_capability( key, entry.capabilities2[key] ) ) ;
}
else {
- var cap = select_capability_by_date( entry.capabilities2[key], scenario_theater, scenario_year, scenario_month ) ;
- if ( ! cap )
+ var cap = _select_capability_by_date( entry.capabilities2[key], scenario_theater, scenario_year, scenario_month ) ;
+ if ( cap === null )
continue ;
if ( cap == "" ) {
invalid_caps.push( entry.name + ": " + key + ": " + entry.capabilities2[key] ) ;
@@ -344,6 +344,14 @@ function make_capabilities( entry, scenario_theater, scenario_year, scenario_mon
function make_raw_capability( name, capability )
{
+ // NOTE: The capability can sometimes not have a # e.g. Tetrarch CS has a s# of "ref1".
+ if ( capability[0] === null ) {
+ var cap = capability[1] ;
+ if ( cap.match( /^\d\+?$/ ) )
+ cap = "" + cap + "" ;
+ return name + cap ;
+ }
+
// generate the raw capability string
var buf = [ name ] ;
for ( var i=0 ; i < capability.length ; ++i ) {
@@ -359,56 +367,86 @@ function make_raw_capability( name, capability )
return buf.join( "" ) ;
}
-function select_capability_by_date( capabilities, scenario_theater, scenario_year, scenario_month )
+function _select_capability_by_date( capabilities, scenario_theater, scenario_year, scenario_month )
{
- var MONTH_NAMES = { F:2, J:6, A:8, S:9 } ;
+ // NOTE: The capability can sometimes not have a number e.g. Tetrarch CS s# = "ref1", Stuart III(a) = "HE(4+)"
+ var timestamp, val ;
+ if ( capabilities[0] === null ) {
+ timestamp = capabilities[1] ;
+ if ( timestamp.match( /^\d\+?$/ ) ) {
+ val = _check_capability_timestamp( capabilities, timestamp, scenario_theater, scenario_year, scenario_month ) ;
+ if ( val === "" )
+ return null ;
+ return "";
+ }
+ return timestamp ;
+ }
// initialize
capabilities = capabilities.slice() ;
var ref = has_ref( capabilities ) ;
- var val = "???" ;
+ // check all the capability timestamps
+ var retval = "???" ;
for ( var i=0 ; i < capabilities.length ; ++i ) {
-
- // check for a ETO/PTO-only flag
- var cap = capabilities[i][1].toString() ;
- if ( cap.substring( cap.length-1 ) === "E" ) {
- if ( scenario_theater != "ETO" )
- continue ;
- cap = cap.substring( 0, cap.length-1 ) ;
- }
- if ( cap.substring( cap.length-1 ) === "P" ) {
- if ( scenario_theater != "PTO" )
- continue ;
- cap = cap.substring( 0, cap.length-1 ) ;
- }
- // remove any trailing "+" (FIXME! What does it even mean? Doesn't make sense :-/)
- if ( cap.substring( cap.length-1 ) == "+" )
- cap = cap.substring( 0, cap.length-1 ) ;
- if ( ! cap ) {
- val = capabilities[i][0] ; // nb: the capability is always available
- break ;
- }
- // parse the month/year the capability becomes available
- var month = MONTH_NAMES[ cap.substring(0,1) ] ;
- if ( month )
- cap = cap.substring( 1 ) ;
- if ( ! /^\d$/.test( cap ) )
- return "" ;
- cap = parseInt( cap ) ;
- // check if the capabilitity is available
- if ( scenario_year > 1940 + cap )
- val = capabilities[i][0] ;
- else if ( scenario_year == 1940 + cap ) {
- if( !month || scenario_month >= month )
- val = capabilities[i][0] ;
- }
+ timestamp = capabilities[i][1].toString() ;
+ val = _check_capability_timestamp( capabilities[i], timestamp, scenario_theater, scenario_year, scenario_month ) ;
+ if ( val === "" )
+ return val ;
+ if ( val === "" )
+ continue ;
+ retval = val ;
}
- if ( val === "???" )
+ if ( retval === "???" )
return null ;
- if ( val === null )
- val = "" ; // nb: this can happen for IR
- return ref ? val+ref : val ;
+ if ( retval === null )
+ retval = "" ; // nb: this can happen for IR
+ return ref ? retval+ref : retval ;
+}
+
+function _check_capability_timestamp( capabilities, timestamp, scenario_theater, scenario_year, scenario_month )
+{
+ var MONTH_NAMES = { F:2, J:6, A:8, S:9 } ;
+
+ // check for a ETO/PTO-only flag
+ if ( timestamp.substring( timestamp.length-1 ) === "E" ) {
+ if ( scenario_theater != "ETO" )
+ return "" ;
+ timestamp = timestamp.substring( 0, timestamp.length-1 ) ;
+ }
+ if ( timestamp.substring( timestamp.length-1 ) === "P" ) {
+ if ( scenario_theater != "PTO" )
+ return "" ;
+ timestamp = timestamp.substring( 0, timestamp.length-1 ) ;
+ }
+
+ // remove any trailing "+" (FIXME! What does it even mean? Doesn't make sense :-/)
+ if ( timestamp.substring( timestamp.length-1 ) == "+" )
+ timestamp = timestamp.substring( 0, timestamp.length-1 ) ;
+
+ // check if there is anything left
+ if ( ! timestamp ) {
+ // nope - the capability is always available
+ return capabilities[0] ;
+ }
+
+ // parse the month/year the capability becomes available
+ var month = MONTH_NAMES[ timestamp.substring(0,1) ] ;
+ if ( month )
+ timestamp = timestamp.substring( 1 ) ;
+ if ( ! /^\d$/.test( timestamp ) )
+ return "" ;
+ timestamp = parseInt( timestamp ) ;
+
+ // check if the capabilitity is available
+ if ( scenario_year > 1940 + timestamp )
+ return capabilities[0] ;
+ else if ( scenario_year == 1940 + timestamp ) {
+ if( !month || scenario_month >= month )
+ return capabilities[0] ;
+ }
+
+ return "" ;
}
function has_ref( val )
@@ -433,8 +471,9 @@ function make_crew_survival( entry )
return null ;
// check if the vehicle is subject to brew up
- if ( crew_survival.substring(crew_survival.length-7) == ":brewup" )
- crew_survival = crew_survival.substring(0,crew_survival.length-7) + " (brew up)" ;
+ var pos = crew_survival.indexOf( ":brewup" ) ;
+ if ( pos !== -1 )
+ crew_survival = crew_survival.substring(0,pos) + " (brew up)" + crew_survival.substring(pos+7) ;
return crew_survival ;
}
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1940.txt
new file mode 100644
index 0000000..83faa07
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1940.txt
@@ -0,0 +1,131 @@
+=== vehicles/british/1940 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------------- ------- ---- ------------------------------------------------- ----------------------------------------------- --------------------- ------ ----------------------------------------------------
+Mark VIB n/a yes CS 3 sD6 sD6 1† N P
+Mark VIC n/a yes CS 3 sD6 sD6 1† n/a
+Tetrarch n/a yes CS 3 sD6 sD6 2† n/a
+Tetrarch CS n/a yes CS 3 HE9†[1] s†[1] sD6 HE9†[1] s†[1] sD6 2† S†1
+Stuart I(a) n/a yes CS 4 sD5 sD5 3† A N P
+Stuart III(a) n/a yes CS 4 C6[4+]†[1] HE[4+] sD5 sD5 3† A C†1 G N P
+Stuart V(a) n/a yes CS 4 C6†[1] sD5 C6†[1] sD5 4† A C†1 G
+Locust(a) n/a yes CS 3 C6† sD6 C6† sD6 5 A C†
+A9 n/a yes CS 5 (brew up) sD6 sD6 6† K†1 N
+A9 CS n/a yes CS 5 (brew up) s†[2] sD6 s†[2] sD6 6† K†1 N S†2
+A10 Mk IA n/a yes CS 5 (brew up)† sD6 sD6 7† B†1 K†2 N
+A10 Mk IA CS n/a yes CS 5 (brew up)† s†[2] sD6 s†[2] sD6 7† K†1 N S†2
+A13 Mk I n/a yes CS 4 (brew up) sD6 sD6 8 K†
+A13 Mk II n/a yes CS 4 (brew up) sD6 sD6 8† B†1 K†2 N
+A13 Mk II CS n/a yes CS 4 (brew up) s†[2] sD6 s†[2] sD6 8† K†1 N S†2
+Crusader I n/a yes CS 5 (brew up) sM8 sM8 9† K†1 N
+Crusader I CS n/a yes CS 5 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader II n/a yes CS 4 (brew up) sM8 sM8 9† K†1 N
+Crusader II CS n/a yes CS 4 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader III n/a yes CS 3 (brew up) HE7[F3+]†[1] sD7 sM8†[2] sD7 sM8†[2] 10† N Y†1 Z†2
+Grant(a) n/a yes CS 6 C5[4+]†[1] HE[4+] s8† sM8 s8† sM8 11† A C†1 G N P
+Lee(a) n/a yes CS 7 C5[4+]†[1] HE[4+] s8† sD6 s8† sD6 11† A C†1 G N P
+Sherman II(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 12† A G K†2 N R†1 W†3
+Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 13† A G K†2 N R†1 W†3
+Sherman V(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 14† A G K†2 P R†1 W†3
+Sherman IIA(a) n/a yes CS 6 A4[4]5[5] s5[5] sM8 sM8 15† A G K†1
+Sherman IIC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman VC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman IB(a) n/a yes CS 6 H9 WP9 s7 sM8 H9 WP9 s7 sM8 17† A K†1
+Centaur IV n/a yes CS 5 H6 s9 sD7 sM8† H6 s9 sD7 sM8† 18 S Z†
+Cromwell IV n/a yes CS 5 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 19† Z†1
+Cromwell VI n/a yes CS 5 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Cromwell VII n/a yes CS 6 WP6 s8 sD7 sM8† WP6 s8 sD7 sM8† 19† Z†1
+Cromwell VIII n/a yes CS 6 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Challenger n/a yes CS 6 D5[S4]6[5]†[1] HE7 sD7 sM8†[2] HE7 sD7 sM8†[2] 21† J†1 Z†2
+Comet n/a yes CS 6 sD7 sM8† sD7 sM8† 22 Z†
+Sherman Dozer(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 23† A G K†2 P R†1
+Sherman Crab(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 24† A G K†2 P R†1
+Matilda I ® yes CS 2 sD5 sD5 25† B†1
+Matilda II n/a yes CS 5 sD6 sD6 26† B†1 K†2 N P
+Matilda II CS n/a yes CS 5 HE9†[2] s†[2] sD6 HE9†[2] s†[2] sD6 26† K†1 N P S†2
+Valentine II n/a yes CS 4 sM8 sM8 27† N
+Valentine V n/a yes CS 4 sM8 sM8 28† K†1 N
+Valentine VIII n/a yes CS 4 HE7 sD6 HE7 sD6 29 N
+Valentine XI n/a yes CS 4 WP6 s8 sD8 WP6 s8 sD8 30 n/a
+Churchill I n/a yes CS 7 HE9†[2] s†[2] sD5[4] sM8†[1] HE9†[2] s†[2] sM8†[1] 31† N S†2 Z†1 CC
+Churchill IV n/a yes CS 7 D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] sM8†[3] 32† J†2 N Y†1 Z†3 CC
+Churchill V n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 33† S Z†1 CC
+Churchill VI n/a yes CS 7 WP6[J4+]†[1] s8 sD7 sM8†[2] s8 sD7 sM8†[2] 34† W†1 Z†2 CC
+Churchill VII n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 35† Z†1 CC
+Churchill VIII n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 35† S Z†1 CC
+Valentine Bridgelayer n/a yes CS 2 sD7 sD7 36† M P
+Churchill Bridgelayer n/a yes CS 2 sD7 sD7 36† M CC
+Churchill AVRE n/a n/a CS 8 sD7 sM8†[1] sD7 sM8†[1] 37† Z†1 CC
+Churchill Crocodile n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 38† Z†1 CC
+Deacon n/a yes CS 5 HE7[F3+]†[2] n/a 39† L†1 N Y†2
+Wolverine(a) n/a yes CS 7 A5[S4]6[5]†[1] HE7 s5[5] HE7 40† A J†1
+Achilles(a) n/a yes CS 7 D6[S4]7[5]†[1] HE7 HE7 40† A J†1
+Archer n/a yes CS 5 D6[4]7[5]†[1] HE7 sD7 HE7 sD7 41† J†1
+Daimler n/a yes CS 2 sD4[4+]† n/a 42† M N P
+Lynx n/a yes CS 2 sD5 sD5 42† L†1 M P
+Humber n/a yes CS 2 sD4[4+]† n/a 43† L†1 M P BB†2
+Stuart Recce n/a yes CS 5 n/a n/a 44† A D N P
+Humber III LRC n/a yes CS 3 sD5 sD5 45† L†1 N P Q†2
+Otter LRC n/a yes CS 3 sD5 sD5 45† L†1 P Q†2
+Morris CS9 n/a yes CS 4 sD5 sD5 46† N Q†2 T†3 X†1
+Rolls Royce n/a yes CS 3 sD5 sD5 47† N Q†2 T†3 X†1
+Marmon-Herrington II ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIv n/a yes CS 4 n/a n/a 49† L†1 N AA†2
+Marmon-Herrington III MFF n/a yes CS 4 n/a n/a 48† L†1 P Q†2
+Marmon-Herrington III ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIIv n/a yes CS 4 n/a n/a 49† K†2 L†1 N T†2
+Humber II n/a yes CS 3 sD6 sD6 50† L†1 N
+Humber III n/a yes CS 4 sD6 sD6 50† K†2 L†1 N P
+Humber IV n/a yes CS 3 C6[4+]†[2] sD6 sD6 51† A C†2 L†1 P
+Daimler n/a yes CS 3 sD6 sD6 52† K†1 N P
+AEC I n/a yes CS 3 sM8 sM8 53† N X†1
+AEC II n/a yes CS 4 D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 sM8 53 J†2 X† Y†1
+AEC III n/a yes CS 4 WP6 s8 sM8 WP6 s8 sM8 53 X†
+Staghound I(a) n/a yes CS 5 C6[4+]†[3] sM8 sM8 54† A C†3 G K†2 X†1
+Staghound II(a) n/a yes CS 4 s9 sD6 s9 sD6 54† A K†3 S†2 X†1
+Bishop n/a n/a CS 5 s8 s8 55† K†1 N P
+Priest(a) n/a yes CS 7 H6 WP7 s8 H6 WP7 s8 56† A N P
+Sexton(a) n/a yes CS 7 s8 s8 57† A K†1
+M3 GMC(a) n/a yes CS 4 WP7[J4+]†[1] s8 s8 58† A N W†1
+Mk VI AA n/a yes CS 2 n/a n/a 59† N O†1 AA†2
+Crusader AA n/a yes CS 4 (brew up) sD7 sD7 60† AA†1
+M17 MGMC(a) n/a yes CS 4 n/a n/a 61† A F† AA†1
+Humber AA n/a yes CS 2 n/a n/a 62† L†1 N O†2 AA†3
+Staghound AA(a) n/a yes CS 3 n/a n/a 62† A F† X†1 AA†2
+M5(a) n/a yes cs 5†1 n/a n/a 63† A I†1 N
+M9(a) n/a yes cs 4†1 n/a n/a 63† A I†1 N
+M5A1(a) n/a yes cs 5† n/a n/a 63 A I†
+M9A1(a) n/a yes cs 4† n/a n/a 63 A I†
+Carrier A n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier B n/a yes CS 3 sD5[4+]†[2] n/a 64† N P Q†1 U†2
+Carrier C n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier, MMG A n/a yes CS 3 sD5[4+]†[2] n/a 65† N P Q†1 U†2
+Carrier, MMG B n/a yes CS 4 sD5[4+]†[2] n/a 65† U†2 BB†1
+Carrier, 2-in. MTR n/a yes CS 3 IR[2+]† s7 s7 66† N P U†1
+Carrier, 3-in. MTR n/a yes CS 4 (brew up)†1 n/a n/a 67† H†1 N P U BB†2
+Priest Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D
+Ram Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D K†1
+White(a) SC n/a yes cs 4†1 n/a n/a 69† A I†1 N
+IP Carrier Mk IIA n/a yes CS 4 n/a n/a 70† N P V X†1
+IP Carrier Mk IIB n/a yes CS 4 n/a n/a 70† N P Q†2 V X†1
+IP Carrier AOV n/a yes CS 4 n/a n/a 70† P Q†1 V X†
+IP Carrier, 3-in. MTR n/a yes CS 5 (brew up)† IR WP7 s8 IR WP7 s8 71†[2] E†3 H† P V X†1 BB†4
+Wasp n/a yes CS 3 (brew up) sD5† sD5† 72† K†1 U
+Badger(a) n/a yes CS 3 n/a n/a 72† A K†1 M
+Buffalo Mk II(a) n/a yes CS 6 sD5† sD5† 73† A D AA†1
+Buffalo Mk IV(a) n/a yes CS 6 sD5† sD5† 73† A D E†1 AA†2
+Sherman III DD(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 74† A G K†2 R†1
+DUKW(a) n/a yes cs 7†1 n/a n/a 75† A D I†1 P
+Terrapin Mk I n/a yes cs 7 n/a n/a 76† D
+2pdr Portee n/a yes CS 4†1 n/a n/a 77† H†1 N P
+Morris C9/B n/a yes CS 4 n/a n/a 78† P AA†1
+Loyd Carrier n/a yes cs 5 n/a n/a 79† N P
+Quad FAT n/a yes CS 5 (brew up)† n/a n/a 80† N P
+15-cwt Truck n/a yes cs 5 n/a n/a 81† N P
+30-cwt Lorry n/a yes cs 6 n/a n/a 82† N P
+3-Ton Lorry n/a yes cs 7 n/a n/a 83† N P
+¼-Ton Jeep(a) n/a yes cs 2†1 n/a n/a 84† A I†1 N P
+¾-Ton Truck(a) n/a yes cs 4 n/a n/a 85 A N
+1½-Ton Truck(a) n/a yes cs 6 n/a n/a 85 A N
+2½-Ton Truck(a) n/a yes cs 7 n/a n/a 85 A N
+7½-Ton Truck(a) n/a yes cs 7 n/a n/a 85† A N
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1941.txt
new file mode 100644
index 0000000..11885c4
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1941.txt
@@ -0,0 +1,131 @@
+=== vehicles/british/1941 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------------- ------- ---- ------------------------------------------------- ----------------------------------------------- --------------------- ------ ----------------------------------------------------
+Mark VIB n/a yes CS 3 sD6 sD6 1† N P
+Mark VIC n/a yes CS 3 sD6 sD6 1† n/a
+Tetrarch n/a yes CS 3 sD6 sD6 2† n/a
+Tetrarch CS n/a yes CS 3 HE9†[1] s†[1] sD6 HE9†[1] s†[1] sD6 2† S†1
+Stuart I(a) n/a yes CS 4 sD5 sD5 3† A N P
+Stuart III(a) n/a yes CS 4 C6[4+]†[1] HE[4+] sD5 sD5 3† A C†1 G N P
+Stuart V(a) n/a yes CS 4 C6†[1] sD5 C6†[1] sD5 4† A C†1 G
+Locust(a) n/a yes CS 3 C6† sD6 C6† sD6 5 A C†
+A9 n/a yes CS 5 (brew up) sD6 sD6 6† K†1 N
+A9 CS n/a yes CS 5 (brew up) s†[2] sD6 s†[2] sD6 6† K†1 N S†2
+A10 Mk IA n/a yes CS 5 (brew up)† sD6 sD6 7† B†1 K†2 N
+A10 Mk IA CS n/a yes CS 5 (brew up)† s†[2] sD6 s†[2] sD6 7† K†1 N S†2
+A13 Mk I n/a yes CS 4 (brew up) sD6 sD6 8 K†
+A13 Mk II n/a yes CS 4 (brew up) sD6 sD6 8† B†1 K†2 N
+A13 Mk II CS n/a yes CS 4 (brew up) s†[2] sD6 s†[2] sD6 8† K†1 N S†2
+Crusader I n/a yes CS 5 (brew up) sM8 sM8 9† K†1 N
+Crusader I CS n/a yes CS 5 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader II n/a yes CS 4 (brew up) sM8 sM8 9† K†1 N
+Crusader II CS n/a yes CS 4 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader III n/a yes CS 3 (brew up) HE7[F3+]†[1] sD7 sM8†[2] sD7 sM8†[2] 10† N Y†1 Z†2
+Grant(a) n/a yes CS 6 C5[4+]†[1] HE[4+] s8† sM8 s8† sM8 11† A C†1 G N P
+Lee(a) n/a yes CS 7 C5[4+]†[1] HE[4+] s8† sD6 s8† sD6 11† A C†1 G N P
+Sherman II(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 12† A G K†2 N R†1 W†3
+Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 13† A G K†2 N R†1 W†3
+Sherman V(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 14† A G K†2 P R†1 W†3
+Sherman IIA(a) n/a yes CS 6 A4[4]5[5] s5[5] sM8 sM8 15† A G K†1
+Sherman IIC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman VC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman IB(a) n/a yes CS 6 H9 WP9 s7 sM8 H9 WP9 s7 sM8 17† A K†1
+Centaur IV n/a yes CS 5 H6 s9 sD7 sM8† H6 s9 sD7 sM8† 18 S Z†
+Cromwell IV n/a yes CS 5 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 19† Z†1
+Cromwell VI n/a yes CS 5 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Cromwell VII n/a yes CS 6 WP6 s8 sD7 sM8† WP6 s8 sD7 sM8† 19† Z†1
+Cromwell VIII n/a yes CS 6 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Challenger n/a yes CS 6 D5[S4]6[5]†[1] HE7 sD7 sM8†[2] HE7 sD7 sM8†[2] 21† J†1 Z†2
+Comet n/a yes CS 6 sD7 sM8† sD7 sM8† 22 Z†
+Sherman Dozer(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 23† A G K†2 P R†1
+Sherman Crab(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 24† A G K†2 P R†1
+Matilda I ® yes CS 2 sD5 sD5 25† B†1
+Matilda II n/a yes CS 5 sD6 sD6 26† B†1 K†2 N P
+Matilda II CS n/a yes CS 5 HE9†[2] s†[2] sD6 HE9†[2] s†[2] sD6 26† K†1 N P S†2
+Valentine II n/a yes CS 4 sM8 sM8 27† N
+Valentine V n/a yes CS 4 sM8 sM8 28† K†1 N
+Valentine VIII n/a yes CS 4 HE7 sD6 HE7 sD6 29 N
+Valentine XI n/a yes CS 4 WP6 s8 sD8 WP6 s8 sD8 30 n/a
+Churchill I n/a yes CS 7 HE9†[2] s†[2] sD5[4] sM8†[1] HE9†[2] s†[2] sM8†[1] 31† N S†2 Z†1 CC
+Churchill IV n/a yes CS 7 D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] sM8†[3] 32† J†2 N Y†1 Z†3 CC
+Churchill V n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 33† S Z†1 CC
+Churchill VI n/a yes CS 7 WP6[J4+]†[1] s8 sD7 sM8†[2] s8 sD7 sM8†[2] 34† W†1 Z†2 CC
+Churchill VII n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 35† Z†1 CC
+Churchill VIII n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 35† S Z†1 CC
+Valentine Bridgelayer n/a yes CS 2 sD7 sD7 36† M P
+Churchill Bridgelayer n/a yes CS 2 sD7 sD7 36† M CC
+Churchill AVRE n/a n/a CS 8 sD7 sM8†[1] sD7 sM8†[1] 37† Z†1 CC
+Churchill Crocodile n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 38† Z†1 CC
+Deacon n/a yes CS 5 HE7[F3+]†[2] n/a 39† L†1 N Y†2
+Wolverine(a) n/a yes CS 7 A5[S4]6[5]†[1] HE7 s5[5] HE7 40† A J†1
+Achilles(a) n/a yes CS 7 D6[S4]7[5]†[1] HE7 HE7 40† A J†1
+Archer n/a yes CS 5 D6[4]7[5]†[1] HE7 sD7 HE7 sD7 41† J†1
+Daimler n/a yes CS 2 sD4[4+]† n/a 42† M N P
+Lynx n/a yes CS 2 sD5 sD5 42† L†1 M P
+Humber n/a yes CS 2 sD4[4+]† n/a 43† L†1 M P BB†2
+Stuart Recce n/a yes CS 5 n/a n/a 44† A D N P
+Humber III LRC n/a yes CS 3 sD5 sD5 45† L†1 N P Q†2
+Otter LRC n/a yes CS 3 sD5 sD5 45† L†1 P Q†2
+Morris CS9 n/a yes CS 4 sD5 sD5 46† N Q†2 T†3 X†1
+Rolls Royce n/a yes CS 3 sD5 sD5 47† N Q†2 T†3 X†1
+Marmon-Herrington II ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIv n/a yes CS 4 n/a n/a 49† L†1 N AA†2
+Marmon-Herrington III MFF n/a yes CS 4 n/a n/a 48† L†1 P Q†2
+Marmon-Herrington III ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIIv n/a yes CS 4 n/a n/a 49† K†2 L†1 N T†2
+Humber II n/a yes CS 3 sD6 sD6 50† L†1 N
+Humber III n/a yes CS 4 sD6 sD6 50† K†2 L†1 N P
+Humber IV n/a yes CS 3 C6[4+]†[2] sD6 sD6 51† A C†2 L†1 P
+Daimler n/a yes CS 3 sD6 sD6 52† K†1 N P
+AEC I n/a yes CS 3 sM8 sM8 53† N X†1
+AEC II n/a yes CS 4 D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 sM8 53 J†2 X† Y†1
+AEC III n/a yes CS 4 WP6 s8 sM8 WP6 s8 sM8 53 X†
+Staghound I(a) n/a yes CS 5 C6[4+]†[3] sM8 sM8 54† A C†3 G K†2 X†1
+Staghound II(a) n/a yes CS 4 s9 sD6 s9 sD6 54† A K†3 S†2 X†1
+Bishop n/a n/a CS 5 s8 s8 55† K†1 N P
+Priest(a) n/a yes CS 7 H6 WP7 s8 H6 WP7 s8 56† A N P
+Sexton(a) n/a yes CS 7 s8 s8 57† A K†1
+M3 GMC(a) n/a yes CS 4 WP7[J4+]†[1] s8 s8 58† A N W†1
+Mk VI AA n/a yes CS 2 n/a n/a 59† N O†1 AA†2
+Crusader AA n/a yes CS 4 (brew up) sD7 sD7 60† AA†1
+M17 MGMC(a) n/a yes CS 4 n/a n/a 61† A F† AA†1
+Humber AA n/a yes CS 2 n/a n/a 62† L†1 N O†2 AA†3
+Staghound AA(a) n/a yes CS 3 n/a n/a 62† A F† X†1 AA†2
+M5(a) n/a yes cs 5†1 n/a n/a 63† A I†1 N
+M9(a) n/a yes cs 4†1 n/a n/a 63† A I†1 N
+M5A1(a) n/a yes cs 5† n/a n/a 63 A I†
+M9A1(a) n/a yes cs 4† n/a n/a 63 A I†
+Carrier A n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier B n/a yes CS 3 sD5[4+]†[2] n/a 64† N P Q†1 U†2
+Carrier C n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier, MMG A n/a yes CS 3 sD5[4+]†[2] n/a 65† N P Q†1 U†2
+Carrier, MMG B n/a yes CS 4 sD5[4+]†[2] n/a 65† U†2 BB†1
+Carrier, 2-in. MTR n/a yes CS 3 IR[2+]† s7 s7 66† N P U†1
+Carrier, 3-in. MTR n/a yes CS 4 (brew up)†1 n/a n/a 67† H†1 N P U BB†2
+Priest Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D
+Ram Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D K†1
+White(a) SC n/a yes cs 4†1 n/a n/a 69† A I†1 N
+IP Carrier Mk IIA n/a yes CS 4 n/a n/a 70† N P V X†1
+IP Carrier Mk IIB n/a yes CS 4 n/a n/a 70† N P Q†2 V X†1
+IP Carrier AOV n/a yes CS 4 n/a n/a 70† P Q†1 V X†
+IP Carrier, 3-in. MTR n/a yes CS 5 (brew up)† IR WP7 s8 IR WP7 s8 71†[2] E†3 H† P V X†1 BB†4
+Wasp n/a yes CS 3 (brew up) sD5† sD5† 72† K†1 U
+Badger(a) n/a yes CS 3 n/a n/a 72† A K†1 M
+Buffalo Mk II(a) n/a yes CS 6 sD5† sD5† 73† A D AA†1
+Buffalo Mk IV(a) n/a yes CS 6 sD5† sD5† 73† A D E†1 AA†2
+Sherman III DD(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 74† A G K†2 R†1
+DUKW(a) n/a yes cs 7†1 n/a n/a 75† A D I†1 P
+Terrapin Mk I n/a yes cs 7 n/a n/a 76† D
+2pdr Portee n/a yes CS 4†1 n/a n/a 77† H†1 N P
+Morris C9/B n/a yes CS 4 n/a n/a 78† P AA†1
+Loyd Carrier n/a yes cs 5 n/a n/a 79† N P
+Quad FAT n/a yes CS 5 (brew up)† n/a n/a 80† N P
+15-cwt Truck n/a yes cs 5 n/a n/a 81† N P
+30-cwt Lorry n/a yes cs 6 n/a n/a 82† N P
+3-Ton Lorry n/a yes cs 7 n/a n/a 83† N P
+¼-Ton Jeep(a) n/a yes cs 2†1 n/a n/a 84† A I†1 N P
+¾-Ton Truck(a) n/a yes cs 4 n/a n/a 85 A N
+1½-Ton Truck(a) n/a yes cs 6 n/a n/a 85 A N
+2½-Ton Truck(a) n/a yes cs 7 n/a n/a 85 A N
+7½-Ton Truck(a) n/a yes cs 7 n/a n/a 85† A N
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1942.txt
new file mode 100644
index 0000000..4950392
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1942.txt
@@ -0,0 +1,131 @@
+=== vehicles/british/1942 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------------- ------- ---- ------------------------------------------------- ----------------------------------------------- --------------------- ------ ----------------------------------------------------
+Mark VIB n/a yes CS 3 sD6 sD6 1† N P
+Mark VIC n/a yes CS 3 sD6 sD6 1† n/a
+Tetrarch n/a yes CS 3 sD6 sD6 2† n/a
+Tetrarch CS n/a yes CS 3 HE9†[1] s†[1] sD6 HE9†[1] s†[1] sD6 2† S†1
+Stuart I(a) n/a yes CS 4 sD5 sD5 3† A N P
+Stuart III(a) n/a yes CS 4 C6[4+]†[1] HE[4+] sD5 sD5 3† A C†1 G N P
+Stuart V(a) n/a yes CS 4 C6†[1] sD5 C6†[1] sD5 4† A C†1 G
+Locust(a) n/a yes CS 3 C6† sD6 C6† sD6 5 A C†
+A9 n/a yes CS 5 (brew up) sD6 sD6 6† K†1 N
+A9 CS n/a yes CS 5 (brew up) s†[2] sD6 s†[2] sD6 6† K†1 N S†2
+A10 Mk IA n/a yes CS 5 (brew up)† sD6 sD6 7† B†1 K†2 N
+A10 Mk IA CS n/a yes CS 5 (brew up)† s†[2] sD6 s†[2] sD6 7† K†1 N S†2
+A13 Mk I n/a yes CS 4 (brew up) sD6 sD6 8 K†
+A13 Mk II n/a yes CS 4 (brew up) sD6 sD6 8† B†1 K†2 N
+A13 Mk II CS n/a yes CS 4 (brew up) s†[2] sD6 s†[2] sD6 8† K†1 N S†2
+Crusader I n/a yes CS 5 (brew up) sM8 sM8 9† K†1 N
+Crusader I CS n/a yes CS 5 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader II n/a yes CS 4 (brew up) sM8 sM8 9† K†1 N
+Crusader II CS n/a yes CS 4 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader III n/a yes CS 3 (brew up) HE7[F3+]†[1] sD7 sM8†[2] sD7 sM8†[2] 10† N Y†1 Z†2
+Grant(a) n/a yes CS 6 C5[4+]†[1] HE[4+] s8† sM8 s8† sM8 11† A C†1 G N P
+Lee(a) n/a yes CS 7 C5[4+]†[1] HE[4+] s8† sD6 s8† sD6 11† A C†1 G N P
+Sherman II(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 12† A G K†2 N R†1 W†3
+Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 13† A G K†2 N R†1 W†3
+Sherman V(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 14† A G K†2 P R†1 W†3
+Sherman IIA(a) n/a yes CS 6 A4[4]5[5] s5[5] sM8 sM8 15† A G K†1
+Sherman IIC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman VC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman IB(a) n/a yes CS 6 H9 WP9 s7 sM8 H9 WP9 s7 sM8 17† A K†1
+Centaur IV n/a yes CS 5 H6 s9 sD7 sM8† H6 s9 sD7 sM8† 18 S Z†
+Cromwell IV n/a yes CS 5 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 19† Z†1
+Cromwell VI n/a yes CS 5 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Cromwell VII n/a yes CS 6 WP6 s8 sD7 sM8† WP6 s8 sD7 sM8† 19† Z†1
+Cromwell VIII n/a yes CS 6 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Challenger n/a yes CS 6 D5[S4]6[5]†[1] HE7 sD7 sM8†[2] HE7 sD7 sM8†[2] 21† J†1 Z†2
+Comet n/a yes CS 6 sD7 sM8† sD7 sM8† 22 Z†
+Sherman Dozer(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 23† A G K†2 P R†1
+Sherman Crab(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 24† A G K†2 P R†1
+Matilda I ® yes CS 2 sD5 sD5 25† B†1
+Matilda II n/a yes CS 5 sD6 sD6 26† B†1 K†2 N P
+Matilda II CS n/a yes CS 5 HE9†[2] s†[2] sD6 HE9†[2] s†[2] sD6 26† K†1 N P S†2
+Valentine II n/a yes CS 4 sM8 sM8 27† N
+Valentine V n/a yes CS 4 sM8 sM8 28† K†1 N
+Valentine VIII n/a yes CS 4 HE7 sD6 HE7 sD6 29 N
+Valentine XI n/a yes CS 4 WP6 s8 sD8 WP6 s8 sD8 30 n/a
+Churchill I n/a yes CS 7 HE9†[2] s†[2] sD5[4] sM8†[1] HE9†[2] s†[2] sM8†[1] 31† N S†2 Z†1 CC
+Churchill IV n/a yes CS 7 D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] sM8†[3] 32† J†2 N Y†1 Z†3 CC
+Churchill V n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 33† S Z†1 CC
+Churchill VI n/a yes CS 7 WP6[J4+]†[1] s8 sD7 sM8†[2] s8 sD7 sM8†[2] 34† W†1 Z†2 CC
+Churchill VII n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 35† Z†1 CC
+Churchill VIII n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 35† S Z†1 CC
+Valentine Bridgelayer n/a yes CS 2 sD7 sD7 36† M P
+Churchill Bridgelayer n/a yes CS 2 sD7 sD7 36† M CC
+Churchill AVRE n/a n/a CS 8 sD7 sM8†[1] sD7 sM8†[1] 37† Z†1 CC
+Churchill Crocodile n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 38† Z†1 CC
+Deacon n/a yes CS 5 HE7[F3+]†[2] n/a 39† L†1 N Y†2
+Wolverine(a) n/a yes CS 7 A5[S4]6[5]†[1] HE7 s5[5] HE7 40† A J†1
+Achilles(a) n/a yes CS 7 D6[S4]7[5]†[1] HE7 HE7 40† A J†1
+Archer n/a yes CS 5 D6[4]7[5]†[1] HE7 sD7 HE7 sD7 41† J†1
+Daimler n/a yes CS 2 sD4[4+]† n/a 42† M N P
+Lynx n/a yes CS 2 sD5 sD5 42† L†1 M P
+Humber n/a yes CS 2 sD4[4+]† n/a 43† L†1 M P BB†2
+Stuart Recce n/a yes CS 5 n/a n/a 44† A D N P
+Humber III LRC n/a yes CS 3 sD5 sD5 45† L†1 N P Q†2
+Otter LRC n/a yes CS 3 sD5 sD5 45† L†1 P Q†2
+Morris CS9 n/a yes CS 4 sD5 sD5 46† N Q†2 T†3 X†1
+Rolls Royce n/a yes CS 3 sD5 sD5 47† N Q†2 T†3 X†1
+Marmon-Herrington II ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIv n/a yes CS 4 n/a n/a 49† L†1 N AA†2
+Marmon-Herrington III MFF n/a yes CS 4 n/a n/a 48† L†1 P Q†2
+Marmon-Herrington III ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIIv n/a yes CS 4 n/a n/a 49† K†2 L†1 N T†2
+Humber II n/a yes CS 3 sD6 sD6 50† L†1 N
+Humber III n/a yes CS 4 sD6 sD6 50† K†2 L†1 N P
+Humber IV n/a yes CS 3 C6[4+]†[2] sD6 sD6 51† A C†2 L†1 P
+Daimler n/a yes CS 3 sD6 sD6 52† K†1 N P
+AEC I n/a yes CS 3 sM8 sM8 53† N X†1
+AEC II n/a yes CS 4 D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 sM8 53 J†2 X† Y†1
+AEC III n/a yes CS 4 WP6 s8 sM8 WP6 s8 sM8 53 X†
+Staghound I(a) n/a yes CS 5 C6[4+]†[3] sM8 sM8 54† A C†3 G K†2 X†1
+Staghound II(a) n/a yes CS 4 s9 sD6 s9 sD6 54† A K†3 S†2 X†1
+Bishop n/a n/a CS 5 s8 s8 55† K†1 N P
+Priest(a) n/a yes CS 7 H6 WP7 s8 H6 WP7 s8 56† A N P
+Sexton(a) n/a yes CS 7 s8 s8 57† A K†1
+M3 GMC(a) n/a yes CS 4 WP7[J4+]†[1] s8 s8 58† A N W†1
+Mk VI AA n/a yes CS 2 n/a n/a 59† N O†1 AA†2
+Crusader AA n/a yes CS 4 (brew up) sD7 sD7 60† AA†1
+M17 MGMC(a) n/a yes CS 4 n/a n/a 61† A F† AA†1
+Humber AA n/a yes CS 2 n/a n/a 62† L†1 N O†2 AA†3
+Staghound AA(a) n/a yes CS 3 n/a n/a 62† A F† X†1 AA†2
+M5(a) n/a yes cs 5†1 n/a n/a 63† A I†1 N
+M9(a) n/a yes cs 4†1 n/a n/a 63† A I†1 N
+M5A1(a) n/a yes cs 5† n/a n/a 63 A I†
+M9A1(a) n/a yes cs 4† n/a n/a 63 A I†
+Carrier A n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier B n/a yes CS 3 sD5[4+]†[2] n/a 64† N P Q†1 U†2
+Carrier C n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier, MMG A n/a yes CS 3 sD5[4+]†[2] n/a 65† N P Q†1 U†2
+Carrier, MMG B n/a yes CS 4 sD5[4+]†[2] n/a 65† U†2 BB†1
+Carrier, 2-in. MTR n/a yes CS 3 IR[2+]† s7 IR† s7 66† N P U†1
+Carrier, 3-in. MTR n/a yes CS 4 (brew up)†1 n/a n/a 67† H†1 N P U BB†2
+Priest Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D
+Ram Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D K†1
+White(a) SC n/a yes cs 4†1 n/a n/a 69† A I†1 N
+IP Carrier Mk IIA n/a yes CS 4 n/a n/a 70† N P V X†1
+IP Carrier Mk IIB n/a yes CS 4 n/a n/a 70† N P Q†2 V X†1
+IP Carrier AOV n/a yes CS 4 n/a n/a 70† P Q†1 V X†
+IP Carrier, 3-in. MTR n/a yes CS 5 (brew up)† IR WP7 s8 IR WP7 s8 71†[2] E†3 H† P V X†1 BB†4
+Wasp n/a yes CS 3 (brew up) sD5† sD5† 72† K†1 U
+Badger(a) n/a yes CS 3 n/a n/a 72† A K†1 M
+Buffalo Mk II(a) n/a yes CS 6 sD5† sD5† 73† A D AA†1
+Buffalo Mk IV(a) n/a yes CS 6 sD5† sD5† 73† A D E†1 AA†2
+Sherman III DD(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 74† A G K†2 R†1
+DUKW(a) n/a yes cs 7†1 n/a n/a 75† A D I†1 P
+Terrapin Mk I n/a yes cs 7 n/a n/a 76† D
+2pdr Portee n/a yes CS 4†1 n/a n/a 77† H†1 N P
+Morris C9/B n/a yes CS 4 n/a n/a 78† P AA†1
+Loyd Carrier n/a yes cs 5 n/a n/a 79† N P
+Quad FAT n/a yes CS 5 (brew up)† n/a n/a 80† N P
+15-cwt Truck n/a yes cs 5 n/a n/a 81† N P
+30-cwt Lorry n/a yes cs 6 n/a n/a 82† N P
+3-Ton Lorry n/a yes cs 7 n/a n/a 83† N P
+¼-Ton Jeep(a) n/a yes cs 2†1 n/a n/a 84† A I†1 N P
+¾-Ton Truck(a) n/a yes cs 4 n/a n/a 85 A N
+1½-Ton Truck(a) n/a yes cs 6 n/a n/a 85 A N
+2½-Ton Truck(a) n/a yes cs 7 n/a n/a 85 A N
+7½-Ton Truck(a) n/a yes cs 7 n/a n/a 85† A N
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1943.txt
new file mode 100644
index 0000000..f64e501
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1943.txt
@@ -0,0 +1,131 @@
+=== vehicles/british/1943 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------------- ------- ---- ------------------------------------------------- ----------------------------------------------- --------------------- ------ ----------------------------------------------------
+Mark VIB n/a yes CS 3 sD6 sD6 1† N P
+Mark VIC n/a yes CS 3 sD6 sD6 1† n/a
+Tetrarch n/a yes CS 3 sD6 sD6 2† n/a
+Tetrarch CS n/a yes CS 3 HE9†[1] s†[1] sD6 HE9†[1] s†[1] sD6 2† S†1
+Stuart I(a) n/a yes CS 4 sD5 sD5 3† A N P
+Stuart III(a) n/a yes CS 4 C6[4+]†[1] HE[4+] sD5 sD5 3† A C†1 G N P
+Stuart V(a) n/a yes CS 4 C6†[1] sD5 C6†[1] sD5 4† A C†1 G
+Locust(a) n/a yes CS 3 C6† sD6 C6† sD6 5 A C†
+A9 n/a yes CS 5 (brew up) sD6 sD6 6† K†1 N
+A9 CS n/a yes CS 5 (brew up) s†[2] sD6 s†[2] sD6 6† K†1 N S†2
+A10 Mk IA n/a yes CS 5 (brew up)† sD6 sD6 7† B†1 K†2 N
+A10 Mk IA CS n/a yes CS 5 (brew up)† s†[2] sD6 s†[2] sD6 7† K†1 N S†2
+A13 Mk I n/a yes CS 4 (brew up) sD6 sD6 8 K†
+A13 Mk II n/a yes CS 4 (brew up) sD6 sD6 8† B†1 K†2 N
+A13 Mk II CS n/a yes CS 4 (brew up) s†[2] sD6 s†[2] sD6 8† K†1 N S†2
+Crusader I n/a yes CS 5 (brew up) sM8 sM8 9† K†1 N
+Crusader I CS n/a yes CS 5 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader II n/a yes CS 4 (brew up) sM8 sM8 9† K†1 N
+Crusader II CS n/a yes CS 4 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader III n/a yes CS 3 (brew up) HE7[F3+]†[1] sD7 sM8†[2] sD7 sM8†[2] 10† N Y†1 Z†2
+Grant(a) n/a yes CS 6 C5[4+]†[1] HE[4+] s8† sM8 s8† sM8 11† A C†1 G N P
+Lee(a) n/a yes CS 7 C5[4+]†[1] HE[4+] s8† sD6 s8† sD6 11† A C†1 G N P
+Sherman II(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 12† A G K†2 N R†1 W†3
+Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 13† A G K†2 N R†1 W†3
+Sherman V(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 14† A G K†2 P R†1 W†3
+Sherman IIA(a) n/a yes CS 6 A4[4]5[5] s5[5] sM8 sM8 15† A G K†1
+Sherman IIC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman VC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman IB(a) n/a yes CS 6 H9 WP9 s7 sM8 H9 WP9 s7 sM8 17† A K†1
+Centaur IV n/a yes CS 5 H6 s9 sD7 sM8† H6 s9 sD7 sM8† 18 S Z†
+Cromwell IV n/a yes CS 5 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 19† Z†1
+Cromwell VI n/a yes CS 5 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Cromwell VII n/a yes CS 6 WP6 s8 sD7 sM8† WP6 s8 sD7 sM8† 19† Z†1
+Cromwell VIII n/a yes CS 6 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Challenger n/a yes CS 6 D5[S4]6[5]†[1] HE7 sD7 sM8†[2] HE7 sD7 sM8†[2] 21† J†1 Z†2
+Comet n/a yes CS 6 sD7 sM8† sD7 sM8† 22 Z†
+Sherman Dozer(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 23† A G K†2 P R†1
+Sherman Crab(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 24† A G K†2 P R†1
+Matilda I ® yes CS 2 sD5 sD5 25† B†1
+Matilda II n/a yes CS 5 sD6 sD6 26† B†1 K†2 N P
+Matilda II CS n/a yes CS 5 HE9†[2] s†[2] sD6 HE9†[2] s†[2] sD6 26† K†1 N P S†2
+Valentine II n/a yes CS 4 sM8 sM8 27† N
+Valentine V n/a yes CS 4 sM8 sM8 28† K†1 N
+Valentine VIII n/a yes CS 4 HE7 sD6 HE7 sD6 29 N
+Valentine XI n/a yes CS 4 WP6 s8 sD8 WP6 s8 sD8 30 n/a
+Churchill I n/a yes CS 7 HE9†[2] s†[2] sD5[4] sM8†[1] HE9†[2] s†[2] sM8†[1] 31† N S†2 Z†1 CC
+Churchill IV n/a yes CS 7 D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] sM8†[3] 32† J†2 N Y†1 Z†3 CC
+Churchill V n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 33† S Z†1 CC
+Churchill VI n/a yes CS 7 WP6[J4+]†[1] s8 sD7 sM8†[2] s8 sD7 sM8†[2] 34† W†1 Z†2 CC
+Churchill VII n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 35† Z†1 CC
+Churchill VIII n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 35† S Z†1 CC
+Valentine Bridgelayer n/a yes CS 2 sD7 sD7 36† M P
+Churchill Bridgelayer n/a yes CS 2 sD7 sD7 36† M CC
+Churchill AVRE n/a n/a CS 8 sD7 sM8†[1] sD7 sM8†[1] 37† Z†1 CC
+Churchill Crocodile n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 38† Z†1 CC
+Deacon n/a yes CS 5 HE7[F3+]†[2] n/a 39† L†1 N Y†2
+Wolverine(a) n/a yes CS 7 A5[S4]6[5]†[1] HE7 s5[5] HE7 40† A J†1
+Achilles(a) n/a yes CS 7 D6[S4]7[5]†[1] HE7 HE7 40† A J†1
+Archer n/a yes CS 5 D6[4]7[5]†[1] HE7 sD7 HE7 sD7 41† J†1
+Daimler n/a yes CS 2 sD4[4+]† n/a 42† M N P
+Lynx n/a yes CS 2 sD5 sD5 42† L†1 M P
+Humber n/a yes CS 2 sD4[4+]† n/a 43† L†1 M P BB†2
+Stuart Recce n/a yes CS 5 n/a n/a 44† A D N P
+Humber III LRC n/a yes CS 3 sD5 sD5 45† L†1 N P Q†2
+Otter LRC n/a yes CS 3 sD5 sD5 45† L†1 P Q†2
+Morris CS9 n/a yes CS 4 sD5 sD5 46† N Q†2 T†3 X†1
+Rolls Royce n/a yes CS 3 sD5 sD5 47† N Q†2 T†3 X†1
+Marmon-Herrington II ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIv n/a yes CS 4 n/a n/a 49† L†1 N AA†2
+Marmon-Herrington III MFF n/a yes CS 4 n/a n/a 48† L†1 P Q†2
+Marmon-Herrington III ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIIv n/a yes CS 4 n/a n/a 49† K†2 L†1 N T†2
+Humber II n/a yes CS 3 sD6 sD6 50† L†1 N
+Humber III n/a yes CS 4 sD6 sD6 50† K†2 L†1 N P
+Humber IV n/a yes CS 3 C6[4+]†[2] sD6 sD6 51† A C†2 L†1 P
+Daimler n/a yes CS 3 sD6 sD6 52† K†1 N P
+AEC I n/a yes CS 3 sM8 sM8 53† N X†1
+AEC II n/a yes CS 4 D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 HE7†[1] sM8 53 J†2 X† Y†1
+AEC III n/a yes CS 4 WP6 s8 sM8 WP6 s8 sM8 53 X†
+Staghound I(a) n/a yes CS 5 C6[4+]†[3] sM8 sM8 54† A C†3 G K†2 X†1
+Staghound II(a) n/a yes CS 4 s9 sD6 s9 sD6 54† A K†3 S†2 X†1
+Bishop n/a n/a CS 5 s8 s8 55† K†1 N P
+Priest(a) n/a yes CS 7 H6 WP7 s8 H6 WP7 s8 56† A N P
+Sexton(a) n/a yes CS 7 s8 s8 57† A K†1
+M3 GMC(a) n/a yes CS 4 WP7[J4+]†[1] s8 s8 58† A N W†1
+Mk VI AA n/a yes CS 2 n/a n/a 59† N O†1 AA†2
+Crusader AA n/a yes CS 4 (brew up) sD7 sD7 60† AA†1
+M17 MGMC(a) n/a yes CS 4 n/a n/a 61† A F† AA†1
+Humber AA n/a yes CS 2 n/a n/a 62† L†1 N O†2 AA†3
+Staghound AA(a) n/a yes CS 3 n/a n/a 62† A F† X†1 AA†2
+M5(a) n/a yes cs 5†1 n/a n/a 63† A I†1 N
+M9(a) n/a yes cs 4†1 n/a n/a 63† A I†1 N
+M5A1(a) n/a yes cs 5† n/a n/a 63 A I†
+M9A1(a) n/a yes cs 4† n/a n/a 63 A I†
+Carrier A n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier B n/a yes CS 3 sD5[4+]†[2] n/a 64† N P Q†1 U†2
+Carrier C n/a yes CS 3 sD5[4+]†[1] n/a 64† N P U†1
+Carrier, MMG A n/a yes CS 3 sD5[4+]†[2] n/a 65† N P Q†1 U†2
+Carrier, MMG B n/a yes CS 4 sD5[4+]†[2] n/a 65† U†2 BB†1
+Carrier, 2-in. MTR n/a yes CS 3 IR[2+]† s7 IR† s7 66† N P U†1
+Carrier, 3-in. MTR n/a yes CS 4 (brew up)†1 n/a n/a 67† H†1 N P U BB†2
+Priest Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D
+Ram Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D K†1
+White(a) SC n/a yes cs 4†1 n/a n/a 69† A I†1 N
+IP Carrier Mk IIA n/a yes CS 4 n/a n/a 70† N P V X†1
+IP Carrier Mk IIB n/a yes CS 4 n/a n/a 70† N P Q†2 V X†1
+IP Carrier AOV n/a yes CS 4 n/a n/a 70† P Q†1 V X†
+IP Carrier, 3-in. MTR n/a yes CS 5 (brew up)† IR WP7 s8 IR WP7 s8 71†[2] E†3 H† P V X†1 BB†4
+Wasp n/a yes CS 3 (brew up) sD5† sD5† 72† K†1 U
+Badger(a) n/a yes CS 3 n/a n/a 72† A K†1 M
+Buffalo Mk II(a) n/a yes CS 6 sD5† sD5† 73† A D AA†1
+Buffalo Mk IV(a) n/a yes CS 6 sD5† sD5† 73† A D E†1 AA†2
+Sherman III DD(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 74† A G K†2 R†1
+DUKW(a) n/a yes cs 7†1 n/a n/a 75† A D I†1 P
+Terrapin Mk I n/a yes cs 7 n/a n/a 76† D
+2pdr Portee n/a yes CS 4†1 n/a n/a 77† H†1 N P
+Morris C9/B n/a yes CS 4 n/a n/a 78† P AA†1
+Loyd Carrier n/a yes cs 5 n/a n/a 79† N P
+Quad FAT n/a yes CS 5 (brew up)† n/a n/a 80† N P
+15-cwt Truck n/a yes cs 5 n/a n/a 81† N P
+30-cwt Lorry n/a yes cs 6 n/a n/a 82† N P
+3-Ton Lorry n/a yes cs 7 n/a n/a 83† N P
+¼-Ton Jeep(a) n/a yes cs 2†1 n/a n/a 84† A I†1 N P
+¾-Ton Truck(a) n/a yes cs 4 n/a n/a 85 A N
+1½-Ton Truck(a) n/a yes cs 6 n/a n/a 85 A N
+2½-Ton Truck(a) n/a yes cs 7 n/a n/a 85 A N
+7½-Ton Truck(a) n/a yes cs 7 n/a n/a 85† A N
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1944.txt
new file mode 100644
index 0000000..c8e0017
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1944.txt
@@ -0,0 +1,131 @@
+=== vehicles/british/1944 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------------- ------- ---- ------------------------------------------------- ----------------------------------------------- ------------------------- ------ ----------------------------------------------------
+Mark VIB n/a yes CS 3 sD6 sD6 1† N P
+Mark VIC n/a yes CS 3 sD6 sD6 1† n/a
+Tetrarch n/a yes CS 3 sD6 sD6 2† n/a
+Tetrarch CS n/a yes CS 3 HE9†[1] s†[1] sD6 HE9†[1] s†[1] sD6 2† S†1
+Stuart I(a) n/a yes CS 4 sD5 sD5 3† A N P
+Stuart III(a) n/a yes CS 4 C6[4+]†[1] HE[4+] sD5 C6†[1] HE sD5 3† A C†1 G N P
+Stuart V(a) n/a yes CS 4 C6†[1] sD5 C6†[1] sD5 4† A C†1 G
+Locust(a) n/a yes CS 3 C6† sD6 C6† sD6 5 A C†
+A9 n/a yes CS 5 (brew up) sD6 sD6 6† K†1 N
+A9 CS n/a yes CS 5 (brew up) s†[2] sD6 s†[2] sD6 6† K†1 N S†2
+A10 Mk IA n/a yes CS 5 (brew up)† sD6 sD6 7† B†1 K†2 N
+A10 Mk IA CS n/a yes CS 5 (brew up)† s†[2] sD6 s†[2] sD6 7† K†1 N S†2
+A13 Mk I n/a yes CS 4 (brew up) sD6 sD6 8 K†
+A13 Mk II n/a yes CS 4 (brew up) sD6 sD6 8† B†1 K†2 N
+A13 Mk II CS n/a yes CS 4 (brew up) s†[2] sD6 s†[2] sD6 8† K†1 N S†2
+Crusader I n/a yes CS 5 (brew up) sM8 sM8 9† K†1 N
+Crusader I CS n/a yes CS 5 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader II n/a yes CS 4 (brew up) sM8 sM8 9† K†1 N
+Crusader II CS n/a yes CS 4 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader III n/a yes CS 3 (brew up) HE7[F3+]†[1] sD7 sM8†[2] HE7†[1] sD7 sM8†[2] 10† N Y†1 Z†2
+Grant(a) n/a yes CS 6 C5[4+]†[1] HE[4+] s8† sM8 C5†[1] HE s8† sM8 11† A C†1 G N P
+Lee(a) n/a yes CS 7 C5[4+]†[1] HE[4+] s8† sD6 C5†[1] HE s8† sD6 11† A C†1 G N P
+Sherman II(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 12† A G K†2 N R†1 W†3
+Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 13† A G K†2 N R†1 W†3
+Sherman V(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 s8 sD6 14† A G K†2 P R†1 W†3
+Sherman IIA(a) n/a yes CS 6 A4[4]5[5] s5[5] sM8 A4 sM8 15† A G K†1
+Sherman IIC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman VC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 HE7 sM8 16† A J†2 K†1
+Sherman IB(a) n/a yes CS 6 H9 WP9 s7 sM8 H9 WP9 s7 sM8 17† A K†1
+Centaur IV n/a yes CS 5 H6 s9 sD7 sM8† H6 s9 sD7 sM8† 18 S Z†
+Cromwell IV n/a yes CS 5 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 19† Z†1
+Cromwell VI n/a yes CS 5 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Cromwell VII n/a yes CS 6 WP6 s8 sD7 sM8† WP6 s8 sD7 sM8† 19† Z†1
+Cromwell VIII n/a yes CS 6 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Challenger n/a yes CS 6 D5[S4]6[5]†[1] HE7 sD7 sM8†[2] HE7 sD7 sM8†[2] 21† J†1 Z†2
+Comet n/a yes CS 6 sD7 sM8† sD7 sM8† 22 Z†
+Sherman Dozer(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 23† A G K†2 P R†1
+Sherman Crab(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 24† A G K†2 P R†1
+Matilda I ® yes CS 2 sD5 sD5 25† B†1
+Matilda II n/a yes CS 5 sD6 sD6 26† B†1 K†2 N P
+Matilda II CS n/a yes CS 5 HE9†[2] s†[2] sD6 HE9†[2] s†[2] sD6 26† K†1 N P S†2
+Valentine II n/a yes CS 4 sM8 sM8 27† N
+Valentine V n/a yes CS 4 sM8 sM8 28† K†1 N
+Valentine VIII n/a yes CS 4 HE7 sD6 HE7 sD6 29 N
+Valentine XI n/a yes CS 4 WP6 s8 sD8 WP6 s8 sD8 30 n/a
+Churchill I n/a yes CS 7 HE9†[2] s†[2] sD5[4] sM8†[1] HE9†[2] s†[2] sD5 sM8†[1] 31† N S†2 Z†1 CC
+Churchill IV n/a yes CS 7 D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] HE8†[1] sD6 sM8†[3] 32† J†2 N Y†1 Z†3 CC
+Churchill V n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 33† S Z†1 CC
+Churchill VI n/a yes CS 7 WP6[J4+]†[1] s8 sD7 sM8†[2] s8 sD7 sM8†[2] 34† W†1 Z†2 CC
+Churchill VII n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 35† Z†1 CC
+Churchill VIII n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 35† S Z†1 CC
+Valentine Bridgelayer n/a yes CS 2 sD7 sD7 36† M P
+Churchill Bridgelayer n/a yes CS 2 sD7 sD7 36† M CC
+Churchill AVRE n/a n/a CS 8 sD7 sM8†[1] sD7 sM8†[1] 37† Z†1 CC
+Churchill Crocodile n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 38† Z†1 CC
+Deacon n/a yes CS 5 HE7[F3+]†[2] HE7†[2] 39† L†1 N Y†2
+Wolverine(a) n/a yes CS 7 A5[S4]6[5]†[1] HE7 s5[5] HE7 40† A J†1
+Achilles(a) n/a yes CS 7 D6[S4]7[5]†[1] HE7 HE7 40† A J†1
+Archer n/a yes CS 5 D6[4]7[5]†[1] HE7 sD7 D6†[1] HE7 sD7 41† J†1
+Daimler n/a yes CS 2 sD4[4+]† sD4† 42† M N P
+Lynx n/a yes CS 2 sD5 sD5 42† L†1 M P
+Humber n/a yes CS 2 sD4[4+]† sD4† 43† L†1 M P BB†2
+Stuart Recce n/a yes CS 5 n/a n/a 44† A D N P
+Humber III LRC n/a yes CS 3 sD5 sD5 45† L†1 N P Q†2
+Otter LRC n/a yes CS 3 sD5 sD5 45† L†1 P Q†2
+Morris CS9 n/a yes CS 4 sD5 sD5 46† N Q†2 T†3 X†1
+Rolls Royce n/a yes CS 3 sD5 sD5 47† N Q†2 T†3 X†1
+Marmon-Herrington II ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIv n/a yes CS 4 n/a n/a 49† L†1 N AA†2
+Marmon-Herrington III MFF n/a yes CS 4 n/a n/a 48† L†1 P Q†2
+Marmon-Herrington III ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIIv n/a yes CS 4 n/a n/a 49† K†2 L†1 N T†2
+Humber II n/a yes CS 3 sD6 sD6 50† L†1 N
+Humber III n/a yes CS 4 sD6 sD6 50† K†2 L†1 N P
+Humber IV n/a yes CS 3 C6[4+]†[2] sD6 C6†[2] sD6 51† A C†2 L†1 P
+Daimler n/a yes CS 3 sD6 sD6 52† K†1 N P
+AEC I n/a yes CS 3 sM8 sM8 53† N X†1
+AEC II n/a yes CS 4 D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 HE8†[1] sM8 53 J†2 X† Y†1
+AEC III n/a yes CS 4 WP6 s8 sM8 WP6 s8 sM8 53 X†
+Staghound I(a) n/a yes CS 5 C6[4+]†[3] sM8 C6†[3] sM8 54† A C†3 G K†2 X†1
+Staghound II(a) n/a yes CS 4 s9 sD6 s9 sD6 54† A K†3 S†2 X†1
+Bishop n/a n/a CS 5 s8 s8 55† K†1 N P
+Priest(a) n/a yes CS 7 H6 WP7 s8 H6 WP7 s8 56† A N P
+Sexton(a) n/a yes CS 7 s8 s8 57† A K†1
+M3 GMC(a) n/a yes CS 4 WP7[J4+]†[1] s8 s8 58† A N W†1
+Mk VI AA n/a yes CS 2 n/a n/a 59† N O†1 AA†2
+Crusader AA n/a yes CS 4 (brew up) sD7 sD7 60† AA†1
+M17 MGMC(a) n/a yes CS 4 n/a n/a 61† A F† AA†1
+Humber AA n/a yes CS 2 n/a n/a 62† L†1 N O†2 AA†3
+Staghound AA(a) n/a yes CS 3 n/a n/a 62† A F† X†1 AA†2
+M5(a) n/a yes cs 5†1 n/a n/a 63† A I†1 N
+M9(a) n/a yes cs 4†1 n/a n/a 63† A I†1 N
+M5A1(a) n/a yes cs 5† n/a n/a 63 A I†
+M9A1(a) n/a yes cs 4† n/a n/a 63 A I†
+Carrier A n/a yes CS 3 sD5[4+]†[1] sD5†[1] 64† N P U†1
+Carrier B n/a yes CS 3 sD5[4+]†[2] sD5†[2] 64† N P Q†1 U†2
+Carrier C n/a yes CS 3 sD5[4+]†[1] sD5†[1] 64† N P U†1
+Carrier, MMG A n/a yes CS 3 sD5[4+]†[2] sD5†[2] 65† N P Q†1 U†2
+Carrier, MMG B n/a yes CS 4 sD5[4+]†[2] sD5†[2] 65† U†2 BB†1
+Carrier, 2-in. MTR n/a yes CS 3 IR[2+]† s7 IR† s7 66† N P U†1
+Carrier, 3-in. MTR n/a yes CS 4 (brew up)†1 n/a n/a 67† H†1 N P U BB†2
+Priest Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D
+Ram Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D K†1
+White(a) SC n/a yes cs 4†1 n/a n/a 69† A I†1 N
+IP Carrier Mk IIA n/a yes CS 4 n/a n/a 70† N P V X†1
+IP Carrier Mk IIB n/a yes CS 4 n/a n/a 70† N P Q†2 V X†1
+IP Carrier AOV n/a yes CS 4 n/a n/a 70† P Q†1 V X†
+IP Carrier, 3-in. MTR n/a yes CS 5 (brew up)† IR WP7 s8 IR WP7 s8 71†[2] E†3 H† P V X†1 BB†4
+Wasp n/a yes CS 3 (brew up) sD5† sD5† 72† K†1 U
+Badger(a) n/a yes CS 3 n/a n/a 72† A K†1 M
+Buffalo Mk II(a) n/a yes CS 6 sD5† sD5† 73† A D AA†1
+Buffalo Mk IV(a) n/a yes CS 6 sD5† sD5† 73† A D E†1 AA†2
+Sherman III DD(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 74† A G K†2 R†1
+DUKW(a) n/a yes cs 7†1 n/a n/a 75† A D I†1 P
+Terrapin Mk I n/a yes cs 7 n/a n/a 76† D
+2pdr Portee n/a yes CS 4†1 n/a n/a 77† H†1 N P
+Morris C9/B n/a yes CS 4 n/a n/a 78† P AA†1
+Loyd Carrier n/a yes cs 5 n/a n/a 79† N P
+Quad FAT n/a yes CS 5 (brew up)† n/a n/a 80† N P
+15-cwt Truck n/a yes cs 5 n/a n/a 81† N P
+30-cwt Lorry n/a yes cs 6 n/a n/a 82† N P
+3-Ton Lorry n/a yes cs 7 n/a n/a 83† N P
+¼-Ton Jeep(a) n/a yes cs 2†1 n/a n/a 84† A I†1 N P
+¾-Ton Truck(a) n/a yes cs 4 n/a n/a 85 A N
+1½-Ton Truck(a) n/a yes cs 6 n/a n/a 85 A N
+2½-Ton Truck(a) n/a yes cs 7 n/a n/a 85 A N
+7½-Ton Truck(a) n/a yes cs 7 n/a n/a 85† A N
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1945.txt
new file mode 100644
index 0000000..4a2376d
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/british/1945.txt
@@ -0,0 +1,131 @@
+=== vehicles/british/1945 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------------- ------- ---- ------------------------------------------------- ----------------------------------------------- -------------------------- ------ ----------------------------------------------------
+Mark VIB n/a yes CS 3 sD6 sD6 1† N P
+Mark VIC n/a yes CS 3 sD6 sD6 1† n/a
+Tetrarch n/a yes CS 3 sD6 sD6 2† n/a
+Tetrarch CS n/a yes CS 3 HE9†[1] s†[1] sD6 HE9†[1] s†[1] sD6 2† S†1
+Stuart I(a) n/a yes CS 4 sD5 sD5 3† A N P
+Stuart III(a) n/a yes CS 4 C6[4+]†[1] HE[4+] sD5 C6†[1] HE sD5 3† A C†1 G N P
+Stuart V(a) n/a yes CS 4 C6†[1] sD5 C6†[1] sD5 4† A C†1 G
+Locust(a) n/a yes CS 3 C6† sD6 C6† sD6 5 A C†
+A9 n/a yes CS 5 (brew up) sD6 sD6 6† K†1 N
+A9 CS n/a yes CS 5 (brew up) s†[2] sD6 s†[2] sD6 6† K†1 N S†2
+A10 Mk IA n/a yes CS 5 (brew up)† sD6 sD6 7† B†1 K†2 N
+A10 Mk IA CS n/a yes CS 5 (brew up)† s†[2] sD6 s†[2] sD6 7† K†1 N S†2
+A13 Mk I n/a yes CS 4 (brew up) sD6 sD6 8 K†
+A13 Mk II n/a yes CS 4 (brew up) sD6 sD6 8† B†1 K†2 N
+A13 Mk II CS n/a yes CS 4 (brew up) s†[2] sD6 s†[2] sD6 8† K†1 N S†2
+Crusader I n/a yes CS 5 (brew up) sM8 sM8 9† K†1 N
+Crusader I CS n/a yes CS 5 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader II n/a yes CS 4 (brew up) sM8 sM8 9† K†1 N
+Crusader II CS n/a yes CS 4 (brew up) HE9 s†[2] sM8 HE9 s†[2] sM8 9† K†1 N S†2
+Crusader III n/a yes CS 3 (brew up) HE7[F3+]†[1] sD7 sM8†[2] HE7†[1] sD7 sM8†[2] 10† N Y†1 Z†2
+Grant(a) n/a yes CS 6 C5[4+]†[1] HE[4+] s8† sM8 C5†[1] HE s8† sM8 11† A C†1 G N P
+Lee(a) n/a yes CS 7 C5[4+]†[1] HE[4+] s8† sD6 C5†[1] HE s8† sD6 11† A C†1 G N P
+Sherman II(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 WP6†[3] s8 sD6 12† A G K†2 N R†1 W†3
+Sherman III(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 WP6†[3] s8 sD6 13† A G K†2 N R†1 W†3
+Sherman V(a) n/a yes CS 5 (brew up) WP6[J4+]†[3] s8 sD6 WP6†[3] s8 sD6 14† A G K†2 P R†1 W†3
+Sherman IIA(a) n/a yes CS 6 A4[4]5[5] s5[5] sM8 A5 s5 sM8 15† A G K†1
+Sherman IIC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 D6†[2] HE7 sM8 16† A J†2 K†1
+Sherman VC(a) n/a yes CS 5 (brew up) D5[S4]6[5]†[2] HE7 sM8 D6†[2] HE7 sM8 16† A J†2 K†1
+Sherman IB(a) n/a yes CS 6 H9 WP9 s7 sM8 H9 WP9 s7 sM8 17† A K†1
+Centaur IV n/a yes CS 5 H6 s9 sD7 sM8† H6 s9 sD7 sM8† 18 S Z†
+Cromwell IV n/a yes CS 5 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 19† Z†1
+Cromwell VI n/a yes CS 5 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Cromwell VII n/a yes CS 6 WP6 s8 sD7 sM8† WP6 s8 sD7 sM8† 19† Z†1
+Cromwell VIII n/a yes CS 6 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 20† S Z†1
+Challenger n/a yes CS 6 D5[S4]6[5]†[1] HE7 sD7 sM8†[2] D6†[1] HE7 sD7 sM8†[2] 21† J†1 Z†2
+Comet n/a yes CS 6 sD7 sM8† sD7 sM8† 22 Z†
+Sherman Dozer(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 23† A G K†2 P R†1
+Sherman Crab(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 24† A G K†2 P R†1
+Matilda I ® yes CS 2 sD5 sD5 25† B†1
+Matilda II n/a yes CS 5 sD6 sD6 26† B†1 K†2 N P
+Matilda II CS n/a yes CS 5 HE9†[2] s†[2] sD6 HE9†[2] s†[2] sD6 26† K†1 N P S†2
+Valentine II n/a yes CS 4 sM8 sM8 27† N
+Valentine V n/a yes CS 4 sM8 sM8 28† K†1 N
+Valentine VIII n/a yes CS 4 HE7 sD6 HE7 sD6 29 N
+Valentine XI n/a yes CS 4 WP6 s8 sD8 WP6 s8 sD8 30 n/a
+Churchill I n/a yes CS 7 HE9†[2] s†[2] sD5[4] sM8†[1] HE9†[2] s†[2] sD5 sM8†[1] 31† N S†2 Z†1 CC
+Churchill IV n/a yes CS 7 D6[J4]7[5]†[2] HE7[F3]8[4+]†[1] sD6[4+] sM8†[3] D7†[2] HE8†[1] sD6 sM8†[3] 32† J†2 N Y†1 Z†3 CC
+Churchill V n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 33† S Z†1 CC
+Churchill VI n/a yes CS 7 WP6[J4+]†[1] s8 sD7 sM8†[2] WP6†[1] s8 sD7 sM8†[2] 34† W†1 Z†2 CC
+Churchill VII n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 35† Z†1 CC
+Churchill VIII n/a yes CS 7 H6 s9 sD7 sM8†[1] H6 s9 sD7 sM8†[1] 35† S Z†1 CC
+Valentine Bridgelayer n/a yes CS 2 sD7 sD7 36† M P
+Churchill Bridgelayer n/a yes CS 2 sD7 sD7 36† M CC
+Churchill AVRE n/a n/a CS 8 sD7 sM8†[1] sD7 sM8†[1] 37† Z†1 CC
+Churchill Crocodile n/a yes CS 7 WP6 s8 sD7 sM8†[1] WP6 s8 sD7 sM8†[1] 38† Z†1 CC
+Deacon n/a yes CS 5 HE7[F3+]†[2] HE7†[2] 39† L†1 N Y†2
+Wolverine(a) n/a yes CS 7 A5[S4]6[5]†[1] HE7 s5[5] A6†[1] HE7 s5 40† A J†1
+Achilles(a) n/a yes CS 7 D6[S4]7[5]†[1] HE7 D7†[1] HE7 40† A J†1
+Archer n/a yes CS 5 D6[4]7[5]†[1] HE7 sD7 D7†[1] HE7 sD7 41† J†1
+Daimler n/a yes CS 2 sD4[4+]† sD4† 42† M N P
+Lynx n/a yes CS 2 sD5 sD5 42† L†1 M P
+Humber n/a yes CS 2 sD4[4+]† sD4† 43† L†1 M P BB†2
+Stuart Recce n/a yes CS 5 n/a n/a 44† A D N P
+Humber III LRC n/a yes CS 3 sD5 sD5 45† L†1 N P Q†2
+Otter LRC n/a yes CS 3 sD5 sD5 45† L†1 P Q†2
+Morris CS9 n/a yes CS 4 sD5 sD5 46† N Q†2 T†3 X†1
+Rolls Royce n/a yes CS 3 sD5 sD5 47† N Q†2 T†3 X†1
+Marmon-Herrington II ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIv n/a yes CS 4 n/a n/a 49† L†1 N AA†2
+Marmon-Herrington III MFF n/a yes CS 4 n/a n/a 48† L†1 P Q†2
+Marmon-Herrington III ME n/a yes CS 4 n/a n/a 48† L†1 N Q†2 T†3
+Marmon-Herrington IIIv n/a yes CS 4 n/a n/a 49† K†2 L†1 N T†2
+Humber II n/a yes CS 3 sD6 sD6 50† L†1 N
+Humber III n/a yes CS 4 sD6 sD6 50† K†2 L†1 N P
+Humber IV n/a yes CS 3 C6[4+]†[2] sD6 C6†[2] sD6 51† A C†2 L†1 P
+Daimler n/a yes CS 3 sD6 sD6 52† K†1 N P
+AEC I n/a yes CS 3 sM8 sM8 53† N X†1
+AEC II n/a yes CS 4 D6[J4]7[5]†[2] HE7[3]8[4+]†[1] sM8 D7†[2] HE8†[1] sM8 53 J†2 X† Y†1
+AEC III n/a yes CS 4 WP6 s8 sM8 WP6 s8 sM8 53 X†
+Staghound I(a) n/a yes CS 5 C6[4+]†[3] sM8 C6†[3] sM8 54† A C†3 G K†2 X†1
+Staghound II(a) n/a yes CS 4 s9 sD6 s9 sD6 54† A K†3 S†2 X†1
+Bishop n/a n/a CS 5 s8 s8 55† K†1 N P
+Priest(a) n/a yes CS 7 H6 WP7 s8 H6 WP7 s8 56† A N P
+Sexton(a) n/a yes CS 7 s8 s8 57† A K†1
+M3 GMC(a) n/a yes CS 4 WP7[J4+]†[1] s8 WP7†[1] s8 58† A N W†1
+Mk VI AA n/a yes CS 2 n/a n/a 59† N O†1 AA†2
+Crusader AA n/a yes CS 4 (brew up) sD7 sD7 60† AA†1
+M17 MGMC(a) n/a yes CS 4 n/a n/a 61† A F† AA†1
+Humber AA n/a yes CS 2 n/a n/a 62† L†1 N O†2 AA†3
+Staghound AA(a) n/a yes CS 3 n/a n/a 62† A F† X†1 AA†2
+M5(a) n/a yes cs 5†1 n/a n/a 63† A I†1 N
+M9(a) n/a yes cs 4†1 n/a n/a 63† A I†1 N
+M5A1(a) n/a yes cs 5† n/a n/a 63 A I†
+M9A1(a) n/a yes cs 4† n/a n/a 63 A I†
+Carrier A n/a yes CS 3 sD5[4+]†[1] sD5†[1] 64† N P U†1
+Carrier B n/a yes CS 3 sD5[4+]†[2] sD5†[2] 64† N P Q†1 U†2
+Carrier C n/a yes CS 3 sD5[4+]†[1] sD5†[1] 64† N P U†1
+Carrier, MMG A n/a yes CS 3 sD5[4+]†[2] sD5†[2] 65† N P Q†1 U†2
+Carrier, MMG B n/a yes CS 4 sD5[4+]†[2] sD5†[2] 65† U†2 BB†1
+Carrier, 2-in. MTR n/a yes CS 3 IR[2+]† s7 IR† s7 66† N P U†1
+Carrier, 3-in. MTR n/a yes CS 4 (brew up)†1 n/a n/a 67† H†1 N P U BB†2
+Priest Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D
+Ram Kangaroo(a) n/a yes CS 7 n/a n/a 68† A D K†1
+White(a) SC n/a yes cs 4†1 n/a n/a 69† A I†1 N
+IP Carrier Mk IIA n/a yes CS 4 n/a n/a 70† N P V X†1
+IP Carrier Mk IIB n/a yes CS 4 n/a n/a 70† N P Q†2 V X†1
+IP Carrier AOV n/a yes CS 4 n/a n/a 70† P Q†1 V X†
+IP Carrier, 3-in. MTR n/a yes CS 5 (brew up)† IR WP7 s8 IR WP7 s8 71†[2] E†3 H† P V X†1 BB†4
+Wasp n/a yes CS 3 (brew up) sD5† sD5† 72† K†1 U
+Badger(a) n/a yes CS 3 n/a n/a 72† A K†1 M
+Buffalo Mk II(a) n/a yes CS 6 sD5† sD5† 73† A D AA†1
+Buffalo Mk IV(a) n/a yes CS 6 sD5† sD5† 73† A D E†1 AA†2
+Sherman III DD(a) n/a yes CS 5 (brew up) WP6 s8 sD6 WP6 s8 sD6 74† A G K†2 R†1
+DUKW(a) n/a yes cs 7†1 n/a n/a 75† A D I†1 P
+Terrapin Mk I n/a yes cs 7 n/a n/a 76† D
+2pdr Portee n/a yes CS 4†1 n/a n/a 77† H†1 N P
+Morris C9/B n/a yes CS 4 n/a n/a 78† P AA†1
+Loyd Carrier n/a yes cs 5 n/a n/a 79† N P
+Quad FAT n/a yes CS 5 (brew up)† n/a n/a 80† N P
+15-cwt Truck n/a yes cs 5 n/a n/a 81† N P
+30-cwt Lorry n/a yes cs 6 n/a n/a 82† N P
+3-Ton Lorry n/a yes cs 7 n/a n/a 83† N P
+¼-Ton Jeep(a) n/a yes cs 2†1 n/a n/a 84† A I†1 N P
+¾-Ton Truck(a) n/a yes cs 4 n/a n/a 85 A N
+1½-Ton Truck(a) n/a yes cs 6 n/a n/a 85 A N
+2½-Ton Truck(a) n/a yes cs 7 n/a n/a 85 A N
+7½-Ton Truck(a) n/a yes cs 7 n/a n/a 85† A N
diff --git a/vasl_templates/webapp/tests/test_capabilities.py b/vasl_templates/webapp/tests/test_capabilities.py
index f78de92..5add455 100644
--- a/vasl_templates/webapp/tests/test_capabilities.py
+++ b/vasl_templates/webapp/tests/test_capabilities.py
@@ -122,6 +122,112 @@ def test_month_capabilities( webapp, webdriver ):
_check_capabilities( webdriver, webapp, *ordnance, "ETO", "09/1944", "NT D5\u2020 HE8\u2020" )
_check_capabilities( webdriver, webapp, *ordnance, "ETO", "01/1945", "NT D6\u2020 HE8\u2020" )
+ # Crusader III: HE7(F3+)†1
+ vehicle = [ "british", "vehicles", "Crusader III" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1942", "sD7 sM8\u20202" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1943", "sD7 sM8\u20202" )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "02/1943", "HE7\u20201 sD7 sM8\u20202"
+ )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "01/1944", "HE7\u20201 sD7 sM8\u20202"
+ )
+
+ # Sherman II(a)/III(a)/V(a): WP6(J4+)†3
+ for vo_name in ("Sherman II(a)","Sherman III(a)","Sherman V(a)"):
+ vehicle = [ "british", "vehicles", vo_name ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1943", "s8 sD6" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "05/1944", "s8 sD6" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "06/1944", "WP6\u20203 s8 sD6" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1945", "WP6\u20203 s8 sD6" )
+
+ # Sherman IIC(a)/VC(a): D5(S4)6(5)†2
+ for vo_name in ("Sherman IIC(a)","Sherman VC(a)"):
+ vehicle = [ "british", "vehicles", vo_name ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1943", "HE7 sM8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "08/1944", "HE7 sM8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "09/1944", "D5\u20202 HE7 sM8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1945", "D6\u20202 HE7 sM8" )
+
+ # Challenger: D5(S4)6(5)†1
+ vehicle = [ "british", "vehicles", "Challenger" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1943", "HE7 sD7 sM8\u20202" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "08/1944", "HE7 sD7 sM8\u20202" )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "09/1944", "D5\u20201 HE7 sD7 sM8\u20202"
+ )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "01/1945", "D6\u20201 HE7 sD7 sM8\u20202"
+ )
+
+ # Churchill IV: D6(J4)7(5)†2 HE7(F3)8(4)+†1 sD6(4+)
+ vehicle = [ "british", "vehicles", "Churchill IV" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1942", "sM8\u20203" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1943", "sM8\u20203" )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "02/1943", "HE7\u20201 sM8\u20203"
+ )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "05/1944", "HE8\u20201 sD6 sM8\u20203"
+ )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "06/1944", "D6\u20202 HE8\u20201 sD6 sM8\u20203"
+ )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "01/1945", "D7\u20202 HE8\u20201 sD6 sM8\u20203"
+ )
+
+ # Churchill VI: WP6(J4+)†1
+ vehicle = [ "british", "vehicles", "Churchill VI" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1943", "s8 sD7 sM8\u20202" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "05/1944", "s8 sD7 sM8\u20202" )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "06/1944", "WP6\u20201 s8 sD7 sM8\u20202"
+ )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "01/1945", "WP6\u20201 s8 sD7 sM8\u20202"
+ )
+
+ # Deacon: HE7(F3+)†2
+ vehicle = [ "british", "vehicles", "Deacon" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1942", "n/a" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1943", "n/a" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "02/1943", "HE7\u20202" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1944", "HE7\u20202" )
+
+ # Wolverine(a): A5(S4)6(5)†1 s5(5)
+ vehicle = [ "british", "vehicles", "Wolverine(a)" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1943", "HE7" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "08/1944", "HE7" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "09/1944", "A5\u20201 HE7" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1945", "A6\u20201 HE7 s5" )
+
+ # Achilles(a): D6(S4)7(5)†1
+ vehicle = [ "british", "vehicles", "Achilles(a)" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1943", "HE7" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "08/1944", "HE7" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "09/1944", "D6\u20201 HE7" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1945", "D7\u20201 HE7" )
+
+ # AEC II: D6(J4)7(5)†2 HE7(3)8(4)+†1
+ vehicle = [ "british", "vehicles", "AEC II" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1942", "sM8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1943", "HE7\u20201 sM8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "05/1944", "HE8\u20201 sM8" )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "06/1944", "D6\u20202 HE8\u20201 sM8"
+ )
+ _check_capabilities( webdriver, webapp, *vehicle,
+ "ETO", "01/1945", "D7\u20202 HE8\u20201 sM8"
+ )
+
+ # M3C GMC(a): WP7(J4+)†1
+ vehicle = [ "british", "vehicles", "M3 GMC(a)" ]
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "12/1943", "s8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "05/1944", "s8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "06/1944", "WP7\u20201 s8" )
+ _check_capabilities( webdriver, webapp, *vehicle, "ETO", "01/1945", "WP7\u20201 s8" )
+
# ---------------------------------------------------------------------
@pytest.mark.skipif(
diff --git a/vasl_templates/webapp/tests/test_vo_reports.py b/vasl_templates/webapp/tests/test_vo_reports.py
index a29671b..a47cfbd 100644
--- a/vasl_templates/webapp/tests/test_vo_reports.py
+++ b/vasl_templates/webapp/tests/test_vo_reports.py
@@ -36,7 +36,7 @@ def test_vo_reports( webapp, webdriver ):
)
# check each vehicle/ordnance report
- for nat in ["german","russian","american"]:
+ for nat in ["german","russian","american","british"]:
for vo_type in ["vehicles","ordnance"]:
for year in range(1940,1945+1):