This repository has been archived on 2026-02-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
swift-duct-calc/Sources/ManualDCore/EffectiveLengthGroup.swift

629 lines
42 KiB
Swift

import Foundation
// TODO: Add other description / label for items that have same group & letter, but
// different effective length.
public struct EffectiveLengthGroup: Codable, Equatable, Sendable {
public let group: Int
public let letter: String
public let effectiveLength: Int
public let category: Category
public var label: String { "\(group)\(letter.uppercased())" }
public init(
group: Int,
letter: String,
effectiveLength: Int,
category: Category
) {
self.group = group
self.letter = letter
self.effectiveLength = effectiveLength
self.category = category
}
}
extension EffectiveLengthGroup {
public enum Category: String, Codable, Equatable, Sendable {
case any
case supply
case `return`
}
}
public let effectiveLengthsLookup: [String: EffectiveLengthGroup] = {
[
"1a": .init(group: 1, letter: "a", effectiveLength: 35, category: .supply),
"1b": .init(group: 1, letter: "b", effectiveLength: 10, category: .supply),
"1c": .init(group: 1, letter: "c", effectiveLength: 35, category: .supply),
"1d": .init(group: 1, letter: "d", effectiveLength: 10, category: .supply),
"1e": .init(group: 1, letter: "e", effectiveLength: 10, category: .supply),
"1f-0.5": .init(group: 1, letter: "f", effectiveLength: 120, category: .supply),
"1f-1": .init(group: 1, letter: "f", effectiveLength: 85, category: .supply),
"1g-0.5": .init(group: 1, letter: "g", effectiveLength: 35, category: .supply),
"1g-1": .init(group: 1, letter: "g", effectiveLength: 25, category: .supply),
"1h-0.5": .init(group: 1, letter: "h", effectiveLength: 120, category: .supply),
"1h-1": .init(group: 1, letter: "h", effectiveLength: 85, category: .supply),
"1i": .init(group: 1, letter: "i", effectiveLength: 20, category: .supply),
"1k": .init(group: 1, letter: "k", effectiveLength: 85, category: .supply),
"1l-0.25": .init(group: 1, letter: "l", effectiveLength: 40, category: .supply),
"1l-0.5": .init(group: 1, letter: "l", effectiveLength: 20, category: .supply),
"1l-1": .init(group: 1, letter: "l", effectiveLength: 10, category: .supply),
"1m-0.05-1": .init(group: 1, letter: "m", effectiveLength: 30, category: .supply),
"1m-0.05-2": .init(group: 1, letter: "m", effectiveLength: 20, category: .supply),
"1m-0.25-1": .init(group: 1, letter: "m", effectiveLength: 20, category: .supply),
"1m-0.25-2": .init(group: 1, letter: "m", effectiveLength: 10, category: .supply),
"1m-0.5-1": .init(group: 1, letter: "m", effectiveLength: 10, category: .supply),
"1m-0.5-2": .init(group: 1, letter: "m", effectiveLength: 10, category: .supply),
"1n": .init(group: 1, letter: "n", effectiveLength: 15, category: .supply),
"1o-0.5": .init(group: 1, letter: "o", effectiveLength: 120, category: .supply),
"1o-1": .init(group: 1, letter: "o", effectiveLength: 85, category: .supply),
"1p": .init(group: 1, letter: "p", effectiveLength: 20, category: .supply),
"1q": .init(group: 1, letter: "q", effectiveLength: 50, category: .supply),
"1r": .init(group: 1, letter: "r", effectiveLength: 120, category: .supply),
"1s-0": .init(group: 1, letter: "s", effectiveLength: 60, category: .supply),
"1s-1": .init(group: 1, letter: "s", effectiveLength: 40, category: .supply),
"1s-2": .init(group: 1, letter: "s", effectiveLength: 30, category: .supply),
"1t": .init(group: 1, letter: "t", effectiveLength: 60, category: .supply),
// Group 2
"2a-0": .init(group: 2, letter: "a", effectiveLength: 35, category: .supply),
"2a-1": .init(group: 2, letter: "a", effectiveLength: 45, category: .supply),
"2a-2": .init(group: 2, letter: "a", effectiveLength: 55, category: .supply),
"2a-3": .init(group: 2, letter: "a", effectiveLength: 65, category: .supply),
"2a-4": .init(group: 2, letter: "a", effectiveLength: 70, category: .supply),
"2a-5": .init(group: 2, letter: "a", effectiveLength: 80, category: .supply),
"2b-0": .init(group: 2, letter: "b", effectiveLength: 20, category: .supply),
"2b-1": .init(group: 2, letter: "b", effectiveLength: 30, category: .supply),
"2b-2": .init(group: 2, letter: "b", effectiveLength: 35, category: .supply),
"2b-3": .init(group: 2, letter: "b", effectiveLength: 40, category: .supply),
"2b-4": .init(group: 2, letter: "b", effectiveLength: 45, category: .supply),
"2b-5": .init(group: 2, letter: "b", effectiveLength: 50, category: .supply),
"2c-0": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
"2c-1": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
"2c-2": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
"2c-3": .init(group: 2, letter: "c", effectiveLength: 65, category: .supply),
"2c-4": .init(group: 2, letter: "c", effectiveLength: 70, category: .supply),
"2c-5": .init(group: 2, letter: "c", effectiveLength: 80, category: .supply),
"2d-0": .init(group: 2, letter: "d", effectiveLength: 40, category: .supply),
"2d-1": .init(group: 2, letter: "d", effectiveLength: 50, category: .supply),
"2d-2": .init(group: 2, letter: "d", effectiveLength: 60, category: .supply),
"2d-3": .init(group: 2, letter: "d", effectiveLength: 65, category: .supply),
"2d-4": .init(group: 2, letter: "d", effectiveLength: 75, category: .supply),
"2d-5": .init(group: 2, letter: "d", effectiveLength: 85, category: .supply),
"2e-0": .init(group: 2, letter: "e", effectiveLength: 25, category: .supply),
"2e-1": .init(group: 2, letter: "e", effectiveLength: 30, category: .supply),
"2e-2": .init(group: 2, letter: "e", effectiveLength: 35, category: .supply),
"2e-3": .init(group: 2, letter: "e", effectiveLength: 40, category: .supply),
"2e-4": .init(group: 2, letter: "e", effectiveLength: 45, category: .supply),
"2e-5": .init(group: 2, letter: "e", effectiveLength: 50, category: .supply),
"2f-0": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
"2f-1": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
"2f-2": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
"2f-3": .init(group: 2, letter: "f", effectiveLength: 20, category: .supply),
"2f-4": .init(group: 2, letter: "f", effectiveLength: 25, category: .supply),
"2f-5": .init(group: 2, letter: "f", effectiveLength: 25, category: .supply),
"2g-0": .init(group: 2, letter: "g", effectiveLength: 65, category: .supply),
"2g-1": .init(group: 2, letter: "g", effectiveLength: 65, category: .supply),
"2g-2": .init(group: 2, letter: "g", effectiveLength: 65, category: .supply),
"2g-3": .init(group: 2, letter: "g", effectiveLength: 70, category: .supply),
"2g-4": .init(group: 2, letter: "g", effectiveLength: 80, category: .supply),
"2g-5": .init(group: 2, letter: "g", effectiveLength: 90, category: .supply),
"2h-0": .init(group: 2, letter: "h", effectiveLength: 70, category: .supply),
"2h-1": .init(group: 2, letter: "h", effectiveLength: 70, category: .supply),
"2h-2": .init(group: 2, letter: "h", effectiveLength: 70, category: .supply),
"2h-3": .init(group: 2, letter: "h", effectiveLength: 75, category: .supply),
"2h-4": .init(group: 2, letter: "h", effectiveLength: 85, category: .supply),
"2h-5": .init(group: 2, letter: "h", effectiveLength: 95, category: .supply),
"2i-0": .init(group: 2, letter: "i", effectiveLength: 65, category: .supply),
"2i-1": .init(group: 2, letter: "i", effectiveLength: 75, category: .supply),
"2i-2": .init(group: 2, letter: "i", effectiveLength: 85, category: .supply),
"2i-3": .init(group: 2, letter: "i", effectiveLength: 95, category: .supply),
"2i-4": .init(group: 2, letter: "i", effectiveLength: 100, category: .supply),
"2i-5": .init(group: 2, letter: "i", effectiveLength: 110, category: .supply),
"2j-0": .init(group: 2, letter: "j", effectiveLength: 50, category: .supply),
"2j-1": .init(group: 2, letter: "j", effectiveLength: 60, category: .supply),
"2j-2": .init(group: 2, letter: "j", effectiveLength: 65, category: .supply),
"2j-3": .init(group: 2, letter: "j", effectiveLength: 70, category: .supply),
"2j-4": .init(group: 2, letter: "j", effectiveLength: 75, category: .supply),
"2j-5": .init(group: 2, letter: "j", effectiveLength: 80, category: .supply),
"2k-0": .init(group: 2, letter: "k", effectiveLength: 50, category: .supply),
"2k-1": .init(group: 2, letter: "k", effectiveLength: 60, category: .supply),
"2k-2": .init(group: 2, letter: "k", effectiveLength: 65, category: .supply),
"2k-3": .init(group: 2, letter: "k", effectiveLength: 70, category: .supply),
"2k-4": .init(group: 2, letter: "k", effectiveLength: 75, category: .supply),
"2k-5": .init(group: 2, letter: "k", effectiveLength: 80, category: .supply),
"2l-0": .init(group: 2, letter: "l", effectiveLength: 70, category: .supply),
"2l-1": .init(group: 2, letter: "l", effectiveLength: 80, category: .supply),
"2l-2": .init(group: 2, letter: "l", effectiveLength: 90, category: .supply),
"2l-3": .init(group: 2, letter: "l", effectiveLength: 95, category: .supply),
"2l-4": .init(group: 2, letter: "l", effectiveLength: 105, category: .supply),
"2l-5": .init(group: 2, letter: "l", effectiveLength: 115, category: .supply),
"2m-0": .init(group: 2, letter: "m", effectiveLength: 70, category: .supply),
"2m-1": .init(group: 2, letter: "m", effectiveLength: 80, category: .supply),
"2m-2": .init(group: 2, letter: "m", effectiveLength: 90, category: .supply),
"2m-3": .init(group: 2, letter: "m", effectiveLength: 95, category: .supply),
"2m-4": .init(group: 2, letter: "m", effectiveLength: 105, category: .supply),
"2m-5": .init(group: 2, letter: "m", effectiveLength: 115, category: .supply),
"2n-0": .init(group: 2, letter: "n", effectiveLength: 35, category: .supply),
"2n-1": .init(group: 2, letter: "n", effectiveLength: 35, category: .supply),
"2n-2": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),
"2n-3": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),
"2n-4": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),
"2n-5": .init(group: 2, letter: "n", effectiveLength: 40, category: .supply),
"2o-0": .init(group: 2, letter: "o", effectiveLength: 55, category: .supply),
"2o-1": .init(group: 2, letter: "o", effectiveLength: 65, category: .supply),
"2o-2": .init(group: 2, letter: "o", effectiveLength: 75, category: .supply),
"2o-3": .init(group: 2, letter: "o", effectiveLength: 85, category: .supply),
"2o-4": .init(group: 2, letter: "o", effectiveLength: 90, category: .supply),
"2o-5": .init(group: 2, letter: "o", effectiveLength: 100, category: .supply),
"2p-0": .init(group: 2, letter: "p", effectiveLength: 50, category: .supply),
"2p-1": .init(group: 2, letter: "p", effectiveLength: 55, category: .supply),
"2p-2": .init(group: 2, letter: "p", effectiveLength: 60, category: .supply),
"2p-3": .init(group: 2, letter: "p", effectiveLength: 65, category: .supply),
"2p-4": .init(group: 2, letter: "p", effectiveLength: 70, category: .supply),
"2p-5": .init(group: 2, letter: "p", effectiveLength: 75, category: .supply),
"2q-0": .init(group: 2, letter: "q", effectiveLength: 10, category: .supply),
"2q-1": .init(group: 2, letter: "q", effectiveLength: 10, category: .supply),
"2q-2": .init(group: 2, letter: "q", effectiveLength: 15, category: .supply),
"2q-3": .init(group: 2, letter: "q", effectiveLength: 20, category: .supply),
"2q-4": .init(group: 2, letter: "q", effectiveLength: 20, category: .supply),
"2q-5": .init(group: 2, letter: "q", effectiveLength: 25, category: .supply),
// Group 3
"3a": .init(group: 3, letter: "a", effectiveLength: 15, category: .supply),
"3b": .init(group: 3, letter: "b", effectiveLength: 30, category: .supply),
"3c": .init(group: 3, letter: "c", effectiveLength: 20, category: .supply),
"3d-f": .init(group: 3, letter: "d", effectiveLength: 35, category: .supply),
"3d-t": .init(group: 3, letter: "d", effectiveLength: 55, category: .supply),
"3d-m": .init(group: 3, letter: "d", effectiveLength: 110, category: .supply),
"3e": .init(group: 3, letter: "e", effectiveLength: 30, category: .supply),
"3f-f": .init(group: 3, letter: "f", effectiveLength: 50, category: .supply),
"3f-t": .init(group: 3, letter: "f", effectiveLength: 70, category: .supply),
"3f-m": .init(group: 3, letter: "f", effectiveLength: 125, category: .supply),
"3g": .init(group: 3, letter: "g", effectiveLength: 35, category: .supply),
"3h": .init(group: 3, letter: "h", effectiveLength: 35, category: .supply),
"3i": .init(group: 3, letter: "i", effectiveLength: 15, category: .supply),
"3k": .init(group: 3, letter: "k", effectiveLength: 20, category: .supply),
"3l": .init(group: 3, letter: "l", effectiveLength: 30, category: .supply),
"3m": .init(group: 3, letter: "m", effectiveLength: 25, category: .supply),
"3n": .init(group: 3, letter: "n", effectiveLength: 40, category: .supply),
"3o": .init(group: 3, letter: "o", effectiveLength: 20, category: .supply),
"3p": .init(group: 3, letter: "p", effectiveLength: 50, category: .supply),
"3q": .init(group: 3, letter: "q", effectiveLength: 35, category: .supply),
"3r": .init(group: 3, letter: "r", effectiveLength: 20, category: .supply),
"3s-f": .init(group: 3, letter: "s", effectiveLength: 15, category: .supply),
"3s-t": .init(group: 3, letter: "s", effectiveLength: 35, category: .supply),
"3s-m": .init(group: 3, letter: "s", effectiveLength: 90, category: .supply),
"3t": .init(group: 3, letter: "t", effectiveLength: 10, category: .supply),
"3u": .init(group: 3, letter: "u", effectiveLength: 80, category: .supply),
"3u-v": .init(group: 3, letter: "u", effectiveLength: 10, category: .supply),
"3v": .init(group: 3, letter: "v", effectiveLength: 30, category: .supply),
"3w-f": .init(group: 3, letter: "w", effectiveLength: 15, category: .supply),
"3w-t": .init(group: 3, letter: "w", effectiveLength: 35, category: .supply),
"3w-m": .init(group: 3, letter: "w", effectiveLength: 90, category: .supply),
// Group 4
"4a": .init(group: 4, letter: "a", effectiveLength: 30, category: .supply),
"4b": .init(group: 4, letter: "b", effectiveLength: 35, category: .supply),
"4c": .init(group: 4, letter: "c", effectiveLength: 60, category: .supply),
"4d": .init(group: 4, letter: "d", effectiveLength: 55, category: .supply),
"4e": .init(group: 4, letter: "e", effectiveLength: 70, category: .supply),
"4f": .init(group: 4, letter: "f", effectiveLength: 45, category: .supply),
"4g": .init(group: 4, letter: "g", effectiveLength: 80, category: .supply),
"4h": .init(group: 4, letter: "h", effectiveLength: 50, category: .supply),
"4i": .init(group: 4, letter: "i", effectiveLength: 10, category: .supply),
"4j": .init(group: 4, letter: "j", effectiveLength: 30, category: .supply),
"4k": .init(group: 4, letter: "k", effectiveLength: 30, category: .supply),
"4l": .init(group: 4, letter: "l", effectiveLength: 30, category: .supply),
"4m": .init(group: 4, letter: "m", effectiveLength: 20, category: .supply),
"4n": .init(group: 4, letter: "n", effectiveLength: 45, category: .supply),
"4o": .init(group: 4, letter: "o", effectiveLength: 20, category: .supply),
"4p": .init(group: 4, letter: "p", effectiveLength: 10, category: .supply),
"4q": .init(group: 4, letter: "q", effectiveLength: 50, category: .supply),
"4r": .init(group: 4, letter: "r", effectiveLength: 20, category: .supply),
"4s": .init(group: 4, letter: "s", effectiveLength: 20, category: .supply),
"4t": .init(group: 4, letter: "t", effectiveLength: 20, category: .supply),
"4u": .init(group: 4, letter: "u", effectiveLength: 20, category: .supply),
"4v": .init(group: 4, letter: "v", effectiveLength: 60, category: .supply),
"4w": .init(group: 4, letter: "w", effectiveLength: 35, category: .supply),
"4x": .init(group: 4, letter: "x", effectiveLength: 35, category: .supply),
"4y": .init(group: 4, letter: "y", effectiveLength: 35, category: .supply),
"4z": .init(group: 4, letter: "z", effectiveLength: 60, category: .supply),
"4aa": .init(group: 4, letter: "aa", effectiveLength: 35, category: .supply),
"4ab": .init(group: 4, letter: "ab", effectiveLength: 90, category: .supply),
"4ac": .init(group: 4, letter: "ac", effectiveLength: 100, category: .supply),
"4ad": .init(group: 4, letter: "ad", effectiveLength: 60, category: .supply),
"4ae": .init(group: 4, letter: "ae", effectiveLength: 55, category: .supply),
"4af": .init(group: 4, letter: "af", effectiveLength: 50, category: .supply),
"4ag": .init(group: 4, letter: "ag", effectiveLength: 60, category: .supply),
"4ah": .init(group: 4, letter: "ah", effectiveLength: 60, category: .supply),
"4ai": .init(group: 4, letter: "ai", effectiveLength: 20, category: .supply),
"4aj": .init(group: 4, letter: "aj", effectiveLength: 25, category: .supply),
"4ak": .init(group: 4, letter: "ak", effectiveLength: 55, category: .supply),
"4al": .init(group: 4, letter: "al", effectiveLength: 70, category: .supply),
"4am": .init(group: 4, letter: "am", effectiveLength: 70, category: .supply),
"4an": .init(group: 4, letter: "an", effectiveLength: 70, category: .supply),
"4ao": .init(group: 4, letter: "ao", effectiveLength: 40, category: .supply),
"4ap": .init(group: 4, letter: "ap", effectiveLength: 40, category: .supply),
"4aq": .init(group: 4, letter: "aq", effectiveLength: 10, category: .supply),
"4ar": .init(group: 4, letter: "ar", effectiveLength: 70, category: .supply),
// Group 5
"5a": .init(group: 5, letter: "a", effectiveLength: 40, category: .return),
"5b": .init(group: 5, letter: "b", effectiveLength: 40, category: .return),
"5c": .init(group: 5, letter: "c", effectiveLength: 40, category: .return),
"5d": .init(group: 5, letter: "d", effectiveLength: 40, category: .return),
"5e-1": .init(group: 5, letter: "e", effectiveLength: 10, category: .return),
"5e-2": .init(group: 5, letter: "e", effectiveLength: 35, category: .return),
"5f-1": .init(group: 5, letter: "f", effectiveLength: 45, category: .return),
"5f-2": .init(group: 5, letter: "f", effectiveLength: 70, category: .return),
"5g-1": .init(group: 5, letter: "g", effectiveLength: 45, category: .return),
"5g-2": .init(group: 5, letter: "g", effectiveLength: 70, category: .return),
"5h-1": .init(group: 5, letter: "h", effectiveLength: 45, category: .return),
"5h-2": .init(group: 5, letter: "h", effectiveLength: 30, category: .return),
"5i-1": .init(group: 5, letter: "i", effectiveLength: 45, category: .return),
"5i-2": .init(group: 5, letter: "i", effectiveLength: 30, category: .return),
"5j-0.25": .init(group: 5, letter: "j", effectiveLength: 20, category: .return),
"5j-0.5": .init(group: 5, letter: "j", effectiveLength: 15, category: .return),
"5j-1": .init(group: 5, letter: "j", effectiveLength: 10, category: .return),
"5k": .init(group: 5, letter: "k", effectiveLength: 10, category: .return),
"5l": .init(group: 5, letter: "l", effectiveLength: 75, category: .return),
"5m": .init(group: 5, letter: "m", effectiveLength: 10, category: .return),
"5n": .init(group: 5, letter: "n", effectiveLength: 55, category: .return),
"5o": .init(group: 5, letter: "o", effectiveLength: 35, category: .return),
// Group 6
"6a-0.4-b": .init(group: 6, letter: "a", effectiveLength: 10, category: .return),
"6a-0.4-t": .init(group: 6, letter: "a", effectiveLength: 10, category: .return),
"6a-0.5-b": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
"6a-0.5-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
"6a-0.6-b": .init(group: 6, letter: "a", effectiveLength: 40, category: .return),
"6a-0.6-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
"6a-0.7-b": .init(group: 6, letter: "a", effectiveLength: 60, category: .return),
"6a-0.7-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
"6a-0.8-b": .init(group: 6, letter: "a", effectiveLength: 75, category: .return),
"6a-0.8-t": .init(group: 6, letter: "a", effectiveLength: 25, category: .return),
"6a-1-b": .init(group: 6, letter: "a", effectiveLength: 75, category: .return),
"6b-0.4-b": .init(group: 6, letter: "b", effectiveLength: 10, category: .return),
"6b-0.4-t": .init(group: 6, letter: "b", effectiveLength: 10, category: .return),
"6b-0.5-b": .init(group: 6, letter: "b", effectiveLength: 40, category: .return),
"6b-0.5-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
"6b-0.6-b": .init(group: 6, letter: "b", effectiveLength: 40, category: .return),
"6b-0.6-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
"6b-0.7-b": .init(group: 6, letter: "b", effectiveLength: 75, category: .return),
"6b-0.7-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
"6b-0.8-b": .init(group: 6, letter: "b", effectiveLength: 110, category: .return),
"6b-0.8-t": .init(group: 6, letter: "b", effectiveLength: 25, category: .return),
"6b-1-b": .init(group: 6, letter: "b", effectiveLength: 110, category: .return),
"6c-0.4-b": .init(group: 6, letter: "c", effectiveLength: 10, category: .return),
"6c-0.4-t": .init(group: 6, letter: "c", effectiveLength: 10, category: .return),
"6c-0.5-b": .init(group: 6, letter: "c", effectiveLength: 30, category: .return),
"6c-0.5-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
"6c-0.6-b": .init(group: 6, letter: "c", effectiveLength: 50, category: .return),
"6c-0.6-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
"6c-0.7-b": .init(group: 6, letter: "c", effectiveLength: 75, category: .return),
"6c-0.7-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
"6c-0.8-b": .init(group: 6, letter: "c", effectiveLength: 115, category: .return),
"6c-0.8-t": .init(group: 6, letter: "c", effectiveLength: 25, category: .return),
"6c-1-b": .init(group: 6, letter: "c", effectiveLength: 115, category: .return),
"6d-0.1-b": .init(group: 6, letter: "d", effectiveLength: 10, category: .return),
"6d-0.1-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
"6d-0.2-b": .init(group: 6, letter: "d", effectiveLength: 15, category: .return),
"6d-0.2-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
"6d-0.3-b": .init(group: 6, letter: "d", effectiveLength: 20, category: .return),
"6d-0.3-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
"6d-0.4-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),
"6d-0.4-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
"6d-0.6-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),
"6d-0.6-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
"6d-0.8-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),
"6d-0.8-t": .init(group: 6, letter: "d", effectiveLength: 5, category: .return),
"6d-1-b": .init(group: 6, letter: "d", effectiveLength: 30, category: .return),
"6e-0.1-b": .init(group: 6, letter: "e", effectiveLength: 15, category: .return),
"6e-0.1-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
"6e-0.2-b": .init(group: 6, letter: "e", effectiveLength: 30, category: .return),
"6e-0.2-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
"6e-0.3-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
"6e-0.3-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
"6e-0.4-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
"6e-0.4-t": .init(group: 6, letter: "e", effectiveLength: 10, category: .return),
"6e-0.6-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
"6e-0.6-t": .init(group: 6, letter: "e", effectiveLength: 25, category: .return),
"6e-0.8-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
"6e-0.8-t": .init(group: 6, letter: "e", effectiveLength: 25, category: .return),
"6e-1-b": .init(group: 6, letter: "e", effectiveLength: 40, category: .return),
"6f": .init(group: 6, letter: "f", effectiveLength: 25, category: .return),
"6g": .init(group: 6, letter: "g", effectiveLength: 30, category: .return),
"6h": .init(group: 6, letter: "h", effectiveLength: 15, category: .return),
"6i": .init(group: 6, letter: "i", effectiveLength: 30, category: .return),
"6j": .init(group: 6, letter: "j", effectiveLength: 55, category: .return),
"6k": .init(group: 6, letter: "k", effectiveLength: 10, category: .return),
"6l": .init(group: 6, letter: "l", effectiveLength: 20, category: .return),
"6m": .init(group: 6, letter: "m", effectiveLength: 20, category: .return),
"6n": .init(group: 6, letter: "n", effectiveLength: 10, category: .return),
"6o": .init(group: 6, letter: "o", effectiveLength: 10, category: .return),
"6p": .init(group: 6, letter: "p", effectiveLength: 5, category: .return),
// Group 7
"7a": .init(group: 7, letter: "a", effectiveLength: 25, category: .return),
"7b-100": .init(group: 7, letter: "b", effectiveLength: 10, category: .return),
"7b-150": .init(group: 7, letter: "b", effectiveLength: 15, category: .return),
"7b-200": .init(group: 7, letter: "b", effectiveLength: 25, category: .return),
"7c-100": .init(group: 7, letter: "c", effectiveLength: 10, category: .return),
"7c-200": .init(group: 7, letter: "c", effectiveLength: 30, category: .return),
"7c-300": .init(group: 7, letter: "c", effectiveLength: 60, category: .return),
"7c-400": .init(group: 7, letter: "c", effectiveLength: 110, category: .return),
"7d-100": .init(group: 7, letter: "d", effectiveLength: 20, category: .return),
"7d-150": .init(group: 7, letter: "d", effectiveLength: 50, category: .return),
"7d-200": .init(group: 7, letter: "d", effectiveLength: 90, category: .return),
"7e-200": .init(group: 7, letter: "e", effectiveLength: 10, category: .return),
"7e-400": .init(group: 7, letter: "e", effectiveLength: 30, category: .return),
"7e-600": .init(group: 7, letter: "e", effectiveLength: 60, category: .return),
"7e-800": .init(group: 7, letter: "e", effectiveLength: 110, category: .return),
// Group 8
"8a-0-s": .init(group: 8, letter: "a", effectiveLength: 75, category: .any),
"8a-0.75-s": .init(group: 8, letter: "a", effectiveLength: 20, category: .any),
"8a-0.75-3": .init(group: 8, letter: "a", effectiveLength: 35, category: .any),
"8a-0.75-5": .init(group: 8, letter: "a", effectiveLength: 30, category: .any),
"8a-1-s": .init(group: 8, letter: "a", effectiveLength: 15, category: .any),
"8a-1-3": .init(group: 8, letter: "a", effectiveLength: 20, category: .any),
"8a-1-5": .init(group: 8, letter: "a", effectiveLength: 25, category: .any),
"8a-1.5-s": .init(group: 8, letter: "a", effectiveLength: 10, category: .any),
"8a-1.5-3": .init(group: 8, letter: "a", effectiveLength: 15, category: .any),
"8a-1.5-5": .init(group: 8, letter: "a", effectiveLength: 20, category: .any),
"8a-oe-4": .init(group: 8, letter: "a", effectiveLength: 25, category: .any),
"8a-oh-4": .init(group: 8, letter: "a", effectiveLength: 30, category: .any),
"8a-oe-3": .init(group: 8, letter: "a", effectiveLength: 30, category: .any),
"8a-oh-3": .init(group: 8, letter: "a", effectiveLength: 35, category: .any),
"8a-45-3": .init(group: 8, letter: "a", effectiveLength: 10, category: .any),
"8a-45-2": .init(group: 8, letter: "a", effectiveLength: 15, category: .any),
"8b-0-h": .init(group: 8, letter: "b", effectiveLength: 90, category: .any),
"8b-0.25-h": .init(group: 8, letter: "b", effectiveLength: 35, category: .any),
"8b-0.5-h": .init(group: 8, letter: "b", effectiveLength: 20, category: .any),
"8b-0-1": .init(group: 8, letter: "b", effectiveLength: 75, category: .any),
"8b-0.25-1": .init(group: 8, letter: "b", effectiveLength: 30, category: .any),
"8b-0.5-1": .init(group: 8, letter: "b", effectiveLength: 15, category: .any),
"8b-0-e": .init(group: 8, letter: "b", effectiveLength: 65, category: .any),
"8b-0.25-e": .init(group: 8, letter: "b", effectiveLength: 25, category: .any),
"8b-0.5-e": .init(group: 8, letter: "b", effectiveLength: 10, category: .any),
"8c-0-h": .init(group: 8, letter: "c", effectiveLength: 30, category: .any),
"8c-0.25-h": .init(group: 8, letter: "c", effectiveLength: 10, category: .any),
"8c-0.5-h": .init(group: 8, letter: "c", effectiveLength: 5, category: .any),
"8c-0-1": .init(group: 8, letter: "c", effectiveLength: 25, category: .any),
"8c-0.25-1": .init(group: 8, letter: "c", effectiveLength: 10, category: .any),
"8c-0.5-1": .init(group: 8, letter: "c", effectiveLength: 5, category: .any),
"8c-0-e": .init(group: 8, letter: "c", effectiveLength: 40, category: .any),
"8c-0.25-e": .init(group: 8, letter: "c", effectiveLength: 10, category: .any),
"8c-0.5-e": .init(group: 8, letter: "c", effectiveLength: 5, category: .any),
"8d-h": .init(group: 8, letter: "d", effectiveLength: 80, category: .any),
"8d-1": .init(group: 8, letter: "d", effectiveLength: 80, category: .any),
"8d-e": .init(group: 8, letter: "d", effectiveLength: 65, category: .any),
"8e-h": .init(group: 8, letter: "e", effectiveLength: 10, category: .any),
"8e-1": .init(group: 8, letter: "e", effectiveLength: 10, category: .any),
"8e-e": .init(group: 8, letter: "e", effectiveLength: 10, category: .any),
"8f-1": .init(group: 8, letter: "f", effectiveLength: 160, category: .any),
"8f-2": .init(group: 8, letter: "f", effectiveLength: 260, category: .any),
"8f-4": .init(group: 8, letter: "f", effectiveLength: 190, category: .any),
"8g": .init(group: 8, letter: "g", effectiveLength: 200, category: .any),
"8h-0.5": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),
"8h-1": .init(group: 8, letter: "h", effectiveLength: 330, category: .any),
"8h-1.5": .init(group: 8, letter: "h", effectiveLength: 430, category: .any),
"8h-2": .init(group: 8, letter: "h", effectiveLength: 470, category: .any),
"8h-1-v": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),
"8h-1.5-v": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),
"8h-2-v": .init(group: 8, letter: "h", effectiveLength: 55, category: .any),
"8i": .init(group: 8, letter: "i", effectiveLength: 20, category: .any),
"8j": .init(group: 8, letter: "j", effectiveLength: 20, category: .any),
"8k-0.25": .init(group: 8, letter: "k", effectiveLength: 100, category: .any),
"8k-0.5": .init(group: 8, letter: "k", effectiveLength: 20, category: .any),
"8k-1": .init(group: 8, letter: "k", effectiveLength: 20, category: .any),
// NOTE: 8L and 8M use multipliers, make user supply them.
"8n": .init(group: 8, letter: "n", effectiveLength: 10, category: .any),
"8o-0": .init(group: 8, letter: "o", effectiveLength: 235, category: .any),
"8o-0.25": .init(group: 8, letter: "o", effectiveLength: 90, category: .any),
"8o-0.5": .init(group: 8, letter: "o", effectiveLength: 45, category: .any),
"8p-10-m": .init(group: 8, letter: "p", effectiveLength: 75, category: .any),
"8p-10-r": .init(group: 8, letter: "p", effectiveLength: 60, category: .any),
"8p-12-m": .init(group: 8, letter: "p", effectiveLength: 90, category: .any),
"8p-12-r": .init(group: 8, letter: "p", effectiveLength: 75, category: .any),
"8p-14-m": .init(group: 8, letter: "p", effectiveLength: 90, category: .any),
"8p-14-r": .init(group: 8, letter: "p", effectiveLength: 75, category: .any),
// Group 9
"9a-b": .init(group: 9, letter: "a", effectiveLength: 80, category: .supply),
"9a-m": .init(group: 9, letter: "a", effectiveLength: 5, category: .supply),
"9b-b": .init(group: 9, letter: "b", effectiveLength: 80, category: .supply),
"9b-m": .init(group: 9, letter: "b", effectiveLength: 5, category: .supply),
"9c-b": .init(group: 9, letter: "c", effectiveLength: 80, category: .supply),
"9c-m": .init(group: 9, letter: "c", effectiveLength: 5, category: .supply),
"9d-b": .init(group: 9, letter: "d", effectiveLength: 75, category: .supply),
"9d-m": .init(group: 9, letter: "d", effectiveLength: 5, category: .supply),
"9e-b": .init(group: 9, letter: "e", effectiveLength: 50, category: .supply),
"9e-m": .init(group: 9, letter: "e", effectiveLength: 5, category: .supply),
"9f-b": .init(group: 9, letter: "f", effectiveLength: 45, category: .supply),
"9f-m": .init(group: 9, letter: "f", effectiveLength: 5, category: .supply),
"9g-b": .init(group: 9, letter: "g", effectiveLength: 35, category: .supply),
"9g-m": .init(group: 9, letter: "g", effectiveLength: 5, category: .supply),
"9h-b": .init(group: 9, letter: "h", effectiveLength: 100, category: .supply),
"9h-m": .init(group: 9, letter: "h", effectiveLength: 5, category: .supply),
"9i-b": .init(group: 9, letter: "i", effectiveLength: 85, category: .supply),
"9i-m": .init(group: 9, letter: "i", effectiveLength: 5, category: .supply),
"9j-b": .init(group: 9, letter: "j", effectiveLength: 25, category: .supply),
"9j-m": .init(group: 9, letter: "j", effectiveLength: 5, category: .supply),
"9k": .init(group: 9, letter: "k", effectiveLength: 65, category: .supply),
"9l": .init(group: 9, letter: "l", effectiveLength: 20, category: .supply),
"9m": .init(group: 9, letter: "m", effectiveLength: 20, category: .supply),
"9n": .init(group: 9, letter: "n", effectiveLength: 15, category: .supply),
"9o": .init(group: 9, letter: "o", effectiveLength: 15, category: .supply),
"9p": .init(group: 9, letter: "p", effectiveLength: 70, category: .supply),
"9q": .init(group: 9, letter: "q", effectiveLength: 55, category: .supply),
"9r": .init(group: 9, letter: "r", effectiveLength: 35, category: .supply),
// Group 10
"10a": .init(group: 10, letter: "a", effectiveLength: 75, category: .return),
"10b": .init(group: 10, letter: "b", effectiveLength: 10, category: .return),
"10c": .init(group: 10, letter: "c", effectiveLength: 10, category: .return),
"10d": .init(group: 10, letter: "d", effectiveLength: 25, category: .return),
"10e": .init(group: 10, letter: "e", effectiveLength: 25, category: .return),
"10f": .init(group: 10, letter: "f", effectiveLength: 35, category: .return),
"10g": .init(group: 10, letter: "g", effectiveLength: 75, category: .return),
// NOTE: Group 11, not entered make user enter them manually.
// Group 12
"12a-1:1-2": .init(group: 12, letter: "a", effectiveLength: 20, category: .any),
"12a-2:1-2": .init(group: 12, letter: "a", effectiveLength: 20, category: .any),
"12a-4:1-2": .init(group: 12, letter: "a", effectiveLength: 20, category: .any),
"12a-1:1-4": .init(group: 12, letter: "a", effectiveLength: 40, category: .any),
"12a-2:1-4": .init(group: 12, letter: "a", effectiveLength: 40, category: .any),
"12a-4:1-4": .init(group: 12, letter: "a", effectiveLength: 30, category: .any),
"12b-2": .init(group: 12, letter: "b", effectiveLength: 20, category: .any),
"12b-4": .init(group: 12, letter: "b", effectiveLength: 40, category: .any),
"12c-1:1-2": .init(group: 12, letter: "c", effectiveLength: 20, category: .any),
"12c-2:1-2": .init(group: 12, letter: "c", effectiveLength: 20, category: .any),
"12c-4:1-2": .init(group: 12, letter: "c", effectiveLength: 20, category: .any),
"12c-1:1-4": .init(group: 12, letter: "c", effectiveLength: 40, category: .any),
"12c-2:1-4": .init(group: 12, letter: "c", effectiveLength: 40, category: .any),
"12c-4:1-4": .init(group: 12, letter: "c", effectiveLength: 30, category: .any),
"12d-1:1-2": .init(group: 12, letter: "d", effectiveLength: 20, category: .any),
"12d-2:1-2": .init(group: 12, letter: "d", effectiveLength: 20, category: .any),
"12d-4:1-2": .init(group: 12, letter: "d", effectiveLength: 20, category: .any),
"12d-1:1-4": .init(group: 12, letter: "d", effectiveLength: 40, category: .any),
"12d-2:1-4": .init(group: 12, letter: "d", effectiveLength: 40, category: .any),
"12d-4:1-4": .init(group: 12, letter: "d", effectiveLength: 30, category: .any),
"12e": .init(group: 12, letter: "e", effectiveLength: 25, category: .any),
"12f-1:1-2": .init(group: 12, letter: "f", effectiveLength: 20, category: .any),
"12f-2:1-2": .init(group: 12, letter: "f", effectiveLength: 20, category: .any),
"12f-4:1-2": .init(group: 12, letter: "f", effectiveLength: 15, category: .any),
"12f-1:1-4": .init(group: 12, letter: "f", effectiveLength: 40, category: .any),
"12f-2:1-4": .init(group: 12, letter: "f", effectiveLength: 40, category: .any),
"12f-4:1-4": .init(group: 12, letter: "f", effectiveLength: 30, category: .any),
"12g-2": .init(group: 12, letter: "g", effectiveLength: 20, category: .any),
"12g-4": .init(group: 12, letter: "g", effectiveLength: 40, category: .any),
"12h-1:1-2": .init(group: 12, letter: "h", effectiveLength: 20, category: .any),
"12h-2:1-2": .init(group: 12, letter: "h", effectiveLength: 20, category: .any),
"12h-4:1-2": .init(group: 12, letter: "h", effectiveLength: 15, category: .any),
"12h-1:1-4": .init(group: 12, letter: "h", effectiveLength: 40, category: .any),
"12h-2:1-4": .init(group: 12, letter: "h", effectiveLength: 40, category: .any),
"12h-4:1-4": .init(group: 12, letter: "h", effectiveLength: 25, category: .any),
"12i-1:1-2": .init(group: 12, letter: "i", effectiveLength: 20, category: .any),
"12i-2:1-2": .init(group: 12, letter: "i", effectiveLength: 15, category: .any),
"12i-4:1-2": .init(group: 12, letter: "i", effectiveLength: 10, category: .any),
"12i-1:1-4": .init(group: 12, letter: "i", effectiveLength: 35, category: .any),
"12i-2:1-4": .init(group: 12, letter: "i", effectiveLength: 25, category: .any),
"12i-4:1-4": .init(group: 12, letter: "i", effectiveLength: 10, category: .any),
"12j-1:1-2": .init(group: 12, letter: "j", effectiveLength: 10, category: .any),
"12j-2:1-2": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),
"12j-4:1-2": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),
"12j-1:1-4": .init(group: 12, letter: "j", effectiveLength: 10, category: .any),
"12j-2:1-4": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),
"12j-4:1-4": .init(group: 12, letter: "j", effectiveLength: 5, category: .any),
"12k-2": .init(group: 12, letter: "k", effectiveLength: 25, category: .any),
"12k-4": .init(group: 12, letter: "k", effectiveLength: 25, category: .any),
"12l-1:1-2": .init(group: 12, letter: "l", effectiveLength: 10, category: .any),
"12l-2:1-2": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),
"12l-4:1-2": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),
"12l-1:1-4": .init(group: 12, letter: "l", effectiveLength: 10, category: .any),
"12l-2:1-4": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),
"12l-4:1-4": .init(group: 12, letter: "l", effectiveLength: 5, category: .any),
"12m-1:1-2": .init(group: 12, letter: "m", effectiveLength: 10, category: .any),
"12m-2:1-2": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),
"12m-4:1-2": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),
"12m-1:1-4": .init(group: 12, letter: "m", effectiveLength: 10, category: .any),
"12m-2:1-4": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),
"12m-4:1-4": .init(group: 12, letter: "m", effectiveLength: 5, category: .any),
"12n": .init(group: 12, letter: "n", effectiveLength: 10, category: .any),
"12o-1:1-2": .init(group: 12, letter: "o", effectiveLength: 10, category: .any),
"12o-2:1-2": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),
"12o-4:1-2": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),
"12o-1:1-4": .init(group: 12, letter: "o", effectiveLength: 10, category: .any),
"12o-2:1-4": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),
"12o-4:1-4": .init(group: 12, letter: "o", effectiveLength: 5, category: .any),
"12p-2": .init(group: 12, letter: "p", effectiveLength: 30, category: .any),
"12p-4": .init(group: 12, letter: "p", effectiveLength: 30, category: .any),
"12q-1:1-2": .init(group: 12, letter: "q", effectiveLength: 10, category: .any),
"12q-2:1-2": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),
"12q-4:1-2": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),
"12q-1:1-4": .init(group: 12, letter: "q", effectiveLength: 10, category: .any),
"12q-2:1-4": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),
"12q-4:1-4": .init(group: 12, letter: "q", effectiveLength: 5, category: .any),
"12r-1:1-2": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
"12r-2:1-2": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
"12r-4:1-2": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
"12r-1:1-4": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
"12r-2:1-4": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
"12r-4:1-4": .init(group: 12, letter: "r", effectiveLength: 5, category: .any),
"12s": .init(group: 12, letter: "s", effectiveLength: 30, category: .any),
"12t": .init(group: 12, letter: "t", effectiveLength: 30, category: .any),
"12u": .init(group: 12, letter: "u", effectiveLength: 25, category: .any),
"12v": .init(group: 12, letter: "v", effectiveLength: 30, category: .any),
]
}()