{
  "name": "OMDP39 Base24 public test vectors",
  "version": "1.0.27",
  "alphabet": "0123456789ABCDEFGHJKMNPR",
  "qUsed": false,
  "invalidCharacters": [
    "I",
    "L",
    "O",
    "Q"
  ],
  "notes": [
    "Q is not part of the OMDP39 Base24 alphabet.",
    "I, L and O are excluded to reduce visual ambiguity.",
    "S-Z are not used either."
  ],
  "vectors": [
    {
      "name": "33-word OMDP39 share to Base24 roundtrip",
      "shareWords": "celery wheat keep vague army muffin mean robot thumb fly zebra trophy royal enemy turn benefit decorate aerobic client abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon",
      "base24": "0RE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70",
      "base24Grouped": "0RE7 ENH1 PGH5 NE72 A7N0 F1NP D6F9 KN40 3DHG EJ9K 6274 1ARJ 8KE2 FP2P 8GJ7 1606 M5MN 59C8 N6NA BA1N GK09 G6KB 2B6H DR70",
      "expectedWordCount": 33,
      "expectedBase24Length": 96,
      "mustNotContain": "Q"
    }
  ],
  "targetOfflineArtifactVersion": "1.0.25",
  "metadataReleaseVersion": "1.0.27",
  "positiveCases": [
    {
      "id": "base24-valid-share-roundtrip-001",
      "description": "Canonical Base24 string decodes to a 33-word OMDP39 share and re-encodes identically.",
      "base24": "0RE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70",
      "expectedWordCount": 33,
      "expectedCanonicalBase24": "0RE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70",
      "expectedShareWords": "celery wheat keep vague army muffin mean robot thumb fly zebra trophy royal enemy turn benefit decorate aerobic client abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon"
    }
  ],
  "negativeCases": [
    {
      "id": "base24-invalid-q-001",
      "description": "Q is not part of the OMDP39 Base24 alphabet.",
      "input": "0RE7ENH1PGH5QE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70",
      "expectedErrorClass": "base24.invalidCharacter",
      "invalidCharacter": "Q"
    },
    {
      "id": "base24-invalid-i-001",
      "description": "I is excluded to reduce visual ambiguity.",
      "input": "IRE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70",
      "expectedErrorClass": "base24.invalidCharacter",
      "invalidCharacter": "I"
    },
    {
      "id": "base24-invalid-l-001",
      "description": "L is excluded to reduce visual ambiguity.",
      "input": "LRE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70",
      "expectedErrorClass": "base24.invalidCharacter",
      "invalidCharacter": "L"
    },
    {
      "id": "base24-invalid-o-001",
      "description": "O is excluded to reduce visual ambiguity.",
      "input": "ORE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70",
      "expectedErrorClass": "base24.invalidCharacter",
      "invalidCharacter": "O"
    },
    {
      "id": "base24-wrong-length-short-001",
      "description": "Input is too short after whitespace removal.",
      "input": "0RE7ENH1PGH5NE72A7N0F1NP",
      "expectedErrorClass": "base24.invalidLength",
      "expectedCanonicalLength": 96
    },
    {
      "id": "base24-whitespace-normalized-001",
      "description": "Whitespace between groups may be removed before validation.",
      "input": "0RE7 ENH1 PGH5 NE72 A7N0 F1NP D6F9 KN40 3DHG EJ9K 6274 1ARJ 8KE2 FP2P 8GJ7 1606 M5MN 59C8 N6NA BA1N GK09 G6KB 2B6H DR70",
      "expectedBehavior": "normalizeWhitespaceThenDecode",
      "expectedCanonicalBase24": "0RE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70"
    },
    {
      "id": "base24-lowercase-normalized-001",
      "description": "Lowercase user input may be uppercased before validation.",
      "input": "0re7enh1pgh5ne72a7n0f1npd6f9kn403dhgej9k62741arj8ke2fp2p8gj71606m5mn59c8n6naba1ngk09g6kb2b6hdr70",
      "expectedBehavior": "uppercaseThenDecode",
      "expectedCanonicalBase24": "0RE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR70"
    },
    {
      "id": "base24-noncanonical-padding-001",
      "description": "A final-character mutation changes the encoded integer and must not validate as the original canonical share.",
      "input": "0RE7ENH1PGH5NE72A7N0F1NPD6F9KN403DHGEJ9K62741ARJ8KE2FP2P8GJ71606M5MN59C8N6NABA1NGK09G6KB2B6HDR71",
      "expectedErrorClass": "share.invalidEncodingOrChecksum"
    }
  ]
}