├── Tests └── HyphenationTests │ ├── TextFiles │ ├── TestExceptions.txt │ ├── TestPatterns.txt │ └── Constitution.txt │ ├── TestHelpers │ ├── XCTest+AssertThrows.swift │ └── TestURLs.swift │ ├── ThreadSafetyTests.swift │ ├── PerformanceTests.swift │ └── CorrectnessTests.swift ├── img ├── no-hyphenation.png └── with-hyphenation.png ├── .gitignore ├── .swiftlint.yml ├── .jazzy.yaml ├── Sources └── Hyphenation │ ├── Internal │ ├── Token.swift │ ├── Copyable.swift │ ├── HyphenatorCache.swift │ ├── Exception.swift │ ├── PatternDictionary.swift │ ├── TokenSequence.swift │ ├── Pattern.swift │ └── ExceptionDictionary.swift │ ├── Patterns │ ├── hyph-en-us.hyp.swift │ └── hyph-en-us.pat.swift │ └── API │ ├── PatternParsingError.swift │ └── Hyphenator.swift ├── .github └── workflows │ ├── swiftlint.yml │ ├── jazzy.yml │ └── tests.yml ├── Package.swift ├── Makefile ├── LICENSE.md └── README.md /Tests/HyphenationTests/TextFiles/TestExceptions.txt: -------------------------------------------------------------------------------- 1 | hyph-ena-tion 2 | -------------------------------------------------------------------------------- /img/no-hyphenation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-mueller/Hyphenation/HEAD/img/no-hyphenation.png -------------------------------------------------------------------------------- /img/with-hyphenation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-mueller/Hyphenation/HEAD/img/with-hyphenation.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /.swiftpm 4 | /.docs 5 | /Packages 6 | /*.xcodeproj 7 | benchmark.txt 8 | -------------------------------------------------------------------------------- /Tests/HyphenationTests/TextFiles/TestPatterns.txt: -------------------------------------------------------------------------------- 1 | hy3ph 2 | he2n 3 | hen5at 4 | 1na 5 | n2at 6 | 1tio 7 | 2io 8 | o2n 9 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | opt_in_rules: 2 | - explicit_top_level_acl 3 | 4 | disabled_rules: 5 | - trailing_comma 6 | 7 | excluded: 8 | - .build 9 | - Tests/*/XCTestManifests.swift 10 | - Tests/LinuxMain.swift 11 | -------------------------------------------------------------------------------- /.jazzy.yaml: -------------------------------------------------------------------------------- 1 | output: .docs 2 | swift_build_tool: spm 3 | author: John Mueller 4 | author_url: https://john-mueller.github.io/ 5 | module: Hyphenation 6 | module_version: v0.2.0 7 | copyright: © 2020-2021 John Mueller 8 | github_url: https://github.com/john-mueller/Hyphenation/ 9 | min_acl: public 10 | theme: fullwidth 11 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/Token.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | /// An enum representing whether or not a string is hyphenatable. 6 | internal enum Token { 7 | /// A string that should be hyphenated. 8 | case hyphenatable(String) 9 | /// A string that should not be hyphenated. 10 | case nonHyphenatable(String) 11 | } 12 | -------------------------------------------------------------------------------- /.github/workflows/swiftlint.yml: -------------------------------------------------------------------------------- 1 | name: SwiftLint 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | paths: 8 | - '.github/workflows/swiftlint.yml' 9 | - '.swiftlint.yml' 10 | - '**/*.swift' 11 | jobs: 12 | swiftlint: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: SwiftLint 17 | uses: norio-nomura/action-swiftlint@3.2.1 18 | with: 19 | args: --strict 20 | -------------------------------------------------------------------------------- /.github/workflows/jazzy.yml: -------------------------------------------------------------------------------- 1 | name: Jazzy Docs 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | publish_docs: 9 | name: Publish Jazzy Docs 10 | runs-on: [macos-latest] 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Copy Images 14 | run: mkdir -p .docs/img && cp img/* .docs/img/ 15 | - name: Publish Jazzy Docs 16 | uses: steven0351/publish-jazzy-docs@v1 17 | with: 18 | personal_access_token: ${{ secrets.ACCESS_TOKEN }} 19 | config: .jazzy.yaml 20 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.4 2 | 3 | // Hyphenation 4 | // © 2020 John Mueller 5 | // MIT license, see LICENSE.md for details 6 | 7 | // swiftlint:disable explicit_top_level_acl 8 | 9 | import PackageDescription 10 | 11 | let package = Package( 12 | name: "Hyphenation", 13 | products: [ 14 | .library(name: "Hyphenation", targets: ["Hyphenation"]), 15 | ], 16 | targets: [ 17 | .target(name: "Hyphenation"), 18 | .testTarget( 19 | name: "HyphenationTests", 20 | dependencies: ["Hyphenation"], 21 | resources: [.process("TextFiles")] 22 | ) 23 | ] 24 | ) 25 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | export SHELL := /bin/bash 2 | 3 | .PHONY: test bench test-correctness test-performance test-thread-safety publish 4 | 5 | test: test-correctness test-thread-safety 6 | 7 | bench: test-performance 8 | 9 | test-correctness: 10 | swift test -c debug --filter CorrectnessTests 11 | 12 | test-performance: 13 | echo "" > benchmark.txt 14 | swift test -c release --filter PerformanceTests > >(tee -a benchmark.txt) 2> >(tee -a benchmark.txt >&2) 15 | grep -oE 'test.+?average: [0-9]+\.[0-9]+' benchmark.txt | sed -E "s/]?'.+av/ av/g" 16 | 17 | test-thread-safety: 18 | swift test -c debug --filter ThreadSafetyTests --sanitize=thread 19 | 20 | publish: test 21 | rm -rf .docs 22 | jazzy 23 | cp img/* .docs/img/ 24 | swiftlint --strict 25 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/Copyable.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | /// A type that can create a copy of an existing instance. 6 | internal protocol Copyable { 7 | /// Creates a new instance of a `Copyable` class, copied from an existing instance. 8 | /// 9 | /// - Parameters: 10 | /// - copy: The instance which will be copied. 11 | init(copy: Self) 12 | /// Returns a new instance of a `Copyable` class, copied from an existing instance. 13 | func copy() -> Self 14 | } 15 | 16 | extension Copyable { 17 | /// Returns a new instance of a `Copyable` class by passing an existing instance to `init(copy:)`. 18 | func copy() -> Self { 19 | Self(copy: self) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Patterns/hyph-en-us.hyp.swift: -------------------------------------------------------------------------------- 1 | // © 1990, 2004, 2005 Gerard D.C. Kuiken 2 | // Copying and distribution of this file, with or without modification, 3 | // are permitted in any medium without royalty provided the copyright 4 | // notice and this notice are preserved. 5 | // 6 | // https://github.com/hyphenation/tex-hyphen/blob/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.hyp.txt 7 | 8 | extension String { 9 | /// A string containing the default English exceptions. 10 | internal static let defaultExceptions = """ 11 | as-so-ciate 12 | as-so-ciates 13 | dec-li-na-tion 14 | oblig-a-tory 15 | phil-an-thropic 16 | present 17 | presents 18 | project 19 | projects 20 | reci-procity 21 | re-cog-ni-zance 22 | ref-or-ma-tion 23 | ret-ri-bu-tion 24 | ta-ble 25 | """ 26 | } 27 | -------------------------------------------------------------------------------- /Tests/HyphenationTests/TestHelpers/XCTest+AssertThrows.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2019 John Sundell, © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | // 5 | // This extension is based on https://www.swiftbysundell.com/articles/testing-error-code-paths-in-swift/ 6 | 7 | import XCTest 8 | 9 | extension XCTestCase { 10 | func assert( 11 | _ expression: @autoclosure () throws -> T, 12 | throws error: E, 13 | in file: StaticString = #filePath, 14 | line: UInt = #line 15 | ) { 16 | var thrownError: Error? 17 | 18 | XCTAssertThrowsError(try expression(), file: file, line: line) { 19 | thrownError = $0 20 | } 21 | 22 | XCTAssertTrue(thrownError is E, "Unexpected error type: \(type(of: thrownError))", file: file, line: line) 23 | 24 | XCTAssertEqual(thrownError as? E, error, file: file, line: line) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/Hyphenation/API/PatternParsingError.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | /// An error that can be thrown when constructing a `Pattern` instance. 6 | /// 7 | /// A valid pattern string includes at least one alphabetic character, at least one digit, 8 | /// and an optional period at the beginning or the end (but not both). 9 | /// No two consecutive characters may be digits, and the string may not contain any other type of character. 10 | public enum PatternParsingError: Error, Equatable { 11 | /// A pattern string which did not contain at least one letter and one digit from between 1 and 9, inclusive. 12 | case deficientPattern(String) 13 | /// A pattern string which contained a character that was not alphabetic, a digit 1-9, or a period. 14 | case invalidCharacter(String) 15 | /// A pattern string which contained multiple consecutive digits. 16 | case consecutiveDigits(String) 17 | } 18 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | © 2020 John Mueller 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | branches: 8 | - main 9 | jobs: 10 | macOS: 11 | name: macOS 12 | runs-on: macos-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Version 16 | run: swift --version 17 | - name: Build 18 | run: swift build 19 | - name: Test 20 | run: make test 21 | linux: 22 | name: Linux 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v2 26 | - name: Setup 27 | run: | 28 | export API_URL="https://swiftenv-api.fuller.li/versions?snapshot=false&platform=ubuntu20.04" 29 | export SWIFT_VERSION="$(curl -H 'Accept: text/plain' "$API_URL" | tail -n1)" 30 | 31 | git clone --depth 1 https://github.com/kylef/swiftenv.git ~/.swiftenv 32 | export SWIFTENV_ROOT="$HOME/.swiftenv" 33 | export PATH="$SWIFTENV_ROOT/bin:$SWIFTENV_ROOT/shims:$PATH" 34 | swiftenv install -s 35 | 36 | echo "SWIFT_VERSION=$SWIFT_VERSION" >> $GITHUB_ENV 37 | echo "$SWIFTENV_ROOT/shims" >> $GITHUB_PATH 38 | - name: Version 39 | run: | 40 | swift --version 41 | - name: Build 42 | run: | 43 | swift build 44 | - name: Test 45 | run: | 46 | make test 47 | -------------------------------------------------------------------------------- /Tests/HyphenationTests/TestHelpers/TestURLs.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | // swiftlint:disable force_try 6 | 7 | import Foundation 8 | 9 | internal extension URL { 10 | private static func resource(_ name: String) -> URL { 11 | URL(fileURLWithPath: Bundle.module.path(forResource: name, ofType: nil)!) 12 | } 13 | 14 | static var testPatterns = resource("TestPatterns.txt") 15 | static var testExceptions = resource("TestExceptions.txt") 16 | 17 | fileprivate static let constitution = resource("Constitution.txt") 18 | fileprivate static let prideAndPrejudice = resource("PrideAndPrejudice.txt") 19 | fileprivate static let greatExpectations = resource("GreatExpectations.txt") 20 | fileprivate static let warAndPeace = resource("WarAndPeace.txt") 21 | fileprivate static let kingJamesBible = resource("KingJamesBible.txt") 22 | fileprivate static let clarissa = resource("Clarissa.txt") 23 | } 24 | 25 | internal extension String { 26 | static let constitution = try! String(contentsOf: .constitution) 27 | static let prideAndPrejudice = try! String(contentsOf: .prideAndPrejudice) 28 | static let greatExpectations = try! String(contentsOf: .greatExpectations) 29 | static let warAndPeace = try! String(contentsOf: .warAndPeace) 30 | static let kingJamesBible = try! String(contentsOf: .kingJamesBible) 31 | static let clarissa = try! String(contentsOf: .clarissa) 32 | } 33 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/HyphenatorCache.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | import Foundation 6 | 7 | /// An object that provides thread-safe caching for hyphenated words. 8 | /// 9 | /// The backing dictionary is accessed solely through thread-safe subscript, to prevent data races. 10 | /// 11 | /// **Example** 12 | /// ``` 13 | /// let cache = HyphenatorCache() 14 | /// cache["hyphen"] = "hy-phen" 15 | /// print(cache["hyphen"]) 16 | /// // hy-phen 17 | /// ``` 18 | internal final class HyphenatorCache { 19 | // MARK: Properties 20 | 21 | /// A dictionary mapping strings to their hyphenated forms. 22 | private var cache = [String: String]() 23 | /// A lock to prevent simultaneously reading from and writing to cache. 24 | private let cacheLock = NSLock() 25 | 26 | // MARK: Subscripts 27 | 28 | /// Permits thread-safe access to `cache` dictionary. 29 | subscript(word: String) -> String? { 30 | get { 31 | cacheLock.lock() 32 | defer { cacheLock.unlock() } 33 | return cache[word] 34 | } 35 | set(newValue) { 36 | cacheLock.lock() 37 | cache[word] = newValue 38 | cacheLock.unlock() 39 | } 40 | } 41 | } 42 | 43 | // MARK: Methods 44 | 45 | extension HyphenatorCache { 46 | /// Empties the cache. 47 | func clearCache() { 48 | cacheLock.lock() 49 | cache = [:] 50 | cacheLock.unlock() 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/Exception.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | import Foundation 6 | 7 | /// A type representing how a particular string should be hyphenated. 8 | /// 9 | /// An exception overrides the hyphenation a word would normally receive based on patterns. 10 | internal struct Exception { 11 | // MARK: Properties 12 | 13 | /// The exception's textual form, omitting the hyphens. 14 | let identifier: Identifier 15 | /// An array of locations at which the string should be split. 16 | let locations: [Location] 17 | 18 | // MARK: Initializers 19 | 20 | /// Creates an `Exception` instance from a `String`. 21 | /// 22 | /// - Parameters: 23 | /// - hyphenation: The word to be treated as an exception, with hyphens ("-") inserted 24 | /// at the desired hyphenation points. 25 | init(from hyphenation: String) { 26 | let identifier = hyphenation 27 | .lowercased() 28 | .replacingOccurrences(of: "-", with: "") 29 | 30 | var trimmedString = hyphenation 31 | 32 | var locations = [Location]() 33 | 34 | while let index = trimmedString.firstIndex(of: "-") { 35 | locations.append(index) 36 | trimmedString.remove(at: index) 37 | } 38 | 39 | self.identifier = identifier 40 | self.locations = locations 41 | } 42 | } 43 | 44 | // MARK: Typealiases 45 | 46 | extension Exception { 47 | /// A string that represents an exception's textual form, omitting the hyphens. 48 | typealias Identifier = String 49 | /// An index that represents a split location within an exception string. 50 | typealias Location = String.Index 51 | } 52 | -------------------------------------------------------------------------------- /Tests/HyphenationTests/ThreadSafetyTests.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | // swiftlint:disable explicit_top_level_acl 6 | 7 | import Hyphenation 8 | import XCTest 9 | 10 | /// These tests should be run with Debug configuration and thread santizer 11 | /// (e.g. `swift test -c debug --sanitize=thread`) 12 | final class ThreadSafetyTests: XCTestCase { 13 | func testHyphenatorCacheThreadSafety() throws { 14 | let hyphenator = Hyphenator() 15 | let queue = DispatchQueue( 16 | label: "hyphenation-cache", 17 | qos: .userInitiated, 18 | attributes: [.concurrent], 19 | target: .global() 20 | ) 21 | let group = DispatchGroup() 22 | for _ in 0 ... 100 { 23 | group.enter() 24 | queue.async { 25 | _ = hyphenator.hyphenate(text: "modularity") 26 | hyphenator.clearCache() 27 | group.leave() 28 | } 29 | } 30 | group.wait() 31 | } 32 | 33 | func testCustomExceptionsThreadSafety() throws { 34 | let hyphenator = Hyphenator() 35 | let queue = DispatchQueue( 36 | label: "hyphenation-exceptions", 37 | qos: .userInitiated, 38 | attributes: [.concurrent], 39 | target: .global() 40 | ) 41 | let group = DispatchGroup() 42 | for _ in 0 ... 100 { 43 | group.enter() 44 | queue.async { 45 | hyphenator.addCustomExceptions(["modul-arity", "pro-ject"]) 46 | hyphenator.removeCustomExceptions(["project"]) 47 | _ = hyphenator.hyphenate(text: "modularity") 48 | hyphenator.removeAllCustomExceptions() 49 | _ = hyphenator.copy() 50 | group.leave() 51 | } 52 | } 53 | group.wait() 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/PatternDictionary.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | import Foundation 6 | 7 | /// An object representing the contents of a set of `Pattern`s. 8 | /// 9 | /// Rather than storing each pattern as a separate `Pattern` instance, a `PatternDictionary` 10 | /// stores the identifier of the pattern, and its collection of hyphenation priorities 11 | /// and their associated offsets in a format which allows quick retrieval and combination. 12 | internal final class PatternDictionary: Copyable { 13 | // MARK: Properties 14 | 15 | /// The backing storage of the pattern contents. 16 | private var dictionary: [Pattern.Identifier: [Pattern.Offset: Pattern.Priority]] 17 | /// The length of the longest identifier in the dictionary. 18 | private(set) var maxIdentifierLength: Int 19 | 20 | // MARK: Initializers 21 | 22 | /// Creates a `PatternDictionary` instance using the default English patterns. 23 | init() { 24 | dictionary = PatternDictionary.defaultDictionary.dictionary 25 | maxIdentifierLength = PatternDictionary.defaultMaxLength 26 | } 27 | 28 | /// Creates a `PatternDictionary` instance using the patterns contained in a string. 29 | /// 30 | /// The patterns can be separated by newlines and/or whitespace. 31 | /// See `Pattern.init(from:)` documentation for proper pattern syntax. 32 | /// 33 | /// - Parameters: 34 | /// - string: A string containing patterns. 35 | /// 36 | /// - Throws: An error of type `PatternParsingError`. 37 | init(string: String) throws { 38 | dictionary = [:] 39 | maxIdentifierLength = 0 40 | 41 | try string.components(separatedBy: .newlines).forEach { line in 42 | guard !line.hasPrefix("//") else { return } 43 | try line.components(separatedBy: .whitespaces).forEach { substring in 44 | guard !substring.isEmpty else { return } 45 | let pattern = try Pattern(from: String(substring)) 46 | dictionary[pattern.identifier] = pattern.priorities 47 | maxIdentifierLength = max(maxIdentifierLength, pattern.identifier.count) 48 | } 49 | } 50 | } 51 | 52 | /// Creates a `PatternDictionary` instance using the patterns contained in a file. 53 | /// 54 | /// The patterns can be separated by newlines and/or whitespace. 55 | /// See `Pattern.init(from:)` documentation for proper pattern syntax. 56 | /// 57 | /// - Parameters: 58 | /// - fileURL: A URL referring to a file containing patterns. 59 | /// 60 | /// - Throws: An error of type `PatternParsingError`, or any error thrown by `String(contentsOf:encoding:)`. 61 | convenience init(fileURL: URL) throws { 62 | try self.init(string: try String(contentsOf: fileURL, encoding: .utf8)) 63 | } 64 | 65 | /// Creates a `PatternDictionary` instance with a copy of the data in an existing instance. 66 | /// 67 | /// - Parameters: 68 | /// - copy: The `PatternDictionary` which will be copied. 69 | init(copy: PatternDictionary) { 70 | dictionary = copy.dictionary 71 | maxIdentifierLength = copy.maxIdentifierLength 72 | } 73 | 74 | // MARK: Subscripts 75 | 76 | /// Returns the dictionary mapping hyphenation offsets to priorities for a given pattern identifier, 77 | /// if it exists. Returns `nil` otherwise. 78 | subscript(identifier: Pattern.Identifier) -> [Pattern.Offset: Pattern.Priority]? { 79 | dictionary[identifier] 80 | } 81 | } 82 | 83 | // MARK: Default patterns 84 | 85 | extension PatternDictionary { 86 | /// A `PatternDictionary` containing the default English patterns. 87 | private static var defaultDictionary = try! PatternDictionary(string: .defaultPatterns) 88 | // swiftlint:disable:previous force_try 89 | 90 | /// The length of the longest identifier in the default dictionary. 91 | private static var defaultMaxLength = defaultDictionary.dictionary.keys.reduce(0) { max($0, $1.count) } 92 | } 93 | -------------------------------------------------------------------------------- /Tests/HyphenationTests/PerformanceTests.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | // swiftlint:disable explicit_top_level_acl 6 | 7 | import Hyphenation 8 | import XCTest 9 | 10 | /// These tests should be run with Release configuration 11 | /// (e.g. `swift test -c release`) 12 | final class PerformanceTests: XCTestCase { 13 | let testString: String = .prideAndPrejudice 14 | 15 | func testSpeed1Constitution() throws { 16 | let hyphenator = Hyphenator() 17 | let string: String = .constitution 18 | _ = hyphenator.hyphenate(text: string) 19 | measure { 20 | _ = hyphenator.hyphenate(text: string) 21 | } 22 | } 23 | 24 | func testSpeed2PrideAndPrejudice() throws { 25 | let hyphenator = Hyphenator() 26 | let string: String = .prideAndPrejudice 27 | _ = hyphenator.hyphenate(text: string) 28 | measure { 29 | _ = hyphenator.hyphenate(text: string) 30 | } 31 | } 32 | 33 | func testSpeed3GreatExpectations() throws { 34 | let hyphenator = Hyphenator() 35 | let string: String = .greatExpectations 36 | _ = hyphenator.hyphenate(text: string) 37 | measure { 38 | _ = hyphenator.hyphenate(text: string) 39 | } 40 | } 41 | 42 | func testSpeed4WarAndPeace() throws { 43 | let hyphenator = Hyphenator() 44 | let string: String = .warAndPeace 45 | _ = hyphenator.hyphenate(text: string) 46 | measure { 47 | _ = hyphenator.hyphenate(text: string) 48 | } 49 | } 50 | 51 | func testSpeed5KingJamesBible() throws { 52 | let hyphenator = Hyphenator() 53 | let string: String = .kingJamesBible 54 | _ = hyphenator.hyphenate(text: string) 55 | measure { 56 | _ = hyphenator.hyphenate(text: string) 57 | } 58 | } 59 | 60 | func testSpeed6Clarissa() throws { 61 | let hyphenator = Hyphenator() 62 | let string: String = .clarissa 63 | _ = hyphenator.hyphenate(text: string) 64 | measure { 65 | _ = hyphenator.hyphenate(text: string) 66 | } 67 | } 68 | 69 | func testSequentialPerformance() throws { 70 | let hyphenator = Hyphenator() 71 | let group = DispatchGroup() 72 | measure { 73 | hyphenator.clearCache() 74 | group.enter() 75 | DispatchQueue.global(qos: .userInitiated).async { 76 | _ = hyphenator.hyphenate(text: self.testString) 77 | _ = hyphenator.hyphenate(text: self.testString) 78 | group.leave() 79 | } 80 | group.wait() 81 | } 82 | } 83 | 84 | func testConcurrentPerformance() throws { 85 | let hyphenator = Hyphenator() 86 | let group = DispatchGroup() 87 | measure { 88 | hyphenator.clearCache() 89 | group.enter() 90 | DispatchQueue.global(qos: .userInitiated).async { 91 | _ = hyphenator.hyphenate(text: self.testString) 92 | group.leave() 93 | } 94 | group.enter() 95 | DispatchQueue.global(qos: .userInitiated).async { 96 | _ = hyphenator.hyphenate(text: self.testString) 97 | group.leave() 98 | } 99 | group.wait() 100 | } 101 | } 102 | 103 | func testIndependentPerformance() throws { 104 | let hyphenator1 = Hyphenator() 105 | let hyphenator2 = Hyphenator() 106 | let group = DispatchGroup() 107 | measure { 108 | hyphenator1.clearCache() 109 | hyphenator2.clearCache() 110 | group.enter() 111 | DispatchQueue.global(qos: .userInitiated).async { 112 | _ = hyphenator1.hyphenate(text: self.testString) 113 | group.leave() 114 | } 115 | group.enter() 116 | DispatchQueue.global(qos: .userInitiated).async { 117 | _ = hyphenator2.hyphenate(text: self.testString) 118 | group.leave() 119 | } 120 | group.wait() 121 | } 122 | } 123 | 124 | func testLongWordPerformance() throws { 125 | let hyphenator = Hyphenator() 126 | let word = "pneumonoultramicroscopicsilicovolcanoconiosis" 127 | let text = String(repeating: word, count: 10) 128 | measure { 129 | hyphenator.clearCache() 130 | _ = hyphenator.hyphenate(text: text) 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/TokenSequence.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | /// A type representing a sequence of Tokens, each of which is either a hyphenatable or non-hyphenatable string. 6 | /// 7 | /// Any substring consisting solely of letters will be returnes as a hyphenatable token. 8 | /// Any other substring is returned as a non-hyphenatable token. 9 | /// 10 | /// **Example** 11 | /// ``` 12 | /// var tokens = TokenSequence(from: "letters 123 mixed123word") 13 | /// while let token = tokens.next() { 14 | /// print(token) 15 | /// } 16 | /// // hyphenatable("letters") 17 | /// // nonHyphenatable(" 123 ") 18 | /// // hyphenatable("mixed") 19 | /// // nonHyphenatable("123") 20 | /// // hyphenatable("word") 21 | /// ``` 22 | /// 23 | /// The one exception is that pre-hyphenated words are also returned as non-hyphenatable tokens. 24 | /// When a single hyphen or separator character separates two normally hyphenatable tokens, 25 | /// they are returned, along with the separator, as a non-hyphenatable token. 26 | /// 27 | /// **Example** 28 | /// ``` 29 | /// var tokens = TokenSequence(from: "super-fluous") 30 | /// while let token = tokens.next() { 31 | /// print(token) 32 | /// } 33 | /// // nonHyphenatable("super-fluous") 34 | /// var tokens = TokenSequence(from: "super fluous") 35 | /// while let token = tokens.next() { 36 | /// print(token) 37 | /// } 38 | /// // hyphenatable("super") 39 | /// // nonHyphenatable(" ") 40 | /// // hyphenatable("fluous") 41 | /// ``` 42 | /// 43 | /// - Attention: The sequence can only be iterated over once—create a new instance if additional traversal is required. 44 | /// 45 | /// - Complexity: Traversing the sequence is an O(n) operation. 46 | internal struct TokenSequence: Sequence, IteratorProtocol { 47 | // MARK: Properties 48 | 49 | /// The base `String` or `Substring` to be split into `Token`s. 50 | private let text: T 51 | /// The current index that has been reached in `text`. 52 | private var index: String.Index 53 | /// A separator character which counts as pre-hyphenation. 54 | private let separator: Character 55 | 56 | // MARK: Initializers 57 | 58 | /// Creates a `TokenSequence` instance. 59 | /// 60 | /// - Parameters: 61 | /// - text: The base `String` or `Substring` to be split into `Token`s. 62 | /// - separator: A separator character which counts as pre-hyphenation. 63 | init(from text: T, separator: Character = "-") { 64 | self.text = text 65 | self.index = text.startIndex 66 | self.separator = separator 67 | } 68 | } 69 | 70 | // MARK: Methods 71 | 72 | extension TokenSequence { 73 | /// Returns the next `Token`, if available, or `nil` otherwise. 74 | mutating func next() -> Token? { 75 | guard index != text.endIndex else { 76 | return nil 77 | } 78 | 79 | let startIndex = index 80 | let currentTypeIsLetter = text[index].isLetter 81 | var containsSeparator = false 82 | 83 | let isSameType: (Character) -> Bool = { character in 84 | character.isLetter == currentTypeIsLetter 85 | } 86 | 87 | loop: while index != text.endIndex { 88 | switch text[index] { 89 | case "-", separator: 90 | defer { advanceIndex() } 91 | if currentTypeIsLetter, nextCharacterIsLetter { 92 | containsSeparator = true 93 | } else { 94 | break loop 95 | } 96 | case isSameType: 97 | advanceIndex() 98 | default: 99 | break loop 100 | } 101 | } 102 | 103 | if currentTypeIsLetter, !containsSeparator { 104 | return .hyphenatable(String(text[startIndex ..< index])) 105 | } 106 | 107 | return .nonHyphenatable(String(text[startIndex ..< index])) 108 | } 109 | } 110 | 111 | // MARK: Private methods 112 | 113 | extension TokenSequence { 114 | /// Advances the current index by one character. 115 | private mutating func advanceIndex() { 116 | index = text.index(after: index) 117 | } 118 | 119 | /// Safely checks if the next character is a letter. 120 | private var nextCharacterIsLetter: Bool { 121 | let nextIndex = text.index(after: index) 122 | guard nextIndex < text.endIndex else { return false } 123 | return text[nextIndex].isLetter 124 | } 125 | } 126 | 127 | // MARK: Pattern matching 128 | 129 | /// Matches a character using a closure which transforms the character into a boolean. 130 | private func ~= (lhs: (Character) -> Bool, rhs: Character) -> Bool { 131 | lhs(rhs) 132 | } 133 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/Pattern.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | /// A type representing the separation priority at each offset in a given word fragment. 6 | /// 7 | /// The text form of a pattern is a series of letters and numbers, possibly prefixed or suffixed by a period. 8 | /// 9 | /// Each odd number represents the priority that a word containing this pattern should be split at that location. 10 | /// Each even number represents the priority that the word should *not* be split at that location. 11 | /// When two patterns in a word overlap, the higher priority at each offset is used. 12 | /// 13 | /// A period at the start or end of the pattern indicates that it is only matched at the start or end of a word, 14 | /// respectively. 15 | /// 16 | /// - Important: Offsets are measured from the first letter, not the front of the string 17 | /// (i.e. a leading period does not affect the offsets). 18 | /// 19 | /// The pattern ".eq5ui5t" would have an `identifier` equal to ".equit", and a `dictionary` equal to [2: 5, 4: 5]. 20 | internal struct Pattern { 21 | // MARK: Properties 22 | 23 | /// The pattern's textual form, omitting the priority numbers. 24 | let identifier: Identifier 25 | /// A mapping from each offset to the priority of separation at that offset. 26 | let priorities: [Offset: Priority] 27 | 28 | // MARK: Initializers 29 | 30 | /// Creates a `Pattern` instance if input string is valid; throws an error otherwise. 31 | /// 32 | /// A valid pattern string includes at least one alphabetic character, at least one digit, 33 | /// and an optional period at the beginning or the end (but not both). 34 | /// No two consecutive characters may be digits, and the string may not contain any other type of character. 35 | /// 36 | /// - Parameters: 37 | /// - pattern: The textual representation of a pattern. 38 | /// 39 | /// - Throws: An error of type `PatternParsingError`. 40 | init(from pattern: String) throws { 41 | if pattern.filter({ $0.isLetter }).isEmpty || pattern.filter({ $0.isDigit }).isEmpty { 42 | throw PatternParsingError.deficientPattern(pattern) 43 | } 44 | 45 | guard pattern.filter({ !$0.isValid }).isEmpty else { 46 | throw PatternParsingError.invalidCharacter(pattern) 47 | } 48 | 49 | let identifier = pattern 50 | .lowercased() 51 | .filter { !$0.isDigit } 52 | 53 | var trimmedString = pattern 54 | .trimmingCharacters(in: .punctuationCharacters) 55 | 56 | var priorities = [Offset: Priority]() 57 | 58 | while let index = trimmedString.firstIndex(where: { $0.isNumber }) { 59 | let nextIndex = trimmedString.index(after: index) 60 | if nextIndex < trimmedString.endIndex, trimmedString[nextIndex].isDigit { 61 | throw PatternParsingError.consecutiveDigits(pattern) 62 | } 63 | 64 | let offset = trimmedString.distance(from: trimmedString.startIndex, to: index) 65 | if let priority = Int(String(trimmedString[index])) { 66 | priorities[offset] = priority 67 | } 68 | trimmedString.remove(at: index) 69 | } 70 | 71 | self.identifier = identifier 72 | self.priorities = priorities 73 | } 74 | } 75 | 76 | // MARK: Validation extensions 77 | 78 | extension Pattern { 79 | /// A set containing the valid digits for a pattern string. 80 | fileprivate static let digitSet = Set("123456789") 81 | } 82 | 83 | extension Character { 84 | /// A Boolean value indicating whether this character is in `Pattern.digitSet`. 85 | fileprivate var isDigit: Bool { 86 | Pattern.digitSet.contains(self) 87 | } 88 | 89 | /// A Boolean value indicating whether this character is valid in a pattern string. 90 | /// 91 | /// - See Also: `Pattern.init(from:)` 92 | fileprivate var isValid: Bool { 93 | isLetter || isDigit || self == "." 94 | } 95 | } 96 | 97 | // MARK: Typealiases 98 | 99 | extension Pattern { 100 | /// A string that represents a pattern's textual form, omitting the priority numbers. 101 | typealias Identifier = String 102 | /// An index that represents a potential split location within a pattern string. 103 | typealias Location = String.Index 104 | /// An integer that represents the number of indices from the beginning of the pattern string 105 | /// to the index of a potential split location. 106 | typealias Offset = String.IndexDistance 107 | /// An integer that represents the priority with which a string should be split or not split 108 | /// at a given index. 109 | typealias Priority = Int 110 | } 111 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Internal/ExceptionDictionary.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | import Foundation 6 | 7 | /// An object representing the contents of a set of `Exception`s. 8 | /// 9 | /// Internally, the exceptions are stored in two separate categories—default exceptions provided 10 | /// at intantiation, and those added subsequently through the `addCustomException(_:)` method. 11 | /// Custom exceptions take precedence over default exceptions. 12 | internal final class ExceptionDictionary: Copyable { 13 | // MARK: Properties 14 | 15 | /// The backing storage of default exception contents. 16 | private var defaultExceptions: [Exception.Identifier: [Exception.Location]] 17 | /// The backing storage of user-created exception contents. 18 | private var customExceptions: [Exception.Identifier: [Exception.Location]] 19 | /// A lock to prevent simultaneously reading from and writing to custom exceptions dictionary. 20 | private let customExceptionsLock = NSLock() 21 | 22 | // MARK: Initializers 23 | 24 | /// Creates an `ExceptionDictionary` instance using the default English exceptions. 25 | init() { 26 | defaultExceptions = ExceptionDictionary.defaultDictionary.defaultExceptions 27 | customExceptions = [:] 28 | } 29 | 30 | /// Creates an `ExceptionDictionary` instance using the exceptions contained in a string. 31 | /// 32 | /// The exceptions can be separated by newlines and/or whitespace. 33 | /// See `Exception.init(from:)` documentation for proper exception syntax. 34 | /// 35 | /// - Parameters: 36 | /// - string: A string containing exceptions. 37 | init(string: String) { 38 | defaultExceptions = [:] 39 | customExceptions = [:] 40 | 41 | string.components(separatedBy: .newlines).forEach { line in 42 | guard !line.hasPrefix("//") else { return } 43 | line.components(separatedBy: .whitespaces) 44 | .forEach { substring in 45 | let exception = Exception(from: String(substring)) 46 | defaultExceptions[exception.identifier] = exception.locations 47 | } 48 | } 49 | } 50 | 51 | /// Creates an `ExceptionDictionary` instance using the exceptions contained in a file. 52 | /// 53 | /// The exceptions can be separated by newlines and/or whitespace. 54 | /// See `Exception.init(from:)` documentation for proper exception syntax. 55 | /// 56 | /// - Parameters: 57 | /// - string: A URL referring to a file containing exceptions. 58 | /// 59 | /// - Throws: Any error thrown by `String(contentsOf:encoding:)`. 60 | convenience init(fileURL: URL) throws { 61 | self.init(string: try String(contentsOf: fileURL, encoding: .utf8)) 62 | } 63 | 64 | /// Creates an `ExceptionDictionary` instance with a copy of the data in an existing instance. 65 | /// 66 | /// - Parameters: 67 | /// - copy: The `ExceptionDictionary` on which to perform a deep copy. 68 | init(copy: ExceptionDictionary) { 69 | defaultExceptions = copy.defaultExceptions 70 | copy.customExceptionsLock.lock() 71 | customExceptions = copy.customExceptions 72 | copy.customExceptionsLock.unlock() 73 | } 74 | 75 | // MARK: Subscripts 76 | 77 | /// Returns the exception hyphenation for a given word, if it exists. Returns `nil` otherwise. 78 | subscript(word: String) -> String? { 79 | let lowercasedWord = word.lowercased() 80 | 81 | customExceptionsLock.lock() 82 | guard let locations = customExceptions[lowercasedWord] ?? defaultExceptions[lowercasedWord] else { 83 | customExceptionsLock.unlock() 84 | return nil 85 | } 86 | customExceptionsLock.unlock() 87 | 88 | var hyphenatedWord = word 89 | 90 | for location in locations.sorted().reversed() { 91 | hyphenatedWord.insert("-", at: location) 92 | } 93 | 94 | return hyphenatedWord 95 | } 96 | } 97 | 98 | // MARK: Methods 99 | 100 | extension ExceptionDictionary { 101 | /// Adds custom exceptions to the dictionary. 102 | /// 103 | /// - Parameters: 104 | /// - hyphenations: A collection of words to be treated as exceptions, with hyphens ("-") inserted 105 | /// at the desired hyphenation points. 106 | func addCustomExceptions(_ hyphenations: T) where T.Element == String { 107 | customExceptionsLock.lock() 108 | hyphenations.map(Exception.init).forEach { exception in 109 | customExceptions[exception.identifier] = exception.locations 110 | } 111 | customExceptionsLock.unlock() 112 | } 113 | 114 | /// Removes custom exceptions from the dictionary. 115 | /// 116 | /// - Parameters: 117 | /// - exceptions: A collection of words that should not have custom hyphenation exceptions. 118 | func removeCustomExceptions(_ exceptions: T) where T.Element == String { 119 | customExceptionsLock.lock() 120 | exceptions.map(Exception.init).forEach { exception in 121 | customExceptions[exception.identifier] = nil 122 | } 123 | customExceptionsLock.unlock() 124 | } 125 | 126 | /// Removes all custom exceptions from the dictionary. 127 | func removeAllCustomExceptions() { 128 | customExceptionsLock.lock() 129 | customExceptions = [:] 130 | customExceptionsLock.unlock() 131 | } 132 | } 133 | 134 | // MARK: Default exceptions 135 | 136 | extension ExceptionDictionary { 137 | /// An `ExceptionDictionary` containing the default English exceptions. 138 | private static var defaultDictionary = ExceptionDictionary(string: .defaultExceptions) 139 | } 140 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hyphenation 2 | 3 | Efficient and flexible automatic hyphenation using the Knuth-Liang algorithm. 4 | 5 | See full documentation at [https://john-mueller.github.io/Hyphenation](https://john-mueller.github.io/Hyphenation). 6 | 7 | ## Table of Contents 8 | 9 | - [Introduction](#introduction) 10 | - [Installation](#installation) 11 | - [Usage](#usage) 12 | - [Exceptions](#exceptions) 13 | - [Custom Patterns](#custom-patterns) 14 | - [Thread Safety](#thread-safety) 15 | - [HTML/Code](#htmlcode) 16 | - [Contributing](#contributing) 17 | - [License](#license) 18 | - [Credits](#credits) 19 | 20 | ## Introduction 21 | 22 | The primary purpose of this library is to automatically insert soft hyphens into text to improve its layout flow. Consider the following example from [Butterick's Practical Typography](https://practicaltypography.com/justified-text.html): 23 | 24 | ![Text without hyphenation](img/no-hyphenation.png) 25 | 26 | As line length decreases, justified text often displays large gaps between words, while left- or right-aligned text displays increasingly uneven margins. By inserting soft hyphens into words (which are only displayed when they fall at the end of a line), the text can be split more naturally across multiple lines, improving the text's aesthetic appearance: 27 | 28 | ![Text with hyphenation](img/with-hyphenation.png) 29 | 30 | This proves useful in HTML (since the `hyphens` CSS property is [not universally supported](https://caniuse.com/#search=hyphen)), and will even work in UIKit and SwiftUI text components. 31 | 32 | ## Installation 33 | 34 | Hyphenation is installed via the [Swift Package Manager](https://swift.org/package-manager/). First, add it to your dependencies: 35 | 36 | ```swift 37 | let package = Package( 38 | ... 39 | dependencies: [ 40 | .package(url: "https://github.com/john-mueller/Hyphenation.git", from: "0.2.0") 41 | ], 42 | ... 43 | ) 44 | ``` 45 | 46 | Then import the Hyphenation module wherever it is needed: 47 | 48 | ```swift 49 | import Hyphenation 50 | ``` 51 | 52 | ## Usage 53 | 54 | Basic usage just requires creating a `Hyphenator` instance and calling its `hyphenate(text:)` method: 55 | 56 | ```swift 57 | let hyphenator = Hyphenator() 58 | hyphenator.separator = "-" 59 | 60 | let text = "This algorithm identifies likely hyphenation points." 61 | print(hyphenator.hyphenate(text: text)) 62 | // This al-go-rithm iden-ti-fies like-ly hy-phen-ation points. 63 | ``` 64 | 65 | You can also remove the `separator` character from a string by calling `unhyphenate(text:)`: 66 | 67 | ```swift 68 | let hyphenatedText = "This al-go-rithm iden-ti-fies like-ly hy-phen-ation points." 69 | print(hyphenator.unhyphenate(text: hyphenatedText)) 70 | // This algorithm identifies likely hyphenation points. 71 | ``` 72 | 73 | Note that if the original string contained the `separator` character, the `unhyphenate(text:)` method will remove those instances as well, so hyphenating and unhyphenating a string may not recover the original string. 74 | 75 | ### Exceptions 76 | 77 | The algorithm is designed to prioritize the prevention of incorrect hyphenations over finding every correct hyphenation—missing a single hyphenation rarely effects text flow meaningfully, but bad hyphenation can be rather noticable. Because the patterns were derived from a English dictionary, it can make good guesses about many words that do not appear in a dictionary. 78 | 79 | ```swift 80 | let hyphenator = Hyphenator() 81 | hyphenator.separator = "-" 82 | 83 | print(hyphenator.hyphenate(text: "swiftlang supercalifragilisticexpialidocious")) 84 | // swift-lang su-per-cal-ifrag-ilis-tic-ex-pi-ali-do-cious 85 | ``` 86 | 87 | Nevertheless, the algorithm may occasionally produce unexpected results for brand names or other unusual words. In this case, you may manually specify a desired hyphenation using exceptions. 88 | 89 | ```swift 90 | print(hyphenator.hyphenate(text: "Microsoft sesquipedalian")) 91 | // Mi-crosoft sesquipedalian 92 | 93 | hyphenator.addCustomExceptions(["Micro-soft", "ses-qui-pe-da-li-an"]) 94 | 95 | print(hyphenator.hyphenate(text: "Microsoft sesquipedalian")) 96 | // Micro-soft ses-qui-pe-da-li-an 97 | ``` 98 | 99 | To remove custom exceptions, use the following methods: 100 | 101 | ```swift 102 | hyphenator.removeCustomExceptions(["sesquipedalian"]) 103 | hyphenator.removeAllCustomExceptions() 104 | ``` 105 | 106 | ### Customizable Properties 107 | 108 | There are several properties you can modify to adjust how words are hyphenated. 109 | 110 | The `separator` property sets the character inserted at hyphenation points. By default, this is U+00AD (soft hyphen). 111 | 112 | The `minLength`, `minLeading`, and `minTrailing` properties adjust where the separator character may be inserted in a word. 113 | 114 | - Words shorter than `minLength` will not be hyphenated. 115 | - Hyphenation will not occur within the first `minLeading` characters. 116 | - Hyphenation will not occur within the last `minTrailing` characters. 117 | 118 | ### Custom Patterns 119 | 120 | This library includes American English hyphenation patterns by default, but you can easily initialize a `Hyphenator` instance using patterns for many other languages. The patterns can be passed via `String` or `URL`: 121 | 122 | ```swift 123 | let hyphenator1 = Hyphenator(patterns: patternsString, exceptions: exceptionsString) 124 | let hyphenator2 = Hyphenator(patternFile: patternsURL, exceptions: exceptionsURL) 125 | ``` 126 | 127 | Patterns for a wide variety of languages can be found in the [TeX hyphenation repo](https://github.com/hyphenation/tex-hyphen/tree/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt). *Please check the license under which each set of patterns is released* at the [TeX hyphenation patterns website](http://www.hyphenation.org/tex#languages). This page also lists the proper `minLeading` and `minTrailing` for each language. 128 | 129 | When initializing a new `Hyphenator` instance, it is assumed that patterns are separated by newlines or whitespace. 130 | 131 | ### Thread Safety 132 | 133 | The Hyphenator class is thread-safe, and can be used to hyphenate on multiple threads simultaneously (although the performance benefits over using two instances are negligible). 134 | 135 | The `copy()` method provides an efficient way to create a new `Hyphenator` instance with the same properties and patterns as an existing instance. 136 | 137 | ### HTML/Code 138 | 139 | You should not apply the `hyphenate(text:)` method directly to strings containing HTML or code, as the code elements may be erroneously hyphenated. A safer approach is to use another tool capable of identifying HTML or code elements and applying hyphenation only to plain text content within the markup. 140 | 141 | See [HyphenationPublishPlugin](https://github.com/john-mueller/HyphenationPublishPlugin) for an example hyphenating HTML using [SwiftSoup](https://github.com/scinfu/SwiftSoup). 142 | 143 | ## Contributing 144 | 145 | If you encounter an issue using Hyphenation, please let me know by filing an issue or submitting a pull request! 146 | 147 | When filing an issue, please do your best to provide reproducable steps and an explanation of the expected behavior. 148 | 149 | In the case of a pull request, please take note of the following steps: 150 | 151 | 1. `swiftlint` should produce no warnings when run in the project directory. This is checked by CI, but I also recommend linting locally if possible (instructions for installation in the [SwiftLint repo](https://github.com/realm/SwiftLint#installation)). 152 | 2. Make sure `make test` results in no errors. This runs the tests in the `CorrectnessTests` and `ThreadSafetyTests` files. 153 | 3. If changing any internal implementations, please run `make bench` both with and without your changes, to check for any speed regressions. This runs the tests in the `PerformanceTests` file. 154 | 155 | ## License 156 | 157 | Hyphenation is provided under the MIT license (see [LICENSE.md](LICENSE.md)). 158 | 159 | The English hyphenation patterns are provided under the [original custom license](https://github.com/hyphenation/tex-hyphen/blob/master/hyph-utf8/tex/generic/hyph-utf8/patterns/tex/hyph-en-us.tex), and are sourced from the [TeX hyphenation repo](https://github.com/hyphenation/tex-hyphen/tree/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt). 160 | 161 | [The texts](Tests/PerformanceTests/TestHelpers/) used for performance testing are in the public domain, and are attributed in their headers. 162 | 163 | The example paragraphs in the Introduction are from [Butterick's Practical Typography](https://practicaltypography.com), and are used with permission. 164 | 165 | ## Credits 166 | 167 | This library was inspired by the pages on [justified text](https://practicaltypography.com/justified-text.html) and [optional hyphens](https://practicaltypography.com/optional-hyphens.html) in [Butterick's Practical Typography](https://practicaltypography.com) and the author's [implementation in Racket](https://github.com/mbutterick/hyphenate). It's worth a read! 168 | -------------------------------------------------------------------------------- /Tests/HyphenationTests/CorrectnessTests.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | // swiftlint:disable explicit_top_level_acl 6 | 7 | import Hyphenation 8 | import XCTest 9 | 10 | final class CorrectnessTests: XCTestCase { 11 | var hyphenator = Hyphenator() 12 | 13 | override func setUp() { 14 | super.setUp() 15 | hyphenator.separator = "-" 16 | } 17 | 18 | func testSingleWordHyphenation() throws { 19 | XCTAssertEqual(hyphenator.hyphenate(text: "modularity"), "mod-u-lar-ity") 20 | XCTAssertEqual(hyphenator.hyphenate(text: "superfluous"), "su-per-flu-ous") 21 | XCTAssertEqual(hyphenator.hyphenate(text: "algorithm"), "al-go-rithm") 22 | XCTAssertEqual(hyphenator.hyphenate(text: "hyphenation"), "hy-phen-ation") 23 | XCTAssertEqual(hyphenator.hyphenate(text: "accoutrements"), "ac-cou-trements") 24 | XCTAssertEqual(hyphenator.hyphenate(text: "acumen"), "acu-men") 25 | XCTAssertEqual(hyphenator.hyphenate(text: "anomalistic"), "anom-al-is-tic") 26 | XCTAssertEqual(hyphenator.hyphenate(text: "auspicious"), "aus-pi-cious") 27 | XCTAssertEqual(hyphenator.hyphenate(text: "bellwether"), "bell-wether") 28 | XCTAssertEqual(hyphenator.hyphenate(text: "callipygian"), "cal-lipy-gian") 29 | XCTAssertEqual(hyphenator.hyphenate(text: "circumlocution"), "cir-cum-lo-cu-tion") 30 | XCTAssertEqual(hyphenator.hyphenate(text: "concupiscent"), "con-cu-pis-cent") 31 | XCTAssertEqual(hyphenator.hyphenate(text: "conviviality"), "con-vivi-al-ity") 32 | XCTAssertEqual(hyphenator.hyphenate(text: "coruscant"), "cor-us-cant") 33 | XCTAssertEqual(hyphenator.hyphenate(text: "cuddlesome"), "cud-dle-some") 34 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cu-pid-ity") 35 | XCTAssertEqual(hyphenator.hyphenate(text: "cynosure"), "cyno-sure") 36 | XCTAssertEqual(hyphenator.hyphenate(text: "ebullient"), "ebul-lient") 37 | XCTAssertEqual(hyphenator.hyphenate(text: "equanimity"), "equa-nim-ity") 38 | XCTAssertEqual(hyphenator.hyphenate(text: "excogitate"), "ex-cog-i-tate") 39 | XCTAssertEqual(hyphenator.hyphenate(text: "gasconading"), "gas-conad-ing") 40 | XCTAssertEqual(hyphenator.hyphenate(text: "idiosyncratic"), "idio-syn-cratic") 41 | XCTAssertEqual(hyphenator.hyphenate(text: "luminescent"), "lu-mi-nes-cent") 42 | XCTAssertEqual(hyphenator.hyphenate(text: "magnanimous"), "mag-nan-i-mous") 43 | XCTAssertEqual(hyphenator.hyphenate(text: "nidificate"), "ni-d-ifi-cate") 44 | XCTAssertEqual(hyphenator.hyphenate(text: "osculator"), "os-cu-la-tor") 45 | XCTAssertEqual(hyphenator.hyphenate(text: "parsimonious"), "par-si-mo-nious") 46 | XCTAssertEqual(hyphenator.hyphenate(text: "penultimate"), "penul-ti-mate") 47 | XCTAssertEqual(hyphenator.hyphenate(text: "perfidiousness"), "per-fid-i-ous-ness") 48 | XCTAssertEqual(hyphenator.hyphenate(text: "perspicacious"), "per-spi-ca-cious") 49 | XCTAssertEqual(hyphenator.hyphenate(text: "proficuous"), "profi-c-u-ous") 50 | XCTAssertEqual(hyphenator.hyphenate(text: "remunerative"), "re-mu-ner-a-tive") 51 | XCTAssertEqual(hyphenator.hyphenate(text: "saxicolous"), "saxi-colous") 52 | XCTAssertEqual(hyphenator.hyphenate(text: "sesquipedalian"), "sesquipedalian") 53 | XCTAssertEqual(hyphenator.hyphenate(text: "superabundant"), "su-per-abun-dant") 54 | XCTAssertEqual(hyphenator.hyphenate(text: "unencumbered"), "un-en-cum-bered") 55 | XCTAssertEqual(hyphenator.hyphenate(text: "unparagoned"), "un-paragoned") 56 | XCTAssertEqual(hyphenator.hyphenate(text: "usufruct"), "usufruct") 57 | XCTAssertEqual(hyphenator.hyphenate(text: "winebibber"), "winebib-ber") 58 | } 59 | 60 | func testMultiWordHyphenation() throws { 61 | XCTAssertEqual(hyphenator.hyphenate(text: "modularity superfluous algorithm hyphenation"), 62 | "mod-u-lar-ity su-per-flu-ous al-go-rithm hy-phen-ation") 63 | XCTAssertEqual(hyphenator.hyphenate(text: " modularity superfluous \nalgorithm hyphenation "), 64 | " mod-u-lar-ity su-per-flu-ous \nal-go-rithm hy-phen-ation ") 65 | XCTAssertEqual(hyphenator.hyphenate(text: "modul1arity superf,luous algor$ithm hyphe$nation"), 66 | "modul1ar-ity su-perf,lu-ous al-gor$ithm hy-phe$na-tion") 67 | } 68 | 69 | func testExceptions() throws { 70 | XCTAssertEqual(hyphenator.hyphenate(text: "associate"), "as-so-ciate") 71 | XCTAssertEqual(hyphenator.hyphenate(text: "associates"), "as-so-ciates") 72 | XCTAssertEqual(hyphenator.hyphenate(text: "declination"), "dec-li-na-tion") 73 | XCTAssertEqual(hyphenator.hyphenate(text: "obligatory"), "oblig-a-tory") 74 | XCTAssertEqual(hyphenator.hyphenate(text: "philanthropic"), "phil-an-thropic") 75 | XCTAssertEqual(hyphenator.hyphenate(text: "present"), "present") 76 | XCTAssertEqual(hyphenator.hyphenate(text: "presents"), "presents") 77 | XCTAssertEqual(hyphenator.hyphenate(text: "project"), "project") 78 | XCTAssertEqual(hyphenator.hyphenate(text: "projects"), "projects") 79 | XCTAssertEqual(hyphenator.hyphenate(text: "reciprocity"), "reci-procity") 80 | XCTAssertEqual(hyphenator.hyphenate(text: "recognizance"), "re-cog-ni-zance") 81 | XCTAssertEqual(hyphenator.hyphenate(text: "reformation"), "ref-or-ma-tion") 82 | XCTAssertEqual(hyphenator.hyphenate(text: "retribution"), "ret-ri-bu-tion") 83 | XCTAssertEqual(hyphenator.hyphenate(text: "table"), "ta-ble") 84 | } 85 | 86 | func testPreHyphenatedWords() throws { 87 | XCTAssertEqual(hyphenator.hyphenate(text: "super-~fluous"), "su-per-~flu-ous") 88 | XCTAssertEqual(hyphenator.hyphenate(text: "super-fluous"), "super-fluous") 89 | hyphenator.separator = "~" 90 | XCTAssertEqual(hyphenator.hyphenate(text: "super~~fluous"), "su~per~~flu~ous") 91 | XCTAssertEqual(hyphenator.hyphenate(text: "super~fluous"), "super~fluous") 92 | XCTAssertEqual(hyphenator.hyphenate(text: "123~fluous"), "123~flu~ous") 93 | XCTAssertEqual(hyphenator.hyphenate(text: "super~456"), "su~per~456") 94 | XCTAssertEqual(hyphenator.hyphenate(text: "123~456"), "123~456") 95 | XCTAssertEqual(hyphenator.hyphenate(text: "super~"), "su~per~") 96 | XCTAssertEqual(hyphenator.hyphenate(text: "123~"), "123~") 97 | XCTAssertEqual(hyphenator.hyphenate(text: "~fluous"), "~flu~ous") 98 | XCTAssertEqual(hyphenator.hyphenate(text: "~456"), "~456") 99 | } 100 | 101 | func testCaseInsensitivity() throws { 102 | XCTAssertEqual(hyphenator.hyphenate(text: "MoDuLaRiTy"), "MoD-u-LaR-iTy") 103 | hyphenator.addCustomExceptions(["mOdU-lAr-I-tY"]) 104 | XCTAssertEqual(hyphenator.hyphenate(text: "MoDuLaRiTy"), "MoDu-LaR-i-Ty") 105 | } 106 | 107 | func testCustomExceptions() throws { 108 | XCTAssertEqual(hyphenator.hyphenate(text: "project"), "project") 109 | hyphenator.addCustomExceptions(["pro-ject"]) 110 | XCTAssertEqual(hyphenator.hyphenate(text: "project"), "pro-ject") 111 | hyphenator.addCustomExceptions(["proj-ect"]) 112 | XCTAssertEqual(hyphenator.hyphenate(text: "project"), "proj-ect") 113 | hyphenator.removeAllCustomExceptions() 114 | XCTAssertEqual(hyphenator.hyphenate(text: "project"), "project") 115 | hyphenator.addCustomExceptions(["Micro-soft", "ses-qui-pe-da-li-an"]) 116 | XCTAssertEqual(hyphenator.hyphenate(text: "Microsoft"), "Micro-soft") 117 | XCTAssertEqual(hyphenator.hyphenate(text: "sesquipedalian"), "ses-qui-pe-da-li-an") 118 | hyphenator.removeCustomExceptions(["Microsoft"]) 119 | XCTAssertEqual(hyphenator.hyphenate(text: "Microsoft"), "Mi-crosoft") 120 | XCTAssertEqual(hyphenator.hyphenate(text: "sesquipedalian"), "ses-qui-pe-da-li-an") 121 | } 122 | 123 | func testCacheInvalidation() throws { 124 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cu-pid-ity") 125 | hyphenator.separator = "~" 126 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cu~pid~ity") 127 | hyphenator.minLeading = 3 128 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cupid~ity") 129 | hyphenator.minTrailing = 2 130 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cupid~i~ty") 131 | hyphenator.minLength = 9 132 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cupidity") 133 | hyphenator.minLength = 5 134 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cupid~i~ty") 135 | } 136 | 137 | func testMinValuesExtrema() throws { 138 | hyphenator.minLeading = UInt.max 139 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cupidity") 140 | hyphenator.minLeading = 0 141 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cu-pid-ity") 142 | hyphenator.minTrailing = UInt.max 143 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cupidity") 144 | hyphenator.minTrailing = 0 145 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cu-pid-i-ty") 146 | hyphenator.minLength = UInt.max 147 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cupidity") 148 | hyphenator.minLength = 0 149 | XCTAssertEqual(hyphenator.hyphenate(text: "cupidity"), "cu-pid-i-ty") 150 | } 151 | 152 | func testHyphenatorCopy() throws { 153 | hyphenator = try Hyphenator(patterns: "mod5u mod8u.", exceptions: "pro-ject") 154 | hyphenator.separator = "-" 155 | let hyphenatorCopy = hyphenator.copy() 156 | hyphenator.addCustomExceptions(["modulari-ty"]) 157 | hyphenatorCopy.separator = "~" 158 | XCTAssertEqual(hyphenator.hyphenate(text: "modularity"), "modulari-ty") 159 | XCTAssertEqual(hyphenatorCopy.hyphenate(text: "modularity"), "mod~ularity") 160 | XCTAssertEqual(hyphenator.hyphenate(text: "project"), "pro-ject") 161 | XCTAssertEqual(hyphenatorCopy.hyphenate(text: "project"), "pro~ject") 162 | } 163 | 164 | func testCustomPatternFiles() throws { 165 | XCTAssertEqual(hyphenator.hyphenate(text: "hyphenation"), "hy-phen-ation") 166 | hyphenator = try Hyphenator(patternFile: .testPatterns) 167 | hyphenator.separator = "-" 168 | XCTAssertEqual(hyphenator.hyphenate(text: "hyphenation"), "hy-phen-a-tion") 169 | hyphenator = try Hyphenator(patternFile: .testPatterns, exceptionFile: .testExceptions) 170 | hyphenator.separator = "-" 171 | XCTAssertEqual(hyphenator.hyphenate(text: "hyphenation"), "hyph-ena-tion") 172 | hyphenator = try Hyphenator(patterns: "hyph3 ena3 4tion") 173 | hyphenator.separator = "-" 174 | XCTAssertEqual(hyphenator.hyphenate(text: "hyphenation"), "hyph-enation") 175 | hyphenator = try Hyphenator(patterns: "hyph3 ena3 4tion", exceptions: "hyphe-nation") 176 | hyphenator.separator = "-" 177 | XCTAssertEqual(hyphenator.hyphenate(text: "hyphenation"), "hyphe-nation") 178 | } 179 | 180 | func testPatternMatching() throws { 181 | hyphenator = try Hyphenator(patterns: "mod5u mod8u.") 182 | hyphenator.separator = "-" 183 | XCTAssertEqual(hyphenator.hyphenate(text: "modularity"), "mod-ularity") 184 | } 185 | 186 | func testBadPatternErrors() throws { 187 | assert(try Hyphenator(patterns: "hyph"), throws: PatternParsingError.deficientPattern("hyph")) 188 | assert(try Hyphenator(patterns: "hy3ph;"), throws: PatternParsingError.invalidCharacter("hy3ph;")) 189 | assert(try Hyphenator(patterns: "hy33ph"), throws: PatternParsingError.consecutiveDigits("hy33ph")) 190 | } 191 | 192 | func testUnhyphenateMethod() throws { 193 | XCTAssertEqual(hyphenator.unhyphenate(text: "mod-u-lar-i-ty"), "modularity") 194 | } 195 | 196 | func testSubstringHyphenation() throws { 197 | let string = "Testing hyphenation of substrings" 198 | let range = string.range(of: "hyphenation")! 199 | let newString = string.replacingCharacters(in: range, with: hyphenator.hyphenate(text: string[range])) 200 | XCTAssertEqual(newString, "Testing hy-phen-ation of substrings") 201 | XCTAssertEqual(hyphenator.unhyphenate(text: newString[newString.startIndex ..< newString.endIndex]), string) 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /Sources/Hyphenation/API/Hyphenator.swift: -------------------------------------------------------------------------------- 1 | // Hyphenation 2 | // © 2020 John Mueller 3 | // MIT license, see LICENSE.md for details 4 | 5 | import Foundation 6 | 7 | /// An object that hyphenates text using the Knuth-Liang algorithm. 8 | /// 9 | /// The Knuth-Liang hyphenation algorithm identifies likely points at which a word can be hyphenated, 10 | /// or split across two lines of text. By default, the `hyphenate(text:)` method inserts U+00AD (soft hyphen) 11 | /// at the calculated break points. This character is invisible unless the word occurs at the end of a line, 12 | /// and breaking would improve text flow. Then it is rendered as a normal hyphen. 13 | /// 14 | /// The example below shows how to hyphenate a string, specifying the hyphen character as the separator: 15 | /// 16 | /// **Example** 17 | /// ``` 18 | /// let hyphenator = Hyphenator() 19 | /// hyphenator.separator = "-" 20 | /// 21 | /// let text = "This algorithm identifies likely hyphenation points." 22 | /// print(hyphenator.hyphenate(text: text) 23 | /// // This al-go-rithm iden-ti-fies like-ly hy-phen-ation points. 24 | /// ``` 25 | /// 26 | /// The algorithm is designed to prioritize the prevention of incorrect hyphenations over finding every correct 27 | /// hyphenation—missing a single hyphenation rarely effects text flow meaningfully, but bad hyphenation can be 28 | /// rather noticable. Nevertheless, the algorithm may occasionally produce unexpected results for brand names 29 | /// or other unusual words. In this case, you may manually specify a desired hyphenation using exceptions. 30 | /// 31 | /// **Example** 32 | /// ``` 33 | /// let hyphenator = Hyphenator() 34 | /// hyphenator.separator = "-" 35 | /// 36 | /// print(hyphenator.hyphenate(text: "Microsoft sesquipedalian")) 37 | /// // Mi-crosoft sesquipedalian 38 | /// 39 | /// hyphenator.addCustomExceptions(["Micro-soft", "ses-qui-pe-da-li-an"]) 40 | /// 41 | /// print(hyphenator.hyphenate(text: "Microsoft sesquipedalian")) 42 | /// // Micro-soft ses-qui-pe-da-li-an 43 | /// ``` 44 | /// 45 | /// The library includes American English patterns by default. Patterns for many other languages are available 46 | /// online with varying licenses; see Hyphenation package README for more details. 47 | /// 48 | /// - Note: The `Hyphenator` class is thread-safe, and can be used to hyphenate on multiple threads simultaneously 49 | /// (although the performance benefits over using two instances are negligible). 50 | /// 51 | /// - Important: You should not apply the `hyphenate(text:)` method directly to strings containing HTML or code, 52 | /// as the code elements may be erroneously hyphenated. A safer approach is to use another tool capable of 53 | /// identifying HTML or code elements and applying hyphenation only to plain text content. 54 | /// See [HyphenationPublishPlugin](https://github.com/john-mueller/HyphenationPublishPlugin) for an example 55 | /// hyphenating HTML using [SwiftSoup](https://github.com/scinfu/SwiftSoup). 56 | public final class Hyphenator { 57 | // MARK: Properties 58 | 59 | /// The minimum character count for a word to be hyphenated. 60 | public var minLength: UInt = 5 { didSet { clearCache() } } 61 | /// The minimum number of characters between the beginning of the word and a hyphenation point. 62 | public var minLeading: UInt = 2 { didSet { clearCache() } } 63 | /// The minimum number of characters between the end of the word and a hyphenation point. 64 | public var minTrailing: UInt = 3 { didSet { clearCache() } } 65 | /// The character to insert at each hyphenation point. 66 | public var separator: Character = "\u{00AD}" { didSet { clearCache() } } 67 | 68 | /// A cache providing quick access to words which have already been hyphenated. 69 | private let cache = HyphenatorCache() 70 | 71 | /// A dictionary providing quick access to pattern information. 72 | private let patternDictionary: PatternDictionary 73 | /// A dictionary providing quick access to exception information. 74 | private let exceptionDictionary: ExceptionDictionary 75 | 76 | // MARK: Initializers 77 | 78 | /// Creates a `Hyphenator` instance using the default English patterns and exceptions. 79 | public init() { 80 | patternDictionary = PatternDictionary() 81 | exceptionDictionary = ExceptionDictionary() 82 | } 83 | 84 | /// Creates a `Hyphenator` instance using the patterns and exceptions contained in strings. 85 | /// 86 | /// The patterns and exceptions can be separated by newlines and/or whitespace. 87 | /// 88 | /// See `PatternParsingError` documentation for correct pattern syntax. 89 | /// 90 | /// - Parameters: 91 | /// - patterns: A string containing patterns. 92 | /// - exceptions: A string containing exceptions. 93 | /// 94 | /// - Throws: An error of type `PatternParsingError`. 95 | public init(patterns: String, exceptions: String? = nil) throws { 96 | patternDictionary = try PatternDictionary(string: patterns) 97 | exceptionDictionary = ExceptionDictionary(string: exceptions ?? "") 98 | } 99 | 100 | /// Creates a `Hyphenator` instance using the patterns and exceptions contained in files. 101 | /// 102 | /// The patterns and exceptions can be separated by newlines and/or whitespace. 103 | /// 104 | /// See `PatternParsingError` documentation for correct pattern syntax. 105 | /// 106 | /// - Parameters: 107 | /// - patternFile: A URL referreing to a file containing patterns. 108 | /// - exceptionFile: A URL referreing to a file containing exceptions. 109 | /// 110 | /// - Throws: An error of type `PatternParsingError`, or any error thrown by `String(contentsOf:encoding:)`. 111 | public init(patternFile: URL, exceptionFile: URL? = nil) throws { 112 | patternDictionary = try PatternDictionary(fileURL: patternFile) 113 | if let exceptionFile = exceptionFile { 114 | exceptionDictionary = try ExceptionDictionary(fileURL: exceptionFile) 115 | } else { 116 | exceptionDictionary = ExceptionDictionary(string: "") 117 | } 118 | } 119 | 120 | /// Creates a `Hyphenator` instance with a copy of the data in an existing instance. 121 | /// 122 | /// The cache is not copied, and a deep copy of the `patternDictionary` and `exceptionDictionary` is performed. 123 | /// 124 | /// - Parameters: 125 | /// - copy: The `Hyphenator` which will be copied. 126 | init(copy: Hyphenator) { 127 | minLength = copy.minLength 128 | minLeading = copy.minLeading 129 | minTrailing = copy.minTrailing 130 | separator = copy.separator 131 | 132 | patternDictionary = copy.patternDictionary.copy() 133 | exceptionDictionary = copy.exceptionDictionary.copy() 134 | } 135 | } 136 | 137 | // MARK: Copying 138 | 139 | extension Hyphenator: Copyable { 140 | /// Returns a new `Hyphenator` instance, copied from an existing instance. 141 | public func copy() -> Self { 142 | Self(copy: self) 143 | } 144 | } 145 | 146 | // MARK: Methods 147 | 148 | extension Hyphenator { 149 | /// Returns a new `String` formed by finding hyphenation points in the input text and 150 | /// inserting the `separator` character at those points. 151 | /// 152 | /// - Complexity: Hyphenation is an O(n) operation. 153 | /// 154 | /// - Parameters: 155 | /// - text: A `String` or `Substring` containing text to be hyphenated. 156 | public func hyphenate(text: T) -> String { 157 | TokenSequence(from: text, separator: separator) 158 | .lazy 159 | .map(render) 160 | .joined() 161 | } 162 | 163 | /// Returns a new `String` formed by removing the `separator` character from the input text. 164 | /// 165 | /// - Important: Hyphenating a string is not guarenteed to be a reversible operation—if 166 | /// the original string contained `separator` characters, they will also be 167 | /// removed by this function. 168 | public func unhyphenate(text: T) -> String { 169 | text.replacingOccurrences(of: "\(separator)", with: "") 170 | } 171 | 172 | /// Clears the `Hyphenator`'s internal cache. 173 | /// 174 | /// It is typically unnecessary to clear the cache, unless one wants to keep a configured `Hyphenator` 175 | /// instance and ensure it does not take any more memory than necessary. 176 | public func clearCache() { 177 | cache.clearCache() 178 | } 179 | } 180 | 181 | // MARK: Exceptions 182 | 183 | extension Hyphenator { 184 | /// Adds custom exceptions to the `Hyphenator`. 185 | /// 186 | /// - Parameters: 187 | /// - exceptions: A collection of words to be treated as exceptions, with hyphens ("-") inserted 188 | /// at the desired hyphenation points. 189 | public func addCustomExceptions(_ exceptions: T) where T.Element == String { 190 | exceptionDictionary.addCustomExceptions(exceptions) 191 | } 192 | 193 | /// Removes custom exceptions from the `Hyphenator`. 194 | /// 195 | /// - Parameters: 196 | /// - exceptions: A collection of words that should not have custom hyphenation exceptions. 197 | public func removeCustomExceptions(_ exceptions: T) where T.Element == String { 198 | exceptionDictionary.removeCustomExceptions(exceptions) 199 | } 200 | 201 | /// Removes all custom exceptions that have been added to the `Hyphenator` using `addCustomExceptions(_:)`. 202 | public func removeAllCustomExceptions() { 203 | exceptionDictionary.removeAllCustomExceptions() 204 | } 205 | } 206 | 207 | // MARK: Private methods 208 | 209 | extension Hyphenator { 210 | /// Converts a `Token` to a string, hyphenated if necessary. 211 | /// 212 | /// - Parameters: 213 | /// - token: The `Token` to convert. 214 | private func render(token: Token) -> String { 215 | switch token { 216 | case let .nonHyphenatable(tokenString): 217 | return tokenString 218 | case let .hyphenatable(tokenString): 219 | if tokenString.count < minLength { 220 | return tokenString 221 | } 222 | 223 | if let hyphenatedWord = exceptionDictionary[tokenString] { 224 | return hyphenatedWord.replacingOccurrences(of: "-", with: "\(separator)") 225 | } 226 | 227 | if let hyphenatedWord = cache[tokenString] { 228 | return hyphenatedWord 229 | } else { 230 | let hyphenatedWord = hyphenate(word: tokenString) 231 | cache[tokenString] = hyphenatedWord 232 | return hyphenatedWord 233 | } 234 | } 235 | } 236 | 237 | /// Hyphenates a single word by finding the patterns it contains, merging their hyphenation priorities, 238 | /// and inserting the `separator` character at the proper locations. 239 | /// 240 | /// - Parameters: 241 | /// - word: The word to be hyphenated. 242 | private func hyphenate(word: String) -> String { 243 | let lowercasedWord = word.lowercased() 244 | 245 | let matchedPatterns = patterns(in: lowercasedWord) 246 | 247 | let mergedPriorities = priorities(byMerging: matchedPatterns, in: lowercasedWord) 248 | 249 | return separating(word, using: mergedPriorities) 250 | } 251 | 252 | /// Returns an array containing pairs of locations and pattern identifiers contained within the word. 253 | /// 254 | /// - Parameters: 255 | /// - word: The word in which to find subpatterns. 256 | private func patterns(in word: String) -> [(Location, Identifier)] { 257 | var patterns = [(Location, Identifier)]() 258 | 259 | var startIndex = word.startIndex 260 | var endIndex = word.index(startIndex, offsetBy: 1, limitedBy: word.endIndex) 261 | while endIndex != nil { 262 | let identifier = String(word[startIndex ..< endIndex!]) 263 | if patternDictionary[identifier] != nil { 264 | patterns.append((startIndex, identifier)) 265 | } 266 | 267 | if startIndex == word.startIndex, patternDictionary["." + identifier] != nil { 268 | patterns.append((startIndex, "." + identifier)) 269 | } 270 | 271 | let distance = word.distance(from: startIndex, to: endIndex!) 272 | if endIndex == word.endIndex || distance >= patternDictionary.maxIdentifierLength { 273 | if patternDictionary[identifier + "."] != nil { 274 | patterns.append((startIndex, identifier + ".")) 275 | } 276 | 277 | startIndex = word.index(after: startIndex) 278 | endIndex = word.index(startIndex, offsetBy: 1, limitedBy: word.endIndex) 279 | } else { 280 | endIndex = word.index(after: endIndex!) 281 | } 282 | } 283 | 284 | return patterns 285 | } 286 | 287 | /// Returns a mapping from pattern locations to hyphenation priorities. 288 | /// 289 | /// - Parameters: 290 | /// - patterns: An array of pairs of locations and pattern identifiers. 291 | /// - word: The word in which the patterns are contained. 292 | private func priorities(byMerging patterns: [(Location, Identifier)], in word: String) -> [Location: Priority] { 293 | var mergedPriorities = [Location: Priority]() 294 | 295 | patterns.forEach { location, identifier in 296 | if let prioritiesByOffset = patternDictionary[identifier] { 297 | var prioritiesByLocation = [Location: Priority]() 298 | for offset in prioritiesByOffset.keys { 299 | let index = word.index(location, offsetBy: offset) 300 | prioritiesByLocation[index] = prioritiesByOffset[offset] 301 | } 302 | mergedPriorities.merge(prioritiesByLocation, uniquingKeysWith: max) 303 | } 304 | } 305 | 306 | return mergedPriorities 307 | } 308 | 309 | /// Returns the result of inserting the `separator` character into the word at the proper locations. 310 | /// 311 | /// - Parameters: 312 | /// - word: The word to be hyphenated. 313 | /// - priorities: The mapping from pattern locations to hyphenation priorities. 314 | private func separating(_ word: String, using priorities: [Location: Priority]) -> String { 315 | var hyphenatedWord = word 316 | let minIndex = word.index(word.startIndex, offsetBy: minLeading.clampedBetween(low: 0, high: word.count)) 317 | let maxIndex = word.index(word.endIndex, offsetBy: -minTrailing.clampedBetween(low: 0, high: word.count)) 318 | 319 | for location in priorities.filter({ location, priority in 320 | if priority.isMultiple(of: 2) { return false } 321 | if location < minIndex { return false } 322 | if location > maxIndex { return false } 323 | return true 324 | }).keys.sorted().reversed() { 325 | hyphenatedWord.insert(separator, at: location) 326 | } 327 | 328 | return hyphenatedWord 329 | } 330 | } 331 | 332 | // MARK: Validation Extensions 333 | 334 | extension UInt { 335 | /// Converts to `Int` safely and clamps result between two values (inclusive). 336 | fileprivate func clampedBetween(low: Int, high: Int) -> Int { 337 | let thing = (self <= Int.max) ? Int(self) : Int.max 338 | return Swift.max(low, Swift.min(high, thing)) 339 | } 340 | } 341 | 342 | // MARK: Typealiases 343 | 344 | extension Hyphenator { 345 | /// A string that represents a pattern's textual form, omitting the priority numbers. 346 | private typealias Identifier = Pattern.Identifier 347 | /// An index that represents a potential split location within a pattern string. 348 | private typealias Location = Pattern.Location 349 | /// An integer that represents the number of indices from the beginning of the pattern string 350 | /// to the index of a potential split location. 351 | private typealias Offset = Pattern.Offset 352 | /// An integer that represents the priority with which a string should be split or not split 353 | /// at a given index. 354 | private typealias Priority = Pattern.Priority 355 | } 356 | -------------------------------------------------------------------------------- /Tests/HyphenationTests/TextFiles/Constitution.txt: -------------------------------------------------------------------------------- 1 | // United States. (1975). United States Constitution, The. Urbana, Illinois: Project Gutenberg. Retrieved November 21, 2019, from www.gutenberg.org/ebooks/5. 2 | 3 | Title: The United States' Constitution 4 | 5 | Author: Founding Fathers 6 | 7 | THE CONSTITUTION OF THE UNITED STATES OF AMERICA, 1787 8 | 9 | 10 | 11 | We the people of the United States, in Order to form a more perfect Union, 12 | establish Justice, insure domestic Tranquility, provide for the common defence, 13 | promote the general Welfare, and secure the Blessings of Liberty to ourselves 14 | and our Posterity, do ordain and establish this Constitution for the 15 | United States of America. 16 | 17 | 18 | Article 1 19 | 20 | Section 1. All legislative Powers herein granted shall be vested in a 21 | Congress of the United States, which shall consist of a Senate and 22 | House of Representatives. 23 | 24 | Section 2. The House of Representatives shall be composed of Members 25 | chosen every second Year by the People of the several States, 26 | and the electors in each State shall have the qualifications requisite 27 | for electors of the most numerous branch of the State legislature. 28 | 29 | No Person shall be a Representative who shall not have attained to the 30 | Age of twenty five Years, and been seven Years a citizen of the United States, 31 | and who shall not, when elected, be an Inhabitant of that State in which 32 | he shall be chosen. 33 | 34 | Representatives and direct Taxes shall be apportioned among 35 | the several States which may be included within this Union, 36 | according to their respective Numbers, which shall be determined 37 | by adding to the whole number of free Persons, including those 38 | bound to Service for a Term of Years, and excluding Indians not taxed, 39 | three fifths of all other Persons. The actual Enumeration shall be made 40 | within three Years after the first Meeting of the Congress of the 41 | United States, and within every subsequent Term of ten Years, 42 | in such Manner as they shall by law Direct. The number of 43 | Representatives shall not exceed one for every thirty Thousand, 44 | but each State shall have at least one Representative; 45 | and until such enumeration shall be made, the State of New Hampshire 46 | shall be entitled to chuse three, Massachusetts eight, Rhode Island 47 | and Providence Plantations one, Connecticut five, New York six, 48 | New Jersey four, Pennsylvania eight, Delaware one, Maryland six, 49 | Virginia ten, North Carolina five, South Carolina five, and Georgia three. 50 | 51 | When vacancies happen in the Representation from any State, the Executive 52 | Authority thereof shall issue Writs of Election to fill such Vacancies. 53 | 54 | The House of Representatives shall chuse their Speaker and other Officers; 55 | and shall have the sole Power of Impeachment. 56 | 57 | Section 3. The Senate of the United States shall be composed of 58 | two Senators from each State, chosen by the legislature thereof, 59 | for six Years; and each Senator shall have one Vote. 60 | 61 | Immediately after they shall be assembled in Consequence of the first Election, 62 | they shall be divided as equally as may be into three Classes. The Seats of 63 | the Senators of the first Class shall be vacated at the expiration of the 64 | second Year, of the second Class at the expiration of the fourth Year, 65 | and of the third Class at the expiration of the sixth Year, so that one third 66 | may be chosen every second Year; and if vacancies happen by Resignation, 67 | or otherwise, during the recess of the Legislature of any State, 68 | the Executive thereof may make temporary Appointments until the 69 | next meeting of the Legislature, which shall then fill such Vacancies. 70 | 71 | No person shall be a Senator who shall not have attained to the Age of 72 | thirty Years, and been nine Years a Citizen of the United States, 73 | and who shall not, when elected, be an Inhabitant of that State 74 | for which he shall be chosen. 75 | 76 | The Vice-President of the United States shall be President of the Senate, 77 | but shall have no Vote, unless they be equally divided. 78 | 79 | The Senate shall choose their other Officers, and also a President 80 | pro tempore, in the Absence of the Vice-President, or when he shall 81 | exercise the Office of President of the United States. 82 | 83 | The Senate shall have the sole Power to try all Impeachments. 84 | When sitting for that Purpose, they shall be on Oath or Affirmation. 85 | When the President of the United States is tried, the Chief Justice 86 | shall preside: And no Person shall be convicted without the Concurrence 87 | of two thirds of the Members present. 88 | 89 | Judgment in cases of Impeachment shall not extend further than to removal 90 | from Office, and disqualification to hold and enjoy any Office of honor, 91 | Trust or Profit under the United States: but the Party convicted shall 92 | nevertheless be liable and subject to Indictment, Trial, Judgment and 93 | Punishment, according to Law. 94 | 95 | Section 4. The Times, Places and Manner of holding Elections for Senators and 96 | Representatives, shall be prescribed in each State by the Legislature thereof; 97 | but the Congress may at any time by Law make or alter such Regulations, 98 | except as to the Places of chusing Senators. 99 | 100 | The Congress shall assemble at least once in every Year, 101 | and such Meeting shall be on the first Monday in December, 102 | unless they shall by law appoint a different Day. 103 | 104 | 105 | Section 5. Each House shall be the Judge of the Elections, 106 | Returns and Qualifications of its own Members, and a 107 | Majority of each shall constitute a Quorum to do Business; 108 | but a smaller Number may adjourn from day to day, 109 | and may be authorized to compel the Attendance of absent Members, 110 | in such Manner, and under such Penalties as each House may provide. 111 | 112 | Each house may determine the Rules of its Proceedings, 113 | punish its Members for disorderly Behavior, and, with the 114 | Concurrence of two-thirds, expel a Member. 115 | 116 | Each house shall keep a Journal of its Proceedings, 117 | and from time to time publish the same, excepting such Parts as may 118 | in their Judgment require Secrecy; and the Yeas and Nays of the 119 | Members of either House on any question shall, at the Desire of 120 | one fifth of those Present, be entered on the Journal. 121 | 122 | Neither House, during the Session of Congress, shall, without the 123 | Consent of the other, adjourn for more than three days, nor to 124 | any other Place than that in which the two Houses shall be sitting. 125 | 126 | Section 6. The Senators and Representatives shall receive a Compensation 127 | for their Services, to be ascertained by Law, and paid out of the Treasury 128 | of the United States. They shall in all Cases, except Treason, Felony and 129 | Breach of the Peace, be privileged from Arrest during their Attendance 130 | at the Session of their respective Houses, and in going to and returning 131 | from the same; and for any Speech or Debate in either House, 132 | they shall not be questioned in any other Place. 133 | 134 | No Senator or Representative shall, during the Time for which he was elected, 135 | be appointed to any civil Office under the authority of the United States, 136 | which shall have been created, or the Emoluments whereof shall have been 137 | increased during such time; and no Person holding any Office under the 138 | United States, shall be a Member of either House during his Continuance 139 | in Office. 140 | 141 | Section 7. All Bills for raising Revenue shall originate in the 142 | House of Representatives; but the Senate may propose or concur with 143 | Amendments as on other Bills. 144 | 145 | Every Bill which shall have passed the House of Representatives and 146 | the Senate, shall, before it become a Law, be presented to the 147 | President of the United States; If he approve he shall sign it, 148 | but if not he shall return it, with his Objections to that House 149 | in which it shall have originated, who shall enter the Objections 150 | at large on their Journal, and proceed to reconsider it. 151 | If after such Reconsideration two thirds of that house 152 | shall agree to pass the Bill, it shall be sent, 153 | together with the Objections, to the other House, by which 154 | it shall likewise be reconsidered, and if approved by two thirds 155 | of that House, it shall become a law. But in all such Cases 156 | the Votes of both Houses shall be determined by Yeas and Nays, 157 | and the Names of the Persons voting for and against the Bill shall be 158 | entered on the Journal of each House respectively. If any Bill 159 | shall not be returned by the President within ten Days (Sundays excepted) 160 | after it shall have been presented to him, the Same shall be a Law, 161 | in like Manner as if he had signed it, unless the Congress by their 162 | Adjournment prevent its Return, in which case it shall not be a Law. 163 | 164 | Every Order, Resolution, or Vote to which the Concurrence of the Senate 165 | and House of Representatives may be necessary (except on a question 166 | of Adjournment) shall be presented to the President of the United States; 167 | and before the Same shall take Effect, shall be approved by him, 168 | or being disapproved by him, shall be repassed by two thirds of 169 | the Senate and House of Representatives, according to the Rules 170 | and Limitations prescribed in the Case of a Bill. 171 | 172 | Section 8. The Congress shall have Power to lay and collect Taxes, Duties, 173 | Imposts and Excises, to pay the Debts and provide for the common Defence 174 | and general Welfare of the United States; but all Duties, Imposts and Excises 175 | shall be uniform throughout the United States; 176 | 177 | To borrow Money on the credit of the United States; 178 | 179 | To regulate Commerce with foreign Nations, and among the several States, 180 | and with the Indian Tribes; 181 | 182 | To establish an uniform Rule of Naturalization, and uniform Laws 183 | on the subject of Bankruptcies throughout the United States; 184 | 185 | To coin Money, regulate the Value thereof, and of foreign Coin, 186 | and fix the Standard of Weights and Measures; 187 | 188 | To provide for the Punishment of counterfeiting the Securities 189 | and current Coin of the United States; 190 | 191 | To establish Post Offices and Post Roads; 192 | 193 | To promote the Progress of Science and useful Arts, by securing 194 | for limited Times to Authors and Inventors the exclusive Right 195 | to their respective Writings and Discoveries; 196 | 197 | To constitute Tribunals inferior to the supreme Court; 198 | 199 | To define and punish Piracies and Felonies committed on the high Seas, 200 | and Offenses against the Law of Nations; 201 | 202 | To declare War, grant Letters of Marque and Reprisal, 203 | and make Rules concerning Captures on Land and Water; 204 | 205 | To raise and support Armies, but no Appropriation of Money to that Use 206 | shall be for a longer term than two Years; 207 | 208 | To provide and maintain a Navy; 209 | 210 | To make Rules for the Government and Regulation of the land and naval Forces; 211 | 212 | To provide for calling forth the Militia to execute the Laws of the Union, 213 | suppress Insurrections and repel Invasions; 214 | 215 | To provide for organizing, arming, and disciplining, the Militia, and for 216 | governing such Part of them as may be employed in the Service of the 217 | United States, reserving to the States respectively, the Appointment 218 | of the Officers, and the Authority of training the militia according 219 | to the discipline prescribed by Congress; 220 | 221 | To exercise exclusive Legislation in all Cases whatsoever, 222 | over such District (not exceeding ten Miles square) as may, 223 | by Cession of particular States, and the Acceptance of Congress, 224 | become the Seat of the Government of the United States, and to 225 | exercise like Authority over all Places purchased by the Consent 226 | of the Legislature of the State in which the Same shall be, 227 | for the Erection of Forts, Magazines, Arsenals, Dockyards, 228 | and other needful Buildings;--And 229 | 230 | To make all Laws which shall be necessary and proper for carrying 231 | into Execution the foregoing Powers, and all other Powers vested 232 | by this Constitution in the Government of the United States, 233 | or in any Department or Officer thereof. 234 | 235 | Section 9. The Migration or Importation of such Persons as any 236 | of the States now existing shall think proper to admit, shall not 237 | be prohibited by the Congress prior to the Year one thousand eight 238 | hundred and eight, but a Tax or Duty may be imposed on such Importation, 239 | not exceeding ten dollars for each Person. 240 | 241 | The Privilege of the Writ of Habeas Corpus shall not be suspended, unless 242 | when in Cases of Rebellion or Invasion the public Safety may require it. 243 | 244 | No Bill of Attainder or ex post facto Law shall be passed. 245 | 246 | No Capitation, or other direct, Tax shall be laid, unless in Proportion 247 | to the Census or Enumeration herein before directed to be taken. 248 | 249 | No Tax or Duty shall be laid on Articles exported from any State. 250 | 251 | No Preference shall be given by any Regulation of Commerce or Revenue 252 | to the Ports of one State over those of another: nor shall Vessels bound to, 253 | or from, one State, be obliged to enter, clear, or pay Duties in another. 254 | 255 | No Money shall be drawn from the Treasury, but in Consequence 256 | of Appropriations made by Law; and a regular Statement and Account 257 | of the Receipts and Expenditures of all public Money shall be 258 | published from time to time. 259 | 260 | No Title of Nobility shall be granted by the United States; 261 | and no Person holding any Office of Profit or Trust under them, shall, 262 | without the Consent of the Congress, accept of any present, Emolument, 263 | Office, or Title, of any kind whatever, from any King, Prince, 264 | or foreign State. 265 | 266 | Section 10. No State shall enter into any Treaty, Alliance, or 267 | Confederation; grant Letters of Marque and Reprisal; coin Money; 268 | emit Bills of Credit; make any Thing but gold and silver Coin a Tender 269 | in Payment of Debts; pass any Bill of Attainder, ex post facto Law, 270 | or Law impairing the Obligation of Contracts, or grant any Title of Nobility. 271 | 272 | No State shall, without the Consent of the Congress, lay any Imposts or Duties 273 | on Imports or Exports, except what may be absolutely necessary for executing 274 | it's inspection Laws: and the net Produce of all Duties and Imposts, 275 | laid by any State on Imports or Exports, shall be for the Use of the Treasury 276 | of the United States; and all such Laws shall be subject to the Revision 277 | and Controul of the Congress. 278 | 279 | 280 | No State shall, without the Consent of Congress, lay any Duty of 281 | Tonnage, keep Troops, or Ships of War in time of Peace, enter into any 282 | Agreement or Compact with another State, or with a foreign Power, or 283 | engage in War, unless actually invaded, or in such imminent Danger 284 | as will not admit of delay. 285 | 286 | ARTICLE 2 287 | 288 | Section 1. The executive Power shall be vested in a President 289 | of the United States of America. He shall hold his Office during 290 | the Term of four Years, and, together with the Vice President 291 | chosen for the same Term, be elected, as follows: 292 | 293 | Each State shall appoint, in such Manner as the Legislature thereof may direct, 294 | a Number of Electors, equal to the whole Number of Senators and Representatives 295 | to which the State may be entitled in the Congress: but no Senator or 296 | Representative, or Person holding an Office of Trust or Profit under 297 | the United States, shall be appointed an Elector. 298 | 299 | The Electors shall meet in their respective States, and vote by Ballot 300 | for two Persons, of whom one at least shall not be an Inhabitant of 301 | the same State with themselves. And they shall make a List of 302 | all the Persons voted for, and of the Number of Votes for each; 303 | which List they shall sign and certify, and transmit sealed to 304 | the Seat of the Government of the United States, directed to the 305 | President of the Senate. The President of the Senate shall, 306 | in the Presence of the Senate and House of Representatives, 307 | open all the Certificates, and the Votes shall then be counted. 308 | The Person having the greatest Number of Votes shall be the President, 309 | if such Number be a Majority of the whole Number of Electors appointed; 310 | and if there be more than one who have such Majority, and have an equal 311 | Number of votes, then the House of Representatives shall immediately 312 | chuse by Ballot one of them for President; and if no Person have 313 | a Majority, then from the five highest on the List the said House 314 | shall in like Manner chuse the President. But in chusing the President, 315 | the Votes shall be taken by States, the Representation from each State 316 | having one Vote; a Quorum for this Purpose shall consist of a Member 317 | or Members from two thirds of the States, and a Majority of all the 318 | States shall be necessary to a Choice. In every Case, after the Choice 319 | of the President, the Person having the greatest Number of Votes of 320 | the Electors shall be the Vice President. But if there should remain 321 | two or more who have equal Votes, the Senate shall chuse from them 322 | by Ballot the Vice President. 323 | 324 | The Congress may determine the Time of chusing the Electors, 325 | and the Day on which they shall give their Votes; which Day 326 | shall be the same throughout the United States. 327 | 328 | No Person except a natural born Citizen, or a Citizen of the United States, 329 | at the time of the Adoption of this Constitution, shall be eligible to 330 | the Office of President; neither shall any Person be eligible to that 331 | Office who shall not have attained to the Age of thirty five Years, 332 | and been fourteen Years a Resident within the United States. 333 | 334 | In Case of the Removal of the President from Office, or of his Death, 335 | Resignation, or Inability to discharge the Powers and Duties of the 336 | said Office, the Same shall devolve on the Vice President, and the 337 | Congress may by Law provide for the Case of Removal, Death, Resignation 338 | or Inability, both of the President and Vice President, declaring what 339 | Officer shall then act as President, and such Officer shall act accordingly, 340 | until the Disability be removed, or a President shall be elected. 341 | 342 | The President shall, at stated Times, receive for his Services, 343 | a Compensation, which shall neither be encreased nor diminished during 344 | the Period for which he shall have been elected, and he shall not receive 345 | within that Period any other Emolument from the United States, or any of them. 346 | 347 | Before he enter on the Execution of his Office, he shall take the 348 | following Oath or Affirmation:--"I do solemnly swear (or affirm) that 349 | I will faithfully execute the Office of President of the United States, 350 | and will to the best of my Ability, preserve, protect and defend the 351 | Constitution of the United States." 352 | 353 | Section 2. The President shall be Commander in Chief of the Army 354 | and Navy of the United States, and of the Militia of the several States, 355 | when called into the actual Service of the United States; 356 | he may require the Opinion, in writing, of the principal Officer 357 | in each of the executive Departments, upon any Subject relating to 358 | the Duties of their respective Offices, and he shall have Power 359 | to grant Reprieves and Pardons for Offenses against the United States, 360 | except in Cases of impeachment. 361 | 362 | He shall have Power, by and with the Advice and Consent of the 363 | Senate, to make Treaties, provided two thirds of the Senators 364 | present concur; and he shall nominate, and by and with the Advice 365 | and Consent of the Senate, shall appoint Ambassadors, other public 366 | Ministers and Consuls, Judges of the supreme Court, and all other 367 | Officers of the United States, whose Appointments are not herein 368 | otherwise provided for, and which shall be established by Law: 369 | but the Congress may by Law vest the Appointment of such inferior Officers, 370 | as they think proper, in the President alone, in the Courts of Law, 371 | or in the Heads of Departments. 372 | 373 | The President shall have Power to fill up all Vacancies that may happen 374 | during the Recess of the Senate, by granting Commissions which shall 375 | expire at the End of their next session. 376 | 377 | Section 3. He shall from time to time give to the Congress 378 | Information of the State of the Union, and recommend to their 379 | Consideration such Measures as he shall judge necessary and expedient; 380 | he may, on extraordinary Occasions, convene both Houses, or either 381 | of them, and in Case of Disagreement between them, with Respect to 382 | the Time of Adjournment, he may adjourn them to such Time as he shall 383 | think proper; he shall receive Ambassadors and other public Ministers; 384 | he shall take Care that the Laws be faithfully executed, and shall 385 | Commission all the Officers of the United States. 386 | 387 | Section 4. The President, Vice President and all civil Officers of the 388 | United States, shall be removed from Office on Impeachment for, 389 | and Conviction of, Treason, Bribery, or other high Crimes and Misdemeanors. 390 | 391 | ARTICLE THREE 392 | 393 | Section 1. The judicial Power of the United States, shall be vested 394 | in one supreme Court, and in such inferior Courts as the Congress may 395 | from time to time ordain and establish. The Judges, both of the supreme 396 | and inferior Courts, shall hold their Offices during good behavior, 397 | and shall, at stated Times, receive for their Services, a Compensation, 398 | which shall not be diminished during their Continuance in Office. 399 | 400 | Section 2. The judicial Power shall extend to all Cases, in Law and Equity, 401 | arising under this Constitution, the Laws of the United States, and Treaties 402 | made, or which shall be made, under their Authority;--to all Cases affecting 403 | Ambassadors, other public Ministers and Consuls;--to all Cases of admiralty 404 | and maritime Jurisdiction;--to Controversies to which the United States 405 | shall be a Party;--to Controversies between two or more States;--between a 406 | State and Citizens of another State;--between Citizens of different States; 407 | --between Citizens of the same State claiming Lands under Grants of 408 | different States, and between a State, or the Citizens thereof, 409 | and foreign States, Citizens or Subjects. 410 | 411 | In all cases affecting Ambassadors, other public Ministers and Consuls, 412 | and those in which a State shall be Party, the supreme Court shall have 413 | original Jurisdiction. In all the other Cases before mentioned, the 414 | supreme Court shall have appellate Jurisdiction, both as to Law and Fact, 415 | with such Exceptions, and under such Regulations as the Congress shall make. 416 | 417 | The Trial of all Crimes, except in Cases of Impeachment, shall be by Jury; 418 | and such Trial shall be held in the State where the said Crimes shall 419 | have been committed; but when not committed within any State, the Trial 420 | shall be at such Place or Places as the Congress may by Law have directed. 421 | 422 | Section 3. Treason against the United States, shall consist only in 423 | levying War against them, or in adhering to their Enemies, giving them 424 | Aid and Comfort. No Person shall be convicted of Treason unless on 425 | the Testimony of two Witnesses to the same overt Act, or on Confession 426 | in open Court. 427 | 428 | The Congress shall have power to declare the punishment of Treason, 429 | but no Attainder of Treason shall work Corruption of Blood, 430 | or Forfeiture except during the Life of the Person attainted. 431 | 432 | 433 | ARTICLE FOUR 434 | 435 | Section 1. Full Faith and Credit shall be given in each State to the 436 | public Acts, Records, and judicial Proceedings of every other State. 437 | And the Congress may by general Laws prescribe the Manner in which such Acts, 438 | Records, and Proceedings shall be proved, and the Effect thereof. 439 | 440 | 441 | Section 2. The Citizens of each State shall be entitled to all 442 | Privileges and Immunities of Citizens in the several States. 443 | 444 | A Person charged in any State with Treason, Felony, or other Crime, 445 | who shall flee from Justice, and be found in another State, 446 | shall on Demand of the executive Authority of the State from 447 | which he fled, be delivered up, to be removed to the State having 448 | Jurisdiction of the Crime. 449 | 450 | No person held to Service or Labor in one State, under the Laws thereof, 451 | escaping into another, shall, in Consequence of any Law or Regulation therein, 452 | be discharged from such Service or Labor, But shall be delivered up on Claim 453 | of the Party to whom such Service or Labor may be due. 454 | 455 | 456 | Section 3. New States may be admitted by the Congress into this Union; 457 | but no new States shall be formed or erected within the Jurisdiction 458 | of any other State; nor any State be formed by the Junction of two 459 | or more States, or Parts of States, without the Consent of the 460 | Legislatures of the States concerned as well as of the Congress. 461 | 462 | The Congress shall have Power to dispose of and make all needful Rules 463 | and Regulations respecting the Territory or other Property belonging 464 | to the United States; and nothing in this Constitution shall be so 465 | construed as to Prejudice any Claims of the United States, 466 | or of any particular State. 467 | 468 | Section 4. The United States shall guarantee to every State in this Union 469 | a Republican Form of Government, and shall protect each of them against 470 | Invasion; and on Application of the Legislature, or of the Executive 471 | (when the Legislature cannot be convened) against domestic Violence. 472 | 473 | 474 | ARTICLE FIVE 475 | 476 | The Congress, whenever two thirds of both Houses shall deem it necessary, 477 | shall propose Amendments to this Constitution, or, on the Application of 478 | the Legislatures of two thirds of the several States, shall call a Convention 479 | for proposing Amendments, which, in either Case, shall be valid to all Intents 480 | and Purposes, as Part of this Constitution, when ratified by the Legislatures 481 | of three fourths of the several States, or by Conventions in three fourths 482 | thereof, as the one or the other Mode of Ratification may be proposed by 483 | the Congress; Provided that no Amendment which may be made prior to the 484 | Year one thousand eight hundred and eight shall in any Manner affect 485 | the first and fourth Clauses in the ninth Section of the first Article; 486 | and that no State, without its Consent, shall be deprived of it's 487 | equal Suffrage in the Senate. 488 | 489 | ARTICLE SIX 490 | 491 | All Debts contracted and Engagements entered into, before the Adoption 492 | of this Constitution, shall be as valid against the United States 493 | under this Constitution, as under the Confederation. 494 | 495 | This Constitution, and the Laws of the United States which shall be made 496 | in Pursuance thereof; and all Treaties made, or which shall be made, 497 | under the Authority of the United States, shall be the supreme 498 | Law of the Land; and the Judges in every State shall be bound thereby, 499 | any Thing in the Constitution or Laws of any State to the Contrary 500 | notwithstanding. 501 | 502 | The Senators and Representatives before mentioned, and the Members of the 503 | several State Legislatures, and all executive and judicial Officers, 504 | both of the United States and of the several States, shall be bound 505 | by Oath or Affirmation, to support this Constitution; but no religious 506 | Test shall ever be required as a Qualification to any Office or public Trust 507 | under the United States 508 | 509 | ARTICLE SEVEN 510 | 511 | The Ratification of the Conventions of nine States, shall be sufficient for the 512 | Establishment of this Constitution between the States so ratifying the Same. 513 | 514 | Done in Convention by the Unanimous Consent of the States present 515 | the Seventeenth Day of September in the Year of our Lord one 516 | thousand seven hundred and eighty seven and of the Independence of the 517 | United States of America the Twelfth In Witness whereof We have 518 | hereunto subscribed our Names, 519 | 520 | Go. WASHINGTON-- 521 | Presid. and deputy from Virginia 522 | 523 | New Hampshire 524 | 525 | John Langdon 526 | Nicholas Gilman 527 | 528 | Massachusetts 529 | 530 | Nathaniel Gorham 531 | Rufus King 532 | 533 | Connecticut 534 | 535 | Wm. Saml. Johnson 536 | Roger Sherman 537 | 538 | New York 539 | 540 | Alexander Hamilton 541 | 542 | New Jersey 543 | 544 | Wil: Livingston 545 | David Brearley 546 | Wm. Paterson 547 | Jona: Dayton 548 | 549 | Pennsylvania 550 | 551 | B Franklin 552 | Thomas Mifflin 553 | Robt Morris 554 | Geo. Clymer 555 | Thos FitzSimons 556 | Jared Ingersoll 557 | James Wilson 558 | Gouv Morris 559 | 560 | Delaware 561 | 562 | Geo: Read 563 | Gunning Bedford jun 564 | John Dickinson 565 | Richard Bassett 566 | Jaco: Broom 567 | 568 | Maryland 569 | 570 | James Mchenry 571 | Dan of St Thos. Jenifer 572 | Danl Carroll 573 | 574 | Virginia 575 | 576 | John Blair-- 577 | James Madison Jr. 578 | 579 | North Carolina 580 | 581 | Wm. Blount 582 | Rich'd Dobbs Spaight 583 | Hu Williamson 584 | 585 | South Carolina 586 | 587 | J. Rutledge 588 | Charles Cotesworth Pinckney 589 | Charles Pinckney 590 | Pierce Butler 591 | 592 | Georgia 593 | 594 | William Few 595 | Abr Baldwin 596 | 597 | 598 | Attest: 599 | William Jackson, Secretary 600 | -------------------------------------------------------------------------------- /Sources/Hyphenation/Patterns/hyph-en-us.pat.swift: -------------------------------------------------------------------------------- 1 | // © 1990, 2004, 2005 Gerard D.C. Kuiken 2 | // Copying and distribution of this file, with or without modification, 3 | // are permitted in any medium without royalty provided the copyright 4 | // notice and this notice are preserved. 5 | // 6 | // https://github.com/hyphenation/tex-hyphen/blob/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.pat.txt 7 | 8 | // swiftlint:disable file_length 9 | 10 | extension String { 11 | /// A string containing the default English patterns. 12 | internal static let defaultPatterns = """ 13 | .ach4 14 | .ad4der 15 | .af1t 16 | .al3t 17 | .am5at 18 | .an5c 19 | .ang4 20 | .ani5m 21 | .ant4 22 | .an3te 23 | .anti5s 24 | .ar5s 25 | .ar4tie 26 | .ar4ty 27 | .as3c 28 | .as1p 29 | .as1s 30 | .aster5 31 | .atom5 32 | .au1d 33 | .av4i 34 | .awn4 35 | .ba4g 36 | .ba5na 37 | .bas4e 38 | .ber4 39 | .be5ra 40 | .be3sm 41 | .be5sto 42 | .bri2 43 | .but4ti 44 | .cam4pe 45 | .can5c 46 | .capa5b 47 | .car5ol 48 | .ca4t 49 | .ce4la 50 | .ch4 51 | .chill5i 52 | .ci2 53 | .cit5r 54 | .co3e 55 | .co4r 56 | .cor5ner 57 | .de4moi 58 | .de3o 59 | .de3ra 60 | .de3ri 61 | .des4c 62 | .dictio5 63 | .do4t 64 | .du4c 65 | .dumb5 66 | .earth5 67 | .eas3i 68 | .eb4 69 | .eer4 70 | .eg2 71 | .el5d 72 | .el3em 73 | .enam3 74 | .en3g 75 | .en3s 76 | .eq5ui5t 77 | .er4ri 78 | .es3 79 | .eu3 80 | .eye5 81 | .fes3 82 | .for5mer 83 | .ga2 84 | .ge2 85 | .gen3t4 86 | .ge5og 87 | .gi5a 88 | .gi4b 89 | .go4r 90 | .hand5i 91 | .han5k 92 | .he2 93 | .hero5i 94 | .hes3 95 | .het3 96 | .hi3b 97 | .hi3er 98 | .hon5ey 99 | .hon3o 100 | .hov5 101 | .id4l 102 | .idol3 103 | .im3m 104 | .im5pin 105 | .in1 106 | .in3ci 107 | .ine2 108 | .in2k 109 | .in3s 110 | .ir5r 111 | .is4i 112 | .ju3r 113 | .la4cy 114 | .la4m 115 | .lat5er 116 | .lath5 117 | .le2 118 | .leg5e 119 | .len4 120 | .lep5 121 | .lev1 122 | .li4g 123 | .lig5a 124 | .li2n 125 | .li3o 126 | .li4t 127 | .mag5a5 128 | .mal5o 129 | .man5a 130 | .mar5ti 131 | .me2 132 | .mer3c 133 | .me5ter 134 | .mis1 135 | .mist5i 136 | .mon3e 137 | .mo3ro 138 | .mu5ta 139 | .muta5b 140 | .ni4c 141 | .od2 142 | .odd5 143 | .of5te 144 | .or5ato 145 | .or3c 146 | .or1d 147 | .or3t 148 | .os3 149 | .os4tl 150 | .oth3 151 | .out3 152 | .ped5al 153 | .pe5te 154 | .pe5tit 155 | .pi4e 156 | .pio5n 157 | .pi2t 158 | .pre3m 159 | .ra4c 160 | .ran4t 161 | .ratio5na 162 | .ree2 163 | .re5mit 164 | .res2 165 | .re5stat 166 | .ri4g 167 | .rit5u 168 | .ro4q 169 | .ros5t 170 | .row5d 171 | .ru4d 172 | .sci3e 173 | .self5 174 | .sell5 175 | .se2n 176 | .se5rie 177 | .sh2 178 | .si2 179 | .sing4 180 | .st4 181 | .sta5bl 182 | .sy2 183 | .ta4 184 | .te4 185 | .ten5an 186 | .th2 187 | .ti2 188 | .til4 189 | .tim5o5 190 | .ting4 191 | .tin5k 192 | .ton4a 193 | .to4p 194 | .top5i 195 | .tou5s 196 | .trib5ut 197 | .un1a 198 | .un3ce 199 | .under5 200 | .un1e 201 | .un5k 202 | .un5o 203 | .un3u 204 | .up3 205 | .ure3 206 | .us5a 207 | .ven4de 208 | .ve5ra 209 | .wil5i 210 | .ye4 211 | 4ab. 212 | a5bal 213 | a5ban 214 | abe2 215 | ab5erd 216 | abi5a 217 | ab5it5ab 218 | ab5lat 219 | ab5o5liz 220 | 4abr 221 | ab5rog 222 | ab3ul 223 | a4car 224 | ac5ard 225 | ac5aro 226 | a5ceou 227 | ac1er 228 | a5chet 229 | 4a2ci 230 | a3cie 231 | ac1in 232 | a3cio 233 | ac5rob 234 | act5if 235 | ac3ul 236 | ac4um 237 | a2d 238 | ad4din 239 | ad5er. 240 | 2adi 241 | a3dia 242 | ad3ica 243 | adi4er 244 | a3dio 245 | a3dit 246 | a5diu 247 | ad4le 248 | ad3ow 249 | ad5ran 250 | ad4su 251 | 4adu 252 | a3duc 253 | ad5um 254 | ae4r 255 | aeri4e 256 | a2f 257 | aff4 258 | a4gab 259 | aga4n 260 | ag5ell 261 | age4o 262 | 4ageu 263 | ag1i 264 | 4ag4l 265 | ag1n 266 | a2go 267 | 3agog 268 | ag3oni 269 | a5guer 270 | ag5ul 271 | a4gy 272 | a3ha 273 | a3he 274 | ah4l 275 | a3ho 276 | ai2 277 | a5ia 278 | a3ic. 279 | ai5ly 280 | a4i4n 281 | ain5in 282 | ain5o 283 | ait5en 284 | a1j 285 | ak1en 286 | al5ab 287 | al3ad 288 | a4lar 289 | 4aldi 290 | 2ale 291 | al3end 292 | a4lenti 293 | a5le5o 294 | al1i 295 | al4ia. 296 | ali4e 297 | al5lev 298 | 4allic 299 | 4alm 300 | a5log. 301 | a4ly. 302 | 4alys 303 | 5a5lyst 304 | 5alyt 305 | 3alyz 306 | 4ama 307 | am5ab 308 | am3ag 309 | ama5ra 310 | am5asc 311 | a4matis 312 | a4m5ato 313 | am5era 314 | am3ic 315 | am5if 316 | am5ily 317 | am1in 318 | ami4no 319 | a2mo 320 | a5mon 321 | amor5i 322 | amp5en 323 | a2n 324 | an3age 325 | 3analy 326 | a3nar 327 | an3arc 328 | anar4i 329 | a3nati 330 | 4and 331 | ande4s 332 | an3dis 333 | an1dl 334 | an4dow 335 | a5nee 336 | a3nen 337 | an5est. 338 | a3neu 339 | 2ang 340 | ang5ie 341 | an1gl 342 | a4n1ic 343 | a3nies 344 | an3i3f 345 | an4ime 346 | a5nimi 347 | a5nine 348 | an3io 349 | a3nip 350 | an3ish 351 | an3it 352 | a3niu 353 | an4kli 354 | 5anniz 355 | ano4 356 | an5ot 357 | anoth5 358 | an2sa 359 | an4sco 360 | an4sn 361 | an2sp 362 | ans3po 363 | an4st 364 | an4sur 365 | antal4 366 | an4tie 367 | 4anto 368 | an2tr 369 | an4tw 370 | an3ua 371 | an3ul 372 | a5nur 373 | 4ao 374 | apar4 375 | ap5at 376 | ap5ero 377 | a3pher 378 | 4aphi 379 | a4pilla 380 | ap5illar 381 | ap3in 382 | ap3ita 383 | a3pitu 384 | a2pl 385 | apoc5 386 | ap5ola 387 | apor5i 388 | apos3t 389 | aps5es 390 | a3pu 391 | aque5 392 | 2a2r 393 | ar3act 394 | a5rade 395 | ar5adis 396 | ar3al 397 | a5ramete 398 | aran4g 399 | ara3p 400 | ar4at 401 | a5ratio 402 | ar5ativ 403 | a5rau 404 | ar5av4 405 | araw4 406 | arbal4 407 | ar4chan 408 | ar5dine 409 | ar4dr 410 | ar5eas 411 | a3ree 412 | ar3ent 413 | a5ress 414 | ar4fi 415 | ar4fl 416 | ar1i 417 | ar5ial 418 | ar3ian 419 | a3riet 420 | ar4im 421 | ar5inat 422 | ar3io 423 | ar2iz 424 | ar2mi 425 | ar5o5d 426 | a5roni 427 | a3roo 428 | ar2p 429 | ar3q 430 | arre4 431 | ar4sa 432 | ar2sh 433 | 4as. 434 | as4ab 435 | as3ant 436 | ashi4 437 | a5sia. 438 | a3sib 439 | a3sic 440 | 5a5si4t 441 | ask3i 442 | as4l 443 | a4soc 444 | as5ph 445 | as4sh 446 | as3ten 447 | as1tr 448 | asur5a 449 | a2ta 450 | at3abl 451 | at5ac 452 | at3alo 453 | at5ap 454 | ate5c 455 | at5ech 456 | at3ego 457 | at3en. 458 | at3era 459 | ater5n 460 | a5terna 461 | at3est 462 | at5ev 463 | 4ath 464 | ath5em 465 | a5then 466 | at4ho 467 | ath5om 468 | 4ati. 469 | a5tia 470 | at5i5b 471 | at1ic 472 | at3if 473 | ation5ar 474 | at3itu 475 | a4tog 476 | a2tom 477 | at5omiz 478 | a4top 479 | a4tos 480 | a1tr 481 | at5rop 482 | at4sk 483 | at4tag 484 | at5te 485 | at4th 486 | a2tu 487 | at5ua 488 | at5ue 489 | at3ul 490 | at3ura 491 | a2ty 492 | au4b 493 | augh3 494 | au3gu 495 | au4l2 496 | aun5d 497 | au3r 498 | au5sib 499 | aut5en 500 | au1th 501 | a2va 502 | av3ag 503 | a5van 504 | ave4no 505 | av3era 506 | av5ern 507 | av5ery 508 | av1i 509 | avi4er 510 | av3ig 511 | av5oc 512 | a1vor 513 | 3away 514 | aw3i 515 | aw4ly 516 | aws4 517 | ax4ic 518 | ax4id 519 | ay5al 520 | aye4 521 | ays4 522 | azi4er 523 | azz5i 524 | 5ba. 525 | bad5ger 526 | ba4ge 527 | bal1a 528 | ban5dag 529 | ban4e 530 | ban3i 531 | barbi5 532 | bari4a 533 | bas4si 534 | 1bat 535 | ba4z 536 | 2b1b 537 | b2be 538 | b3ber 539 | bbi4na 540 | 4b1d 541 | 4be. 542 | beak4 543 | beat3 544 | 4be2d 545 | be3da 546 | be3de 547 | be3di 548 | be3gi 549 | be5gu 550 | 1bel 551 | be1li 552 | be3lo 553 | 4be5m 554 | be5nig 555 | be5nu 556 | 4bes4 557 | be3sp 558 | be5str 559 | 3bet 560 | bet5iz 561 | be5tr 562 | be3tw 563 | be3w 564 | be5yo 565 | 2bf 566 | 4b3h 567 | bi2b 568 | bi4d 569 | 3bie 570 | bi5en 571 | bi4er 572 | 2b3if 573 | 1bil 574 | bi3liz 575 | bina5r4 576 | bin4d 577 | bi5net 578 | bi3ogr 579 | bi5ou 580 | bi2t 581 | 3bi3tio 582 | bi3tr 583 | 3bit5ua 584 | b5itz 585 | b1j 586 | bk4 587 | b2l2 588 | blath5 589 | b4le. 590 | blen4 591 | 5blesp 592 | b3lis 593 | b4lo 594 | blun4t 595 | 4b1m 596 | 4b3n 597 | bne5g 598 | 3bod 599 | bod3i 600 | bo4e 601 | bol3ic 602 | bom4bi 603 | bon4a 604 | bon5at 605 | 3boo 606 | 5bor. 607 | 4b1ora 608 | bor5d 609 | 5bore 610 | 5bori 611 | 5bos4 612 | b5ota 613 | both5 614 | bo4to 615 | bound3 616 | 4bp 617 | 4brit 618 | broth3 619 | 2b5s2 620 | bsor4 621 | 2bt 622 | bt4l 623 | b4to 624 | b3tr 625 | buf4fer 626 | bu4ga 627 | bu3li 628 | bumi4 629 | bu4n 630 | bunt4i 631 | bu3re 632 | bus5ie 633 | buss4e 634 | 5bust 635 | 4buta 636 | 3butio 637 | b5uto 638 | b1v 639 | 4b5w 640 | 5by. 641 | bys4 642 | 1ca 643 | cab3in 644 | ca1bl 645 | cach4 646 | ca5den 647 | 4cag4 648 | 2c5ah 649 | ca3lat 650 | cal4la 651 | call5in 652 | 4calo 653 | can5d 654 | can4e 655 | can4ic 656 | can5is 657 | can3iz 658 | can4ty 659 | cany4 660 | ca5per 661 | car5om 662 | cast5er 663 | cas5tig 664 | 4casy 665 | ca4th 666 | 4cativ 667 | cav5al 668 | c3c 669 | ccha5 670 | cci4a 671 | ccompa5 672 | ccon4 673 | ccou3t 674 | 2ce. 675 | 4ced. 676 | 4ceden 677 | 3cei 678 | 5cel. 679 | 3cell 680 | 1cen 681 | 3cenc 682 | 2cen4e 683 | 4ceni 684 | 3cent 685 | 3cep 686 | ce5ram 687 | 4cesa 688 | 3cessi 689 | ces5si5b 690 | ces5t 691 | cet4 692 | c5e4ta 693 | cew4 694 | 2ch 695 | 4ch. 696 | 4ch3ab 697 | 5chanic 698 | ch5a5nis 699 | che2 700 | cheap3 701 | 4ched 702 | che5lo 703 | 3chemi 704 | ch5ene 705 | ch3er. 706 | ch3ers 707 | 4ch1in 708 | 5chine. 709 | ch5iness 710 | 5chini 711 | 5chio 712 | 3chit 713 | chi2z 714 | 3cho2 715 | ch4ti 716 | 1ci 717 | 3cia 718 | ci2a5b 719 | cia5r 720 | ci5c 721 | 4cier 722 | 5cific. 723 | 4cii 724 | ci4la 725 | 3cili 726 | 2cim 727 | 2cin 728 | c4ina 729 | 3cinat 730 | cin3em 731 | c1ing 732 | c5ing. 733 | 5cino 734 | cion4 735 | 4cipe 736 | ci3ph 737 | 4cipic 738 | 4cista 739 | 4cisti 740 | 2c1it 741 | cit3iz 742 | 5ciz 743 | ck1 744 | ck3i 745 | 1c4l4 746 | 4clar 747 | c5laratio 748 | 5clare 749 | cle4m 750 | 4clic 751 | clim4 752 | cly4 753 | c5n 754 | 1co 755 | co5ag 756 | coe2 757 | 2cog 758 | co4gr 759 | coi4 760 | co3inc 761 | col5i 762 | 5colo 763 | col3or 764 | com5er 765 | con4a 766 | c4one 767 | con3g 768 | con5t 769 | co3pa 770 | cop3ic 771 | co4pl 772 | 4corb 773 | coro3n 774 | cos4e 775 | cov1 776 | cove4 777 | cow5a 778 | coz5e 779 | co5zi 780 | c1q 781 | cras5t 782 | 5crat. 783 | 5cratic 784 | cre3at 785 | 5cred 786 | 4c3reta 787 | cre4v 788 | cri2 789 | cri5f 790 | c4rin 791 | cris4 792 | 5criti 793 | cro4pl 794 | crop5o 795 | cros4e 796 | cru4d 797 | 4c3s2 798 | 2c1t 799 | cta4b 800 | ct5ang 801 | c5tant 802 | c2te 803 | c3ter 804 | c4ticu 805 | ctim3i 806 | ctu4r 807 | c4tw 808 | cud5 809 | c4uf 810 | c4ui 811 | cu5ity 812 | 5culi 813 | cul4tis 814 | 3cultu 815 | cu2ma 816 | c3ume 817 | cu4mi 818 | 3cun 819 | cu3pi 820 | cu5py 821 | cur5a4b 822 | cu5ria 823 | 1cus 824 | cuss4i 825 | 3c4ut 826 | cu4tie 827 | 4c5utiv 828 | 4cutr 829 | 1cy 830 | cze4 831 | 1d2a 832 | 5da. 833 | 2d3a4b 834 | dach4 835 | 4daf 836 | 2dag 837 | da2m2 838 | dan3g 839 | dard5 840 | dark5 841 | 4dary 842 | 3dat 843 | 4dativ 844 | 4dato 845 | 5dav4 846 | dav5e 847 | 5day 848 | d1b 849 | d5c 850 | d1d4 851 | 2de. 852 | deaf5 853 | deb5it 854 | de4bon 855 | decan4 856 | de4cil 857 | de5com 858 | 2d1ed 859 | 4dee. 860 | de5if 861 | deli4e 862 | del5i5q 863 | de5lo 864 | d4em 865 | 5dem. 866 | 3demic 867 | dem5ic. 868 | de5mil 869 | de4mons 870 | demor5 871 | 1den 872 | de4nar 873 | de3no 874 | denti5f 875 | de3nu 876 | de1p 877 | de3pa 878 | depi4 879 | de2pu 880 | d3eq 881 | d4erh 882 | 5derm 883 | dern5iz 884 | der5s 885 | des2 886 | d2es. 887 | de1sc 888 | de2s5o 889 | des3ti 890 | de3str 891 | de4su 892 | de1t 893 | de2to 894 | de1v 895 | dev3il 896 | 4dey 897 | 4d1f 898 | d4ga 899 | d3ge4t 900 | dg1i 901 | d2gy 902 | d1h2 903 | 5di. 904 | 1d4i3a 905 | dia5b 906 | di4cam 907 | d4ice 908 | 3dict 909 | 3did 910 | 5di3en 911 | d1if 912 | di3ge 913 | di4lato 914 | d1in 915 | 1dina 916 | 3dine. 917 | 5dini 918 | di5niz 919 | 1dio 920 | dio5g 921 | di4pl 922 | dir2 923 | di1re 924 | dirt5i 925 | dis1 926 | 5disi 927 | d4is3t 928 | d2iti 929 | 1di1v 930 | d1j 931 | d5k2 932 | 4d5la 933 | 3dle. 934 | 3dled 935 | 3dles. 936 | 4dless 937 | 2d3lo 938 | 4d5lu 939 | 2dly 940 | d1m 941 | 4d1n4 942 | 1do 943 | 3do. 944 | do5de 945 | 5doe 946 | 2d5of 947 | d4og 948 | do4la 949 | doli4 950 | do5lor 951 | dom5iz 952 | do3nat 953 | doni4 954 | doo3d 955 | dop4p 956 | d4or 957 | 3dos 958 | 4d5out 959 | do4v 960 | 3dox 961 | d1p 962 | 1dr 963 | drag5on 964 | 4drai 965 | dre4 966 | drea5r 967 | 5dren 968 | dri4b 969 | dril4 970 | dro4p 971 | 4drow 972 | 5drupli 973 | 4dry 974 | 2d1s2 975 | ds4p 976 | d4sw 977 | d4sy 978 | d2th 979 | 1du 980 | d1u1a 981 | du2c 982 | d1uca 983 | duc5er 984 | 4duct. 985 | 4ducts 986 | du5el 987 | du4g 988 | d3ule 989 | dum4be 990 | du4n 991 | 4dup 992 | du4pe 993 | d1v 994 | d1w 995 | d2y 996 | 5dyn 997 | dy4se 998 | dys5p 999 | e1a4b 1000 | e3act 1001 | ead1 1002 | ead5ie 1003 | ea4ge 1004 | ea5ger 1005 | ea4l 1006 | eal5er 1007 | eal3ou 1008 | eam3er 1009 | e5and 1010 | ear3a 1011 | ear4c 1012 | ear5es 1013 | ear4ic 1014 | ear4il 1015 | ear5k 1016 | ear2t 1017 | eart3e 1018 | ea5sp 1019 | e3ass 1020 | east3 1021 | ea2t 1022 | eat5en 1023 | eath3i 1024 | e5atif 1025 | e4a3tu 1026 | ea2v 1027 | eav3en 1028 | eav5i 1029 | eav5o 1030 | 2e1b 1031 | e4bel. 1032 | e4bels 1033 | e4ben 1034 | e4bit 1035 | e3br 1036 | e4cad 1037 | ecan5c 1038 | ecca5 1039 | e1ce 1040 | ec5essa 1041 | ec2i 1042 | e4cib 1043 | ec5ificat 1044 | ec5ifie 1045 | ec5ify 1046 | ec3im 1047 | eci4t 1048 | e5cite 1049 | e4clam 1050 | e4clus 1051 | e2col 1052 | e4comm 1053 | e4compe 1054 | e4conc 1055 | e2cor 1056 | ec3ora 1057 | eco5ro 1058 | e1cr 1059 | e4crem 1060 | ec4tan 1061 | ec4te 1062 | e1cu 1063 | e4cul 1064 | ec3ula 1065 | 2e2da 1066 | 4ed3d 1067 | e4d1er 1068 | ede4s 1069 | 4edi 1070 | e3dia 1071 | ed3ib 1072 | ed3ica 1073 | ed3im 1074 | ed1it 1075 | edi5z 1076 | 4edo 1077 | e4dol 1078 | edon2 1079 | e4dri 1080 | e4dul 1081 | ed5ulo 1082 | ee2c 1083 | eed3i 1084 | ee2f 1085 | eel3i 1086 | ee4ly 1087 | ee2m 1088 | ee4na 1089 | ee4p1 1090 | ee2s4 1091 | eest4 1092 | ee4ty 1093 | e5ex 1094 | e1f 1095 | e4f3ere 1096 | 1eff 1097 | e4fic 1098 | 5efici 1099 | efil4 1100 | e3fine 1101 | ef5i5nite 1102 | 3efit 1103 | efor5es 1104 | e4fuse. 1105 | 4egal 1106 | eger4 1107 | eg5ib 1108 | eg4ic 1109 | eg5ing 1110 | e5git5 1111 | eg5n 1112 | e4go. 1113 | e4gos 1114 | eg1ul 1115 | e5gur 1116 | 5egy 1117 | e1h4 1118 | eher4 1119 | ei2 1120 | e5ic 1121 | ei5d 1122 | eig2 1123 | ei5gl 1124 | e3imb 1125 | e3inf 1126 | e1ing 1127 | e5inst 1128 | eir4d 1129 | eit3e 1130 | ei3th 1131 | e5ity 1132 | e1j 1133 | e4jud 1134 | ej5udi 1135 | eki4n 1136 | ek4la 1137 | e1la 1138 | e4la. 1139 | e4lac 1140 | elan4d 1141 | el5ativ 1142 | e4law 1143 | elaxa4 1144 | e3lea 1145 | el5ebra 1146 | 5elec 1147 | e4led 1148 | el3ega 1149 | e5len 1150 | e4l1er 1151 | e1les 1152 | el2f 1153 | el2i 1154 | e3libe 1155 | e4l5ic. 1156 | el3ica 1157 | e3lier 1158 | el5igib 1159 | e5lim 1160 | e4l3ing 1161 | e3lio 1162 | e2lis 1163 | el5ish 1164 | e3liv3 1165 | 4ella 1166 | el4lab 1167 | ello4 1168 | e5loc 1169 | el5og 1170 | el3op. 1171 | el2sh 1172 | el4ta 1173 | e5lud 1174 | el5ug 1175 | e4mac 1176 | e4mag 1177 | e5man 1178 | em5ana 1179 | em5b 1180 | e1me 1181 | e2mel 1182 | e4met 1183 | em3ica 1184 | emi4e 1185 | em5igra 1186 | em1in2 1187 | em5ine 1188 | em3i3ni 1189 | e4mis 1190 | em5ish 1191 | e5miss 1192 | em3iz 1193 | 5emniz 1194 | emo4g 1195 | emoni5o 1196 | em3pi 1197 | e4mul 1198 | em5ula 1199 | emu3n 1200 | e3my 1201 | en5amo 1202 | e4nant 1203 | ench4er 1204 | en3dic 1205 | e5nea 1206 | e5nee 1207 | en3em 1208 | en5ero 1209 | en5esi 1210 | en5est 1211 | en3etr 1212 | e3new 1213 | en5ics 1214 | e5nie 1215 | e5nil 1216 | e3nio 1217 | en3ish 1218 | en3it 1219 | e5niu 1220 | 5eniz 1221 | 4enn 1222 | 4eno 1223 | eno4g 1224 | e4nos 1225 | en3ov 1226 | en4sw 1227 | ent5age 1228 | 4enthes 1229 | en3ua 1230 | en5uf 1231 | e3ny. 1232 | 4en3z 1233 | e5of 1234 | eo2g 1235 | e4oi4 1236 | e3ol 1237 | eop3ar 1238 | e1or 1239 | eo3re 1240 | eo5rol 1241 | eos4 1242 | e4ot 1243 | eo4to 1244 | e5out 1245 | e5ow 1246 | e2pa 1247 | e3pai 1248 | ep5anc 1249 | e5pel 1250 | e3pent 1251 | ep5etitio 1252 | ephe4 1253 | e4pli 1254 | e1po 1255 | e4prec 1256 | ep5reca 1257 | e4pred 1258 | ep3reh 1259 | e3pro 1260 | e4prob 1261 | ep4sh 1262 | ep5ti5b 1263 | e4put 1264 | ep5uta 1265 | e1q 1266 | equi3l 1267 | e4q3ui3s 1268 | er1a 1269 | era4b 1270 | 4erand 1271 | er3ar 1272 | 4erati. 1273 | 2erb 1274 | er4bl 1275 | er3ch 1276 | er4che 1277 | 2ere. 1278 | e3real 1279 | ere5co 1280 | ere3in 1281 | er5el. 1282 | er3emo 1283 | er5ena 1284 | er5ence 1285 | 4erene 1286 | er3ent 1287 | ere4q 1288 | er5ess 1289 | er3est 1290 | eret4 1291 | er1h 1292 | er1i 1293 | e1ria4 1294 | 5erick 1295 | e3rien 1296 | eri4er 1297 | er3ine 1298 | e1rio 1299 | 4erit 1300 | er4iu 1301 | eri4v 1302 | e4riva 1303 | er3m4 1304 | er4nis 1305 | 4ernit 1306 | 5erniz 1307 | er3no 1308 | 2ero 1309 | er5ob 1310 | e5roc 1311 | ero4r 1312 | er1ou 1313 | er1s 1314 | er3set 1315 | ert3er 1316 | 4ertl 1317 | er3tw 1318 | 4eru 1319 | eru4t 1320 | 5erwau 1321 | e1s4a 1322 | e4sage. 1323 | e4sages 1324 | es2c 1325 | e2sca 1326 | es5can 1327 | e3scr 1328 | es5cu 1329 | e1s2e 1330 | e2sec 1331 | es5ecr 1332 | es5enc 1333 | e4sert. 1334 | e4serts 1335 | e4serva 1336 | 4esh 1337 | e3sha 1338 | esh5en 1339 | e1si 1340 | e2sic 1341 | e2sid 1342 | es5iden 1343 | es5igna 1344 | e2s5im 1345 | es4i4n 1346 | esis4te 1347 | esi4u 1348 | e5skin 1349 | es4mi 1350 | e2sol 1351 | es3olu 1352 | e2son 1353 | es5ona 1354 | e1sp 1355 | es3per 1356 | es5pira 1357 | es4pre 1358 | 2ess 1359 | es4si4b 1360 | estan4 1361 | es3tig 1362 | es5tim 1363 | 4es2to 1364 | e3ston 1365 | 2estr 1366 | e5stro 1367 | estruc5 1368 | e2sur 1369 | es5urr 1370 | es4w 1371 | eta4b 1372 | eten4d 1373 | e3teo 1374 | ethod3 1375 | et1ic 1376 | e5tide 1377 | etin4 1378 | eti4no 1379 | e5tir 1380 | e5titio 1381 | et5itiv 1382 | 4etn 1383 | et5ona 1384 | e3tra 1385 | e3tre 1386 | et3ric 1387 | et5rif 1388 | et3rog 1389 | et5ros 1390 | et3ua 1391 | et5ym 1392 | et5z 1393 | 4eu 1394 | e5un 1395 | e3up 1396 | eu3ro 1397 | eus4 1398 | eute4 1399 | euti5l 1400 | eu5tr 1401 | eva2p5 1402 | e2vas 1403 | ev5ast 1404 | e5vea 1405 | ev3ell 1406 | evel3o 1407 | e5veng 1408 | even4i 1409 | ev1er 1410 | e5verb 1411 | e1vi 1412 | ev3id 1413 | evi4l 1414 | e4vin 1415 | evi4v 1416 | e5voc 1417 | e5vu 1418 | e1wa 1419 | e4wag 1420 | e5wee 1421 | e3wh 1422 | ewil5 1423 | ew3ing 1424 | e3wit 1425 | 1exp 1426 | 5eyc 1427 | 5eye. 1428 | eys4 1429 | 1fa 1430 | fa3bl 1431 | fab3r 1432 | fa4ce 1433 | 4fag 1434 | fain4 1435 | fall5e 1436 | 4fa4ma 1437 | fam5is 1438 | 5far 1439 | far5th 1440 | fa3ta 1441 | fa3the 1442 | 4fato 1443 | fault5 1444 | 4f5b 1445 | 4fd 1446 | 4fe. 1447 | feas4 1448 | feath3 1449 | fe4b 1450 | 4feca 1451 | 5fect 1452 | 2fed 1453 | fe3li 1454 | fe4mo 1455 | fen2d 1456 | fend5e 1457 | fer1 1458 | 5ferr 1459 | fev4 1460 | 4f1f 1461 | f4fes 1462 | f4fie 1463 | f5fin. 1464 | f2f5is 1465 | f4fly 1466 | f2fy 1467 | 4fh 1468 | 1fi 1469 | fi3a 1470 | 2f3ic. 1471 | 4f3ical 1472 | f3ican 1473 | 4ficate 1474 | f3icen 1475 | fi3cer 1476 | fic4i 1477 | 5ficia 1478 | 5ficie 1479 | 4fics 1480 | fi3cu 1481 | fi5del 1482 | fight5 1483 | fil5i 1484 | fill5in 1485 | 4fily 1486 | 2fin 1487 | 5fina 1488 | fin2d5 1489 | fi2ne 1490 | f1in3g 1491 | fin4n 1492 | fis4ti 1493 | f4l2 1494 | f5less 1495 | flin4 1496 | flo3re 1497 | f2ly5 1498 | 4fm 1499 | 4fn 1500 | 1fo 1501 | 5fon 1502 | fon4de 1503 | fon4t 1504 | fo2r 1505 | fo5rat 1506 | for5ay 1507 | fore5t 1508 | for4i 1509 | fort5a 1510 | fos5 1511 | 4f5p 1512 | fra4t 1513 | f5rea 1514 | fres5c 1515 | fri2 1516 | fril4 1517 | frol5 1518 | 2f3s 1519 | 2ft 1520 | f4to 1521 | f2ty 1522 | 3fu 1523 | fu5el 1524 | 4fug 1525 | fu4min 1526 | fu5ne 1527 | fu3ri 1528 | fusi4 1529 | fus4s 1530 | 4futa 1531 | 1fy 1532 | 1ga 1533 | gaf4 1534 | 5gal. 1535 | 3gali 1536 | ga3lo 1537 | 2gam 1538 | ga5met 1539 | g5amo 1540 | gan5is 1541 | ga3niz 1542 | gani5za 1543 | 4gano 1544 | gar5n4 1545 | gass4 1546 | gath3 1547 | 4gativ 1548 | 4gaz 1549 | g3b 1550 | gd4 1551 | 2ge. 1552 | 2ged 1553 | geez4 1554 | gel4in 1555 | ge5lis 1556 | ge5liz 1557 | 4gely 1558 | 1gen 1559 | ge4nat 1560 | ge5niz 1561 | 4geno 1562 | 4geny 1563 | 1geo 1564 | ge3om 1565 | g4ery 1566 | 5gesi 1567 | geth5 1568 | 4geto 1569 | ge4ty 1570 | ge4v 1571 | 4g1g2 1572 | g2ge 1573 | g3ger 1574 | gglu5 1575 | ggo4 1576 | gh3in 1577 | gh5out 1578 | gh4to 1579 | 5gi. 1580 | 1gi4a 1581 | gia5r 1582 | g1ic 1583 | 5gicia 1584 | g4ico 1585 | gien5 1586 | 5gies. 1587 | gil4 1588 | g3imen 1589 | 3g4in. 1590 | gin5ge 1591 | 5g4ins 1592 | 5gio 1593 | 3gir 1594 | gir4l 1595 | g3isl 1596 | gi4u 1597 | 5giv 1598 | 3giz 1599 | gl2 1600 | gla4 1601 | glad5i 1602 | 5glas 1603 | 1gle 1604 | gli4b 1605 | g3lig 1606 | 3glo 1607 | glo3r 1608 | g1m 1609 | g4my 1610 | gn4a 1611 | g4na. 1612 | gnet4t 1613 | g1ni 1614 | g2nin 1615 | g4nio 1616 | g1no 1617 | g4non 1618 | 1go 1619 | 3go. 1620 | gob5 1621 | 5goe 1622 | 3g4o4g 1623 | go3is 1624 | gon2 1625 | 4g3o3na 1626 | gondo5 1627 | go3ni 1628 | 5goo 1629 | go5riz 1630 | gor5ou 1631 | 5gos. 1632 | gov1 1633 | g3p 1634 | 1gr 1635 | 4grada 1636 | g4rai 1637 | gran2 1638 | 5graph. 1639 | g5rapher 1640 | 5graphic 1641 | 4graphy 1642 | 4gray 1643 | gre4n 1644 | 4gress. 1645 | 4grit 1646 | g4ro 1647 | gruf4 1648 | gs2 1649 | g5ste 1650 | gth3 1651 | gu4a 1652 | 3guard 1653 | 2gue 1654 | 5gui5t 1655 | 3gun 1656 | 3gus 1657 | 4gu4t 1658 | g3w 1659 | 1gy 1660 | 2g5y3n 1661 | gy5ra 1662 | h3ab4l 1663 | hach4 1664 | hae4m 1665 | hae4t 1666 | h5agu 1667 | ha3la 1668 | hala3m 1669 | ha4m 1670 | han4ci 1671 | han4cy 1672 | 5hand. 1673 | han4g 1674 | hang5er 1675 | hang5o 1676 | h5a5niz 1677 | han4k 1678 | han4te 1679 | hap3l 1680 | hap5t 1681 | ha3ran 1682 | ha5ras 1683 | har2d 1684 | hard3e 1685 | har4le 1686 | harp5en 1687 | har5ter 1688 | has5s 1689 | haun4 1690 | 5haz 1691 | haz3a 1692 | h1b 1693 | 1head 1694 | 3hear 1695 | he4can 1696 | h5ecat 1697 | h4ed 1698 | he5do5 1699 | he3l4i 1700 | hel4lis 1701 | hel4ly 1702 | h5elo 1703 | hem4p 1704 | he2n 1705 | hena4 1706 | hen5at 1707 | heo5r 1708 | hep5 1709 | h4era 1710 | hera3p 1711 | her4ba 1712 | here5a 1713 | h3ern 1714 | h5erou 1715 | h3ery 1716 | h1es 1717 | he2s5p 1718 | he4t 1719 | het4ed 1720 | heu4 1721 | h1f 1722 | h1h 1723 | hi5an 1724 | hi4co 1725 | high5 1726 | h4il2 1727 | himer4 1728 | h4ina 1729 | hion4e 1730 | hi4p 1731 | hir4l 1732 | hi3ro 1733 | hir4p 1734 | hir4r 1735 | his3el 1736 | his4s 1737 | hith5er 1738 | hi2v 1739 | 4hk 1740 | 4h1l4 1741 | hlan4 1742 | h2lo 1743 | hlo3ri 1744 | 4h1m 1745 | hmet4 1746 | 2h1n 1747 | h5odiz 1748 | h5ods 1749 | ho4g 1750 | hoge4 1751 | hol5ar 1752 | 3hol4e 1753 | ho4ma 1754 | home3 1755 | hon4a 1756 | ho5ny 1757 | 3hood 1758 | hoon4 1759 | hor5at 1760 | ho5ris 1761 | hort3e 1762 | ho5ru 1763 | hos4e 1764 | ho5sen 1765 | hos1p 1766 | 1hous 1767 | house3 1768 | hov5el 1769 | 4h5p 1770 | 4hr4 1771 | hree5 1772 | hro5niz 1773 | hro3po 1774 | 4h1s2 1775 | h4sh 1776 | h4tar 1777 | ht1en 1778 | ht5es 1779 | h4ty 1780 | hu4g 1781 | hu4min 1782 | hun5ke 1783 | hun4t 1784 | hus3t4 1785 | hu4t 1786 | h1w 1787 | h4wart 1788 | hy3pe 1789 | hy3ph 1790 | hy2s 1791 | 2i1a 1792 | i2al 1793 | iam4 1794 | iam5ete 1795 | i2an 1796 | 4ianc 1797 | ian3i 1798 | 4ian4t 1799 | ia5pe 1800 | iass4 1801 | i4ativ 1802 | ia4tric 1803 | i4atu 1804 | ibe4 1805 | ib3era 1806 | ib5ert 1807 | ib5ia 1808 | ib3in 1809 | ib5it. 1810 | ib5ite 1811 | i1bl 1812 | ib3li 1813 | i5bo 1814 | i1br 1815 | i2b5ri 1816 | i5bun 1817 | 4icam 1818 | 5icap 1819 | 4icar 1820 | i4car. 1821 | i4cara 1822 | icas5 1823 | i4cay 1824 | iccu4 1825 | 4iceo 1826 | 4ich 1827 | 2ici 1828 | i5cid 1829 | ic5ina 1830 | i2cip 1831 | ic3ipa 1832 | i4cly 1833 | i2c5oc 1834 | 4i1cr 1835 | 5icra 1836 | i4cry 1837 | ic4te 1838 | ictu2 1839 | ic4t3ua 1840 | ic3ula 1841 | ic4um 1842 | ic5uo 1843 | i3cur 1844 | 2id 1845 | i4dai 1846 | id5anc 1847 | id5d 1848 | ide3al 1849 | ide4s 1850 | i2di 1851 | id5ian 1852 | idi4ar 1853 | i5die 1854 | id3io 1855 | idi5ou 1856 | id1it 1857 | id5iu 1858 | i3dle 1859 | i4dom 1860 | id3ow 1861 | i4dr 1862 | i2du 1863 | id5uo 1864 | 2ie4 1865 | ied4e 1866 | 5ie5ga 1867 | ield3 1868 | ien5a4 1869 | ien4e 1870 | i5enn 1871 | i3enti 1872 | i1er. 1873 | i3esc 1874 | i1est 1875 | i3et 1876 | 4if. 1877 | if5ero 1878 | iff5en 1879 | if4fr 1880 | 4ific. 1881 | i3fie 1882 | i3fl 1883 | 4ift 1884 | 2ig 1885 | iga5b 1886 | ig3era 1887 | ight3i 1888 | 4igi 1889 | i3gib 1890 | ig3il 1891 | ig3in 1892 | ig3it 1893 | i4g4l 1894 | i2go 1895 | ig3or 1896 | ig5ot 1897 | i5gre 1898 | igu5i 1899 | ig1ur 1900 | i3h 1901 | 4i5i4 1902 | i3j 1903 | 4ik 1904 | i1la 1905 | il3a4b 1906 | i4lade 1907 | i2l5am 1908 | ila5ra 1909 | i3leg 1910 | il1er 1911 | ilev4 1912 | il5f 1913 | il1i 1914 | il3ia 1915 | il2ib 1916 | il3io 1917 | il4ist 1918 | 2ilit 1919 | il2iz 1920 | ill5ab 1921 | 4iln 1922 | il3oq 1923 | il4ty 1924 | il5ur 1925 | il3v 1926 | i4mag 1927 | im3age 1928 | ima5ry 1929 | imenta5r 1930 | 4imet 1931 | im1i 1932 | im5ida 1933 | imi5le 1934 | i5mini 1935 | 4imit 1936 | im4ni 1937 | i3mon 1938 | i2mu 1939 | im3ula 1940 | 2in. 1941 | i4n3au 1942 | 4inav 1943 | incel4 1944 | in3cer 1945 | 4ind 1946 | in5dling 1947 | 2ine 1948 | i3nee 1949 | iner4ar 1950 | i5ness 1951 | 4inga 1952 | 4inge 1953 | in5gen 1954 | 4ingi 1955 | in5gling 1956 | 4ingo 1957 | 4ingu 1958 | 2ini 1959 | i5ni. 1960 | i4nia 1961 | in3io 1962 | in1is 1963 | i5nite. 1964 | 5initio 1965 | in3ity 1966 | 4ink 1967 | 4inl 1968 | 2inn 1969 | 2i1no 1970 | i4no4c 1971 | ino4s 1972 | i4not 1973 | 2ins 1974 | in3se 1975 | insur5a 1976 | 2int. 1977 | 2in4th 1978 | in1u 1979 | i5nus 1980 | 4iny 1981 | 2io 1982 | 4io. 1983 | ioge4 1984 | io2gr 1985 | i1ol 1986 | io4m 1987 | ion3at 1988 | ion4ery 1989 | ion3i 1990 | io5ph 1991 | ior3i 1992 | i4os 1993 | io5th 1994 | i5oti 1995 | io4to 1996 | i4our 1997 | 2ip 1998 | ipe4 1999 | iphras4 2000 | ip3i 2001 | ip4ic 2002 | ip4re4 2003 | ip3ul 2004 | i3qua 2005 | iq5uef 2006 | iq3uid 2007 | iq3ui3t 2008 | 4ir 2009 | i1ra 2010 | ira4b 2011 | i4rac 2012 | ird5e 2013 | ire4de 2014 | i4ref 2015 | i4rel4 2016 | i4res 2017 | ir5gi 2018 | ir1i 2019 | iri5de 2020 | ir4is 2021 | iri3tu 2022 | 5i5r2iz 2023 | ir4min 2024 | iro4g 2025 | 5iron. 2026 | ir5ul 2027 | 2is. 2028 | is5ag 2029 | is3ar 2030 | isas5 2031 | 2is1c 2032 | is3ch 2033 | 4ise 2034 | is3er 2035 | 3isf 2036 | is5han 2037 | is3hon 2038 | ish5op 2039 | is3ib 2040 | isi4d 2041 | i5sis 2042 | is5itiv 2043 | 4is4k 2044 | islan4 2045 | 4isms 2046 | i2so 2047 | iso5mer 2048 | is1p 2049 | is2pi 2050 | is4py 2051 | 4is1s 2052 | is4sal 2053 | issen4 2054 | is4ses 2055 | is4ta. 2056 | is1te 2057 | is1ti 2058 | ist4ly 2059 | 4istral 2060 | i2su 2061 | is5us 2062 | 4ita. 2063 | ita4bi 2064 | i4tag 2065 | 4ita5m 2066 | i3tan 2067 | i3tat 2068 | 2ite 2069 | it3era 2070 | i5teri 2071 | it4es 2072 | 2ith 2073 | i1ti 2074 | 4itia 2075 | 4i2tic 2076 | it3ica 2077 | 5i5tick 2078 | it3ig 2079 | it5ill 2080 | i2tim 2081 | 2itio 2082 | 4itis 2083 | i4tism 2084 | i2t5o5m 2085 | 4iton 2086 | i4tram 2087 | it5ry 2088 | 4itt 2089 | it3uat 2090 | i5tud 2091 | it3ul 2092 | 4itz. 2093 | i1u 2094 | 2iv 2095 | iv3ell 2096 | iv3en. 2097 | i4v3er. 2098 | i4vers. 2099 | iv5il. 2100 | iv5io 2101 | iv1it 2102 | i5vore 2103 | iv3o3ro 2104 | i4v3ot 2105 | 4i5w 2106 | ix4o 2107 | 4iy 2108 | 4izar 2109 | izi4 2110 | 5izont 2111 | 5ja 2112 | jac4q 2113 | ja4p 2114 | 1je 2115 | jer5s 2116 | 4jestie 2117 | 4jesty 2118 | jew3 2119 | jo4p 2120 | 5judg 2121 | 3ka. 2122 | k3ab 2123 | k5ag 2124 | kais4 2125 | kal4 2126 | k1b 2127 | k2ed 2128 | 1kee 2129 | ke4g 2130 | ke5li 2131 | k3en4d 2132 | k1er 2133 | kes4 2134 | k3est. 2135 | ke4ty 2136 | k3f 2137 | kh4 2138 | k1i 2139 | 5ki. 2140 | 5k2ic 2141 | k4ill 2142 | kilo5 2143 | k4im 2144 | k4in. 2145 | kin4de 2146 | k5iness 2147 | kin4g 2148 | ki4p 2149 | kis4 2150 | k5ish 2151 | kk4 2152 | k1l 2153 | 4kley 2154 | 4kly 2155 | k1m 2156 | k5nes 2157 | 1k2no 2158 | ko5r 2159 | kosh4 2160 | k3ou 2161 | kro5n 2162 | 4k1s2 2163 | k4sc 2164 | ks4l 2165 | k4sy 2166 | k5t 2167 | k1w 2168 | lab3ic 2169 | l4abo 2170 | laci4 2171 | l4ade 2172 | la3dy 2173 | lag4n 2174 | lam3o 2175 | 3land 2176 | lan4dl 2177 | lan5et 2178 | lan4te 2179 | lar4g 2180 | lar3i 2181 | las4e 2182 | la5tan 2183 | 4lateli 2184 | 4lativ 2185 | 4lav 2186 | la4v4a 2187 | 2l1b 2188 | lbin4 2189 | 4l1c2 2190 | lce4 2191 | l3ci 2192 | 2ld 2193 | l2de 2194 | ld4ere 2195 | ld4eri 2196 | ldi4 2197 | ld5is 2198 | l3dr 2199 | l4dri 2200 | le2a 2201 | le4bi 2202 | left5 2203 | 5leg. 2204 | 5legg 2205 | le4mat 2206 | lem5atic 2207 | 4len. 2208 | 3lenc 2209 | 5lene. 2210 | 1lent 2211 | le3ph 2212 | le4pr 2213 | lera5b 2214 | ler4e 2215 | 3lerg 2216 | 3l4eri 2217 | l4ero 2218 | les2 2219 | le5sco 2220 | 5lesq 2221 | 3less 2222 | 5less. 2223 | l3eva 2224 | lev4er. 2225 | lev4era 2226 | lev4ers 2227 | 3ley 2228 | 4leye 2229 | 2lf 2230 | l5fr 2231 | 4l1g4 2232 | l5ga 2233 | lgar3 2234 | l4ges 2235 | lgo3 2236 | 2l3h 2237 | li4ag 2238 | li2am 2239 | liar5iz 2240 | li4as 2241 | li4ato 2242 | li5bi 2243 | 5licio 2244 | li4cor 2245 | 4lics 2246 | 4lict. 2247 | l4icu 2248 | l3icy 2249 | l3ida 2250 | lid5er 2251 | 3lidi 2252 | lif3er 2253 | l4iff 2254 | li4fl 2255 | 5ligate 2256 | 3ligh 2257 | li4gra 2258 | 3lik 2259 | 4l4i4l 2260 | lim4bl 2261 | lim3i 2262 | li4mo 2263 | l4im4p 2264 | l4ina 2265 | 1l4ine 2266 | lin3ea 2267 | lin3i 2268 | link5er 2269 | li5og 2270 | 4l4iq 2271 | lis4p 2272 | l1it 2273 | l2it. 2274 | 5litica 2275 | l5i5tics 2276 | liv3er 2277 | l1iz 2278 | 4lj 2279 | lka3 2280 | l3kal 2281 | lka4t 2282 | l1l 2283 | l4law 2284 | l2le 2285 | l5lea 2286 | l3lec 2287 | l3leg 2288 | l3lel 2289 | l3le4n 2290 | l3le4t 2291 | ll2i 2292 | l2lin4 2293 | l5lina 2294 | ll4o 2295 | lloqui5 2296 | ll5out 2297 | l5low 2298 | 2lm 2299 | l5met 2300 | lm3ing 2301 | l4mod 2302 | lmon4 2303 | 2l1n2 2304 | 3lo. 2305 | lob5al 2306 | lo4ci 2307 | 4lof 2308 | 3logic 2309 | l5ogo 2310 | 3logu 2311 | lom3er 2312 | 5long 2313 | lon4i 2314 | l3o3niz 2315 | lood5 2316 | 5lope. 2317 | lop3i 2318 | l3opm 2319 | lora4 2320 | lo4rato 2321 | lo5rie 2322 | lor5ou 2323 | 5los. 2324 | los5et 2325 | 5losophiz 2326 | 5losophy 2327 | los4t 2328 | lo4ta 2329 | loun5d 2330 | 2lout 2331 | 4lov 2332 | 2lp 2333 | lpa5b 2334 | l3pha 2335 | l5phi 2336 | lp5ing 2337 | l3pit 2338 | l4pl 2339 | l5pr 2340 | 4l1r 2341 | 2l1s2 2342 | l4sc 2343 | l2se 2344 | l4sie 2345 | 4lt 2346 | lt5ag 2347 | ltane5 2348 | l1te 2349 | lten4 2350 | ltera4 2351 | lth3i 2352 | l5ties. 2353 | ltis4 2354 | l1tr 2355 | ltu2 2356 | ltur3a 2357 | lu5a 2358 | lu3br 2359 | luch4 2360 | lu3ci 2361 | lu3en 2362 | luf4 2363 | lu5id 2364 | lu4ma 2365 | 5lumi 2366 | l5umn. 2367 | 5lumnia 2368 | lu3o 2369 | luo3r 2370 | 4lup 2371 | luss4 2372 | lus3te 2373 | 1lut 2374 | l5ven 2375 | l5vet4 2376 | 2l1w 2377 | 1ly 2378 | 4lya 2379 | 4lyb 2380 | ly5me 2381 | ly3no 2382 | 2lys4 2383 | l5yse 2384 | 1ma 2385 | 2mab 2386 | ma2ca 2387 | ma5chine 2388 | ma4cl 2389 | mag5in 2390 | 5magn 2391 | 2mah 2392 | maid5 2393 | 4mald 2394 | ma3lig 2395 | ma5lin 2396 | mal4li 2397 | mal4ty 2398 | 5mania 2399 | man5is 2400 | man3iz 2401 | 4map 2402 | ma5rine. 2403 | ma5riz 2404 | mar4ly 2405 | mar3v 2406 | ma5sce 2407 | mas4e 2408 | mas1t 2409 | 5mate 2410 | math3 2411 | ma3tis 2412 | 4matiza 2413 | 4m1b 2414 | mba4t5 2415 | m5bil 2416 | m4b3ing 2417 | mbi4v 2418 | 4m5c 2419 | 4me. 2420 | 2med 2421 | 4med. 2422 | 5media 2423 | me3die 2424 | m5e5dy 2425 | me2g 2426 | mel5on 2427 | mel4t 2428 | me2m 2429 | mem1o3 2430 | 1men 2431 | men4a 2432 | men5ac 2433 | men4de 2434 | 4mene 2435 | men4i 2436 | mens4 2437 | mensu5 2438 | 3ment 2439 | men4te 2440 | me5on 2441 | m5ersa 2442 | 2mes 2443 | 3mesti 2444 | me4ta 2445 | met3al 2446 | me1te 2447 | me5thi 2448 | m4etr 2449 | 5metric 2450 | me5trie 2451 | me3try 2452 | me4v 2453 | 4m1f 2454 | 2mh 2455 | 5mi. 2456 | mi3a 2457 | mid4a 2458 | mid4g 2459 | mig4 2460 | 3milia 2461 | m5i5lie 2462 | m4ill 2463 | min4a 2464 | 3mind 2465 | m5inee 2466 | m4ingl 2467 | min5gli 2468 | m5ingly 2469 | min4t 2470 | m4inu 2471 | miot4 2472 | m2is 2473 | mis4er. 2474 | mis5l 2475 | mis4ti 2476 | m5istry 2477 | 4mith 2478 | m2iz 2479 | 4mk 2480 | 4m1l 2481 | m1m 2482 | mma5ry 2483 | 4m1n 2484 | mn4a 2485 | m4nin 2486 | mn4o 2487 | 1mo 2488 | 4mocr 2489 | 5mocratiz 2490 | mo2d1 2491 | mo4go 2492 | mois2 2493 | moi5se 2494 | 4mok 2495 | mo5lest 2496 | mo3me 2497 | mon5et 2498 | mon5ge 2499 | moni3a 2500 | mon4ism 2501 | mon4ist 2502 | mo3niz 2503 | monol4 2504 | mo3ny. 2505 | mo2r 2506 | 4mora. 2507 | mos2 2508 | mo5sey 2509 | mo3sp 2510 | moth3 2511 | m5ouf 2512 | 3mous 2513 | mo2v 2514 | 4m1p 2515 | mpara5 2516 | mpa5rab 2517 | mpar5i 2518 | m3pet 2519 | mphas4 2520 | m2pi 2521 | mpi4a 2522 | mp5ies 2523 | m4p1in 2524 | m5pir 2525 | mp5is 2526 | mpo3ri 2527 | mpos5ite 2528 | m4pous 2529 | mpov5 2530 | mp4tr 2531 | m2py 2532 | 4m3r 2533 | 4m1s2 2534 | m4sh 2535 | m5si 2536 | 4mt 2537 | 1mu 2538 | mula5r4 2539 | 5mult 2540 | multi3 2541 | 3mum 2542 | mun2 2543 | 4mup 2544 | mu4u 2545 | 4mw 2546 | 1na 2547 | 2n1a2b 2548 | n4abu 2549 | 4nac. 2550 | na4ca 2551 | n5act 2552 | nag5er. 2553 | nak4 2554 | na4li 2555 | na5lia 2556 | 4nalt 2557 | na5mit 2558 | n2an 2559 | nanci4 2560 | nan4it 2561 | nank4 2562 | nar3c 2563 | 4nare 2564 | nar3i 2565 | nar4l 2566 | n5arm 2567 | n4as 2568 | nas4c 2569 | nas5ti 2570 | n2at 2571 | na3tal 2572 | nato5miz 2573 | n2au 2574 | nau3se 2575 | 3naut 2576 | nav4e 2577 | 4n1b4 2578 | ncar5 2579 | n4ces. 2580 | n3cha 2581 | n5cheo 2582 | n5chil 2583 | n3chis 2584 | nc1in 2585 | nc4it 2586 | ncour5a 2587 | n1cr 2588 | n1cu 2589 | n4dai 2590 | n5dan 2591 | n1de 2592 | nd5est. 2593 | ndi4b 2594 | n5d2if 2595 | n1dit 2596 | n3diz 2597 | n5duc 2598 | ndu4r 2599 | nd2we 2600 | 2ne. 2601 | n3ear 2602 | ne2b 2603 | neb3u 2604 | ne2c 2605 | 5neck 2606 | 2ned 2607 | ne4gat 2608 | neg5ativ 2609 | 5nege 2610 | ne4la 2611 | nel5iz 2612 | ne5mi 2613 | ne4mo 2614 | 1nen 2615 | 4nene 2616 | 3neo 2617 | ne4po 2618 | ne2q 2619 | n1er 2620 | nera5b 2621 | n4erar 2622 | n2ere 2623 | n4er5i 2624 | ner4r 2625 | 1nes 2626 | 2nes. 2627 | 4nesp 2628 | 2nest 2629 | 4nesw 2630 | 3netic 2631 | ne4v 2632 | n5eve 2633 | ne4w 2634 | n3f 2635 | n4gab 2636 | n3gel 2637 | nge4n4e 2638 | n5gere 2639 | n3geri 2640 | ng5ha 2641 | n3gib 2642 | ng1in 2643 | n5git 2644 | n4gla 2645 | ngov4 2646 | ng5sh 2647 | n1gu 2648 | n4gum 2649 | n2gy 2650 | 4n1h4 2651 | nha4 2652 | nhab3 2653 | nhe4 2654 | 3n4ia 2655 | ni3an 2656 | ni4ap 2657 | ni3ba 2658 | ni4bl 2659 | ni4d 2660 | ni5di 2661 | ni4er 2662 | ni2fi 2663 | ni5ficat 2664 | n5igr 2665 | nik4 2666 | n1im 2667 | ni3miz 2668 | n1in 2669 | 5nine. 2670 | nin4g 2671 | ni4o 2672 | 5nis. 2673 | nis4ta 2674 | n2it 2675 | n4ith 2676 | 3nitio 2677 | n3itor 2678 | ni3tr 2679 | n1j 2680 | 4nk2 2681 | n5kero 2682 | n3ket 2683 | nk3in 2684 | n1kl 2685 | 4n1l 2686 | n5m 2687 | nme4 2688 | nmet4 2689 | 4n1n2 2690 | nne4 2691 | nni3al 2692 | nni4v 2693 | nob4l 2694 | no3ble 2695 | n5ocl 2696 | 4n3o2d 2697 | 3noe 2698 | 4nog 2699 | noge4 2700 | nois5i 2701 | no5l4i 2702 | 5nologis 2703 | 3nomic 2704 | n5o5miz 2705 | no4mo 2706 | no3my 2707 | no4n 2708 | non4ag 2709 | non5i 2710 | n5oniz 2711 | 4nop 2712 | 5nop5o5li 2713 | nor5ab 2714 | no4rary 2715 | 4nosc 2716 | nos4e 2717 | nos5t 2718 | no5ta 2719 | 1nou 2720 | 3noun 2721 | nov3el3 2722 | nowl3 2723 | n1p4 2724 | npi4 2725 | npre4c 2726 | n1q 2727 | n1r 2728 | nru4 2729 | 2n1s2 2730 | ns5ab 2731 | nsati4 2732 | ns4c 2733 | n2se 2734 | n4s3es 2735 | nsid1 2736 | nsig4 2737 | n2sl 2738 | ns3m 2739 | n4soc 2740 | ns4pe 2741 | n5spi 2742 | nsta5bl 2743 | n1t 2744 | nta4b 2745 | nter3s 2746 | nt2i 2747 | n5tib 2748 | nti4er 2749 | nti2f 2750 | n3tine 2751 | n4t3ing 2752 | nti4p 2753 | ntrol5li 2754 | nt4s 2755 | ntu3me 2756 | nu1a 2757 | nu4d 2758 | nu5en 2759 | nuf4fe 2760 | n3uin 2761 | 3nu3it 2762 | n4um 2763 | nu1me 2764 | n5umi 2765 | 3nu4n 2766 | n3uo 2767 | nu3tr 2768 | n1v2 2769 | n1w4 2770 | nym4 2771 | nyp4 2772 | 4nz 2773 | n3za 2774 | 4oa 2775 | oad3 2776 | o5a5les 2777 | oard3 2778 | oas4e 2779 | oast5e 2780 | oat5i 2781 | ob3a3b 2782 | o5bar 2783 | obe4l 2784 | o1bi 2785 | o2bin 2786 | ob5ing 2787 | o3br 2788 | ob3ul 2789 | o1ce 2790 | och4 2791 | o3chet 2792 | ocif3 2793 | o4cil 2794 | o4clam 2795 | o4cod 2796 | oc3rac 2797 | oc5ratiz 2798 | ocre3 2799 | 5ocrit 2800 | octor5a 2801 | oc3ula 2802 | o5cure 2803 | od5ded 2804 | od3ic 2805 | odi3o 2806 | o2do4 2807 | odor3 2808 | od5uct. 2809 | od5ucts 2810 | o4el 2811 | o5eng 2812 | o3er 2813 | oe4ta 2814 | o3ev 2815 | o2fi 2816 | of5ite 2817 | ofit4t 2818 | o2g5a5r 2819 | og5ativ 2820 | o4gato 2821 | o1ge 2822 | o5gene 2823 | o5geo 2824 | o4ger 2825 | o3gie 2826 | 1o1gis 2827 | og3it 2828 | o4gl 2829 | o5g2ly 2830 | 3ogniz 2831 | o4gro 2832 | ogu5i 2833 | 1ogy 2834 | 2ogyn 2835 | o1h2 2836 | ohab5 2837 | oi2 2838 | oic3es 2839 | oi3der 2840 | oiff4 2841 | oig4 2842 | oi5let 2843 | o3ing 2844 | oint5er 2845 | o5ism 2846 | oi5son 2847 | oist5en 2848 | oi3ter 2849 | o5j 2850 | 2ok 2851 | o3ken 2852 | ok5ie 2853 | o1la 2854 | o4lan 2855 | olass4 2856 | ol2d 2857 | old1e 2858 | ol3er 2859 | o3lesc 2860 | o3let 2861 | ol4fi 2862 | ol2i 2863 | o3lia 2864 | o3lice 2865 | ol5id. 2866 | o3li4f 2867 | o5lil 2868 | ol3ing 2869 | o5lio 2870 | o5lis. 2871 | ol3ish 2872 | o5lite 2873 | o5litio 2874 | o5liv 2875 | olli4e 2876 | ol5ogiz 2877 | olo4r 2878 | ol5pl 2879 | ol2t 2880 | ol3ub 2881 | ol3ume 2882 | ol3un 2883 | o5lus 2884 | ol2v 2885 | o2ly 2886 | om5ah 2887 | oma5l 2888 | om5atiz 2889 | om2be 2890 | om4bl 2891 | o2me 2892 | om3ena 2893 | om5erse 2894 | o4met 2895 | om5etry 2896 | o3mia 2897 | om3ic. 2898 | om3ica 2899 | o5mid 2900 | om1in 2901 | o5mini 2902 | 5ommend 2903 | omo4ge 2904 | o4mon 2905 | om3pi 2906 | ompro5 2907 | o2n 2908 | on1a 2909 | on4ac 2910 | o3nan 2911 | on1c 2912 | 3oncil 2913 | 2ond 2914 | on5do 2915 | o3nen 2916 | on5est 2917 | on4gu 2918 | on1ic 2919 | o3nio 2920 | on1is 2921 | o5niu 2922 | on3key 2923 | on4odi 2924 | on3omy 2925 | on3s 2926 | onspi4 2927 | onspir5a 2928 | onsu4 2929 | onten4 2930 | on3t4i 2931 | ontif5 2932 | on5um 2933 | onva5 2934 | oo2 2935 | ood5e 2936 | ood5i 2937 | oo4k 2938 | oop3i 2939 | o3ord 2940 | oost5 2941 | o2pa 2942 | ope5d 2943 | op1er 2944 | 3opera 2945 | 4operag 2946 | 2oph 2947 | o5phan 2948 | o5pher 2949 | op3ing 2950 | o3pit 2951 | o5pon 2952 | o4posi 2953 | o1pr 2954 | op1u 2955 | opy5 2956 | o1q 2957 | o1ra 2958 | o5ra. 2959 | o4r3ag 2960 | or5aliz 2961 | or5ange 2962 | ore5a 2963 | o5real 2964 | or3ei 2965 | ore5sh 2966 | or5est. 2967 | orew4 2968 | or4gu 2969 | 4o5ria 2970 | or3ica 2971 | o5ril 2972 | or1in 2973 | o1rio 2974 | or3ity 2975 | o3riu 2976 | or2mi 2977 | orn2e 2978 | o5rof 2979 | or3oug 2980 | or5pe 2981 | 3orrh 2982 | or4se 2983 | ors5en 2984 | orst4 2985 | or3thi 2986 | or3thy 2987 | or4ty 2988 | o5rum 2989 | o1ry 2990 | os3al 2991 | os2c 2992 | os4ce 2993 | o3scop 2994 | 4oscopi 2995 | o5scr 2996 | os4i4e 2997 | os5itiv 2998 | os3ito 2999 | os3ity 3000 | osi4u 3001 | os4l 3002 | o2so 3003 | os4pa 3004 | os4po 3005 | os2ta 3006 | o5stati 3007 | os5til 3008 | os5tit 3009 | o4tan 3010 | otele4g 3011 | ot3er. 3012 | ot5ers 3013 | o4tes 3014 | 4oth 3015 | oth5esi 3016 | oth3i4 3017 | ot3ic. 3018 | ot5ica 3019 | o3tice 3020 | o3tif 3021 | o3tis 3022 | oto5s 3023 | ou2 3024 | ou3bl 3025 | ouch5i 3026 | ou5et 3027 | ou4l 3028 | ounc5er 3029 | oun2d 3030 | ou5v 3031 | ov4en 3032 | over4ne 3033 | over3s 3034 | ov4ert 3035 | o3vis 3036 | oviti4 3037 | o5v4ol 3038 | ow3der 3039 | ow3el 3040 | ow5est 3041 | ow1i 3042 | own5i 3043 | o4wo 3044 | oy1a 3045 | 1pa 3046 | pa4ca 3047 | pa4ce 3048 | pac4t 3049 | p4ad 3050 | 5pagan 3051 | p3agat 3052 | p4ai 3053 | pain4 3054 | p4al 3055 | pan4a 3056 | pan3el 3057 | pan4ty 3058 | pa3ny 3059 | pa1p 3060 | pa4pu 3061 | para5bl 3062 | par5age 3063 | par5di 3064 | 3pare 3065 | par5el 3066 | p4a4ri 3067 | par4is 3068 | pa2te 3069 | pa5ter 3070 | 5pathic 3071 | pa5thy 3072 | pa4tric 3073 | pav4 3074 | 3pay 3075 | 4p1b 3076 | pd4 3077 | 4pe. 3078 | 3pe4a 3079 | pear4l 3080 | pe2c 3081 | 2p2ed 3082 | 3pede 3083 | 3pedi 3084 | pedia4 3085 | ped4ic 3086 | p4ee 3087 | pee4d 3088 | pek4 3089 | pe4la 3090 | peli4e 3091 | pe4nan 3092 | p4enc 3093 | pen4th 3094 | pe5on 3095 | p4era. 3096 | pera5bl 3097 | p4erag 3098 | p4eri 3099 | peri5st 3100 | per4mal 3101 | perme5 3102 | p4ern 3103 | per3o 3104 | per3ti 3105 | pe5ru 3106 | per1v 3107 | pe2t 3108 | pe5ten 3109 | pe5tiz 3110 | 4pf 3111 | 4pg 3112 | 4ph. 3113 | phar5i 3114 | phe3no 3115 | ph4er 3116 | ph4es. 3117 | ph1ic 3118 | 5phie 3119 | ph5ing 3120 | 5phisti 3121 | 3phiz 3122 | ph2l 3123 | 3phob 3124 | 3phone 3125 | 5phoni 3126 | pho4r 3127 | 4phs 3128 | ph3t 3129 | 5phu 3130 | 1phy 3131 | pi3a 3132 | pian4 3133 | pi4cie 3134 | pi4cy 3135 | p4id 3136 | p5ida 3137 | pi3de 3138 | 5pidi 3139 | 3piec 3140 | pi3en 3141 | pi4grap 3142 | pi3lo 3143 | pi2n 3144 | p4in. 3145 | pind4 3146 | p4ino 3147 | 3pi1o 3148 | pion4 3149 | p3ith 3150 | pi5tha 3151 | pi2tu 3152 | 2p3k2 3153 | 1p2l2 3154 | 3plan 3155 | plas5t 3156 | pli3a 3157 | pli5er 3158 | 4plig 3159 | pli4n 3160 | ploi4 3161 | plu4m 3162 | plum4b 3163 | 4p1m 3164 | 2p3n 3165 | po4c 3166 | 5pod. 3167 | po5em 3168 | po3et5 3169 | 5po4g 3170 | poin2 3171 | 5point 3172 | poly5t 3173 | po4ni 3174 | po4p 3175 | 1p4or 3176 | po4ry 3177 | 1pos 3178 | pos1s 3179 | p4ot 3180 | po4ta 3181 | 5poun 3182 | 4p1p 3183 | ppa5ra 3184 | p2pe 3185 | p4ped 3186 | p5pel 3187 | p3pen 3188 | p3per 3189 | p3pet 3190 | ppo5site 3191 | pr2 3192 | pray4e 3193 | 5preci 3194 | pre5co 3195 | pre3em 3196 | pref5ac 3197 | pre4la 3198 | pre3r 3199 | p3rese 3200 | 3press 3201 | pre5ten 3202 | pre3v 3203 | 5pri4e 3204 | prin4t3 3205 | pri4s 3206 | pris3o 3207 | p3roca 3208 | prof5it 3209 | pro3l 3210 | pros3e 3211 | pro1t 3212 | 2p1s2 3213 | p2se 3214 | ps4h 3215 | p4sib 3216 | 2p1t 3217 | pt5a4b 3218 | p2te 3219 | p2th 3220 | pti3m 3221 | ptu4r 3222 | p4tw 3223 | pub3 3224 | pue4 3225 | puf4 3226 | pul3c 3227 | pu4m 3228 | pu2n 3229 | pur4r 3230 | 5pus 3231 | pu2t 3232 | 5pute 3233 | put3er 3234 | pu3tr 3235 | put4ted 3236 | put4tin 3237 | p3w 3238 | qu2 3239 | qua5v 3240 | 2que. 3241 | 3quer 3242 | 3quet 3243 | 2rab 3244 | ra3bi 3245 | rach4e 3246 | r5acl 3247 | raf5fi 3248 | raf4t 3249 | r2ai 3250 | ra4lo 3251 | ram3et 3252 | r2ami 3253 | rane5o 3254 | ran4ge 3255 | r4ani 3256 | ra5no 3257 | rap3er 3258 | 3raphy 3259 | rar5c 3260 | rare4 3261 | rar5ef 3262 | 4raril 3263 | r2as 3264 | ration4 3265 | rau4t 3266 | ra5vai 3267 | rav3el 3268 | ra5zie 3269 | r1b 3270 | r4bab 3271 | r4bag 3272 | rbi2 3273 | rbi4f 3274 | r2bin 3275 | r5bine 3276 | rb5ing. 3277 | rb4o 3278 | r1c 3279 | r2ce 3280 | rcen4 3281 | r3cha 3282 | rch4er 3283 | r4ci4b 3284 | rc4it 3285 | rcum3 3286 | r4dal 3287 | rd2i 3288 | rdi4a 3289 | rdi4er 3290 | rdin4 3291 | rd3ing 3292 | 2re. 3293 | re1al 3294 | re3an 3295 | re5arr 3296 | 5reav 3297 | re4aw 3298 | r5ebrat 3299 | rec5oll 3300 | rec5ompe 3301 | re4cre 3302 | 2r2ed 3303 | re1de 3304 | re3dis 3305 | red5it 3306 | re4fac 3307 | re2fe 3308 | re5fer. 3309 | re3fi 3310 | re4fy 3311 | reg3is 3312 | re5it 3313 | re1li 3314 | re5lu 3315 | r4en4ta 3316 | ren4te 3317 | re1o 3318 | re5pin 3319 | re4posi 3320 | re1pu 3321 | r1er4 3322 | r4eri 3323 | rero4 3324 | re5ru 3325 | r4es. 3326 | re4spi 3327 | ress5ib 3328 | res2t 3329 | re5stal 3330 | re3str 3331 | re4ter 3332 | re4ti4z 3333 | re3tri 3334 | reu2 3335 | re5uti 3336 | rev2 3337 | re4val 3338 | rev3el 3339 | r5ev5er. 3340 | re5vers 3341 | re5vert 3342 | re5vil 3343 | rev5olu 3344 | re4wh 3345 | r1f 3346 | rfu4 3347 | r4fy 3348 | rg2 3349 | rg3er 3350 | r3get 3351 | r3gic 3352 | rgi4n 3353 | rg3ing 3354 | r5gis 3355 | r5git 3356 | r1gl 3357 | rgo4n 3358 | r3gu 3359 | rh4 3360 | 4rh. 3361 | 4rhal 3362 | ri3a 3363 | ria4b 3364 | ri4ag 3365 | r4ib 3366 | rib3a 3367 | ric5as 3368 | r4ice 3369 | 4rici 3370 | 5ricid 3371 | ri4cie 3372 | r4ico 3373 | rid5er 3374 | ri3enc 3375 | ri3ent 3376 | ri1er 3377 | ri5et 3378 | rig5an 3379 | 5rigi 3380 | ril3iz 3381 | 5riman 3382 | rim5i 3383 | 3rimo 3384 | rim4pe 3385 | r2ina 3386 | 5rina. 3387 | rin4d 3388 | rin4e 3389 | rin4g 3390 | ri1o 3391 | 5riph 3392 | riph5e 3393 | ri2pl 3394 | rip5lic 3395 | r4iq 3396 | r2is 3397 | r4is. 3398 | ris4c 3399 | r3ish 3400 | ris4p 3401 | ri3ta3b 3402 | r5ited. 3403 | rit5er. 3404 | rit5ers 3405 | rit3ic 3406 | ri2tu 3407 | rit5ur 3408 | riv5el 3409 | riv3et 3410 | riv3i 3411 | r3j 3412 | r3ket 3413 | rk4le 3414 | rk4lin 3415 | r1l 3416 | rle4 3417 | r2led 3418 | r4lig 3419 | r4lis 3420 | rl5ish 3421 | r3lo4 3422 | r1m 3423 | rma5c 3424 | r2me 3425 | r3men 3426 | rm5ers 3427 | rm3ing 3428 | r4ming. 3429 | r4mio 3430 | r3mit 3431 | r4my 3432 | r4nar 3433 | r3nel 3434 | r4ner 3435 | r5net 3436 | r3ney 3437 | r5nic 3438 | r1nis4 3439 | r3nit 3440 | r3niv 3441 | rno4 3442 | r4nou 3443 | r3nu 3444 | rob3l 3445 | r2oc 3446 | ro3cr 3447 | ro4e 3448 | ro1fe 3449 | ro5fil 3450 | rok2 3451 | ro5ker 3452 | 5role. 3453 | rom5ete 3454 | rom4i 3455 | rom4p 3456 | ron4al 3457 | ron4e 3458 | ro5n4is 3459 | ron4ta 3460 | 1room 3461 | 5root 3462 | ro3pel 3463 | rop3ic 3464 | ror3i 3465 | ro5ro 3466 | ros5per 3467 | ros4s 3468 | ro4the 3469 | ro4ty 3470 | ro4va 3471 | rov5el 3472 | rox5 3473 | r1p 3474 | r4pea 3475 | r5pent 3476 | rp5er. 3477 | r3pet 3478 | rp4h4 3479 | rp3ing 3480 | r3po 3481 | r1r4 3482 | rre4c 3483 | rre4f 3484 | r4reo 3485 | rre4st 3486 | rri4o 3487 | rri4v 3488 | rron4 3489 | rros4 3490 | rrys4 3491 | 4rs2 3492 | r1sa 3493 | rsa5ti 3494 | rs4c 3495 | r2se 3496 | r3sec 3497 | rse4cr 3498 | rs5er. 3499 | rs3es 3500 | rse5v2 3501 | r1sh 3502 | r5sha 3503 | r1si 3504 | r4si4b 3505 | rson3 3506 | r1sp 3507 | r5sw 3508 | rtach4 3509 | r4tag 3510 | r3teb 3511 | rten4d 3512 | rte5o 3513 | r1ti 3514 | rt5ib 3515 | rti4d 3516 | r4tier 3517 | r3tig 3518 | rtil3i 3519 | rtil4l 3520 | r4tily 3521 | r4tist 3522 | r4tiv 3523 | r3tri 3524 | rtroph4 3525 | rt4sh 3526 | ru3a 3527 | ru3e4l 3528 | ru3en 3529 | ru4gl 3530 | ru3in 3531 | rum3pl 3532 | ru2n 3533 | runk5 3534 | run4ty 3535 | r5usc 3536 | ruti5n 3537 | rv4e 3538 | rvel4i 3539 | r3ven 3540 | rv5er. 3541 | r5vest 3542 | r3vey 3543 | r3vic 3544 | rvi4v 3545 | r3vo 3546 | r1w 3547 | ry4c 3548 | 5rynge 3549 | ry3t 3550 | sa2 3551 | 2s1ab 3552 | 5sack 3553 | sac3ri 3554 | s3act 3555 | 5sai 3556 | salar4 3557 | sal4m 3558 | sa5lo 3559 | sal4t 3560 | 3sanc 3561 | san4de 3562 | s1ap 3563 | sa5ta 3564 | 5sa3tio 3565 | sat3u 3566 | sau4 3567 | sa5vor 3568 | 5saw 3569 | 4s5b 3570 | scan4t5 3571 | sca4p 3572 | scav5 3573 | s4ced 3574 | 4scei 3575 | s4ces 3576 | sch2 3577 | s4cho 3578 | 3s4cie 3579 | 5scin4d 3580 | scle5 3581 | s4cli 3582 | scof4 3583 | 4scopy 3584 | scour5a 3585 | s1cu 3586 | 4s5d 3587 | 4se. 3588 | se4a 3589 | seas4 3590 | sea5w 3591 | se2c3o 3592 | 3sect 3593 | 4s4ed 3594 | se4d4e 3595 | s5edl 3596 | se2g 3597 | seg3r 3598 | 5sei 3599 | se1le 3600 | 5self 3601 | 5selv 3602 | 4seme 3603 | se4mol 3604 | sen5at 3605 | 4senc 3606 | sen4d 3607 | s5ened 3608 | sen5g 3609 | s5enin 3610 | 4sentd 3611 | 4sentl 3612 | sep3a3 3613 | 4s1er. 3614 | s4erl 3615 | ser4o 3616 | 4servo 3617 | s1e4s 3618 | se5sh 3619 | ses5t 3620 | 5se5um 3621 | 5sev 3622 | sev3en 3623 | sew4i 3624 | 5sex 3625 | 4s3f 3626 | 2s3g 3627 | s2h 3628 | 2sh. 3629 | sh1er 3630 | 5shev 3631 | sh1in 3632 | sh3io 3633 | 3ship 3634 | shiv5 3635 | sho4 3636 | sh5old 3637 | shon3 3638 | shor4 3639 | short5 3640 | 4shw 3641 | si1b 3642 | s5icc 3643 | 3side. 3644 | 5sides 3645 | 5sidi 3646 | si5diz 3647 | 4signa 3648 | sil4e 3649 | 4sily 3650 | 2s1in 3651 | s2ina 3652 | 5sine. 3653 | s3ing 3654 | 1sio 3655 | 5sion 3656 | sion5a 3657 | si2r 3658 | sir5a 3659 | 1sis 3660 | 3sitio 3661 | 5siu 3662 | 1siv 3663 | 5siz 3664 | sk2 3665 | 4ske 3666 | s3ket 3667 | sk5ine 3668 | sk5ing 3669 | s1l2 3670 | s3lat 3671 | s2le 3672 | slith5 3673 | 2s1m 3674 | s3ma 3675 | small3 3676 | sman3 3677 | smel4 3678 | s5men 3679 | 5smith 3680 | smol5d4 3681 | s1n4 3682 | 1so 3683 | so4ce 3684 | soft3 3685 | so4lab 3686 | sol3d2 3687 | so3lic 3688 | 5solv 3689 | 3som 3690 | 3s4on. 3691 | sona4 3692 | son4g 3693 | s4op 3694 | 5sophic 3695 | s5ophiz 3696 | s5ophy 3697 | sor5c 3698 | sor5d 3699 | 4sov 3700 | so5vi 3701 | 2spa 3702 | 5spai 3703 | spa4n 3704 | spen4d 3705 | 2s5peo 3706 | 2sper 3707 | s2phe 3708 | 3spher 3709 | spho5 3710 | spil4 3711 | sp5ing 3712 | 4spio 3713 | s4ply 3714 | s4pon 3715 | spor4 3716 | 4spot 3717 | squal4l 3718 | s1r 3719 | 2ss 3720 | s1sa 3721 | ssas3 3722 | s2s5c 3723 | s3sel 3724 | s5seng 3725 | s4ses. 3726 | s5set 3727 | s1si 3728 | s4sie 3729 | ssi4er 3730 | ss5ily 3731 | s4sl 3732 | ss4li 3733 | s4sn 3734 | sspend4 3735 | ss2t 3736 | ssur5a 3737 | ss5w 3738 | 2st. 3739 | s2tag 3740 | s2tal 3741 | stam4i 3742 | 5stand 3743 | s4ta4p 3744 | 5stat. 3745 | s4ted 3746 | stern5i 3747 | s5tero 3748 | ste2w 3749 | stew5a 3750 | s3the 3751 | st2i 3752 | s4ti. 3753 | s5tia 3754 | s1tic 3755 | 5stick 3756 | s4tie 3757 | s3tif 3758 | st3ing 3759 | 5stir 3760 | s1tle 3761 | 5stock 3762 | stom3a 3763 | 5stone 3764 | s4top 3765 | 3store 3766 | st4r 3767 | s4trad 3768 | 5stratu 3769 | s4tray 3770 | s4trid 3771 | 4stry 3772 | 4st3w 3773 | s2ty 3774 | 1su 3775 | su1al 3776 | su4b3 3777 | su2g3 3778 | su5is 3779 | suit3 3780 | s4ul 3781 | su2m 3782 | sum3i 3783 | su2n 3784 | su2r 3785 | 4sv 3786 | sw2 3787 | 4swo 3788 | s4y 3789 | 4syc 3790 | 3syl 3791 | syn5o 3792 | sy5rin 3793 | 1ta 3794 | 3ta. 3795 | 2tab 3796 | ta5bles 3797 | 5taboliz 3798 | 4taci 3799 | ta5do 3800 | 4taf4 3801 | tai5lo 3802 | ta2l 3803 | ta5la 3804 | tal5en 3805 | tal3i 3806 | 4talk 3807 | tal4lis 3808 | ta5log 3809 | ta5mo 3810 | tan4de 3811 | tanta3 3812 | ta5per 3813 | ta5pl 3814 | tar4a 3815 | 4tarc 3816 | 4tare 3817 | ta3riz 3818 | tas4e 3819 | ta5sy 3820 | 4tatic 3821 | ta4tur 3822 | taun4 3823 | tav4 3824 | 2taw 3825 | tax4is 3826 | 2t1b 3827 | 4tc 3828 | t4ch 3829 | tch5et 3830 | 4t1d 3831 | 4te. 3832 | tead4i 3833 | 4teat 3834 | tece4 3835 | 5tect 3836 | 2t1ed 3837 | te5di 3838 | 1tee 3839 | teg4 3840 | te5ger 3841 | te5gi 3842 | 3tel. 3843 | teli4 3844 | 5tels 3845 | te2ma2 3846 | tem3at 3847 | 3tenan 3848 | 3tenc 3849 | 3tend 3850 | 4tenes 3851 | 1tent 3852 | ten4tag 3853 | 1teo 3854 | te4p 3855 | te5pe 3856 | ter3c 3857 | 5ter3d 3858 | 1teri 3859 | ter5ies 3860 | ter3is 3861 | teri5za 3862 | 5ternit 3863 | ter5v 3864 | 4tes. 3865 | 4tess 3866 | t3ess. 3867 | teth5e 3868 | 3teu 3869 | 3tex 3870 | 4tey 3871 | 2t1f 3872 | 4t1g 3873 | 2th. 3874 | than4 3875 | th2e 3876 | 4thea 3877 | th3eas 3878 | the5at 3879 | the3is 3880 | 3thet 3881 | th5ic. 3882 | th5ica 3883 | 4thil 3884 | 5think 3885 | 4thl 3886 | th5ode 3887 | 5thodic 3888 | 4thoo 3889 | thor5it 3890 | tho5riz 3891 | 2ths 3892 | 1tia 3893 | ti4ab 3894 | ti4ato 3895 | 2ti2b 3896 | 4tick 3897 | t4ico 3898 | t4ic1u 3899 | 5tidi 3900 | 3tien 3901 | tif2 3902 | ti5fy 3903 | 2tig 3904 | 5tigu 3905 | till5in 3906 | 1tim 3907 | 4timp 3908 | tim5ul 3909 | 2t1in 3910 | t2ina 3911 | 3tine. 3912 | 3tini 3913 | 1tio 3914 | ti5oc 3915 | tion5ee 3916 | 5tiq 3917 | ti3sa 3918 | 3tise 3919 | tis4m 3920 | ti5so 3921 | tis4p 3922 | 5tistica 3923 | ti3tl 3924 | ti4u 3925 | 1tiv 3926 | tiv4a 3927 | 1tiz 3928 | ti3za 3929 | ti3zen 3930 | 2tl 3931 | t5la 3932 | tlan4 3933 | 3tle. 3934 | 3tled 3935 | 3tles. 3936 | t5let. 3937 | t5lo 3938 | 4t1m 3939 | tme4 3940 | 2t1n2 3941 | 1to 3942 | to3b 3943 | to5crat 3944 | 4todo 3945 | 2tof 3946 | to2gr 3947 | to5ic 3948 | to2ma 3949 | tom4b 3950 | to3my 3951 | ton4ali 3952 | to3nat 3953 | 4tono 3954 | 4tony 3955 | to2ra 3956 | to3rie 3957 | tor5iz 3958 | tos2 3959 | 5tour 3960 | 4tout 3961 | to3war 3962 | 4t1p 3963 | 1tra 3964 | tra3b 3965 | tra5ch 3966 | traci4 3967 | trac4it 3968 | trac4te 3969 | tras4 3970 | tra5ven 3971 | trav5es5 3972 | tre5f 3973 | tre4m 3974 | trem5i 3975 | 5tria 3976 | tri5ces 3977 | 5tricia 3978 | 4trics 3979 | 2trim 3980 | tri4v 3981 | tro5mi 3982 | tron5i 3983 | 4trony 3984 | tro5phe 3985 | tro3sp 3986 | tro3v 3987 | tru5i 3988 | trus4 3989 | 4t1s2 3990 | t4sc 3991 | tsh4 3992 | t4sw 3993 | 4t3t2 3994 | t4tes 3995 | t5to 3996 | ttu4 3997 | 1tu 3998 | tu1a 3999 | tu3ar 4000 | tu4bi 4001 | tud2 4002 | 4tue 4003 | 4tuf4 4004 | 5tu3i 4005 | 3tum 4006 | tu4nis 4007 | 2t3up. 4008 | 3ture 4009 | 5turi 4010 | tur3is 4011 | tur5o 4012 | tu5ry 4013 | 3tus 4014 | 4tv 4015 | tw4 4016 | 4t1wa 4017 | twis4 4018 | 4two 4019 | 1ty 4020 | 4tya 4021 | 2tyl 4022 | type3 4023 | ty5ph 4024 | 4tz 4025 | tz4e 4026 | 4uab 4027 | uac4 4028 | ua5na 4029 | uan4i 4030 | uar5ant 4031 | uar2d 4032 | uar3i 4033 | uar3t 4034 | u1at 4035 | uav4 4036 | ub4e 4037 | u4bel 4038 | u3ber 4039 | u4bero 4040 | u1b4i 4041 | u4b5ing 4042 | u3ble. 4043 | u3ca 4044 | uci4b 4045 | uc4it 4046 | ucle3 4047 | u3cr 4048 | u3cu 4049 | u4cy 4050 | ud5d 4051 | ud3er 4052 | ud5est 4053 | udev4 4054 | u1dic 4055 | ud3ied 4056 | ud3ies 4057 | ud5is 4058 | u5dit 4059 | u4don 4060 | ud4si 4061 | u4du 4062 | u4ene 4063 | uens4 4064 | uen4te 4065 | uer4il 4066 | 3ufa 4067 | u3fl 4068 | ugh3en 4069 | ug5in 4070 | 2ui2 4071 | uil5iz 4072 | ui4n 4073 | u1ing 4074 | uir4m 4075 | uita4 4076 | uiv3 4077 | uiv4er. 4078 | u5j 4079 | 4uk 4080 | u1la 4081 | ula5b 4082 | u5lati 4083 | ulch4 4084 | 5ulche 4085 | ul3der 4086 | ul4e 4087 | u1len 4088 | ul4gi 4089 | ul2i 4090 | u5lia 4091 | ul3ing 4092 | ul5ish 4093 | ul4lar 4094 | ul4li4b 4095 | ul4lis 4096 | 4ul3m 4097 | u1l4o 4098 | 4uls 4099 | uls5es 4100 | ul1ti 4101 | ultra3 4102 | 4ultu 4103 | u3lu 4104 | ul5ul 4105 | ul5v 4106 | um5ab 4107 | um4bi 4108 | um4bly 4109 | u1mi 4110 | u4m3ing 4111 | umor5o 4112 | um2p 4113 | unat4 4114 | u2ne 4115 | un4er 4116 | u1ni 4117 | un4im 4118 | u2nin 4119 | un5ish 4120 | uni3v 4121 | un3s4 4122 | un4sw 4123 | unt3ab 4124 | un4ter. 4125 | un4tes 4126 | unu4 4127 | un5y 4128 | un5z 4129 | u4ors 4130 | u5os 4131 | u1ou 4132 | u1pe 4133 | uper5s 4134 | u5pia 4135 | up3ing 4136 | u3pl 4137 | up3p 4138 | upport5 4139 | upt5ib 4140 | uptu4 4141 | u1ra 4142 | 4ura. 4143 | u4rag 4144 | u4ras 4145 | ur4be 4146 | urc4 4147 | ur1d 4148 | ure5at 4149 | ur4fer 4150 | ur4fr 4151 | u3rif 4152 | uri4fic 4153 | ur1in 4154 | u3rio 4155 | u1rit 4156 | ur3iz 4157 | ur2l 4158 | url5ing. 4159 | ur4no 4160 | uros4 4161 | ur4pe 4162 | ur4pi 4163 | urs5er 4164 | ur5tes 4165 | ur3the 4166 | urti4 4167 | ur4tie 4168 | u3ru 4169 | 2us 4170 | u5sad 4171 | u5san 4172 | us4ap 4173 | usc2 4174 | us3ci 4175 | use5a 4176 | u5sia 4177 | u3sic 4178 | us4lin 4179 | us1p 4180 | us5sl 4181 | us5tere 4182 | us1tr 4183 | u2su 4184 | usur4 4185 | uta4b 4186 | u3tat 4187 | 4ute. 4188 | 4utel 4189 | 4uten 4190 | uten4i 4191 | 4u1t2i 4192 | uti5liz 4193 | u3tine 4194 | ut3ing 4195 | ution5a 4196 | u4tis 4197 | 5u5tiz 4198 | u4t1l 4199 | ut5of 4200 | uto5g 4201 | uto5matic 4202 | u5ton 4203 | u4tou 4204 | uts4 4205 | u3u 4206 | uu4m 4207 | u1v2 4208 | uxu3 4209 | uz4e 4210 | 1va 4211 | 5va. 4212 | 2v1a4b 4213 | vac5il 4214 | vac3u 4215 | vag4 4216 | va4ge 4217 | va5lie 4218 | val5o 4219 | val1u 4220 | va5mo 4221 | va5niz 4222 | va5pi 4223 | var5ied 4224 | 3vat 4225 | 4ve. 4226 | 4ved 4227 | veg3 4228 | v3el. 4229 | vel3li 4230 | ve4lo 4231 | v4ely 4232 | ven3om 4233 | v5enue 4234 | v4erd 4235 | 5vere. 4236 | v4erel 4237 | v3eren 4238 | ver5enc 4239 | v4eres 4240 | ver3ie 4241 | vermi4n 4242 | 3verse 4243 | ver3th 4244 | v4e2s 4245 | 4ves. 4246 | ves4te 4247 | ve4te 4248 | vet3er 4249 | ve4ty 4250 | vi5ali 4251 | 5vian 4252 | 5vide. 4253 | 5vided 4254 | 4v3iden 4255 | 5vides 4256 | 5vidi 4257 | v3if 4258 | vi5gn 4259 | vik4 4260 | 2vil 4261 | 5vilit 4262 | v3i3liz 4263 | v1in 4264 | 4vi4na 4265 | v2inc 4266 | vin5d 4267 | 4ving 4268 | vio3l 4269 | v3io4r 4270 | vi1ou 4271 | vi4p 4272 | vi5ro 4273 | vis3it 4274 | vi3so 4275 | vi3su 4276 | 4viti 4277 | vit3r 4278 | 4vity 4279 | 3viv 4280 | 5vo. 4281 | voi4 4282 | 3vok 4283 | vo4la 4284 | v5ole 4285 | 5volt 4286 | 3volv 4287 | vom5i 4288 | vor5ab 4289 | vori4 4290 | vo4ry 4291 | vo4ta 4292 | 4votee 4293 | 4vv4 4294 | v4y 4295 | w5abl 4296 | 2wac 4297 | wa5ger 4298 | wag5o 4299 | wait5 4300 | w5al. 4301 | wam4 4302 | war4t 4303 | was4t 4304 | wa1te 4305 | wa5ver 4306 | w1b 4307 | wea5rie 4308 | weath3 4309 | wed4n 4310 | weet3 4311 | wee5v 4312 | wel4l 4313 | w1er 4314 | west3 4315 | w3ev 4316 | whi4 4317 | wi2 4318 | wil2 4319 | will5in 4320 | win4de 4321 | win4g 4322 | wir4 4323 | 3wise 4324 | with3 4325 | wiz5 4326 | w4k 4327 | wl4es 4328 | wl3in 4329 | w4no 4330 | 1wo2 4331 | wom1 4332 | wo5ven 4333 | w5p 4334 | wra4 4335 | wri4 4336 | writa4 4337 | w3sh 4338 | ws4l 4339 | ws4pe 4340 | w5s4t 4341 | 4wt 4342 | wy4 4343 | x1a 4344 | xac5e 4345 | x4ago 4346 | xam3 4347 | x4ap 4348 | xas5 4349 | x3c2 4350 | x1e 4351 | xe4cuto 4352 | x2ed 4353 | xer4i 4354 | xe5ro 4355 | x1h 4356 | xhi2 4357 | xhil5 4358 | xhu4 4359 | x3i 4360 | xi5a 4361 | xi5c 4362 | xi5di 4363 | x4ime 4364 | xi5miz 4365 | x3o 4366 | x4ob 4367 | x3p 4368 | xpan4d 4369 | xpecto5 4370 | xpe3d 4371 | x1t2 4372 | x3ti 4373 | x1u 4374 | xu3a 4375 | xx4 4376 | y5ac 4377 | 3yar4 4378 | y5at 4379 | y1b 4380 | y1c 4381 | y2ce 4382 | yc5er 4383 | y3ch 4384 | ych4e 4385 | ycom4 4386 | ycot4 4387 | y1d 4388 | y5ee 4389 | y1er 4390 | y4erf 4391 | yes4 4392 | ye4t 4393 | y5gi 4394 | 4y3h 4395 | y1i 4396 | y3la 4397 | ylla5bl 4398 | y3lo 4399 | y5lu 4400 | ymbol5 4401 | yme4 4402 | ympa3 4403 | yn3chr 4404 | yn5d 4405 | yn5g 4406 | yn5ic 4407 | 5ynx 4408 | y1o4 4409 | yo5d 4410 | y4o5g 4411 | yom4 4412 | yo5net 4413 | y4ons 4414 | y4os 4415 | y4ped 4416 | yper5 4417 | yp3i 4418 | y3po 4419 | y4poc 4420 | yp2ta 4421 | y5pu 4422 | yra5m 4423 | yr5ia 4424 | y3ro 4425 | yr4r 4426 | ys4c 4427 | y3s2e 4428 | ys3ica 4429 | ys3io 4430 | 3ysis 4431 | y4so 4432 | yss4 4433 | ys1t 4434 | ys3ta 4435 | ysur4 4436 | y3thin 4437 | yt3ic 4438 | y1w 4439 | za1 4440 | z5a2b 4441 | zar2 4442 | 4zb 4443 | 2ze 4444 | ze4n 4445 | ze4p 4446 | z1er 4447 | ze3ro 4448 | zet4 4449 | 2z1i 4450 | z4il 4451 | z4is 4452 | 5zl 4453 | 4zm 4454 | 1zo 4455 | zo4m 4456 | zo5ol 4457 | zte4 4458 | 4z1z2 4459 | z4zy 4460 | .con5gr 4461 | .de5riva 4462 | .dri5v4 4463 | .eth1y6l1 4464 | .eu4ler 4465 | .ev2 4466 | .ever5si5b 4467 | .ga4s1om1 4468 | .ge4ome 4469 | .ge5ot1 4470 | .he3mo1 4471 | .he3p6a 4472 | .he3roe 4473 | .in5u2t 4474 | .kil2n3i 4475 | .ko6r1te1 4476 | .le6ices 4477 | .me4ga1l 4478 | .met4ala 4479 | .mim5i2c1 4480 | .mi1s4ers 4481 | .ne6o3f 4482 | .noe1th 4483 | .non1e2m 4484 | .poly1s 4485 | .post1am 4486 | .pre1am 4487 | .rav5en1o 4488 | .semi5 4489 | .sem4ic 4490 | .semid6 4491 | .semip4 4492 | .semir4 4493 | .sem6is4 4494 | .semiv4 4495 | .sph6in1 4496 | .spin1o 4497 | .ta5pes1tr 4498 | .te3legr 4499 | .to6pog 4500 | .to2q 4501 | .un3at5t 4502 | .un5err5 4503 | .vi2c3ar 4504 | .we2b1l 4505 | .re1e4c 4506 | a5bolic 4507 | a2cabl 4508 | af6fish 4509 | am1en3ta5b 4510 | anal6ys 4511 | ano5a2c 4512 | ans5gr 4513 | ans3v 4514 | anti1d 4515 | an3ti1n2 4516 | anti1re 4517 | a4pe5able 4518 | ar3che5t 4519 | ar2range 4520 | as5ymptot 4521 | ath3er1o1s 4522 | at6tes. 4523 | augh4tl 4524 | au5li5f 4525 | av3iou 4526 | back2er. 4527 | ba6r1onie 4528 | ba1thy 4529 | bbi4t 4530 | be2vie 4531 | bi5d2if 4532 | bil2lab 4533 | bio5m 4534 | bi1orb 4535 | bio1rh 4536 | b1i3tive 4537 | blan2d1 4538 | blin2d1 4539 | blon2d2 4540 | bor1no5 4541 | bo2t1u1l 4542 | brus4q 4543 | bus6i2er 4544 | bus6i2es 4545 | buss4ing 4546 | but2ed. 4547 | but4ted 4548 | cad5e1m 4549 | cat1a1s2 4550 | 4chs. 4551 | chs3hu 4552 | chie5vo 4553 | cig3a3r 4554 | cin2q 4555 | cle4ar 4556 | co6ph1o3n 4557 | cous2ti 4558 | cri3tie 4559 | croc1o1d 4560 | cro5e2co 4561 | c2tro3me6c 4562 | 1cu2r1ance 4563 | 2d3alone 4564 | data1b 4565 | dd5a5b 4566 | d2d5ib 4567 | de4als. 4568 | de5clar1 4569 | de2c5lina 4570 | de3fin3iti 4571 | de2mos 4572 | des3ic 4573 | de2tic 4574 | dic1aid 4575 | dif5fra 4576 | 3di1methy 4577 | di2ren 4578 | di2rer 4579 | 2d1lead 4580 | 2d1li2e 4581 | 3do5word 4582 | dren1a5l 4583 | drif2t1a 4584 | d1ri3pleg5 4585 | drom3e5d 4586 | d3tab 4587 | du2al. 4588 | du1op1o1l 4589 | ea4n3ies 4590 | e3chas 4591 | edg1l 4592 | ed1uling 4593 | eli2t1is 4594 | e1loa 4595 | en1dix 4596 | eo3grap 4597 | 1e6p3i3neph1 4598 | e2r3i4an. 4599 | e3spac6i 4600 | eth1y6l1ene 4601 | 5eu2clid1 4602 | feb1rua 4603 | fermi1o 4604 | 3fich 4605 | fit5ted. 4606 | fla1g6el 4607 | flow2er. 4608 | 3fluor 4609 | gen2cy. 4610 | ge3o1d 4611 | ght1we 4612 | g1lead 4613 | get2ic. 4614 | 4g1lish 4615 | 5glo5bin 4616 | 1g2nac 4617 | gnet1ism 4618 | gno5mo 4619 | g2n1or. 4620 | g2noresp 4621 | 2g1o4n3i1za 4622 | graph5er. 4623 | griev1 4624 | g1utan 4625 | hair1s 4626 | ha2p3ar5r 4627 | hatch1 4628 | hex2a3 4629 | hite3sid 4630 | h3i5pel1a4 4631 | hnau3z 4632 | ho6r1ic. 4633 | h2t1eou 4634 | hypo1tha 4635 | id4ios 4636 | ifac1et 4637 | ign4it 4638 | ignit1er 4639 | i4jk 4640 | im3ped3a 4641 | infra1s2 4642 | i5nitely. 4643 | irre6v3oc 4644 | i1tesima 4645 | ith5i2l 4646 | itin5er5ar 4647 | janu3a 4648 | japan1e2s 4649 | je1re1m 4650 | 1ke6ling 4651 | 1ki5netic 4652 | 1kovian 4653 | k3sha 4654 | la4c3i5e 4655 | lai6n3ess 4656 | lar5ce1n 4657 | l3chai 4658 | l3chil6d1 4659 | lead6er. 4660 | lea4s1a 4661 | 1lec3ta6b 4662 | le3g6en2dre 4663 | 1le1noid 4664 | lith1o5g 4665 | ll1fl 4666 | l2l3ish 4667 | l5mo3nell 4668 | lo1bot1o1 4669 | lo2ges. 4670 | load4ed. 4671 | load6er. 4672 | l3tea 4673 | lth5i2ly 4674 | lue1p 4675 | 1lunk3er 4676 | 1lum5bia. 4677 | 3lyg1a1mi 4678 | ly5styr 4679 | ma1la1p 4680 | m2an. 4681 | man3u1sc 4682 | mar1gin1 4683 | medi2c 4684 | med3i3cin 4685 | medio6c1 4686 | me3gran3 4687 | m2en. 4688 | 3mi3da5b 4689 | 3milita 4690 | mil2l1ag 4691 | mil5li5li 4692 | mi6n3is. 4693 | mi1n2ut1er 4694 | mi1n2ut1est 4695 | m3ma1b 4696 | 5maph1ro1 4697 | 5moc1ra1t 4698 | mo5e2las 4699 | mol1e5c 4700 | mon4ey1l 4701 | mono3ch 4702 | mo4no1en 4703 | moro6n5is 4704 | mono1s6 4705 | moth4et2 4706 | m1ou3sin 4707 | m5shack2 4708 | mu2dro 4709 | mul2ti5u 4710 | n3ar4chs. 4711 | n3ch2es1t 4712 | ne3back 4713 | 2ne1ski 4714 | n1dieck 4715 | nd3thr 4716 | nfi6n3ites 4717 | 4n5i4an. 4718 | nge5nes 4719 | ng1ho 4720 | ng1spr 4721 | nk3rup 4722 | n5less 4723 | 5noc3er1os 4724 | nom1a6l 4725 | nom5e1no 4726 | n1o1mist 4727 | non1eq 4728 | non1i4so 4729 | 5nop1oly. 4730 | no1vemb 4731 | ns5ceiv 4732 | ns4moo 4733 | ntre1p 4734 | obli2g1 4735 | o3chas 4736 | odel3li 4737 | odit1ic 4738 | oerst2 4739 | oke1st 4740 | o3les3ter 4741 | oli3gop1o1 4742 | o1lo3n4om 4743 | o3mecha6 4744 | onom1ic 4745 | o3norma 4746 | o3no2t1o3n 4747 | o3nou 4748 | op1ism. 4749 | or4tho3ni4t 4750 | orth1ri 4751 | or5tively 4752 | o4s3pher 4753 | o5test1er 4754 | o5tes3tor 4755 | oth3e1o1s 4756 | ou3ba3do 4757 | o6v3i4an. 4758 | oxi6d1ic 4759 | pal6mat 4760 | parag6ra4 4761 | par4a1le 4762 | param4 4763 | para3me 4764 | pee2v1 4765 | phi2l3ant 4766 | phi5lat1e3l 4767 | pi2c1a3d 4768 | pli2c1ab 4769 | pli5nar 4770 | poin3ca 4771 | 1pole. 4772 | poly1e 4773 | po3lyph1ono 4774 | 1prema3c 4775 | pre1neu 4776 | pres2pli 4777 | pro2cess 4778 | proc3i3ty. 4779 | pro2g1e 4780 | 3pseu2d 4781 | pseu3d6o3d2 4782 | pseu3d6o3f2 4783 | pto3mat4 4784 | p5trol3 4785 | pu5bes5c 4786 | quain2t1e 4787 | qu6a3si3 4788 | quasir6 4789 | quasis6 4790 | quin5tes5s 4791 | qui3v4ar 4792 | r1abolic 4793 | 3rab1o1loi 4794 | ra3chu 4795 | r3a3dig 4796 | radi1o6g 4797 | r2amen 4798 | 3ra4m5e1triz 4799 | ra3mou 4800 | ra5n2has 4801 | ra1or 4802 | r3bin1ge 4803 | re2c3i1pr 4804 | rec5t6ang 4805 | re4t1ribu 4806 | r3ial. 4807 | riv1o1l 4808 | 6rk. 4809 | rk1ho 4810 | r1krau 4811 | 6rks. 4812 | r5le5qu 4813 | ro1bot1 4814 | ro5e2las 4815 | ro5epide1 4816 | ro3mesh 4817 | ro1tron 4818 | r3pau5li 4819 | rse1rad1i 4820 | r1thou 4821 | r1treu 4822 | r1veil 4823 | rz1sc 4824 | sales3c 4825 | sales5w 4826 | 5sa3par5il 4827 | sca6p1er 4828 | sca2t1ol 4829 | s4chitz 4830 | schro1ding1 4831 | 1sci2utt 4832 | scrap4er. 4833 | scy4th1 4834 | sem1a1ph 4835 | se3mes1t 4836 | se1mi6t5ic 4837 | sep3temb 4838 | shoe1st 4839 | sid2ed. 4840 | side5st 4841 | side5sw 4842 | si5resid 4843 | sky1sc 4844 | 3slova1kia 4845 | 3s2og1a1my 4846 | so2lute 4847 | 3s2pace 4848 | 1s2pacin 4849 | spe3cio 4850 | spher1o 4851 | spi2c1il 4852 | spokes5w 4853 | sports3c 4854 | sports3w 4855 | s3qui3to 4856 | s2s1a3chu1 4857 | ss3hat 4858 | s2s3i4an. 4859 | s5sign5a3b 4860 | 1s2tamp 4861 | s2t1ant5shi 4862 | star3tli 4863 | sta1ti 4864 | st5b 4865 | 1stor1ab 4866 | strat1a1g 4867 | strib5ut 4868 | st5scr 4869 | stu1pi4d1 4870 | styl1is 4871 | su2per1e6 4872 | 1sync 4873 | 1syth3i2 4874 | swimm6 4875 | 5tab1o1lism 4876 | ta3gon. 4877 | talk1a5 4878 | t1a1min 4879 | t6ap6ath 4880 | 5tar2rh 4881 | tch1c 4882 | tch3i1er 4883 | t1cr 4884 | teach4er. 4885 | tele2g 4886 | tele1r6o 4887 | 3ter1gei 4888 | ter2ic. 4889 | t3ess2es 4890 | tha4l1am 4891 | tho3don 4892 | th1o5gen1i 4893 | tho1k2er 4894 | thy4l1an 4895 | thy3sc 4896 | 2t3i4an. 4897 | ti2n3o1m 4898 | t1li2er 4899 | tolo2gy 4900 | tot3ic 4901 | trai3tor1 4902 | tra1vers 4903 | travers3a3b 4904 | treach1e 4905 | tr4ial. 4906 | 3tro1le1um 4907 | trof4ic. 4908 | tro3fit 4909 | tro1p2is 4910 | 3trop1o5les 4911 | 3trop1o5lis 4912 | t1ro1pol3it 4913 | tsch3ie 4914 | ttrib1ut1 4915 | turn3ar 4916 | t1wh 4917 | ty2p5al 4918 | ua3drati 4919 | uad1ratu 4920 | u5do3ny 4921 | uea1m 4922 | u2r1al. 4923 | uri4al. 4924 | us2er. 4925 | v1ativ 4926 | v1oir5du1 4927 | va6guer 4928 | vaude3v 4929 | 1verely. 4930 | v1er1eig 4931 | ves1tite 4932 | vi1vip3a3r 4933 | voice1p 4934 | waste3w6a2 4935 | wave1g4 4936 | w3c 4937 | week1n 4938 | wide5sp 4939 | wo4k1en 4940 | wrap3aro 4941 | writ6er. 4942 | x1q 4943 | xquis3 4944 | y5che3d 4945 | ym5e5try 4946 | y1stro 4947 | yes5ter1y 4948 | z3ian. 4949 | z3o1phr 4950 | z2z3w 4951 | """ 4952 | } 4953 | --------------------------------------------------------------------------------