public static function validate($ssn)
    {
        if (!static::$initialized) {
            static::initialize();
            static::$initialized = true;
        }

        if (!is_string($ssn)) {
            return false;
        }
        if (trim($ssn) === '') {
            return false;
        }
        $statePrefixes = static::$statePrefixes;
        $highgroup = static::$highgroup;
        $possibleGroups = static::$possibleGroups;

        // Split up the SSN
        // If not 9 or 11 long, then return false
        $length = strlen($ssn);
        if ($length == 9) {
            $areaNumber = substr($ssn, 0, 3);
            $groupNumber = substr($ssn, 3, 2);
            $lastFour = substr($ssn, 5);
        } elseif ($length == 11) {
            $areaNumber = substr($ssn, 0, 3);
            $groupNumber = substr($ssn, 4, 2);
            $lastFour = substr($ssn, 7);
        } else {
            return false;
        }

        // Strip leading zeros
        $areaNumber = ltrim($areaNumber, 0);
        $groupNumber = ltrim($groupNumber, 0);

        // Check if parts are numeric
        if (!is_numeric($areaNumber) || !is_numeric($groupNumber) || !is_numeric($lastFour)) {
            return false;
        }

        foreach ($statePrefixes as $numbers) {
            // Search for the area number in the state list
            if (in_array($areaNumber, $numbers)) {
                // Make sure the group number is valid
                if (array_search($highgroup[$areaNumber], $possibleGroups) >= array_search($groupNumber, $possibleGroups)) {
                    //return $state => must use "as $state => numbers" in the foreach loop;
                    return true;
                } else {
                    return false;
                }
            }
        }

        return false;
    }